diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..344e92fcb5 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,5 @@ +# Code of Conduct + +All interactions with this repository must be in accordance with the University of North Dakota Code of Student Life. + +The official Code of Student Life can be found here: http://www1.und.edu/code-of-student-life/. diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000000..1ce96ee82e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,36 @@ +--- +name: Bug Report +about: Submit a report of a bug/issue/unexpected behavior/etc + +--- + +**Bug Location** +This bug is most likely: +- Somewhere caused by ARC's modifications to the OpenRocket code +- A preexisting, but yet undiscovered, OpenRocket bug + - This bug should be fixed on ARC's fork because: ??? + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**System information** + - Device: [e.g. HP laptop] + - OS: [e.g. Linux kernel 4.18, Debian 9] + - Commit id bug exists in: [e.g. 17b9454] + - Any other applicable details + +**Additional context** +Add any other context about the problem here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..79f3762c51 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,6 @@ +This is a [bug fix/new features/something else] pull request. + +Summary: +What does this fix, add, or otherwise change, summed up in a single paragraph. + + diff --git a/README.md b/.github/README.md similarity index 100% rename from README.md rename to .github/README.md diff --git a/.github/contributing.md b/.github/contributing.md new file mode 100644 index 0000000000..0b6860bef0 --- /dev/null +++ b/.github/contributing.md @@ -0,0 +1,16 @@ +# Contribution guidelines + +All contributions to this repository are to be made by a member of the UND-ARC Github organization. As much as we appreciate the thought, no outside collaborators' PRs will be approved without prior discussion. This is due to liability concerns. + +All contributions to this repository are to be in accordance with its code of conduct, which can be found in the same directory as this file, titled `CODE_OF_CONDUCT.md`. + +All commits that are made to this repository must be signed off. To do this, add the `-s` flag to the `commit` command, for example: + +``` +git commit -m "Fixes #27" +``` +would become + +``` +git commit -s -m "Fixes #27" +``` diff --git a/.gitignore b/.gitignore index 9a4a7c0369..10749aae32 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ - +*.DS_Store *~ +*.class # / /bin @@ -87,3 +88,4 @@ com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties +/.metadata/ diff --git a/.idea/artifacts/openrocket_jar.xml b/.idea/artifacts/openrocket_jar.xml new file mode 100644 index 0000000000..9bbc47070b --- /dev/null +++ b/.idea/artifacts/openrocket_jar.xml @@ -0,0 +1,39 @@ + + + $PROJECT_DIR$/build/jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 9a8b7e5c45..219fad8eae 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -19,4 +19,4 @@ - \ No newline at end of file + diff --git a/.idea/misc.xml b/.idea/misc.xml index f7f1f1f69e..6f34b5b648 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - @@ -49,67 +46,7 @@ - - - - - - - - - - - + - - - - - - - - - - - - 1.8 - - - - - - - - 1.8 - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/All_tests.xml b/.idea/runConfigurations/All_tests.xml new file mode 100644 index 0000000000..26cc40265c --- /dev/null +++ b/.idea/runConfigurations/All_tests.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Openrocket_UI_Jar.xml b/.idea/runConfigurations/Openrocket_UI_Jar.xml new file mode 100644 index 0000000000..f5e1da03e7 --- /dev/null +++ b/.idea/runConfigurations/Openrocket_UI_Jar.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 5d030ed65c..07cb80df8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,23 @@ language: java +dist: trusty +sudo: false +addons: + apt: + packages: + - ant-optional jdk: - - oraclejdk7 + - openjdk8 script: - "ant -buildfile build.xml clean check jar unittest" + +after_success: + - ls -lh /home/travis/build/openrocket/openrocket/swing/build/jar/OpenRocket.jar + - ls -lh /home/travis/build/openrocket/openrocket/swing/build/jar/OpenRocket-Core.jar + - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + - bash upload.sh /home/travis/build/openrocket/openrocket/swing/build/jar/OpenRocket.jar + - bash upload.sh /home/travis/build/openrocket/openrocket/swing/build/jar/OpenRocket-Core.jar + +branches: + except: + - # Do not build tags that we create when we upload to GitHub Releases + - /^(?i:continuous)$/ diff --git a/android-libraries/ActionBarSherlock/bin/.gitignore b/android-libraries/ActionBarSherlock/bin/.gitignore new file mode 100644 index 0000000000..840e7d3120 --- /dev/null +++ b/android-libraries/ActionBarSherlock/bin/.gitignore @@ -0,0 +1 @@ +/classes/ diff --git a/android-libraries/TreeViewList/bin/classes/pl/polidea/treeview/overview.html b/android-libraries/TreeViewList/bin/classes/pl/polidea/treeview/overview.html new file mode 100644 index 0000000000..bdd09ce9f7 --- /dev/null +++ b/android-libraries/TreeViewList/bin/classes/pl/polidea/treeview/overview.html @@ -0,0 +1,24 @@ + + +This is a small utility that provides quite configurable tree view list. +It is based on standard android list view. It separates out different +aspects of the tree: there is a separate list view, tree adapter, tree +state manager and tree state builder. +

+

+ + \ No newline at end of file diff --git a/core/.classpath b/core/.classpath index 81fec6f9a8..419476b88d 100644 --- a/core/.classpath +++ b/core/.classpath @@ -25,5 +25,7 @@ + + diff --git a/core/.settings/org.eclipse.jdt.core.prefs b/core/.settings/org.eclipse.jdt.core.prefs index 7008edd88f..7fb07d275e 100644 --- a/core/.settings/org.eclipse.jdt.core.prefs +++ b/core/.settings/org.eclipse.jdt.core.prefs @@ -1,9 +1,9 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -71,7 +71,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disa org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 diff --git a/core/.settings/org.eclipse.jdt.ui.prefs b/core/.settings/org.eclipse.jdt.ui.prefs index f110f8e551..4a8076995c 100644 --- a/core/.settings/org.eclipse.jdt.ui.prefs +++ b/core/.settings/org.eclipse.jdt.ui.prefs @@ -1,56 +1,3 @@ eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true formatter_profile=_OpenRocket style formatter_settings_version=12 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/core/OpenRocket Core.iml b/core/OpenRocket Core.iml index e1e2c5ccd4..eca58a704d 100644 --- a/core/OpenRocket Core.iml +++ b/core/OpenRocket Core.iml @@ -23,13 +23,13 @@ - + - + @@ -177,14 +177,5 @@ - - - - - - - - - \ No newline at end of file diff --git a/core/build.xml b/core/build.xml index 8d4ccb82b1..27a1b4ecca 100644 --- a/core/build.xml +++ b/core/build.xml @@ -43,7 +43,7 @@ - + @@ -55,11 +55,11 @@ Compiling main classes - + - + @@ -74,7 +74,7 @@ - @@ -88,7 +88,7 @@ Building unit tests - + Running unit tests diff --git a/core/web/html/thesis.pdf b/core/doc/thesis.pdf similarity index 100% rename from core/web/html/thesis.pdf rename to core/doc/thesis.pdf diff --git a/core/resources-src/datafiles/thrustcurves/manual/AT_F101T.eng b/core/resources-src/datafiles/thrustcurves/manual/AT_F101T.eng deleted file mode 100644 index 0afabd315d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/manual/AT_F101T.eng +++ /dev/null @@ -1,26 +0,0 @@ -; TODO: Length and weights taken from F72!! - -; Based on -; http://www.aerotech-rocketry.com/customersite/resource_library/Instructions/MR-SU_Instructions/d-f_non-std_su_in_21002.pdf - -; Made by Sampo Niskanen -F101T 24 124 5-10-15 0.0368 0.0742 AT - 0.04 85.95 - 0.069 83.4 - 0.129 86.461 - 0.202 94.622 - 0.274 100.743 - 0.354 104.569 - 0.443 106.099 - 0.446 102.783 - 0.546 96.662 - 0.575 90.031 - 0.602 89.011 - 0.625 84.675 - 0.671 80.85 - 0.731 76.259 - 0.771 58.406 - 0.807 33.921 - 0.85 18.108 - 0.893 11.477 - 0.942 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/manual/Cesaroni_F31.rse b/core/resources-src/datafiles/thrustcurves/manual/Cesaroni_F31.rse deleted file mode 100644 index 4c53f66212..0000000000 --- a/core/resources-src/datafiles/thrustcurves/manual/Cesaroni_F31.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 56-F31-CL-12A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/manual/Loki_J175.rse b/core/resources-src/datafiles/thrustcurves/manual/Loki_J175.rse deleted file mode 100644 index 981ee622e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/manual/Loki_J175.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/manual/README.txt b/core/resources-src/datafiles/thrustcurves/manual/README.txt index 37e0c6ecea..f2bd79f84c 100644 --- a/core/resources-src/datafiles/thrustcurves/manual/README.txt +++ b/core/resources-src/datafiles/thrustcurves/manual/README.txt @@ -7,6 +7,3 @@ WECO_*.eng - Thrust curves for Weco Feuerwerk motors, created by Sampo N. Klima_*.eng - Thrust curves for Klima motors, created by Leo Nutz -Loki_J175.rse - Corrected motor type from hybrid to reloadable - -CTI F31 - Correct diameter to 29mm diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/00INDEX.txt b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/00INDEX.txt deleted file mode 100644 index b8de3071f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/00INDEX.txt +++ /dev/null @@ -1,11591 +0,0 @@ -Rocket motor simulation data downloaded from ThrustCurve.org. -This ZIP file contains 1656 simulator data files. -For more info, please see http://www.thrustcurve.org/ - -AMW_I195.eng - Manufacturer: Animal Motor Works - Designation: WW-38-390 - Data Format: RASP - Data Source: mfr - Contributor: John DeMar - -AMW_I195.rse - Manufacturer: Animal Motor Works - Designation: WW-38-390 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_I220.eng - Manufacturer: Animal Motor Works - Designation: SK-38-390 - Data Format: RASP - Data Source: mfr - Contributor: John DeMar - -AMW_I220.rse - Manufacturer: Animal Motor Works - Designation: SK-38-390 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_I223.eng - Manufacturer: Animal Motor Works - Designation: 434I223-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -AMW_I223.rse - Manufacturer: Animal Motor Works - Designation: 434I223-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -AMW_I271.eng - Manufacturer: Animal Motor Works - Designation: BB-38-390 - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AMW_I271.rse - Manufacturer: Animal Motor Works - Designation: BB-38-390 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_I285.eng - Manufacturer: Animal Motor Works - Designation: GG-38-390 - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AMW_I285.rse - Manufacturer: Animal Motor Works - Designation: GG-38-390 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_I297.eng - Manufacturer: Animal Motor Works - Designation: 543I297-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -AMW_I297.rse - Manufacturer: Animal Motor Works - Designation: 543I297-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -AMW_I315.eng - Manufacturer: Animal Motor Works - Designation: SK-38-640 - Data Format: RASP - Data Source: mfr - Contributor: Koen Loeven - -AMW_I315.rse - Manufacturer: Animal Motor Works - Designation: SK-38-640 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_I325.eng - Manufacturer: Animal Motor Works - Designation: WW-38-640 - Data Format: RASP - Data Source: mfr - Contributor: John DeMar - -AMW_I325.rse - Manufacturer: Animal Motor Works - Designation: WW-38-640 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_I375.eng - Manufacturer: Animal Motor Works - Designation: GG-38-640 - Data Format: RASP - Data Source: user - Contributor: Robert DeHate - -AMW_I375.rse - Manufacturer: Animal Motor Works - Designation: GG-38-640 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J1365.rse - Manufacturer: Animal Motor Works - Designation: 932J1365-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J230.eng - Manufacturer: Animal Motor Works - Designation: J230SK-P - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AMW_J230.rse - Manufacturer: Animal Motor Works - Designation: J230SK-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J325.rse - Manufacturer: Animal Motor Works - Designation: 1099J325-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J357.eng - Manufacturer: Animal Motor Works - Designation: WT-54-1050 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_J357.rse - Manufacturer: Animal Motor Works - Designation: WT-54-1050 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J365.eng - Manufacturer: Animal Motor Works - Designation: SK-54-1400 - Data Format: RASP - Data Source: user - Contributor: Robert DeHate - -AMW_J365.rse - Manufacturer: Animal Motor Works - Designation: SK-54-1400 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J370.eng - Manufacturer: Animal Motor Works - Designation: GG-54-1050 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_J370.rse - Manufacturer: Animal Motor Works - Designation: GG-54-1050 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J395.rse - Manufacturer: Animal Motor Works - Designation: 1079J395-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J400.eng - Manufacturer: Animal Motor Works - Designation: RR-54-1050 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_J400.rse - Manufacturer: Animal Motor Works - Designation: 977J400-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J400_1.rse - Manufacturer: Animal Motor Works - Designation: RR-54-1050 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J440.eng - Manufacturer: Animal Motor Works - Designation: 1109J440-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_J440.rse - Manufacturer: Animal Motor Works - Designation: 1109J440-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_J440_1.eng - Manufacturer: Animal Motor Works - Designation: BB-38-640 - Data Format: RASP - Data Source: user - Contributor: Robert DeHate - -AMW_J440_1.rse - Manufacturer: Animal Motor Works - Designation: BB-38-640 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J450.eng - Manufacturer: Animal Motor Works - Designation: ST-54-1050 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_J450.rse - Manufacturer: Animal Motor Works - Designation: ST-54-1050 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J450_1.eng - Manufacturer: Animal Motor Works - Designation: ST-54-1050 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_J475.eng - Manufacturer: Animal Motor Works - Designation: 1233J475-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_J475.rse - Manufacturer: Animal Motor Works - Designation: 1233J475-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_J475_1.rse - Manufacturer: Animal Motor Works - Designation: 1025J475-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J480.eng - Manufacturer: Animal Motor Works - Designation: BB-54-1050 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_J480.rse - Manufacturer: Animal Motor Works - Designation: BB-54-1050 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J500.eng - Manufacturer: Animal Motor Works - Designation: J500ST - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_J500.rse - Manufacturer: Animal Motor Works - Designation: J500ST - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_J745.rse - Manufacturer: Animal Motor Works - Designation: 1196J745-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K1000.eng - Manufacturer: Animal Motor Works - Designation: SK-54-2550 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K1000.rse - Manufacturer: Animal Motor Works - Designation: SK-54-2550 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K1075.eng - Manufacturer: Animal Motor Works - Designation: 2245K1075-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_K1075.rse - Manufacturer: Animal Motor Works - Designation: 2245K1075-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_K1075_1.eng - Manufacturer: Animal Motor Works - Designation: GG-54-2550 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K1075_1.rse - Manufacturer: Animal Motor Works - Designation: GG-54-2550 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K1130.eng - Manufacturer: Animal Motor Works - Designation: 2551K1130-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_K1130.rse - Manufacturer: Animal Motor Works - Designation: 2551K1130-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_K1250.eng - Manufacturer: Animal Motor Works - Designation: 1951K1250-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_K1250.rse - Manufacturer: Animal Motor Works - Designation: 1951K1250-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_K1720.rse - Manufacturer: Animal Motor Works - Designation: 1176K1720-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K365.eng - Manufacturer: Animal Motor Works - Designation: RR-75-1700 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K365.rse - Manufacturer: Animal Motor Works - Designation: RR-75-1700 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K450.eng - Manufacturer: Animal Motor Works - Designation: BB-75-1700 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K450.rse - Manufacturer: Animal Motor Works - Designation: BB-75-1700 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K455.rse - Manufacturer: Animal Motor Works - Designation: 1483K455-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K470.eng - Manufacturer: Animal Motor Works - Designation: ST-75-1700 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K470.rse - Manufacturer: Animal Motor Works - Designation: ST-75-1700 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K475.eng - Manufacturer: Animal Motor Works - Designation: WT-54-1400 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K475.rse - Manufacturer: Animal Motor Works - Designation: WT-54-1400 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K500.eng - Manufacturer: Animal Motor Works - Designation: K500SK - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K500.rse - Manufacturer: Animal Motor Works - Designation: K500SK - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K530.eng - Manufacturer: Animal Motor Works - Designation: GG-54-1400 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K530.rse - Manufacturer: Animal Motor Works - Designation: GG-54-1400 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K535.rse - Manufacturer: Animal Motor Works - Designation: 1422K535-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K555.eng - Manufacturer: Animal Motor Works - Designation: SK-54-1750 - Data Format: RASP - Data Source: mfr - Contributor: Koen Loeven - -AMW_K555.rse - Manufacturer: Animal Motor Works - Designation: SK-54-1750 - Data Format: RockSim - Data Source: user - Contributor: Koen Loeven - -AMW_K560.eng - Manufacturer: Animal Motor Works - Designation: RR-54-1400 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K560.rse - Manufacturer: Animal Motor Works - Designation: RR-54-1400 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K570.eng - Manufacturer: Animal Motor Works - Designation: WT-54-1750 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_K570.rse - Manufacturer: Animal Motor Works - Designation: WT-54-1750 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K580.eng - Manufacturer: Animal Motor Works - Designation: 1852K580-P - Data Format: RASP - Data Source: user - Contributor: Jesus Manuel Recuenco - -AMW_K600.eng - Manufacturer: Animal Motor Works - Designation: WT-75-2500 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_K600.rse - Manufacturer: Animal Motor Works - Designation: WT-75-2500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K600_1.eng - Manufacturer: Animal Motor Works - Designation: WT-75-2500 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_K605.eng - Manufacturer: Animal Motor Works - Designation: RR-75-2500 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K605.rse - Manufacturer: Animal Motor Works - Designation: RR-75-2500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K610.eng - Manufacturer: Animal Motor Works - Designation: 1531K610-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_K610.rse - Manufacturer: Animal Motor Works - Designation: 1531K610-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_K650.eng - Manufacturer: Animal Motor Works - Designation: RR-54-1750 - Data Format: RASP - Data Source: mfr - Contributor: Koen Loeven - -AMW_K650.rse - Manufacturer: Animal Motor Works - Designation: RR-54-1750 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K665.rse - Manufacturer: Animal Motor Works - Designation: 1379K665-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K670.eng - Manufacturer: Animal Motor Works - Designation: GG-54-1750 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_K670.rse - Manufacturer: Animal Motor Works - Designation: 1806K670-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K670_1.eng - Manufacturer: Animal Motor Works - Designation: GG-54-1750 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_K670_1.rse - Manufacturer: Animal Motor Works - Designation: GG-54-1750 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K700.eng - Manufacturer: Animal Motor Works - Designation: BB-54-1400 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_K700.rse - Manufacturer: Animal Motor Works - Designation: 1660K700-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K700_1.rse - Manufacturer: Animal Motor Works - Designation: BB-54-1400 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K710.eng - Manufacturer: Animal Motor Works - Designation: 1791K710-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -AMW_K710.rse - Manufacturer: Animal Motor Works - Designation: 1791K710-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -AMW_K800.eng - Manufacturer: Animal Motor Works - Designation: BB-54-1750 - Data Format: RASP - Data Source: mfr - Contributor: Koen Loeven - -AMW_K800.rse - Manufacturer: Animal Motor Works - Designation: BB-54-1750 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K855.rse - Manufacturer: Animal Motor Works - Designation: 1725K855-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K935.eng - Manufacturer: Animal Motor Works - Designation: 1581K935-P - Data Format: RASP - Data Source: user - Contributor: Jesus Manuel Recuenco - -AMW_K950.eng - Manufacturer: Animal Motor Works - Designation: ST-54-1750 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_K950.rse - Manufacturer: Animal Motor Works - Designation: ST-54-1750 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_K950_1.eng - Manufacturer: Animal Motor Works - Designation: ST-54-1750 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_K975.eng - Manufacturer: Animal Motor Works - Designation: WT-54-2550 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_K975.rse - Manufacturer: Animal Motor Works - Designation: WT-54-2550 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L1060.eng - Manufacturer: Animal Motor Works - Designation: GG-75-3500 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_L1060.rse - Manufacturer: Animal Motor Works - Designation: GG-75-3500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L1060_1.eng - Manufacturer: Animal Motor Works - Designation: GG-75-3500 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_L1080.eng - Manufacturer: Animal Motor Works - Designation: BB-75-3500 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_L1080.rse - Manufacturer: Animal Motor Works - Designation: BB-75-3500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L1100.eng - Manufacturer: Animal Motor Works - Designation: RR-54-2550 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_L1100.rse - Manufacturer: Animal Motor Works - Designation: RR-54-2550 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L1111.eng - Manufacturer: Animal Motor Works - Designation: ST-75-3500 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_L1111.rse - Manufacturer: Animal Motor Works - Designation: ST-75-3500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L1276.eng - Manufacturer: Animal Motor Works - Designation: 2730L1276-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -AMW_L1276.rse - Manufacturer: Animal Motor Works - Designation: 2730L1276-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -AMW_L1290.eng - Manufacturer: Animal Motor Works - Designation: 4701L1290-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -AMW_L1290.rse - Manufacturer: Animal Motor Works - Designation: 4701L1290-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -AMW_L1300.eng - Manufacturer: Animal Motor Works - Designation: BB-54-2550 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_L1300.rse - Manufacturer: Animal Motor Works - Designation: BB-54-2550 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L1400.eng - Manufacturer: Animal Motor Works - Designation: SK-75-6000 - Data Format: RASP - Data Source: mfr - Contributor: John DeMar - -AMW_L1400.rse - Manufacturer: Animal Motor Works - Designation: SK-75-6000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L666.eng - Manufacturer: Animal Motor Works - Designation: SK-75-3500 - Data Format: RASP - Data Source: user - Contributor: Joel Rogers - -AMW_L666.rse - Manufacturer: Animal Motor Works - Designation: SK-75-3500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L700.eng - Manufacturer: Animal Motor Works - Designation: BB-75-2500 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_L700.rse - Manufacturer: Animal Motor Works - Designation: BB-75-2500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L777.eng - Manufacturer: Animal Motor Works - Designation: WT-75-3500 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_L777.rse - Manufacturer: Animal Motor Works - Designation: WT-75-3500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L777_1.eng - Manufacturer: Animal Motor Works - Designation: WT-75-3500 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_L900.eng - Manufacturer: Animal Motor Works - Designation: RR-75-3500 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_L900.rse - Manufacturer: Animal Motor Works - Designation: RR-75-3500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_L985.rse - Manufacturer: Animal Motor Works - Designation: 2665L985-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M1350.eng - Manufacturer: Animal Motor Works - Designation: WT-75-6000 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_M1350.rse - Manufacturer: Animal Motor Works - Designation: WT-75-6000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M1480.eng - Manufacturer: Animal Motor Works - Designation: RR-75-6000 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_M1480.rse - Manufacturer: Animal Motor Works - Designation: RR-75-6000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M1630.eng - Manufacturer: Animal Motor Works - Designation: 8212M1630-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -AMW_M1630.rse - Manufacturer: Animal Motor Works - Designation: 8212M1630-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -AMW_M1730.eng - Manufacturer: Animal Motor Works - Designation: SK-98-11000 - Data Format: RASP - Data Source: mfr - Contributor: Joel Rogers - -AMW_M1730.rse - Manufacturer: Animal Motor Works - Designation: SK-98-11000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M1850.eng - Manufacturer: Animal Motor Works - Designation: GG-75-6000 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_M1850.rse - Manufacturer: Animal Motor Works - Designation: GG-75-6000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M1850_1.eng - Manufacturer: Animal Motor Works - Designation: GG-75-6000 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_M1900.eng - Manufacturer: Animal Motor Works - Designation: BB-75-6000 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_M1900.rse - Manufacturer: Animal Motor Works - Designation: BB-75-6000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M2050.eng - Manufacturer: Animal Motor Works - Designation: 6774M2050-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -AMW_M2050.rse - Manufacturer: Animal Motor Works - Designation: 6774M2050-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -AMW_M2200.rse - Manufacturer: Animal Motor Works - Designation: SK-75-7600 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M2500.eng - Manufacturer: Animal Motor Works - Designation: GG-75-7600 - Data Format: RASP - Data Source: cert - Contributor: Carl Tulanko - -AMW_M2500.rse - Manufacturer: Animal Motor Works - Designation: GG-75-7600 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_M3000.eng - Manufacturer: Animal Motor Works - Designation: ST-75-7600 - Data Format: RASP - Data Source: cert - Contributor: Conway Stevens - -AMW_M3000.rse - Manufacturer: Animal Motor Works - Designation: ST-75-7600 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_N2020.eng - Manufacturer: Animal Motor Works - Designation: WT-98-11000 - Data Format: RASP - Data Source: user - Contributor: Joel Rogers - -AMW_N2020.rse - Manufacturer: Animal Motor Works - Designation: WT-98-11000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_N2600.eng - Manufacturer: Animal Motor Works - Designation: GG-98-11000 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_N2600.rse - Manufacturer: Animal Motor Works - Designation: GG-98-11000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_N2700.eng - Manufacturer: Animal Motor Works - Designation: BB-98-11000 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AMW_N2700.rse - Manufacturer: Animal Motor Works - Designation: BB-98-11000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_N2800.eng - Manufacturer: Animal Motor Works - Designation: WW-98-17500 - Data Format: RASP - Data Source: mfr - Contributor: John DeMar - -AMW_N2800.rse - Manufacturer: Animal Motor Works - Designation: WW-98-17500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AMW_N4000.eng - Manufacturer: Animal Motor Works - Designation: BB-98-17500 - Data Format: RASP - Data Source: user - Contributor: Robert DeHate - -AMW_N4000.rse - Manufacturer: Animal Motor Works - Designation: BB-98-17500 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_C3.eng - Manufacturer: AeroTech - Designation: C3.4T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_D10.eng - Manufacturer: AeroTech - Designation: D10W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_D13.eng - Manufacturer: AeroTech - Designation: D13W - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_D13.rse - Manufacturer: AeroTech - Designation: D13W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_D15.eng - Manufacturer: AeroTech - Designation: D15T - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_D15.rse - Manufacturer: AeroTech - Designation: D15T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_D2.eng - Manufacturer: AeroTech - Designation: D2.3T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_D21.eng - Manufacturer: AeroTech - Designation: D21T - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_D21.rse - Manufacturer: AeroTech - Designation: D21T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_D24.eng - Manufacturer: AeroTech - Designation: D24T - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_D24.rse - Manufacturer: AeroTech - Designation: D24T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_D7.eng - Manufacturer: AeroTech - Designation: D7-RCT - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_D7.rse - Manufacturer: AeroTech - Designation: D7-RCT - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_D9.eng - Manufacturer: AeroTech - Designation: D9W - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_D9.rse - Manufacturer: AeroTech - Designation: D9W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E11.eng - Manufacturer: AeroTech - Designation: E11J - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_E11.rse - Manufacturer: AeroTech - Designation: E11J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E12.eng - Manufacturer: AeroTech - Designation: E12-RCJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_E12.rse - Manufacturer: AeroTech - Designation: E12-RCJ - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E15.eng - Manufacturer: AeroTech - Designation: E15W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_E15.rse - Manufacturer: AeroTech - Designation: E15W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E15_1.eng - Manufacturer: AeroTech - Designation: E15W - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_E16.eng - Manufacturer: AeroTech - Designation: E16W - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_E16.rse - Manufacturer: AeroTech - Designation: E16W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E18.eng - Manufacturer: AeroTech - Designation: E18W - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_E18.rse - Manufacturer: AeroTech - Designation: E18W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E20.eng - Manufacturer: AeroTech - Designation: E20W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_E23.eng - Manufacturer: AeroTech - Designation: E23T - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_E23.rse - Manufacturer: AeroTech - Designation: E23T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E28.eng - Manufacturer: AeroTech - Designation: E28T - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_E28.rse - Manufacturer: AeroTech - Designation: E28T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E30.eng - Manufacturer: AeroTech - Designation: E30T - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_E30.rse - Manufacturer: AeroTech - Designation: E30T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E6.eng - Manufacturer: AeroTech - Designation: E6 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_E6.rse - Manufacturer: AeroTech - Designation: E6-RCT - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_E7.eng - Manufacturer: AeroTech - Designation: E7-RCT - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_E7.rse - Manufacturer: AeroTech - Designation: E7-RCT - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F10.eng - Manufacturer: AeroTech - Designation: F10 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_F12.eng - Manufacturer: AeroTech - Designation: F12J - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_F12.rse - Manufacturer: AeroTech - Designation: F12J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F13.eng - Manufacturer: AeroTech - Designation: F13-RCT - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F13.rse - Manufacturer: AeroTech - Designation: F13-RCT - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F16.eng - Manufacturer: AeroTech - Designation: F16-RCJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F16.rse - Manufacturer: AeroTech - Designation: F16-RCJ - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F20.eng - Manufacturer: AeroTech - Designation: F20W/L - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_F20.rse - Manufacturer: AeroTech - Designation: F20W/L - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F20_1.eng - Manufacturer: AeroTech - Designation: F20W/L - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F21.eng - Manufacturer: AeroTech - Designation: F21W - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_F21.rse - Manufacturer: AeroTech - Designation: F21W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F22.eng - Manufacturer: AeroTech - Designation: F22J - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F22.rse - Manufacturer: AeroTech - Designation: F22J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F23.eng - Manufacturer: AeroTech - Designation: F23FJ/L - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F23.rse - Manufacturer: AeroTech - Designation: F23FJ/L - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F23_1.eng - Manufacturer: AeroTech - Designation: F23-RCW-SK - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F23_1.rse - Manufacturer: AeroTech - Designation: F23-RCW-SK - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F24.eng - Manufacturer: AeroTech - Designation: F24W - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_F24.rse - Manufacturer: AeroTech - Designation: F24W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F25.eng - Manufacturer: AeroTech - Designation: F25W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F25.rse - Manufacturer: AeroTech - Designation: F25W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F26.eng - Manufacturer: AeroTech - Designation: F26FJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F26.rse - Manufacturer: AeroTech - Designation: F26FJ - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F27.eng - Manufacturer: AeroTech - Designation: F27R/L - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F30.eng - Manufacturer: AeroTech - Designation: F30FJ - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_F32.eng - Manufacturer: AeroTech - Designation: F32T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_F32.rse - Manufacturer: AeroTech - Designation: F32T - Data Format: RockSim - Data Source: cert - Contributor: John Coker - -AeroTech_F32_1.eng - Manufacturer: AeroTech - Designation: F32W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F32_1.rse - Manufacturer: AeroTech - Designation: F32W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F35.eng - Manufacturer: AeroTech - Designation: F35W - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_F37.eng - Manufacturer: AeroTech - Designation: F37W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F37.rse - Manufacturer: AeroTech - Designation: F37W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F39.eng - Manufacturer: AeroTech - Designation: F39T - Data Format: RASP - Data Source: cert - Contributor: Christopher Kobel - -AeroTech_F39.rse - Manufacturer: AeroTech - Designation: F39T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F40.eng - Manufacturer: AeroTech - Designation: F40W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F40.rse - Manufacturer: AeroTech - Designation: F40W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F42.eng - Manufacturer: AeroTech - Designation: F42T/L - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F42.rse - Manufacturer: AeroTech - Designation: F42T/L - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F44.eng - Manufacturer: AeroTech - Designation: F44W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_F50.eng - Manufacturer: AeroTech - Designation: F50T - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F50.rse - Manufacturer: AeroTech - Designation: F50T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F52.eng - Manufacturer: AeroTech - Designation: F52T - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F52.rse - Manufacturer: AeroTech - Designation: F52T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F62.eng - Manufacturer: AeroTech - Designation: F62T - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_F62.rse - Manufacturer: AeroTech - Designation: F62T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_F72.eng - Manufacturer: AeroTech - Designation: F72 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_F72.rse - Manufacturer: AeroTech - Designation: F72 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G101.eng - Manufacturer: AeroTech - Designation: G101T - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_G104.eng - Manufacturer: AeroTech - Designation: G104T - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_G104.rse - Manufacturer: AeroTech - Designation: G104T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G12.eng - Manufacturer: AeroTech - Designation: G12-RCT - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G12.rse - Manufacturer: AeroTech - Designation: G12-RCT - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G125.eng - Manufacturer: AeroTech - Designation: G125T - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_G138.eng - Manufacturer: AeroTech - Designation: HP-G138T - Data Format: RASP - Data Source: user - Contributor: Scott Sager - -AeroTech_G142.eng - Manufacturer: AeroTech - Designation: G142T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_G25.eng - Manufacturer: AeroTech - Designation: G25W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_G25.rse - Manufacturer: AeroTech - Designation: G25W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G25_1.eng - Manufacturer: AeroTech - Designation: G25W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G33.eng - Manufacturer: AeroTech - Designation: G33 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G33.rse - Manufacturer: AeroTech - Designation: G33 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G339.eng - Manufacturer: AeroTech - Designation: G339N - Data Format: RASP - Data Source: cert - Contributor: Bill Wagstaff - -AeroTech_G339.rse - Manufacturer: AeroTech - Designation: G339N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G35.eng - Manufacturer: AeroTech - Designation: G35 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G35.rse - Manufacturer: AeroTech - Designation: G35 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G38.eng - Manufacturer: AeroTech - Designation: G38FJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G38.rse - Manufacturer: AeroTech - Designation: G38FJ - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G40.eng - Manufacturer: AeroTech - Designation: G40W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G40.rse - Manufacturer: AeroTech - Designation: G40W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G53.eng - Manufacturer: AeroTech - Designation: G53FJ - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_G53.rse - Manufacturer: AeroTech - Designation: G53FJ - Data Format: RockSim - Data Source: cert - Contributor: Rich Thompson - -AeroTech_G54.eng - Manufacturer: AeroTech - Designation: G54W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G54.rse - Manufacturer: AeroTech - Designation: G54W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G55.eng - Manufacturer: AeroTech - Designation: G55 - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G55.rse - Manufacturer: AeroTech - Designation: G55 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G61.eng - Manufacturer: AeroTech - Designation: G61W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G61.rse - Manufacturer: AeroTech - Designation: G61W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G64.eng - Manufacturer: AeroTech - Designation: G64W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G67.eng - Manufacturer: AeroTech - Designation: G67R - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_G67.rse - Manufacturer: AeroTech - Designation: G67R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G69.eng - Manufacturer: AeroTech - Designation: G69N - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_G69.rse - Manufacturer: AeroTech - Designation: G69N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G71.eng - Manufacturer: AeroTech - Designation: G71R - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_G71.rse - Manufacturer: AeroTech - Designation: G71R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G71_1.eng - Manufacturer: AeroTech - Designation: G71R - Data Format: RASP - Data Source: mfr - Contributor: Edward K. Chess - -AeroTech_G74.eng - Manufacturer: AeroTech - Designation: G74W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_G75.eng - Manufacturer: AeroTech - Designation: G75J - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_G75.rse - Manufacturer: AeroTech - Designation: HP-G75M - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_G75_1.eng - Manufacturer: AeroTech - Designation: G75J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_G75_1.rse - Manufacturer: AeroTech - Designation: G75J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G76.eng - Manufacturer: AeroTech - Designation: G76G - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_G76.rse - Manufacturer: AeroTech - Designation: G76G - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G76_1.eng - Manufacturer: AeroTech - Designation: G76G - Data Format: RASP - Data Source: cert - Contributor: John DeMar - -AeroTech_G77.eng - Manufacturer: AeroTech - Designation: G77R/L - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G77.rse - Manufacturer: AeroTech - Designation: G77R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G77_1.eng - Manufacturer: AeroTech - Designation: G77R - Data Format: RASP - Data Source: user - Contributor: Stan Hemphill - -AeroTech_G78.eng - Manufacturer: AeroTech - Designation: G78G/L - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_G78_1.eng - Manufacturer: AeroTech - Designation: G78G/L - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_G79.eng - Manufacturer: AeroTech - Designation: G79W/L - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_G79.rse - Manufacturer: AeroTech - Designation: G79W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G79_1.eng - Manufacturer: AeroTech - Designation: G79W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_G80.eng - Manufacturer: AeroTech - Designation: G80T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_G80.rse - Manufacturer: AeroTech - Designation: G80T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_G80_1.eng - Manufacturer: AeroTech - Designation: G80T - Data Format: RASP - Data Source: cert - Contributor: John DeMar - -AeroTech_G80_2.eng - Manufacturer: AeroTech - Designation: G80T - Data Format: RASP - Data Source: cert - Contributor: John DeMar - -AeroTech_G80_3.eng - Manufacturer: AeroTech - Designation: G80T - Data Format: RASP - Data Source: cert - Contributor: John DeMar - -AeroTech_H112.eng - Manufacturer: AeroTech - Designation: H112J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H112.rse - Manufacturer: AeroTech - Designation: H112J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H115.eng - Manufacturer: AeroTech - Designation: HP-H115DM - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_H123.eng - Manufacturer: AeroTech - Designation: H123W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H123.rse - Manufacturer: AeroTech - Designation: H123W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H125.eng - Manufacturer: AeroTech - Designation: H125W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H125.rse - Manufacturer: AeroTech - Designation: H125W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H128.eng - Manufacturer: AeroTech - Designation: H128W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H128.rse - Manufacturer: AeroTech - Designation: H128W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H135.eng - Manufacturer: AeroTech - Designation: HP-H135W - Data Format: RASP - Data Source: cert - Contributor: Robert Belknap - -AeroTech_H148.eng - Manufacturer: AeroTech - Designation: H148R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H148.rse - Manufacturer: AeroTech - Designation: H148R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H165.eng - Manufacturer: AeroTech - Designation: H165R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H165.rse - Manufacturer: AeroTech - Designation: H165R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H170.rse - Manufacturer: AeroTech - Designation: H170M - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_H178.eng - Manufacturer: AeroTech - Designation: H178DM - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_H180.eng - Manufacturer: AeroTech - Designation: H180W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H180.rse - Manufacturer: AeroTech - Designation: H180W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H182.eng - Manufacturer: AeroTech - Designation: HP-H182R - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_H195.eng - Manufacturer: AeroTech - Designation: HP-H195NT - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H210.eng - Manufacturer: AeroTech - Designation: H210R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H210.rse - Manufacturer: AeroTech - Designation: H210R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H220.eng - Manufacturer: AeroTech - Designation: H220T - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_H220.rse - Manufacturer: AeroTech - Designation: H220T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H238.eng - Manufacturer: AeroTech - Designation: H238T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H238.rse - Manufacturer: AeroTech - Designation: H238T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H242.eng - Manufacturer: AeroTech - Designation: H242T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H242.rse - Manufacturer: AeroTech - Designation: H242T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H242_1.eng - Manufacturer: AeroTech - Designation: H242T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H250.eng - Manufacturer: AeroTech - Designation: H250G - Data Format: RASP - Data Source: mfr - Contributor: Jim Yehle - -AeroTech_H250.rse - Manufacturer: AeroTech - Designation: H250G - Data Format: RockSim - Data Source: mfr - Contributor: Jim Yehle - -AeroTech_H268.eng - Manufacturer: AeroTech - Designation: H268R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H268.rse - Manufacturer: AeroTech - Designation: H268R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H45.eng - Manufacturer: AeroTech - Designation: HP-H45W - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_H45.rse - Manufacturer: AeroTech - Designation: H45W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H45_1.eng - Manufacturer: AeroTech - Designation: H45W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H55.eng - Manufacturer: AeroTech - Designation: H55W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H55.rse - Manufacturer: AeroTech - Designation: H55W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H550.eng - Manufacturer: AeroTech - Designation: HP-H550ST - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_H669.eng - Manufacturer: AeroTech - Designation: H669N - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_H669.rse - Manufacturer: AeroTech - Designation: H669N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H70.eng - Manufacturer: AeroTech - Designation: H70W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H70.rse - Manufacturer: AeroTech - Designation: H70W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H73.eng - Manufacturer: AeroTech - Designation: H73J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H73.rse - Manufacturer: AeroTech - Designation: H73J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H97.eng - Manufacturer: AeroTech - Designation: H97J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_H97.rse - Manufacturer: AeroTech - Designation: H97J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_H999.eng - Manufacturer: AeroTech - Designation: H999N - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_H999.rse - Manufacturer: AeroTech - Designation: H999N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I115.eng - Manufacturer: AeroTech - Designation: I115W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I117.eng - Manufacturer: AeroTech - Designation: I117FJ - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I1299.eng - Manufacturer: AeroTech - Designation: I1299N - Data Format: RASP - Data Source: user - Contributor: Jim Yehle - -AeroTech_I1299.rse - Manufacturer: AeroTech - Designation: I1299N - Data Format: RockSim - Data Source: user - Contributor: Jim Yehle - -AeroTech_I132.eng - Manufacturer: AeroTech - Designation: I132W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I132.rse - Manufacturer: AeroTech - Designation: I132W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I140.eng - Manufacturer: AeroTech - Designation: HP-I140W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_I154.eng - Manufacturer: AeroTech - Designation: I154J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I154.rse - Manufacturer: AeroTech - Designation: I154J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I161.eng - Manufacturer: AeroTech - Designation: I161W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I161.rse - Manufacturer: AeroTech - Designation: I161W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I170.eng - Manufacturer: AeroTech - Designation: I170G - Data Format: RASP - Data Source: cert - Contributor: Mark Hairfield - -AeroTech_I195.eng - Manufacturer: AeroTech - Designation: I195J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I195.rse - Manufacturer: AeroTech - Designation: I195J - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I195_1.eng - Manufacturer: AeroTech - Designation: I195J - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I200.eng - Manufacturer: AeroTech - Designation: I200W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I200.rse - Manufacturer: AeroTech - Designation: I200W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I205.eng - Manufacturer: AeroTech - Designation: HP-I205W - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_I211.eng - Manufacturer: AeroTech - Designation: I211W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I211.rse - Manufacturer: AeroTech - Designation: I211W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I215.eng - Manufacturer: AeroTech - Designation: I215R - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I218.eng - Manufacturer: AeroTech - Designation: I218R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I218.rse - Manufacturer: AeroTech - Designation: I218R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I225.eng - Manufacturer: AeroTech - Designation: I225FJ - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_I225.rse - Manufacturer: AeroTech - Designation: I225FJ - Data Format: RockSim - Data Source: mfr - Contributor: Victor Merle Barlow - -AeroTech_I229.eng - Manufacturer: AeroTech - Designation: I229T - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I245.eng - Manufacturer: AeroTech - Designation: I245G - Data Format: RASP - Data Source: mfr - Contributor: Jim Yehle - -AeroTech_I245.rse - Manufacturer: AeroTech - Designation: I245G - Data Format: RockSim - Data Source: mfr - Contributor: Jim Yehle - -AeroTech_I280.eng - Manufacturer: AeroTech - Designation: HP-I280DM - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_I284.eng - Manufacturer: AeroTech - Designation: I284W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I284.rse - Manufacturer: AeroTech - Designation: I284W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I284_1.eng - Manufacturer: AeroTech - Designation: I284W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I285.eng - Manufacturer: AeroTech - Designation: I285R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I285.rse - Manufacturer: AeroTech - Designation: I285R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I300.eng - Manufacturer: AeroTech - Designation: I300T - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_I300.rse - Manufacturer: AeroTech - Designation: I300T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I305.eng - Manufacturer: AeroTech - Designation: I305FJ - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_I305.rse - Manufacturer: AeroTech - Designation: I305FJ - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I327.eng - Manufacturer: AeroTech - Designation: I327DM - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_I350.eng - Manufacturer: AeroTech - Designation: I350R - Data Format: RASP - Data Source: mfr - Contributor: Mark Hairfield - -AeroTech_I357.eng - Manufacturer: AeroTech - Designation: I357T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I357.rse - Manufacturer: AeroTech - Designation: I357T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I364.eng - Manufacturer: AeroTech - Designation: I364FJ - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_I364.rse - Manufacturer: AeroTech - Designation: I364FJ - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I366.eng - Manufacturer: AeroTech - Designation: I366R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I366.rse - Manufacturer: AeroTech - Designation: I366R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I435.eng - Manufacturer: AeroTech - Designation: I435T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I435.rse - Manufacturer: AeroTech - Designation: I435T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I435_1.eng - Manufacturer: AeroTech - Designation: I435T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_I49.eng - Manufacturer: AeroTech - Designation: I49N - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I49.rse - Manufacturer: AeroTech - Designation: I49N - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I500.eng - Manufacturer: AeroTech - Designation: HP-I500T - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I59.eng - Manufacturer: AeroTech - Designation: I59WN - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I59.rse - Manufacturer: AeroTech - Designation: I59WN - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I599.eng - Manufacturer: AeroTech - Designation: I599N - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_I600.eng - Manufacturer: AeroTech - Designation: I600R - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_I600.rse - Manufacturer: AeroTech - Designation: I600R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I65.eng - Manufacturer: AeroTech - Designation: HP-I65W - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_I65.rse - Manufacturer: AeroTech - Designation: I65W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_I65_1.eng - Manufacturer: AeroTech - Designation: I65W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J125.eng - Manufacturer: AeroTech - Designation: J125W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J125.rse - Manufacturer: AeroTech - Designation: J125W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J1299.eng - Manufacturer: AeroTech - Designation: J1299N - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_J1299.rse - Manufacturer: AeroTech - Designation: J1299N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J135.eng - Manufacturer: AeroTech - Designation: J135W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J135.rse - Manufacturer: AeroTech - Designation: J135W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J145.eng - Manufacturer: AeroTech - Designation: J145H 2-jet std. - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J145.rse - Manufacturer: AeroTech - Designation: J145H 2-jet std. - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J170.eng - Manufacturer: AeroTech - Designation: J170H 3-jet std. - Data Format: RASP - Data Source: user - Contributor: Jesus Manuel Recuenco - -AeroTech_J1799.eng - Manufacturer: AeroTech - Designation: J1799N - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_J1799.rse - Manufacturer: AeroTech - Designation: J1799N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J180.eng - Manufacturer: AeroTech - Designation: J180T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J180.rse - Manufacturer: AeroTech - Designation: J180T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J210.eng - Manufacturer: AeroTech - Designation: J210H 4-jet std. - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_J210.rse - Manufacturer: AeroTech - Designation: J210H 4-jet std. - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J250.eng - Manufacturer: AeroTech - Designation: J250FJ - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_J260.eng - Manufacturer: AeroTech - Designation: J260HW 3-jet EFX - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_J260.rse - Manufacturer: AeroTech - Designation: J260HW 3-jet EFX - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J270.eng - Manufacturer: AeroTech - Designation: HP-J270W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_J275.eng - Manufacturer: AeroTech - Designation: J275W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J275.rse - Manufacturer: AeroTech - Designation: J275W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J315.eng - Manufacturer: AeroTech - Designation: J315R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J315.rse - Manufacturer: AeroTech - Designation: J315R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J340.rse - Manufacturer: AeroTech - Designation: J340M - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_J350.eng - Manufacturer: AeroTech - Designation: J350W - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_J350.rse - Manufacturer: AeroTech - Designation: J350W-OLD - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J350_1.eng - Manufacturer: AeroTech - Designation: J350W-OLD - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J350_1.rse - Manufacturer: AeroTech - Designation: J350W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J390.eng - Manufacturer: AeroTech - Designation: J390H-turbo - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_J390.rse - Manufacturer: AeroTech - Designation: J390H-turbo - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J401.eng - Manufacturer: AeroTech - Designation: J401FJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_J415.eng - Manufacturer: AeroTech - Designation: J415W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J415.rse - Manufacturer: AeroTech - Designation: J415W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J420.eng - Manufacturer: AeroTech - Designation: J420R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J420.rse - Manufacturer: AeroTech - Designation: J420R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J425.eng - Manufacturer: AeroTech - Designation: HP-J425R - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_J460.eng - Manufacturer: AeroTech - Designation: J460T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J460.rse - Manufacturer: AeroTech - Designation: J460T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J500.eng - Manufacturer: AeroTech - Designation: J500G - Data Format: RASP - Data Source: mfr - Contributor: Jim Yehle - -AeroTech_J500.rse - Manufacturer: AeroTech - Designation: J500G - Data Format: RockSim - Data Source: mfr - Contributor: Jim Yehle - -AeroTech_J510.eng - Manufacturer: AeroTech - Designation: J510W - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -AeroTech_J540.eng - Manufacturer: AeroTech - Designation: J540R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J540.rse - Manufacturer: AeroTech - Designation: J540R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J570.eng - Manufacturer: AeroTech - Designation: J570W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J570.rse - Manufacturer: AeroTech - Designation: J570W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J575.eng - Manufacturer: AeroTech - Designation: J575FJ - Data Format: RASP - Data Source: cert - Contributor: Simon Crafts - -AeroTech_J575.rse - Manufacturer: AeroTech - Designation: J575FJ - Data Format: RockSim - Data Source: cert - Contributor: Simon Crafts - -AeroTech_J800.eng - Manufacturer: AeroTech - Designation: J800T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J800.rse - Manufacturer: AeroTech - Designation: J800T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J825.eng - Manufacturer: AeroTech - Designation: J825R - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_J825.rse - Manufacturer: AeroTech - Designation: J825R - Data Format: RockSim - Data Source: mfr - Contributor: Tim Durbin - -AeroTech_J90.eng - Manufacturer: AeroTech - Designation: J90W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_J90.rse - Manufacturer: AeroTech - Designation: J90W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_J99.eng - Manufacturer: AeroTech - Designation: J99N - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -AeroTech_K1000.eng - Manufacturer: AeroTech - Designation: K1000T - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_K1050.eng - Manufacturer: AeroTech - Designation: K1050W - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -AeroTech_K1050.rse - Manufacturer: AeroTech - Designation: K1050W-SU - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K1050_1.eng - Manufacturer: AeroTech - Designation: K1050W-SU - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K1100.eng - Manufacturer: AeroTech - Designation: K1100T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K1100.rse - Manufacturer: AeroTech - Designation: K1100T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K1103.eng - Manufacturer: AeroTech - Designation: K1103X - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_K1275.eng - Manufacturer: AeroTech - Designation: K1275R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K1275.rse - Manufacturer: AeroTech - Designation: K1275R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K1499.eng - Manufacturer: AeroTech - Designation: K1499N - Data Format: RASP - Data Source: user - Contributor: Jim Yehle - -AeroTech_K1499.rse - Manufacturer: AeroTech - Designation: K1499N - Data Format: RockSim - Data Source: user - Contributor: Jim Yehle - -AeroTech_K185.eng - Manufacturer: AeroTech - Designation: K185W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K185.rse - Manufacturer: AeroTech - Designation: K185W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K1999.eng - Manufacturer: AeroTech - Designation: K1999N - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_K1999.rse - Manufacturer: AeroTech - Designation: K1999N - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K250.eng - Manufacturer: AeroTech - Designation: K250W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K250.rse - Manufacturer: AeroTech - Designation: K250W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K270.eng - Manufacturer: AeroTech - Designation: K270W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_K270.rse - Manufacturer: AeroTech - Designation: K270W - Data Format: RockSim - Data Source: cert - Contributor: Victor Merle Barlow - -AeroTech_K375.eng - Manufacturer: AeroTech - Designation: K375NW - Data Format: RASP - Data Source: user - Contributor: Christopher Kobel - -AeroTech_K375.rse - Manufacturer: AeroTech - Designation: K375NW - Data Format: RockSim - Data Source: user - Contributor: Robert Geer - -AeroTech_K456.eng - Manufacturer: AeroTech - Designation: K456DM - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_K458.eng - Manufacturer: AeroTech - Designation: K458W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K458.rse - Manufacturer: AeroTech - Designation: K458W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K480.eng - Manufacturer: AeroTech - Designation: K480W - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_K485.eng - Manufacturer: AeroTech - Designation: K485H (3 jet) - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K485.rse - Manufacturer: AeroTech - Designation: K485H (3 jet) - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K513.eng - Manufacturer: AeroTech - Designation: K513FJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_K535.eng - Manufacturer: AeroTech - Designation: HP-K535W - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_K540.rse - Manufacturer: AeroTech - Designation: K540M - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_K550.eng - Manufacturer: AeroTech - Designation: K550W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K550.rse - Manufacturer: AeroTech - Designation: K550W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K560.eng - Manufacturer: AeroTech - Designation: K560W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K560.rse - Manufacturer: AeroTech - Designation: K560W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K650.eng - Manufacturer: AeroTech - Designation: K650T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K650.rse - Manufacturer: AeroTech - Designation: K650T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K680.eng - Manufacturer: AeroTech - Designation: K680R - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_K680.rse - Manufacturer: AeroTech - Designation: K680R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K695.eng - Manufacturer: AeroTech - Designation: K695R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K695.rse - Manufacturer: AeroTech - Designation: K695R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K700.eng - Manufacturer: AeroTech - Designation: K700W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K700.rse - Manufacturer: AeroTech - Designation: K700W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K780.eng - Manufacturer: AeroTech - Designation: K780R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_K780.rse - Manufacturer: AeroTech - Designation: K780R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_K805.eng - Manufacturer: AeroTech - Designation: K805G - Data Format: RASP - Data Source: mfr - Contributor: Tom Koszuta - -AeroTech_K805.rse - Manufacturer: AeroTech - Designation: K805G - Data Format: RockSim - Data Source: mfr - Contributor: J Brent - -AeroTech_K828.eng - Manufacturer: AeroTech - Designation: K828FJ - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_K828.rse - Manufacturer: AeroTech - Designation: K828FJ - Data Format: RockSim - Data Source: cert - Contributor: Victor Merle Barlow - -AeroTech_L1000.eng - Manufacturer: AeroTech - Designation: HP-L1000W - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_L1040.eng - Manufacturer: AeroTech - Designation: L1040DM - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_L1120.eng - Manufacturer: AeroTech - Designation: L1120W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_L1120.rse - Manufacturer: AeroTech - Designation: L1120W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_L1150.eng - Manufacturer: AeroTech - Designation: L1150R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_L1150.rse - Manufacturer: AeroTech - Designation: L1150R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_L1170.eng - Manufacturer: AeroTech - Designation: L1170FJ - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_L1250.eng - Manufacturer: AeroTech - Designation: L1250DM - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_L1300.eng - Manufacturer: AeroTech - Designation: L1300R - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_L1300.rse - Manufacturer: AeroTech - Designation: L1300R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_L1365.eng - Manufacturer: AeroTech - Designation: L1365M - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_L1390.eng - Manufacturer: AeroTech - Designation: L1390G - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_L1420.eng - Manufacturer: AeroTech - Designation: L1420R - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_L1420.rse - Manufacturer: AeroTech - Designation: L1420R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_L1500.eng - Manufacturer: AeroTech - Designation: L1500T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_L1500.rse - Manufacturer: AeroTech - Designation: L1500T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_L1520.eng - Manufacturer: AeroTech - Designation: L1520T - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_L2200.eng - Manufacturer: AeroTech - Designation: L2200G - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_L339.eng - Manufacturer: AeroTech - Designation: L339N - Data Format: RASP - Data Source: user - Contributor: Mark Hairfield - -AeroTech_L339_1.eng - Manufacturer: AeroTech - Designation: L339N - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_L400.eng - Manufacturer: AeroTech - Designation: L400W - Data Format: RASP - Data Source: mfr - Contributor: Mark Hairfield - -AeroTech_L850.eng - Manufacturer: AeroTech - Designation: L850W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_L850.rse - Manufacturer: AeroTech - Designation: L850W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_L900.eng - Manufacturer: AeroTech - Designation: L900DM - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_L952.eng - Manufacturer: AeroTech - Designation: L952W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_L952.rse - Manufacturer: AeroTech - Designation: L952W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M1075.eng - Manufacturer: AeroTech - Designation: M1075DM - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_M1297.eng - Manufacturer: AeroTech - Designation: M1297W - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_M1297.rse - Manufacturer: AeroTech - Designation: M1297W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M1305.eng - Manufacturer: AeroTech - Designation: M1305M - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_M1315.eng - Manufacturer: AeroTech - Designation: M1315W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M1315.rse - Manufacturer: AeroTech - Designation: M1315W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M1350.eng - Manufacturer: AeroTech - Designation: M1350W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_M1350_1.eng - Manufacturer: AeroTech - Designation: M1350W - Data Format: RASP - Data Source: user - Contributor: Mike Caplinger - -AeroTech_M1419.eng - Manufacturer: AeroTech - Designation: M1419W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M1419.rse - Manufacturer: AeroTech - Designation: M1419W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M1500.eng - Manufacturer: AeroTech - Designation: M1500G - Data Format: RASP - Data Source: mfr - Contributor: Christopher Kobel - -AeroTech_M1550.eng - Manufacturer: AeroTech - Designation: M1550R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M1550.rse - Manufacturer: AeroTech - Designation: M1550R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M1600.eng - Manufacturer: AeroTech - Designation: M1600R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M1600.rse - Manufacturer: AeroTech - Designation: M1600R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M1780.eng - Manufacturer: AeroTech - Designation: M1780NT - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_M1780_1.eng - Manufacturer: AeroTech - Designation: M1780NT - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_M1800.eng - Manufacturer: AeroTech - Designation: M1800FJ - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_M1845.eng - Manufacturer: AeroTech - Designation: M1845NT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -AeroTech_M1850.eng - Manufacturer: AeroTech - Designation: M1850W - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_M1939.eng - Manufacturer: AeroTech - Designation: M1939W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M1939.rse - Manufacturer: AeroTech - Designation: M1939W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M2000.eng - Manufacturer: AeroTech - Designation: M2000R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M2000.rse - Manufacturer: AeroTech - Designation: M2000R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M2030.rse - Manufacturer: AeroTech - Designation: M2030G-P - Data Format: RockSim - Data Source: user - Contributor: J Brent - -AeroTech_M2100.eng - Manufacturer: AeroTech - Designation: M2100G - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_M2400.eng - Manufacturer: AeroTech - Designation: M2400T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M2400.rse - Manufacturer: AeroTech - Designation: M2400T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M2500.eng - Manufacturer: AeroTech - Designation: M2500T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_M2500.rse - Manufacturer: AeroTech - Designation: M2500T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M650.eng - Manufacturer: AeroTech - Designation: M650W - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_M650.rse - Manufacturer: AeroTech - Designation: M650W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M685.eng - Manufacturer: AeroTech - Designation: M685W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -AeroTech_M750.eng - Manufacturer: AeroTech - Designation: M750W - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -AeroTech_M750.rse - Manufacturer: AeroTech - Designation: M750W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_M845.eng - Manufacturer: AeroTech - Designation: M845H - Data Format: RASP - Data Source: user - Contributor: John Coker - -AeroTech_M845.rse - Manufacturer: AeroTech - Designation: M845H - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_N1000.eng - Manufacturer: AeroTech - Designation: N1000W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_N2000.eng - Manufacturer: AeroTech - Designation: N2000W - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_N2000.rse - Manufacturer: AeroTech - Designation: N2000W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -AeroTech_N2220.eng - Manufacturer: AeroTech - Designation: N2220DM - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -AeroTech_N3300.eng - Manufacturer: AeroTech - Designation: N3300R - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -AeroTech_N4800.eng - Manufacturer: AeroTech - Designation: N4800T - Data Format: RASP - Data Source: cert - Contributor: John Coker - -AeroTech_N4800.rse - Manufacturer: AeroTech - Designation: N4800T - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Alpha_I250.eng - Manufacturer: Alpha Hybrids - Designation: I250 - Data Format: RASP - Data Source: mfr - Contributor: Edward Wranosky - -Apogee_1_2A2.eng - Manufacturer: Apogee Components - Designation: 1/2A2 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_1_2A2.rse - Manufacturer: Apogee Components - Designation: 1/2A2 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_1_4A2.eng - Manufacturer: Apogee Components - Designation: 1/4A2 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_1_4A2.rse - Manufacturer: Apogee Components - Designation: 1/4A2 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_A2.eng - Manufacturer: Apogee Components - Designation: A2 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_A2.rse - Manufacturer: Apogee Components - Designation: A2 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_B2.eng - Manufacturer: Apogee Components - Designation: B2 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_B2.rse - Manufacturer: Apogee Components - Designation: B2 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_B7.eng - Manufacturer: Apogee Components - Designation: B7 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_B7.rse - Manufacturer: Apogee Components - Designation: B7 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_C10.eng - Manufacturer: Apogee Components - Designation: C10 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_C10.rse - Manufacturer: Apogee Components - Designation: C10 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_C4.eng - Manufacturer: Apogee Components - Designation: C4 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_C4.rse - Manufacturer: Apogee Components - Designation: C4 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_C6.eng - Manufacturer: Apogee Components - Designation: C6 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_C6.rse - Manufacturer: Apogee Components - Designation: C6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_D10.eng - Manufacturer: Apogee Components - Designation: D10 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_D10.rse - Manufacturer: Apogee Components - Designation: D10 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_D3.eng - Manufacturer: Apogee Components - Designation: D3 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_D3.rse - Manufacturer: Apogee Components - Designation: D3 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_E6.eng - Manufacturer: Apogee Components - Designation: E6 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_E6.rse - Manufacturer: Apogee Components - Designation: E6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Apogee_F10.eng - Manufacturer: Apogee Components - Designation: F10 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Apogee_F10.rse - Manufacturer: Apogee Components - Designation: F10 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_E22.eng - Manufacturer: Cesaroni Technology - Designation: 24E22-13A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_E22.rse - Manufacturer: Cesaroni Technology - Designation: 24E22-13A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_E31.eng - Manufacturer: Cesaroni Technology - Designation: 26E31-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_E31.rse - Manufacturer: Cesaroni Technology - Designation: 26E31-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_E75.eng - Manufacturer: Cesaroni Technology - Designation: 25E75-17A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_E75.rse - Manufacturer: Cesaroni Technology - Designation: 25E75-17A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F120.eng - Manufacturer: Cesaroni Technology - Designation: HP56F120-14A - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_F120.rse - Manufacturer: Cesaroni Technology - Designation: HP56F120-14A - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_F240.eng - Manufacturer: Cesaroni Technology - Designation: HP68F240-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F240.rse - Manufacturer: Cesaroni Technology - Designation: HP68F240-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F29.eng - Manufacturer: Cesaroni Technology - Designation: 55F29-12A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F29.rse - Manufacturer: Cesaroni Technology - Designation: 55F29-12A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F30.eng - Manufacturer: Cesaroni Technology - Designation: 73F30-6A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F30.rse - Manufacturer: Cesaroni Technology - Designation: 73F30-6A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F31.rse - Manufacturer: Cesaroni Technology - Designation: 56F31-12A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F32.rse - Manufacturer: Cesaroni Technology - Designation: 53F32-12A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F36.eng - Manufacturer: Cesaroni Technology - Designation: 41F36-11A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F36.rse - Manufacturer: Cesaroni Technology - Designation: 51F36-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F36_1.eng - Manufacturer: Cesaroni Technology - Designation: 51F36-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F36_1.rse - Manufacturer: Cesaroni Technology - Designation: 41F36-11A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F50.eng - Manufacturer: Cesaroni Technology - Designation: HP60F50-13A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F50.rse - Manufacturer: Cesaroni Technology - Designation: HP60F50-13A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F51.eng - Manufacturer: Cesaroni Technology - Designation: 75F51-12A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F51.rse - Manufacturer: Cesaroni Technology - Designation: 50F51-13A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F51_1.rse - Manufacturer: Cesaroni Technology - Designation: 75F51-12A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F59.eng - Manufacturer: Cesaroni Technology - Designation: 57F59-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F59.rse - Manufacturer: Cesaroni Technology - Designation: 57F59-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F70.rse - Manufacturer: Cesaroni Technology - Designation: 53F70-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F79.eng - Manufacturer: Cesaroni Technology - Designation: 68F79-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F79.rse - Manufacturer: Cesaroni Technology - Designation: 68F79-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_F85.eng - Manufacturer: Cesaroni Technology - Designation: HP75F85-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_F85.rse - Manufacturer: Cesaroni Technology - Designation: HP75F85-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G100.eng - Manufacturer: Cesaroni Technology - Designation: HP114G100-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G100.rse - Manufacturer: Cesaroni Technology - Designation: HP114G100-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G106.eng - Manufacturer: Cesaroni Technology - Designation: HP138G106-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G106.rse - Manufacturer: Cesaroni Technology - Designation: HP138G106-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G107.eng - Manufacturer: Cesaroni Technology - Designation: HP139G107-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G107.rse - Manufacturer: Cesaroni Technology - Designation: HP139G107-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G115.rse - Manufacturer: Cesaroni Technology - Designation: HP141G115-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G117.eng - Manufacturer: Cesaroni Technology - Designation: HP142G117-11A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G117.rse - Manufacturer: Cesaroni Technology - Designation: HP142G117-11A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G118.eng - Manufacturer: Cesaroni Technology - Designation: HP159G118-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G118.rse - Manufacturer: Cesaroni Technology - Designation: HP159G118-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G125.eng - Manufacturer: Cesaroni Technology - Designation: HP159G125-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G125.rse - Manufacturer: Cesaroni Technology - Designation: HP159G125-14A - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_G126.eng - Manufacturer: Cesaroni Technology - Designation: HP116G126-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G126.rse - Manufacturer: Cesaroni Technology - Designation: HP116G126-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G127.eng - Manufacturer: Cesaroni Technology - Designation: HP137G127-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G127.rse - Manufacturer: Cesaroni Technology - Designation: HP137G127-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G131.eng - Manufacturer: Cesaroni Technology - Designation: HP125G131-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G131.rse - Manufacturer: Cesaroni Technology - Designation: HP125G131-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G145.eng - Manufacturer: Cesaroni Technology - Designation: HP140G145-15A - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -Cesaroni_G145.rse - Manufacturer: Cesaroni Technology - Designation: HP140G145-15A - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_G150.eng - Manufacturer: Cesaroni Technology - Designation: HP143G150-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G150.rse - Manufacturer: Cesaroni Technology - Designation: HP143G150-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G185.rse - Manufacturer: Cesaroni Technology - Designation: HP128G185-12A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_G250.eng - Manufacturer: Cesaroni Technology - Designation: HP110G250-14A - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_G250.rse - Manufacturer: Cesaroni Technology - Designation: HP110G250-14A - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_G33.rse - Manufacturer: Cesaroni Technology - Designation: 143G33-9A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G46.rse - Manufacturer: Cesaroni Technology - Designation: 127G46-11A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_G50.eng - Manufacturer: Cesaroni Technology - Designation: HP150G50-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G50.rse - Manufacturer: Cesaroni Technology - Designation: HP150G50-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G54.eng - Manufacturer: Cesaroni Technology - Designation: HP159G54-12A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G54.rse - Manufacturer: Cesaroni Technology - Designation: HP159G54-12A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G57.eng - Manufacturer: Cesaroni Technology - Designation: 108G57-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G57.rse - Manufacturer: Cesaroni Technology - Designation: 108G57-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G58.eng - Manufacturer: Cesaroni Technology - Designation: HP137G58-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G58.rse - Manufacturer: Cesaroni Technology - Designation: HP137G58-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G60.eng - Manufacturer: Cesaroni Technology - Designation: HP134G60-14A - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_G60.rse - Manufacturer: Cesaroni Technology - Designation: HP134G60-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_G65.eng - Manufacturer: Cesaroni Technology - Designation: HP144G65-8A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G65.rse - Manufacturer: Cesaroni Technology - Designation: HP144G65-8A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G68.eng - Manufacturer: Cesaroni Technology - Designation: HP108G68-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G68.rse - Manufacturer: Cesaroni Technology - Designation: HP108G68-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G69.eng - Manufacturer: Cesaroni Technology - Designation: HP117G69-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G69.rse - Manufacturer: Cesaroni Technology - Designation: HP117G69-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_G69_1.eng - Manufacturer: Cesaroni Technology - Designation: HP117G69-14A - Data Format: RASP - Data Source: user - Contributor: Pete Carr - -Cesaroni_G69_2.eng - Manufacturer: Cesaroni Technology - Designation: HP117G69-14A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_G78.eng - Manufacturer: Cesaroni Technology - Designation: HP141G78-15A - Data Format: RASP - Data Source: mfr - Contributor: Mike Caplinger - -Cesaroni_G79.eng - Manufacturer: Cesaroni Technology - Designation: HP129G79-13A - Data Format: RASP - Data Source: user - Contributor: Pete Carr - -Cesaroni_G79.rse - Manufacturer: Cesaroni Technology - Designation: HP129G79-13A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_G79_1.eng - Manufacturer: Cesaroni Technology - Designation: HP129G79-13A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_G80.eng - Manufacturer: Cesaroni Technology - Designation: HP93G80-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_G80.rse - Manufacturer: Cesaroni Technology - Designation: HP93G80-14A - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_G83.eng - Manufacturer: Cesaroni Technology - Designation: HP107G83-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G83.rse - Manufacturer: Cesaroni Technology - Designation: HP107G83-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G84.eng - Manufacturer: Cesaroni Technology - Designation: HP131G84-10A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G84.rse - Manufacturer: Cesaroni Technology - Designation: HP131G84-10A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G88.eng - Manufacturer: Cesaroni Technology - Designation: HP84G88-11A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_G88.rse - Manufacturer: Cesaroni Technology - Designation: HP84G88-11A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H100.eng - Manufacturer: Cesaroni Technology - Designation: 286H100-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H100.rse - Manufacturer: Cesaroni Technology - Designation: 286H100-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H110.eng - Manufacturer: Cesaroni Technology - Designation: 269H110-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H110.rse - Manufacturer: Cesaroni Technology - Designation: 269H110-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H118.eng - Manufacturer: Cesaroni Technology - Designation: 216H118-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H118.rse - Manufacturer: Cesaroni Technology - Designation: 216H118-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H120.eng - Manufacturer: Cesaroni Technology - Designation: 261H120-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H120.rse - Manufacturer: Cesaroni Technology - Designation: 261H120-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_H123.eng - Manufacturer: Cesaroni Technology - Designation: 176H123-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H123.rse - Manufacturer: Cesaroni Technology - Designation: 176H123-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H123_1.eng - Manufacturer: Cesaroni Technology - Designation: 232H123-14A - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_H123_1.rse - Manufacturer: Cesaroni Technology - Designation: 232H123-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_H123_2.rse - Manufacturer: Cesaroni Technology - Designation: 232H123-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H125.eng - Manufacturer: Cesaroni Technology - Designation: 266H125-12A - Data Format: RASP - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_H125.rse - Manufacturer: Cesaroni Technology - Designation: 266H125-12A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_H133.eng - Manufacturer: Cesaroni Technology - Designation: 163H133-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H133.rse - Manufacturer: Cesaroni Technology - Designation: 163H133-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H135.eng - Manufacturer: Cesaroni Technology - Designation: 217H135-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H135.rse - Manufacturer: Cesaroni Technology - Designation: 217H135-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H140.eng - Manufacturer: Cesaroni Technology - Designation: 268H140-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H140.rse - Manufacturer: Cesaroni Technology - Designation: 268H140-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H143.eng - Manufacturer: Cesaroni Technology - Designation: 247H143-13A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_H143.rse - Manufacturer: Cesaroni Technology - Designation: 247H143-13A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_H151.eng - Manufacturer: Cesaroni Technology - Designation: 207H151-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H151.rse - Manufacturer: Cesaroni Technology - Designation: 207H151-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H152.eng - Manufacturer: Cesaroni Technology - Designation: 276H152-15A - Data Format: RASP - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_H152.rse - Manufacturer: Cesaroni Technology - Designation: 276H152-15A - Data Format: RockSim - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_H153.eng - Manufacturer: Cesaroni Technology - Designation: H153 - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_H153.rse - Manufacturer: Cesaroni Technology - Designation: H153 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_H159.eng - Manufacturer: Cesaroni Technology - Designation: 298H159-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H159.rse - Manufacturer: Cesaroni Technology - Designation: 298H159-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H160.eng - Manufacturer: Cesaroni Technology - Designation: 312H160-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H160.rse - Manufacturer: Cesaroni Technology - Designation: 312H160-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H160_1.rse - Manufacturer: Cesaroni Technology - Designation: 220H160-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H163.eng - Manufacturer: Cesaroni Technology - Designation: 166H163-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H163.rse - Manufacturer: Cesaroni Technology - Designation: 166H163-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H170.eng - Manufacturer: Cesaroni Technology - Designation: 217H170-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H170.rse - Manufacturer: Cesaroni Technology - Designation: 217H170-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H175.eng - Manufacturer: Cesaroni Technology - Designation: 166H175-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H175.rse - Manufacturer: Cesaroni Technology - Designation: 166H175-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H180.eng - Manufacturer: Cesaroni Technology - Designation: 258H180-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H180.rse - Manufacturer: Cesaroni Technology - Designation: 258H180-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H194.eng - Manufacturer: Cesaroni Technology - Designation: 260H194-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H194.rse - Manufacturer: Cesaroni Technology - Designation: 260H194-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H200.eng - Manufacturer: Cesaroni Technology - Designation: 261H200-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H200.rse - Manufacturer: Cesaroni Technology - Designation: 261H200-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H225.rse - Manufacturer: Cesaroni Technology - Designation: 273H225-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H226.eng - Manufacturer: Cesaroni Technology - Designation: 305H226-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H226.rse - Manufacturer: Cesaroni Technology - Designation: 305H226-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H233.eng - Manufacturer: Cesaroni Technology - Designation: 311H233-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H233.rse - Manufacturer: Cesaroni Technology - Designation: 311H233-14A - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_H237.eng - Manufacturer: Cesaroni Technology - Designation: 206H237-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H237.rse - Manufacturer: Cesaroni Technology - Designation: 206H237-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H255.eng - Manufacturer: Cesaroni Technology - Designation: 315H255-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H255.rse - Manufacturer: Cesaroni Technology - Designation: 315H255-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H255_1.eng - Manufacturer: Cesaroni Technology - Designation: 229H255-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H255_1.rse - Manufacturer: Cesaroni Technology - Designation: 229H255-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H295.eng - Manufacturer: Cesaroni Technology - Designation: 253H295-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H295.rse - Manufacturer: Cesaroni Technology - Designation: 253H295-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H340.eng - Manufacturer: Cesaroni Technology - Designation: 287H340-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H340.rse - Manufacturer: Cesaroni Technology - Designation: 287H340-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H399.eng - Manufacturer: Cesaroni Technology - Designation: 282H399-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H399.rse - Manufacturer: Cesaroni Technology - Designation: 282H399-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H400.rse - Manufacturer: Cesaroni Technology - Designation: 225H400-13A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_H410.eng - Manufacturer: Cesaroni Technology - Designation: 168H410-14A - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_H410.rse - Manufacturer: Cesaroni Technology - Designation: 168H410-14A - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_H42.rse - Manufacturer: Cesaroni Technology - Designation: 186H42-10A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H53.rse - Manufacturer: Cesaroni Technology - Designation: 234H53-12A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_H54.eng - Manufacturer: Cesaroni Technology - Designation: 168H54-10A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H54.rse - Manufacturer: Cesaroni Technology - Designation: 168H54-10A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H565.eng - Manufacturer: Cesaroni Technology - Designation: 320H565-14A - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_H565.rse - Manufacturer: Cesaroni Technology - Designation: 320H565-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_H87.eng - Manufacturer: Cesaroni Technology - Designation: 168H87-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H87.rse - Manufacturer: Cesaroni Technology - Designation: 168H87-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H90.eng - Manufacturer: Cesaroni Technology - Designation: 164H90-12A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_H90.rse - Manufacturer: Cesaroni Technology - Designation: 164H90-12A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I100.eng - Manufacturer: Cesaroni Technology - Designation: 614I100-17A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I100.rse - Manufacturer: Cesaroni Technology - Designation: 614I100-17A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I120.eng - Manufacturer: Cesaroni Technology - Designation: 502I120-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I120.rse - Manufacturer: Cesaroni Technology - Designation: 502I120-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I125.eng - Manufacturer: Cesaroni Technology - Designation: 567I125-10A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I125.rse - Manufacturer: Cesaroni Technology - Designation: 567I125-10A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I140.eng - Manufacturer: Cesaroni Technology - Designation: 396I140-14A - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_I140.rse - Manufacturer: Cesaroni Technology - Designation: 396I140-14A - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_I150.eng - Manufacturer: Cesaroni Technology - Designation: 465I150-11A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I150.rse - Manufacturer: Cesaroni Technology - Designation: 465I150-11A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I165.eng - Manufacturer: Cesaroni Technology - Designation: 518I165-17A - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_I170.eng - Manufacturer: Cesaroni Technology - Designation: 382I170-14A - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_I170.rse - Manufacturer: Cesaroni Technology - Designation: 382I170-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I175.eng - Manufacturer: Cesaroni Technology - Designation: 411I175-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I175.rse - Manufacturer: Cesaroni Technology - Designation: 411I175-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I180.eng - Manufacturer: Cesaroni Technology - Designation: 338I180-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I180.rse - Manufacturer: Cesaroni Technology - Designation: 338I180-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I195.rse - Manufacturer: Cesaroni Technology - Designation: 396I195-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I204.eng - Manufacturer: Cesaroni Technology - Designation: 348I204-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I204.rse - Manufacturer: Cesaroni Technology - Designation: 348I204-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I205.eng - Manufacturer: Cesaroni Technology - Designation: I205 - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_I205.rse - Manufacturer: Cesaroni Technology - Designation: I205 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I212.eng - Manufacturer: Cesaroni Technology - Designation: 364I212-14A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_I212.rse - Manufacturer: Cesaroni Technology - Designation: 364I212-14A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I216.eng - Manufacturer: Cesaroni Technology - Designation: 636I216-14A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I216.rse - Manufacturer: Cesaroni Technology - Designation: 636I216-14A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I218.eng - Manufacturer: Cesaroni Technology - Designation: 491I218-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I218.rse - Manufacturer: Cesaroni Technology - Designation: 491I218-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I224.eng - Manufacturer: Cesaroni Technology - Designation: 381I224-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I224.rse - Manufacturer: Cesaroni Technology - Designation: 381I224-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I236.eng - Manufacturer: Cesaroni Technology - Designation: 413I236-17A - Data Format: RASP - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_I236.rse - Manufacturer: Cesaroni Technology - Designation: 413I236-17A - Data Format: RockSim - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_I240.eng - Manufacturer: Cesaroni Technology - Designation: I240 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_I240.rse - Manufacturer: Cesaroni Technology - Designation: I240 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I242.eng - Manufacturer: Cesaroni Technology - Designation: 548I242-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I242.rse - Manufacturer: Cesaroni Technology - Designation: 548I242-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I243.eng - Manufacturer: Cesaroni Technology - Designation: 382I243-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I243.rse - Manufacturer: Cesaroni Technology - Designation: 382I243-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I255.rse - Manufacturer: Cesaroni Technology - Designation: 517I255-16A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I285.eng - Manufacturer: Cesaroni Technology - Designation: 512I285-15A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_I285.rse - Manufacturer: Cesaroni Technology - Designation: 512I285-15A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I287.eng - Manufacturer: Cesaroni Technology - Designation: 486I287-15A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_I287.rse - Manufacturer: Cesaroni Technology - Designation: 486I287-15A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I303.eng - Manufacturer: Cesaroni Technology - Designation: 538I303-16A - Data Format: RASP - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_I303.rse - Manufacturer: Cesaroni Technology - Designation: 538I303-16A - Data Format: RockSim - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_I345.rse - Manufacturer: Cesaroni Technology - Designation: 408I345-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I350.eng - Manufacturer: Cesaroni Technology - Designation: 601I350-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_I350.rse - Manufacturer: Cesaroni Technology - Designation: 601I350-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I360.eng - Manufacturer: Cesaroni Technology - Designation: I360 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_I360.rse - Manufacturer: Cesaroni Technology - Designation: I360 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I445.eng - Manufacturer: Cesaroni Technology - Designation: 475I445-16A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I445.rse - Manufacturer: Cesaroni Technology - Designation: 475I445-16A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I470.rse - Manufacturer: Cesaroni Technology - Designation: 540I470-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_I540.eng - Manufacturer: Cesaroni Technology - Designation: 634I540-16A - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_I540.rse - Manufacturer: Cesaroni Technology - Designation: 634I540-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I55.rse - Manufacturer: Cesaroni Technology - Designation: 395I55-9A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_I566.rse - Manufacturer: Cesaroni Technology - Designation: 370I566-15A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_I800.rse - Manufacturer: Cesaroni Technology - Designation: 419I800-15A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J1055.rse - Manufacturer: Cesaroni Technology - Designation: 747J1055-17A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_J140.eng - Manufacturer: Cesaroni Technology - Designation: 1211J140-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J140.rse - Manufacturer: Cesaroni Technology - Designation: 1211J140-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J145.rse - Manufacturer: Cesaroni Technology - Designation: 699J145-19A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J150.rse - Manufacturer: Cesaroni Technology - Designation: 949J150-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J1520.rse - Manufacturer: Cesaroni Technology - Designation: 1093J1520-17A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_J210.eng - Manufacturer: Cesaroni Technology - Designation: 836J210-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J210.rse - Manufacturer: Cesaroni Technology - Designation: 836J210-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J240.rse - Manufacturer: Cesaroni Technology - Designation: 806J240-16A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_J244.eng - Manufacturer: Cesaroni Technology - Designation: 867J244-14A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J244.rse - Manufacturer: Cesaroni Technology - Designation: 867J244-14A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J250.eng - Manufacturer: Cesaroni Technology - Designation: 683J250-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J250.rse - Manufacturer: Cesaroni Technology - Designation: 683J250-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J270.eng - Manufacturer: Cesaroni Technology - Designation: 650J270-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J270.rse - Manufacturer: Cesaroni Technology - Designation: 650J270-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J280.eng - Manufacturer: Cesaroni Technology - Designation: 716J280-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J280.rse - Manufacturer: Cesaroni Technology - Designation: 716J280-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J285.eng - Manufacturer: Cesaroni Technology - Designation: 648J285-15A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J285.rse - Manufacturer: Cesaroni Technology - Designation: 648J285-15A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J290.eng - Manufacturer: Cesaroni Technology - Designation: 684J290-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J290.rse - Manufacturer: Cesaroni Technology - Designation: 684J290-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J293.eng - Manufacturer: Cesaroni Technology - Designation: 838J293-13A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J293.rse - Manufacturer: Cesaroni Technology - Designation: 838J293-13A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J295.eng - Manufacturer: Cesaroni Technology - Designation: 1195J295-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J295.rse - Manufacturer: Cesaroni Technology - Designation: 1195J295-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J300.eng - Manufacturer: Cesaroni Technology - Designation: J300 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_J300.rse - Manufacturer: Cesaroni Technology - Designation: J300 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J316.eng - Manufacturer: Cesaroni Technology - Designation: 654J316-17A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J316.rse - Manufacturer: Cesaroni Technology - Designation: 654J316-17A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J330.eng - Manufacturer: Cesaroni Technology - Designation: 765J330-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J330.rse - Manufacturer: Cesaroni Technology - Designation: 765J330-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J335.rse - Manufacturer: Cesaroni Technology - Designation: 649J335-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J354.eng - Manufacturer: Cesaroni Technology - Designation: 819J354-16A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J354.rse - Manufacturer: Cesaroni Technology - Designation: 819J354-16A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J355.rse - Manufacturer: Cesaroni Technology - Designation: 1190J355-17A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_J357.eng - Manufacturer: Cesaroni Technology - Designation: 658J357-17A - Data Format: RASP - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_J357.rse - Manufacturer: Cesaroni Technology - Designation: 658J357-17A - Data Format: RockSim - Data Source: mfr - Contributor: Rich Thompson - -Cesaroni_J360.eng - Manufacturer: Cesaroni Technology - Designation: 1016J360-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J360.rse - Manufacturer: Cesaroni Technology - Designation: 1016J360-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J360_1.eng - Manufacturer: Cesaroni Technology - Designation: J360 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_J360_1.rse - Manufacturer: Cesaroni Technology - Designation: J360 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J380.eng - Manufacturer: Cesaroni Technology - Designation: 1043J380-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J380.rse - Manufacturer: Cesaroni Technology - Designation: 1043J380-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J381.eng - Manufacturer: Cesaroni Technology - Designation: 660J381-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J381.rse - Manufacturer: Cesaroni Technology - Designation: 660J381-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J394.eng - Manufacturer: Cesaroni Technology - Designation: 970J394-13A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J394.rse - Manufacturer: Cesaroni Technology - Designation: 970J394-13A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J400.eng - Manufacturer: Cesaroni Technology - Designation: 700J400-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_J400.rse - Manufacturer: Cesaroni Technology - Designation: 700J400-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J410.eng - Manufacturer: Cesaroni Technology - Designation: 774J410-16A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J410.rse - Manufacturer: Cesaroni Technology - Designation: 774J410-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_J420.eng - Manufacturer: Cesaroni Technology - Designation: 1008J420-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J420.rse - Manufacturer: Cesaroni Technology - Designation: 1008J420-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J425.eng - Manufacturer: Cesaroni Technology - Designation: 784J425-16A - Data Format: RASP - Data Source: mfr - Contributor: Todd Bowman - -Cesaroni_J430.eng - Manufacturer: Cesaroni Technology - Designation: 821J430-18A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J430.rse - Manufacturer: Cesaroni Technology - Designation: 821J430-18A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J449.eng - Manufacturer: Cesaroni Technology - Designation: 1261J449-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J449.rse - Manufacturer: Cesaroni Technology - Designation: 1261J449-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J453.eng - Manufacturer: Cesaroni Technology - Designation: 1013J453-16A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J453.rse - Manufacturer: Cesaroni Technology - Designation: 1013J453-16A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J520.eng - Manufacturer: Cesaroni Technology - Designation: 848J520-16A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J520.rse - Manufacturer: Cesaroni Technology - Designation: 848J520-16A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J530.eng - Manufacturer: Cesaroni Technology - Designation: 1115J530-15A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J530.rse - Manufacturer: Cesaroni Technology - Designation: 1115J530-15A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J580.eng - Manufacturer: Cesaroni Technology - Designation: 896J580-17A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J580.rse - Manufacturer: Cesaroni Technology - Designation: 896J580-17A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J595.eng - Manufacturer: Cesaroni Technology - Designation: 985J595-16A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J595.rse - Manufacturer: Cesaroni Technology - Designation: 985J595-16A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J600.eng - Manufacturer: Cesaroni Technology - Designation: 999J600-16A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J600.rse - Manufacturer: Cesaroni Technology - Designation: 999J600-16A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_J760.eng - Manufacturer: Cesaroni Technology - Designation: 1266J760-19A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J760.rse - Manufacturer: Cesaroni Technology - Designation: 1266J760-19A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_J94.rse - Manufacturer: Cesaroni Technology - Designation: 644J94-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K1085.rse - Manufacturer: Cesaroni Technology - Designation: 2411K1085-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K1200.rse - Manufacturer: Cesaroni Technology - Designation: 2014K1200-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K1440.rse - Manufacturer: Cesaroni Technology - Designation: 2372K1440-17A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K160.eng - Manufacturer: Cesaroni Technology - Designation: 1526K160-6 - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_K160.rse - Manufacturer: Cesaroni Technology - Designation: 1526K160-6 - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_K1620.rse - Manufacturer: Cesaroni Technology - Designation: 2440K1620-P - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_K2000.eng - Manufacturer: Cesaroni Technology - Designation: 2329K2000-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K2000.rse - Manufacturer: Cesaroni Technology - Designation: 2329K2000-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K2045.eng - Manufacturer: Cesaroni Technology - Designation: 1408K2045-17A - Data Format: RASP - Data Source: user - Contributor: Karl Baumheckel - -Cesaroni_K2045.rse - Manufacturer: Cesaroni Technology - Designation: 1408K2045-17A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_K260.eng - Manufacturer: Cesaroni Technology - Designation: 2285K260-P - Data Format: RASP - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_K260.rse - Manufacturer: Cesaroni Technology - Designation: 2285K260-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_K261.eng - Manufacturer: Cesaroni Technology - Designation: 2021K261-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K261.rse - Manufacturer: Cesaroni Technology - Designation: 2021K261-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K300.eng - Manufacturer: Cesaroni Technology - Designation: 2546K300-P - Data Format: RASP - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_K300.rse - Manufacturer: Cesaroni Technology - Designation: 2546K300-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_K360.eng - Manufacturer: Cesaroni Technology - Designation: 1281K360-13A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K360.rse - Manufacturer: Cesaroni Technology - Designation: 1281K360-13A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K400.eng - Manufacturer: Cesaroni Technology - Designation: 1597K400-14A - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_K400.rse - Manufacturer: Cesaroni Technology - Designation: 1597K400-14A - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_K445.eng - Manufacturer: Cesaroni Technology - Designation: 1635K445-17A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_K445.rse - Manufacturer: Cesaroni Technology - Designation: 1635K445-17A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K454.eng - Manufacturer: Cesaroni Technology - Designation: 1364K454-19A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K454.rse - Manufacturer: Cesaroni Technology - Designation: 1364K454-19A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K490.eng - Manufacturer: Cesaroni Technology - Designation: 1990K490-16A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K490.rse - Manufacturer: Cesaroni Technology - Designation: 1990K490-16A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K500.rse - Manufacturer: Cesaroni Technology - Designation: 1596K500-18A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_K510.eng - Manufacturer: Cesaroni Technology - Designation: 2486K510-P - Data Format: RASP - Data Source: mfr - Contributor: Len Lekx - -Cesaroni_K510.rse - Manufacturer: Cesaroni Technology - Designation: 2486K510-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K510_1.eng - Manufacturer: Cesaroni Technology - Designation: 2486K510-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_K515.eng - Manufacturer: Cesaroni Technology - Designation: 1654K515-16A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K515.rse - Manufacturer: Cesaroni Technology - Designation: 1654K515-16A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K520.rse - Manufacturer: Cesaroni Technology - Designation: 1711K520-17A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K530.eng - Manufacturer: Cesaroni Technology - Designation: 1412K530-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_K530.rse - Manufacturer: Cesaroni Technology - Designation: 1412K530-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K555.eng - Manufacturer: Cesaroni Technology - Designation: 2406K555-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K555.rse - Manufacturer: Cesaroni Technology - Designation: 2406K555-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K570.eng - Manufacturer: Cesaroni Technology - Designation: 2060K570-17A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_K570.rse - Manufacturer: Cesaroni Technology - Designation: 2060K570-17A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K575.eng - Manufacturer: Cesaroni Technology - Designation: 2493 K575-P - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_K575.rse - Manufacturer: Cesaroni Technology - Designation: 2493 K575-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K590.rse - Manufacturer: Cesaroni Technology - Designation: 2398K590-15A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_K600.rse - Manufacturer: Cesaroni Technology - Designation: 2130K600-17A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K630.eng - Manufacturer: Cesaroni Technology - Designation: 1679K630-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K630.rse - Manufacturer: Cesaroni Technology - Designation: 1679K630-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K635.rse - Manufacturer: Cesaroni Technology - Designation: 1994K635-17A - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_K650.eng - Manufacturer: Cesaroni Technology - Designation: 1997K650-21A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K650.rse - Manufacturer: Cesaroni Technology - Designation: 1997K650-21A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K650_1.eng - Manufacturer: Cesaroni Technology - Designation: 1750K650-16A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_K650_1.rse - Manufacturer: Cesaroni Technology - Designation: 1750K650-16A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K660.eng - Manufacturer: Cesaroni Technology - Designation: 2437K660-17A - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_K660.rse - Manufacturer: Cesaroni Technology - Designation: 2437K660-17A - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_K661.eng - Manufacturer: Cesaroni Technology - Designation: 2430K661-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K661.rse - Manufacturer: Cesaroni Technology - Designation: 2430K661-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K675.eng - Manufacturer: Cesaroni Technology - Designation: 2010K675-18A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K675.rse - Manufacturer: Cesaroni Technology - Designation: 2010K675-18A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K711.rse - Manufacturer: Cesaroni Technology - Designation: 2377K711-18A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K735.eng - Manufacturer: Cesaroni Technology - Designation: 1955K735-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K735.rse - Manufacturer: Cesaroni Technology - Designation: 1955K735-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K740.eng - Manufacturer: Cesaroni Technology - Designation: 1874K740-18A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K740.rse - Manufacturer: Cesaroni Technology - Designation: 1874K740-18A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K750.rse - Manufacturer: Cesaroni Technology - Designation: 2352K750-18A - Data Format: RockSim - Data Source: mfr - Contributor: Craig Rutherford - -Cesaroni_K780.eng - Manufacturer: Cesaroni Technology - Designation: 2108K780-15A - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K780.rse - Manufacturer: Cesaroni Technology - Designation: 2108K780-15A - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_K815.eng - Manufacturer: Cesaroni Technology - Designation: 2304K815-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K815.rse - Manufacturer: Cesaroni Technology - Designation: 2304K815-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K820.eng - Manufacturer: Cesaroni Technology - Designation: 2383K820-17A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K820.rse - Manufacturer: Cesaroni Technology - Designation: 2383K820-17A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K940.eng - Manufacturer: Cesaroni Technology - Designation: 1633K940-18A - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_K940.rse - Manufacturer: Cesaroni Technology - Designation: 1633K940-18A - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1030.rse - Manufacturer: Cesaroni Technology - Designation: 2788L1030-P - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_L1050.eng - Manufacturer: Cesaroni Technology - Designation: 3727L1050-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L1050.rse - Manufacturer: Cesaroni Technology - Designation: 3727L1050-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L1090.eng - Manufacturer: Cesaroni Technology - Designation: 4815 L1090-P - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_L1090.rse - Manufacturer: Cesaroni Technology - Designation: 4815 L1090-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L1115.eng - Manufacturer: Cesaroni Technology - Designation: 5103L1115-P - Data Format: RASP - Data Source: mfr - Contributor: Len Lekx - -Cesaroni_L1115.rse - Manufacturer: Cesaroni Technology - Designation: 5103L1115-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L1115_1.eng - Manufacturer: Cesaroni Technology - Designation: 5103L1115-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_L1350.eng - Manufacturer: Cesaroni Technology - Designation: 4263L1350-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L1350.rse - Manufacturer: Cesaroni Technology - Designation: 4263L1350-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L1355.eng - Manufacturer: Cesaroni Technology - Designation: 4025L1355-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1355.rse - Manufacturer: Cesaroni Technology - Designation: 4025L1355-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1395.eng - Manufacturer: Cesaroni Technology - Designation: 4895L1395-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1395.rse - Manufacturer: Cesaroni Technology - Designation: 4895L1395-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1410.eng - Manufacturer: Cesaroni Technology - Designation: 4828L1410-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1410.rse - Manufacturer: Cesaroni Technology - Designation: 4828L1410-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1685.eng - Manufacturer: Cesaroni Technology - Designation: 5069L1685-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1685.rse - Manufacturer: Cesaroni Technology - Designation: 5069L1685-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L1720.rse - Manufacturer: Cesaroni Technology - Designation: 3659L1720-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L2375.rse - Manufacturer: Cesaroni Technology - Designation: 4878L2375-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L265.eng - Manufacturer: Cesaroni Technology - Designation: 2645L265-P - Data Format: RASP - Data Source: user - Contributor: Andrew Wimmer - -Cesaroni_L265.rse - Manufacturer: Cesaroni Technology - Designation: 2645L265-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L3150.rse - Manufacturer: Cesaroni Technology - Designation: 4807L3150-P - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_L3200.eng - Manufacturer: Cesaroni Technology - Designation: 3300L3200-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L3200.rse - Manufacturer: Cesaroni Technology - Designation: 3300L3200-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L395.eng - Manufacturer: Cesaroni Technology - Designation: 4937L395-P - Data Format: RASP - Data Source: user - Contributor: Mark Stumbaugh - -Cesaroni_L395.rse - Manufacturer: Cesaroni Technology - Designation: 4937L395-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L585.eng - Manufacturer: Cesaroni Technology - Designation: 2653L585-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L585.rse - Manufacturer: Cesaroni Technology - Designation: 2653L585-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L610.eng - Manufacturer: Cesaroni Technology - Designation: 4855L610-P - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_L610.rse - Manufacturer: Cesaroni Technology - Designation: 4855L610-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L640.eng - Manufacturer: Cesaroni Technology - Designation: 2772L640-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L640.rse - Manufacturer: Cesaroni Technology - Designation: 2772L640-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L645.eng - Manufacturer: Cesaroni Technology - Designation: 3419L645-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L645.rse - Manufacturer: Cesaroni Technology - Designation: 3419L645-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L730.eng - Manufacturer: Cesaroni Technology - Designation: 2765L730-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_L730.rse - Manufacturer: Cesaroni Technology - Designation: 2765L730-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L800.eng - Manufacturer: Cesaroni Technology - Designation: 3757L800-P - Data Format: RASP - Data Source: mfr - Contributor: Len Lekx - -Cesaroni_L800.rse - Manufacturer: Cesaroni Technology - Designation: 3757L800-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L800_1.eng - Manufacturer: Cesaroni Technology - Designation: 3757L800-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_L805.eng - Manufacturer: Cesaroni Technology - Designation: 2833L805-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L805.rse - Manufacturer: Cesaroni Technology - Designation: 2833L805-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L820.eng - Manufacturer: Cesaroni Technology - Designation: 2946L820-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L820.rse - Manufacturer: Cesaroni Technology - Designation: 2946L820-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L851.eng - Manufacturer: Cesaroni Technology - Designation: 3683L851-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L851.rse - Manufacturer: Cesaroni Technology - Designation: 3683L851-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L890.eng - Manufacturer: Cesaroni Technology - Designation: 3762 L890-P - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_L890.rse - Manufacturer: Cesaroni Technology - Designation: 3762 L890-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_L910.eng - Manufacturer: Cesaroni Technology - Designation: 2856L910-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L910.rse - Manufacturer: Cesaroni Technology - Designation: 2856L910-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L935.eng - Manufacturer: Cesaroni Technology - Designation: 3147L935-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L935.rse - Manufacturer: Cesaroni Technology - Designation: 3147L935-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_L990.eng - Manufacturer: Cesaroni Technology - Designation: 2771L990-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L990.rse - Manufacturer: Cesaroni Technology - Designation: 2771L990-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L995.eng - Manufacturer: Cesaroni Technology - Designation: 3618L995-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_L995.rse - Manufacturer: Cesaroni Technology - Designation: 3618L995-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1060.eng - Manufacturer: Cesaroni Technology - Designation: 7313M1060-P - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_M1060.rse - Manufacturer: Cesaroni Technology - Designation: 7313M1060-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_M1101.rse - Manufacturer: Cesaroni Technology - Designation: 5198M1101-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1160.eng - Manufacturer: Cesaroni Technology - Designation: 5880M1160-P - Data Format: RASP - Data Source: user - Contributor: Howard Smart - -Cesaroni_M1160.rse - Manufacturer: Cesaroni Technology - Designation: 5880M1160-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M1230.eng - Manufacturer: Cesaroni Technology - Designation: 5506M1230-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1230.rse - Manufacturer: Cesaroni Technology - Designation: 5506M1230-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1290.eng - Manufacturer: Cesaroni Technology - Designation: 7469M1290-P - Data Format: RASP - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_M1290.rse - Manufacturer: Cesaroni Technology - Designation: 7469M1290-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_M1300.eng - Manufacturer: Cesaroni Technology - Designation: 6438M1300-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1300.rse - Manufacturer: Cesaroni Technology - Designation: 6438M1300-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1400.eng - Manufacturer: Cesaroni Technology - Designation: 6248M1400-P - Data Format: RASP - Data Source: mfr - Contributor: Len Lekx - -Cesaroni_M1400.rse - Manufacturer: Cesaroni Technology - Designation: 6248M1400-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_M1400_1.eng - Manufacturer: Cesaroni Technology - Designation: 6248M1400-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_M1401.eng - Manufacturer: Cesaroni Technology - Designation: 6268M1401-P - Data Format: RASP - Data Source: user - Contributor: Howard Smart - -Cesaroni_M1450.eng - Manufacturer: Cesaroni Technology - Designation: 9955M1450-P - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_M1450.rse - Manufacturer: Cesaroni Technology - Designation: 9955M1450-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_M1520.eng - Manufacturer: Cesaroni Technology - Designation: 7579M1520-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1520.rse - Manufacturer: Cesaroni Technology - Designation: 7579M1520-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1540.eng - Manufacturer: Cesaroni Technology - Designation: 6819M1540-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1540.rse - Manufacturer: Cesaroni Technology - Designation: 6819M1540-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1545.eng - Manufacturer: Cesaroni Technology - Designation: 8187M1545-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1545.rse - Manufacturer: Cesaroni Technology - Designation: 8187M1545-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1560.eng - Manufacturer: Cesaroni Technology - Designation: 5342M1560-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1560.rse - Manufacturer: Cesaroni Technology - Designation: 5342M1560-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1590.eng - Manufacturer: Cesaroni Technology - Designation: 7545M1590-P - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M1590.rse - Manufacturer: Cesaroni Technology - Designation: 7545M1590-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M1670.eng - Manufacturer: Cesaroni Technology - Designation: 6026M1670-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1670.rse - Manufacturer: Cesaroni Technology - Designation: 6026M1670-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1675.eng - Manufacturer: Cesaroni Technology - Designation: 6162M1675-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1675.rse - Manufacturer: Cesaroni Technology - Designation: 6162M1675-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1770.rse - Manufacturer: Cesaroni Technology - Designation: 5933M1770-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M1770_1.rse - Manufacturer: Cesaroni Technology - Designation: 5933M1770-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M1790.eng - Manufacturer: Cesaroni Technology - Designation: 8088M1790-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1790.rse - Manufacturer: Cesaroni Technology - Designation: 8088M1790-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1800.eng - Manufacturer: Cesaroni Technology - Designation: 9870M1800-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1800.rse - Manufacturer: Cesaroni Technology - Designation: 9870M1800-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M1810.eng - Manufacturer: Cesaroni Technology - Designation: 6128M1810-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1810.rse - Manufacturer: Cesaroni Technology - Designation: 6128M1810-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M1830.eng - Manufacturer: Cesaroni Technology - Designation: 5604M1830-P - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -Cesaroni_M1830.rse - Manufacturer: Cesaroni Technology - Designation: 5604M1830-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M1890.rse - Manufacturer: Cesaroni Technology - Designation: 9876M1890-P - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_M2020.eng - Manufacturer: Cesaroni Technology - Designation: 8429M2020-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M2020.rse - Manufacturer: Cesaroni Technology - Designation: 8429M2020-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M2045.eng - Manufacturer: Cesaroni Technology - Designation: 7388M2045-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2045.rse - Manufacturer: Cesaroni Technology - Designation: 7388M2045-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2075.eng - Manufacturer: Cesaroni Technology - Designation: 6287M2075-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2075.rse - Manufacturer: Cesaroni Technology - Designation: 6287M2075-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2080.eng - Manufacturer: Cesaroni Technology - Designation: 6827M2080-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M2080.rse - Manufacturer: Cesaroni Technology - Designation: 6827M2080-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_M2150.eng - Manufacturer: Cesaroni Technology - Designation: 7455M2150-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2150.rse - Manufacturer: Cesaroni Technology - Designation: 7455M2150-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2245.eng - Manufacturer: Cesaroni Technology - Designation: 9977M2245-P - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M2245.rse - Manufacturer: Cesaroni Technology - Designation: 9977M2245-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_M2250.eng - Manufacturer: Cesaroni Technology - Designation: 5472M2250-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2250.rse - Manufacturer: Cesaroni Technology - Designation: 5472M2250-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M2505.eng - Manufacturer: Cesaroni Technology - Designation: 7450M2505-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_M2505.rse - Manufacturer: Cesaroni Technology - Designation: 7450M2505-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_M3100.eng - Manufacturer: Cesaroni Technology - Designation: 6118M3100-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M3100.rse - Manufacturer: Cesaroni Technology - Designation: 6118M3100-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M3400.eng - Manufacturer: Cesaroni Technology - Designation: 9994M3400-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M3400.rse - Manufacturer: Cesaroni Technology - Designation: 9994M3400-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M3700.eng - Manufacturer: Cesaroni Technology - Designation: 6800M3700-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M3700.rse - Manufacturer: Cesaroni Technology - Designation: 6800M3700-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M4770.rse - Manufacturer: Cesaroni Technology - Designation: 7312M4770-P - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_M520.eng - Manufacturer: Cesaroni Technology - Designation: 7441M520-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_M520.rse - Manufacturer: Cesaroni Technology - Designation: 7441M520-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_M6400.eng - Manufacturer: Cesaroni Technology - Designation: 8634M6400-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M6400.rse - Manufacturer: Cesaroni Technology - Designation: 8634M6400-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M795.eng - Manufacturer: Cesaroni Technology - Designation: 10133M795-P - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_M795.rse - Manufacturer: Cesaroni Technology - Designation: 10133M795-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_M840.eng - Manufacturer: Cesaroni Technology - Designation: 7521M840-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_M840.rse - Manufacturer: Cesaroni Technology - Designation: 7521M840-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N10000.eng - Manufacturer: Cesaroni Technology - Designation: 10347N10000-P - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_N10000.rse - Manufacturer: Cesaroni Technology - Designation: 10347N10000-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_N1100.eng - Manufacturer: Cesaroni Technology - Designation: 14046N1100-P - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Cesaroni_N1100.rse - Manufacturer: Cesaroni Technology - Designation: 14046N1100-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_N1560.rse - Manufacturer: Cesaroni Technology - Designation: 16803N1560-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N1800.eng - Manufacturer: Cesaroni Technology - Designation: 10367N1800-P - Data Format: RASP - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_N1800.rse - Manufacturer: Cesaroni Technology - Designation: 10367N1800-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_N1975.eng - Manufacturer: Cesaroni Technology - Designation: 14272N1975-P - Data Format: RASP - Data Source: user - Contributor: Andre Choquette - -Cesaroni_N1975.rse - Manufacturer: Cesaroni Technology - Designation: 14272N1975-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_N2200.eng - Manufacturer: Cesaroni Technology - Designation: 12066N2200-P - Data Format: RASP - Data Source: user - Contributor: Greg Gardner - -Cesaroni_N2200.rse - Manufacturer: Cesaroni Technology - Designation: 12066N2200-P - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_N2500.eng - Manufacturer: Cesaroni Technology - Designation: 13767N2500-P - Data Format: RASP - Data Source: mfr - Contributor: Casey Hatch - -Cesaroni_N2500.rse - Manufacturer: Cesaroni Technology - Designation: 13767N2500-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_N2501.eng - Manufacturer: Cesaroni Technology - Designation: 15227N2501-P - Data Format: RASP - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_N2501.rse - Manufacturer: Cesaroni Technology - Designation: 15227N2501-P - Data Format: RockSim - Data Source: mfr - Contributor: Andre Choquette - -Cesaroni_N2540.eng - Manufacturer: Cesaroni Technology - Designation: 17907N2540-P - Data Format: RASP - Data Source: user - Contributor: Howard Smart - -Cesaroni_N2540.rse - Manufacturer: Cesaroni Technology - Designation: 17907N2540-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N2600.eng - Manufacturer: Cesaroni Technology - Designation: 11077N2600-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N2600.rse - Manufacturer: Cesaroni Technology - Designation: 11077N2600-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N2850.eng - Manufacturer: Cesaroni Technology - Designation: 13767N2850-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N2850.rse - Manufacturer: Cesaroni Technology - Designation: 13767N2850-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N2900.eng - Manufacturer: Cesaroni Technology - Designation: 17613N2900-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N2900.rse - Manufacturer: Cesaroni Technology - Designation: 17613N2900-P - Data Format: RockSim - Data Source: user - Contributor: Andre Choquette - -Cesaroni_N3180.rse - Manufacturer: Cesaroni Technology - Designation: 14200N3180-P - Data Format: RockSim - Data Source: mfr - Contributor: Thomas Raithby - -Cesaroni_N3301.eng - Manufacturer: Cesaroni Technology - Designation: 19318N3301-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N3301.rse - Manufacturer: Cesaroni Technology - Designation: 19318N3301-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N3400.eng - Manufacturer: Cesaroni Technology - Designation: 14263N3400-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N3400.rse - Manufacturer: Cesaroni Technology - Designation: 14263N3400-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N3800.eng - Manufacturer: Cesaroni Technology - Designation: 17632N3800-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N3800.rse - Manufacturer: Cesaroni Technology - Designation: 17632N3800-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N4100.eng - Manufacturer: Cesaroni Technology - Designation: 17790N4100-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N4100.rse - Manufacturer: Cesaroni Technology - Designation: 17790N4100-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N5600.eng - Manufacturer: Cesaroni Technology - Designation: 13628N5600-P - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Cesaroni_N5600.rse - Manufacturer: Cesaroni Technology - Designation: 13628N5600-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N5800.eng - Manufacturer: Cesaroni Technology - Designation: 20146N5800-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_N5800.rse - Manufacturer: Cesaroni Technology - Designation: 20146N5800-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_O25000.eng - Manufacturer: Cesaroni Technology - Designation: 30795O25000-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_O25000.rse - Manufacturer: Cesaroni Technology - Designation: 30795O25000-P - Data Format: RockSim - Data Source: user - Contributor: Andre Choquette - -Cesaroni_O3400.eng - Manufacturer: Cesaroni Technology - Designation: 21062O3400-P - Data Format: RASP - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_O3400.rse - Manufacturer: Cesaroni Technology - Designation: 21062O3400-P - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -Cesaroni_O3700.eng - Manufacturer: Cesaroni Technology - Designation: 29920O3700-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_O3700.rse - Manufacturer: Cesaroni Technology - Designation: 29920O3700-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_O4900.eng - Manufacturer: Cesaroni Technology - Designation: 37148O4900-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_O4900.rse - Manufacturer: Cesaroni Technology - Designation: 37148O4900-P - Data Format: RockSim - Data Source: cert - Contributor: Len Bryan - -Cesaroni_O5100.eng - Manufacturer: Cesaroni Technology - Designation: 29990 O5100-P - Data Format: RASP - Data Source: user - Contributor: John Coker - -Cesaroni_O5100.rse - Manufacturer: Cesaroni Technology - Designation: 29990 O5100-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_O5800.eng - Manufacturer: Cesaroni Technology - Designation: 30600O5800-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_O5800.rse - Manufacturer: Cesaroni Technology - Designation: 30600O5800-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Cesaroni_O8000.eng - Manufacturer: Cesaroni Technology - Designation: 4096O8000-P - Data Format: RASP - Data Source: cert - Contributor: Len Bryan - -Cesaroni_O8000.rse - Manufacturer: Cesaroni Technology - Designation: 4096O8000-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_G100.eng - Manufacturer: Contrail Rockets - Designation: G100-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_G100.rse - Manufacturer: Contrail Rockets - Designation: G100-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_G123.eng - Manufacturer: Contrail Rockets - Designation: G123-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_G123.rse - Manufacturer: Contrail Rockets - Designation: G123-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_G130.eng - Manufacturer: Contrail Rockets - Designation: G130-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_G130.rse - Manufacturer: Contrail Rockets - Designation: G130-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_G234.eng - Manufacturer: Contrail Rockets - Designation: G234-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_G234.rse - Manufacturer: Contrail Rockets - Designation: G234-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_G300.eng - Manufacturer: Contrail Rockets - Designation: G300-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_G300.rse - Manufacturer: Contrail Rockets - Designation: G300-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H121.eng - Manufacturer: Contrail Rockets - Designation: H121-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H121.rse - Manufacturer: Contrail Rockets - Designation: H121-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H141.eng - Manufacturer: Contrail Rockets - Designation: H141-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H141.rse - Manufacturer: Contrail Rockets - Designation: H141-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H211.eng - Manufacturer: Contrail Rockets - Designation: H211-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H211.rse - Manufacturer: Contrail Rockets - Designation: H211-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H222.eng - Manufacturer: Contrail Rockets - Designation: H222-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H222.rse - Manufacturer: Contrail Rockets - Designation: H222-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H246.eng - Manufacturer: Contrail Rockets - Designation: H246-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H246.rse - Manufacturer: Contrail Rockets - Designation: H246-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H248.rse - Manufacturer: Contrail Rockets - Designation: H248-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H277.eng - Manufacturer: Contrail Rockets - Designation: H277-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H277.rse - Manufacturer: Contrail Rockets - Designation: H277-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H300.eng - Manufacturer: Contrail Rockets - Designation: H300-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H300.rse - Manufacturer: Contrail Rockets - Designation: H300-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H303.eng - Manufacturer: Contrail Rockets - Designation: H303-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H303.rse - Manufacturer: Contrail Rockets - Designation: H303-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_H340.eng - Manufacturer: Contrail Rockets - Designation: H340-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_H340.rse - Manufacturer: Contrail Rockets - Designation: H340-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I155.eng - Manufacturer: Contrail Rockets - Designation: I155-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I155.rse - Manufacturer: Contrail Rockets - Designation: I155-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I210.eng - Manufacturer: Contrail Rockets - Designation: I210-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I210.rse - Manufacturer: Contrail Rockets - Designation: I210-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I221.eng - Manufacturer: Contrail Rockets - Designation: I221-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I221.rse - Manufacturer: Contrail Rockets - Designation: I221-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I250.rse - Manufacturer: Contrail Rockets - Designation: I250-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I290.eng - Manufacturer: Contrail Rockets - Designation: I290-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I290.rse - Manufacturer: Contrail Rockets - Designation: I290-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I307.eng - Manufacturer: Contrail Rockets - Designation: I307-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I307.rse - Manufacturer: Contrail Rockets - Designation: I307-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I333.eng - Manufacturer: Contrail Rockets - Designation: I333-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I333.rse - Manufacturer: Contrail Rockets - Designation: I333-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I400.eng - Manufacturer: Contrail Rockets - Designation: I400-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I400.rse - Manufacturer: Contrail Rockets - Designation: I400-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I500.eng - Manufacturer: Contrail Rockets - Designation: I500-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I500.rse - Manufacturer: Contrail Rockets - Designation: I500-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I727.eng - Manufacturer: Contrail Rockets - Designation: I727-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I727.rse - Manufacturer: Contrail Rockets - Designation: I727-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_I747.eng - Manufacturer: Contrail Rockets - Designation: I747-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_I747.rse - Manufacturer: Contrail Rockets - Designation: I747-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J150.eng - Manufacturer: Contrail Rockets - Designation: J150-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J150.rse - Manufacturer: Contrail Rockets - Designation: J150-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J222.eng - Manufacturer: Contrail Rockets - Designation: J222-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J222.rse - Manufacturer: Contrail Rockets - Designation: J222-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J234.eng - Manufacturer: Contrail Rockets - Designation: J234-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J234.rse - Manufacturer: Contrail Rockets - Designation: J234-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J242.eng - Manufacturer: Contrail Rockets - Designation: J242-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J242.rse - Manufacturer: Contrail Rockets - Designation: J242-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J245.eng - Manufacturer: Contrail Rockets - Designation: J245-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J245.rse - Manufacturer: Contrail Rockets - Designation: J245-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J246.eng - Manufacturer: Contrail Rockets - Designation: J246-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J246.rse - Manufacturer: Contrail Rockets - Designation: J246-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J272.eng - Manufacturer: Contrail Rockets - Designation: J272-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J272.rse - Manufacturer: Contrail Rockets - Designation: J272-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J292.eng - Manufacturer: Contrail Rockets - Designation: J292-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J292.rse - Manufacturer: Contrail Rockets - Designation: J292-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J333.eng - Manufacturer: Contrail Rockets - Designation: J333-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J333.rse - Manufacturer: Contrail Rockets - Designation: J333-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J345.eng - Manufacturer: Contrail Rockets - Designation: J345-PVC - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J345.rse - Manufacturer: Contrail Rockets - Designation: J345-PVC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J355.eng - Manufacturer: Contrail Rockets - Designation: J355-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J355.rse - Manufacturer: Contrail Rockets - Designation: J355-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J358.eng - Manufacturer: Contrail Rockets - Designation: J358-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J358.rse - Manufacturer: Contrail Rockets - Designation: J358-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J416.eng - Manufacturer: Contrail Rockets - Designation: J416-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J416.rse - Manufacturer: Contrail Rockets - Designation: J416-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J555.eng - Manufacturer: Contrail Rockets - Designation: J555-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J555.rse - Manufacturer: Contrail Rockets - Designation: J555-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J642.eng - Manufacturer: Contrail Rockets - Designation: J642-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J642.rse - Manufacturer: Contrail Rockets - Designation: J642-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_J800.eng - Manufacturer: Contrail Rockets - Designation: J800-HP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_J800.rse - Manufacturer: Contrail Rockets - Designation: J800-HP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K234.eng - Manufacturer: Contrail Rockets - Designation: K234-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K234.rse - Manufacturer: Contrail Rockets - Designation: K234-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K265.eng - Manufacturer: Contrail Rockets - Designation: K265-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K265.rse - Manufacturer: Contrail Rockets - Designation: K265-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K300.eng - Manufacturer: Contrail Rockets - Designation: K300-BS - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K300.rse - Manufacturer: Contrail Rockets - Designation: K300-BS - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K321.eng - Manufacturer: Contrail Rockets - Designation: K321-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K321.rse - Manufacturer: Contrail Rockets - Designation: K321-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K404.eng - Manufacturer: Contrail Rockets - Designation: K404-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K404.rse - Manufacturer: Contrail Rockets - Designation: K404-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K456.eng - Manufacturer: Contrail Rockets - Designation: K456-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K456.rse - Manufacturer: Contrail Rockets - Designation: K456-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K543.rse - Manufacturer: Contrail Rockets - Designation: K543-BS - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K555.rse - Manufacturer: Contrail Rockets - Designation: K555-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K630.eng - Manufacturer: Contrail Rockets - Designation: K630-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K630.rse - Manufacturer: Contrail Rockets - Designation: K630-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K678.eng - Manufacturer: Contrail Rockets - Designation: K678-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K678.rse - Manufacturer: Contrail Rockets - Designation: K678-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K707.eng - Manufacturer: Contrail Rockets - Designation: K707-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K707.rse - Manufacturer: Contrail Rockets - Designation: K707-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K777.eng - Manufacturer: Contrail Rockets - Designation: K777-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_K777.rse - Manufacturer: Contrail Rockets - Designation: K777-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_K888.rse - Manufacturer: Contrail Rockets - Designation: K888-BM - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_L1222.eng - Manufacturer: Contrail Rockets - Designation: L1222-SM - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_L1222.rse - Manufacturer: Contrail Rockets - Designation: L1222-SM - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_L1428.rse - Manufacturer: Contrail Rockets - Designation: L1428-SF - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_L2525.eng - Manufacturer: Contrail Rockets - Designation: L2525-GF - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_L2525.rse - Manufacturer: Contrail Rockets - Designation: L2525-GF - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_L369.eng - Manufacturer: Contrail Rockets - Designation: L369-SP - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_L369.rse - Manufacturer: Contrail Rockets - Designation: L369-SP - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_L800.eng - Manufacturer: Contrail Rockets - Designation: L800-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_L800.rse - Manufacturer: Contrail Rockets - Designation: L800-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_M1491.rse - Manufacturer: Contrail Rockets - Designation: M1491-BM - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_M1575.eng - Manufacturer: Contrail Rockets - Designation: M1575-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_M1575.rse - Manufacturer: Contrail Rockets - Designation: M1575-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_M2281.rse - Manufacturer: Contrail Rockets - Designation: M2281-BF - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_M2700.eng - Manufacturer: Contrail Rockets - Designation: M2700-BS - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_M2700.rse - Manufacturer: Contrail Rockets - Designation: M2700-BS - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_M2800.eng - Manufacturer: Contrail Rockets - Designation: M2800-BG - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_M2800.rse - Manufacturer: Contrail Rockets - Designation: M2800-BG - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_M711.eng - Manufacturer: Contrail Rockets - Designation: M711-BS - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_M711.rse - Manufacturer: Contrail Rockets - Designation: M711-BS - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Contrail_O6300.eng - Manufacturer: Contrail Rockets - Designation: O6300-BS - Data Format: RASP - Data Source: user - Contributor: John Coker - -Contrail_O6300.rse - Manufacturer: Contrail Rockets - Designation: O6300-BS - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_E12.eng - Manufacturer: Ellis Mountain - Designation: E12 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_F23.eng - Manufacturer: Ellis Mountain - Designation: F23 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_G20.eng - Manufacturer: Ellis Mountain - Designation: G20 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_G20.rse - Manufacturer: Ellis Mountain - Designation: G20 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_G35.eng - Manufacturer: Ellis Mountain - Designation: G35 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_G35.rse - Manufacturer: Ellis Mountain - Designation: G35 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_G37.eng - Manufacturer: Ellis Mountain - Designation: G37 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_G37.rse - Manufacturer: Ellis Mountain - Designation: G37 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_H275.eng - Manufacturer: Ellis Mountain - Designation: H275 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_H275.rse - Manufacturer: Ellis Mountain - Designation: H275 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_H48.eng - Manufacturer: Ellis Mountain - Designation: H48 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_H48.rse - Manufacturer: Ellis Mountain - Designation: H48 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_H50.eng - Manufacturer: Ellis Mountain - Designation: H50 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_H50.rse - Manufacturer: Ellis Mountain - Designation: H50 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_I130.eng - Manufacturer: Ellis Mountain - Designation: I130 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_I130.rse - Manufacturer: Ellis Mountain - Designation: I130 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_I134.eng - Manufacturer: Ellis Mountain - Designation: I134 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_I134.rse - Manufacturer: Ellis Mountain - Designation: I134 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_I150.eng - Manufacturer: Ellis Mountain - Designation: I150 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_I150.rse - Manufacturer: Ellis Mountain - Designation: I150 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_I160.eng - Manufacturer: Ellis Mountain - Designation: I160 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_I160.rse - Manufacturer: Ellis Mountain - Designation: I160 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_I230.eng - Manufacturer: Ellis Mountain - Designation: I230 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_I230.rse - Manufacturer: Ellis Mountain - Designation: I230 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_I69.eng - Manufacturer: Ellis Mountain - Designation: I69 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_I69.rse - Manufacturer: Ellis Mountain - Designation: I69 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_J110.eng - Manufacturer: Ellis Mountain - Designation: J110 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_J110.rse - Manufacturer: Ellis Mountain - Designation: J110 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_J148.eng - Manufacturer: Ellis Mountain - Designation: J148 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_J148.rse - Manufacturer: Ellis Mountain - Designation: J148 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_J228.eng - Manufacturer: Ellis Mountain - Designation: J228 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_J228.rse - Manufacturer: Ellis Mountain - Designation: J228 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_J270.eng - Manufacturer: Ellis Mountain - Designation: J270 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_J270.rse - Manufacturer: Ellis Mountain - Designation: J270 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_J330.eng - Manufacturer: Ellis Mountain - Designation: J330 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_J330.rse - Manufacturer: Ellis Mountain - Designation: J330 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_K475.eng - Manufacturer: Ellis Mountain - Designation: K475 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Ellis_K475.rse - Manufacturer: Ellis Mountain - Designation: K475 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_L330.eng - Manufacturer: Ellis Mountain - Designation: L330 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_L330.rse - Manufacturer: Ellis Mountain - Designation: L330 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_L600.eng - Manufacturer: Ellis Mountain - Designation: L600 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_L600.rse - Manufacturer: Ellis Mountain - Designation: L600 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Ellis_M1000.eng - Manufacturer: Ellis Mountain - Designation: M1000 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Ellis_M1000.rse - Manufacturer: Ellis Mountain - Designation: M1000 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_1_2A3.eng - Manufacturer: Estes Industries - Designation: 1/2A3 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_1_2A3.rse - Manufacturer: Estes Industries - Designation: 1/2A3 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_1_2A6.eng - Manufacturer: Estes Industries - Designation: 1/2A6 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_1_2A6.rse - Manufacturer: Estes Industries - Designation: 1/2A6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_1_4A3.eng - Manufacturer: Estes Industries - Designation: 1/4A3 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_1_4A3.rse - Manufacturer: Estes Industries - Designation: 1/4A3 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_A10.eng - Manufacturer: Estes Industries - Designation: A10 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_A10.rse - Manufacturer: Estes Industries - Designation: A10 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_A3.eng - Manufacturer: Estes Industries - Designation: A3 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_A3.rse - Manufacturer: Estes Industries - Designation: A3 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_A8.eng - Manufacturer: Estes Industries - Designation: A8 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Estes_A8.rse - Manufacturer: Estes Industries - Designation: A8 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_B4.eng - Manufacturer: Estes Industries - Designation: B4 - Data Format: RASP - Data Source: user - Contributor: Nicholas Domansky - -Estes_B4.rse - Manufacturer: Estes Industries - Designation: B4 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_B4_1.eng - Manufacturer: Estes Industries - Designation: B4 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_B6.eng - Manufacturer: Estes Industries - Designation: B6 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Estes_B6.rse - Manufacturer: Estes Industries - Designation: B6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_C11.eng - Manufacturer: Estes Industries - Designation: C11 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_C11.rse - Manufacturer: Estes Industries - Designation: C11 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_C5.eng - Manufacturer: Estes Industries - Designation: C5 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_C5.rse - Manufacturer: Estes Industries - Designation: C5 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_C6.eng - Manufacturer: Estes Industries - Designation: C6 - Data Format: RASP - Data Source: user - Contributor: Nicholas Domansky - -Estes_C6.rse - Manufacturer: Estes Industries - Designation: C6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_C6_1.eng - Manufacturer: Estes Industries - Designation: C6 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_D11.eng - Manufacturer: Estes Industries - Designation: D11 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_D11.rse - Manufacturer: Estes Industries - Designation: D11 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_D12.eng - Manufacturer: Estes Industries - Designation: D12 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Estes_D12.rse - Manufacturer: Estes Industries - Designation: D12 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_E12.eng - Manufacturer: Estes Industries - Designation: E12 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Estes_E16.eng - Manufacturer: Estes Industries - Designation: E16 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Estes_E30.eng - Manufacturer: Estes Industries - Designation: E30 - Data Format: RASP - Data Source: cert - Contributor: David Moore - -Estes_E9.eng - Manufacturer: Estes Industries - Designation: E9 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Estes_E9.rse - Manufacturer: Estes Industries - Designation: E9 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Estes_F15.eng - Manufacturer: Estes Industries - Designation: F15 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Estes_F15_1.eng - Manufacturer: Estes Industries - Designation: F15 - Data Format: RASP - Data Source: cert - Contributor: Howard Smart - -Estes_F50.eng - Manufacturer: Estes Industries - Designation: F50 - Data Format: RASP - Data Source: cert - Contributor: David Moore - -Estes_G40.eng - Manufacturer: Estes Industries - Designation: G40 - Data Format: RASP - Data Source: cert - Contributor: David Moore - -Estes_G40_1.eng - Manufacturer: Estes Industries - Designation: G40 - Data Format: RASP - Data Source: cert - Contributor: David Moore - -GR_H186.eng - Manufacturer: Gorilla Rocket Motors - Designation: H186RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_H225.rse - Manufacturer: Gorilla Rocket Motors - Designation: H225BL - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_I223.eng - Manufacturer: Gorilla Rocket Motors - Designation: I223GT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_I324.eng - Manufacturer: Gorilla Rocket Motors - Designation: I324RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_I389.eng - Manufacturer: Gorilla Rocket Motors - Designation: I389GT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_J167.rse - Manufacturer: Gorilla Rocket Motors - Designation: J167WC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_J365.rse - Manufacturer: Gorilla Rocket Motors - Designation: J365BL - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_J395.eng - Manufacturer: Gorilla Rocket Motors - Designation: J395RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_J450.rse - Manufacturer: Gorilla Rocket Motors - Designation: J450BL - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_J465.rse - Manufacturer: Gorilla Rocket Motors - Designation: J465GT - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_J485.rse - Manufacturer: Gorilla Rocket Motors - Designation: J485WC - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_K1075.rse - Manufacturer: Gorilla Rocket Motors - Designation: K1075RT - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_K1185.eng - Manufacturer: Gorilla Rocket Motors - Designation: K1185GT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_K222.rse - Manufacturer: Gorilla Rocket Motors - Designation: K222WC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_K327.rse - Manufacturer: Gorilla Rocket Motors - Designation: K327WC - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_K470.rse - Manufacturer: Gorilla Rocket Motors - Designation: K470WC - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_K520.eng - Manufacturer: Gorilla Rocket Motors - Designation: K520RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_K533.rse - Manufacturer: Gorilla Rocket Motors - Designation: K533BL - Data Format: RockSim - Data Source: user - Contributor: John Coker - -GR_K555.eng - Manufacturer: Gorilla Rocket Motors - Designation: K555GT - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -GR_K630.rse - Manufacturer: Gorilla Rocket Motors - Designation: K630WC - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_K700.eng - Manufacturer: Gorilla Rocket Motors - Designation: K700RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_K763.rse - Manufacturer: Gorilla Rocket Motors - Designation: K763GT - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_K805.rse - Manufacturer: Gorilla Rocket Motors - Designation: K805WC - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_K980.rse - Manufacturer: Gorilla Rocket Motors - Designation: K980BL - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_L1065.eng - Manufacturer: Gorilla Rocket Motors - Designation: L1065BL - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_L1112.eng - Manufacturer: Gorilla Rocket Motors - Designation: L1112BT - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -GR_L1150.rse - Manufacturer: Gorilla Rocket Motors - Designation: L1150WC - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_L425.rse - Manufacturer: Gorilla Rocket Motors - Designation: L425WC - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_L695.rse - Manufacturer: Gorilla Rocket Motors - Designation: L695BL - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_L789.eng - Manufacturer: Gorilla Rocket Motors - Designation: L789RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_L985.eng - Manufacturer: Gorilla Rocket Motors - Designation: L985GT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_M1025.rse - Manufacturer: Gorilla Rocket Motors - Designation: M1025WC - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -GR_M1355.eng - Manufacturer: Gorilla Rocket Motors - Designation: M1355RT - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_M1465.rse - Manufacturer: Gorilla Rocket Motors - Designation: M1465BL - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -GR_M1610.rse - Manufacturer: Gorilla Rocket Motors - Designation: M1610BL - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -GR_M1665.eng - Manufacturer: Gorilla Rocket Motors - Designation: M1665WC - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -GR_M1952.eng - Manufacturer: Gorilla Rocket Motors - Designation: M1952BT - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -GR_O2700.eng - Manufacturer: Gorilla Rocket Motors - Designation: O2700BL - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Hypertek_I130.eng - Manufacturer: Hypertek - Designation: 300CC098J - I130 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I136.eng - Manufacturer: Hypertek - Designation: 300CC098J2 - I136 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I145.eng - Manufacturer: Hypertek - Designation: 300CC098JFX - I145FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I205.eng - Manufacturer: Hypertek - Designation: 300CC125J - I205 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I222.eng - Manufacturer: Hypertek - Designation: 300CC125J2 - I222 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I225.eng - Manufacturer: Hypertek - Designation: 300CC125JFX - I225FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I260.eng - Manufacturer: Hypertek - Designation: 440CC172J - I260 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_I310.eng - Manufacturer: Hypertek - Designation: 440CC172J - I310 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J115.eng - Manufacturer: Hypertek - Designation: 440CC076J - J115 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J120.eng - Manufacturer: Hypertek - Designation: 440CC076JFX - J120FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J150.eng - Manufacturer: Hypertek - Designation: 440CC086J - J150 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J170.eng - Manufacturer: Hypertek - Designation: 440CC098J - J170 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J190.eng - Manufacturer: Hypertek - Designation: 440CC098JFX - J190FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J220.eng - Manufacturer: Hypertek - Designation: 440CC110J - J220 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J250.eng - Manufacturer: Hypertek - Designation: 440CC125J - J250 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J250_1.eng - Manufacturer: Hypertek - Designation: 440CC125J - J250 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J270.eng - Manufacturer: Hypertek - Designation: 440CC125JFX - J270FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J295.eng - Manufacturer: Hypertek - Designation: 440CC172JFX - J295FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_J317.eng - Manufacturer: Hypertek - Designation: 835CC172J - J317 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J330.eng - Manufacturer: Hypertek - Designation: 835CC172JFX - J330FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_J330_1.eng - Manufacturer: Hypertek - Designation: 835CC172JFX - J330FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_K240.eng - Manufacturer: Hypertek - Designation: 835CC125J - K240 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L200.eng - Manufacturer: Hypertek - Designation: 1685CC098L - L200 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L225.eng - Manufacturer: Hypertek - Designation: 1685CC098LFX - L225FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L350.eng - Manufacturer: Hypertek - Designation: 1685CC125L - L350 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L355.eng - Manufacturer: Hypertek - Designation: 1685CC125LFX - L355FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L475.eng - Manufacturer: Hypertek - Designation: 1685CC172L - L475 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L535.eng - Manufacturer: Hypertek - Designation: 1685CC172LFX - L535FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L540.eng - Manufacturer: Hypertek - Designation: 2800CC172L - L540 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L540_1.eng - Manufacturer: Hypertek - Designation: 2800CC172L - L540 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L550.eng - Manufacturer: Hypertek - Designation: 1685CCRGL - L550 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L570.eng - Manufacturer: Hypertek - Designation: 2800CC172LFX - L570FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L570_1.eng - Manufacturer: Hypertek - Designation: 2800CC172LFX - L570FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L575.eng - Manufacturer: Hypertek - Designation: 2800CCRGL - L575 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L575_1.eng - Manufacturer: Hypertek - Designation: 2800CCRGL - L575 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L610.eng - Manufacturer: Hypertek - Designation: 1685CCRGLFX - L610FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L625.eng - Manufacturer: Hypertek - Designation: 2800CCRGLFX - L625FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L625_1.eng - Manufacturer: Hypertek - Designation: 2800CCRGLFX - L625FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_L740.eng - Manufacturer: Hypertek - Designation: 2800CC200MFX - L740FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_L970.eng - Manufacturer: Hypertek - Designation: 2800CC300M - L970 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_M1000.eng - Manufacturer: Hypertek - Designation: 4630CCRGM - M1000 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_M1000_1.eng - Manufacturer: Hypertek - Designation: 4630CCRGM - M1000 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_M1001.eng - Manufacturer: Hypertek - Designation: 5478CCRGM - M1001 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_M1010.eng - Manufacturer: Hypertek - Designation: 4630CCRGMFX - M1010FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_M1010_1.eng - Manufacturer: Hypertek - Designation: 4630CCRGMFX - M1010FX - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Hypertek_M1015.eng - Manufacturer: Hypertek - Designation: 3500CCRGMFX - M1015FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_M1040.eng - Manufacturer: Hypertek - Designation: 4630CCRGMFX - M1040FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_M740.eng - Manufacturer: Hypertek - Designation: 2800CC200M - M740 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_M956.eng - Manufacturer: Hypertek - Designation: 3500CCRGM - M956 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Hypertek_M960.eng - Manufacturer: Hypertek - Designation: 2800CC300MFX - M960FX - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_G135.rse - Manufacturer: Kosdon by AeroTech - Designation: G135R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_G82.rse - Manufacturer: Kosdon by AeroTech - Designation: G82W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_H130.rse - Manufacturer: Kosdon by AeroTech - Designation: H130W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_H225.rse - Manufacturer: Kosdon by AeroTech - Designation: H225R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I170.eng - Manufacturer: Kosdon by AeroTech - Designation: I170S - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_I170.rse - Manufacturer: Kosdon by AeroTech - Designation: I170S - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I280.eng - Manufacturer: Kosdon by AeroTech - Designation: I280F - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_I280.rse - Manufacturer: Kosdon by AeroTech - Designation: I280F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I301.eng - Manufacturer: Kosdon by AeroTech - Designation: I301W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -KBA_I301.rse - Manufacturer: Kosdon by AeroTech - Designation: I301W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I310.eng - Manufacturer: Kosdon by AeroTech - Designation: I310S - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_I310.rse - Manufacturer: Kosdon by AeroTech - Designation: I310S - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I370.eng - Manufacturer: Kosdon by AeroTech - Designation: I370F - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_I370.rse - Manufacturer: Kosdon by AeroTech - Designation: I370F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I450.eng - Manufacturer: Kosdon by AeroTech - Designation: I450F - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_I450.rse - Manufacturer: Kosdon by AeroTech - Designation: I450F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_I550.eng - Manufacturer: Kosdon by AeroTech - Designation: I550R - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -KBA_I550.rse - Manufacturer: Kosdon by AeroTech - Designation: I550R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_J405.eng - Manufacturer: Kosdon by AeroTech - Designation: J405S - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_J405.rse - Manufacturer: Kosdon by AeroTech - Designation: J405S - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_J520.rse - Manufacturer: Kosdon by AeroTech - Designation: J520F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_J605.eng - Manufacturer: Kosdon by AeroTech - Designation: J605F - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_J605.rse - Manufacturer: Kosdon by AeroTech - Designation: J605F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_J740.rse - Manufacturer: Kosdon by AeroTech - Designation: J740G - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_K1750.eng - Manufacturer: Kosdon by AeroTech - Designation: K1750R - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -KBA_K1750.rse - Manufacturer: Kosdon by AeroTech - Designation: K1750R - Data Format: RockSim - Data Source: mfr - Contributor: Victor Merle Barlow - -KBA_K400.eng - Manufacturer: Kosdon by AeroTech - Designation: K400S - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_K400.rse - Manufacturer: Kosdon by AeroTech - Designation: K400S - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_K600.eng - Manufacturer: Kosdon by AeroTech - Designation: K600F - Data Format: RASP - Data Source: cert - Contributor: John Coker - -KBA_K700.rse - Manufacturer: Kosdon by AeroTech - Designation: K700F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_K750.eng - Manufacturer: Kosdon by AeroTech - Designation: K750W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -KBA_K750.rse - Manufacturer: Kosdon by AeroTech - Designation: K750W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_L1000.eng - Manufacturer: Kosdon by AeroTech - Designation: L1000S - Data Format: RASP - Data Source: cert - Contributor: John Coker - -KBA_L1000.rse - Manufacturer: Kosdon by AeroTech - Designation: L1000S - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_L1400.eng - Manufacturer: Kosdon by AeroTech - Designation: L1400F - Data Format: RASP - Data Source: user - Contributor: John Coker - -KBA_L1400.rse - Manufacturer: Kosdon by AeroTech - Designation: L1400F - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_L2300.rse - Manufacturer: Kosdon by AeroTech - Designation: L2300G - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_M1450.eng - Manufacturer: Kosdon by AeroTech - Designation: M1450W - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -KBA_M1450.rse - Manufacturer: Kosdon by AeroTech - Designation: M1450W - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_M2900.rse - Manufacturer: Kosdon by AeroTech - Designation: M2900R - Data Format: RockSim - Data Source: user - Contributor: John Coker - -KBA_M3500.eng - Manufacturer: Kosdon by AeroTech - Designation: M3500R - Data Format: RASP - Data Source: cert - Contributor: John Coker - -KBA_M3500.rse - Manufacturer: Kosdon by AeroTech - Designation: M3500R - Data Format: RockSim - Data Source: mfr - Contributor: John Coker - -Kosdon_G65.eng - Manufacturer: Kosdon TRM - Designation: G65DH - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Kosdon_H155.eng - Manufacturer: Kosdon TRM - Designation: H155F - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Kosdon_I560.eng - Manufacturer: Kosdon TRM - Designation: I560F - Data Format: RASP - Data Source: user - Contributor: Mark Trevithick - -Loki_G69.rse - Manufacturer: Loki Research - Designation: G69-SF - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_G80.eng - Manufacturer: Loki Research - Designation: G80-LW - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_G80.rse - Manufacturer: Loki Research - Designation: G80-LW - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Loki_H100.eng - Manufacturer: Loki Research - Designation: H100-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_H100.rse - Manufacturer: Loki Research - Designation: H100-SF - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_H144.eng - Manufacturer: Loki Research - Designation: H144-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_H144.rse - Manufacturer: Loki Research - Designation: H144-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_H160.eng - Manufacturer: Loki Research - Designation: H160-LB - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_H160.rse - Manufacturer: Loki Research - Designation: H160-LB - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_H500.eng - Manufacturer: Loki Research - Designation: H500-LW - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_H500.rse - Manufacturer: Loki Research - Designation: H500-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_H500_1.eng - Manufacturer: Loki Research - Designation: H500-LW - Data Format: RASP - Data Source: user - Contributor: John Coker - -Loki_H90.eng - Manufacturer: Loki Research - Designation: H90-LR - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_H90.rse - Manufacturer: Loki Research - Designation: H90-LR - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Loki_I110.eng - Manufacturer: Loki Research - Designation: I110-LW - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_I110.rse - Manufacturer: Loki Research - Designation: I110-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_I210.eng - Manufacturer: Loki Research - Designation: I210-LR - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_I210.rse - Manufacturer: Loki Research - Designation: I210-LR - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_I316.eng - Manufacturer: Loki Research - Designation: I316-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_I405.eng - Manufacturer: Loki Research - Designation: I405-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_I405.rse - Manufacturer: Loki Research - Designation: I405-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_I430.eng - Manufacturer: Loki Research - Designation: I430-LB - Data Format: RASP - Data Source: mfr - Contributor: Andrew Grippo - -Loki_J1000.rse - Manufacturer: Loki Research - Designation: J1000-LW - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_J1026.eng - Manufacturer: Loki Research - Designation: J1026 CT - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_J175.eng - Manufacturer: Loki Research - Designation: J175-LW - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J175.rse - Manufacturer: Loki Research - Designation: J175-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_J300.eng - Manufacturer: Loki Research - Designation: J300 LR - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_J320.eng - Manufacturer: Loki Research - Designation: J320-LR - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J320.rse - Manufacturer: Loki Research - Designation: J320-LR - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_J350.eng - Manufacturer: Loki Research - Designation: J350-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J396.eng - Manufacturer: Loki Research - Designation: J396-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J396.rse - Manufacturer: Loki Research - Designation: J396-SF - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_J525.eng - Manufacturer: Loki Research - Designation: J525-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_J525.rse - Manufacturer: Loki Research - Designation: J525-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_J528.eng - Manufacturer: Loki Research - Designation: J528-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_J528.rse - Manufacturer: Loki Research - Designation: J528-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_J650.eng - Manufacturer: Loki Research - Designation: J650-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J712.eng - Manufacturer: Loki Research - Designation: J712-LB - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J712.rse - Manufacturer: Loki Research - Designation: J712-LB - Data Format: RockSim - Data Source: cert - Contributor: Mark Koelsch - -Loki_J820.eng - Manufacturer: Loki Research - Designation: J820-LW - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_J820.rse - Manufacturer: Loki Research - Designation: J820-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_K1127.eng - Manufacturer: Loki Research - Designation: K1127LB - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_K250.eng - Manufacturer: Loki Research - Designation: K250-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_K250.rse - Manufacturer: Loki Research - Designation: K250-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_K350.eng - Manufacturer: Loki Research - Designation: K350-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_K350.rse - Manufacturer: Loki Research - Designation: K350-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_K527.eng - Manufacturer: Loki Research - Designation: K527LR - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_K690.eng - Manufacturer: Loki Research - Designation: K690-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_K830.eng - Manufacturer: Loki Research - Designation: K830-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_K960.eng - Manufacturer: Loki Research - Designation: K960-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_K960.rse - Manufacturer: Loki Research - Designation: K960-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_L1400.eng - Manufacturer: Loki Research - Designation: L1400-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_L1400.rse - Manufacturer: Loki Research - Designation: L1400-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_L1482.eng - Manufacturer: Loki Research - Designation: L1482-LB - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_L1482.rse - Manufacturer: Loki Research - Designation: L1482-LB - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_L480.rse - Manufacturer: Loki Research - Designation: L480-LR - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_L780.eng - Manufacturer: Loki Research - Designation: L780-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_L840.eng - Manufacturer: Loki Research - Designation: L840CT - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_L930.eng - Manufacturer: Loki Research - Designation: L930-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_L930.rse - Manufacturer: Loki Research - Designation: L930-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_M1200.eng - Manufacturer: Loki Research - Designation: M1200-SF - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_M1650.eng - Manufacturer: Loki Research - Designation: M1650LC - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_M1882.eng - Manufacturer: Loki Research - Designation: M1882-LW - Data Format: RASP - Data Source: mfr - Contributor: William Carney - -Loki_M1882.rse - Manufacturer: Loki Research - Designation: M1882-LW - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Loki_M1969.eng - Manufacturer: Loki Research - Designation: M1969SF - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_M2550.eng - Manufacturer: Loki Research - Designation: M2550-LB - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -Loki_M2550.rse - Manufacturer: Loki Research - Designation: M2550-LB - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_M3000.eng - Manufacturer: Loki Research - Designation: M3000-LW - Data Format: RASP - Data Source: user - Contributor: Clay Dunsworth - -Loki_M3000.rse - Manufacturer: Loki Research - Designation: M3000-LW - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_M3464.eng - Manufacturer: Loki Research - Designation: M3464LB - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Loki_M900.rse - Manufacturer: Loki Research - Designation: M900-LR - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Loki_N3800.rse - Manufacturer: Loki Research - Designation: N3800-LW - Data Format: RockSim - Data Source: mfr - Contributor: Mark Koelsch - -Mfr_Motor1007.eng - Data Format: RASP - Data Source: mfr - Contributor: Mark Koelsch - -Mfr_Motor643.rse - Data Format: RockSim - Data Source: cert - Contributor: Andre Choquette - -PML_F50.eng - Manufacturer: Public Missiles, Ltd. - Designation: F50T - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -PML_G40.eng - Manufacturer: Public Missiles, Ltd. - Designation: G40W - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -PML_G80.eng - Manufacturer: Public Missiles, Ltd. - Designation: G80T - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -PP_H70.eng - Manufacturer: Propulsion Polymers - Designation: 240NS-H70 - Data Format: RASP - Data Source: user - Contributor: John Coker - -PP_I160.eng - Manufacturer: Propulsion Polymers - Designation: 484NS-I160 - Data Format: RASP - Data Source: user - Contributor: John Coker - -PP_I80.eng - Manufacturer: Propulsion Polymers - Designation: 460NS-I80 - Data Format: RASP - Data Source: user - Contributor: John Coker - -PP_J140.eng - Manufacturer: Propulsion Polymers - Designation: 664NS-J140 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Quest_A3.eng - Manufacturer: Quest Aerospace - Designation: A3T - Data Format: RASP - Data Source: cert - Contributor: Howard Smart - -Quest_A6.eng - Manufacturer: Quest Aerospace - Designation: A6 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Quest_A6.rse - Manufacturer: Quest Aerospace - Designation: A6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Quest_A8.eng - Manufacturer: Quest Aerospace - Designation: A8-3 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Quest_B4.eng - Manufacturer: Quest Aerospace - Designation: B4-4 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Quest_B6.eng - Manufacturer: Quest Aerospace - Designation: B6 - Data Format: RASP - Data Source: user - Contributor: John Coker - -Quest_B6.rse - Manufacturer: Quest Aerospace - Designation: B6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Quest_C6.eng - Manufacturer: Quest Aerospace - Designation: C6 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Quest_C6.rse - Manufacturer: Quest Aerospace - Designation: C6 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Quest_D5.eng - Manufacturer: Quest Aerospace - Designation: D5 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Quest_D5_1.eng - Manufacturer: Quest Aerospace - Designation: D5 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Quest_D5_2.eng - Manufacturer: Quest Aerospace - Designation: D5-P - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Quest_D8.eng - Manufacturer: Quest Aerospace - Designation: D8 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Quest_Micro_Maxx.eng - Manufacturer: Quest Aerospace - Designation: Micro Maxx II - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Quest_Micro_Maxx.rse - Manufacturer: Quest Aerospace - Designation: Micro Maxx - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Quest_Micro_Maxx_1.eng - Manufacturer: Quest Aerospace - Designation: Micro Maxx - Data Format: RASP - Data Source: cert - Contributor: John Coker - -Quest_Micro_Maxx_1.rse - Manufacturer: Quest Aerospace - Designation: Micro Maxx II - Data Format: RockSim - Data Source: user - Contributor: John Coker - -Quest_Micro_Maxx_2.eng - Manufacturer: Quest Aerospace - Designation: Micro Maxx II - Data Format: RASP - Data Source: user - Contributor: Bernard Cawley - -RATT_H70.eng - Manufacturer: R.A.T.T. Works - Designation: H70 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -RATT_I80.eng - Manufacturer: R.A.T.T. Works - Designation: I80 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -RATT_I90.eng - Manufacturer: R.A.T.T. Works - Designation: I90L - Data Format: RASP - Data Source: cert - Contributor: John Coker - -RATT_J160.eng - Manufacturer: R.A.T.T. Works - Designation: J160 - Data Format: RASP - Data Source: user - Contributor: John Coker - -RATT_K240.eng - Manufacturer: R.A.T.T. Works - Designation: K240H - Data Format: RASP - Data Source: cert - Contributor: John Coker - -RATT_L600.eng - Manufacturer: R.A.T.T. Works - Designation: L600 - Data Format: RASP - Data Source: user - Contributor: John Coker - -RATT_M900.eng - Manufacturer: R.A.T.T. Works - Designation: M900 - Data Format: RASP - Data Source: user - Contributor: John Coker - -RV_E15.eng - Manufacturer: Rocketvision Flight-Star - Designation: E15 - Data Format: RASP - Data Source: cert - Contributor: John Coker - -RV_F32.eng - Manufacturer: Rocketvision Flight-Star - Designation: F32 - Data Format: RASP - Data Source: user - Contributor: John Coker - -RV_F72.eng - Manufacturer: Rocketvision Flight-Star - Designation: F72 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -RV_G55.eng - Manufacturer: Rocketvision Flight-Star - Designation: G55 - Data Format: RASP - Data Source: cert - Contributor: Mark Koelsch - -Roadrunner_E25.eng - Manufacturer: Roadrunner Rocketry - Designation: E25 - Data Format: RASP - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_E25.rse - Manufacturer: Roadrunner Rocketry - Designation: E25 - Data Format: RockSim - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_F35.eng - Manufacturer: Roadrunner Rocketry - Designation: F35 - Data Format: RASP - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_F35.rse - Manufacturer: Roadrunner Rocketry - Designation: F35 - Data Format: RockSim - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_F45.eng - Manufacturer: Roadrunner Rocketry - Designation: F45 - Data Format: RASP - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_F45.rse - Manufacturer: Roadrunner Rocketry - Designation: F45 - Data Format: RockSim - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_F60.eng - Manufacturer: Roadrunner Rocketry - Designation: F60 - Data Format: RASP - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_F60.rse - Manufacturer: Roadrunner Rocketry - Designation: F60 - Data Format: RockSim - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_G80.eng - Manufacturer: Roadrunner Rocketry - Designation: G80 - Data Format: RASP - Data Source: mfr - Contributor: Roadrunner Rocketry - -Roadrunner_G80.rse - Manufacturer: Roadrunner Rocketry - Designation: G80 - Data Format: RockSim - Data Source: mfr - Contributor: Roadrunner Rocketry - -SCR_A3.rse - Manufacturer: Southern Cross Rocketry - Designation: SCR-A8 - Data Format: RockSim - Data Source: mfr - Contributor: John Coker - -SCR_B4.rse - Manufacturer: Southern Cross Rocketry - Designation: SCR-B6 - Data Format: RockSim - Data Source: mfr - Contributor: John Coker - -SCR_C3.rse - Manufacturer: Southern Cross Rocketry - Designation: SCR-C6 - Data Format: RockSim - Data Source: mfr - Contributor: John Coker - -SkyR_G125.eng - Manufacturer: Sky Ripper Systems - Designation: G125 - Data Format: RASP - Data Source: user - Contributor: John Coker - -SkyR_G125.rse - Manufacturer: Sky Ripper Systems - Designation: G125 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_G63.eng - Manufacturer: Sky Ripper Systems - Designation: G63 - Data Format: RASP - Data Source: user - Contributor: John Coker - -SkyR_G63.rse - Manufacturer: Sky Ripper Systems - Designation: G63 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_G69.eng - Manufacturer: Sky Ripper Systems - Designation: G69 - Data Format: RASP - Data Source: user - Contributor: John Coker - -SkyR_G69.rse - Manufacturer: Sky Ripper Systems - Designation: G69 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_H124.eng - Manufacturer: Sky Ripper Systems - Designation: H124 - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -SkyR_H124.rse - Manufacturer: Sky Ripper Systems - Designation: H124 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_H155.eng - Manufacturer: Sky Ripper Systems - Designation: H155 - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -SkyR_H155.rse - Manufacturer: Sky Ripper Systems - Designation: H155 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_H78.eng - Manufacturer: Sky Ripper Systems - Designation: H78 - Data Format: RASP - Data Source: user - Contributor: John Coker - -SkyR_H78.rse - Manufacturer: Sky Ripper Systems - Designation: H78 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_I117.eng - Manufacturer: Sky Ripper Systems - Designation: I117 - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -SkyR_I117.rse - Manufacturer: Sky Ripper Systems - Designation: I117 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_I119.eng - Manufacturer: Sky Ripper Systems - Designation: I119 - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -SkyR_I119.rse - Manufacturer: Sky Ripper Systems - Designation: I119 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_I147.eng - Manufacturer: Sky Ripper Systems - Designation: I147 - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -SkyR_I147.rse - Manufacturer: Sky Ripper Systems - Designation: I147 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_J144.eng - Manufacturer: Sky Ripper Systems - Designation: J144 - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -SkyR_J144.rse - Manufacturer: Sky Ripper Systems - Designation: J144 - Data Format: RockSim - Data Source: user - Contributor: John Coker - -SkyR_J261.eng - Manufacturer: Sky Ripper Systems - Designation: J261G - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -SkyR_J263.eng - Manufacturer: Sky Ripper Systems - Designation: J263G - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -SkyR_J337.eng - Manufacturer: Sky Ripper Systems - Designation: J337B - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -SkyR_J348.eng - Manufacturer: Sky Ripper Systems - Designation: J348B - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -SkyR_K257.eng - Manufacturer: Sky Ripper Systems - Designation: K257G - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -SkyR_K347.eng - Manufacturer: Sky Ripper Systems - Designation: K347B - Data Format: RASP - Data Source: mfr - Contributor: John Coker - -WCH_G55.rse - Manufacturer: West Coast Hybrids - Designation: 150 G55-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -WCH_H100.rse - Manufacturer: West Coast Hybrids - Designation: 246 H100-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -WCH_I110.eng - Manufacturer: West Coast Hybrids - Designation: 499 I110-P - Data Format: RASP - Data Source: mfr - Contributor: Andrew MacMillen - -WCH_I110.rse - Manufacturer: West Coast Hybrids - Designation: 499 I110-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -WCH_K460.rse - Manufacturer: West Coast Hybrids - Designation: 1988 K460-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -WCH_L600.rse - Manufacturer: West Coast Hybrids - Designation: 3161 L600-P - Data Format: RockSim - Data Source: user - Contributor: John Coker - -WCH_M700.rse - Manufacturer: West Coast Hybrids - Designation: 5592 M700-P - Data Format: RockSim - Data Source: user - Contributor: John Coker diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I195.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I195.eng deleted file mode 100644 index 2aacd4aed1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I195.eng +++ /dev/null @@ -1,33 +0,0 @@ -;Animal Motor Works 38-390 -I195WT 38 249 17 0.193 0.495 AMW - 0.0020 10.548 - 0.018 42.653 - 0.046 136.214 - 0.064 179.784 - 0.072 191.248 - 0.078 197.211 - 0.088 198.587 - 0.126 198.587 - 0.175 207.759 - 0.217 211.887 - 0.349 216.931 - 0.401 221.059 - 0.554 225.646 - 0.586 228.856 - 0.626 228.48 - 0.65 230.232 - 1.013 231.607 - 1.105 230.691 - 1.2 225.187 - 1.356 210.511 - 1.392 207.759 - 1.441 206.842 - 1.457 205.007 - 1.519 181.159 - 1.563 155.936 - 1.693 49.992 - 1.727 28.435 - 1.756 16.512 - 1.798 7.338 - 1.86 1.376 - 1.89 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I195.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I195.rse deleted file mode 100644 index 855988c135..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I195.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - Animal Motor Works 38-390 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I220.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I220.eng deleted file mode 100644 index c07bea72f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I220.eng +++ /dev/null @@ -1,29 +0,0 @@ -;Animal Motor Works 38-390 -I220SK 38 249 20 0.202 0.495 AMW - 0.0050 12.747 - 0.019 45.25 - 0.036 79.666 - 0.052 125.554 - 0.069 162.519 - 0.076 169.53 - 0.095 174.629 - 0.167 176.541 - 0.229 191.199 - 0.447 235.175 - 0.602 260.668 - 0.733 288.073 - 0.85 302.095 - 0.974 301.457 - 1.094 289.985 - 1.184 268.954 - 1.268 240.273 - 1.302 219.879 - 1.388 177.178 - 1.418 147.224 - 1.435 127.467 - 1.473 91.139 - 1.504 65.645 - 1.543 40.789 - 1.593 19.12 - 1.622 10.197 - 1.65 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I220.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I220.rse deleted file mode 100644 index 24dec8558b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I220.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - Animal Motor Works 38-390 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I223.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I223.eng deleted file mode 100644 index 76ee916889..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I223.eng +++ /dev/null @@ -1,16 +0,0 @@ -; CTI Pro38-4G 434 I223 Skidmark 14A -I223SK 38 302 5-7-9-11-14 0.266 0.494 CTI - 0.016 199.183 - 0.024 260.157 - 0.07 207.313 - 0.148 227.637 - 0.425 244.71 - 0.721 254.466 - 1.015 256.905 - 1.3 248.775 - 1.459 240.645 - 1.615 234.954 - 1.712 195.931 - 1.782 119.51 - 1.9 24.39 - 1.984 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I223.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I223.rse deleted file mode 100644 index 30e13e05d8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I223.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - CTI Pro38-4G 434 I223 Skidmark 14A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I271.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I271.eng deleted file mode 100644 index 08274968d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I271.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -; AMW 38-390 -I271BB 38 258 0 0.189 0.493 AMW -0.011 119.530 -0.035 213.907 -0.050 245.903 -0.074 262.705 -0.115 269.446 -0.225 267.736 -0.346 282.929 -0.465 296.411 -0.584 303.152 -0.727 311.504 -0.916 318.245 -1.054 324.986 -1.162 331.400 -1.201 326.696 -1.225 313.214 -1.242 286.249 -1.268 240.990 -1.294 188.888 -1.323 136.833 -1.346 87.565 -1.368 45.467 -1.392 18.523 -1.430 0.000 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I271.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I271.rse deleted file mode 100644 index d166d54505..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I271.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -AMW 38-390 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I285.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I285.eng deleted file mode 100644 index ea373d5b71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I285.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -; AMW 38-390 -I285GG 38 258 0 0.206 0.515 AMW -0.013 61.575 -0.032 119.327 -0.055 164.575 -0.076 191.004 -0.094 201.014 -0.139 212.326 -0.232 231.247 -0.357 258.876 -0.456 267.686 -0.592 278.998 -0.716 289.358 -0.841 291.200 -0.936 290.310 -1.051 285.204 -1.139 277.696 -1.204 280.199 -1.243 278.998 -1.265 268.887 -1.286 242.559 -1.319 187.200 -1.359 134.443 -1.387 86.702 -1.407 52.776 -1.428 31.413 -1.448 16.337 -1.465 5.026 -1.480 0.000 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I285.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I285.rse deleted file mode 100644 index 28b043911b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I285.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -AMW 38-390 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I297.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I297.eng deleted file mode 100644 index d9a3fd8557..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I297.eng +++ /dev/null @@ -1,19 +0,0 @@ -; CTI Pro38-5G 543 I297 Skidmark 15A -I297SM 38 360 6-8-10-12-15 0.329 0.591 CTI - 0.013 340.903 - 0.036 375.121 - 0.069 354.844 - 0.129 335.834 - 0.281 338.369 - 0.662 344.705 - 0.855 344.705 - 1.084 329.498 - 1.295 319.359 - 1.359 313.023 - 1.447 314.29 - 1.534 269.935 - 1.637 119.126 - 1.681 69.701 - 1.74 40.554 - 1.846 12.673 - 1.943 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I297.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I297.rse deleted file mode 100644 index 7487853782..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I297.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - CTI Pro38-5G 543 I297 Skidmark 15A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I315.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I315.eng deleted file mode 100644 index 3769d8027b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I315.eng +++ /dev/null @@ -1,34 +0,0 @@ -; This file my be used or given away. All I ask is that this header -; is maintained to give credit to NAR S&T. Thank you, Jack Kane -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -;Animal Motor Works 38-640 -I315SK 38 369 20 0.3829 0.7166 AMW -0.011 314.573 -0.030 312.796 -0.066 300.786 -0.084 300.502 -0.120 304.087 -0.175 312.998 -0.266 324.086 -0.356 332.224 -0.447 347.855 -0.538 371.972 -0.629 382.833 -0.719 385.552 -0.810 385.586 -0.901 384.836 -0.992 382.296 -1.082 378.323 -1.173 370.837 -1.264 357.564 -1.355 347.122 -1.445 328.332 -1.536 202.733 -1.627 90.867 -1.718 35.427 -1.808 8.192 -1.815 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I315.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I315.rse deleted file mode 100644 index 0b1fd63b91..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I315.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I325.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I325.eng deleted file mode 100644 index 71945970ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I325.eng +++ /dev/null @@ -1,31 +0,0 @@ -;Animal Motor Works 38-640 -I325WT 38 370 17 0.317 0.712 AMW - 0.014 68.710 - 0.022 113.038 - 0.026 153.671 - 0.037 244.545 - 0.045 299.216 - 0.055 330.246 - 0.065 350.194 - 0.079 365.709 - 0.094 376.79 - 0.124 381.963 - 0.185 373.836 - 0.252 373.836 - 0.35 381.224 - 0.47 382.701 - 0.622 388.611 - 1.102 384.179 - 1.366 364.971 - 1.379 360.537 - 1.415 331.724 - 1.49 223.119 - 1.505 211.298 - 1.551 187.657 - 1.592 162.538 - 1.688 80.529 - 1.726 50.978 - 1.775 27.336 - 1.806 16.993 - 1.834 9.605 - 1.901 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I325.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I325.rse deleted file mode 100644 index 954b028fd5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I325.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -Animal Motor Works 38-640 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I375.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I375.eng deleted file mode 100644 index 92aa13ee53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I375.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -;Animal Motor Works 38-640 -I375GG 38 369 20 0.3936 0.7338 AMW -0.013 223.878 -0.045 273.929 -0.092 312.421 -0.140 334.383 -0.219 357.983 -0.298 381.992 -0.377 410.267 -0.457 431.141 -0.536 454.458 -0.615 476.825 -0.694 495.473 -0.773 504.665 -0.852 510.942 -0.931 511.972 -1.011 489.639 -1.090 441.350 -1.169 392.762 -1.248 354.753 -1.327 292.385 -1.406 177.309 -1.486 63.879 -1.565 14.901 -1.583 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I375.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I375.rse deleted file mode 100644 index 8e7303d9ab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_I375.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J1365.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J1365.rse deleted file mode 100644 index 1ed5e97053..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J1365.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve from the AMW web site and CAR/NAR/TRA certified -rocket motor list dated 9/28/08. The total weight was estimated based on -similar motors such as the J325TT, J395RR, and the J401BB - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J230.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J230.eng deleted file mode 100644 index dc5ab7aa76..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J230.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Kosdon J230 RASP.ENG file made from NAR published data -; File produced November 1, 2000 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -J230 54 326 8 .5008 1.1690 K -0.026 146.964 -0.039 214.239 -0.076 239.367 -0.161 247.777 -0.306 247.677 -0.488 249.679 -0.754 260.090 -0.948 268.400 -1.227 274.607 -1.590 276.720 -1.905 270.102 -2.195 267.899 -2.498 259.390 -2.643 252.982 -2.824 248.778 -3.115 242.270 -3.369 229.656 -3.478 221.147 -3.550 204.328 -3.610 170.690 -3.658 126.541 -3.718 82.442 -3.790 61.418 -3.899 40.365 -3.983 17.229 -4.080 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J230.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J230.rse deleted file mode 100644 index 1654ba26f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J230.rse +++ /dev/null @@ -1,65 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve from the AMW motor assembly instructions and -CAR/NAR/TRA certified rocket motor list dated 9/28/08. The total weight was -provided by Paul Robinson of AMW. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J325.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J325.rse deleted file mode 100644 index 16a9cb26a5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J325.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J357.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J357.eng deleted file mode 100644 index b387aa75a5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J357.eng +++ /dev/null @@ -1,35 +0,0 @@ -; AMW Animal Motor Works fixed by dberez 12/08/03 -; -;Animal Motor Works J357 White Wolf -J357WW 54 326 0 0.5481 1.2101 AMW -0.02 129.64 -0.03 205.95 -0.05 265.00 -0.06 316.51 -0.09 326.05 -0.13 314.60 -0.18 301.25 -0.24 299.34 -0.35 312.69 -0.50 326.05 -0.66 333.68 -0.87 345.13 -1.07 358.48 -1.46 383.18 -1.77 398.45 -1.86 400.36 -1.98 402.35 -2.18 398.45 -2.29 390.82 -2.41 369.93 -2.51 354.67 -2.55 352.76 -2.60 347.03 -2.65 335.59 -2.69 310.79 -2.75 249.73 -2.81 175.43 -2.84 108.65 -2.90 53.38 -2.92 20.98 -2.95 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J357.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J357.rse deleted file mode 100644 index dbf1b7b6a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J357.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J365.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J365.eng deleted file mode 100644 index 05fe77594a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J365.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -;Animal Motor Works 54-1400 -J365SK 54 403 0 0.7571 1.4593 AMW -0.029 389.731 -0.123 360.219 -0.218 334.200 -0.376 326.150 -0.534 334.217 -0.692 341.669 -0.850 347.676 -1.007 359.408 -1.165 370.043 -1.323 383.343 -1.481 399.248 -1.639 417.477 -1.797 443.735 -1.955 472.683 -2.112 501.668 -2.270 497.077 -2.428 425.371 -2.586 349.017 -2.744 262.068 -2.902 107.073 -3.060 41.821 -3.157 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J365.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J365.rse deleted file mode 100644 index 70345e20cc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J365.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J370.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J370.eng deleted file mode 100644 index 78837f313b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J370.eng +++ /dev/null @@ -1,44 +0,0 @@ -; -;Animal Motor Works 54-1050 -;AMW J370GG RASP.ENG file made from NAR data -;File produced FEB 20, 2003 -;This file my be used or given away. All I ask is that this header -;is maintained to give credit to NAR S&T. Thank you, Jack Kane -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -J370GG 54 326 100 0.5983 1.2491 Animal_Motor_Works -0.008 185.496 -0.024 149.516 -0.063 225.273 -0.087 272.647 -0.122 304.829 -0.158 304.829 -0.273 335.212 -0.431 363.796 -0.573 390.381 -0.707 413.168 -0.877 428.459 -1.019 441.852 -1.126 441.852 -1.224 458.46 -1.284 443.951 -1.386 440.153 -1.572 438.454 -1.651 438.554 -1.813 417.765 -2.022 404.673 -2.141 385.883 -2.212 385.883 -2.255 374.59 -2.299 387.882 -2.362 357.599 -2.401 384.184 -2.421 348.204 -2.457 316.122 -2.559 251.758 -2.697 115.635 -2.753 45.624 -2.82 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J370.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J370.rse deleted file mode 100644 index ca70731613..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J370.rse +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J395.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J395.rse deleted file mode 100644 index 78e06660ce..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J395.rse +++ /dev/null @@ -1,67 +0,0 @@ - - - - Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400.eng deleted file mode 100644 index 52e017f1b7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -;AMW J400 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -J400RR 54 326 100 0.558 1.2314 Animal_Motor_Works -0.043 246.55 -0.06 317.381 -0.081 344.709 -0.107 358.372 -0.15 356.06 -0.201 365.204 -0.308 392.532 -0.568 435.734 -0.863 458.339 -1.094 469.24 -1.209 467.18 -1.466 460.148 -1.705 443.972 -1.923 423.275 -2.132 409.411 -2.303 413.831 -2.402 420.563 -2.47 413.831 -2.517 395.445 -2.543 347.421 -2.568 265.238 -2.598 128.198 -2.615 68.801 -2.632 25.398 -2.66 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400.rse deleted file mode 100644 index 75e0e69688..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400.rse +++ /dev/null @@ -1,61 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400_1.rse deleted file mode 100644 index e77e573f7e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J400_1.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -AMW J400 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440.eng deleted file mode 100644 index 54d1f807e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440.eng +++ /dev/null @@ -1,16 +0,0 @@ -J440-BB 54 326 0 0.536 1.229 AMW/ProX -0.01 30 -0.02 700 -0.06 790 -0.1 800 -0.2 760 -0.4 725 -0.6 695 -0.8 680 -1 658 -1.32 600 -1.55 400 -1.7 180 -1.87 175 -2 75 -2.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440.rse deleted file mode 100644 index 2cbbf9c5b8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440_1.eng deleted file mode 100644 index 40adabd841..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440_1.eng +++ /dev/null @@ -1,27 +0,0 @@ -;Animal Motor Works 38-640 -J440BB 38 369 20 0.3853 0.6985 AMW -0.007 468.505 -0.022 509.996 -0.037 527.687 -0.052 532.792 -0.082 530.181 -0.127 525.586 -0.202 521.566 -0.277 519.840 -0.352 521.522 -0.426 525.414 -0.501 531.248 -0.576 538.724 -0.651 541.761 -0.726 538.508 -0.801 531.072 -0.876 516.175 -0.950 494.942 -1.025 477.251 -1.100 433.297 -1.175 313.900 -1.250 187.467 -1.325 101.546 -1.400 45.751 -1.474 22.083 -1.497 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440_1.rse deleted file mode 100644 index 1046b9ab6e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J440_1.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450.eng deleted file mode 100644 index 01a2efa6e9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -;AMW J450 RASP.ENG file made from NAR published data -; File produced SEPT 4, 2002 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -J450 54 326 P .5331 1.1964 AMW - 0.009 251.586 - 0.016 376.074 - 0.030 413.450 - 0.051 430.832 - 0.094 423.296 - 0.162 413.149 - 0.262 395.566 - 0.402 420.182 - 0.495 444.898 - 0.805 504.078 - 1.048 536.028 - 1.223 550.597 - 1.299 563.180 - 1.334 555.319 - 1.470 560.042 - 1.588 559.841 - 1.764 546.980 - 1.921 516.838 - 1.993 496.743 - 2.025 499.154 - 2.047 479.160 - 2.086 414.354 - 2.115 344.525 - 2.141 252.290 - 2.177 140.161 - 2.213 82.780 - 2.239 50.347 - 2.271 27.861 - 2.296 12.860 - 2.330 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450.rse deleted file mode 100644 index 9ff0934893..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450_1.eng deleted file mode 100644 index 5b444e7ba5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J450_1.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Animal Motor Works J450 Super Tiger -J450ST 54 326 0 0.5331 1.1964 AMW -0.009 251.586 -0.016 376.074 -0.030 413.450 -0.051 430.832 -0.094 423.296 -0.162 413.149 -0.262 395.566 -0.402 420.182 -0.495 444.898 -0.805 504.078 -1.048 536.028 -1.223 550.597 -1.299 563.180 -1.334 555.319 -1.470 560.042 -1.588 559.841 -1.764 546.980 -1.921 516.838 -1.993 496.743 -2.025 499.154 -2.047 479.160 -2.086 414.354 -2.115 344.525 -2.141 252.290 -2.177 140.161 -2.213 82.780 -2.239 50.347 -2.271 27.861 -2.296 12.860 -2.330 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475.eng deleted file mode 100644 index 92f798a161..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475.eng +++ /dev/null @@ -1,23 +0,0 @@ -J475-BB 54 403 0 0.714 1.493 AMW/ProX -0.03 30 -0.04 500 -0.075 600 -0.1 515 -0.2 530 -0.4 540 -0.6 535 -0.8 535 -1 530 -1.2 520 -1.4 510 -1.6 500 -1.8 490 -2 480 -2.2 490 -2.28 450 -2.43 180 -2.5 100 -2.6 60 -2.8 28 -3 10 -3.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475.rse deleted file mode 100644 index c5810da343..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475_1.rse deleted file mode 100644 index 5785fc8592..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J475_1.rse +++ /dev/null @@ -1,71 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J480.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J480.eng deleted file mode 100644 index 0eca68897f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J480.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -;AMW J480 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -J480BB 54 326 100 0.556 1.2131 Animal_Motor_Works -0.015 225.429 -0.041 348.18 -0.071 388.127 -0.194 422.453 -0.385 459.49 -0.699 502.347 -0.968 528.042 -1.2 536.573 -1.454 543.15 -1.674 533.763 -1.887 522.321 -2.044 519.41 -2.108 525.131 -2.164 528.042 -2.197 488.095 -2.25 419.543 -2.283 333.928 -2.328 231.15 -2.354 176.95 -2.392 111.309 -2.418 68.501 -2.436 37.106 -2.49 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J480.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J480.rse deleted file mode 100644 index 103e1d2736..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J480.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -AMW J480 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J500.eng deleted file mode 100644 index f5a088965c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J500.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -;J500ST entered by Tim Van Milligan -;For RockSim - http://www.rocksim.com -;Based on TRA Certification paperwork from 06-01-2002 -;Initial Mass from Jim Robinson at AMW -;Not approved by TRA or AMW. -J500ST 38 370 20 0.3265 0.744 Animal_Motor_Works -0.006 444.822 -0.025 475.651 -0.04 418.397 -0.053 466.843 -0.059 409.589 -0.071 458.035 -0.077 409.589 -0.1 444.822 -0.127 506.481 -0.204 590.16 -0.25 644.992 -0.3 678.244 -0.34 709.073 -0.402 735.498 -0.445 766.327 -0.516 783.944 -0.6 787.335 -0.637 770.732 -0.68 744.306 -0.76 620.989 -0.859 475.651 -1.00464 303.888 -1.122 171.763 -1.227 52.8502 -1.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J500.rse deleted file mode 100644 index b96e832f9a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J500.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -J500ST entered by Tim Van Milligan -For RockSim - http://www.rocksim.com -Based on TRA Certification paperwork from 06-01-2002 -Initial Mass from Jim Robinson at AMW -Not approved by TRA or AMW. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J745.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J745.rse deleted file mode 100644 index 995c03ff3a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_J745.rse +++ /dev/null @@ -1,75 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1000.eng deleted file mode 100644 index 09d0d32501..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1000.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -;AMW K1000 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K1000SK 54 728 100 1.297 2.556 Animal_Motor_Works -0.019 1155.06 -0.045 1426.12 -0.094 1248.23 -0.161 1112.99 -0.239 1128.02 -0.343 1113.99 -0.377 1149.05 -0.44 1121 -0.544 1221.18 -0.633 1178.11 -0.674 1221.18 -0.737 1193.13 -0.883 1200.14 -1.009 1194.13 -1.057 1236.21 -1.188 1137.03 -1.299 1145.05 -1.396 1087.94 -1.516 954.104 -1.631 855.228 -1.717 827.077 -1.777 650.061 -1.848 465.932 -1.93 303.141 -2.023 147.463 -2.083 83.879 -2.132 41.484 -2.18 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1000.rse deleted file mode 100644 index 303ecfa41e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1000.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -AMW K1000 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075.eng deleted file mode 100644 index 11597221fb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075.eng +++ /dev/null @@ -1,41 +0,0 @@ -; AMW 54-2500 Skidmark Plugged -2245-K1075-SK-P 54 728 P 1.259 2.6388 CTI - 0.0070 1574.366 - 0.012 1038.184 - 0.017 1476.101 - 0.024 1083.044 - 0.029 1365.02 - 0.034 1117.223 - 0.041 1266.756 - 0.046 1162.083 - 0.049 1226.168 - 0.069 1159.947 - 0.107 1130.04 - 0.151 1108.678 - 0.21 1100.134 - 0.274 1102.27 - 0.332 1102.27 - 0.432 1115.087 - 0.523 1119.359 - 0.611 1132.176 - 0.674 1140.721 - 0.766 1149.266 - 0.881 1159.947 - 0.979 1179.172 - 1.141 1191.989 - 1.257 1189.853 - 1.379 1191.989 - 1.504 1202.67 - 1.599 1211.215 - 1.67 1232.577 - 1.744 1249.666 - 1.772 1226.168 - 1.802 1155.674 - 1.841 993.324 - 1.888 736.983 - 1.944 455.007 - 2.002 267.023 - 2.065 128.171 - 2.11 68.358 - 2.149 34.179 - 2.198 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075.rse deleted file mode 100644 index e4bfa0b69e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075.rse +++ /dev/null @@ -1,54 +0,0 @@ - - - - AMW 54-2500 Skidmark Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075_1.eng deleted file mode 100644 index 6a1cbb416e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075_1.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -;Animal Motor Works K1075 RASP.ENG file made from NAR data -;File produced Feb 22, 2003 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K1075GG 54 726 100 1.3999 2.6658 Animal_Motor_Works -0.009 672.664 -0.015 963.511 -0.022 860.518 -0.047 987.857 -0.075 975.835 -0.106 921.332 -0.215 958.001 -0.529 1092.05 -0.878 1220.29 -1.077 1269.39 -1.158 1311.47 -1.235 1293.43 -1.448 1330.5 -1.577 1318.48 -1.672 1319.48 -1.721 1337.52 -1.759 1337.52 -1.805 1337.52 -1.829 1331.5 -1.856 1384.67 -1.889 1277.4 -1.906 1216.29 -1.938 1052.98 -1.96 871.338 -1.988 659.239 -2.027 453.352 -2.062 301.967 -2.115 138.46 -2.168 41.608 -2.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075_1.rse deleted file mode 100644 index 8f22b5d92f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1075_1.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -Animal Motor Works K1075 RASP.ENG file made from NAR data -File produced Feb 22, 2003 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1130.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1130.eng deleted file mode 100644 index 80fb6e188f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1130.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Blue Baboon -K1130-BB 54 728 0 1.359 2.574 AMW/ProX -0.01 1000 -0.013 1490 -0.02 1548 -0.04 1500 -0.09 1335 -0.2 1325 -1 1325 -1.5 1325 -1.63 1345 -1.7 1155 -1.8 805 -1.9 685 -2 475 -2.1 315 -2.2 145 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1130.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1130.rse deleted file mode 100644 index 46c6f6b227..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1130.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1250.eng deleted file mode 100644 index ee6b3a2695..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1250.eng +++ /dev/null @@ -1,18 +0,0 @@ -K1250-WW 54 491 0 0.925 1.815 AMW/ProX -0.01 600 -0.02 1400 -0.03 1610 -0.05 1360 -0.07 1410 -0.1 1440 -0.15 1470 -0.2 1480 -0.4 1480 -0.8 1395 -1.28 1185 -1.36 985 -1.4 680 -1.45 570 -1.5 210 -1.6 60 -1.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1250.rse deleted file mode 100644 index 00369aad5c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1250.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1720.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1720.rse deleted file mode 100644 index d07a1eb699..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K1720.rse +++ /dev/null @@ -1,65 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve from the AMW web site and CAR/NAR/TRA certified -rocket motor list dated 9/28/08. The total weight was estimated based on -similar motors such as the K455TT, K535RR and K665BB. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K365.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K365.eng deleted file mode 100644 index 25fe1b1f03..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K365.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;AMW K365RR RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K365RR 75 111 100 0.946 2.3456 Animal_Motor_Works -0.049 138.157 -0.068 381.241 -0.084 454.75 -0.106 481.536 -0.164 488.182 -0.291 514.867 -0.435 545.982 -0.666 561.49 -0.868 565.73 -1.082 565.518 -1.296 550.111 -1.591 529.871 -1.805 509.731 -1.828 536.517 -1.886 498.554 -2.124 467.237 -2.501 411.35 -2.924 328.677 -3.296 241.573 -3.638 172.293 -3.969 100.798 -4.195 56.098 -4.265 51.607 -4.346 35.959 -4.433 15.859 -4.51 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K365.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K365.rse deleted file mode 100644 index 69443b7e33..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K365.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - -AMW K365RR RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K450.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K450.eng deleted file mode 100644 index ece0bace50..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K450.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;AMW K450BB RASP.ENG file made from NAR published data -;File produced Aug 19, 2003 -;This file my be used or given away. All I ask is that this header -;is maintained to give credit to NAR S&T. Thank you, Jack Kane. -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K450BB 75 302 100 0.8816 2.8349 Animal_Motor_Works -0.03 78.903 -0.045 227.9 -0.064 449.955 -0.069 508.417 -0.094 555.187 -0.151 563.956 -0.362 625.442 -0.562 651.85 -0.825 660.62 -1.134 652.254 -1.453 626.147 -1.793 594.296 -2.113 538.958 -2.458 469.106 -2.798 384.538 -3.165 276.686 -3.201 279.609 -3.325 232.94 -3.51 171.757 -3.732 107.65 -3.861 58.018 -3.959 40.55 -4.036 20.149 -4.11 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K450.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K450.rse deleted file mode 100644 index 85d375e196..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K450.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K455.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K455.rse deleted file mode 100644 index 5517d6ca42..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K455.rse +++ /dev/null @@ -1,59 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K470.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K470.eng deleted file mode 100644 index bd780c1df3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K470.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;AMW K470ST RASP.ENG file made from Tripoli published data -;File produced May 15, 2004 -;This file my be used or given away. All I ask is that this header -;is maintained to give credit to the people who produced the data. -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K470ST 75 302 100 0.826 2.779 Animal_Motor_Works -0.028 699.309 -0.039 799.337 -0.09 765.845 -0.157 770.311 -0.258 785.941 -0.41 804 -0.572 794.425 -0.707 794.425 -0.886 792.192 -0.998 783.261 -1.15 752.002 -1.318 709.579 -1.447 655.992 -1.593 595.707 -1.728 522.025 -1.885 444.101 -2.092 354.923 -2.356 270.167 -2.664 187.554 -2.945 131.734 -3.27 78.058 -3.433 55.686 -3.478 48.987 -3.556 28.909 -3.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K470.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K470.rse deleted file mode 100644 index 67bac4d357..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K470.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -AMW K470ST RASP.ENG file made from Tripoli published data -File produced May 15, 2004 -This file my be used or given away. All I ask is that this header -is maintained to give credit to the people who produced the data. -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K475.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K475.eng deleted file mode 100644 index 8551ed5b41..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K475.eng +++ /dev/null @@ -1,38 +0,0 @@ -; -;Animal Motor Works K475 RASP.ENG file made from NAR data -;File produced Feb 22, 2003 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K475WW 54 403 100 0.7286 1.4925 Animal_Motor_Works -0.022 127.831 -0.041 386.016 -0.063 548.326 -0.096 521.308 -0.134 499.129 -0.18 486.83 -0.285 486.83 -0.478 501.649 -0.731 523.727 -1.096 553.266 -1.433 577.962 -1.601 588.29 -1.756 582.704 -1.895 580.284 -1.958 575.344 -2.063 550.746 -2.209 518.788 -2.344 477.051 -2.495 417.974 -2.561 354.058 -2.582 334.399 -2.599 331.98 -2.62 297.501 -2.67 226.226 -2.707 157.37 -2.74 98.353 -2.799 49.176 -2.853 17.208 -2.94 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K475.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K475.rse deleted file mode 100644 index 805dbdebec..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K475.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - -Animal Motor Works K475 RASP.ENG file made from NAR data -File produced Feb 22, 2003 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K500.eng deleted file mode 100644 index 0eb594d1b9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K500.eng +++ /dev/null @@ -1,36 +0,0 @@ -; Entered by Tim Van Milligan. Used John Coker's ThrustCurve Tracer software and -; data from NAR certification dated May 7, 2007 -K500SK 75 368 100 1.1235 2.713 Animal - 0.018 194.373 - 0.031 207.161 - 0.036 268.542 - 0.103 319.693 - 0.138 322.251 - 0.17 314.578 - 0.67 309.463 - 0.692 322.251 - 0.902 319.693 - 0.929 332.481 - 1.263 355.499 - 1.585 383.632 - 1.969 411.765 - 2.112 416.88 - 2.272 447.57 - 2.415 488.491 - 2.46 485.934 - 2.634 534.527 - 2.83 618.926 - 3.018 710.997 - 3.143 767.263 - 3.228 815.857 - 3.339 841.432 - 3.402 826.087 - 3.504 785.166 - 3.585 718.67 - 3.661 631.714 - 3.728 519.182 - 3.772 365.729 - 3.826 181.586 - 3.862 99.744 - 3.893 43.478 - 3.946 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K500.rse deleted file mode 100644 index 58bd7bdf86..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K500.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - -Entered by Tim Van Milligan. Used John Coker's ThrustCurve Tracer software and -data from NAR certification dated May 7, 2007 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K530.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K530.eng deleted file mode 100644 index e1c460f51b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K530.eng +++ /dev/null @@ -1,43 +0,0 @@ -; -;Animal Motor Works 54-1400 -;AMW K530GG RASP.ENG file made from NAR data -;File produced Feb 25, 2003 -;This file my be used or given away. All I ask is that this header -;is maintained to give credit to NAR S&T. Thank you, Jack Kane -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K530GG 54 403 1000 0.7967 1.616 Animal_Motor_Works -0.013 129.764 -0.054 171.852 -0.096 284.122 -0.138 392.892 -0.171 455.975 -0.217 501.662 -0.238 498.063 -0.326 508.66 -0.542 564.745 -0.755 613.831 -1.01 645.423 -1.17 657.23 -1.273 648.922 -1.51 638.425 -1.656 634.925 -1.702 606.833 -1.803 606.833 -1.857 585.839 -1.936 589.338 -1.974 575.242 -2.015 589.338 -2.04 564.745 -2.132 536.652 -2.207 540.251 -2.291 522.656 -2.357 487.566 -2.42 375.297 -2.478 242.033 -2.529 140.361 -2.583 66.651 -2.66 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K530.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K530.rse deleted file mode 100644 index 3313637abd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K530.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K535.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K535.rse deleted file mode 100644 index 9830181a71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K535.rse +++ /dev/null @@ -1,85 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K555.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K555.eng deleted file mode 100644 index 522291a1dd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K555.eng +++ /dev/null @@ -1,33 +0,0 @@ -;Animal Motor Works 54-1750 K555 skidmark -;File provide by Joel Rogers of AMW -K555SK 54 492 0 0.8707 1.7343 AMW -0.063 507.328 -0.144 535.181 -0.226 559.826 -0.308 585.793 -0.389 607.239 -0.471 629.034 -0.553 664.586 -0.634 683.688 -0.716 697.625 -0.798 719.618 -0.879 756.521 -0.961 777.700 -1.043 789.004 -1.124 797.934 -1.206 801.689 -1.288 804.331 -1.369 799.414 -1.451 768.014 -1.533 704.469 -1.614 641.709 -1.696 568.727 -1.778 481.013 -1.859 401.614 -1.941 333.897 -2.023 277.226 -2.104 205.009 -2.186 129.425 -2.268 73.717 -2.349 22.380 -2.368 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K555.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K555.rse deleted file mode 100644 index 86be8b8508..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K555.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - AMW K555 RASP.ENG file from Robert at AMW. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K560.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K560.eng deleted file mode 100644 index cebab5696f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K560.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -;AMW K560 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K560RR 54 430 100 0.75 1.5866 Animal_Motor_Works -0.023 229.13 -0.046 415.135 -0.059 485.264 -0.078 512.268 -0.106 525.67 -0.154 523.05 -0.211 528.39 -0.261 536.451 -0.369 560.734 -0.511 587.738 -0.657 603.86 -0.77 612.022 -1.096 625.75 -1.358 620.083 -1.627 612.022 -1.839 603.86 -2.057 590.459 -2.218 598.52 -2.335 609.301 -2.385 601.24 -2.407 585.018 -2.426 533.831 -2.467 385.511 -2.507 283.037 -2.542 164.441 -2.576 67.399 -2.595 29.653 -2.62 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K560.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K560.rse deleted file mode 100644 index 48a9c47033..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K560.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -AMW K560 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K570.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K570.eng deleted file mode 100644 index 7c32b5d2d5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K570.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -;Animal Motor Works K570 White Wolf -K570WW 54 492 0 0.9146 1.8151 AMW -0.020 364.42 -0.030 664.79 -0.051 751.47 -0.071 745.81 -0.096 705.25 -0.137 674.93 -0.284 661.38 -0.528 651.24 -0.913 644.51 -1.192 651.24 -1.430 651.24 -1.649 651.24 -1.872 644.51 -2.176 624.23 -2.318 600.64 -2.394 597.33 -2.455 546.63 -2.501 485.89 -2.562 421.84 -2.597 340.83 -2.638 266.54 -2.734 175.48 -2.836 97.86 -2.927 47.24 -3.040 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K570.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K570.rse deleted file mode 100644 index 8a5bad7536..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K570.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -AMW K570 RASP.ENG file made from NAR published data -File produced December 25, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K580.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K580.eng deleted file mode 100644 index 0d67f6e01b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K580.eng +++ /dev/null @@ -1,48 +0,0 @@ -;Created by Jesus Manuel Recuenco Andres 2011 -;with Tctracer v1.0 -K580 54.0 491.00 1000 0.89500 1.82300 Cesaroni - 0.02 624.92 - 0.03 1076.60 - 0.07 846.73 - 0.12 884.56 - 0.20 855.46 - 0.29 840.91 - 0.39 835.09 - 0.48 822.58 - 0.56 808.60 - 0.66 800.62 - 0.74 784.64 - 0.83 776.66 - 0.90 762.68 - 0.96 760.68 - 1.03 748.71 - 1.10 734.32 - 1.14 713.24 - 1.18 720.75 - 1.27 704.78 - 1.35 682.82 - 1.43 666.85 - 1.51 650.87 - 1.59 632.91 - 1.67 622.92 - 1.73 604.95 - 1.79 598.96 - 1.86 579.00 - 1.94 561.03 - 1.99 559.03 - 2.03 539.07 - 2.09 533.08 - 2.16 517.11 - 2.24 507.12 - 2.31 491.15 - 2.39 477.18 - 2.45 463.20 - 2.51 442.28 - 2.55 407.36 - 2.60 360.81 - 2.65 320.07 - 2.69 276.42 - 2.76 232.78 - 2.82 194.95 - 2.96 122.21 - 3.20 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600.eng deleted file mode 100644 index 0d1e531fe7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600.eng +++ /dev/null @@ -1,40 +0,0 @@ -; -; Animal Motor Works K600 RASP.ENG file made from NAR data -; File produced August 22, 2002 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -K600 75 368 P 1.2233 2.9129 AMW - 0.010 412.229 - 0.029 522.21 - 0.059 547.215 - 0.083 524.8 - 0.122 497.305 - 0.181 484.852 - 0.333 495.113 - 0.690 560.464 - 1.195 643.548 - 1.400 673.833 - 1.420 708.799 - 1.508 701.427 - 1.591 721.551 - 1.782 731.712 - 2.017 752.035 - 2.174 756.816 - 2.257 765.2 - 2.502 766.44 - 2.727 752.931 - 2.918 738.187 - 3.143 705.91 - 3.408 643.847 - 3.603 569.131 - 3.692 526.793 - 3.745 439.426 - 3.799 289.596 - 3.883 112.272 - 3.922 64.862 - 3.971 37.437 - 3.995 22.474 - 4.070 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600.rse deleted file mode 100644 index de0eb54c10..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -Animal Motor Works K600 RASP.ENG file made from NAR data -File produced August 22, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600_1.eng deleted file mode 100644 index 2d078aadba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K600_1.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -;Animal Motor Works K600 White Wolf -K600WW 75 368 0 1.2233 2.9129 AMW -0.010 412.229 -0.029 522.21 -0.059 547.215 -0.083 524.8 -0.122 497.305 -0.181 484.852 -0.333 495.113 -0.690 560.464 -1.195 643.548 -1.400 673.833 -1.420 708.799 -1.508 701.427 -1.591 721.551 -1.782 731.712 -2.017 752.035 -2.174 756.816 -2.257 765.2 -2.502 766.44 -2.727 752.931 -2.918 738.187 -3.143 705.91 -3.408 643.847 -3.603 569.131 -3.692 526.793 -3.745 439.426 -3.799 289.596 -3.883 112.272 -3.922 64.862 -3.971 37.437 -3.995 22.474 -4.070 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K605.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K605.eng deleted file mode 100644 index da7701a946..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K605.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -;AMW K605 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K605RR 75 368 100 1.231 2.7688 Animal_Motor_Works -0.03 165.845 -0.053 309.12 -0.077 361.916 -0.142 392.042 -0.527 501.412 -0.988 606.905 -1.515 682.37 -2.101 730.593 -2.355 737.58 -2.692 731.289 -3 712.497 -3.361 671.036 -3.503 663.479 -3.586 659.701 -3.645 633.353 -3.692 573 -3.734 444.838 -3.775 297.785 -3.828 162.066 -3.864 98.015 -3.905 41.471 -3.95 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K605.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K605.rse deleted file mode 100644 index 5a4b6fb4e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K605.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AMW K605 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K610.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K610.eng deleted file mode 100644 index 1a15953dff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K610.eng +++ /dev/null @@ -1,21 +0,0 @@ -; Skidmark -K610-SK 54 491 0 0.866 1.765 AMW/ProX -0.01 300 -0.02 745 -0.035 650 -0.06 560 -0.12 635 -0.21 670 -0.4 695 -0.7 700 -1 690 -1.35 665 -1.7 630 -2.05 585 -2.19 590 -2.24 500 -2.3 350 -2.4 205 -2.5 60 -2.6 15 -2.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K610.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K610.rse deleted file mode 100644 index 13eba8ff8f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K610.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K650.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K650.eng deleted file mode 100644 index e3789b207c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K650.eng +++ /dev/null @@ -1,38 +0,0 @@ -; Animal Motor Works 54-1750 -; AMW K650RR RASP.ENG file made from NAR published data -; File produced April 19, 2004 -; This file my be used or given away. All I ask is that this header -; is maintained to give credit to NAR S&T. Thank you, Jack Kane -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -K650RR 54 492 0 0.931 1.8087 AMW -0.022 308.257 -0.045 566.480 -0.058 620.440 -0.081 639.668 -0.135 639.668 -0.229 643.494 -0.351 662.823 -0.594 701.380 -0.810 724.434 -0.999 743.763 -1.151 751.220 -1.381 747.588 -1.610 736.001 -1.835 709.031 -2.073 685.876 -2.244 674.400 -2.334 682.051 -2.429 685.876 -2.469 666.648 -2.528 597.285 -2.573 481.714 -2.609 358.391 -2.631 250.471 -2.681 146.477 -2.721 65.507 -2.748 23.124 -2.770 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K650.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K650.rse deleted file mode 100644 index b5ffa7ed7d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K650.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -AMW K650 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K665.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K665.rse deleted file mode 100644 index 8d04058fa3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K665.rse +++ /dev/null @@ -1,58 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670.eng deleted file mode 100644 index 910d0dc711..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -; AMW K670 RASP.ENG file made from NAR published data -; File produced SEPT 4, 2002 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -K670 54 492 P- 1.0140 1.9145 AMW - 0.016 294.05 - 0.035 398.577 - 0.086 506.292 - 0.153 496.428 - 0.264 506.093 - 0.461 558.108 - 0.722 629.553 - 0.983 688.044 - 1.116 714.051 - 1.193 785.795 - 1.409 788.784 - 1.737 804.56 - 2.074 781.41 - 2.195 764.87 - 2.226 781.211 - 2.277 764.77 - 2.398 751.517 - 2.440 744.941 - 2.468 718.834 - 2.484 666.521 - 2.525 418.107 - 2.551 218.818 - 2.573 120.768 - 2.595 52.143 - 2.620 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670.rse deleted file mode 100644 index 974c7d7a60..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670.rse +++ /dev/null @@ -1,87 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670_1.eng deleted file mode 100644 index fecc65a97c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670_1.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -;Animal Motor Works K670 Green Gorilla -K670GG 54 492 0 1.0140 1.9145 AMW -0.016 294.05 -0.035 398.577 -0.086 506.292 -0.153 496.428 -0.264 506.093 -0.461 558.108 -0.722 629.553 -0.983 688.044 -1.116 714.051 -1.193 785.795 -1.409 788.784 -1.737 804.56 -2.074 781.41 -2.195 764.87 -2.226 781.211 -2.277 764.77 -2.398 751.517 -2.440 744.941 -2.468 718.834 -2.484 666.521 -2.525 418.107 -2.551 218.818 -2.573 120.768 -2.595 52.143 -2.620 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670_1.rse deleted file mode 100644 index f3bf721c2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K670_1.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -AMW K670 RASP.ENG file made from NAR published data -File produced SEPT 4, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700.eng deleted file mode 100644 index 5529b06f04..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;AMW K700 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -K700BB 54 430 100 0.754 1.4831 Animal_Motor_Works -0.014 359.559 -0.022 625.425 -0.03 737.756 -0.047 771.505 -0.082 786.516 -0.106 771.505 -0.144 775.233 -0.272 786.516 -0.477 812.71 -0.693 842.632 -0.97 847.06 -1.283 838.904 -1.516 816.438 -1.706 801.427 -1.779 793.972 -1.811 775.233 -1.841 726.573 -1.873 625.425 -1.909 509.367 -1.95 393.208 -1.982 337.093 -2.035 292.16 -2.073 228.489 -2.111 153.535 -2.155 86.137 -2.193 37.446 -2.24 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700.rse deleted file mode 100644 index 497e720dab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700.rse +++ /dev/null @@ -1,62 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700_1.rse deleted file mode 100644 index e5a478d2eb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K700_1.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -AMW K700 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K710.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K710.eng deleted file mode 100644 index aebb07b7f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K710.eng +++ /dev/null @@ -1,17 +0,0 @@ -K710-BB 54 491 0 0.902 1.812 AMW/ProX -0.01 500 -0.02 850 -0.025 910 -0.03 840 -0.06 860 -0.12 875 -0.2 875 -0.3 872 -1.1 815 -1.85 740 -1.95 720 -2.2 295 -2.37 280 -2.5 90 -2.6 20 -2.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K710.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K710.rse deleted file mode 100644 index 4a6765b671..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K710.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K800.eng deleted file mode 100644 index 19f99dedf5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K800.eng +++ /dev/null @@ -1,35 +0,0 @@ -; This file my be used or given away. All I ask is that this header -; is maintained to give credit to NAR S&T. Thank you, Jack Kane -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -K800BB 54 492 0 0.9140 1.7866 AMW -0.017 516.316 -0.035 745.845 -0.046 817.592 -0.090 860.560 -0.191 889.338 -0.270 908.424 -0.438 918.017 -0.689 945.892 -0.996 955.090 -1.325 922.713 -1.557 894.035 -1.726 874.949 -1.849 884.542 -1.920 894.035 -1.954 894.035 -1.984 855.863 -2.011 741.048 -2.049 592.859 -2.079 492.433 -2.113 430.280 -2.154 377.719 -2.196 329.854 -2.237 243.818 -2.275 152.986 -2.309 71.716 -2.339 33.465 -2.380 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K800.rse deleted file mode 100644 index f2f6129fe4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K800.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -AMW K800 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K855.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K855.rse deleted file mode 100644 index 70f45ac3e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K855.rse +++ /dev/null @@ -1,61 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K935.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K935.eng deleted file mode 100644 index 2595afbe2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K935.eng +++ /dev/null @@ -1,48 +0,0 @@ -;Created by Jesus Manuel Recuenco Andres 2011 -;with Tctracer v1.0 -K935 54.0 403.00 1000 0.73200 1.50800 Cesaroni - 0.01 1072.70 - 0.02 1043.71 - 0.04 974.21 - 0.07 1015.94 - 0.10 1029.21 - 0.14 1040.97 - 0.17 1049.51 - 0.22 1059.74 - 0.25 1064.00 - 0.29 1070.18 - 0.34 1072.70 - 0.39 1072.26 - 0.42 1069.80 - 0.45 1072.70 - 0.49 1069.80 - 0.52 1070.18 - 0.58 1064.00 - 0.64 1059.74 - 0.70 1055.30 - 0.76 1045.14 - 0.81 1035.01 - 0.85 1029.21 - 0.88 1022.20 - 0.91 1017.62 - 0.94 1014.72 - 0.97 1008.92 - 1.00 1003.42 - 1.06 985.72 - 1.12 965.87 - 1.16 950.93 - 1.21 936.66 - 1.26 919.04 - 1.30 903.29 - 1.34 890.05 - 1.38 876.17 - 1.43 861.06 - 1.48 846.96 - 1.51 719.71 - 1.54 619.58 - 1.56 510.26 - 1.58 415.14 - 1.60 295.72 - 1.63 181.49 - 1.66 66.76 - 1.70 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950.eng deleted file mode 100644 index 0ea38baa19..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -; AMW K950 RASP.ENG file made from NAR published data -; File produced SEPT 4, 2002 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -K950 54 492 P .8874 1.7949 AMW - 0.011 771.836 - 0.025 1204.520 - 0.039 1083.244 - 0.053 1158.054 - 0.067 1036.364 - 0.085 1110.176 - 0.099 1022.399 - 0.135 982.102 - 0.220 968.835 - 0.404 1010.430 - 0.566 1044.343 - 0.701 1079.254 - 0.867 1106.186 - 0.995 1134.115 - 1.211 1114.166 - 1.313 1101.199 - 1.430 1067.285 - 1.529 1020.404 - 1.579 993.772 - 1.642 892.430 - 1.674 818.119 - 1.717 757.273 - 1.738 621.918 - 1.766 466.313 - 1.791 351.306 - 1.823 249.864 - 1.865 175.553 - 1.908 87.696 - 1.943 33.654 - 1.970 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950.rse deleted file mode 100644 index 26b74ea39d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -AMW K950 RASP.ENG file made from NAR published data -File produced SEPT 4, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950_1.eng deleted file mode 100644 index 78854cc821..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K950_1.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Animal Motor Works K950 Super Tiger -K950ST 54 492 0 .8874 1.7949 AMW -0.011 771.836 -0.025 1204.520 -0.039 1083.244 -0.053 1158.054 -0.067 1036.364 -0.085 1110.176 -0.099 1022.399 -0.135 982.102 -0.220 968.835 -0.404 1010.430 -0.566 1044.343 -0.701 1079.254 -0.867 1106.186 -0.995 1134.115 -1.211 1114.166 -1.313 1101.199 -1.430 1067.285 -1.529 1020.404 -1.579 993.772 -1.642 892.430 -1.674 818.119 -1.717 757.273 -1.738 621.918 -1.766 466.313 -1.791 351.306 -1.823 249.864 -1.865 175.553 -1.908 87.696 -1.943 33.654 -1.970 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K975.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K975.eng deleted file mode 100644 index 1d4be1643f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K975.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;Animal Motor Works K975 White Wolf -K975WW 54 728 0 1.357 2.5985 AMW -0.017 526.644 -0.029 901.850 -0.038 1098.918 -0.046 1151.722 -0.076 1112.867 -0.130 1060.063 -0.219 1053.089 -0.336 1053.089 -0.479 1059.066 -0.609 1091.944 -0.866 1136.778 -1.046 1176.630 -1.164 1175.634 -1.202 1228.437 -1.239 1208.511 -1.315 1215.486 -1.353 1267.293 -1.387 1228.437 -1.487 1241.389 -1.538 1260.319 -1.634 1290.900 -1.723 1281.241 -1.794 1266.297 -1.836 1207.515 -1.933 1049.103 -1.992 851.437 -2.080 666.923 -2.118 640.521 -2.193 462.582 -2.269 212.311 -2.378 119.854 -2.510 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K975.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K975.rse deleted file mode 100644 index ea3c4326b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_K975.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -AMW K975 RASP.ENG file made from NAR published data -File produced December 25, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060.eng deleted file mode 100644 index b382e11fdc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -; AMW L1060 RASP.ENG file made from NAR published data -; File produced August 22, 2002 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -L1060 75 497 P- 1.9188 3.9388 AMW - 0.020 258.773 - 0.024 368.235 - 0.032 328.386 - 0.076 427.96 - 0.100 567.284 - 0.116 751.352 - 0.128 791.202 - 0.169 816.071 - 0.225 816.071 - 0.309 875.795 - 0.518 985.257 - 0.763 1079.639 - 1.024 1174.519 - 1.308 1229.45 - 1.606 1288.375 - 1.782 1298.25 - 1.983 1293.369 - 2.256 1239.437 - 2.525 1184.506 - 2.822 1129.576 - 3.038 1069.651 - 3.111 1044.683 - 3.135 995.145 - 3.183 835.946 - 3.239 552.303 - 3.299 268.661 - 3.327 164.193 - 3.339 84.593 - 3.360 44.783 - 3.400 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060.rse deleted file mode 100644 index 06663015ba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -AMW L1060 RASP.ENG file made from NAR published data -File produced August 22, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060_1.eng deleted file mode 100644 index 4f83de1340..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1060_1.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Animal Motor Works L1060 Green Gorilla -L1060GG 75 497 0 1.9188 3.9388 AMW -0.020 258.773 -0.024 368.235 -0.032 328.386 -0.076 427.96 -0.100 567.284 -0.116 751.352 -0.128 791.202 -0.169 816.071 -0.225 816.071 -0.309 875.795 -0.518 985.257 -0.763 1079.639 -1.024 1174.519 -1.308 1229.45 -1.606 1288.375 -1.782 1298.25 -1.983 1293.369 -2.256 1239.437 -2.525 1184.506 -2.822 1129.576 -3.038 1069.651 -3.111 1044.683 -3.135 995.145 -3.183 835.946 -3.239 552.303 -3.299 268.661 -3.327 164.193 -3.339 84.593 -3.360 44.783 -3.400 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1080.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1080.eng deleted file mode 100644 index 985fc4ec4d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1080.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;AMW L1080 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -L1080BB 75 497 100 1.717 3.5922 Animal_Motor_Works -0.024 406.295 -0.043 812.489 -0.052 895.202 -0.088 929.641 -0.314 991.55 -0.626 1087.69 -0.988 1163.44 -1.346 1218.99 -1.638 1246.25 -1.864 1257.91 -2.247 1254.84 -2.6 1218.99 -2.766 1211.92 -2.851 1197.78 -2.942 1204.85 -3.002 1226.06 -3.033 1204.85 -3.089 1040.23 -3.124 874.499 -3.15 660.999 -3.191 461.336 -3.232 275.408 -3.268 144.622 -3.303 75.744 -3.339 41.316 -3.39 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1080.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1080.rse deleted file mode 100644 index 2f5d497e1d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1080.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - -AMW L1080 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1100.eng deleted file mode 100644 index 7ab349dcfa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1100.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;AMW L1100 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -L1100RR 75 728 100 1.346 2.5881 Animal_Motor_Works -0.013 681.489 -0.029 1116.88 -0.041 1196.3 -0.079 1210.38 -0.147 1203.34 -0.257 1218.42 -0.366 1225.45 -0.567 1254.61 -0.824 1282.76 -1.059 1311.91 -1.267 1340.23 -1.459 1311.91 -1.622 1297.84 -1.713 1290.8 -1.785 1268.68 -1.83 1218.42 -1.886 1080.69 -1.969 819.214 -2.048 558.24 -2.108 376.985 -2.156 246.498 -2.205 144.963 -2.269 72.501 -2.35 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1100.rse deleted file mode 100644 index b31aa972d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1100.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -AMW L1100 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1111.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1111.eng deleted file mode 100644 index e8b36e8610..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1111.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -;L1111ST entered by Tim Van Milligan -;For RockSim - http://www.rocksim.com -;Based on TRA Certification paperwork from 06-01-2002 -;Initial Mass from Jim Robinson at AMW -;Not approved by TRA or AMW. -L1111ST 75 497 100 1.642 3.517 Animal_Motor_Works -0.015 1023.97 -0.1 924.878 -0.147 902.857 -0.502 1034.98 -0.75 1156.1 -1.005 1266.2 -1.229 1354.29 -1.492 1398.33 -1.739 1398.33 -2.009 1354.29 -2.272 1244.18 -2.504 1123.07 -2.728 968.92 -2.782 902.857 -2.836 770.732 -2.98 363.345 -3.053 99.094 -3.083 22.021 -3.14 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1111.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1111.rse deleted file mode 100644 index c1c41a52fe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1111.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - -L1111ST entered by Tim Van Milligan -For RockSim - http://www.rocksim.com -Based on TRA Certification paperwork from 06-01-2002 -Initial Mass from Jim Robinson at AMW -Not approved by TRA or AMW. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1276.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1276.eng deleted file mode 100644 index 0048f388a8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1276.eng +++ /dev/null @@ -1,24 +0,0 @@ -; AMX/ProX 2729L1276 RR -L1276RR 54 728 P 1.475 2.96 AMW - 0.015 76.924 - 0.017 692.317 - 0.026 1495.003 - 0.037 1244.164 - 0.052 1401.357 - 0.084 1307.71 - 0.127 1307.71 - 0.181 1367.911 - 0.289 1401.357 - 0.384 1408.046 - 0.807 1421.424 - 0.993 1461.558 - 1.215 1491.659 - 1.673 1474.936 - 1.727 1384.634 - 1.798 1083.627 - 1.947 531.78 - 1.986 351.175 - 2.047 177.26 - 2.092 93.647 - 2.144 33.445 - 2.185 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1276.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1276.rse deleted file mode 100644 index 47a1b0e3d8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1276.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - AMX/ProX 2729L1276 RR - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1290.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1290.eng deleted file mode 100644 index 0020182078..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1290.eng +++ /dev/null @@ -1,21 +0,0 @@ -; ABC-76-6000 4701L1290-SK P -L1290-SK 76 785 P 3.047 5.399 CTI - 0.022 117.623 - 0.081 786.023 - 0.11 797.226 - 0.176 1226.645 - 0.691 1357.337 - 1.231 1461.891 - 1.761 1476.828 - 2.008 1467.493 - 2.311 1417.082 - 2.835 1299.459 - 3.101 1235.98 - 3.167 1230.379 - 3.34 1321.863 - 3.373 1286.39 - 3.532 365.94 - 3.602 201.64 - 3.734 91.485 - 3.782 69.08 - 3.8 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1290.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1290.rse deleted file mode 100644 index 19fbd18f86..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1290.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - ABC-76-6000 4701L1290-SK P - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1300.eng deleted file mode 100644 index f36b59f8d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1300.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;AMW L1300 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -L1300BB 75 728 100 1.314 2.5454 Animal_Motor_Works -0.014 710.467 -0.025 1247.64 -0.039 1384.13 -0.053 1447.83 -0.074 1420.53 -0.12 1447.83 -0.276 1474.12 -0.475 1519.61 -0.712 1555 -0.942 1586.74 -1.147 1562.08 -1.36 1534.78 -1.484 1551.97 -1.537 1551.97 -1.569 1497.37 -1.59 1406.38 -1.604 1451.87 -1.615 1333.58 -1.64 1168.78 -1.689 986.687 -1.753 767.749 -1.824 512.503 -1.891 275.512 -1.933 147.816 -1.987 74.737 -2.06 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1300.rse deleted file mode 100644 index 45832fc625..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1300.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - -AMW L1300 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1400.eng deleted file mode 100644 index b83ca81c8d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1400.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @File: SK-75-6000.txt, @Pts-I: 3609, @Pts-O: 31, @Sm: 6, @CO: 5% -; @TI: 4740.56, @TIa: 4732.91, @TIe: 0.0%, @ThMax: 1908.398, @ThAvg: 1382.678, @Tb: 3.423 -; Exported using ThrustCurveTool, www.ThrustGear.com, by John DeMar -L1400SK 75 785 P 2.8267 5.1985 AMW - 0.0 68.1234 - 0.0040 193.7893 - 0.016 690.259 - 0.021 814.579 - 0.027 900.741 - 0.045 997.475 - 0.076 1251.156 - 0.092 1354.553 - 0.107 1405.971 - 0.132 1440.082 - 0.169 1453.774 - 0.368 1397.446 - 0.525 1411.875 - 0.705 1488.288 - 1.082 1734.489 - 1.414 1906.629 - 1.556 1875.238 - 1.766 1882.261 - 1.899 1803.008 - 2.142 1745.497 - 2.34 1659.082 - 2.504 1522.458 - 2.58 1402.287 - 2.819 844.839 - 2.847 841.674 - 2.893 730.795 - 3.068 406.536 - 3.176 265.8 - 3.425 94.9644 - 3.608 0.874524 - 3.609 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1400.rse deleted file mode 100644 index 3c68eaed8b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L1400.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -@File: SK-75-6000.txt, @Pts-I: 3609, @Pts-O: 31, @Sm: 6, @CO: 5% -@TI: 4740.56, @TIa: 4732.91, @TIe: 0.0%, @ThMax: 1908.398, @ThAvg: 1382.678, @Tb: 3.423 -Exported using ThrustCurveTool, www.ThrustGear.com, by John DeMar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L666.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L666.eng deleted file mode 100644 index 7379b8926e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L666.eng +++ /dev/null @@ -1,34 +0,0 @@ -;Animal Motor Works 75-3500 -L666SK 75 497 0 1.8877 3.5344 AMW -0.096 105.880 -0.175 509.783 -0.312 549.481 -0.449 577.319 -0.586 602.900 -0.722 615.605 -0.859 632.540 -0.996 652.072 -1.133 671.418 -1.270 685.671 -1.407 701.286 -1.543 718.069 -1.680 734.116 -1.817 753.292 -1.954 771.589 -2.091 790.453 -2.228 819.222 -2.364 846.663 -2.501 874.629 -2.638 890.083 -2.775 898.271 -2.912 899.312 -3.049 881.683 -3.185 845.157 -3.322 768.451 -3.459 672.771 -3.596 525.466 -3.733 304.694 -3.870 86.663 -3.968 0.000 -; -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L666.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L666.rse deleted file mode 100644 index 4129f3d163..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L666.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -Animal Motor Works 75-3500 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L700.eng deleted file mode 100644 index 0f7f0ce388..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L700.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -; -L700BB 75.0 368.00 100 1.19310 2.73200 AMW - 0.02 221.87 - 0.03 399.33 - 0.05 467.56 - 0.08 494.89 - 0.13 498.41 - 0.24 535.99 - 0.48 614.67 - 0.77 683.20 - 1.23 755.25 - 1.62 789.72 - 1.92 810.42 - 2.26 821.14 - 2.58 817.85 - 2.91 801.07 - 3.14 773.94 - 3.25 750.13 - 3.32 743.39 - 3.37 729.83 - 3.42 688.83 - 3.46 593.37 - 3.50 484.14 - 3.53 368.18 - 3.57 248.80 - 3.62 149.82 - 3.66 61.13 - 3.72 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L700.rse deleted file mode 100644 index ac9ca3b89b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L700.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777.eng deleted file mode 100644 index 0e6c65c56b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777.eng +++ /dev/null @@ -1,40 +0,0 @@ -; -; AMW L777 RASP.ENG file made from NAR published data -; File produced SEPT 4, 2002 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -L777 75 497 P 1.7623 3.6987 AMW - 0.025 140.882 - 0.064 209.474 - 0.108 360.055 - 0.204 652.185 - 0.360 641.518 - 0.373 693.745 - 0.418 683.28 - 0.528 730.073 - 0.670 761.268 - 0.761 781.998 - 0.787 802.828 - 0.871 802.728 - 1.065 854.754 - 1.338 911.811 - 1.668 963.636 - 1.914 989.498 - 2.115 1000.16 - 2.368 962.831 - 2.647 926 - 2.985 878.603 - 3.303 805.143 - 3.472 752.815 - 3.550 705.72 - 3.602 648.26 - 3.647 611.631 - 3.693 512.409 - 3.779 334.897 - 3.857 178.216 - 3.935 89.379 - 3.981 26.687 - 4.050 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777.rse deleted file mode 100644 index 9dc7734d07..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -AMW L777 RASP.ENG file made from NAR published data -File produced SEPT 4, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777_1.eng deleted file mode 100644 index a908a0d0df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L777_1.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -;Animal Motor Works L777 White Wolf -L777WW 75 497 0 1.7623 3.6987 AMW -0.025 140.882 -0.064 209.474 -0.108 360.055 -0.204 652.185 -0.360 641.518 -0.373 693.745 -0.418 683.28 -0.528 730.073 -0.670 761.268 -0.761 781.998 -0.787 802.828 -0.871 802.728 -1.065 854.754 -1.338 911.811 -1.668 963.636 -1.914 989.498 -2.115 1000.16 -2.368 962.831 -2.647 926 -2.985 878.603 -3.303 805.143 -3.472 752.815 -3.550 705.72 -3.602 648.26 -3.647 611.631 -3.693 512.409 -3.779 334.897 -3.857 178.216 -3.935 89.379 -3.981 26.687 -4.050 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L900.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L900.eng deleted file mode 100644 index 4299eed0ba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L900.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -;AMW L900 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -L900RR 75 497 100 1.771 3.5888 Animal_Motor_Works -0.029 464.292 -0.053 630.937 -0.059 684.506 -0.096 702.328 -0.133 696.387 -0.201 714.311 -0.486 803.524 -0.777 910.661 -1.099 988.093 -1.26 1041.16 -1.284 1071.37 -1.378 1053.24 -1.607 1101.57 -1.917 1142.86 -2.208 1173.56 -2.413 1160.98 -2.624 1107.62 -2.866 976.211 -3.053 886.897 -3.208 839.27 -3.314 827.388 -3.382 809.465 -3.432 720.252 -3.495 547.564 -3.57 345.273 -3.627 214.273 -3.714 77.382 -3.79 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L900.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L900.rse deleted file mode 100644 index 16b3af9222..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L900.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -AMW L900 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L985.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L985.rse deleted file mode 100644 index c80564c7f1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_L985.rse +++ /dev/null @@ -1,56 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1350.eng deleted file mode 100644 index c3799a6d25..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1350.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -;Animal Motor Works M1350 White Wolf -M1350WW 75 781 0 2.92700 5.40300 AMW -0.03 1197.771588 -0.04 1465.181058 -0.07 1660.167131 -0.09 1665.738162 -0.16 1587.743733 -0.45 1587.743733 -0.61 1576.601671 -1.86 1649.02507 -2.27 1643.454039 -2.64 1598.885794 -3.18 1504.178273 -3.29 1353.760446 -3.41 991.643454 -3.49 841.2256267 -3.62 646.2395543 -3.74 428.9693593 -3.90 373.2590529 -4.22 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1350.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1350.rse deleted file mode 100644 index 91e75a0f66..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1350.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -Animal Motor Works M1350 RASP.ENG file made from NAR data -File produced Nov 3, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1480.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1480.eng deleted file mode 100644 index 10efe8a795..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1480.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -;AMW M1480 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -M1480RR 75 785 100 3 5.5248 Animal_Motor_Works -0.022 713.002 -0.032 1254.68 -0.055 1473.37 -0.078 1569.11 -0.156 1569.11 -0.352 1559.03 -0.642 1597.33 -0.974 1644.69 -1.289 1702.13 -1.52 1739.42 -1.918 1796.87 -2.279 1814.83 -2.481 1796.87 -2.707 1739.42 -2.968 1644.69 -3.058 1616.47 -3.135 1520.73 -3.218 1378.64 -3.284 1217.39 -3.332 1065.22 -3.344 1140.8 -3.368 1016.85 -3.41 741.522 -3.5 522.935 -3.613 275.727 -3.691 171.12 -3.768 66.553 -3.85 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1480.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1480.rse deleted file mode 100644 index 5f62dcafb4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1480.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -AMW M1480 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1630.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1630.eng deleted file mode 100644 index 3fac301f43..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1630.eng +++ /dev/null @@ -1,19 +0,0 @@ -; AMW75-7600 8212M1630-TT/DT P -M1630-TT 75 1039 P 4.349 7.237 CTI - 0.0030 147.481 - 0.032 2040.948 - 0.078 3235.069 - 0.158 3368.278 - 0.463 3258.856 - 0.647 2992.439 - 0.949 2697.477 - 1.052 2040.948 - 1.101 1883.952 - 1.392 1907.739 - 1.786 1812.59 - 3.6 1327.33 - 3.899 875.372 - 4.595 347.294 - 4.857 195.056 - 4.891 166.511 - 4.9 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1630.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1630.rse deleted file mode 100644 index 40587d748e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1630.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - AMW75-7600 8212M1630-TT/DT P - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1730.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1730.eng deleted file mode 100644 index 5c636e2240..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1730.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;Animal Motor Works 98-11000 -M1730SK 98 870 0 4.9452 9.8718 AMW -0.040 682.642 -0.064 1153.387 -0.221 1354.665 -0.269 1414.771 -0.381 1458.026 -0.541 1526.924 -0.701 1589.200 -0.861 1675.203 -1.021 1732.669 -1.181 1802.227 -1.341 1886.644 -1.500 1973.713 -1.660 2070.514 -1.820 2183.822 -1.980 2299.313 -2.140 2433.862 -2.300 2568.119 -2.460 2679.423 -2.620 2638.376 -2.780 2484.185 -2.940 2306.038 -3.099 2173.849 -3.259 2074.688 -3.419 1961.303 -3.579 1807.810 -3.739 1640.258 -3.899 1303.035 -4.059 940.600 -4.219 567.152 -4.379 309.143 -4.539 188.981 -4.637 0.000 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1730.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1730.rse deleted file mode 100644 index 424e0f0755..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1730.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850.eng deleted file mode 100644 index 72764e00bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; Animal Motor Works M1850GG -; estimated from TRA graph by John DeMar jsdemar@syr.edu -; motor mass is a guess based on similar types -M1850GG 75 781 0 3.3750 4.5000 AMW - 0.08 979.00 - 0.13 1180.00 - 0.28 1290.00 - 0.33 1468.00 - 0.73 1936.00 - 1.33 2202.00 - 1.73 2279.00 - 2.58 2105.00 - 2.83 2007.00 - 2.88 1860.00 - 3.08 538.00 - 3.20 174.00 - 3.30 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850.rse deleted file mode 100644 index 20463f7073..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -M1850GG entered by Tim Van Milligan -For RockSim - http://www.rocksim.com -Based on TRA Certification paperwork from 06-01-2002 -Initial Mass from Jim Robinson at AMW -Not approved by TRA or AMW. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850_1.eng deleted file mode 100644 index 48a109a314..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1850_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; -;Animal Motor Works M1850 Green Gorilla -M1850GG 75 781 0 3.37000 5.85100 AMW -0.12 1201.01994 -0.25 1321.121934 -0.37 1579.11881 -0.50 1699.220804 -0.62 1846.01213 -0.75 1930.528348 -0.87 1997.251678 -1.00 2059.526786 -1.12 2126.250116 -1.25 2192.973446 -1.37 2224.111 -1.50 2246.35211 -1.62 2268.59322 -1.75 2277.489664 -1.87 2268.59322 -2.00 2246.35211 -2.12 2224.111 -2.25 2192.973446 -2.37 2166.284114 -2.50 2144.043004 -2.62 2099.560784 -2.75 2046.18212 -2.87 1912.73546 -3.00 831.817514 -3.12 311.37554 -3.25 84.516218 -3.3 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1900.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1900.eng deleted file mode 100644 index 8b85d34e94..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1900.eng +++ /dev/null @@ -1,38 +0,0 @@ -; -;AMW M1900 RASP.ENG file made from NAR published data -;File produced April 19, 2004 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -M1900BB 75 785 100 2.733 5.4225 Animal_Motor_Works -0.018 1109.21 -0.044 1761.75 -0.061 1910.65 -0.085 1938.62 -0.159 1929.63 -0.29 1956.62 -0.409 2031.56 -0.438 1974.6 -0.569 2011.58 -0.815 2104.51 -1.073 2197.44 -1.401 2280.39 -1.688 2324.7 -1.905 2297.37 -2.073 2241.41 -2.254 2138.49 -2.397 2063.54 -2.479 2016.57 -2.54 2025.57 -2.581 2006.58 -2.63 1885.67 -2.716 1493.94 -2.805 1120.21 -2.887 840.605 -2.972 569.996 -3.046 299.488 -3.119 150.193 -3.168 56.829 -3.23 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1900.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1900.rse deleted file mode 100644 index 9c35fbd9b9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M1900.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - -AMW M1900 RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2050.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2050.eng deleted file mode 100644 index ca86e60e0c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2050.eng +++ /dev/null @@ -1,16 +0,0 @@ -; AMX75-7600 6774-M2050-SK P -M2050-BS 75 1039 P 4.172 7.1290000000000004 ABC - 0.038 2152.81 - 0.833 2506.091 - 1.189 2539.211 - 1.546 2500.571 - 1.775 2415.011 - 1.907 2279.77 - 2.168 2086.569 - 2.401 1973.409 - 2.616 1909.929 - 2.776 1871.288 - 2.918 1203.365 - 3.056 706.563 - 3.309 135.241 - 3.4 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2050.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2050.rse deleted file mode 100644 index 618abfc697..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2050.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - AMX75-7600 6774-M2050-SK P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2200.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2200.rse deleted file mode 100644 index 1b31ebf5fb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2200.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -AMW M2200SK RASP.ENG file made from NAR published data -File produced April 19, 2004 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2500.eng deleted file mode 100644 index 6634e31193..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2500.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Animal Motor Works M2500 Green Gorilla -M2500GG 75 1039 0 4.248 7.5515 AMW -0.026 1288.791 -0.053 2021.398 -0.079 2140.011 -0.123 2105.125 -0.207 2117.086 -0.540 2309.458 -0.971 2560.637 -1.265 2727.094 -1.480 2836.736 -1.678 2920.462 -1.757 2980.267 -1.946 2995.51 -2.047 2959.335 -2.240 2889.563 -2.310 2854.677 -2.486 2820.788 -2.526 2880.593 -2.592 2773.941 -2.653 2821.785 -2.706 2752.012 -2.758 2752.012 -2.807 2763.973 -2.842 2504.82 -2.886 2115.092 -2.930 1630.674 -2.987 1051.565 -3.040 437.571 -3.057 284.072 -3.079 142.434 -3.110 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2500.rse deleted file mode 100644 index c5a94b52ba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M2500.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -Animal Motor Works M2500 RASP.ENG file made from NAR data -File produced DEC 25, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M3000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M3000.eng deleted file mode 100644 index c5b66cedab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M3000.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; Animal Motor Works M3000ST -; estimated from TRA graph by Rob Bazinet rbazinet66@hotmail.com -; motor mass is a guess based on similar types -M3000ST 75 1038 0 3.8190 6.72 AMW - 0.032 2494.225 - 0.113 2621.05 - 0.242 2705.6 - 0.355 2811.288 - 0.435 2895.838 - 0.5 2959.25 - 0.645 3128.35 - 0.75 3297.45 - 0.871 3382 - 0.968 3551.1 - 1.032 3656.788 - 1.145 3804.75 - 1.355 3973.85 - 1.452 4037.263 - 1.629 4079.538 - 1.742 4142.95 - 1.903 4185.225 - 1.935 3847.025 - 2.081 3424.275 - 2.129 2959.25 - 2.177 2536.5 - 2.194 2113.75 - 2.226 1691 - 2.274 1268.25 - 2.323 845.5 - 2.403 422.75 - 2.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M3000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M3000.rse deleted file mode 100644 index b5ba1c5f9f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_M3000.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -AMW M3000ST RASP.ENG file made from Tripoli published data -File produced May 15, 2004 -This file my be used or given away. All I ask is that this header -is maintained to give credit to the people who produced the data. -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2020.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2020.eng deleted file mode 100644 index d26216d18b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2020.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;Animal Motor Works 98-11000 -N2020WT 98 870 0 5.1609 9.9693 AMW -.106 1941.344 -0.221 2151.149 -0.381 2253.406 -0.541 2340.792 -0.701 2400.847 -0.861 2453.821 -1.021 2506.314 -1.181 2556.306 -1.341 2607.251 -1.500 2652.790 -1.660 2688.660 -1.820 2710.675 -1.980 2729.797 -2.140 2733.895 -2.300 2704.255 -2.460 2634.582 -2.620 2532.160 -2.780 2433.380 -2.940 2329.740 -3.099 2234.246 -3.259 2165.804 -3.419 2099.684 -3.579 2028.350 -3.739 1951.013 -3.899 1871.316 -4.059 1558.113 -4.219 1053.376 -4.379 890.506 -4.539 636.689 -4.998 0.000 - -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2020.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2020.rse deleted file mode 100644 index 63869eede4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2020.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -Animal Motor Works 98-11000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2600.eng deleted file mode 100644 index 93afa680c8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2600.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -;Animal Motor Works 98-11000 -N2600GG 98 870 1000 4.8812 10.4726 Animal_Motor_Works -0.024 1674.37 -0.064 1949.62 -0.104 2039.52 -0.306 2189.98 -0.508 2334.45 -0.709 2491.23 -0.911 2668.93 -1.113 2874.7 -1.314 3038.83 -1.516 3191.29 -1.718 3266.01 -1.92 3318.98 -2.121 3336.18 -2.323 3229.26 -2.525 3089.68 -2.726 2943.98 -2.928 2847.69 -3.13 2751.68 -3.331 2682.22 -3.533 2463.48 -3.735 1339.63 -3.937 269.834 -4.034 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2600.rse deleted file mode 100644 index 37e6a9b7b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2600.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - -Animal Motor Works 98-11000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2700.eng deleted file mode 100644 index 56d7f9075b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2700.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -;Animal Motor Works 98-11000 -N2700BB 98 870 1000 4.7837 9.9308 Animal_Motor_Works -0.027 2229.53 -0.069 2476.18 -0.111 2539.74 -0.36 2723.21 -0.527 2863.83 -0.735 3016.48 -0.943 3141.25 -1.151 3241.72 -1.359 3335.56 -1.567 3519.92 -1.775 3425.88 -1.983 3420.56 -2.191 3356.08 -2.399 3270.48 -2.607 3182.6 -2.815 3098.31 -3.023 3002.95 -3.231 2888.73 -3.439 2266.61 -3.647 1498.26 -3.855 780.04 -4.063 233.545 -4.16 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2700.rse deleted file mode 100644 index cd00fa9588..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2700.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - -Animal Motor Works 98-11000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2800.eng deleted file mode 100644 index 1c5f9542bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2800.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @File: N2800b.txt, @Pts-I: 5383, @Pts-O: 31, @Sm: 8, @CO: 5% -; @TI: 14810.26, @TIa: 14792.71, @TIe: 0.0%, @ThMax: 3650.74, @ThAvg: 2770.17, @Tb: 5.34 -; Exported using ThrustCurveTool, www.ThrustGear.com, by John DeMar -N2800 98 1213 100 7.6947 13.8 AMW - 0.0 93.0947 - 0.0020 168.347 - 0.0060 387.836 - 0.019 1271.166 - 0.029 1776.342 - 0.043 2298.6 - 0.062 2841.03 - 0.072 3021.31 - 0.084 3128.89 - 0.14 3296.17 - 0.277 3483.35 - 0.293 3431.67 - 0.369 3495.76 - 0.978 3598.65 - 1.973 3655.16 - 2.977 3534.8 - 3.3 3437.12 - 3.497 3308.46 - 3.583 3193.8 - 3.651 3015.65 - 3.748 2548.37 - 3.836 2223.91 - 4.109 1644.077 - 4.245 1443.685 - 4.272 1447.012 - 4.397 1163.584 - 4.489 1022.953 - 4.516 1057.203 - 4.574 883.885 - 4.647 776.407 - 5.569 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2800.rse deleted file mode 100644 index 9d8b315df9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N2800.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -@File: N2800b.txt, @Pts-I: 5383, @Pts-O: 31, @Sm: 8, @CO: 5% -@TI: 14810.26, @TIa: 14792.71, @TIe: 0.0%, @ThMax: 3650.74, @ThAvg: 2770.17, @Tb: 5.34 -Exported using ThrustCurveTool, www.ThrustGear.com, by John DeMar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N4000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N4000.eng deleted file mode 100644 index e001573c9d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N4000.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -;Animal Motor Works 98-17500 -N4000BB 98 1213 0 6.1026 13.6683 AMW -0.029 4207.591 -0.071 4709.549 -0.113 4906.310 -0.155 5007.780 -0.239 5041.557 -0.323 4993.595 -0.534 5046.912 -0.744 5145.819 -0.954 5248.063 -1.165 5293.196 -1.375 5232.456 -1.585 5209.528 -1.796 5165.473 -2.006 5047.698 -2.216 4913.086 -2.427 4783.447 -2.637 4659.163 -2.847 4195.994 -3.058 2850.731 -3.268 1981.973 -3.478 1295.536 -3.689 907.699 -3.899 490.196 -4.110 316.338 -4.207 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N4000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N4000.rse deleted file mode 100644 index e86d54c30f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AMW_N4000.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_C3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_C3.eng deleted file mode 100644 index d7f6c7152b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_C3.eng +++ /dev/null @@ -1,31 +0,0 @@ -; Aerotech C3.4-PT RASP.ENG file made from NAR published data -; File produced, 2013 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -C3.4 18 72 0, .0052 .0239 A -0.023 3.188 -0.028 5.669 -0.093 9.080 -0.235 8.208 -0.427 6.881 -0.513 6.188 -0.600 5.438 -0.666 4.803 -0.762 3.649 -0.838 2.668 -0.970 2.149 -1.228 1.918 -1.522 1.918 -1.800 1.860 -2.013 1.745 -2.068 2.034 -2.134 1.803 -2.326 1.803 -2.509 1.745 -2.645 1.687 -2.721 1.457 -2.807 0.879 -2.860 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D10.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D10.eng deleted file mode 100644 index 06dc100ea4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D10.eng +++ /dev/null @@ -1,24 +0,0 @@ -D10 18 70 7 0.009800000000000001 0.0259 AT - 0.0070 23.0 - 0.018 25.0 - 0.027 20.25 - 0.066 20.25 - 0.073 18.5 - 0.094 20.25 - 0.112 20.75 - 0.137 19.75 - 0.163 21.5 - 0.202 20.75 - 0.231 20.75 - 0.254 22.75 - 0.27 20.75 - 0.504 20.0 - 0.536 18.25 - 0.607 17.0 - 0.687 14.75 - 0.751 14.25 - 0.84 11.25 - 0.998 8.25 - 1.024 8.25 - 1.248 2.5 - 1.385 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D13.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D13.eng deleted file mode 100644 index eec171aa8b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D13.eng +++ /dev/null @@ -1,40 +0,0 @@ -; Aerotech D13 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/29/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -D13W 18 70 4-7-10 0.0098 0.0326 AT - 0.030 13.462 - 0.061 21.171 - 0.085 20.618 - 0.127 21.605 - 0.158 21.042 - 0.182 22.306 - 0.217 22.592 - 0.227 23.610 - 0.248 21.891 - 0.279 23.155 - 0.317 22.039 - 0.366 21.338 - 0.383 21.901 - 0.449 20.648 - 0.462 21.486 - 0.480 19.947 - 0.507 19.947 - 0.521 20.509 - 0.559 18.693 - 0.580 19.118 - 0.660 17.578 - 0.743 15.337 - 0.861 12.406 - 0.947 9.329 - 1.068 5.834 - 1.155 4.158 - 1.172 4.720 - 1.231 2.762 - 1.328 1.928 - 1.404 1.093 - 1.520 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D13.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D13.rse deleted file mode 100644 index f079eea1b5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D13.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D15.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D15.eng deleted file mode 100644 index c863bf2219..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D15.eng +++ /dev/null @@ -1,26 +0,0 @@ -; Aerotech D15 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/29/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -D15T 24 70 4-6-8 .0089 .0440 AT - 0.014 11.480 - 0.049 26.272 - 0.081 30.087 - 0.107 31.261 - 0.121 31.249 - 0.159 31.360 - 0.208 31.249 - 0.283 29.583 - 0.439 23.353 - 0.551 18.484 - 0.675 13.430 - 0.863 6.422 - 0.938 3.892 - 1.010 2.335 - 1.085 0.778 - 1.142 0.389 - 1.150 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D15.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D15.rse deleted file mode 100644 index d6c3dc1ac6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D15.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D2.eng deleted file mode 100644 index 7d6ad4e717..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D2.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Aerotech D2.3-PT RASP.ENG file made from NAR published data -; File produced, 2013 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -D2.3 18 72 0, .0107 .0293 A -0.020 5.071 -0.039 9.478 -0.093 10.140 -0.184 9.478 -0.275 8.429 -0.438 6.820 -0.657 4.372 -0.747 3.392 -0.838 2.413 -1.056 2.064 -1.365 1.923 -1.892 1.783 -2.528 1.713 -2.946 1.713 -3.219 1.643 -4.091 1.573 -4.727 1.573 -5.218 1.573 -5.636 1.573 -6.217 1.573 -6.726 1.433 -7.199 1.503 -7.635 1.363 -7.907 1.224 -8.016 0.734 -8.140 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D21.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D21.eng deleted file mode 100644 index 7dcc85ac27..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D21.eng +++ /dev/null @@ -1,33 +0,0 @@ -;Aerotech D21 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;Submitted to ThrustCurve.org by Chris Kobel (3/29/07) -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -D21T 18 70 4-7 0.0096 0.025 AT - 0.01 1.367 - 0.021 19.367 - 0.029 32.12 - 0.037 31.667 - 0.051 30.528 - 0.094 30.074 - 0.115 31.213 - 0.133 30.074 - 0.177 30.76 - 0.189 29.842 - 0.203 30.528 - 0.226 29.842 - 0.275 28.935 - 0.296 29.389 - 0.331 28.027 - 0.421 25.971 - 0.478 24.146 - 0.579 20.728 - 0.659 17.774 - 0.739 14.356 - 0.799 9.569 - 0.852 4.557 - 0.899 1.139 - 0.94 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D21.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D21.rse deleted file mode 100644 index e425c22904..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D21.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -Aerotech D21 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D24.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D24.eng deleted file mode 100644 index 51f63ae04b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D24.eng +++ /dev/null @@ -1,48 +0,0 @@ -; AeroTech D24T (Blue Thunder) RASP.ENG file made from -; manufacturers published data. -; -; File was produced May 07, 2004 by Stanley_Hemphill@Hotmail.com. -; -; The motor is listed in the www.thrustcurve.org database as an -; engine certified by NAR, but there is "no data" at the weblink -; to the NAR file database. -; -; The author has created this file by extracting the manufacturers -; Thrust-Time curve from The AeroTech-2002 Catalog, and then deploting -; 32 points using the distance measuring tools in Paint Shop Pro 8. -; The file was then created in RockSim 7 and the motor and static values -; were read from the RockSim Engine Editor. -; -; Motor Dia Len Delay Propellant Total Manufacturer -D24BT_CO_SU 18.00 70.00 4-7-10 0.00870 0.03200 AeroTech -0.0380 39.6000 -0.0550 36.5000 -0.0760 34.4000 -0.1220 32.4000 -0.1640 31.1000 -0.2190 30.3000 -0.2610 29.3000 -0.3080 28.7000 -0.3290 27.9000 -0.3580 26.9000 -0.3920 25.8000 -0.4340 25.0000 -0.4850 24.0000 -0.5390 23.2000 -0.5770 22.3000 -0.6200 20.9000 -0.6660 19.6000 -0.6950 18.0000 -0.7210 16.5000 -0.7500 15.5000 -0.7540 14.3000 -0.7590 12.4000 -0.7600 11.0000 -0.7630 09.1000 -0.7634 07.5000 -0.7710 05.9000 -0.7920 04.0000 -0.8300 02.6000 -0.8680 01.8000 -0.9000 01.1000 -0.9400 00.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D24.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D24.rse deleted file mode 100644 index fffa0fc627..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D24.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D7.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D7.eng deleted file mode 100644 index 3b46001d88..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D7.eng +++ /dev/null @@ -1,23 +0,0 @@ -;Aerotech D7 RASP.ENG file made from NAR published data -D7 24 70 100 0.0105 0.0422 AT -0.036 3.336 -0.084 9.326 -0.101 10.281 -0.143 10.827 -0.213 10.99 -0.271 10.887 -0.359 10.685 -0.471 10.13 -0.506 10.342 -0.535 9.929 -0.81 8.697 -1.226 6.713 -1.589 5.138 -1.8 4.861 -2.151 4.581 -2.649 4.57 -2.696 3.887 -2.748 2.388 -2.807 0.889 -2.842 0.207 -2.87 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D7.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D7.rse deleted file mode 100644 index 99059da206..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D7.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -Aerotech D7 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D9.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D9.eng deleted file mode 100644 index 9d3b607b88..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D9.eng +++ /dev/null @@ -1,23 +0,0 @@ -; Aerotech D9 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/29/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -D9W 24 70 4-7 0.0101 0.045 AT - 0.1 13.7 - 0.15 15.4 - 0.2 16.3 - 0.25 16.8 - 0.35 17.2 - 0.40 17.2 - 0.50 16.8 - 0.65 15.9 - 0.80 14.5 - 1.10 9.2 - 1.25 7.0 - 1.40 4.8 - 1.60 2.5 - 1.90 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D9.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D9.rse deleted file mode 100644 index c438bbb89a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_D9.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - - Aerotech D9 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E11.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E11.eng deleted file mode 100644 index 4bdcce92b0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E11.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -;Based On NAR Test Data -;12/23/93 -E11J 24 70 4 0.025 0.0624 Aerotech -0.0725446 14.3704 -0.16183 17.6296 -0.206473 18.3704 -0.418527 19.2593 -0.731027 18.3704 -1.31696 14.2222 -1.91964 9.03704 -2.51116 2.22222 -2.83 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E11.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E11.rse deleted file mode 100644 index 586114d241..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E11.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -Based On NAR Test Data -12/23/93 - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E12.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E12.eng deleted file mode 100644 index 7ba80db6d1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E12.eng +++ /dev/null @@ -1,42 +0,0 @@ -; -; -;Aerotech E12JRC RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -E12JRC 24 70 100 0.0303 0.0594 AT -0.054 16.764 -0.095 18.33 -0.197 16.545 -0.313 16.654 -0.36 17.211 -0.401 16.316 -0.442 17.55 -0.476 16.206 -0.578 16.316 -0.666 16.764 -0.7 15.649 -0.768 16.316 -0.89 16.097 -1.019 15.649 -1.162 14.983 -1.23 14.983 -1.25 13.968 -1.291 14.754 -1.332 13.749 -1.373 14.197 -1.434 13.53 -1.488 13.749 -1.597 12.635 -1.726 11.401 -1.828 10.615 -1.889 9.613 -1.957 9.613 -1.998 8.495 -2.093 8.607 -2.277 7.042 -2.487 5.813 -3.05 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E12.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E12.rse deleted file mode 100644 index c2cfbe747b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E12.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech E12JRC RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15.eng deleted file mode 100644 index 7cd6163c21..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15.eng +++ /dev/null @@ -1,46 +0,0 @@ -; E15W-4,7,P from NAR data -E15W 24 70 4-7-P 0.020100000000000003 0.0502 AT - 0.012 9.918 - 0.018 20.205 - 0.027 25.257 - 0.039 28.152 - 0.055 28.768 - 0.088 27.29 - 0.197 24.517 - 0.297 22.977 - 0.467 20.945 - 0.561 19.959 - 0.679 20.021 - 0.722 19.22 - 0.761 18.789 - 0.807 20.021 - 0.84 18.234 - 0.904 18.727 - 0.995 17.926 - 1.034 18.172 - 1.104 16.756 - 1.147 17.248 - 1.256 16.386 - 1.377 15.77 - 1.411 14.846 - 1.426 16.324 - 1.45 15.031 - 1.547 14.353 - 1.559 16.016 - 1.589 13.86 - 1.62 14.23 - 1.693 13.121 - 1.72 13.429 - 1.829 12.936 - 1.866 11.951 - 1.944 11.951 - 2.005 10.965 - 2.093 10.472 - 2.236 8.316 - 2.26 9.055 - 2.278 7.207 - 2.378 4.99 - 2.442 2.71 - 2.499 1.602 - 2.548 1.047 - 2.618 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15.rse deleted file mode 100644 index a2ee72ffe1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech E15 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15_1.eng deleted file mode 100644 index 2bd38b28d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E15_1.eng +++ /dev/null @@ -1,41 +0,0 @@ -; Aerotech E15 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/30/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E15W 24 70 4-7 .0201 .0501 AT - 0.020 23.330 - 0.036 27.318 - 0.058 28.840 - 0.079 27.171 - 0.139 25.638 - 0.183 24.263 - 0.237 24.106 - 0.297 22.426 - 0.373 21.964 - 0.400 20.894 - 0.443 21.355 - 0.487 20.442 - 0.617 19.833 - 0.742 18.457 - 0.812 20.000 - 0.850 18.006 - 0.899 18.467 - 1.035 17.711 - 1.100 16.945 - 1.160 16.945 - 1.377 15.736 - 1.426 14.656 - 1.436 16.198 - 1.463 14.813 - 1.550 14.361 - 1.572 15.432 - 1.610 13.752 - 1.827 12.839 - 2.126 10.098 - 2.337 6.116 - 2.538 1.369 - 2.600 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E16.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E16.eng deleted file mode 100644 index 95afca8faf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E16.eng +++ /dev/null @@ -1,32 +0,0 @@ -; Aerotech E16 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/30/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E16W 29 124 4-7-10 .0190 .107 AT - 0.132 32.223 - 0.221 37.200 - 0.255 36.699 - 0.306 36.699 - 0.371 35.357 - 0.414 33.785 - 0.437 34.906 - 0.472 33.785 - 0.530 32.894 - 0.553 31.772 - 0.576 32.443 - 0.638 29.309 - 0.720 27.296 - 0.867 23.942 - 1.083 19.245 - 1.273 14.319 - 1.458 9.397 - 1.513 8.055 - 1.524 8.279 - 1.555 6.936 - 1.656 4.474 - 1.814 1.790 - 2.000 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E16.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E16.rse deleted file mode 100644 index bc79b376c2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E16.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E18.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E18.eng deleted file mode 100644 index cb73dfb174..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E18.eng +++ /dev/null @@ -1,37 +0,0 @@ -; Aerotech E18 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/29/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E18W 24 70 4-8-10 .0207 .057 AT - 0.016 6.586 - 0.042 18.004 - 0.073 27.138 - 0.098 29.815 - 0.134 30.357 - 0.170 30.347 - 0.195 31.080 - 0.236 30.347 - 0.287 30.878 - 0.338 30.337 - 0.368 30.878 - 0.404 29.795 - 0.424 30.688 - 0.465 29.976 - 0.526 29.785 - 0.592 29.063 - 0.669 28.341 - 0.786 26.908 - 0.908 23.850 - 1.025 21.163 - 1.157 17.905 - 1.284 14.857 - 1.462 11.338 - 1.660 7.106 - 1.838 3.470 - 2.006 1.309 - 2.083 0.588 - 2.140 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E18.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E18.rse deleted file mode 100644 index 0fdadcf24f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E18.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E20.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E20.eng deleted file mode 100644 index cf7d56b915..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E20.eng +++ /dev/null @@ -1,37 +0,0 @@ -;@File: E20.txt, @Pts-I: 1001, @Pts-O: 32, @Sm: 3, @CO: 5% -;@TI: 34.6666, @TIa: 34.5451, @TIe: 0.0%, @ThMax: 34.6991, @ThAvg: 22.1301, @Tb: 1.561 -;Exported using ThrustCurveTool, www.ThrustGear.com -E20 24 65 4-7-10 0.0162 0.049 A -0 0.0290422 -0.024 0.227567 -0.038 1.39403 -0.048 2.6721 -0.056 5.81661 -0.06 7.76916 -0.062 9.00446 -0.064 10.7176 -0.072 20.3365 -0.074 22.4147 -0.08 27.1311 -0.084 28.9874 -0.09 30.5394 -0.104 32.9513 -0.124 34.2647 -0.138 34.677 -0.252 33.8465 -0.36 32.0816 -0.63 29.8124 -0.672 28.8301 -0.77 27.3596 -0.8 26.3903 -0.9 24.2069 -1.084 18.0681 -1.134 16.8918 -1.16 15.8701 -1.2899 12.1921 -1.3719 9.38065 -1.5079 4.03928 -1.5519 2.72185 -1.6019 1.72082 -1.7579 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E23.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E23.eng deleted file mode 100644 index 5417dd7405..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E23.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Aerotech E23 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/30/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E23T 29 124 5-8 .0174 .1039 AT - 0.024 16.299 - 0.035 21.959 - 0.067 30.785 - 0.090 35.774 - 0.153 37.577 - 0.200 38.220 - 0.240 37.357 - 0.322 37.577 - 0.393 35.093 - 0.534 32.378 - 0.727 27.168 - 0.766 26.938 - 0.798 25.125 - 0.908 21.729 - 1.057 16.980 - 1.187 12.682 - 1.336 7.471 - 1.450 3.169 - 1.497 1.584 - 1.532 0.679 - 1.570 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E23.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E23.rse deleted file mode 100644 index bd1c614ab9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E23.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -Aerotech E23 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E28.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E28.eng deleted file mode 100644 index 8ded5e2f91..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E28.eng +++ /dev/null @@ -1,36 +0,0 @@ -; Aerotech E28 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/29/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E28T 24 70 2-5-8 .0184 .0545 A - 0.010 29.8620 - 0.018 45.1390 - 0.038 47.5620 - 0.081 50.5200 - 0.106 48.9530 - 0.146 48.2630 - 0.161 48.9530 - 0.197 48.9530 - 0.242 47.5620 - 0.313 46.1800 - 0.411 43.0570 - 0.494 40.6240 - 0.527 39.5830 - 0.542 40.2740 - 0.562 38.5420 - 0.633 36.4600 - 0.683 34.3770 - 0.743 31.2440 - 0.799 29.1620 - 0.877 26.0380 - 0.970 20.8320 - 1.006 17.3590 - 1.046 11.4620 - 1.089 6.9430 - 1.132 3.8190 - 1.172 1.7350 - 1.220 0.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E28.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E28.rse deleted file mode 100644 index a245dfaa20..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E28.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -Aerotech E28 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E30.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E30.eng deleted file mode 100644 index e0a8ce8922..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E30.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Aerotech E30 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (3/30/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E30T 24 70 4-7 .0193 .0433 AT - 0.013 38.8470 - 0.020 45.6210 - 0.041 48.2700 - 0.059 46.5020 - 0.110 46.5020 - 0.166 45.9120 - 0.184 46.7920 - 0.217 45.9120 - 0.265 45.9120 - 0.319 45.0310 - 0.383 44.1500 - 0.482 42.0890 - 0.594 38.8470 - 0.615 39.4370 - 0.628 37.3760 - 0.684 35.3140 - 0.742 33.2630 - 0.804 30.0210 - 0.880 25.6070 - 0.962 20.0140 - 1.038 12.9490 - 1.089 7.3580 - 1.151 3.2370 - 1.186 1.1760 - 1.200 0.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E30.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E30.rse deleted file mode 100644 index 8ef0d006d0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E30.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -Aerotech E30 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E6.eng deleted file mode 100644 index 9a8ef48c93..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E6.eng +++ /dev/null @@ -1,20 +0,0 @@ -; Aerotech E6T single use from NAR cert data -E6T 24 70 2-4-8-P 0.021500000000000002 0.0463 AT - 0.011 18.085 - 0.109 19.681 - 0.217 16.312 - 0.315 13.475 - 0.457 11.348 - 0.63 9.043 - 0.804 7.801 - 0.989 6.738 - 1.272 6.028 - 2.0 5.851 - 3.0 5.496 - 4.0 5.496 - 4.446 4.965 - 5.011 4.965 - 5.533 4.787 - 5.609 6.56 - 5.707 4.255 - 6.033 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E6.rse deleted file mode 100644 index 6793b57f79..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E6.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -Aerotech E6TRC RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E7.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E7.eng deleted file mode 100644 index a8f0097528..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E7.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -;Aerotech E7TRC RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -E7RC 24 70 100 0.0171 0.0484 AT -0.038 6.636 -0.063 10.056 -0.087 11.019 -0.134 11.42 -0.206 11.58 -0.312 11.149 -0.466 10.738 -0.667 9.777 -0.94 8.132 -1.223 6.281 -1.484 5.182 -1.709 4.701 -2.112 4.423 -2.776 4.279 -3.31 4.205 -3.926 4.266 -4.401 4.192 -4.638 4.258 -4.744 4.119 -5.124 3.979 -5.219 3.977 -5.266 3.156 -5.313 1.992 -5.36 0.965 -5.43 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E7.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E7.rse deleted file mode 100644 index 0c5d9e14d9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_E7.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -Aerotech E7TRC RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F10.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F10.eng deleted file mode 100644 index 879934c073..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F10.eng +++ /dev/null @@ -1,30 +0,0 @@ -; -F10 29.0 92.00 4-6-8 0.04000 0.08300 Aerotech - 0.01 16.81 - 0.03 22.34 - 0.11 22.23 - 0.26 21.49 - 0.37 20.00 - 0.47 20.21 - 0.67 18.09 - 0.99 15.74 - 1.31 13.40 - 1.81 10.85 - 2.49 10.21 - 3.13 8.94 - 3.60 8.83 - 4.11 8.62 - 4.95 8.62 - 5.45 8.62 - 5.58 8.51 - 5.88 8.72 - 6.22 8.51 - 6.46 8.51 - 6.60 7.77 - 6.71 7.02 - 6.79 5.64 - 6.91 3.83 - 6.95 2.23 - 7.00 0.96 - 7.05 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F12.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F12.eng deleted file mode 100644 index cd06f44b43..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F12.eng +++ /dev/null @@ -1,40 +0,0 @@ -; Aerotech F12 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (4/6/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F12J 24 70 2-5 .0303 .0667 AT - 0.037 20.894 - 0.054 22.152 - 0.101 22.152 - 0.148 22.571 - 0.165 23.409 - 0.200 22.421 - 0.281 22.142 - 0.369 22.132 - 0.474 22.271 - 0.526 23.540 - 0.549 21.982 - 0.637 22.122 - 0.724 21.842 - 0.800 21.413 - 0.823 22.251 - 0.846 20.714 - 0.881 21.553 - 0.945 21.123 - 1.021 20.704 - 1.114 20.554 - 1.213 19.296 - 1.382 18.298 - 1.481 18.019 - 1.737 15.343 - 1.790 17.300 - 1.883 13.936 - 2.051 11.260 - 2.220 7.468 - 2.447 3.671 - 2.709 1.135 - 2.930 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F12.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F12.rse deleted file mode 100644 index ff10b6e7f7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F12.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -Aerotech F12 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F13.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F13.eng deleted file mode 100644 index 7de9988810..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F13.eng +++ /dev/null @@ -1,38 +0,0 @@ -; -;Aerotech F13RCJ RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F13RCJ 32 107 100 0.0323 0.1105 AT -0.048 15.309 -0.084 18.629 -0.143 19.98 -0.311 18.968 -0.538 18.172 -0.729 17.138 -0.992 15.428 -1.279 13.828 -1.673 12.456 -1.984 11.879 -2.044 12.227 -2.139 11.313 -2.378 11.193 -2.51 11.084 -2.558 12.108 -2.641 10.855 -2.976 10.736 -3.49 10.627 -3.873 10.507 -3.992 10.965 -4.028 10.627 -4.41 10.507 -4.625 10.736 -4.769 9.941 -4.829 8.684 -4.865 6.742 -4.96 3.199 -5.02 1.485 -5.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F13.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F13.rse deleted file mode 100644 index f5cee80c86..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F13.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - -Aerotech F13RCJ RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F16.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F16.eng deleted file mode 100644 index 898c01790d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F16.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Aerotech F16RCJ RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F16RCJ 32 107 100 0.0625 0.1404 AT -0.046 26.35 -0.116 22.388 -0.139 21.374 -0.185 21.886 -0.22 20.54 -0.301 19.696 -0.498 18.35 -0.579 19.194 -0.637 16.492 -0.718 18.35 -0.834 18.35 -0.95 18.35 -1.054 19.194 -1.147 17.848 -1.181 18.853 -1.263 17.336 -1.436 18.009 -1.633 17.165 -1.784 17.336 -1.865 18.682 -1.934 16.834 -1.981 17.336 -2.178 16.332 -2.375 16.332 -2.502 18.18 -2.664 15.659 -2.896 15.488 -3.29 13.8 -3.718 11.611 -4.181 9.426 -4.888 5.891 -5.69 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F16.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F16.rse deleted file mode 100644 index 525bcbedd6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F16.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech F16RCJ RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20.eng deleted file mode 100644 index 7d746e75b8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20.eng +++ /dev/null @@ -1,39 +0,0 @@ -; Aerotech F20 RASP.ENG file made from NAR published data -; File produced July 4, 2007 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F20 29 83 4-7 .0300 .0801 A -0.023 16.431 -0.043 28.538 -0.062 36.691 -0.078 40.330 -0.120 37.677 -0.167 36.933 -0.213 36.931 -0.298 36.432 -0.318 37.173 -0.333 35.689 -0.368 36.182 -0.395 35.192 -0.430 36.426 -0.446 37.166 -0.481 34.447 -0.554 34.443 -0.946 30.964 -0.965 29.481 -1.008 29.726 -1.062 27.746 -1.097 27.497 -1.136 26.260 -1.310 20.568 -1.360 19.824 -1.438 17.349 -1.465 17.348 -1.527 15.121 -1.597 13.882 -1.810 9.176 -1.969 6.203 -2.490 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20.rse deleted file mode 100644 index 247b976866..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20_1.eng deleted file mode 100644 index 18edb27482..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F20_1.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -; -F20EJ 29 83 4-7 0.03 0.0746 AeroTech -0.01 52.08 -0.03 49.81 -0.06 46.98 -0.1 45.56 -0.15 44.49 -0.18 45.55 -0.21 43.42 -0.24 43.78 -0.32 43.77 -0.36 44.11 -0.44 43.04 -0.45 40.58 -0.53 39.86 -0.62 38.08 -0.76 36.3 -0.8 37.35 -0.84 34.88 -0.89 36.99 -0.9 33.46 -1.03 30.61 -1.06 32.02 -1.09 29.55 -1.23 26 -1.32 22.45 -1.35 23.16 -1.36 21.39 -1.58 16.42 -1.8 11.1 -2.01 6.48 -2.19 3.63 -2.39 1.13 -2.68 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F21.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F21.eng deleted file mode 100644 index c4cdedcf26..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F21.eng +++ /dev/null @@ -1,60 +0,0 @@ -; Aerotech F21W (White Lightning) RASP.ENG file. -; File produced Jun 22 2004. -; The file was produced by scaling data points off the -; thrust curve in the Tripoli.org motor pdf file. -; -; The F21W cannot be found on thrustcurve.org. -; Hence the amateur file production. -; The file was created by Stan Hemphill -; Contact at stanley_hemphill@hotmail.com -; -; Motor ## Dia Len Delays Prop Motor Company -F21WL_CO_SU 24 96 6-8 0.0300 0.064 AeroTech -0.0045 037.2266 -0.0090 042.1474 -0.0180 042.5040 -0.0270 040.5071 -0.0337 038.8669 -0.0427 038.2250 -0.0517 037.7258 -0.0607 036.8700 -0.0720 036.4422 -0.0877 036.4422 -0.1102 035.3724 -0.1350 035.8716 -0.1552 035.4437 -0.1732 036.2282 -0.2025 035.6577 -0.2452 037.2979 -0.2835 036.5848 -0.3195 038.0111 -0.3375 037.4406 -0.3757 038.5816 -0.3960 038.2250 -0.4297 039.3661 -0.4454 038.0111 -0.4747 038.7242 -0.4882 037.7971 -0.5084 038.1537 -0.5354 038.5103 -0.5647 037.9398 -0.5849 037.2266 -0.6007 037.8685 -0.6389 036.8700 -0.6704 037.1553 -0.7649 035.9429 -0.9201 032.9477 -1.0056 030.3090 -1.0709 029.7385 -1.2643 024.0333 -1.2868 024.0333 -1.3723 020.8241 -1.3926 020.8241 -1.5883 015.4754 -1.6108 015.4754 -2.0112 005.0634 -2.1192 003.4231 -2.2407 002.4247 -2.3780 001.4976 -2.4927 000.9271 -2.5152 000.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F21.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F21.rse deleted file mode 100644 index 680b14305a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F21.rse +++ /dev/null @@ -1,67 +0,0 @@ - - - -Aerotech F21W (White Lightning) RASP.ENG file. -File produced Jun 22 2004. -The file was produced by scaling data points off the -thrust curve in the Tripoli.org motor pdf file. - -The F21W cannot be found on thrustcurve.org. -Hence the amateur file production. -The file was created by Stan Hemphill -Contact at stanley_hemphill@hotmail.com; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F22.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F22.eng deleted file mode 100644 index 8cd24a5bb9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F22.eng +++ /dev/null @@ -1,38 +0,0 @@ -; -;Aerotech F22 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F22 29 125 4-7 0.0463 0.1342 AT -0.014 11.527 -0.075 20.126 -0.157 26.572 -0.293 29.113 -0.382 30.278 -0.45 29.69 -0.539 30.667 -0.614 30.089 -0.662 31.15 -0.771 30.478 -0.948 29.89 -0.996 28.714 -1.078 28.136 -1.187 27.738 -1.289 26.761 -1.337 26.96 -1.412 25.984 -1.474 25.008 -1.515 26.173 -1.542 24.808 -1.706 22.856 -1.938 20.903 -2.101 18.173 -2.129 19.338 -2.251 16.21 -2.402 13.48 -2.64 8.791 -2.961 3.32 -3.31 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F22.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F22.rse deleted file mode 100644 index 6a8f5941b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F22.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - -Aerotech F22 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23.eng deleted file mode 100644 index e6c5c2bc73..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;F23FJ Motor Thrust Curve created by Tim Van Milligan -;for RockSim Users - www.rocksim.com -;file produced March 2, 2005 -;Based on data supplied by Aerotech for the newer molded case F23 econojet. -F23FJ 29 83 4-7 0.033 0.0839 AeroTech -0.03 48.7 -0.05 43.11 -0.08 41.41 -0.1 42.26 -0.13 40.84 -0.17 39.42 -0.23 38.85 -0.27 38.85 -0.3 37.44 -0.31 38.57 -0.36 37.72 -0.43 36.59 -0.5 36.02 -0.56 36.02 -0.59 34.6 -0.69 33.18 -0.77 32.61 -0.85 31.2 -0.94 29.5 -1.04 27.79 -1.18 24.39 -1.2 25.24 -1.25 22.97 -1.37 20.98 -1.53 16.73 -1.69 12.48 -1.83 9.07 -1.95 5.11 -2.07 2.27 -2.22 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23.rse deleted file mode 100644 index cd349943d1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -F23FJ Motor Thrust Curve created by Tim Van Milligan -for RockSim Users - www.rocksim.com -file produced March 2, 2005 -Based on data supplied by Aerotech for the newer molded case F23 econojet. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23_1.eng deleted file mode 100644 index ae21a8cffd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23_1.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Aerotech F23RCWSK RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F23-RC-SK 32 107 100 0.0378 0.1287 AT -0.042 22.644 -0.133 28.191 -0.161 27.261 -0.189 29.57 -0.252 31.419 -0.343 32.578 -0.399 32.348 -0.441 33.737 -0.476 30.729 -0.539 33.507 -0.609 34.197 -0.777 34.886 -0.826 34.656 -0.896 36 -0.938 34.656 -1.015 34.656 -1.071 34.197 -1.12 33.038 -1.218 32.578 -1.267 29.81 -1.351 29.34 -1.393 27.731 -1.54 26.802 -1.645 24.263 -1.799 21.255 -1.862 19.866 -2.051 15.479 -2.317 11.552 -2.618 6.7 -2.884 3.234 -3.185 1.386 -3.47 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23_1.rse deleted file mode 100644 index 30872f8c07..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F23_1.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech F23RCWSK RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F24.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F24.eng deleted file mode 100644 index 81698fc9b3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F24.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Aerotech F24 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (4/6/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F24W 24 70 4-7-10 .0253 .062 AT - 0.033 16.442 - 0.112 40.646 - 0.125 41.450 - 0.180 40.927 - 0.245 40.626 - 0.281 41.017 - 0.355 40.024 - 0.438 39.713 - 0.543 38.227 - 0.603 37.032 - 0.658 33.779 - 0.685 34.663 - 0.726 29.934 - 0.772 30.216 - 0.951 26.953 - 1.071 25.166 - 1.107 23.088 - 1.185 21.311 - 1.383 17.144 - 1.649 10.910 - 1.828 5.869 - 1.938 2.903 - 1.988 2.306 - 2.048 1.412 - 2.130 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F24.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F24.rse deleted file mode 100644 index 1148508a4e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F24.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -Aerotech F24 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F25.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F25.eng deleted file mode 100644 index b6e3f77a20..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F25.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -;F25 Motor Thrust Curve created by Tim Van Milligan -;for RockSim Users - www.rocksim.com -;file produced March 2, 2005 -;Based on data supplied by Aerotech for the newer molded case F25. -F25 29 98 4-6-9 0.0388 0.0972 Aerotech -0.039 57.631 -0.187 53.491 -0.342 51.239 -0.5 47.86 -1 33.806 -1.5 22.94 -2 10.135 -2.207 4.504 -2.69 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F25.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F25.rse deleted file mode 100644 index 876d3cdca6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F25.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - -F25 Motor Thrust Curve created by Tim Van Milligan -for RockSim Users - www.rocksim.com -file produced March 2, 2005 -Based on data supplied by Aerotech for the newer molded case F25. - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F26.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F26.eng deleted file mode 100644 index 53613c0f06..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F26.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -;F26FJ Motor Thrust Curve created by Tim Van Milligan -;for RockSim Users - www.rocksim.com -;File created March 2, 2005 -;Based on data supplied by Aerotech prior to NAR certification. -F26FJ 29 98 6-9 0.0431 0.1007 Aerotech -0.041 38.289 -0.114 36.318 -0.293 34.347 -0.497 32.939 -0.774 32.376 -1 31.25 -1.254 28.716 -1.498 25.338 -1.743 22.241 -2.003 17.737 -2.077 15.484 -2.304 5.349 -2.484 1.689 -2.61 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F26.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F26.rse deleted file mode 100644 index 7712cf5031..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F26.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - -F26FJ Motor Thrust Curve created by Tim Van Milligan -for RockSim Users - www.rocksim.com -File created March 2, 2005 -Based on data supplied by Aerotech prior to NAR certification. - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F27.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F27.eng deleted file mode 100644 index 88339abc8c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F27.eng +++ /dev/null @@ -1,36 +0,0 @@ -; Exported using ThrustCurveTool, www.ThrustGear.com -; @File: 060603WF27Composite.txt, @Pts-I: 1001, @Pts-O: 32, @Sm: 5, @CO: 5% -; @TI: 49.5446, @TIa: 49.299, @TIe: 0.0%, @ThMax: 36.2491, @ThAvg: 24.1799, @Tb: 2.049 -F27 29 83 4,8 0.0284 0.08 Aerotech - 0.0 4.84718 - 0.0125 15.5374 - 0.0175 18.81827 - 0.025 22.5311 - 0.0325 25.2547 - 0.04 27.3204 - 0.0575 30.3657 - 0.0725 31.4597 - 0.0975 32.2507 - 0.265 35.0238 - 0.295 35.9203 - 0.4675 35.9684 - 0.59 35.065 - 0.8 32.0145 - 0.825 31.2773 - 0.8575 31.1102 - 0.9025 29.9308 - 0.955 29.7244 - 1.045 27.2951 - 1.085 27.2663 - 1.1175 25.9881 - 1.1475 26.0014 - 1.235 23.2853 - 1.28 22.9001 - 1.3425 21.0771 - 1.52 17.256 - 1.8075 6.85478 - 1.9175 4.16387 - 2.05 1.783863 - 2.1775 0.488016 - 2.4225 0.44385 - 2.425 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F30.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F30.eng deleted file mode 100644 index 59cda7597e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F30.eng +++ /dev/null @@ -1,23 +0,0 @@ -; From AT Instruction Sheet by C. Kobel 1/4/11 -F30FJ 24 90 4-6-8 0.0318 0.070 AT - 0.056 22.706 - 0.102 34.315 - 0.134 36.363 - 0.200 36.876 - 0.300 36.705 - 0.400 37.217 - 0.500 38.241 - 0.600 37.900 - 0.700 37.900 - 0.800 37.217 - 0.900 36.363 - 1.000 35.168 - 1.100 33.291 - 1.175 32.608 - 1.200 31.413 - 1.260 26.974 - 1.300 22.706 - 1.400 9.219 - 1.453 5.805 - 1.500 4.097 - 1.600 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32.eng deleted file mode 100644 index caf0e09b0c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32.eng +++ /dev/null @@ -1,36 +0,0 @@ -; @File: F32T.txt, @Pts-I: 1501, @Pts-O: 32, @Sm: 3, @CO: 5% -; @TI: 56.7109, @TIa: 56.4715, @TIe: 0.0%, @ThMax: 58.525, @ThAvg: 34.2667, @Tb: 1.648 -; Exported using ThrustCurveTool, www.ThrustGear.com -F32 24 90 4-6-8 0.0258 0.064 Aerotech/RCS -0.0 0.00669778 -0.17 0.236738 -0.192 0.794052 -0.202 2.68628 -0.204 3.57052 -0.208 7.96887 -0.21 11.79011 -0.212 16.82641 -0.22 39.2314 -0.224 46.779 -0.228 51.8968 -0.232 55.296 -0.236 56.9612 -0.258 58.4048 -0.288 55.2426 -0.316 53.4728 -0.394 49.5892 -0.458 47.4002 -0.73 41.2237 -0.904 39.3815 -1.11 35.6689 -1.198 35.0946 -1.22 33.8331 -1.2599 33.5013 -1.4779 27.3792 -1.4899 27.7527 -1.5099 25.4378 -1.6759 11.26592 -1.7679 5.94688 -1.8519 2.91383 -1.9519 0.745781 -2.0639 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32.rse deleted file mode 100644 index 610c16e83d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - - Input by Tim Van Milligan based on NAR Certification document Jan 14, 2009 -Created using Thrust Curve Tracer. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32_1.eng deleted file mode 100644 index d4b5b650b8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32_1.eng +++ /dev/null @@ -1,40 +0,0 @@ -; -;Aerotech F32 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F32 24 124 5-10-15 0.0377 0.0814 AeroTech -0.025 46.699 -0.031 51.846 -0.061 55.64 -0.085 52.868 -0.126 47.37 -0.245 45.637 -0.34 44.946 -0.394 42.873 -0.447 42.873 -0.572 41.14 -0.72 39.408 -0.744 40.78 -0.786 38.026 -1.041 35.592 -1.136 33.179 -1.177 34.541 -1.225 32.818 -1.379 31.436 -1.474 30.394 -1.635 28.311 -1.676 27.28 -1.694 29.683 -1.712 26.929 -1.854 25.537 -1.943 23.815 -2.092 21.051 -2.187 18.287 -2.276 13.82 -2.382 7.281 -2.525 2.457 -2.72 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32_1.rse deleted file mode 100644 index 149dfe3211..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F32_1.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -Aerotech F32 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F35.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F35.eng deleted file mode 100644 index 6f00123dd2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F35.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Curve fit of AT Instruction Sheet by C. Kobel 7/29/08 -F35W 24 95 5-8-11 0.03 0.085 AT - 0.007 39.452 - 0.012 51.842 - 0.019 49.885 - 0.034 57.873 - 0.048 58.363 - 0.058 57.221 - 0.077 54.45 - 0.098 54.939 - 0.106 53.961 - 0.201 53.472 - 0.299 53.309 - 0.398 52.005 - 0.498 52.005 - 0.549 49.559 - 0.601 48.907 - 0.653 47.277 - 0.702 45.647 - 0.752 44.669 - 0.802 43.201 - 0.898 39.778 - 0.946 39.615 - 0.984 36.843 - 1.003 37.332 - 1.102 33.583 - 1.144 30.159 - 1.200 22.334 - 1.298 10.923 - 1.346 6.521 - 1.398 3.260 - 1.448 1.793 - 1.497 0.978 - 1.600 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F37.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F37.eng deleted file mode 100644 index 89c087f05b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F37.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -;Aerotech F37 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F37 29 99 6-10-14 0.0282 0.1086 AT -0.018 7.251 -0.053 13.626 -0.088 22.331 -0.106 25.227 -0.141 26.385 -0.183 28.411 -0.26 37.685 -0.31 41.449 -0.422 44.035 -0.524 45.183 -0.59 46.47 -0.682 45.153 -0.864 43.386 -0.934 40.471 -1.042 35.23 -1.151 29.699 -1.246 25.037 -1.354 19.796 -1.445 13.397 -1.498 7.586 -1.54 3.226 -1.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F37.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F37.rse deleted file mode 100644 index a30e2b8842..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F37.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -Aerotech F37 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F39.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F39.eng deleted file mode 100644 index 8ea0d81d15..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F39.eng +++ /dev/null @@ -1,40 +0,0 @@ -; Aerotech F39 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Submitted to ThrustCurve.org by Chris Kobel (4/6/07) -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F39T 24 70 3-6-9 .0227 .059 AT - 0.010 45.057 - 0.016 54.131 - 0.046 58.321 - 0.079 59.470 - 0.103 58.311 - 0.130 57.253 - 0.172 55.491 - 0.235 53.738 - 0.321 51.271 - 0.363 50.566 - 0.387 49.509 - 0.408 50.203 - 0.426 48.804 - 0.453 47.746 - 0.480 47.041 - 0.680 41.059 - 0.716 39.649 - 0.752 38.944 - 0.809 36.487 - 0.860 34.382 - 0.893 33.324 - 0.917 32.619 - 1.000 28.752 - 1.075 25.247 - 1.105 22.095 - 1.126 17.201 - 1.144 13.001 - 1.174 8.109 - 1.219 4.606 - 1.261 2.500 - 1.330 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F39.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F39.rse deleted file mode 100644 index e45b908e34..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F39.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -Aerotech F39 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F40.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F40.eng deleted file mode 100644 index ec729dea47..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F40.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -;Aerotech F40 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F40 29 124 4-7-10 0.04 0.126 AT -0.015 17.776 -0.049 41.016 -0.089 58.793 -0.124 62.9 -0.148 65.173 -0.183 62.442 -0.242 68.07 -0.292 60.617 -0.321 61.524 -0.415 60.617 -0.524 58.334 -0.741 52.412 -0.87 48.314 -0.889 49.221 -0.914 47.397 -1.102 40.109 -1.285 33.728 -1.492 25.064 -1.665 15.952 -1.808 8.659 -1.942 3.19 -2.06 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F40.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F40.rse deleted file mode 100644 index c1ac68b1a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F40.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -Aerotech F40 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F42.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F42.eng deleted file mode 100644 index 092f2ee28a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F42.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -;F42T Motor Thrust Curve created by Tim Van Milligan -;for RockSim Users - www.rocksim.com -;Based on data supplied by Aerotech prior to NAR certification. -F42T 29 83 4-8 0.027 0.076 Aerotech -0.01 68.694 -0.029 65.879 -0.202 62.5 -0.511 51.802 -0.739 43.356 -0.993 31.532 -1.02 29.279 -1.072 23.086 -1.199 9.572 -1.262 4.505 -1.319 2.815 -1.47 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F42.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F42.rse deleted file mode 100644 index 258203f71b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F42.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - -F42T Motor Thrust Curve created by Tim Van Milligan -for RockSim Users - www.rocksim.com -Based on data supplied by Aerotech prior to NAR certification. - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F44.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F44.eng deleted file mode 100644 index d3395e4928..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F44.eng +++ /dev/null @@ -1,25 +0,0 @@ -; F44W Economax -F44W 24 70 4-8 0.0197 0.048 AT - 0.02 2.676 - 0.026 6.02 - 0.034 11.204 - 0.063 24.917 - 0.135 59.031 - 0.15 61.372 - 0.2 63.212 - 0.299 65.218 - 0.4 65.051 - 0.5 63.379 - 0.6 58.529 - 0.668 55.017 - 0.686 53.68 - 0.687 54.014 - 0.7 49.165 - 0.719 43.813 - 0.774 22.074 - 0.795 13.211 - 0.812 7.86 - 0.825 4.515 - 0.854 2.007 - 0.899 0.167 - 0.998 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F50.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F50.eng deleted file mode 100644 index 9b33bfbc3a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F50.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -;Aerotech F50 RASP.ENG file made by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Thrust curve supplied by Aerotech for the molded case F50T motors. -F50T 29 98 4-6-9 0.0336 0.0898 AeroTech -0.013 73.762 -0.0326 70.383 -0.267 69.82 -0.518 67.005 -0.792 56.87 -0.906 50.676 -1 44.482 -1.036 39.978 -1.107 23.649 -1.199 6.194 -1.316 1.126 -1.43 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F50.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F50.rse deleted file mode 100644 index 81b6b88f08..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F50.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - -Aerotech F50 RASP.ENG file made by Tim Van Milligan -For RockSim www.RockSim.com -File Created March 2, 2005 -Thrust curve supplied by Aerotech for the molded case F50T motors. - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F52.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F52.eng deleted file mode 100644 index e808de9f8b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F52.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -;Aerotech F52 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F52 29 124 5-8-11 0.0366 0.1214 AT -0.012 46.899 -0.033 61.778 -0.056 69.441 -0.097 73.483 -0.115 76.636 -0.13 74.381 -0.153 74.82 -0.168 78.422 -0.182 78.95 -0.206 77.963 -0.238 77.504 -0.258 73.892 -0.314 72.974 -0.39 72.046 -0.428 70.679 -0.501 65.699 -0.565 62.975 -0.688 58.874 -0.749 56.15 -0.837 52.517 -0.901 49.793 -0.971 46.161 -1.088 39.365 -1.144 34.386 -1.173 29.417 -1.222 20.376 -1.275 13.151 -1.339 5.461 -1.389 1.838 -1.42 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F52.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F52.rse deleted file mode 100644 index e41eab7a9d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F52.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -Aerotech F52 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F62.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F62.eng deleted file mode 100644 index f00317cf6a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F62.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Aerotech F62T (Blue Thunder) -; -; AeroTech RMS-29/60 Easy Access Reloadable Motor Hardware. -; -; RASP.ENG file made from manufacturers catalog data. -; -; File produced May, 17 2004. -; -; The file was produced by scaling 16 data points off -; the thrust curves in the manufacturers catalog. -; -; The F62T cannot be found on thrustcurve.org. -; Hence the amateur file production. -; The file was created by Stan Hemphill. -; Contact at stanley_hemphill@hotmail.com. -; -; Motor Dia Len Delay Prop Gross Mfg -F62T 29 99 6-8-9-10-11-13-14-16-18 0.025 0.109 AT -0.0046 053.6364 -0.0416 055.2727 -0.0909 058.3636 -0.1356 061.6364 -0.1649 064.9091 -0.1864 067.6364 -0.5085 067.6364 -0.5701 064.7273 -0.6687 060.0000 -0.7427 055.0909 -0.7982 049.6364 -0.9029 048.7273 -0.9492 024.7273 -0.9661 020.1818 -0.9985 000.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F62.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F62.rse deleted file mode 100644 index 52305aaf41..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F62.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F72.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F72.eng deleted file mode 100644 index 25d9203bbd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F72.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Aerotech F72 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F72 24 124 5-10-15 0.0368 0.0742 AeroTech -0.012 62.586 -0.017 84.986 -0.02 98.78 -0.03 94.748 -0.05 90.152 -0.069 82.688 -0.089 85.556 -0.104 80.39 -0.136 83.255 -0.146 80.96 -0.176 82.688 -0.198 78.672 -0.213 80.96 -0.253 80.39 -0.315 80.96 -0.38 79.821 -0.429 79.241 -0.489 78.092 -0.523 78.672 -0.536 75.225 -0.675 73.496 -0.699 67.182 -0.719 68.331 -0.747 64.884 -0.769 66.033 -0.858 60.867 -0.923 52.824 -0.98 40.195 -1.012 29.864 -1.034 20.092 -1.089 11.48 -1.21 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F72.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F72.rse deleted file mode 100644 index a3ac37d012..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_F72.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech F72 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G101.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G101.eng deleted file mode 100644 index 9b306f15bf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G101.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -G101T 29.0 114.30 5-8-12 0.04600 0.13600 AT - 0.01 35.29 - 0.02 63.97 - 0.02 78.09 - 0.03 84.71 - 0.04 89.96 - 0.06 93.96 - 0.12 97.26 - 0.17 99.14 - 0.21 101.73 - 0.27 104.09 - 0.31 104.56 - 0.36 103.62 - 0.40 103.38 - 0.45 101.03 - 0.51 99.27 - 0.53 94.41 - 0.56 93.09 - 0.64 87.35 - 0.76 78.53 - 0.80 75.88 - 0.88 68.82 - 0.89 65.73 - 0.90 61.32 - 0.91 55.15 - 0.93 35.73 - 0.94 32.65 - 0.95 22.50 - 0.98 10.59 - 1.00 5.29 - 1.05 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G104.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G104.eng deleted file mode 100644 index 8045a0565d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G104.eng +++ /dev/null @@ -1,45 +0,0 @@ -; -; Aerotech G104T (Blue Thunder) -; -; AeroTech RMS-29/100 EZ Access Reloadable Motors. -; -; File produced 28 Feb 2005. -; -; The file was produced by scaling data points off the -; thrust curve in the manufacturers catalog sheet. -; -; The motor is not yet on www.thrustcurve.org. -; Hence the amateur file production. -; The file was created by Stan Hemphill. -; Contact at stanley_hemphill@hotmail.com. -; -; Motor Dia Len Delay Prop Gross Mfg -G104T 29 124 6-8-9-10-11-13-14-16-18 0.0408 0.136 AT -0.0067 125.3426 -0.0471 123.5424 -0.0856 121.9671 -0.1019 121.4046 -0.1462 121.1795 -0.1837 120.8420 -0.2029 120.5044 -0.2385 118.8167 -0.2644 117.2415 -0.2798 116.9039 -0.3279 116.6789 -0.3923 116.6789 -0.4298 116.1163 -0.4615 114.0910 -0.5067 110.1530 -0.5404 104.6397 -0.5760 096.2010 -0.6067 089.5626 -0.6817 078.8736 -0.7692 067.9595 -0.7865 064.9216 -0.7990 062.5588 -0.8058 058.0582 -0.8192 050.5196 -0.8385 039.0430 -0.8625 027.5664 -0.8769 016.6523 -0.9019 000.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G104.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G104.rse deleted file mode 100644 index d646dd6120..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G104.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G12.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G12.eng deleted file mode 100644 index aac501cd4c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G12.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Aerotech G12RC RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -G12RC 32 107 100 0.0511 0.131 AT -0.03 18.549 -0.117 19.96 -0.239 20.64 -0.362 20.111 -0.519 18.982 -0.694 17.138 -0.886 15.02 -1.131 13.186 -1.375 11.915 -1.689 11.069 -2.021 10.363 -2.422 10.232 -3.172 9.677 -4.114 9.267 -5.039 8.857 -6.137 8.733 -7.132 8.607 -7.795 8.335 -7.952 8.196 -8.074 8.055 -8.179 6.924 -8.319 4.661 -8.476 1.973 -8.55 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G12.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G12.rse deleted file mode 100644 index 70b6d1d8d3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G12.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -Aerotech G12RC RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G125.eng deleted file mode 100644 index b2cf9e8b23..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G125.eng +++ /dev/null @@ -1,17 +0,0 @@ -; At DMS G125 -G125T-14A 29 127 14 0.062 0.127 AT - 0.008 89.654 - 0.017 117.24 - 0.027 119.654 - 0.047 111.033 - 0.115 124.826 - 0.2 134.136 - 0.399 149.308 - 0.601 155.17 - 0.8 138.274 - 0.824 133.791 - 0.878 88.964 - 0.914 44.482 - 0.933 22.414 - 0.974 2.069 - 1.001 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G138.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G138.eng deleted file mode 100644 index e98f7d22de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G138.eng +++ /dev/null @@ -1,43 +0,0 @@ -; AeroTech G138T -; from the reload instruction sheet 08/11/2010 -; Created by Scott Sager 10/10/2010 -G138T 29 123.8 14 0.0704 0.152 AT - 0.0020 113.497 - 0.043 118.736 - 0.098 125.065 - 0.138 126.157 - 0.198 133.578 - 0.251 140.999 - 0.293 146.019 - 0.347 148.856 - 0.398 156.932 - 0.447 160.861 - 0.5 165.881 - 0.548 169.591 - 0.601 173.738 - 0.646 177.449 - 0.697 183.123 - 0.739 182.032 - 0.798 182.469 - 0.839 181.159 - 0.901 182.469 - 0.947 194.691 - 0.972 185.306 - 0.986 174.611 - 0.998 161.515 - 1.0 156.714 - 1.012 143.618 - 1.018 133.796 - 1.026 120.263 - 1.031 111.969 - 1.036 98.437 - 1.041 89.052 - 1.044 77.484 - 1.049 67.662 - 1.054 54.784 - 1.059 46.708 - 1.064 33.176 - 1.073 23.136 - 1.082 12.659 - 1.098 0.873 - 1.099 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G142.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G142.eng deleted file mode 100644 index 0f67559125..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G142.eng +++ /dev/null @@ -1,36 +0,0 @@ -; @File: G142_Typical.txt, @Pts-I: 451, @Pts-O: 32, @Sm: 0, @CO: 5% -; @TI: 84.5422, @TIa: 84.2303, @TIe: 0.0%, @ThMax: 173.4408, @ThAvg: 135.8554, @Tb: 0.62 -; Exported using ThrustCurveTool, www.ThrustGear.com -G142 29 113 6-10-14 0.0386 0.0976 Aerotech - 0.016 4.06052 - 0.018 6.53754 - 0.02 13.44075 - 0.022 24.4211 - 0.024 43.7388 - 0.026 72.8495 - 0.028 106.9426 - 0.03 132.0076 - 0.032 141.5423 - 0.034 147.6844 - 0.038 154.1148 - 0.054 165.5675 - 0.076 166.3214 - 0.084 168.7605 - 0.118 172.9402 - 0.15 173.3837 - 0.224 171.8426 - 0.3 164.7803 - 0.372 156.6537 - 0.418 148.9594 - 0.432 144.9903 - 0.452 137.0965 - 0.518 96.8779 - 0.568 69.3937 - 0.576 63.1618 - 0.618 21.4754 - 0.628 13.57047 - 0.64 7.98504 - 0.652 2.92169 - 0.672 0.966347 - 0.9 0.687625 - 0.901 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25.eng deleted file mode 100644 index 0fdfa1d303..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25.eng +++ /dev/null @@ -1,19 +0,0 @@ -G25W-10A 29 152.4 10 0.097 0.17 AT - 0.01 38.046 - 0.029 21.768 - 0.11 30.475 - 0.239 35.775 - 0.496 40.696 - 0.568 42.116 - 0.592 45.429 - 0.749 46.186 - 0.997 45.713 - 1.255 44.198 - 1.498 39.939 - 1.999 31.421 - 2.501 23.093 - 3.006 14.196 - 3.503 7.288 - 3.999 4.07 - 4.371 1.988 - 4.414 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25.rse deleted file mode 100644 index 3cf0ee0515..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech G25 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25_1.eng deleted file mode 100644 index 02d639e1b8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G25_1.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Aerotech G25 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -G25 29 124 5-10-15 0.0625 0.1197 AeroTech -0.035 30.499 -0.047 36.712 -0.059 41.18 -0.13 40.669 -0.177 38.969 -0.295 38.969 -0.343 40.947 -0.413 40.38 -0.437 38.69 -0.484 39.824 -0.532 37.845 -0.65 37.557 -0.721 38.969 -0.803 38.69 -0.85 37.279 -0.98 39.535 -1.063 36.434 -1.098 38.124 -1.252 37.845 -1.37 37.279 -1.583 37 -1.819 35.3 -1.984 33.61 -2.185 31.344 -2.315 28.809 -2.622 24.286 -3.024 18.917 -3.39 13.838 -3.839 7.624 -4.323 4.518 -4.783 2.541 -5.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G33.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G33.eng deleted file mode 100644 index b0fd50e6a3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G33.eng +++ /dev/null @@ -1,40 +0,0 @@ -; -;Aerotech G33 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -G33 29 124 5-7 0.0722 0.1593 AT -0.027 22.642 -0.061 42.201 -0.117 47.354 -0.243 46.678 -0.34 46.339 -0.438 47.384 -0.48 50.92 -0.508 46.359 -0.543 47.732 -0.662 45.693 -0.851 42.28 -1.039 41.266 -1.116 42.987 -1.193 39.226 -1.221 42.31 -1.312 38.888 -1.326 40.609 -1.479 38.221 -1.675 35.157 -1.843 32.77 -1.878 36.888 -1.899 32.093 -1.997 30.382 -2.13 26.622 -2.263 23.547 -2.444 19.11 -2.591 13.977 -2.752 8.502 -2.892 4.743 -3.053 2.014 -3.27 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G33.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G33.rse deleted file mode 100644 index 3225b0d43e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G33.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -Aerotech G33 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G339.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G339.eng deleted file mode 100644 index 5bf8159740..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G339.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; 38-120 -; Created from TRA Certification Record issued 23 Nov 2006 -; Bill Wagstaff - 04/30/07 -G339N 38 97 0 0.049 0.190 AT -0.009 371 -0.05 375 -0.10 375 -0.15 364 -0.20 349 -0.25 310 -0.30 264 -0.324 257 -0.342 39 -0.359 0 -; -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G339.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G339.rse deleted file mode 100644 index eeb27226bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G339.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -Created from TRA Certification Record issued 23 Nov 2006 -Bill Wagstaff - 04/30/07 - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G35.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G35.eng deleted file mode 100644 index 91dac9a48f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G35.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -; -G35EJ 29 98 4-7 0.05 0.1005 AeroTech -0.01 39.14 -0.02 76.22 -0.05 64.46 -0.13 57.54 -0.21 57.53 -0.24 64.43 -0.25 57.06 -0.35 56.12 -0.43 55.2 -0.48 57.49 -0.51 52.41 -0.55 53.33 -0.76 50.54 -0.91 50.06 -1.11 44.96 -1.32 41.24 -1.55 35.68 -1.6 36.13 -1.63 33.36 -1.67 34.28 -1.8 30.12 -2 25.02 -2.14 21.32 -2.23 19.46 -2.3 15.77 -2.41 9.76 -2.53 6.52 -2.65 3.74 -2.74 1.88 -2.91 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G35.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G35.rse deleted file mode 100644 index 3c098ff606..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G35.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G38.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G38.eng deleted file mode 100644 index 18fc774bf4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G38.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -;Aerotech G38FJ RASP.ENG file made by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Thrust curve supplied by Aerotech for the molded case G38FJ motors. -G38FJ 29 124 4-7 0.0597 0.1264 Aerotech -0.024 52.928 -0.171 48.424 -0.497 45.045 -1 42.23 -1.279 39.978 -1.498 36.599 -1.783 30.406 -2.011 23.086 -2.272 10.135 -2.467 3.941 -2.64 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G38.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G38.rse deleted file mode 100644 index e6476379ec..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G38.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - -Aerotech G38FJ RASP.ENG file made by Tim Van Milligan -For RockSim www.RockSim.com -File Created March 2, 2005 -Thrust curve supplied by Aerotech for the molded case G38FJ motors. - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G40.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G40.eng deleted file mode 100644 index cd2f4c3a61..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G40.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -;Aerotech G40W RASP.ENG file made by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Thrust curve supplied by Aerotech for the molded case G40W motors. -G40W 29 124 4-7-10 0.0538 0.123 AeroTech -0.024 74.325 -0.057 67.005 -0.252 65.879 -0.5 63.063 -0.765 60.248 -1 54.054 -1.25 47.298 -1.502 36.599 -1.751 25.338 -1.999 12.951 -2.121 3.941 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G40.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G40.rse deleted file mode 100644 index 4370097c7c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G40.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - -Aerotech G40W RASP.ENG file made by Tim Van Milligan -For RockSim www.RockSim.com -File Created March 2, 2005 -Thrust curve supplied by Aerotech for the molded case G40W motors. - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G53.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G53.eng deleted file mode 100644 index ac94658f3e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G53.eng +++ /dev/null @@ -1,26 +0,0 @@ -; G53FJ based on Aerotech instruction sheet by C. Kobel 12/9/07 -G53FJ 29 124 5-7-10 0.060 0.152 AT - 0.012 44.898 - 0.031 71.504 - 0.064 80.234 - 0.081 83.976 - 0.100 86.47 - 0.150 84.599 - 0.200 81.897 - 0.300 78.571 - 0.400 76.493 - 0.500 73.583 - 0.600 70.881 - 0.700 67.347 - 0.800 63.813 - 0.900 60.072 - 1.000 54.667 - 1.100 47.392 - 1.200 39.909 - 1.300 32.426 - 1.400 25.983 - 1.500 20.578 - 1.600 10.601 - 1.700 3.949 - 1.800 1.247 - 1.850 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G53.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G53.rse deleted file mode 100644 index a5a47e67af..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G53.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - @File: G53FJ_Combined.txt, @Pts-I: 1310, @Pts-O: 32, @Sm: 2, @CO: 5% -@TI: 90.9683, @TIa: 90.6677, @TIe: 0.0%, @ThMax: 85.8995, @ThAvg: 52.9292, @Tb: 1.713 -Exported using ThrustCurveTool, www.ThrustGear.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G54.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G54.eng deleted file mode 100644 index 8b0dd00331..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G54.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -;Aerotech G54 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -G54 29 124 6-10-14 0.046 0.1365 AT -0.018 10.953 -0.042 39.215 -0.083 66.888 -0.14 72.075 -0.223 74.958 -0.25 76.694 -0.282 80.156 -0.315 79.577 -0.336 79.577 -0.354 81.64 -0.365 77.841 -0.374 80.724 -0.389 76.694 -0.455 76.116 -0.523 74.39 -0.639 70.928 -0.722 67.467 -0.82 64.005 -0.897 58.817 -0.992 51.894 -1.084 43.824 -1.197 34.017 -1.268 28.251 -1.283 29.987 -1.295 27.104 -1.328 23.642 -1.366 16.719 -1.399 9.803 -1.435 4.612 -1.51 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G54.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G54.rse deleted file mode 100644 index 720d0345fe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G54.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -Aerotech G54 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G55.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G55.eng deleted file mode 100644 index 94f21d781b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G55.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Aerotech G55 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -G55 24 117 5-10-15 0.0625 0.1148 AeroTech -0.009 81.136 -0.014 84.65 -0.034 80.557 -0.084 77.064 -0.13 71.823 -0.18 72.422 -0.206 68.919 -0.342 69.538 -0.483 68.989 -0.513 66.663 -0.543 68.42 -0.664 66.114 -0.876 66.164 -0.901 64.418 -0.997 65.026 -1.062 66.793 -1.088 63.879 -1.148 63.889 -1.158 66.813 -1.173 63.31 -1.209 62.741 -1.325 61.593 -1.395 59.277 -1.456 57.541 -1.486 58.129 -1.587 52.32 -1.708 40.094 -1.824 26.11 -1.95 15.63 -2.112 7.498 -2.258 3.446 -2.44 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G55.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G55.rse deleted file mode 100644 index 9369fb4e05..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G55.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Aerotech G55 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G61.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G61.eng deleted file mode 100644 index 6301a6e4e9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G61.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -;G61W Data Entered by Tim Van Milligan -;For RockSim: www.RockSim.com -;Based on TRA Certification Test date: June 13, 2004 -;Not Approved by TRA or Aerotech -G61W 38 106.7 6-10-14 0.0613 0.1904 AT -0.008 3.083 -0.054 71.348 -0.089 72.229 -0.174 75.312 -0.216 78.394 -0.247 79.716 -0.502 81.037 -0.753 77.073 -1.001 72.669 -1.132 66.944 -1.252 55.933 -1.503 38.316 -1.754 10.13 -1.905 3.523 -2.04 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G61.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G61.rse deleted file mode 100644 index b67b8538d4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G61.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - -G61W Data Entered by Tim Van Milligan -For RockSim: www.RockSim.com -Based on TRA Certification Test date: June 13, 2004 -Not Approved by TRA or Aerotech - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G64.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G64.eng deleted file mode 100644 index 9ebc0b9f3b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G64.eng +++ /dev/null @@ -1,32 +0,0 @@ -; Aerotech G64 Bifurcated RASP.ENG file made from data Supplied by Aerotech -; File produced August 10 by Tim Barr -; The curve drawn with these data points is as -; close to the test curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -G64BF 29 124 4-8-10 0.0625 0.1512 AERO -0.01 9.5637 -0.02 60.0510 -0.03 77.4880 -0.04 90.3211 -0.05 98.8061 -0.06 102.9986 -0.07 105.9789 -0.08 108.1140 -0.09 108.0695 -0.10 106.4237 -0.15 104.0773 -0.25 103.3222 -0.35 100.4053 -0.45 95.4399 -0.55 90.4957 -0.65 85.0522 -0.75 79.2640 -0.95 67.6591 -1.15 53.0840 -1.35 38.1535 -1.55 23.7201 -1.75 11.4636 -1.95 4.6295 -2.15 1.4518 -2.35 0.1101 -2.44 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G64.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G64.rse deleted file mode 100644 index 17bb7d9cca..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G64.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - -Aerotech G64 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G67.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G67.eng deleted file mode 100644 index 4c6e79063a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G67.eng +++ /dev/null @@ -1,49 +0,0 @@ -; -; Aerotech G67R (Redline) -; -; AeroTech RMS-38/120 EZ Access Reloadable Motors (New! Hardware). -; New AeroTech Redline Motor. Just announced on AeroTech's Website! -; File produced 28 Feb 2005. -; -; The file was produced by scaling data points off the -; thrust curve in the manufacturers catalog sheet. -; -; The motor is not yet on www.thrustcurve.org. -; Hence the amateur file production. -; The file was created by Stan Hemphill. -; Contact at stanley_hemphill@hotmail.com. -; -; Motor Dia Len Delay Prop Gross Mfg -G67R 38 106 4-6-8-9-10-12-13-15-17 0.0576 0.191 AT -0.0400 004.9200 -0.0500 006.5600 -0.0600 009.8400 -0.0700 016.4100 -0.0800 032.8100 -0.1000 049.2200 -0.1300 068.0800 -0.1500 076.2900 -0.1800 080.3900 -0.2400 082.8500 -0.2600 085.3100 -0.3100 087.7700 -0.5100 089.4100 -0.5300 091.0500 -0.5600 087.7700 -0.6000 086.9500 -0.6100 088.5900 -0.6700 086.9500 -0.6900 085.3100 -0.7100 086.9500 -0.7200 085.3100 -0.7400 086.1300 -0.7700 085.3100 -0.8100 082.0300 -0.9500 078.7500 -1.0500 073.8200 -1.4300 053.3200 -1.5000 052.5000 -1.5200 050.8600 -1.5400 045.9400 -1.6200 011.4800 -1.6400 000.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G67.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G67.rse deleted file mode 100644 index 885f827a65..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G67.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - -G67R Data Entered by Tim Van Milligan -For RockSim: www.RockSim.com -Based on Aerotech's Reload Kit Instruction Sheet. -Not Officially Approved by TRA or Aerotech - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G69.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G69.eng deleted file mode 100644 index 19cffae785..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G69.eng +++ /dev/null @@ -1,28 +0,0 @@ -; Submitted to ThrustCurve.org by Chris Kobel (4/13/07) -; G69N based on Aerotech instruction sheet by C. Kobel 3/29/07 -G69N 38 106 0 0.0622 0.195 AT - 0.020 51.972 - 0.050 75.574 - 0.100 76.709 - 0.200 77.617 - 0.300 79.206 - 0.400 81.475 - 0.500 84.425 - 0.600 86.922 - 0.700 88.737 - 0.800 89.645 - 0.900 91.688 - 1.000 93.503 - 1.100 94.411 - 1.200 94.638 - 1.300 93.957 - 1.350 93.05 - 1.400 89.418 - 1.500 62.865 - 1.600 33.362 - 1.650 19.518 - 1.700 12.028 - 1.750 7.489 - 1.800 4.539 - 1.900 1.816 - 2.000 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G69.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G69.rse deleted file mode 100644 index c03163c004..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G69.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -NAR Test Data -March 23, 2007 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71.eng deleted file mode 100644 index 0fc4607924..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71.eng +++ /dev/null @@ -1,21 +0,0 @@ -; G71R based on Aerotech instruction sheet by C. Kobel 3/29/07 -G71R 29 124 4-7-10 0.0569 0.147 AT - 0.000 0.389 - 0.050 109.714 - 0.100 117.884 - 0.200 113.216 - 0.300 109.714 - 0.400 105.045 - 0.500 99.21 - 0.600 92.207 - 0.700 83.258 - 0.800 75.477 - 0.900 68.085 - 1.000 57.97 - 1.100 47.465 - 1.200 33.848 - 1.300 21.009 - 1.400 11.283 - 1.500 5.447 - 1.600 2.334 - 1.700 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71.rse deleted file mode 100644 index a96cfbb2cc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - -G71R based on Aerotech instruction sheet by C. Kobel 3/29/07 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71_1.eng deleted file mode 100644 index 348e7dfa0e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G71_1.eng +++ /dev/null @@ -1,72 +0,0 @@ -; RMS-29/40-120 Reload, 2 grain design, G71-XR (Redline propellent), with 4, 7, -; 10 second delays -G71-R 29 120 7 0.0569 0.147 AT - 0.0080 46.656 - 0.015 74.248 - 0.023 85.787 - 0.031 100.336 - 0.05 110.871 - 0.062 116.891 - 0.085 120.403 - 0.116 119.901 - 0.139 118.898 - 0.158 116.891 - 0.181 115.386 - 0.216 114.383 - 0.251 113.379 - 0.278 111.373 - 0.297 111.373 - 0.309 114.383 - 0.328 112.376 - 0.355 109.366 - 0.39 107.359 - 0.432 104.851 - 0.463 103.848 - 0.494 100.837 - 0.525 98.831 - 0.552 95.821 - 0.583 94.316 - 0.606 92.309 - 0.633 89.299 - 0.653 87.292 - 0.676 85.787 - 0.699 81.272 - 0.714 84.282 - 0.734 81.272 - 0.749 88.797 - 0.772 80.269 - 0.799 76.255 - 0.826 73.747 - 0.861 70.737 - 0.876 73.747 - 0.892 69.232 - 0.915 69.733 - 0.923 65.72 - 0.942 63.713 - 0.977 60.703 - 1.008 58.195 - 1.039 54.181 - 1.077 50.168 - 1.108 46.154 - 1.12 50.168 - 1.127 46.154 - 1.143 43.144 - 1.178 37.626 - 1.212 32.609 - 1.232 30.101 - 1.255 26.589 - 1.274 23.579 - 1.301 20.569 - 1.317 18.06 - 1.344 15.552 - 1.382 11.539 - 1.417 10.034 - 1.448 7.024 - 1.486 6.02 - 1.517 3.512 - 1.552 3.01 - 1.587 2.508 - 1.618 1.003 - 1.668 0.502 - 1.707 0.502 - 1.734 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G74.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G74.eng deleted file mode 100644 index 0cac35a500..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G74.eng +++ /dev/null @@ -1,31 +0,0 @@ -; G74W Economax -G74W 29 83 4-6-9 0.039299999999999995 0.08700000000000001 AT - 0.023 6.551 - 0.05 21.838 - 0.088 44.852 - 0.124 67.362 - 0.135 71.561 - 0.148 74.417 - 0.197 80.128 - 0.248 85.0 - 0.298 87.52 - 0.397 89.704 - 0.499 91.215 - 0.6 90.375 - 0.699 90.375 - 0.751 89.536 - 0.8 87.856 - 0.9 84.496 - 0.954 82.144 - 0.971 81.808 - 0.987 79.96 - 1.002 76.433 - 1.023 67.194 - 1.065 44.516 - 1.094 22.174 - 1.107 15.287 - 1.126 6.887 - 1.138 3.36 - 1.157 1.344 - 1.18 0.168 - 1.192 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75.eng deleted file mode 100644 index e3e4aa5df6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75.eng +++ /dev/null @@ -1,83 +0,0 @@ -; -; Aerotech G75J (Black Jack) -; -; AeroTech RMS-29/180 Easy Access Reloadable Motor Hardware. -; -; RASP.ENG file made from made from NAR or TMT published data. -; -; File produced May, 17 2004. -; -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data from NAR or TMT files. -; -; The curve drawn with these data points is as accurate as could -; could be made scaling the data from the curve on the TMT html -; page. The file is 63 data points. NOT wRASP v1.6 compatible. -; -; The file was created by Stan Hemphill. -; Contact at stanley_hemphill@hotmail.com. -; -; Motor Dia Len Delay Prop Gross Mfg -G75J 29 194 1-3--4-6-7-9-10 0.114 0.236 AT -0.0281 068.8604 -0.0380 078.6517 -0.0561 075.9230 -0.0660 073.0337 -0.0776 070.4655 -0.1139 069.3419 -0.1403 068.6998 -0.1667 067.5762 -0.1881 070.3050 -0.2013 069.0209 -0.2294 072.5522 -0.2541 076.4045 -0.2723 071.4286 -0.3102 076.2440 -0.3350 071.9101 -0.4208 075.6019 -0.4604 072.3917 -0.5215 079.2937 -0.5941 073.3547 -0.6436 080.0963 -0.7013 073.8363 -0.7393 076.4045 -0.7541 074.6388 -0.7657 077.3676 -0.7937 078.6517 -0.8036 077.0465 -0.8168 080.2568 -0.8267 075.2809 -0.8383 081.5409 -0.8581 075.7624 -0.8795 077.8491 -0.9340 074.1573 -0.9868 079.9358 -1.0380 076.7255 -1.0561 072.2311 -1.0941 078.8122 -1.1221 075.6019 -1.1502 080.8989 -1.1617 076.8860 -1.1848 080.0963 -1.1997 076.7255 -1.2327 078.8122 -1.2508 076.4045 -1.2871 082.5040 -1.3102 077.5281 -1.3267 081.8620 -1.3564 075.2809 -1.3729 080.0963 -1.4076 075.7624 -1.4884 079.9358 -1.5116 073.6758 -1.5297 081.0594 -1.5512 074.6388 -1.5611 080.8989 -1.6040 072.8732 -1.7211 075.6019 -1.7607 068.6998 -1.7789 070.1445 -1.8119 066.9342 -1.8267 070.7865 -1.8482 070.7865 -2.3878 000.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75.rse deleted file mode 100644 index c055bd11bf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - - 29mm Aerotech G75 Metal Storm single use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75_1.eng deleted file mode 100644 index 0b7c25fed4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech G75J -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -G75J 29 194 10 0.112 0.23296 AT - 0.047 65.701 - 0.143 68.564 - 0.239 72.143 - 0.334 73.261 - 0.430 73.960 - 0.526 75.036 - 0.622 75.705 - 0.718 75.030 - 0.814 77.886 - 0.909 76.183 - 1.005 76.852 - 1.101 75.729 - 1.197 78.854 - 1.293 78.669 - 1.389 76.464 - 1.484 76.440 - 1.580 74.976 - 1.676 72.657 - 1.772 69.460 - 1.868 62.121 - 1.964 39.090 - 2.059 19.703 - 2.155 7.554 - 2.251 2.062 - 2.347 0.382 - 2.443 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75_1.rse deleted file mode 100644 index 36c02d9aa4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G75_1.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76.eng deleted file mode 100644 index c70eca0b58..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76.eng +++ /dev/null @@ -1,41 +0,0 @@ -; Curve fit of AT Instruction sheet by C. Kobel 7/29/08 -G76G 29 124 4-7-10 0.06 0.147 AT - 0.025 89.368 - 0.042 133.581 - 0.052 144.87 - 0.067 154.277 - 0.098 144.399 - 0.117 136.873 - 0.150 132.64 - 0.196 129.348 - 0.255 123.233 - 0.299 118.059 - 0.349 112.885 - 0.399 108.652 - 0.449 101.126 - 0.486 101.597 - 0.511 105.36 - 0.516 118.53 - 0.543 100.186 - 0.601 95.482 - 0.656 88.897 - 0.720 81.842 - 0.737 93.601 - 0.754 80.431 - 0.797 70.553 - 0.856 63.498 - 0.898 58.794 - 0.948 51.739 - 1.000 47.976 - 1.063 43.273 - 1.102 41.391 - 1.152 39.04 - 1.200 36.688 - 1.301 30.103 - 1.347 25.399 - 1.401 19.755 - 1.499 12.229 - 1.547 7.996 - 1.599 5.644 - 1.699 2.352 - 1.750 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76.rse deleted file mode 100644 index 7d7065b46a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - - From Official NAR Certification -@File: G76G_Composite.txt, @Pts-I: 1001, @Pts-O: 33, @Sm: 4, @CO: 5% -@TI: 114.4814, @TIa: 113.4881, @TIe: +0.01%, @ThMax: 149.6117, @ThAvg: 72.3776, @Tb: 1.568 -Mojave Green Formulation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76_1.eng deleted file mode 100644 index 37b1c4004d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G76_1.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Exported using ThrustCurveTool, www.ThrustGear.com -; NAR S&T Data, contributed by John DeMar -G72 29 124 4-7-10 0.06 0.144 Aerotech - 0.0040 4.2403 - 0.0060 9.6831 - 0.016 54.397 - 0.03 98.17 - 0.034 108.509 - 0.04 121.159 - 0.048 133.047 - 0.058 142.348 - 0.068 147.209 - 0.082 149.393 - 0.112 146.89 - 0.15 138.783 - 0.17 136.039 - 0.376 112.222 - 0.466 103.079 - 0.482 104.438 - 0.56 92.6523 - 0.606 92.8669 - 0.644 84.2058 - 0.748 73.9389 - 0.76 74.2841 - 0.79 69.704 - 0.804 70.6 - 0.822 66.7591 - 0.856 62.6853 - 1.154 39.9972 - 1.374 19.9105 - 1.474 12.5198 - 1.574 7.41771 - 1.78 1.19026 - 2.00 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77.eng deleted file mode 100644 index 1ad999d12a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Single-Use Casing. Entered by Tim Van Milligan for RockSim Users. Used John -; Coker's ThrustCurve Tracer software and NAR cert paperwork dated 7-29-06. -G77R 29 124 4 0.0591 0.122 Aerotech - 0.01 19.124 - 0.018 15.668 - 0.059 66.59 - 0.084 72.35 - 0.122 75.115 - 0.151 77.419 - 0.173 77.65 - 0.271 85.945 - 0.337 88.018 - 0.424 91.935 - 0.475 93.318 - 0.523 94.931 - 0.57 96.313 - 0.61 96.313 - 0.644 99.309 - 0.656 96.774 - 0.728 95.622 - 0.792 94.24 - 0.902 91.014 - 0.961 88.479 - 1.017 88.018 - 1.047 84.562 - 1.071 81.106 - 1.099 76.037 - 1.127 69.355 - 1.158 61.06 - 1.188 44.931 - 1.213 30.184 - 1.231 18.203 - 1.277 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77.rse deleted file mode 100644 index 620b44afc0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - -G77R Data Entered by Tim Van Milligan -For RockSim: www.RockSim.com -Based on Aerotech's Reload Kit Instruction Sheet. -Not Officially Approved by TRA or Aerotech - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77_1.eng deleted file mode 100644 index 097b721831..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G77_1.eng +++ /dev/null @@ -1,40 +0,0 @@ -; -; Aerotech G77R (Redline) -; -; AeroTech RMS-29/120 EZ Access Reloadable Motors (New! Hardware). -; New AeroTech Redline Motor. Just announced on AeroTech's Website! -; File produced 28 Feb 2005. -; -; The file was produced by scaling data points off the -; thrust curve in the manufacturers catalog sheet. -; -; The motor is not yet on www.thrustcurve.org. -; Hence the amateur file production. -; The file was created by Stan Hemphill. -; Contact at stanley_hemphill@hotmail.com. -; -; Motor Dia Len Delay Prop Gross Mfg -G77R 29 150 4-6-8-9-10-12-13-15-17 0.0554 0.155 AT -0.0132 014.8333 -0.0243 032.4479 -0.0331 046.3542 -0.0375 052.8438 -0.0463 056.5521 -0.0617 059.3333 -0.2580 073.2396 -0.6548 087.1458 -0.8709 089.0000 -0.8885 085.2917 -1.0252 086.2188 -1.0472 084.3646 -1.0715 086.2188 -1.1002 084.3646 -1.1332 085.2917 -1.1950 076.9479 -1.2104 076.0208 -1.2369 065.8229 -1.2611 043.5729 -1.2898 027.8125 -1.3317 012.0521 -1.3625 004.6354 -1.4000 000.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G78.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G78.eng deleted file mode 100644 index c309c32df0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G78.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @File: NewATG80.txt, @Pts-I: 905, @Pts-O: 31, @Sm: 0, @CO: 5% -; @TI: 133.2377, @TIa: 133.1309, @TIe: 0.0%, @ThMax: 102.2, @ThAvg: 77.9911, @Tb: 1.707 -; Exported using ThrustCurveTool, www.ThrustGear.com -G78 29 128 7,10,13 0.0625 0.1282 RCS/Aerotech - 0.0060 1.158086 - 0.0080 7.48984 - 0.01 33.7575 - 0.012 64.5955 - 0.014 62.9316 - 0.016 58.8272 - 0.018 74.9118 - 0.02 85.0062 - 0.022 91.1072 - 0.026 93.9913 - 0.028 98.4284 - 0.032 97.652 - 0.038 102.2 - 0.074 97.3192 - 0.124 95.4334 - 0.376 99.3159 - 0.68 99.4268 - 0.994 91.6619 - 1.2459 83.0095 - 1.2819 77.3522 - 1.3159 61.9332 - 1.3599 44.6285 - 1.4239 29.0986 - 1.5039 21.2227 - 1.5979 19.33693 - 1.6559 16.34188 - 1.6759 13.90147 - 1.6779 11.79384 - 1.7139 5.0938 - 1.7339 1.388816 - 1.8079 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G78_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G78_1.eng deleted file mode 100644 index fff4c4876a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G78_1.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @File: G78G_Typ.txt, @Pts-I: 1001, @Pts-O: 31, @Sm: 0, @CO: 5% -; @TI: 109.776, @TIa: 109.5639, @TIe: 0.0%, @ThMax: 102.242, @ThAvg: 79.5671, @Tb: 1.377 -; Exported using ThrustCurveTool, www.ThrustGear.com -G78G 29 146 4-7-10, 0.0597 0.125 AT/RCS -0.0040 2.76203 -0.0060 34.7707 -0.0080 44.326 -0.01 41.2789 -0.012 28.5933 -0.014 27.3926 -0.016 38.0574 -0.02 47.7036 -0.022 48.2012 -0.03 56.4344 -0.042 61.4034 -0.06 65.883 -0.212 84.526 -0.266 88.9218 -0.404 95.5932 -0.43 98.9746 -0.466 100.5362 -0.58 102.242 -0.694 101.3187 -0.86 95.4526 -1.1 90.4186 -1.132 82.5618 -1.156 72.6383 -1.168 64.903 -1.194 42.3389 -1.216 28.3424 -1.226 24.9802 -1.2559 17.40051 -1.2859 13.04651 -1.3819 5.05295 -1.4719 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79.eng deleted file mode 100644 index ae3a70ac98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79.eng +++ /dev/null @@ -1,37 +0,0 @@ -; Exported using ThrustCurveTool, www.ThrustGear.com -; @File: G79_Ave.txt, @Pts-I: 1162, @Pts-O: 33, @Sm: 5, @CO: 5% -; @TI: 106.4155, @TIa: 106.0632, @TIe: 0.0%, @ThMax: 82.1771, @ThAvg: 64.1443, @Tb: 1.659 -G79 29 146 4,7,10 0.0601 0.124 Aerotech - 0.000 0.4562 - 0.014 1.1376 - 0.018 3.2129 - 0.022 6.2017 - 0.034 27.3705 - 0.040 33.5757 - 0.044 34.8528 - 0.062 33.5201 - 0.096 39.9175 - 0.128 56.9842 - 0.138 60.0917 - 0.182 59.6191 - 0.230 68.8942 - 0.266 71.3440 - 0.300 71.6246 - 0.360 75.8167 - 0.484 79.6244 - 0.516 78.6333 - 0.678 82.1075 - 0.700 78.8360 - 0.720 78.1790 - 0.772 79.5565 - 1.054 73.7176 - 1.086 71.1520 - 1.182 68.8555 - 1.420 57.2479 - 1.520 40.7567 - 1.562 30.5794 - 1.628 11.8028 - 1.652 7.1707 - 1.680 3.9601 - 1.738 1.6764 - 1.928 0.0000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79.rse deleted file mode 100644 index 07a8b1b243..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - -G79W Data Entered by Tim Van Milligan -For RockSim: www.RockSim.com -Based on TRA Certification Test date: June 13, 2004 -Not Approved by TRA or Aerotech - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79_1.eng deleted file mode 100644 index 508cb9d554..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G79_1.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -;G79W Data Entered by Tim Van Milligan -;For RockSim: www.RockSim.com -;Based on TRA Certification Test date: June 13, 2004 -;Not Approved by TRA or Aerotech -G79W 29 149.86 6-10-14 0.0609 0.154 AT -0.015 7.157 -0.074 91.937 -0.09 91.387 -0.114 84.781 -0.145 84.23 -0.201 89.185 -0.291 94.69 -0.4 98.544 -0.6 99.645 -0.708 96.892 -0.8 93.038 -0.915 85.331 -1 77.624 -1.085 71.017 -1.175 68.265 -1.199 44.59 -1.28 22.021 -1.36 4.955 -1.42 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80.eng deleted file mode 100644 index 7e77142716..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80.eng +++ /dev/null @@ -1,37 +0,0 @@ -;G80 New Blue Thunder -G80NBT 29 123.825 4-7-10 0.069 0.129 AT -0.013 89.054 -0.018 101.584 -0.029 105.388 -0.047 102.927 -0.104 100.018 -0.19 102.255 -0.268 104.94 -0.306 104.269 -0.352 105.835 -0.41 104.94 -0.432 106.73 -0.512 105.612 -0.563 106.954 -0.591 104.493 -0.62 106.283 -0.715 103.15 -0.76 103.374 -0.806 101.36 -0.848 102.032 -1.2 88.383 -1.243 77.866 -1.269 57.952 -1.302 44.079 -1.329 34.011 -1.367 26.403 -1.398 22.823 -1.433 20.585 -1.48 21.704 -1.508 20.809 -1.584 13.201 -1.604 11.635 -1.652 11.188 -1.683 5.37 -1.701 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80.rse deleted file mode 100644 index 79461755ee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - -Aerotech G80T RASP.ENG file made by Tim Van Milligan -For RockSim www.RockSim.com -File Created March 2, 2005 -Thrust curve supplied by Aerotech for the molded case G80T motors. - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_1.eng deleted file mode 100644 index 0df93f6e00..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_1.eng +++ /dev/null @@ -1,37 +0,0 @@ -; 136 N-sec G80, Certified Nov. 2007. As published by NAR S&T. -; -; @File: NewATG80.txt, @Pts-I: 905, @Pts-O: 31, @Sm: 0, @CO: 5% -; @TI: 133.2377, @TIa: 133.1309, @TIe: 0.0%, @ThMax: 102.2, @ThAvg: 77.9911, @Tb: 1.707 -; Exported using ThrustCurveTool, www.ThrustGear.com -G78 29 128 7,10,13 0.0625 0.1282 RCS/Aerotech -0.0060 1.158086 -0.0080 7.48984 -0.01 33.7575 -0.012 64.5955 -0.014 62.9316 -0.016 58.8272 -0.018 74.9118 -0.02 85.0062 -0.022 91.1072 -0.026 93.9913 -0.028 98.4284 -0.032 97.652 -0.038 102.2 -0.074 97.3192 -0.124 95.4334 -0.376 99.3159 -0.68 99.4268 -0.994 91.6619 -1.2459 83.0095 -1.2819 77.3522 -1.3159 61.9332 -1.3599 44.6285 -1.4239 29.0986 -1.5039 21.2227 -1.5979 19.33693 -1.6559 16.34188 -1.6759 13.90147 -1.6779 11.79384 -1.7139 5.0938 -1.7339 1.388816 -1.8079 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_2.eng deleted file mode 100644 index 37179e0df5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_2.eng +++ /dev/null @@ -1,28 +0,0 @@ -; AEROTECH G80 RASP.ENG FILE -; Note: this is for the 94 N-sec G80T certified in Sept. 2006 -G80 29 124 4-7-10 0.0479 0.1129998 AERO - 0.0060 84.371 - 0.018 118.23 - 0.027 109.378 - 0.037 101.35 - 0.042 105.565 - 0.059 98.37 - 0.113 95.821 - 0.185 96.252 - 0.277 94.556 - 0.404 94.978 - 0.526 91.165 - 0.671 87.1 - 0.792 82.675 - 0.885 77.166 - 0.943 73.353 - 0.971 68.266 - 0.997 57.237 - 1.03 48.337 - 1.059 40.279 - 1.085 27.986 - 1.112 17.811 - 1.144 10.175 - 1.168 5.512 - 1.182 2.968 - 1.21 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_3.eng deleted file mode 100644 index 794363221a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_G80_3.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Aerotech G80 RASP.ENG file made from NAR published data -; File produced July 4, 2000 -; Note: This is for the 116N-sec G80T produced before Sept. 2006 -G80 29 124 4-7-10 0.0574 0.1049 A - 0.0060 101.291 - 0.013 105.18 - 0.031 103.473 - 0.038 104.069 - 0.067 99.803 - 0.103 96.906 - 0.181 94.733 - 0.271 94.039 - 0.303 96.985 - 0.367 95.547 - 0.428 94.842 - 0.456 97.055 - 0.463 92.65 - 0.51 94.872 - 0.596 93.444 - 0.606 95.646 - 0.624 91.985 - 0.635 95.656 - 0.646 91.995 - 0.696 90.547 - 0.846 85.477 - 0.96 80.388 - 1.071 74.564 - 1.207 62.878 - 1.296 52.639 - 1.35 37.252 - 1.382 20.397 - 1.418 10.139 - 1.457 4.281 - 1.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H112.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H112.eng deleted file mode 100644 index 9ebe149de2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H112.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H112J -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H112J 38 202 0 0.187712 0.379456 AT - 0.064 85.431 - 0.194 101.938 - 0.324 101.897 - 0.454 102.839 - 0.584 104.479 - 0.715 103.845 - 0.845 103.439 - 0.975 104.286 - 1.106 104.922 - 1.236 104.390 - 1.367 102.768 - 1.497 102.237 - 1.627 100.032 - 1.757 98.345 - 1.888 94.560 - 2.018 89.018 - 2.148 82.857 - 2.279 77.685 - 2.409 72.373 - 2.540 67.041 - 2.670 59.764 - 2.800 37.616 - 2.930 14.457 - 3.060 4.642 - 3.192 1.818 - 3.323 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H112.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H112.rse deleted file mode 100644 index 43bdeadaa8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H112.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - -Data Entered by Tim Van Milligan -For RockSim Users. http://www.rocksim.com -Based on Aerotech's RMS 38/240-360 Black Jack Instr. Sheet - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H115.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H115.eng deleted file mode 100644 index a3c402d618..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H115.eng +++ /dev/null @@ -1,27 +0,0 @@ -; AT H115 Dark Matter DMS -H115DM-14A 29 203 14 0.113 0.20500000000000002 AT - 0.014 89.265 - 0.024 130.742 - 0.036 108.2 - 0.048 101.588 - 0.081 111.206 - 0.202 121.124 - 0.405 123.228 - 0.598 123.829 - 0.8 123.528 - 1.002 122.326 - 1.2 114.211 - 1.269 111.807 - 1.293 111.506 - 1.35 119.32 - 1.367 117.818 - 1.393 111.807 - 1.429 88.964 - 1.467 67.024 - 1.524 44.182 - 1.562 22.842 - 1.583 13.224 - 1.6 6.913 - 1.626 3.306 - 1.662 1.202 - 1.693 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H123.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H123.eng deleted file mode 100644 index ecf537a7d4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H123.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H123W -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H123W 38 154 0 0.126336 0.278656 AT - 0.047 96.764 - 0.143 146.256 - 0.239 150.699 - 0.334 152.496 - 0.430 151.248 - 0.526 149.875 - 0.622 150.200 - 0.718 149.176 - 0.814 144.858 - 0.909 143.536 - 1.005 141.414 - 1.101 135.125 - 1.198 125.288 - 1.295 114.035 - 1.391 101.556 - 1.486 90.175 - 1.582 78.694 - 1.678 66.364 - 1.774 54.260 - 1.870 46.872 - 1.966 38.186 - 2.061 22.737 - 2.157 13.478 - 2.253 7.587 - 2.350 5.252 - 2.447 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H123.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H123.rse deleted file mode 100644 index 987a6e1e1e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H123.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H125.eng deleted file mode 100644 index 143c115561..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H125.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H125W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H125W 29 330 14 0.18816 0.32256 AT - 0.053 275.994 - 0.161 241.473 - 0.270 216.283 - 0.378 199.482 - 0.488 188.758 - 0.597 182.349 - 0.705 175.862 - 0.814 169.365 - 0.922 162.281 - 1.031 154.276 - 1.141 143.915 - 1.249 133.480 - 1.357 123.007 - 1.466 113.058 - 1.575 101.801 - 1.684 88.423 - 1.793 73.530 - 1.901 60.425 - 2.009 46.643 - 2.119 36.785 - 2.228 29.546 - 2.336 23.641 - 2.445 18.794 - 2.553 14.728 - 2.663 10.970 - 2.772 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H125.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H125.rse deleted file mode 100644 index 53954ae884..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H125.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H128.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H128.eng deleted file mode 100644 index f49d5eca30..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H128.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H128W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H128W 29 194 14 0.09408 0.2016 AT - 0.024 102.423 - 0.074 175.203 - 0.125 181.379 - 0.176 179.281 - 0.226 181.423 - 0.277 186.074 - 0.328 190.483 - 0.378 189.509 - 0.429 186.162 - 0.480 184.114 - 0.530 180.300 - 0.581 174.144 - 0.632 172.019 - 0.683 169.360 - 0.734 166.017 - 0.784 161.882 - 0.835 157.331 - 0.886 153.073 - 0.936 151.985 - 0.988 139.902 - 1.039 87.865 - 1.089 40.857 - 1.140 14.328 - 1.191 4.330 - 1.242 1.550 - 1.293 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H128.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H128.rse deleted file mode 100644 index 50058abd34..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H128.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H135.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H135.eng deleted file mode 100644 index d0d1838163..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H135.eng +++ /dev/null @@ -1,22 +0,0 @@ -; AeroTech Pro-SU 29mm H135 14sec adjustable delay. -; From Tripoli Data Sheet updated 2013/02/10 -; Created by Robert Belknap 2013/03/04 -H135W 29 216 6-8-10-12-14 0.082 0.212 AT - 0.014 159.806 - 0.045 110.931 - 0.104 144.43 - 0.131 135.643 - 0.252 154.315 - 0.293 130.701 - 0.387 149.921 - 1.005 140.037 - 1.261 119.168 - 1.297 142.233 - 1.324 109.833 - 1.387 120.267 - 1.518 110.382 - 1.595 80.727 - 1.685 60.408 - 1.797 33.499 - 1.896 14.278 - 2.072 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H148.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H148.eng deleted file mode 100644 index af5e0ad67b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H148.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech H148R -; provided by ThrustCurve.org (www.thrustcurve.org) -H148R 38 152 0 0.14784 0.30912 AT - 0.027 77.232 - 0.088 174.296 - 0.148 185.046 - 0.208 190.458 - 0.268 192.497 - 0.327 191.996 - 0.388 188.790 - 0.448 187.548 - 0.509 182.697 - 0.570 178.151 - 0.630 172.906 - 0.690 169.607 - 0.750 164.510 - 0.810 158.375 - 0.870 153.019 - 0.930 146.810 - 0.991 139.443 - 1.053 132.001 - 1.112 123.271 - 1.173 112.559 - 1.233 104.737 - 1.292 97.657 - 1.353 94.932 - 1.413 60.644 - 1.474 13.007 - 1.535 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H148.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H148.rse deleted file mode 100644 index 2a246914de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H148.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H165.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H165.eng deleted file mode 100644 index be080117bf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H165.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech H165R -; provided by ThrustCurve.org (www.thrustcurve.org) -H165R 29 194 0 0.0896 0.2016 AT - 0.018 55.047 - 0.059 157.258 - 0.101 168.509 - 0.144 173.219 - 0.186 179.237 - 0.229 183.947 - 0.271 187.872 - 0.314 188.134 - 0.356 188.919 - 0.399 190.488 - 0.441 187.349 - 0.484 189.180 - 0.525 186.547 - 0.566 185.517 - 0.609 180.807 - 0.651 177.667 - 0.694 170.602 - 0.736 167.201 - 0.779 158.828 - 0.821 155.688 - 0.864 153.333 - 0.906 136.325 - 0.949 73.526 - 0.991 20.671 - 1.034 4.448 - 1.076 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H165.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H165.rse deleted file mode 100644 index 6225bcc649..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H165.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H170.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H170.rse deleted file mode 100644 index 7fe6fa5009..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H170.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - - AT H170 Metalstorm for 38-360 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H178.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H178.eng deleted file mode 100644 index c0564edbf6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H178.eng +++ /dev/null @@ -1,35 +0,0 @@ -; H178-14 Dark Matter -H178DM 38 191 14 0.177 0.324 AT - 0.016 132.659 - 0.099 165.726 - 0.146 162.97 - 0.201 163.364 - 0.256 164.938 - 0.301 168.481 - 0.358 173.205 - 0.401 176.354 - 0.457 177.929 - 0.498 183.046 - 0.6 198.792 - 0.635 204.303 - 0.703 204.303 - 0.799 215.719 - 0.901 210.602 - 0.999 211.783 - 1.049 205.09 - 1.098 206.271 - 1.202 196.824 - 1.297 178.322 - 1.351 172.811 - 1.404 178.322 - 1.434 186.195 - 1.499 125.574 - 1.539 71.25 - 1.566 44.876 - 1.582 31.492 - 1.601 27.949 - 1.606 16.533 - 1.617 18.895 - 1.644 8.66 - 1.684 4.33 - 1.735 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H180.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H180.eng deleted file mode 100644 index 1186a72d20..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H180.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H180W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H180W 29 238 6 0.12096 0.2464 AT - 0.024 149.374 - 0.075 222.273 - 0.127 222.339 - 0.178 227.835 - 0.229 234.963 - 0.281 238.162 - 0.333 240.252 - 0.384 243.126 - 0.435 240.757 - 0.487 240.724 - 0.539 236.311 - 0.590 236.799 - 0.642 234.897 - 0.694 232.763 - 0.745 229.198 - 0.796 228.816 - 0.848 231.906 - 0.899 225.853 - 0.950 188.285 - 1.002 134.679 - 1.054 78.940 - 1.105 34.557 - 1.156 15.482 - 1.208 7.279 - 1.260 3.585 - 1.313 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H180.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H180.rse deleted file mode 100644 index 88a17d7b73..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H180.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H182.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H182.eng deleted file mode 100644 index bacab0f50f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H182.eng +++ /dev/null @@ -1,15 +0,0 @@ -; From AT DMS announcement May 2014. -H182 29 203.2 14 0.115 0.20700000000000002 AT - 0.007 82.404 - 0.031 159.208 - 0.091 158.408 - 0.186 182.409 - 0.5 192.009 - 0.904 188.809 - 1.054 175.209 - 1.106 180.809 - 1.144 200.81 - 1.163 162.408 - 1.201 36.802 - 1.212 16.801 - 1.235 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H195.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H195.eng deleted file mode 100644 index 207df719f2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H195.eng +++ /dev/null @@ -1,24 +0,0 @@ -H195NBT 29 203.2 10 0.115 0.197 AT - 0.003 178.052 - 0.005 224.131 - 0.013 252.516 - 0.019 256.571 - 0.022 248.461 - 0.058 239.614 - 0.1 240.351 - 0.199 235.559 - 0.255 228.555 - 0.285 227.449 - 0.301 230.767 - 0.399 223.025 - 0.5 223.025 - 0.603 220.445 - 0.774 217.127 - 0.802 211.598 - 0.899 201.644 - 0.961 180.632 - 0.999 169.942 - 1.023 161.094 - 1.054 155.196 - 1.101 69.304 - 1.169 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H210.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H210.eng deleted file mode 100644 index fbbc08e6b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H210.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech H210R -; provided by ThrustCurve.org (www.thrustcurve.org) -H210R 29 238 0 0.12096 0.2464 AT - 0.019 105.923 - 0.059 211.290 - 0.099 219.770 - 0.139 229.639 - 0.179 235.082 - 0.220 241.594 - 0.260 242.706 - 0.300 245.347 - 0.341 249.100 - 0.381 253.410 - 0.421 258.553 - 0.461 260.221 - 0.502 257.997 - 0.543 259.248 - 0.583 256.607 - 0.623 252.436 - 0.663 245.056 - 0.704 219.909 - 0.744 209.344 - 0.784 200.587 - 0.824 193.565 - 0.865 184.323 - 0.905 153.881 - 0.945 58.244 - 0.986 13.210 - 1.027 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H210.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H210.rse deleted file mode 100644 index 61c7c8e61e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H210.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H220.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H220.eng deleted file mode 100644 index 6c34838567..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H220.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -; -H220T 29 239 6-10-14 0.1064 0.2386 AT -0 314.1 -0.1 236.61 -0.2 269.23 -0.3 261.06 -0.4 252.9 -0.72 252.9 -0.8 112.58 -0.9 9.78 -0.96 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H220.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H220.rse deleted file mode 100644 index 366459494b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H220.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H238.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H238.eng deleted file mode 100644 index d120a7b8a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H238.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H238T -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H238T 29 194 6 0.08064 0.18816 AT - 0.019 173.100 - 0.059 206.876 - 0.100 211.036 - 0.141 214.353 - 0.181 217.113 - 0.222 219.343 - 0.263 221.034 - 0.303 224.951 - 0.344 229.324 - 0.384 229.308 - 0.425 228.558 - 0.466 226.573 - 0.506 222.365 - 0.547 219.205 - 0.588 217.750 - 0.628 213.350 - 0.669 208.070 - 0.709 200.966 - 0.750 196.988 - 0.791 151.387 - 0.831 96.273 - 0.872 59.475 - 0.912 18.621 - 0.953 7.986 - 0.995 3.697 - 1.036 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H238.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H238.rse deleted file mode 100644 index 5673734031..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H238.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242.eng deleted file mode 100644 index ec805ea87b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H242T -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H242T 38 152 10 0.11648 0.2688 AT - 0.030 164.060 - 0.093 197.516 - 0.155 204.324 - 0.218 208.970 - 0.280 211.481 - 0.343 211.261 - 0.405 209.291 - 0.468 208.438 - 0.531 206.707 - 0.595 203.967 - 0.657 198.175 - 0.720 192.137 - 0.782 186.840 - 0.845 180.802 - 0.907 174.635 - 0.970 165.581 - 1.033 159.726 - 1.097 151.690 - 1.159 144.167 - 1.222 138.550 - 1.284 119.114 - 1.347 69.055 - 1.409 21.396 - 1.472 3.473 - 1.535 0.594 - 1.599 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242.rse deleted file mode 100644 index 1b286a1354..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242_1.eng deleted file mode 100644 index 2c785d43a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H242_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H242T -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H242T 38 154 0 0.114688 0.264768 AT - 0.025 207.058 - 0.077 237.941 - 0.129 240.171 - 0.181 241.906 - 0.234 246.425 - 0.287 245.971 - 0.340 247.210 - 0.392 246.516 - 0.445 245.710 - 0.498 244.881 - 0.550 242.997 - 0.602 240.518 - 0.655 235.271 - 0.708 229.464 - 0.760 222.871 - 0.813 216.278 - 0.866 206.959 - 0.919 195.458 - 0.971 184.255 - 1.023 174.490 - 1.076 170.067 - 1.129 99.588 - 1.181 25.281 - 1.233 12.839 - 1.286 7.769 - 1.340 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H250.eng deleted file mode 100644 index 24c0e99925..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H250.eng +++ /dev/null @@ -1,26 +0,0 @@ -;I don't know that -;these ejection -;delays are correct. -;This was made -;using the Aerotech -;test thrust curves. -;By Tobin Yehle, -;11/11/07. -H250G 29 228.93 0-6-10-14 0.1163 0.256 Aerotech -0.00250627 88.6915 -0.0125313 177.383 -0.0300752 279.719 -0.0726817 311.103 -0.145363 320.654 -0.24812 311.103 -0.308271 297.458 -0.398496 282.448 -0.45614 270.168 -0.593985 238.785 -0.691729 221.047 -0.799499 218.318 -0.83208 210.131 -0.844612 189.663 -0.907268 13.6449 -0.92 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H250.rse deleted file mode 100644 index 0aa22d215d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H250.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - I don't know that -these ejection -delays are correct. -This was made -using the Aerotech -test thrust curves. -By Tobin Yehle, -11/11/07. - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H268.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H268.eng deleted file mode 100644 index a20086467f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H268.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech H268R -; provided by ThrustCurve.org (www.thrustcurve.org) -H268R 29 333 0 0.18368 0.3584 AT - 0.022 268.095 - 0.069 332.446 - 0.116 312.429 - 0.164 306.810 - 0.211 305.757 - 0.259 306.576 - 0.306 312.546 - 0.354 319.687 - 0.401 321.234 - 0.448 320.974 - 0.495 321.208 - 0.542 321.794 - 0.590 323.315 - 0.638 322.847 - 0.685 307.044 - 0.732 291.593 - 0.779 277.713 - 0.826 267.127 - 0.874 257.529 - 0.921 252.846 - 0.969 222.645 - 1.016 159.668 - 1.064 108.747 - 1.111 52.091 - 1.159 15.569 - 1.207 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H268.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H268.rse deleted file mode 100644 index 628bb13b71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H268.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45.eng deleted file mode 100644 index b8b3ad9cf9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45.eng +++ /dev/null @@ -1,13 +0,0 @@ -; From AT DMS announcement May 2014. -H45 38 202.7 10 0.18 0.364 AT - 0.04 84.004 - 0.854 86.004 - 1.377 84.804 - 2.046 79.204 - 2.69 66.003 - 3.286 51.603 - 4.414 28.401 - 5.042 16.001 - 5.429 9.2 - 6.113 6.4 - 6.186 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45.rse deleted file mode 100644 index 5307663492..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45_1.eng deleted file mode 100644 index 9077b1b00a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H45_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H45W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H45W 38 194 0 0.193984 0.294784 AT - 0.141 62.554 - 0.424 63.504 - 0.707 65.913 - 0.992 68.370 - 1.276 69.315 - 1.559 68.523 - 1.843 67.231 - 2.127 65.705 - 2.411 63.154 - 2.695 59.210 - 2.979 55.600 - 3.264 50.790 - 3.547 45.237 - 3.830 39.835 - 4.115 34.562 - 4.399 29.213 - 4.682 24.720 - 4.967 20.616 - 5.251 17.475 - 5.534 14.498 - 5.818 12.697 - 6.102 10.792 - 6.386 9.229 - 6.670 7.754 - 6.954 6.075 - 7.239 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H55.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H55.eng deleted file mode 100644 index a37175b444..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H55.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H55W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H55W 29 191 0 0.09856 0.18816 AT - 0.052 92.752 - 0.159 98.019 - 0.268 95.821 - 0.375 96.162 - 0.482 97.146 - 0.591 96.927 - 0.699 95.915 - 0.806 94.447 - 0.914 92.001 - 1.022 88.756 - 1.129 86.970 - 1.236 84.072 - 1.345 80.172 - 1.453 74.343 - 1.560 64.990 - 1.668 46.380 - 1.776 32.835 - 1.883 25.734 - 1.991 19.920 - 2.099 16.229 - 2.207 13.059 - 2.315 10.451 - 2.422 7.700 - 2.530 5.696 - 2.639 3.979 - 2.747 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H55.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H55.rse deleted file mode 100644 index b78440bab4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H55.rse +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H550.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H550.eng deleted file mode 100644 index 107da64685..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H550.eng +++ /dev/null @@ -1,41 +0,0 @@ -; AT H550 ST DMS -H550 38 206 14 0.176 0.316 AT - 0.008 445.411 - 0.009 533.786 - 0.01 565.601 - 0.013 586.812 - 0.015 623.34 - 0.021 639.837 - 0.036 606.843 - 0.045 629.232 - 0.057 615.092 - 0.061 635.123 - 0.067 619.805 - 0.101 637.48 - 0.116 622.162 - 0.157 643.372 - 0.174 623.34 - 0.196 623.34 - 0.205 639.837 - 0.231 631.588 - 0.234 618.627 - 0.255 611.557 - 0.268 628.053 - 0.314 595.06 - 0.334 600.952 - 0.362 571.493 - 0.386 565.601 - 0.401 556.175 - 0.426 518.468 - 0.445 503.15 - 0.493 447.768 - 0.505 447.768 - 0.511 456.016 - 0.519 451.303 - 0.535 357.036 - 0.545 266.304 - 0.551 179.107 - 0.559 91.91 - 0.565 42.42 - 0.572 12.962 - 0.579 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H669.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H669.eng deleted file mode 100644 index 2bddd5e65a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H669.eng +++ /dev/null @@ -1,42 +0,0 @@ -; -; 38-240 -; Greg Gardner - 09/15/06 -H669N 38 152 0 0.096 0.252 AT -0.003 141 -0.006 523 -0.009 934 -0.012 1178 -0.016 926 -0.019 684 -0.022 487 -0.025 415 -0.028 622 -0.031 801 -0.0325 906 -0.034 866 -0.037 755 -0.04 737 -0.043 666 -0.047 737 -0.0485 802 -0.05 755 -0.053 791 -0.056 765 -0.059 755 -0.062 747 -0.069 737 -0.075 761 -0.082 755 -0.088 729 -0.093 741 -0.1 751 -0.2 703 -0.25 640 -0.3 586 -0.306 584 -0.309 576 -0.312 506 -0.318 292 -0.325 93 -0.329 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H669.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H669.rse deleted file mode 100644 index b785fdfe11..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H669.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -Greg Gardner - 09/15/06 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H70.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H70.eng deleted file mode 100644 index 976cc93a55..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H70.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H70W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H70W 29 229 0 0.11648 0.224 AT - 0.055 114.847 - 0.169 131.427 - 0.283 126.879 - 0.397 127.136 - 0.510 127.254 - 0.625 125.894 - 0.739 124.917 - 0.852 122.031 - 0.967 119.032 - 1.080 115.071 - 1.194 108.446 - 1.308 102.273 - 1.422 96.098 - 1.535 86.953 - 1.650 75.702 - 1.764 62.402 - 1.877 48.132 - 1.992 36.862 - 2.105 28.065 - 2.219 21.592 - 2.333 16.894 - 2.447 12.686 - 2.560 9.681 - 2.675 6.818 - 2.790 4.488 - 2.904 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H70.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H70.rse deleted file mode 100644 index ce6c456a73..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H70.rse +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H73.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H73.eng deleted file mode 100644 index e3db2a9851..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H73.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H73J -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H73J 38 152 6 0.14784 0.30912 AT - 0.056 49.252 - 0.172 82.004 - 0.287 82.130 - 0.403 84.596 - 0.520 86.883 - 0.635 88.888 - 0.751 89.652 - 0.867 91.342 - 0.982 92.980 - 1.099 94.571 - 1.215 94.641 - 1.330 93.549 - 1.446 91.447 - 1.561 88.189 - 1.678 82.436 - 1.794 77.397 - 1.909 70.772 - 2.025 61.173 - 2.141 51.161 - 2.257 38.540 - 2.373 21.562 - 2.489 12.213 - 2.604 7.327 - 2.720 3.706 - 2.836 1.777 - 2.953 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H73.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H73.rse deleted file mode 100644 index 54fe0ba054..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H73.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H97.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H97.eng deleted file mode 100644 index 76f2fb31a9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H97.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech H97J -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H97J 29 238 6 0.1344 0.27776 AT - 0.045 89.405 - 0.136 100.289 - 0.228 100.463 - 0.320 102.019 - 0.411 102.813 - 0.503 103.550 - 0.595 101.701 - 0.686 103.056 - 0.778 103.331 - 0.870 102.613 - 0.961 103.394 - 1.053 100.963 - 1.145 101.226 - 1.236 99.864 - 1.328 98.420 - 1.420 96.827 - 1.511 95.034 - 1.603 93.241 - 1.695 93.485 - 1.786 88.068 - 1.878 64.358 - 1.970 30.264 - 2.061 8.691 - 2.153 1.399 - 2.245 0.525 - 2.336 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H97.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H97.rse deleted file mode 100644 index 8bb9d35bf7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H97.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H999.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H999.eng deleted file mode 100644 index 15d7e2bdba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H999.eng +++ /dev/null @@ -1,42 +0,0 @@ -; -; 38-360 -; Greg Gardner - 09/15/06 -H999N 38 203 0 0.144 0.331 AT -0.003 204 -0.006 757 -0.009 1357 -0.012 1710 -0.016 1345 -0.019 995 -0.022 710 -0.025 606 -0.028 905 -0.031 1165 -0.0325 1311 -0.034 1258 -0.037 1098 -0.04 1072 -0.043 969 -0.047 1072 -0.0485 1166 -0.05 1098 -0.053 1160 -0.056 1117 -0.059 1103 -0.062 1093 -0.069 1076 -0.075 1110 -0.082 1105 -0.088 1065 -0.093 1082 -0.1 1092 -0.2 1022 -0.25 931 -0.3 853 -0.306 850 -0.309 838 -0.312 735 -0.318 435 -0.325 161 -0.329 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H999.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H999.rse deleted file mode 100644 index 72065d096e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_H999.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -Greg Gardner - 09/15/06 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I115.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I115.eng deleted file mode 100644 index 08157b00e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I115.eng +++ /dev/null @@ -1,26 +0,0 @@ -; Aerotech I115W from TRA Cert Data -I115W 54 156 6-10-14-P 0.229 0.58 AT - 0.034 12.095 - 0.177 105.225 - 0.206 113.087 - 1.017 163.281 - 1.166 161.466 - 1.257 162.676 - 1.343 166.909 - 1.417 160.862 - 1.514 162.676 - 1.617 163.885 - 1.686 160.257 - 1.977 142.719 - 2.497 106.435 - 2.68 91.316 - 2.994 72.569 - 3.103 67.126 - 3.189 65.917 - 3.24 59.265 - 3.291 42.937 - 3.331 30.237 - 3.377 20.561 - 3.429 12.7 - 3.491 7.257 - 3.514 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I117.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I117.eng deleted file mode 100644 index 21068506eb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I117.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Aerotech I117FJ from TRA Cert Data -I117FJ 54 156 6-10-14-P 0.253 0.58 AT - 0.014 65.9 - 0.021 94.456 - 0.055 120.816 - 0.089 107.636 - 0.179 107.636 - 0.344 124.111 - 0.385 133.996 - 0.447 123.013 - 0.509 138.389 - 0.564 131.799 - 0.646 146.077 - 0.708 144.979 - 0.736 127.406 - 0.75 149.372 - 0.798 141.684 - 0.825 164.749 - 0.866 152.667 - 1.004 158.159 - 1.141 155.962 - 1.224 154.864 - 1.492 155.962 - 2.304 121.914 - 2.407 118.619 - 2.482 117.521 - 2.544 128.504 - 2.599 112.029 - 2.654 75.784 - 2.695 45.031 - 2.75 16.475 - 2.771 8.787 - 2.806 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I1299.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I1299.eng deleted file mode 100644 index f698f302ee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I1299.eng +++ /dev/null @@ -1,24 +0,0 @@ -;Entered by Jim Yehle -;from TRA cert document -I1299N 38 249 1000 0.192 0.422 AT-RMS -0 15.7171 -0.00361 222.5 -0.0115 1112 -0.0134228 1237.11 -0.02 1287 -0.04 1359 -0.1 1451 -0.12 1470 -0.18 1491 -0.2 1483 -0.22 1462 -0.24 1399 -0.28 1208 -0.294743 1131.63 -0.3 1065 -0.304251 974.46 -0.32 305 -0.330537 55.0098 -0.333893 11.7878 -0.34 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I1299.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I1299.rse deleted file mode 100644 index 1f12d95129..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I1299.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - Entered by Jim Yehle -from TRA cert document - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I132.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I132.eng deleted file mode 100644 index a7aea82e3d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I132.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I132W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I132W 38 335 0 0.365568 0.512064 AT - 0.096 204.011 - 0.290 174.236 - 0.484 168.865 - 0.679 170.783 - 0.874 173.028 - 1.069 174.287 - 1.264 174.647 - 1.458 174.364 - 1.652 174.645 - 1.847 173.002 - 2.042 169.209 - 2.236 164.309 - 2.431 157.149 - 2.626 149.580 - 2.821 138.360 - 3.016 124.171 - 3.210 107.626 - 3.404 89.785 - 3.599 71.747 - 3.794 55.124 - 3.989 42.264 - 4.183 31.373 - 4.378 21.980 - 4.573 14.389 - 4.768 8.794 - 4.962 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I132.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I132.rse deleted file mode 100644 index 8e04872889..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I132.rse +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I140.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I140.eng deleted file mode 100644 index 4d9e0012e2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I140.eng +++ /dev/null @@ -1,25 +0,0 @@ -; AT I140W DMS -I140W 38 202.7 14-12-10-8-6 0.183 0.356 AT - 0.011 96.257 - 0.024 80.214 - 0.049 160.428 - 0.062 144.02 - 0.114 160.428 - 0.159 164.074 - 0.238 174.647 - 0.314 173.918 - 0.419 179.023 - 0.627 178.293 - 0.835 176.835 - 0.943 177.2 - 1.146 164.803 - 1.349 148.76 - 1.459 141.103 - 1.562 131.259 - 1.773 113.393 - 2.192 83.86 - 2.295 67.088 - 2.395 37.555 - 2.435 31.356 - 2.47 20.418 - 2.478 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I154.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I154.eng deleted file mode 100644 index b6a9a37e25..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I154.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I154J -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I154J 38 250 0 0.25088 0.491904 AT - 0.066 120.409 - 0.199 150.638 - 0.332 151.666 - 0.466 156.806 - 0.599 150.331 - 0.732 150.602 - 0.866 145.101 - 0.999 144.469 - 1.133 145.159 - 1.268 145.912 - 1.401 141.710 - 1.534 142.828 - 1.668 141.187 - 1.801 140.970 - 1.934 137.832 - 2.068 128.417 - 2.202 122.339 - 2.336 111.986 - 2.470 105.295 - 2.603 96.602 - 2.736 90.469 - 2.870 57.427 - 3.003 20.489 - 3.136 4.707 - 3.271 2.966 - 3.405 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I154.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I154.rse deleted file mode 100644 index af341650bd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I154.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I161.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I161.eng deleted file mode 100644 index dbcfb7ed85..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I161.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I161W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I161W 38 191 0 0.189952 0.370048 AT - 0.043 178.900 - 0.131 206.770 - 0.221 206.101 - 0.310 205.175 - 0.400 206.924 - 0.490 210.603 - 0.579 210.475 - 0.669 211.555 - 0.758 212.379 - 0.848 212.096 - 0.938 209.060 - 1.027 202.345 - 1.116 192.439 - 1.204 179.499 - 1.294 162.159 - 1.383 148.446 - 1.473 135.222 - 1.563 120.095 - 1.652 104.041 - 1.742 87.962 - 1.831 74.789 - 1.921 54.362 - 2.010 23.386 - 2.100 7.332 - 2.190 5.171 - 2.279 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I161.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I161.rse deleted file mode 100644 index fd743b4e09..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I161.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I170.eng deleted file mode 100644 index 26530fc7de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I170.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Aerotech I170G from TRA Cert Data -; Created by Mark Hairfield 12-29-10 -I170G 54 151 10 0.227 0.528 AT - 0.06 89.0 - 0.16 169.0 - 0.25 184.6 - 0.5 202.4 - 0.75 207.3 - 1.0 202.4 - 1.5 177.9 - 2.18 137.9 - 2.25 139.7 - 2.30 131.2 - 2.35 22.2 - 2.40 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195.eng deleted file mode 100644 index c0dbe0339c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I195J -; converted from TMT test stand data 1996 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I195J 38 298 10 0.3136 0.59136 AT - 0.050 258.670 - 0.152 353.638 - 0.254 300.655 - 0.356 265.354 - 0.458 266.338 - 0.560 283.233 - 0.662 332.442 - 0.765 283.040 - 0.867 230.795 - 0.969 222.867 - 1.071 217.091 - 1.173 210.600 - 1.275 202.722 - 1.377 192.671 - 1.479 182.571 - 1.581 171.964 - 1.683 162.238 - 1.785 148.138 - 1.888 130.259 - 1.990 107.022 - 2.092 80.230 - 2.194 51.074 - 2.296 26.313 - 2.398 10.397 - 2.500 3.977 - 2.602 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195.rse deleted file mode 100644 index 4bc0e4e4cd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195_1.eng deleted file mode 100644 index 25e6b13ef6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I195_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I195J -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I195J 38 297 0 0.296576 0.563136 AT - 0.033 190.099 - 0.103 354.046 - 0.173 393.473 - 0.243 414.842 - 0.314 379.747 - 0.383 364.640 - 0.453 364.776 - 0.524 357.242 - 0.594 355.802 - 0.664 355.644 - 0.734 353.557 - 0.804 339.941 - 0.874 309.753 - 0.944 275.017 - 1.014 243.739 - 1.084 218.135 - 1.154 197.291 - 1.224 173.680 - 1.295 147.000 - 1.365 116.506 - 1.434 83.105 - 1.505 51.011 - 1.575 26.480 - 1.645 13.927 - 1.716 7.273 - 1.786 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I200.eng deleted file mode 100644 index 9b2bf33c79..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I200.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I200W -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I200W 29 333 0 0.181888 0.357504 AT - 0.033 303.951 - 0.103 273.452 - 0.174 276.061 - 0.245 271.625 - 0.316 268.233 - 0.386 258.449 - 0.457 252.480 - 0.528 246.642 - 0.599 242.304 - 0.670 237.737 - 0.741 234.769 - 0.811 233.171 - 0.882 230.660 - 0.953 224.985 - 1.024 221.658 - 1.095 214.548 - 1.166 177.365 - 1.236 154.208 - 1.307 119.146 - 1.378 91.586 - 1.449 65.330 - 1.520 32.877 - 1.591 28.702 - 1.661 22.211 - 1.732 15.558 - 1.803 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I200.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I200.rse deleted file mode 100644 index d8f1327dcb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I200.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I205.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I205.eng deleted file mode 100644 index f1130bdd15..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I205.eng +++ /dev/null @@ -1,17 +0,0 @@ -; From AT DMS announcement May 2014. -I205 29 304.8 14 0.188 0.315 AT - 0.008 377.299 - 0.028 241.932 - 0.36 256.333 - 0.711 246.252 - 0.861 233.292 - 1.121 230.411 - 1.146 214.571 - 1.242 211.69 - 1.349 141.127 - 1.404 125.286 - 1.489 72.004 - 1.602 41.762 - 1.712 11.521 - 1.787 12.961 - 1.892 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I211.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I211.eng deleted file mode 100644 index 43dd444642..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I211.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I211W -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I211W 38 240 0 0.247296 0.466368 AT - 0.044 257.326 - 0.134 295.533 - 0.226 296.087 - 0.318 298.204 - 0.408 295.082 - 0.499 287.669 - 0.591 282.578 - 0.682 272.875 - 0.773 266.997 - 0.864 257.602 - 0.955 250.495 - 1.047 238.574 - 1.138 228.571 - 1.228 215.135 - 1.320 198.047 - 1.411 180.631 - 1.502 161.261 - 1.593 146.708 - 1.684 134.484 - 1.776 101.241 - 1.867 52.688 - 1.957 35.461 - 2.049 24.321 - 2.141 11.165 - 2.232 4.587 - 2.324 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I211.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I211.rse deleted file mode 100644 index bfd77caa4d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I211.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I215.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I215.eng deleted file mode 100644 index 3fa60574bd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I215.eng +++ /dev/null @@ -1,22 +0,0 @@ -; Aerotech I215R from TRA Cert Data -I215R 54 156 6-10-14-P 0.20800000000000002 0.527 AT - 0.049 88.39 - 0.089 154.683 - 0.094 206.914 - 0.178 245.083 - 0.251 255.127 - 0.325 259.145 - 0.404 249.1 - 0.582 257.136 - 0.631 253.118 - 0.7 253.118 - 0.774 245.083 - 1.001 239.056 - 1.509 192.852 - 1.681 178.79 - 1.716 180.799 - 1.746 190.843 - 1.775 178.79 - 1.8 90.399 - 1.82 34.151 - 1.859 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I218.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I218.eng deleted file mode 100644 index f9bf8c98b9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I218.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech I218R -; provided by ThrustCurve.org (www.thrustcurve.org) -I218R 38 191 0 0.19264 0.37184 AT - 0.027 136.078 - 0.088 275.030 - 0.148 280.998 - 0.208 284.371 - 0.268 284.037 - 0.327 279.311 - 0.388 277.791 - 0.448 276.309 - 0.509 269.384 - 0.570 266.041 - 0.630 261.907 - 0.690 256.366 - 0.750 250.565 - 0.810 242.206 - 0.870 234.607 - 0.930 225.488 - 0.991 216.166 - 1.053 205.415 - 1.112 193.238 - 1.173 177.206 - 1.233 161.304 - 1.292 139.118 - 1.353 96.082 - 1.413 38.848 - 1.474 5.978 - 1.535 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I218.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I218.rse deleted file mode 100644 index c556068b62..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I218.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I225.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I225.eng deleted file mode 100644 index ca0504263c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I225.eng +++ /dev/null @@ -1,28 +0,0 @@ -; AeroTech I225FJ -; Curvefit to instruction sheet on Aerotech website (12/27/06) -; by Chris Kobel -; burn time: 1.8 seconds -; total impulse: 350.5 newton-seconds -; average thrust: 43.8 pounds -I225FJ 38 202 6-10-14 0.2417 0.486 AT - 0.04 213.6 - 0.10 213.6 - 0.20 218.1 - 0.28 235.9 - 0.30 249.2 - 0.40 262.6 - 0.50 267.0 - 0.60 271.5 - 0.70 275.9 - 0.80 275.9 - 0.87 271.5 - 0.90 258.1 - 1.00 240.3 - 1.10 218.1 - 1.20 200.3 - 1.30 178.0 - 1.40 160.2 - 1.50 97.9 - 1.60 40.1 - 1.70 13.4 - 1.80 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I225.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I225.rse deleted file mode 100644 index a0a2c514aa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I225.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - Converted from RASP file by Chris Kobel mfr data -Curvefit to instruction sheet on Aerotech website (12/27/06) - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I229.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I229.eng deleted file mode 100644 index 5596f768a6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I229.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -I229T 54.0 156.00 6-10-14 0.20600 0.52000 AT - 0.01 44.73 - 0.02 216.65 - 0.19 244.72 - 0.40 266.64 - 0.49 266.64 - 0.52 273.66 - 0.59 271.90 - 0.75 272.78 - 0.84 268.40 - 0.88 271.90 - 0.97 262.26 - 1.00 265.76 - 1.07 255.24 - 1.21 249.10 - 1.51 219.28 - 1.60 230.68 - 1.63 191.21 - 1.64 132.44 - 1.66 86.83 - 1.70 44.73 - 1.71 21.05 - 1.73 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I245.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I245.eng deleted file mode 100644 index 6c0c3934bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I245.eng +++ /dev/null @@ -1,30 +0,0 @@ -;Ejection delays may not be corrrect. -;From Aerotech pre-cert data. -;Created 11/11/07 by Jim Yehle. -I245G 38 192.532 0-6-10-14 0.1813 0.365 Aerotech -0.0244989 234.061 -0.0550162 257.888 -0.0868597 368.567 -0.106904 382.335 -0.13363 390.808 -0.200445 405.635 -0.262806 410.931 -0.302895 411.99 -0.363029 408.813 -0.401294 398.43 -0.501114 363.271 -0.594655 320.907 -0.68932 278.355 -0.797327 212.879 -0.893204 181.477 -1.00647 154.187 -1.09061 133.72 -1.16036 120.737 -1.1804 122.856 -1.23625 106.43 -1.30421 75.0467 -1.3608 36.0094 -1.40312 19.0638 -1.43875 5.2955 -1.46325 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I245.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I245.rse deleted file mode 100644 index 7f0ed5a9f4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I245.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - Ejection delays may not be corrrect. -From Aerotech pre-cert data. -Created 11/11/07 by Jim Yehle. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I280.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I280.eng deleted file mode 100644 index 6d7af43e4f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I280.eng +++ /dev/null @@ -1,34 +0,0 @@ -; I280DM DMS -I280DM 38 356.4 14-12-10-8-6 0.355 0.616 AT - 0.016 342.389 - 0.048 297.021 - 0.111 316.16 - 0.173 328.211 - 0.202 327.502 - 0.261 322.54 - 0.334 311.907 - 0.498 310.489 - 0.602 308.363 - 0.705 307.654 - 0.802 310.489 - 0.902 310.489 - 1.0 306.236 - 1.025 316.869 - 1.057 309.072 - 1.1 308.363 - 1.139 317.578 - 1.205 307.654 - 1.298 304.109 - 1.336 316.16 - 1.4 299.856 - 1.5 296.312 - 1.55 298.438 - 1.595 306.945 - 1.634 295.603 - 1.652 280.716 - 1.716 253.07 - 1.743 224.006 - 1.8 153.827 - 1.9 62.381 - 1.97 20.558 - 1.971 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284.eng deleted file mode 100644 index 3c0084a978..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I284W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I284W 38 298 10 0.3136 0.55552 AT - 0.033 370.682 - 0.103 483.606 - 0.174 483.282 - 0.245 486.856 - 0.316 490.842 - 0.386 499.428 - 0.457 508.800 - 0.528 506.326 - 0.599 485.287 - 0.670 481.043 - 0.741 455.776 - 0.811 426.920 - 0.882 393.422 - 0.953 367.404 - 1.024 347.490 - 1.095 325.191 - 1.166 304.064 - 1.236 284.158 - 1.307 271.165 - 1.378 228.579 - 1.449 130.521 - 1.520 57.212 - 1.591 29.552 - 1.661 16.413 - 1.732 10.365 - 1.803 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284.rse deleted file mode 100644 index 37a4c91235..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284_1.eng deleted file mode 100644 index b15b05bdf1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I284_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I284W -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I284W 38 297 0 0.310016 0.555072 AT - 0.041 422.031 - 0.125 448.597 - 0.210 459.029 - 0.295 451.940 - 0.379 439.556 - 0.465 427.370 - 0.549 407.558 - 0.633 399.734 - 0.719 380.049 - 0.803 368.042 - 0.887 352.020 - 0.973 342.102 - 1.057 325.767 - 1.142 306.936 - 1.227 292.029 - 1.311 267.283 - 1.396 251.784 - 1.481 227.534 - 1.566 210.504 - 1.650 168.299 - 1.735 110.789 - 1.820 71.036 - 1.904 32.505 - 1.990 17.537 - 2.075 7.317 - 2.160 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I285.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I285.eng deleted file mode 100644 index 306ebff098..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I285.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech I285R -; provided by ThrustCurve.org (www.thrustcurve.org) -I285R 38 250 0 0.25088 0.4928 AT - 0.027 171.405 - 0.088 325.573 - 0.148 341.697 - 0.208 358.916 - 0.268 373.706 - 0.327 373.966 - 0.388 368.442 - 0.448 367.497 - 0.507 361.900 - 0.568 351.928 - 0.628 346.109 - 0.687 340.993 - 0.749 329.382 - 0.810 321.625 - 0.870 310.856 - 0.930 295.955 - 0.990 283.704 - 1.050 269.655 - 1.110 253.419 - 1.170 240.222 - 1.230 224.116 - 1.290 204.118 - 1.350 118.730 - 1.410 23.483 - 1.471 2.046 - 1.532 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I285.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I285.rse deleted file mode 100644 index 2a80baaf38..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I285.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I300.eng deleted file mode 100644 index b0249ef6be..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I300.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -; -I300T 38 250 6-10-14 0.2216 0.4405 AT -0 473.17 -0.1 395.68 -0.2 375.31 -0.3 367.14 -0.4 358.97 -0.5 346.72 -0.6 338.56 -0.7 318.19 -0.8 305.94 -0.9 295.35 -1.07 269.23 -1.1 258.01 -1.2 246.79 -1.3 179.49 -1.4 48.95 -1.5 13.91 -1.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I300.rse deleted file mode 100644 index 83a58b4da9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I300.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I305.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I305.eng deleted file mode 100644 index ac446a2120..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I305.eng +++ /dev/null @@ -1,21 +0,0 @@ -; I305FJ based on Aerotech instruction sheet by C. Kobel 3/30/07 -I305FJ 38 298 6-10-14 0.302 0.581 AT - 0.020 341.398 - 0.100 365.497 - 0.200 383.571 - 0.300 403.653 - 0.400 405.662 - 0.500 405.662 - 0.600 404.657 - 0.700 374.534 - 0.800 342.402 - 0.900 309.267 - 1.000 272.115 - 1.100 238.979 - 1.150 224.921 - 1.200 194.798 - 1.300 119.489 - 1.400 62.255 - 1.450 33.136 - 1.500 23.095 - 1.600 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I305.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I305.rse deleted file mode 100644 index 60813762e9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I305.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - -I305FJ based on Aerotech instruction sheet by C. Kobel 3/30/07 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I327.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I327.eng deleted file mode 100644 index b768e06997..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I327.eng +++ /dev/null @@ -1,25 +0,0 @@ -; I327-14 Dark Matter -I327DM 38 337 14 0.354 0.628 AT - 0.0090 393.741 - 0.026 432.602 - 0.161 387.142 - 0.245 382.742 - 0.303 371.011 - 0.601 372.477 - 0.702 371.011 - 0.798 375.41 - 0.983 371.744 - 1.04 370.278 - 1.104 371.744 - 1.199 343.148 - 1.3 335.816 - 1.335 357.813 - 1.365 327.751 - 1.399 265.427 - 1.428 185.505 - 1.451 156.91 - 1.493 112.183 - 1.553 68.19 - 1.601 32.262 - 1.656 11.732 - 1.723 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I350.eng deleted file mode 100644 index 224051dd55..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I350.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Aerotech I350-10R single use motor file created using Aerotech instruction -; sheet data and thrust tracer utility. -I350-10R 38 356 P 0.34800000000000003 0.616 AT - 0.0040 2.809 - 0.0080 207.896 - 0.031 272.512 - 0.035 359.603 - 0.046 407.363 - 0.081 432.648 - 0.104 435.457 - 0.127 427.029 - 0.184 435.457 - 0.223 443.886 - 0.299 469.17 - 0.399 480.408 - 0.503 486.027 - 0.603 474.789 - 0.702 469.17 - 0.802 457.933 - 0.906 443.886 - 1.002 432.648 - 1.098 415.792 - 1.205 390.507 - 1.298 368.032 - 1.401 345.556 - 1.443 325.891 - 1.497 216.324 - 1.532 101.138 - 1.57 33.713 - 1.605 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I357.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I357.eng deleted file mode 100644 index e16e7c5d33..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I357.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I357T -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I357T 38 203 14 0.1792 0.34944 AT - 0.028 311.629 - 0.087 351.768 - 0.147 349.074 - 0.206 346.175 - 0.266 341.229 - 0.325 336.857 - 0.384 333.748 - 0.444 326.960 - 0.503 319.679 - 0.563 312.533 - 0.622 300.790 - 0.681 292.787 - 0.741 283.766 - 0.800 274.578 - 0.859 264.915 - 0.919 254.273 - 0.978 241.755 - 1.037 229.020 - 1.097 216.238 - 1.156 187.776 - 1.216 109.940 - 1.275 56.459 - 1.334 24.476 - 1.394 10.977 - 1.454 3.450 - 1.515 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I357.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I357.rse deleted file mode 100644 index c4c2c62dd9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I357.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I364.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I364.eng deleted file mode 100644 index c2fffb83af..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I364.eng +++ /dev/null @@ -1,25 +0,0 @@ -; AeroTech I364FJ -; Curvefit to instruction sheet on Aerotech website (12/27/06) -; by Chris Kobel -; burn time: 1.7 seconds -; total impulse: 551.2 newton-seconds -; average thrust: 72.9 pounds -I364FJ 38 345 6-10-14 0.3625 0.678 AT - 0.02 356.0 - 0.10 373.8 - 0.20 387.2 - 0.30 400.5 - 0.40 400.5 - 0.50 409.4 - 0.60 413.9 - 0.70 409.4 - 0.80 382.7 - 0.90 373.8 - 1.00 351.6 - 1.10 333.8 - 1.20 320.4 - 1.30 311.5 - 1.40 244.8 - 1.50 178.0 - 1.60 80.1 - 1.70 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I364.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I364.rse deleted file mode 100644 index bf6f01b20e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I364.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - -AeroTech I364FJ -Curvefit to instruction sheet on Aerotech website (12/27/06) -by Chris Kobel -burn time: 1.7 seconds -total impulse: 551.2 newton-seconds -average thrust: 72.9 pounds - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I366.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I366.eng deleted file mode 100644 index 324ddf1401..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I366.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech I366R -; provided by ThrustCurve.org (www.thrustcurve.org) -I366R 38 298 0 0.3136 0.55552 AT - 0.027 323.256 - 0.088 485.393 - 0.148 483.744 - 0.208 479.926 - 0.268 473.365 - 0.327 466.192 - 0.388 457.444 - 0.448 448.751 - 0.509 441.477 - 0.570 430.236 - 0.630 421.524 - 0.690 411.757 - 0.750 398.876 - 0.810 387.496 - 0.870 375.430 - 0.930 361.325 - 0.991 345.057 - 1.053 330.392 - 1.112 312.636 - 1.173 293.508 - 1.233 275.085 - 1.292 262.408 - 1.353 230.881 - 1.413 118.008 - 1.474 23.611 - 1.535 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I366.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I366.rse deleted file mode 100644 index e28536dbb6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I366.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435.eng deleted file mode 100644 index e8b87be770..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I435T -; converted from TMT test stand data 1996 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I435T 38 298 6 0.28672 0.52864 AT - 0.026 684.626 - 0.080 702.334 - 0.134 655.130 - 0.190 638.942 - 0.245 624.098 - 0.299 611.802 - 0.354 602.601 - 0.409 590.237 - 0.464 575.712 - 0.519 563.654 - 0.574 548.912 - 0.628 527.885 - 0.683 504.211 - 0.739 480.412 - 0.793 459.219 - 0.848 436.771 - 0.903 414.493 - 0.957 392.151 - 1.012 366.634 - 1.068 299.670 - 1.122 182.639 - 1.177 106.457 - 1.232 55.447 - 1.286 23.628 - 1.342 11.052 - 1.397 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435.rse deleted file mode 100644 index bcdde88969..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435_1.eng deleted file mode 100644 index c6dae9b00c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I435_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I435T -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I435T 38 297 0 0.26656 0.513408 AT - 0.024 808.049 - 0.074 749.691 - 0.124 709.215 - 0.174 656.216 - 0.224 636.578 - 0.274 621.839 - 0.324 592.267 - 0.374 584.551 - 0.424 573.277 - 0.474 547.725 - 0.524 539.962 - 0.574 525.268 - 0.624 500.456 - 0.674 484.978 - 0.724 464.323 - 0.774 442.837 - 0.824 424.540 - 0.874 405.872 - 0.924 393.443 - 0.974 317.157 - 1.024 217.630 - 1.074 126.188 - 1.124 74.391 - 1.174 30.034 - 1.224 9.380 - 1.274 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I49.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I49.eng deleted file mode 100644 index 5d73150b7d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I49.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Aerotech I49N-P -I49N-P 38 184 P 0.20500000000000002 0.398 AT - 0.0080 1.406 - 0.025 48.594 - 0.093 52.031 - 0.429 57.344 - 0.665 60.313 - 0.841 60.625 - 1.06 62.344 - 1.295 63.438 - 1.556 62.344 - 1.825 62.344 - 1.994 60.625 - 2.212 60.156 - 3.003 56.719 - 3.785 52.344 - 4.349 49.375 - 4.997 46.563 - 5.998 43.438 - 6.393 42.031 - 6.831 41.563 - 6.999 36.875 - 7.083 33.125 - 7.184 31.406 - 7.369 23.125 - 7.495 16.406 - 7.764 4.219 - 7.882 1.875 - 7.941 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I49.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I49.rse deleted file mode 100644 index 45f55d9924..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I49.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - Aerotech I49N-P - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I500.eng deleted file mode 100644 index 180fa4a774..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I500.eng +++ /dev/null @@ -1,38 +0,0 @@ -; At DMS I500T -I500T-14A 38 355 14 0.248 0.58 AT - 0.008 447.072 - 0.014 534.306 - 0.028 581.557 - 0.052 504.016 - 0.09 514.92 - 0.11 533.094 - 0.131 524.613 - 0.177 551.268 - 0.202 540.364 - 0.23 552.479 - 0.29 543.998 - 0.399 552.479 - 0.481 553.691 - 0.526 563.384 - 0.565 554.902 - 0.6 564.595 - 0.638 558.537 - 0.728 567.018 - 0.8 560.96 - 0.922 537.94 - 0.979 535.517 - 0.999 546.421 - 1.02 550.056 - 1.043 535.517 - 1.064 444.649 - 1.091 322.28 - 1.11 267.759 - 1.141 225.353 - 1.152 181.737 - 1.16 238.681 - 1.163 149.024 - 1.174 118.735 - 1.2 118.735 - 1.255 86.022 - 1.312 46.04 - 1.335 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I59.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I59.eng deleted file mode 100644 index 11a81c75f6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I59.eng +++ /dev/null @@ -1,37 +0,0 @@ -; Aerotech I59WN-P -I59WN-P 38 232 P 0.272 0.487 AT - 0.0090 0.357 - 0.046 138.571 - 0.12 150.0 - 0.193 147.857 - 0.368 157.857 - 0.506 167.857 - 0.699 171.071 - 0.791 171.786 - 0.893 168.571 - 1.058 158.214 - 1.233 146.429 - 1.417 132.143 - 1.509 125.714 - 1.61 100.357 - 1.675 80.357 - 1.785 60.357 - 1.96 53.571 - 2.209 48.571 - 2.531 45.357 - 2.669 43.214 - 3.009 40.714 - 3.387 40.714 - 4.021 38.929 - 4.261 37.5 - 4.997 36.429 - 6.0 33.929 - 6.883 31.429 - 7.003 33.571 - 7.187 30.714 - 7.334 27.5 - 7.574 22.5 - 7.96 17.5 - 8.117 9.643 - 8.319 4.643 - 8.604 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I59.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I59.rse deleted file mode 100644 index e7e41783fa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I59.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - Aerotech I59WN-P - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I599.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I599.eng deleted file mode 100644 index f306c521ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I599.eng +++ /dev/null @@ -1,37 +0,0 @@ -; Aerotech I599N from TRA Cert Data -I599N 54 156 100 0.195 0.5200512 AT - 0.0070 179.424 - 0.01 495.908 - 0.012 578.144 - 0.014 647.92 - 0.017 797.44 - 0.024 593.096 - 0.032 647.92 - 0.045 677.824 - 0.051 702.744 - 0.055 677.824 - 0.062 720.188 - 0.076 707.728 - 0.12 752.584 - 0.202 757.568 - 0.225 755.076 - 0.241 735.14 - 0.25 720.188 - 0.263 730.156 - 0.329 722.68 - 0.399 697.76 - 0.45 667.856 - 0.501 618.016 - 0.536 585.62 - 0.55 580.636 - 0.564 585.62 - 0.578 632.968 - 0.581 555.716 - 0.584 426.132 - 0.589 299.04 - 0.595 176.932 - 0.598 112.14 - 0.604 57.316 - 0.608 24.92 - 0.619 12.46 - 0.623 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I600.eng deleted file mode 100644 index 8499b0c9ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I600.eng +++ /dev/null @@ -1,23 +0,0 @@ -; -;I600R Data Entered by Tim Van Milligan -;For RockSim: www.RockSim.com -;Based on Aerotech's Reload Kit Instruction Sheet. -;Not Officially Approved by TRA or Aerotech -I600R 38 344.68 6-10-14 0.3237 0.617 AT -0.005 40.438 -0.046 817.754 -0.059 813.261 -0.1 772.822 -0.2 736.877 -0.4 696.439 -0.5 669.48 -0.6 620.055 -0.796 539.178 -0.894 485.261 -0.951 453.809 -0.964 435.836 -1 274.082 -1.052 152.767 -1.106 62.904 -1.144 13.48 -1.18 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I600.rse deleted file mode 100644 index 1e24f337ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I600.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - -I600R Data Entered by Tim Van Milligan -For RockSim: www.RockSim.com -Based on Aerotech's Reload Kit Instruction Sheet. -Not Officially Approved by TRA or Aerotech - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65.eng deleted file mode 100644 index 4808b3e450..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65.eng +++ /dev/null @@ -1,15 +0,0 @@ -; From AT DMS announcement May 2014. -I65 54 218 10 0.377 0.752 AT - 0.023 148.274 - 0.211 196.341 - 0.398 167.827 - 0.797 149.903 - 1.395 135.239 - 2.238 122.204 - 3.199 99.392 - 4.711 69.249 - 5.367 48.882 - 6.246 29.329 - 6.926 15.479 - 7.395 11.406 - 8.496 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65.rse deleted file mode 100644 index ce9212ab03..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -AEROTECH I65 RASP.ENG file made from NAR published data -File produced OCT 3, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65_1.eng deleted file mode 100644 index 6e0111c664..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_I65_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech I65W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I65W 54 235 0 0.41216 0.7616 AT - 0.180 125.414 - 0.544 139.304 - 0.908 145.369 - 1.273 148.283 - 1.638 146.745 - 2.002 139.049 - 2.367 131.200 - 2.731 123.276 - 3.096 113.454 - 3.460 102.368 - 3.825 90.210 - 4.190 78.084 - 4.554 66.812 - 4.919 55.780 - 5.283 47.281 - 5.648 39.154 - 6.012 32.528 - 6.377 27.069 - 6.742 22.099 - 7.106 18.095 - 7.471 14.819 - 7.835 12.097 - 8.200 9.763 - 8.565 7.875 - 8.929 5.999 - 9.294 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J125.eng deleted file mode 100644 index 4c596e130c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J125.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J125 -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J125 54 368 0 0.63392 1.288 AT - 0.174 223.931 - 0.525 254.842 - 0.877 275.347 - 1.229 285.163 - 1.581 280.333 - 1.933 264.476 - 2.285 244.373 - 2.638 223.774 - 2.990 204.720 - 3.342 185.434 - 3.694 166.807 - 4.046 147.653 - 4.398 127.914 - 4.750 108.483 - 5.102 92.582 - 5.454 77.817 - 5.806 63.844 - 6.158 53.017 - 6.510 44.507 - 6.862 37.543 - 7.215 32.205 - 7.567 27.212 - 7.919 22.847 - 8.271 18.596 - 8.623 14.790 - 8.975 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J125.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J125.rse deleted file mode 100644 index 6490dc5eba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J125.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1299.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1299.eng deleted file mode 100644 index cf0b523219..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1299.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -; AT 54-852 -; Greg Gardner - 09/15/06 -J1299N 54 230 0 0.3716 0.834 AT -0.01 548 -0.02 1152 -0.03 1232 -0.04 1277 -0.05 1272 -0.06 1288 -0.07 1333 -0.08 1347 -0.09 1378 -0.10 1383 -0.12 1405 -0.14 1410 -0.16 1440 -0.18 1444 -0.20 1446 -0.25 1449 -0.30 1452 -0.35 1448 -0.40 1440 -0.45 1405 -0.50 1320 -0.55 1248 -0.57 1224 -0.59 1210 -0.60 1180 -0.61 1188 -0.615 1195 -0.62 1188 -0.63 510 -0.64 220 -0.65 96 -0.66 46 -0.67 26 -0.678 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1299.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1299.rse deleted file mode 100644 index e399e0f2a5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1299.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - -AT 54-852 -Greg Gardner - 09/15/06 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J135.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J135.eng deleted file mode 100644 index d6cacd7f2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J135.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J135W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J135W 54 368 0 0.62272 1.14106 AT - 0.147 226.295 - 0.444 243.688 - 0.742 250.916 - 1.040 257.345 - 1.338 259.308 - 1.635 253.727 - 1.933 246.071 - 2.231 235.780 - 2.529 221.775 - 2.827 205.143 - 3.125 183.570 - 3.423 161.103 - 3.720 140.983 - 4.017 122.984 - 4.315 106.605 - 4.612 91.959 - 4.910 77.693 - 5.208 65.304 - 5.506 54.347 - 5.804 44.246 - 6.102 35.395 - 6.400 27.716 - 6.698 21.121 - 6.996 14.939 - 7.294 9.737 - 7.592 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J135.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J135.rse deleted file mode 100644 index e082f43a18..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J135.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J145.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J145.eng deleted file mode 100644 index f4ac44d5d0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J145.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J145H -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J145H 54 709 0 0.410816 1.79738 AT - 0.113 253.118 - 0.340 293.672 - 0.567 300.149 - 0.794 289.519 - 1.021 253.366 - 1.248 251.809 - 1.476 246.042 - 1.704 236.553 - 1.931 229.907 - 2.158 222.550 - 2.385 211.120 - 2.612 201.066 - 2.841 191.143 - 3.069 139.197 - 3.296 79.889 - 3.523 63.900 - 3.750 51.048 - 3.977 40.565 - 4.205 31.710 - 4.433 24.429 - 4.660 19.950 - 4.887 15.256 - 5.115 12.412 - 5.342 10.212 - 5.570 9.135 - 5.798 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J145.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J145.rse deleted file mode 100644 index 2702ac17f4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J145.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech J145H -Copyright Tripoli Motor Testing 1999 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J170.eng deleted file mode 100644 index e0ef869466..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J170.eng +++ /dev/null @@ -1,47 +0,0 @@ -; By: J.M.Recuenco (c)2014 -; Software: ThrustCurve Tracer v1.0. -; Source: Curve from www.thrustcurve.org -; Propellant: Hybrid -; Trademark: Aerotech High Power Reload -; Hardware: RMS-54/1280-3-JET -J170H 54 709 1000 0.4713 1.497 Aerotech - 0.005 432.068 - 0.054 383.542 - 0.114 334.083 - 0.188 353.68 - 0.316 362.079 - 0.405 353.68 - 0.508 348.081 - 0.637 326.618 - 0.721 313.553 - 0.775 311.686 - 0.903 294.889 - 0.997 290.223 - 1.111 300.488 - 1.199 276.225 - 1.397 268.76 - 1.51 274.359 - 1.594 261.294 - 1.742 256.628 - 1.91 248.229 - 1.999 238.897 - 2.098 210.902 - 2.192 157.71 - 2.305 139.046 - 2.399 123.181 - 2.601 105.451 - 2.695 101.718 - 2.887 85.854 - 3.011 78.388 - 3.1 63.457 - 3.164 61.591 - 3.302 50.392 - 3.411 52.259 - 3.519 47.593 - 3.613 37.328 - 3.82 38.261 - 3.993 29.862 - 4.107 29.862 - 4.205 26.129 - 4.294 16.797 - 4.487 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1799.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1799.eng deleted file mode 100644 index b5777469bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1799.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -; AT 54-1280 -; Greg Gardner - 09/15/06 -J1999N 54 314 0 0.5574 1.111 AT -0.01 830 -0.02 1716 -0.03 1787 -0.04 1873 -0.05 1896 -0.06 1918 -0.07 1984 -0.08 2007 -0.09 2051 -0.10 2058 -0.12 2090 -0.14 2098 -0.16 2135 -0.18 2138 -0.20 2142 -0.25 2146 -0.30 2150 -0.35 2146 -0.40 2138 -0.45 2096 -0.50 1974 -0.55 1864 -0.57 1829 -0.59 1815 -0.60 1762 -0.61 1673 -0.62 1085 -0.63 490 -0.64 190 -0.65 81 -0.66 31 -0.67 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1799.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1799.rse deleted file mode 100644 index ffdb24a893..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1799.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -AT 54-852 -Greg Gardner - 09/15/06 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J180.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J180.eng deleted file mode 100644 index 6c5f915c20..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J180.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J180T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J180T 54 230 0 0.429184 0.809088 AT - 0.093 301.634 - 0.281 313.236 - 0.470 313.710 - 0.658 308.334 - 0.847 300.100 - 1.035 290.743 - 1.224 278.867 - 1.412 263.823 - 1.601 245.974 - 1.790 226.651 - 1.978 207.345 - 2.167 187.053 - 2.355 168.339 - 2.544 149.993 - 2.732 133.094 - 2.921 116.330 - 3.109 100.088 - 3.298 84.507 - 3.486 70.453 - 3.675 57.263 - 3.864 44.453 - 4.052 33.340 - 4.241 24.654 - 4.429 17.964 - 4.619 12.391 - 4.808 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J180.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J180.rse deleted file mode 100644 index 6a06fbecdf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J180.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1999.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1999.eng deleted file mode 100644 index b5777469bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1999.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -; AT 54-1280 -; Greg Gardner - 09/15/06 -J1999N 54 314 0 0.5574 1.111 AT -0.01 830 -0.02 1716 -0.03 1787 -0.04 1873 -0.05 1896 -0.06 1918 -0.07 1984 -0.08 2007 -0.09 2051 -0.10 2058 -0.12 2090 -0.14 2098 -0.16 2135 -0.18 2138 -0.20 2142 -0.25 2146 -0.30 2150 -0.35 2146 -0.40 2138 -0.45 2096 -0.50 1974 -0.55 1864 -0.57 1829 -0.59 1815 -0.60 1762 -0.61 1673 -0.62 1085 -0.63 490 -0.64 190 -0.65 81 -0.66 31 -0.67 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1999.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1999.rse deleted file mode 100644 index ffdb24a893..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J1999.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -AT 54-852 -Greg Gardner - 09/15/06 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J210.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J210.eng deleted file mode 100644 index 2182361a84..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J210.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -J210H 54 609.6 100 0.471 1.497 Aerotech -0.00772798 651.819 -0.0695518 528.502 -0.200927 488.864 -0.502318 409.589 -0.996909 374.355 -1.4915 312.697 -1.59196 286.272 -2.00927 167.359 -2.43431 88.0836 -2.50386 101.296 -2.55023 74.8711 -3.02164 57.2543 -4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J210.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J210.rse deleted file mode 100644 index 5cbc221610..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J210.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J250.eng deleted file mode 100644 index d39891cbb6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J250.eng +++ /dev/null @@ -1,24 +0,0 @@ -; Aerotech J250FJ from TRA Cert Data -J250FJ 54 241 6-10-14-18 0.511 0.92 AT - 0.011 132.176 - 0.021 263.335 - 0.084 236.899 - 0.168 252.151 - 0.294 238.933 - 0.494 261.301 - 0.715 285.703 - 0.993 295.87 - 1.177 306.038 - 1.267 305.021 - 1.498 301.971 - 1.64 292.82 - 2.002 253.167 - 2.344 224.699 - 2.391 225.715 - 2.502 233.849 - 2.57 185.046 - 2.659 116.925 - 2.685 76.255 - 2.738 32.536 - 2.77 17.285 - 2.796 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J260.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J260.eng deleted file mode 100644 index 5f07d7f7eb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J260.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; -J260HW 54 708.66 100 0.558 1.574 AT -0.00772798 598.969 -0.0386399 475.651 -0.108192 506.481 -0.463679 493.268 -0.780526 475.651 -1.01236 427.205 -2.00155 330.314 -2.48841 193.784 -2.99073 114.509 -4.01082 57.2543 -4.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J260.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J260.rse deleted file mode 100644 index aa383730ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J260.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J270.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J270.eng deleted file mode 100644 index 901f658768..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J270.eng +++ /dev/null @@ -1,40 +0,0 @@ -; J270W DMS -J270W 38 356.4 14-12-10-8-6 0.381 0.642 AT - 0.007 367.585 - 0.02 325.124 - 0.074 353.027 - 0.136 329.977 - 0.176 343.928 - 0.273 324.518 - 0.33 342.715 - 0.357 326.338 - 0.399 330.584 - 0.473 310.567 - 0.553 325.731 - 0.734 340.895 - 0.744 357.273 - 0.761 315.419 - 0.788 337.256 - 0.897 340.895 - 1.009 333.617 - 1.053 354.24 - 1.105 320.878 - 1.18 345.748 - 1.214 321.485 - 1.249 345.748 - 1.274 314.206 - 1.5 316.026 - 1.601 309.96 - 1.916 303.894 - 1.956 265.073 - 2.0 214.121 - 2.052 179.546 - 2.102 158.923 - 2.201 117.676 - 2.268 106.151 - 2.303 87.953 - 2.369 55.805 - 2.407 49.739 - 2.486 39.427 - 2.558 21.837 - 2.563 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J275.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J275.eng deleted file mode 100644 index 5f28dd7a10..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J275.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J275W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J275W 54 230 0 0.468608 0.864192 AT - 0.075 239.740 - 0.227 289.133 - 0.380 299.773 - 0.533 312.721 - 0.686 323.878 - 0.840 332.165 - 0.992 336.422 - 1.145 335.110 - 1.298 329.538 - 1.451 325.343 - 1.604 309.980 - 1.756 292.901 - 1.909 275.732 - 2.063 257.341 - 2.216 234.891 - 2.369 213.102 - 2.521 182.501 - 2.674 167.853 - 2.827 153.041 - 2.980 138.115 - 3.133 105.605 - 3.285 67.369 - 3.439 29.239 - 3.592 14.599 - 3.745 6.662 - 3.898 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J275.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J275.rse deleted file mode 100644 index 0b750b2f76..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J275.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J315.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J315.eng deleted file mode 100644 index 594786403a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J315.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech J315R -; provided by ThrustCurve.org (www.thrustcurve.org) -J315R 54 243 0 0.42112 0.8512 AT - 0.051 189.719 - 0.154 337.529 - 0.259 354.534 - 0.363 364.111 - 0.468 371.479 - 0.572 373.222 - 0.676 376.062 - 0.780 372.962 - 0.884 368.988 - 0.989 366.978 - 1.093 358.752 - 1.197 351.302 - 1.301 339.336 - 1.406 325.202 - 1.510 311.322 - 1.614 300.496 - 1.718 288.598 - 1.822 278.279 - 1.927 270.538 - 2.031 262.127 - 2.136 245.027 - 2.239 236.238 - 2.344 188.308 - 2.448 63.668 - 2.552 18.746 - 2.657 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J315.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J315.rse deleted file mode 100644 index 0a42043f7d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J315.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J340.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J340.rse deleted file mode 100644 index bbad18d277..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J340.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - AT J340 Metalstorm for 38-720 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350.eng deleted file mode 100644 index 59076b3adf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350.eng +++ /dev/null @@ -1,21 +0,0 @@ -J350W-L 38 337 P 0.361 0.651 AT - 0.041 841.443 - 0.051 767.077 - 0.088 698.219 - 0.173 644.51 - 0.256 621.098 - 0.298 564.635 - 0.547 543.977 - 0.783 487.514 - 0.989 418.656 - 1.16 359.438 - 1.192 340.158 - 1.213 320.878 - 1.287 216.214 - 1.319 179.031 - 1.342 126.699 - 1.386 84.007 - 1.427 53.709 - 1.48 45.446 - 1.591 20.657 - 1.695 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350.rse deleted file mode 100644 index e4ff99fc60..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350_1.eng deleted file mode 100644 index bf37f23ff7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350_1.eng +++ /dev/null @@ -1,31 +0,0 @@ -; AeroTech J350W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J350W 38 337 0 0.375872 0.650944 AT - 0.038 706.781 - 0.115 669.055 - 0.192 602.539 - 0.270 565.084 - 0.348 539.143 - 0.425 514.910 - 0.503 483.098 - 0.581 449.128 - 0.658 437.256 - 0.736 424.199 - 0.815 414.461 - 0.892 402.956 - 0.970 393.604 - 1.048 377.837 - 1.125 359.785 - 1.203 341.916 - 1.281 324.721 - 1.358 305.935 - 1.436 264.279 - 1.515 175.471 - 1.592 110.912 - 1.670 77.100 - 1.748 55.472 - 1.825 39.990 - 1.903 26.276 - 1.981 0.000 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350_1.rse deleted file mode 100644 index 8b1b2151de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J350_1.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J390.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J390.eng deleted file mode 100644 index 7dee40e308..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J390.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -J390HW-TURBO 54 708.66 100 0.69 1.74 AT -0.015456 440.418 -0.100464 550.523 -0.193199 546.118 -0.301391 656.223 -0.502318 647.414 -0.973725 581.352 -1.48377 471.247 -1.98609 378.759 -2.17929 334.718 -2.30294 255.442 -2.49614 158.55 -3.01391 57.2543 -3.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J390.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J390.rse deleted file mode 100644 index e05c7daf49..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J390.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J401.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J401.eng deleted file mode 100644 index feab23eb28..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J401.eng +++ /dev/null @@ -1,36 +0,0 @@ -; Input by Tim Van Milligan using ThrustCurve Tracer by John Coker. Data from -; Tripoli certification paperwork dated 25 November 2007. -J401FJ 54 325 6 0.511 0.912 Aerotech - 0.011 440.414 - 0.022 488.102 - 0.075 427.791 - 0.116 422.18 - 0.191 446.024 - 0.277 453.037 - 0.382 462.855 - 0.513 468.466 - 0.712 472.673 - 0.775 471.271 - 0.948 471.271 - 1.06 472.673 - 1.281 469.868 - 1.431 462.855 - 1.607 453.037 - 1.858 426.388 - 2.034 403.946 - 2.135 384.31 - 2.202 378.7 - 2.258 374.492 - 2.277 374.492 - 2.3 380.102 - 2.322 380.102 - 2.345 370.284 - 2.367 359.064 - 2.408 314.181 - 2.461 244.051 - 2.502 186.545 - 2.566 103.792 - 2.607 64.519 - 2.652 42.078 - 2.704 18.234 - 2.783 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J415.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J415.eng deleted file mode 100644 index 973f7ecf1a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J415.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J415W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J415W 54 314 0 0.686336 1.15718 AT - 0.065 431.300 - 0.196 452.427 - 0.327 489.904 - 0.458 513.542 - 0.591 523.192 - 0.723 531.440 - 0.854 542.165 - 0.985 542.731 - 1.118 549.788 - 1.250 553.889 - 1.381 537.331 - 1.512 512.126 - 1.645 517.338 - 1.777 498.098 - 1.908 473.365 - 2.040 444.157 - 2.172 413.187 - 2.304 384.854 - 2.435 360.556 - 2.567 297.571 - 2.699 178.288 - 2.831 89.889 - 2.962 43.066 - 3.094 19.126 - 3.226 8.995 - 3.358 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J415.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J415.rse deleted file mode 100644 index c23682b114..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J415.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J420.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J420.eng deleted file mode 100644 index 10da3b6af2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J420.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech J420R -; provided by ThrustCurve.org (www.thrustcurve.org) -J420R 38 337 0 0.37632 0.6496 AT - 0.031 61.083 - 0.095 563.470 - 0.160 525.283 - 0.224 521.242 - 0.288 527.371 - 0.352 537.088 - 0.418 535.138 - 0.481 534.623 - 0.545 530.245 - 0.610 526.447 - 0.674 517.203 - 0.738 510.279 - 0.802 500.887 - 0.868 479.450 - 0.931 460.675 - 0.995 438.594 - 1.060 409.647 - 1.124 383.454 - 1.188 361.024 - 1.252 339.741 - 1.318 319.194 - 1.381 296.714 - 1.445 195.191 - 1.510 61.984 - 1.575 7.220 - 1.640 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J420.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J420.rse deleted file mode 100644 index 4b0f095d1a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J420.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J425.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J425.eng deleted file mode 100644 index e2eb7c4510..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J425.eng +++ /dev/null @@ -1,15 +0,0 @@ -; From AT DMS announcement May 2014. -J425 38 356.4 14 0.364 0.631 AT - 0.018 267.857 - 0.062 368.062 - 0.242 420.092 - 0.524 443.216 - 0.902 452.851 - 1.225 448.997 - 1.389 433.581 - 1.502 452.851 - 1.53 420.092 - 1.542 356.5 - 1.599 67.446 - 1.618 28.905 - 1.648 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J460.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J460.eng deleted file mode 100644 index 269811aa5a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J460.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J460T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J460T 54 230 0 0.413504 0.801024 AT - 0.041 500.927 - 0.125 509.423 - 0.209 516.357 - 0.294 527.752 - 0.379 535.135 - 0.464 541.858 - 0.548 545.793 - 0.633 545.678 - 0.718 544.832 - 0.802 540.278 - 0.887 533.698 - 0.972 526.340 - 1.056 511.003 - 1.141 492.475 - 1.225 474.977 - 1.310 457.021 - 1.395 437.203 - 1.479 418.093 - 1.565 403.240 - 1.649 339.173 - 1.733 203.861 - 1.819 102.620 - 1.903 49.295 - 1.987 9.538 - 2.073 2.155 - 2.158 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J460.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J460.rse deleted file mode 100644 index 76956b4acd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J460.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J500.eng deleted file mode 100644 index 4358a4be6a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J500.eng +++ /dev/null @@ -1,21 +0,0 @@ -;Delays are speculation. -;Taken from Aerotech curves, not cert docs. -;Jim Yehle 15 Nov 07 -J500G 38 335.407 0-6-10-14 0.3626 0.654 Aerotech -0.0134378 40.2458 -0.0335946 724.425 -0.0403135 781.616 -0.0604703 787.971 -0.0895857 711.716 -0.134378 686.297 -0.394177 637.578 -0.575588 588.86 -0.606943 622.751 -0.633819 620.633 -1.20045 360.094 -1.24076 345.267 -1.31019 182.165 -1.38186 65.6642 -1.43337 23.3002 -1.45 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J500.rse deleted file mode 100644 index cc659e86d4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J500.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - Delays are speculation. -Taken from Aerotech curves, not cert docs. -Jim Yehle 15 Nov 07 - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J510.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J510.eng deleted file mode 100644 index 5fc3972948..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J510.eng +++ /dev/null @@ -1,16 +0,0 @@ -J510 38 584 P 0.662 1.08 AT - 0.032 1055.904 - 0.11 865.54 - 0.161 829.933 - 0.267 794.325 - 0.351 780.63 - 0.512 705.306 - 0.682 654.633 - 1.318 624.504 - 1.461 475.225 - 1.623 345.121 - 1.934 153.387 - 2.039 115.04 - 2.177 41.086 - 2.317 5.478 - 2.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J540.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J540.eng deleted file mode 100644 index 58cd385d4c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J540.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech J540R -; provided by ThrustCurve.org (www.thrustcurve.org) -J540R 54 314 0 0.61376 1.08416 AT - 0.044 498.757 - 0.134 639.617 - 0.224 649.317 - 0.314 657.966 - 0.404 664.020 - 0.494 666.924 - 0.584 663.699 - 0.675 658.398 - 0.765 651.232 - 0.855 638.505 - 0.945 626.396 - 1.035 612.557 - 1.126 590.090 - 1.216 562.391 - 1.306 536.875 - 1.396 511.607 - 1.486 490.354 - 1.576 468.978 - 1.667 451.342 - 1.758 430.180 - 1.847 414.549 - 1.937 398.116 - 2.027 305.877 - 2.118 55.541 - 2.208 1.523 - 2.299 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J540.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J540.rse deleted file mode 100644 index ef663958d3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J540.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J570.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J570.eng deleted file mode 100644 index 7c9988c805..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J570.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J570W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J570W 38 479 0 0.547904 0.886144 AT - 0.039 1149.795 - 0.119 1042.846 - 0.199 960.891 - 0.279 900.020 - 0.360 837.772 - 0.441 792.834 - 0.521 735.510 - 0.602 685.857 - 0.682 649.599 - 0.762 608.757 - 0.844 597.350 - 0.924 568.934 - 1.004 548.552 - 1.084 505.080 - 1.165 484.626 - 1.246 452.328 - 1.326 362.439 - 1.406 297.973 - 1.487 262.381 - 1.568 195.696 - 1.648 156.733 - 1.729 124.649 - 1.809 113.749 - 1.890 69.812 - 1.971 46.023 - 2.052 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J570.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J570.rse deleted file mode 100644 index 90e097e695..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J570.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J575.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J575.eng deleted file mode 100644 index e059cc3905..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J575.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -J575FJ 38 478.79 6-10-14 0.576 0.91424 Aerotech -0.0156556 656.682 -0.0195695 840.689 -0.037182 840.689 -0.0606654 839.001 -0.101761 839.001 -0.162427 839.001 -0.228963 839.001 -0.315068 839.001 -0.399217 837.312 -0.459883 837.312 -0.547945 822.119 -0.60274 801.862 -0.700587 742.777 -0.802348 685.381 -0.841487 646.554 -0.902153 573.964 -0.949791 483.69 -1 319.581 -1.05365 220.66 -1.12916 153.62 -1.19961 99.5997 -1.27593 43.8914 -1.34 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J575.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J575.rse deleted file mode 100644 index de03f7cf80..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J575.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J800.eng deleted file mode 100644 index d67e4988ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J800.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J800T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J800T 54 314 0 0.613312 1.08595 AT - 0.040 841.341 - 0.121 818.497 - 0.203 776.386 - 0.285 784.308 - 0.367 785.314 - 0.449 783.315 - 0.531 782.539 - 0.612 779.977 - 0.695 773.680 - 0.777 765.307 - 0.858 755.517 - 0.941 744.777 - 1.023 733.131 - 1.105 719.947 - 1.187 702.235 - 1.269 685.369 - 1.351 668.265 - 1.433 650.327 - 1.515 630.472 - 1.597 615.483 - 1.679 470.262 - 1.760 256.617 - 1.843 108.716 - 1.925 15.005 - 2.007 1.249 - 2.090 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J800.rse deleted file mode 100644 index dd7f56406b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J800.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J825.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J825.eng deleted file mode 100644 index ef08bdf242..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J825.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -;Aerotech J825R -J825R 38 479 10 0.53 .88 AT -0.0 11.504 -0.048913 1069.87 -0.100155 977.842 -0.118789 1035.36 -0.652174 897.314 -0.801242 839.794 -0.899068 782.274 -0.999224 586.705 -1.09938 103.536 -1.14363 23.008 -1.18 0.0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J825.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J825.rse deleted file mode 100644 index 9202c0544c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J825.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J90.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J90.eng deleted file mode 100644 index 2ca28ce2a0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J90.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech J90W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J90W 54 243 0 0.427392 0.852544 AT - 0.143 116.187 - 0.430 165.444 - 0.718 176.536 - 1.005 184.645 - 1.293 187.242 - 1.580 183.651 - 1.868 175.492 - 2.155 167.687 - 2.443 156.858 - 2.730 143.514 - 3.018 128.856 - 3.305 110.879 - 3.593 94.003 - 3.880 79.657 - 4.168 67.472 - 4.455 57.268 - 4.743 48.008 - 5.030 40.523 - 5.318 33.901 - 5.605 28.248 - 5.893 23.334 - 6.180 19.275 - 6.468 15.923 - 6.755 12.727 - 7.044 9.903 - 7.332 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J90.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J90.rse deleted file mode 100644 index 4064f4c0e2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J90.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J99.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J99.eng deleted file mode 100644 index 8245161c3d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_J99.eng +++ /dev/null @@ -1,16 +0,0 @@ -J99 54 231 P 0.556 0.899 AT - 0.031 117.296 - 0.078 135.045 - 0.242 144.305 - 0.828 131.38 - 2.539 110.737 - 3.594 102.056 - 4.82 94.146 - 5.938 86.043 - 7.523 81.22 - 8.984 76.976 - 9.047 74.082 - 9.547 16.012 - 9.711 5.209 - 9.82 1.929 - 10.0 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1000.eng deleted file mode 100644 index b5d86d261a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1000.eng +++ /dev/null @@ -1,36 +0,0 @@ -; Based on AT Instruction Sheet by C. Kobel 3/17/2010 -K1000T-P 75 396 P 1.182 2.575 AT - 0.0040 895.149 - 0.015 1119.762 - 0.025 1093.337 - 0.095 1096.640 - 0.200 1109.853 - 0.300 1116.459 - 0.400 1123.065 - 0.500 1132.975 - 0.600 1139.581 - 0.700 1136.278 - 0.800 1136.278 - 0.900 1136.278 - 1.000 1139.581 - 1.100 1132.975 - 1.200 1129.672 - 1.300 1126.369 - 1.400 1119.762 - 1.500 1109.853 - 1.600 1096.640 - 1.700 1063.609 - 1.800 1017.365 - 1.900 971.121 - 2.000 914.968 - 2.100 868.724 - 2.180 865.421 - 2.200 878.634 - 2.218 858.815 - 2.269 670.536 - 2.300 578.048 - 2.332 445.923 - 2.356 336.920 - 2.389 224.613 - 2.436 105.7 - 2.500 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050.eng deleted file mode 100644 index 0a4bac7e5f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050.eng +++ /dev/null @@ -1,15 +0,0 @@ -K1050W 54 635 1000 1.373 2.259 Aerotech -0 934.5 -0.05 1468.5 -0.1 1335 -0.15 1290.5 -0.25 1246 -0.75 1246 -1.25 1201.5 -1.5 1157 -1.65 1157 -1.75 1246 -1.9 890 -2.1 578.5 -2.2 222.5 -2.46 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050.rse deleted file mode 100644 index b356919e52..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050_1.eng deleted file mode 100644 index 3ae6dabd2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1050_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K1050W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K1050W 54 676 0 1.34714 2.12845 AT - 0.049 1305.649 - 0.149 1270.386 - 0.249 1288.922 - 0.349 1327.059 - 0.449 1345.719 - 0.549 1359.794 - 0.649 1364.452 - 0.749 1365.493 - 0.849 1377.189 - 0.949 1379.519 - 1.049 1346.586 - 1.149 1286.742 - 1.249 1232.101 - 1.349 1186.480 - 1.449 1156.521 - 1.549 1120.045 - 1.649 1098.708 - 1.749 1070.186 - 1.849 889.885 - 1.949 646.691 - 2.049 441.213 - 2.149 302.245 - 2.249 155.001 - 2.349 52.187 - 2.449 43.415 - 2.549 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1100.eng deleted file mode 100644 index 52bbbf95f7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1100.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech K1100T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K1100T 54 398 0 0.7616 1.32518 AT - 0.034 1234.653 - 0.105 1233.429 - 0.176 1192.393 - 0.247 1163.041 - 0.318 1147.963 - 0.389 1146.319 - 0.460 1140.958 - 0.532 1132.640 - 0.603 1123.824 - 0.674 1108.921 - 0.745 1090.974 - 0.816 1073.937 - 0.887 1049.133 - 0.959 1021.216 - 1.030 994.559 - 1.101 966.571 - 1.172 940.194 - 1.243 909.792 - 1.315 880.264 - 1.386 844.477 - 1.457 643.599 - 1.528 401.861 - 1.599 145.498 - 1.670 28.372 - 1.742 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1100.rse deleted file mode 100644 index ccdc7ab115..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1100.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1103.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1103.eng deleted file mode 100644 index 2a8d8fa7ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1103.eng +++ /dev/null @@ -1,26 +0,0 @@ -; K1103X Propellant X -K1103X 54 401 14 0.8300000000000001 1.459 AT - 0.012 1335.712 - 0.016 1505.168 - 0.028 1619.8 - 0.045 1500.184 - 0.081 1393.028 - 0.151 1330.728 - 0.201 1305.808 - 0.399 1280.888 - 0.602 1243.508 - 0.803 1196.16 - 1.001 1143.828 - 1.203 1074.052 - 1.296 1041.656 - 1.384 1031.688 - 1.408 1004.276 - 1.423 961.912 - 1.438 839.804 - 1.46 737.632 - 1.49 510.86 - 1.505 446.068 - 1.603 176.932 - 1.608 209.328 - 1.638 97.188 - 1.688 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1275.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1275.eng deleted file mode 100644 index 490f512ddc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1275.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech K1275R -; provided by ThrustCurve.org (www.thrustcurve.org) -K1275R 54 569 0 1.29024 2.03392 AT - 0.039 1282.616 - 0.119 1557.989 - 0.199 1540.196 - 0.279 1526.782 - 0.359 1500.693 - 0.440 1456.584 - 0.520 1425.794 - 0.600 1390.416 - 0.680 1355.109 - 0.761 1323.311 - 0.841 1282.825 - 0.921 1247.795 - 1.001 1194.417 - 1.081 1150.977 - 1.162 1108.223 - 1.242 1068.754 - 1.322 1036.922 - 1.403 997.444 - 1.482 964.569 - 1.563 933.305 - 1.644 889.992 - 1.724 599.467 - 1.804 134.559 - 1.884 5.630 - 1.964 0.205 - 2.045 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1275.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1275.rse deleted file mode 100644 index 8b8b34efc7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1275.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1499.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1499.eng deleted file mode 100644 index 49ebe4c2dc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1499.eng +++ /dev/null @@ -1,13 +0,0 @@ -;Entered by Jim Yehle -;from TRA cert document -K1499N 75 260 1000 0.604 1.741 AT-RMS -0.01 1450 -0.2 1720.12 -0.35 1700 -0.5 1600 -0.6 1575 -0.7 1500 -0.82 1400 -0.84 250 -0.88 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1499.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1499.rse deleted file mode 100644 index f4863fc5c6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1499.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - Entered by Jim Yehle -from TRA cert document - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K185.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K185.eng deleted file mode 100644 index 90cf5a4e7f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K185.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K185W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K185W 54 437 0 0.827008 1.43405 AT - 0.150 279.128 - 0.452 308.220 - 0.754 328.435 - 1.056 338.929 - 1.359 339.677 - 1.663 333.166 - 1.965 321.891 - 2.267 309.687 - 2.570 293.260 - 2.873 271.536 - 3.175 247.174 - 3.477 216.883 - 3.780 186.951 - 4.083 161.096 - 4.385 138.113 - 4.688 117.749 - 4.991 99.372 - 5.294 82.759 - 5.596 68.426 - 5.898 55.126 - 6.201 44.162 - 6.504 34.209 - 6.806 25.064 - 7.108 16.880 - 7.411 9.200 - 7.715 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K185.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K185.rse deleted file mode 100644 index 7d6b4396ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K185.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech K185W -Copyright Tripoli Motor Testing 1998 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1999.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1999.eng deleted file mode 100644 index 5136824d08..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1999.eng +++ /dev/null @@ -1,21 +0,0 @@ -; AeroTech K1999N -; Curvefit to instruction sheet on Aerotech website (1/29/07) -; by Chris Kobel -; burn time: 1.4 seconds -; total impulse: 2522 newton-seconds -; average thrust: 405 pounds -K1999N 98 289 6-10-14-18 1.195 2.989 AT - 0.02 1557.5 - 0.08 1780.0 - 0.10 1913.5 - 0.12 1869.0 - 0.18 2002.5 - 1.08 2002.5 - 1.10 1958.0 - 1.20 1780.0 - 1.25 1557.5 - 1.27 1335.0 - 1.31 890.0 - 1.33 667.5 - 1.35 222.5 - 1.40 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1999.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1999.rse deleted file mode 100644 index 2fb506abd5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K1999.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - -98-2560 -Greg Gardner - 09/15/06 - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K250.eng deleted file mode 100644 index bf74219ecf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K250.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K250W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K250W 54 673 0 1.52902 2.21133 AT - 0.199 365.330 - 0.599 403.324 - 0.999 418.669 - 1.400 409.813 - 1.801 408.949 - 2.201 412.146 - 2.602 411.952 - 3.003 409.488 - 3.403 393.214 - 3.804 373.599 - 4.205 348.913 - 4.605 328.463 - 5.006 307.163 - 5.407 281.467 - 5.807 249.011 - 6.208 217.159 - 6.609 185.908 - 7.009 149.190 - 7.410 119.808 - 7.811 92.096 - 8.211 69.726 - 8.613 52.613 - 9.014 35.876 - 9.414 16.727 - 9.815 4.086 - 10.216 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K250.rse deleted file mode 100644 index 7f856ec0d3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K250.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech K250W -Copyright Tripoli Motor Testing 1998 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K270.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K270.eng deleted file mode 100644 index 2cc9069068..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K270.eng +++ /dev/null @@ -1,35 +0,0 @@ -; Aerotech K270W-P Moon Burner from TRA Certification Data -K270W 54 579 P 1.188 2.1 AT - 0.046 177.061 - 0.062 292.932 - 0.092 425.727 - 0.154 414.01 - 0.277 389.273 - 0.446 377.556 - 0.585 381.462 - 0.738 372.349 - 1.0 377.556 - 1.154 376.254 - 1.231 378.858 - 1.308 395.783 - 1.4 380.16 - 1.569 399.689 - 1.615 381.462 - 1.846 381.462 - 2.369 368.443 - 2.415 381.462 - 2.554 360.631 - 3.015 350.216 - 3.354 328.083 - 3.723 300.743 - 4.0 273.403 - 4.6 225.232 - 5.262 175.759 - 5.677 144.513 - 6.0 124.984 - 6.538 89.832 - 7.015 66.398 - 8.0 22.133 - 8.323 10.415 - 8.508 5.208 - 8.692 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K270.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K270.rse deleted file mode 100644 index ce9bee656b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K270.rse +++ /dev/null @@ -1,52 +0,0 @@ - - - - AeroTech K270W-P Moon Burner from TRA Certification Data -K270W 54 P 1.188 2.1 AT - -Converted from Mark Koelsch submitted RASP file dated Mar 23, 2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K375.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K375.eng deleted file mode 100644 index d05aa5a5de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K375.eng +++ /dev/null @@ -1,33 +0,0 @@ -; From AT Instruction Sheet by C. Kobel 3/12/10 -K375NW-P 54 568 P 1.238 2.126 AT - 0.027 886.971 - 0.036 1115.263 - 0.054 1268.705 - 0.135 1279.933 - 0.197 1313.615 - 0.292 1317.357 - 0.422 1343.555 - 0.444 1302.387 - 0.489 1336.07 - 0.552 452.842 - 0.574 396.704 - 0.718 452.842 - 0.794 460.327 - 0.902 437.872 - 0.992 411.674 - 1.189 404.189 - 1.400 366.764 - 1.575 381.734 - 1.791 370.507 - 4.000 366.764 - 4.165 344.309 - 4.290 239.520 - 4.398 239.520 - 4.537 183.382 - 4.645 183.382 - 4.761 93.562 - 5.000 93.562 - 5.200 63.622 - 5.400 44.910 - 5.600 33.682 - 5.800 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K375.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K375.rse deleted file mode 100644 index 2f2cffeeb3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K375.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - - AeroTech K375 -From RASP file created by C. Kobel 3/12/10 -Converted to RockSim 9 by R. Geer 3/22/10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K456.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K456.eng deleted file mode 100644 index 10d1f2945d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K456.eng +++ /dev/null @@ -1,32 +0,0 @@ -; K456 Dark Matter -K456DM-14A 54 401 14 0.866 1.484 AT - 0.027 444.074 - 0.038 519.582 - 0.066 482.95 - 0.129 461.269 - 0.302 467.998 - 0.389 468.745 - 0.499 476.969 - 0.655 476.221 - 0.798 483.697 - 0.946 488.93 - 1.096 499.397 - 1.401 500.892 - 1.603 503.882 - 1.801 501.64 - 1.905 498.649 - 2.1 485.94 - 2.302 456.036 - 2.404 435.851 - 2.505 420.151 - 2.574 398.471 - 2.607 373.052 - 2.645 356.605 - 2.703 289.321 - 2.768 178.676 - 2.804 123.354 - 2.837 88.964 - 2.875 50.837 - 2.908 24.671 - 2.957 10.466 - 3.037 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K458.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K458.eng deleted file mode 100644 index f4cc5cdcdf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K458.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K458W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K458W 98 275 0 1.42778 3.16378 AT - 0.133 294.911 - 0.403 404.808 - 0.674 462.021 - 0.944 515.863 - 1.214 555.072 - 1.484 583.153 - 1.755 600.299 - 2.025 610.254 - 2.295 618.543 - 2.566 623.155 - 2.835 618.885 - 3.105 589.082 - 3.376 546.307 - 3.647 505.042 - 3.917 451.412 - 4.186 391.651 - 4.457 338.409 - 4.727 288.429 - 4.997 245.814 - 5.268 208.209 - 5.539 178.153 - 5.808 149.825 - 6.078 62.931 - 6.349 8.427 - 6.620 2.562 - 6.891 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K458.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K458.rse deleted file mode 100644 index 9dc56b2398..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K458.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K480.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K480.eng deleted file mode 100644 index 3afb6392da..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K480.eng +++ /dev/null @@ -1,44 +0,0 @@ -; From AT Instruction Sheet by C. Kobel 3/12/10 -K480W-P 54 568 P 1.232 2.059 AT - 0.030 535.684 - 0.045 860.341 - 0.057 915.996 - 0.098 830.194 - 0.159 832.513 - 0.246 795.409 - 0.307 811.642 - 0.398 793.090 - 0.492 809.323 - 0.557 823.237 - 0.621 811.642 - 0.689 779.176 - 0.735 795.409 - 0.845 767.581 - 0.989 718.883 - 1.091 707.288 - 1.250 684.098 - 1.307 667.865 - 1.500 653.952 - 1.606 656.271 - 1.742 651.633 - 1.909 628.443 - 2.000 605.253 - 2.250 586.701 - 2.500 565.830 - 2.750 547.279 - 2.886 544.960 - 3.000 524.089 - 3.064 491.623 - 3.144 417.416 - 3.250 394.226 - 3.292 338.571 - 3.451 271.320 - 3.500 231.898 - 3.625 178.561 - 3.700 143.777 - 3.871 132.182 - 4.000 88.121 - 4.133 41.742 - 4.246 23.190 - 4.500 18.552 - 4.800 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K485.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K485.eng deleted file mode 100644 index 973d6a4336..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K485.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K485HW -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K485HW 54 699 0 0.910784 2.22029 AT - 0.075 454.453 - 0.227 568.735 - 0.380 831.332 - 0.533 825.584 - 0.686 795.935 - 0.840 759.473 - 0.992 727.238 - 1.145 680.051 - 1.298 653.091 - 1.451 627.316 - 1.604 601.548 - 1.756 576.270 - 1.909 542.033 - 2.063 479.078 - 2.216 394.184 - 2.369 346.719 - 2.521 307.435 - 2.674 276.291 - 2.827 216.608 - 2.980 146.021 - 3.133 106.838 - 3.285 81.226 - 3.439 52.105 - 3.592 37.385 - 3.745 29.462 - 3.898 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K485.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K485.rse deleted file mode 100644 index 5dd567540f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K485.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech K485HW -Copyright Tripoli Motor Testing 1999 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K513.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K513.eng deleted file mode 100644 index 392b3cd48a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K513.eng +++ /dev/null @@ -1,41 +0,0 @@ -; Input by Tim Van Milligan using ThrustCurve Tracer by John Coker. Data from -; Tripoli certification paperwork dated 25 November 2007. -K513FJ 54 410 6 0.974 1.647 Aerotech - 0.0070 555.093 - 0.015 652.655 - 0.041 551.729 - 0.059 592.099 - 0.074 551.729 - 0.2 575.278 - 0.282 582.007 - 0.412 605.556 - 0.519 615.649 - 0.679 635.834 - 0.823 642.562 - 0.986 649.291 - 1.12 652.655 - 1.328 656.019 - 1.48 649.291 - 1.602 629.105 - 1.854 585.371 - 1.999 555.093 - 2.054 545.0 - 2.08 545.0 - 2.114 528.179 - 2.184 524.815 - 2.229 521.451 - 2.258 504.63 - 2.295 474.352 - 2.325 437.346 - 2.358 380.155 - 2.37 349.877 - 2.399 312.871 - 2.451 272.5 - 2.492 238.858 - 2.529 161.482 - 2.57 84.105 - 2.592 43.735 - 2.618 26.914 - 2.655 13.457 - 2.692 6.728 - 2.726 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K535.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K535.eng deleted file mode 100644 index ba6dc007f1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K535.eng +++ /dev/null @@ -1,21 +0,0 @@ -; revised per AT post on TRF 5/19/14 -K535 54 358.1 14 0.745 1.264 AT - 0.015 467.288 - 0.063 642.221 - 0.104 613.465 - 0.23 627.843 - 0.419 620.654 - 0.883 623.05 - 1.335 599.087 - 1.646 555.953 - 1.843 500.837 - 2.017 450.513 - 2.258 404.983 - 2.488 366.641 - 2.6 230.049 - 2.611 172.537 - 2.648 124.61 - 2.696 81.476 - 2.789 40.738 - 2.837 9.585 - 2.952 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K540.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K540.rse deleted file mode 100644 index 84428cca01..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K540.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - AT K540 Metalstorm 54-1706 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K550.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K550.eng deleted file mode 100644 index aa58f4da21..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K550.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K550W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K550W 54 410 0 0.919744 1.48736 AT - 0.065 604.264 - 0.196 642.625 - 0.327 682.197 - 0.458 732.995 - 0.591 758.236 - 0.723 780.289 - 0.854 794.452 - 0.985 797.939 - 1.117 797.601 - 1.249 773.842 - 1.381 711.608 - 1.512 646.522 - 1.644 590.724 - 1.775 537.505 - 1.907 491.012 - 2.040 445.836 - 2.171 401.461 - 2.302 364.291 - 2.433 319.614 - 2.566 255.577 - 2.698 172.573 - 2.829 103.501 - 2.960 51.795 - 3.092 26.814 - 3.224 15.203 - 3.356 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K550.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K550.rse deleted file mode 100644 index 8edb35c674..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K550.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K560.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K560.eng deleted file mode 100644 index 47ed528e14..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K560.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K560W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K560W 75 396 0 1.40806 2.71354 AT - 0.096 552.123 - 0.290 645.403 - 0.484 681.109 - 0.679 716.167 - 0.874 742.678 - 1.069 764.778 - 1.264 775.710 - 1.458 785.859 - 1.653 789.305 - 1.848 789.077 - 2.043 744.622 - 2.237 676.886 - 2.432 614.711 - 2.627 557.908 - 2.822 503.641 - 3.017 455.504 - 3.211 412.045 - 3.406 372.963 - 3.601 335.987 - 3.796 307.346 - 3.991 279.856 - 4.185 223.491 - 4.380 70.441 - 4.575 10.028 - 4.770 2.445 - 4.965 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K560.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K560.rse deleted file mode 100644 index 0f112a3e74..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K560.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K650.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K650.eng deleted file mode 100644 index 67c214946e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K650.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K650T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K650T 98 289 0 1.27008 2.9353 AT - 0.079 514.338 - 0.240 594.264 - 0.401 618.849 - 0.563 641.658 - 0.723 665.057 - 0.884 686.488 - 1.046 704.685 - 1.206 720.215 - 1.368 730.072 - 1.529 736.891 - 1.690 743.109 - 1.851 747.503 - 2.013 747.557 - 2.174 744.081 - 2.335 732.294 - 2.496 710.412 - 2.657 682.670 - 2.819 653.246 - 2.979 627.020 - 3.141 595.456 - 3.302 563.844 - 3.463 551.080 - 3.624 236.059 - 3.785 1.383 - 3.947 1.234 - 4.108 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K650.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K650.rse deleted file mode 100644 index 76ab1c9132..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K650.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech K650T -Copyright Tripoli Motor Testing 1998 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K680.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K680.eng deleted file mode 100644 index c92ed34c3e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K680.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -;Aerotech K680R RASP engine file -;Data Entered by Tim Van Milligan -;Source: TRA Certification paperwork, and -;Aerotech's instruction sheet: RMS 98/2560-10240 REDLINE. -K680R 98 289 100 1.316 3.035 AT -0.085 629.798 -0.494 717.881 -0.996 797.157 -1.29 819.178 -1.506 819.178 -2.001 775.136 -2.519 673.84 -2.99 563.735 -3.137 541.714 -3.176 532.906 -3.238 563.735 -3.276 563.735 -3.408 52.85 -3.431 22.02 -3.49 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K680.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K680.rse deleted file mode 100644 index a31e40912c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K680.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - -Aerotech K680R RASP engine file -Data Entered by Tim Van Milligan -Source: TRA Certification paperwork, and -Aerotech's instruction sheet: RMS 98/2560-10240 REDLINE. - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K695.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K695.eng deleted file mode 100644 index 5932925a99..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K695.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech K695R -; provided by ThrustCurve.org (www.thrustcurve.org) -K695R 54 410 0 0.9184 1.48736 AT - 0.044 618.611 - 0.134 727.840 - 0.224 751.996 - 0.314 812.480 - 0.404 900.125 - 0.495 884.763 - 0.585 873.457 - 0.675 864.561 - 0.765 849.672 - 0.856 838.886 - 0.946 822.550 - 1.036 806.240 - 1.126 781.342 - 1.216 753.973 - 1.307 728.472 - 1.398 697.629 - 1.487 672.979 - 1.578 646.660 - 1.667 620.897 - 1.758 595.574 - 1.849 571.720 - 1.939 546.822 - 2.029 272.824 - 2.119 57.950 - 2.209 4.509 - 2.300 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K695.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K695.rse deleted file mode 100644 index 6fb71ddfd3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K695.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K700.eng deleted file mode 100644 index b3c12b2cbe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K700.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech K700W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K700W 54 568 0 1.29158 2.03526 AT - 0.069 1005.472 - 0.209 1018.916 - 0.350 1026.610 - 0.491 1028.637 - 0.632 1029.337 - 0.773 1004.203 - 0.914 970.694 - 1.055 946.516 - 1.196 918.437 - 1.336 873.783 - 1.478 821.276 - 1.619 773.270 - 1.759 735.553 - 1.900 692.732 - 2.041 658.984 - 2.182 626.737 - 2.323 591.431 - 2.464 508.666 - 2.605 420.175 - 2.746 328.309 - 2.886 202.409 - 3.028 121.672 - 3.169 80.453 - 3.309 50.873 - 3.451 31.548 - 3.593 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K700.rse deleted file mode 100644 index 58ddda975e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K700.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech K700W -Copyright Tripoli Motor Testing 1998 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K780.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K780.eng deleted file mode 100644 index cfda61d1aa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K780.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech K780R -; provided by ThrustCurve.org (www.thrustcurve.org) -K780R 75 289 0 1.26784 2.9344 AT - 0.053 383.290 - 0.173 718.241 - 0.292 849.343 - 0.413 885.503 - 0.533 903.243 - 0.652 924.403 - 0.772 938.825 - 0.892 938.623 - 1.013 947.130 - 1.133 953.578 - 1.253 944.001 - 1.373 935.448 - 1.495 929.447 - 1.617 920.379 - 1.737 897.293 - 1.857 888.917 - 1.977 861.127 - 2.098 840.971 - 2.217 812.360 - 2.337 779.614 - 2.457 747.866 - 2.578 726.819 - 2.697 729.258 - 2.817 279.891 - 2.940 10.969 - 3.063 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K780.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K780.rse deleted file mode 100644 index f56ed4f3b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K780.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -AeroTech K780R -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K805.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K805.eng deleted file mode 100644 index f9d04fb6b7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K805.eng +++ /dev/null @@ -1,47 +0,0 @@ -; From the curve of the motor instruction sheet. -; Made using Thrust Curve Tracer. -; Tom Koszuta 12/26/2008. -K805G 54 410 P 0.871 1.543 AT - 0.0050 443.21 - 0.032 817.925 - 0.053 825.983 - 0.098 854.187 - 0.199 902.537 - 0.298 918.654 - 0.399 938.8 - 0.5 950.888 - 0.595 950.888 - 0.699 950.888 - 0.8 942.829 - 0.903 934.771 - 1.002 922.683 - 1.1 902.537 - 1.201 874.333 - 1.254 866.275 - 1.267 878.362 - 1.299 854.187 - 1.334 846.129 - 1.35 850.158 - 1.398 821.954 - 1.499 781.662 - 1.522 789.72 - 1.536 781.662 - 1.546 765.545 - 1.597 757.487 - 1.698 721.224 - 1.799 701.078 - 1.897 688.991 - 1.95 693.02 - 1.961 705.107 - 1.982 697.049 - 1.995 668.845 - 2.014 596.319 - 2.035 447.24 - 2.051 342.481 - 2.064 269.955 - 2.08 205.488 - 2.099 165.197 - 2.123 120.876 - 2.147 84.613 - 2.171 52.379 - 2.197 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K805.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K805.rse deleted file mode 100644 index d0d8f6d821..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K805.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K828.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K828.eng deleted file mode 100644 index 2c073f6b36..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K828.eng +++ /dev/null @@ -1,30 +0,0 @@ -; -K828FJ 54.0 579.00 6-10-14-18 1.45000 2.25500 AT - 0.01 1112.06 - 0.02 1238.60 - 0.04 1303.79 - 0.06 1135.06 - 0.08 1077.54 - 0.13 1031.53 - 0.20 1016.19 - 0.50 993.18 - 0.65 1004.68 - 1.00 985.51 - 1.08 974.01 - 1.19 974.01 - 1.42 954.83 - 1.51 935.66 - 1.69 912.65 - 1.75 885.81 - 1.83 893.48 - 1.89 843.63 - 1.95 774.60 - 2.00 667.23 - 2.15 444.82 - 2.20 364.29 - 2.23 260.76 - 2.27 184.06 - 2.33 111.21 - 2.39 49.85 - 2.50 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K828.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K828.rse deleted file mode 100644 index a34156e798..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_K828.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Cert data from TRA -Converted from Mark Koelsch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1000.eng deleted file mode 100644 index 4ee0a57e92..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1000.eng +++ /dev/null @@ -1,26 +0,0 @@ -; per AT announcement 5/8/14 -L1000 54 635 18 1.4000000000000001 2.194 AT - 0.004 10.664 - 0.011 1268.961 - 0.04 1322.279 - 0.195 1226.307 - 0.249 1268.961 - 0.296 1242.303 - 0.372 1252.966 - 0.416 1215.644 - 0.6 1226.307 - 0.788 1215.644 - 1.066 1183.653 - 1.261 1167.658 - 1.507 1125.004 - 1.746 1087.681 - 1.865 1050.359 - 1.995 1045.027 - 2.093 911.733 - 2.158 746.448 - 2.263 554.504 - 2.389 405.215 - 2.577 191.944 - 2.693 85.308 - 2.761 42.654 - 3.0 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1040.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1040.eng deleted file mode 100644 index 77fe97eab2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1040.eng +++ /dev/null @@ -1,29 +0,0 @@ -; L1040 Dark Matter -L1040DM-P 75 681 P 2.602 4.7170000000000005 AT - 0.018 1126.167 - 0.042 1036.413 - 0.053 1002.543 - 0.116 988.995 - 0.504 1049.961 - 0.794 1095.685 - 1.002 1146.489 - 1.252 1192.213 - 1.499 1237.937 - 1.753 1261.646 - 1.912 1268.42 - 2.095 1254.872 - 2.511 1134.635 - 2.772 1056.734 - 3.012 966.98 - 3.153 933.11 - 3.217 863.677 - 3.291 817.953 - 3.34 758.681 - 3.488 438.613 - 3.552 284.505 - 3.598 220.153 - 3.657 167.655 - 3.746 118.544 - 3.88 42.337 - 3.996 6.774 - 4.127 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1120.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1120.eng deleted file mode 100644 index 90819c41df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1120.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech L1120W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L1120W 75 665 0 2.75699 4.65786 AT - 0.097 1377.215 - 0.293 1442.670 - 0.489 1496.986 - 0.685 1537.057 - 0.882 1554.962 - 1.078 1554.131 - 1.275 1547.973 - 1.472 1533.465 - 1.668 1510.342 - 1.865 1472.279 - 2.061 1362.534 - 2.257 1245.425 - 2.454 1148.864 - 2.651 1062.680 - 2.847 984.952 - 3.044 916.169 - 3.241 831.929 - 3.436 766.450 - 3.633 698.978 - 3.830 562.966 - 4.026 384.579 - 4.223 227.654 - 4.420 105.078 - 4.616 56.339 - 4.813 21.712 - 5.009 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1120.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1120.rse deleted file mode 100644 index 43cf8f7b98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1120.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1150.eng deleted file mode 100644 index 32059ad5e4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1150.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech L1150 -; provided by ThrustCurve.org (www.thrustcurve.org) -L1150 75 531 0 2.06528 3.6736 AT - 0.053 935.855 - 0.175 1292.642 - 0.300 1260.926 - 0.425 1241.482 - 0.550 1257.058 - 0.675 1272.287 - 0.800 1287.605 - 0.925 1301.012 - 1.048 1309.708 - 1.170 1308.417 - 1.295 1304.830 - 1.420 1285.265 - 1.545 1267.657 - 1.670 1255.624 - 1.795 1227.212 - 1.920 1202.443 - 2.043 1182.617 - 2.165 1150.712 - 2.290 1117.909 - 2.415 1081.739 - 2.540 1037.547 - 2.665 1007.091 - 2.790 1008.911 - 2.915 643.124 - 3.040 64.371 - 3.165 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1150.rse deleted file mode 100644 index 60e91c4e50..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1150.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -AeroTech L1150 -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1170.eng deleted file mode 100644 index 4ec7c77e30..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1170.eng +++ /dev/null @@ -1,17 +0,0 @@ -L1170FJ 75 665 P 2.8000000000000003 4.99 AT - 0.031 992.64 - 0.072 1400.144 - 0.113 1473.286 - 0.144 1389.696 - 0.351 1285.207 - 1.495 1431.491 - 1.856 1431.491 - 2.227 1358.349 - 2.753 1201.616 - 2.928 1170.27 - 3.0 1065.782 - 3.113 679.175 - 3.247 355.261 - 3.361 177.63 - 3.464 83.591 - 3.67 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1250.eng deleted file mode 100644 index 2818e441db..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1250.eng +++ /dev/null @@ -1,24 +0,0 @@ -L1250DM 75 801 P 2.565 5.647 AT - 0.032 1511.087 - 0.049 1295.217 - 0.211 1334.466 - 0.247 1396.61 - 0.256 1553.606 - 0.284 1380.257 - 0.491 1354.09 - 1.493 1448.942 - 1.72 1468.567 - 1.862 1478.379 - 2.008 1458.755 - 2.499 1334.466 - 3.002 1174.199 - 3.108 889.644 - 3.156 667.233 - 3.245 444.822 - 3.42 225.682 - 3.505 94.852 - 3.529 62.144 - 3.574 39.249 - 3.663 16.354 - 3.785 6.541 - 3.842 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1300.eng deleted file mode 100644 index ec9fc02283..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1300.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; -L1300R 98 443 100 2.508 4.884 AT -0.0231839 1299.23 -0.502318 1332.26 -0.996909 1497.42 -1.49923 1552.47 -1.99382 1508.43 -2.49614 1354.29 -2.99845 1101.05 -3.12983 1090.03 -3.21484 1145.09 -3.3694 176.167 -3.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1300.rse deleted file mode 100644 index 201a9f4825..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1300.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1365.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1365.eng deleted file mode 100644 index 10a36402af..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1365.eng +++ /dev/null @@ -1,78 +0,0 @@ -; Aerotech L1365 Metalstorm for 75/5120, derived from instruction sheet thrust curve. -L1365M 75 665.5 P 2.648 4.908 Aerotech - 0.009 166.808 - 0.013 618.303 - 0.022 940.799 - 0.03 1018.642 - 0.046 1160.985 - 0.059 1356.707 - 0.063 1496.826 - 0.076 1616.928 - 0.102 1434.551 - 0.15 1430.103 - 0.193 1472.361 - 0.245 1519.067 - 0.258 1541.308 - 0.282 1592.463 - 0.347 1623.6 - 0.393 1610.256 - 0.486 1574.67 - 0.556 1554.653 - 0.627 1539.084 - 0.673 1512.395 - 0.747 1479.033 - 0.779 1481.257 - 0.831 1496.826 - 0.885 1505.722 - 0.94 1523.515 - 0.987 1465.688 - 1.009 1532.412 - 1.026 1494.602 - 1.098 1534.636 - 1.142 1463.464 - 1.185 1505.722 - 1.224 1476.809 - 1.246 1523.515 - 1.296 1483.481 - 1.322 1516.843 - 1.346 1472.361 - 1.441 1501.274 - 1.504 1507.947 - 1.528 1601.359 - 1.589 1510.171 - 1.699 1512.395 - 1.732 1512.395 - 1.801 1463.464 - 1.864 1496.826 - 1.964 1521.291 - 2.007 1510.171 - 2.068 1450.12 - 2.129 1443.447 - 2.201 1510.171 - 2.237 1463.464 - 2.374 1474.585 - 2.457 1416.758 - 2.546 1427.879 - 2.632 1367.828 - 2.687 1403.413 - 2.776 1343.362 - 2.834 1425.655 - 2.897 1307.777 - 2.93 1347.811 - 2.947 1316.673 - 2.982 1361.155 - 3.051 1354.483 - 3.071 1330.018 - 3.14 1129.848 - 3.175 1029.763 - 3.227 842.938 - 3.277 582.717 - 3.307 449.27 - 3.353 329.168 - 3.414 184.601 - 3.479 88.964 - 3.527 48.93 - 3.587 20.017 - 3.663 17.793 - 3.711 8.896 - 3.752 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1390.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1390.eng deleted file mode 100644 index 604c936745..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1390.eng +++ /dev/null @@ -1,41 +0,0 @@ -;Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -;Tracer program. Thrust curve and engine data from Aerotech thrust stand. -L1390G 75 517.91 1000 1.973 3.876 Aerotech -0.018 906.203 -0.041 1249.41 -0.055 1336.72 -0.099 1369.84 -0.173 1402.96 -0.236 1411.99 -0.284 1411.99 -0.678 1586.61 -0.869 1649.83 -0.939 1640.8 -1.102 1625.74 -1.197 1628.76 -1.293 1619.72 -1.374 1607.68 -1.455 1601.66 -1.518 1589.62 -1.592 1550.48 -1.691 1499.3 -1.838 1424.03 -1.96 1366.83 -2.1 1312.64 -2.225 1261.46 -2.343 1228.34 -2.417 1213.29 -2.479 1204.26 -2.524 1198.23 -2.564 1198.23 -2.601 1165.12 -2.638 1074.8 -2.66 957.383 -2.689 839.968 -2.712 713.522 -2.737 590.085 -2.763 427.511 -2.8 295.043 -2.844 153.543 -2.877 69.245 -2.911 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1420.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1420.eng deleted file mode 100644 index 022b1eff53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1420.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; -L1420R 75 443 100 2.56 4.562 AT -0.0386399 1332.26 -0.123648 1563.48 -0.502318 1519.44 -0.996909 1574.49 -1.49923 1662.58 -2.00155 1574.49 -2.48068 1409.34 -2.92117 1299.23 -2.99073 1167.11 -3.11437 187.178 -3.24 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1420.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1420.rse deleted file mode 100644 index 70dc166521..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1420.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1500.eng deleted file mode 100644 index 3a2ea4a35e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1500.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech L1500T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L1500T 98 443 0 2.464 4.6592 AT - 0.073 1320.328 - 0.222 1454.823 - 0.372 1508.992 - 0.522 1556.781 - 0.672 1602.407 - 0.822 1642.004 - 0.971 1670.099 - 1.120 1694.804 - 1.270 1701.295 - 1.420 1704.286 - 1.570 1701.008 - 1.720 1694.550 - 1.869 1683.861 - 2.018 1659.694 - 2.168 1620.161 - 2.318 1570.033 - 2.468 1517.933 - 2.618 1463.319 - 2.767 1400.991 - 2.916 1331.420 - 3.066 1279.479 - 3.216 1108.987 - 3.366 217.788 - 3.516 10.579 - 3.666 3.245 - 3.816 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1500.rse deleted file mode 100644 index 4e89005d9f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1500.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1520.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1520.eng deleted file mode 100644 index 4d227fe435..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L1520.eng +++ /dev/null @@ -1,35 +0,0 @@ -; Based on AT Instruction Sheet by C. Kobel 12/22/2010 -L1520T 75 531 P 1.773 3.620 AT - 0.011 1484.553 - 0.055 1506.304 - 0.089 1468.239 - 0.155 1560.684 - 0.200 1571.559 - 0.300 1582.435 - 0.400 1598.749 - 0.500 1620.501 - 0.600 1642.252 - 0.700 1653.128 - 0.800 1674.88 - 0.900 1691.194 - 1.000 1685.756 - 1.100 1696.632 - 1.200 1691.194 - 1.300 1691.194 - 1.400 1680.318 - 1.500 1664.004 - 1.600 1636.814 - 1.700 1620.501 - 1.800 1604.187 - 1.900 1576.997 - 2.000 1560.684 - 2.100 1538.932 - 2.200 1500.866 - 2.227 1435.611 - 2.250 1125.65 - 2.290 832.002 - 2.366 647.113 - 2.400 456.785 - 2.440 244.706 - 2.500 59.817 - 2.600 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L2200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L2200.eng deleted file mode 100644 index e531570cf4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L2200.eng +++ /dev/null @@ -1,39 +0,0 @@ -; Curvefit of Aerotech Instructions by C. Kobel 11/19/08 -L2200G 75 665 0-6-10-14-18 2.516 4.751 AT - 0.011 1195.177 - 0.024 2029.903 - 0.037 2380.868 - 0.050 2542.122 - 0.100 2570.578 - 0.150 2561.093 - 0.200 2523.151 - 0.250 2485.208 - 0.300 2523.151 - 0.350 2570.578 - 0.400 2674.919 - 0.500 2912.057 - 0.600 3073.311 - 0.700 3073.311 - 0.800 3101.768 - 0.900 3092.282 - 1.000 3092.282 - 1.100 2959.485 - 1.186 2807.716 - 1.227 2437.781 - 1.270 2257.556 - 1.300 2162.701 - 1.400 1991.961 - 1.500 1878.135 - 1.600 1792.765 - 1.700 1688.424 - 1.800 1612.54 - 1.900 1584.083 - 2.000 1536.656 - 2.048 1498.714 - 2.084 1403.858 - 2.102 1166.72 - 2.134 796.784 - 2.186 455.305 - 2.237 237.138 - 2.300 94.855 - 2.400 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L339.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L339.eng deleted file mode 100644 index 1fd9aea1b4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L339.eng +++ /dev/null @@ -1,69 +0,0 @@ -;This file is identical to Tim Van Milligan's L339 file except the motor and -; propellant weights have been corrected. Total weight was about 50% too high. -L339N 98 309 4 1.355 3.15 Aerotech - 0.049 2.884 - 0.074 373.449 - 0.123 399.403 - 0.156 408.054 - 0.279 415.984 - 0.427 417.426 - 0.476 421.031 - 0.509 416.705 - 0.632 415.984 - 0.837 414.542 - 0.894 418.868 - 0.943 405.17 - 1.026 400.124 - 1.124 402.286 - 1.255 397.961 - 1.362 392.914 - 1.51 391.472 - 1.575 394.356 - 1.592 385.705 - 1.657 387.147 - 1.838 384.984 - 2.026 382.821 - 2.174 379.937 - 2.404 377.053 - 2.478 378.495 - 2.552 377.053 - 2.617 378.495 - 2.683 366.96 - 2.773 359.751 - 2.806 363.355 - 2.937 359.751 - 3.232 351.099 - 3.314 355.425 - 3.356 351.099 - 3.815 345.332 - 3.979 340.285 - 4.233 336.681 - 4.414 333.797 - 4.668 330.913 - 4.996 329.471 - 5.39 323.704 - 5.686 320.099 - 5.989 314.331 - 6.178 310.727 - 6.325 306.401 - 6.514 302.075 - 6.621 302.075 - 6.851 297.75 - 7.195 290.54 - 7.277 293.424 - 7.326 287.656 - 7.441 283.331 - 7.49 286.214 - 7.54 283.331 - 7.696 275.4 - 7.81 273.958 - 7.884 276.842 - 7.942 278.284 - 8.015 276.121 - 8.073 270.354 - 8.188 155.003 - 8.212 118.956 - 8.278 54.071 - 8.311 26.675 - 8.352 7.93 - 8.426 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L339_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L339_1.eng deleted file mode 100644 index 12ebe81980..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L339_1.eng +++ /dev/null @@ -1,69 +0,0 @@ -; Entered by Tim Van Milligan. Used John Coker's ThrustCurve Tracer software and -; data supplied by Aerotech thrust stand data. The total weight is a guess. -L339N 98 309 4 1.796 4.5 Aerotech - 0.049 2.884 - 0.074 373.449 - 0.123 399.403 - 0.156 408.054 - 0.279 415.984 - 0.427 417.426 - 0.476 421.031 - 0.509 416.705 - 0.632 415.984 - 0.837 414.542 - 0.894 418.868 - 0.943 405.17 - 1.026 400.124 - 1.124 402.286 - 1.255 397.961 - 1.362 392.914 - 1.51 391.472 - 1.575 394.356 - 1.592 385.705 - 1.657 387.147 - 1.838 384.984 - 2.026 382.821 - 2.174 379.937 - 2.404 377.053 - 2.478 378.495 - 2.552 377.053 - 2.617 378.495 - 2.683 366.96 - 2.773 359.751 - 2.806 363.355 - 2.937 359.751 - 3.232 351.099 - 3.314 355.425 - 3.356 351.099 - 3.815 345.332 - 3.979 340.285 - 4.233 336.681 - 4.414 333.797 - 4.668 330.913 - 4.996 329.471 - 5.39 323.704 - 5.686 320.099 - 5.989 314.331 - 6.178 310.727 - 6.325 306.401 - 6.514 302.075 - 6.621 302.075 - 6.851 297.75 - 7.195 290.54 - 7.277 293.424 - 7.326 287.656 - 7.441 283.331 - 7.49 286.214 - 7.54 283.331 - 7.696 275.4 - 7.81 273.958 - 7.884 276.842 - 7.942 278.284 - 8.015 276.121 - 8.073 270.354 - 8.188 155.003 - 8.212 118.956 - 8.278 54.071 - 8.311 26.675 - 8.352 7.93 - 8.426 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L400.eng deleted file mode 100644 index 8a82d78fae..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L400.eng +++ /dev/null @@ -1,35 +0,0 @@ -; Aerotech L400W-PS created using TCtracer and AT thrustcurve -L400W 98 443.2 P 2.6489656 5.0847439 AT - 0.031 436.662 - 0.062 493.929 - 0.063 586.988 - 0.108 634.711 - 0.154 606.077 - 0.277 622.78 - 0.4 639.483 - 0.508 610.85 - 0.538 601.305 - 0.908 665.731 - 1.092 684.82 - 1.631 720.612 - 1.954 706.295 - 2.385 703.909 - 2.6 701.523 - 2.769 689.592 - 3.2 656.186 - 3.754 586.988 - 4.354 527.335 - 5.262 434.276 - 5.815 386.553 - 6.477 336.445 - 7.354 276.791 - 8.046 217.138 - 8.846 167.029 - 9.862 107.376 - 10.969 64.426 - 11.969 40.564 - 12.969 26.247 - 13.985 14.317 - 14.938 7.158 - 15.462 2.386 - 15.938 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L850.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L850.eng deleted file mode 100644 index bbbac92d98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L850.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech L850W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L850W 75 531 0 2.06528 3.67315 AT - 0.091 1015.926 - 0.274 1064.942 - 0.458 1101.366 - 0.643 1143.358 - 0.827 1170.928 - 1.011 1184.795 - 1.196 1178.044 - 1.380 1177.598 - 1.564 1174.910 - 1.748 1170.021 - 1.932 1113.716 - 2.117 1042.586 - 2.301 972.795 - 2.485 908.071 - 2.670 844.471 - 2.854 773.595 - 3.039 714.046 - 3.222 649.095 - 3.406 597.341 - 3.591 557.444 - 3.775 422.233 - 3.959 200.739 - 4.144 79.411 - 4.328 43.959 - 4.513 14.862 - 4.697 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L850.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L850.rse deleted file mode 100644 index 0c54b2e18b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L850.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L900.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L900.eng deleted file mode 100644 index d643a687f2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L900.eng +++ /dev/null @@ -1,30 +0,0 @@ -; L900 Dark Matter -L900DM 75 665.5 P 2.472 4.724 AT - 0.016 577.998 - 0.041 870.377 - 0.086 851.787 - 0.303 931.219 - 0.417 944.74 - 0.515 910.939 - 0.998 936.289 - 1.272 976.851 - 1.501 992.061 - 1.747 1019.102 - 2.0 1029.242 - 2.205 1054.593 - 2.495 1047.833 - 2.77 1034.313 - 3.003 998.821 - 3.166 981.921 - 3.498 909.249 - 3.592 880.518 - 3.702 890.658 - 3.768 856.857 - 3.862 672.641 - 3.964 442.794 - 4.021 353.221 - 4.111 285.619 - 4.242 104.783 - 4.3 50.702 - 4.369 21.971 - 4.484 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L952.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L952.eng deleted file mode 100644 index a5159eaa86..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L952.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech L952W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L952W 98 427 0 2.73011 5.01222 AT - 0.141 679.073 - 0.425 801.562 - 0.709 848.474 - 0.994 913.345 - 1.278 981.614 - 1.562 1043.690 - 1.847 1088.114 - 2.131 1112.556 - 2.416 1121.541 - 2.700 1118.573 - 2.984 1100.665 - 3.269 1039.140 - 3.553 965.784 - 3.837 876.793 - 4.122 780.693 - 4.406 693.903 - 4.691 608.030 - 4.975 528.335 - 5.259 463.528 - 5.544 405.769 - 5.828 358.367 - 6.112 279.009 - 6.397 99.897 - 6.681 20.108 - 6.967 3.317 - 7.252 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L952.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L952.rse deleted file mode 100644 index 92754bbe29..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_L952.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1075.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1075.eng deleted file mode 100644 index 60d04ee050..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1075.eng +++ /dev/null @@ -1,24 +0,0 @@ -; M1075 Dark Matter -M1075DM 98 597 P 3.846 6.971 AT - 0.02 927.501 - 0.112 988.073 - 0.26 1033.501 - 0.53 1080.823 - 0.897 1124.359 - 1.509 1198.18 - 1.998 1239.823 - 2.355 1260.644 - 2.503 1264.43 - 2.773 1237.93 - 2.997 1222.787 - 3.502 1162.216 - 4.001 1063.787 - 4.501 906.68 - 4.741 834.751 - 4.878 742.001 - 4.96 664.394 - 5.062 448.608 - 5.164 223.357 - 5.26 79.5 - 5.352 30.286 - 5.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1297.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1297.eng deleted file mode 100644 index 87452973e5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1297.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -; Aerotech M1297W -; Greg Gardner - 12/20/04 -M1297W 75 665 0 2.722 4.637 AT -0.10 1433.4 -0.15 1789.3 -0.20 1922.8 -0.25 1869.4 -0.30 1856.0 -0.35 1833.8 -0.40 1767.0 -0.50 1722.6 -0.60 1709.2 -0.90 1700.3 -1.00 1688.1 -1.50 1678.7 -1.75 1634.6 -1.85 1622.3 -1.95 1572.8 -2.00 1554.0 -2.50 1346.5 -3.00 1136.0 -3.20 1053.3 -3.25 1044.1 -3.35 1032.0 -3.38 1020.0 -3.40 937.0 -3.50 738.0 -3.60 545.0 -3.75 393.0 -4.00 226.0 -4.25 94.0 -4.35 45.0 -4.40 0.0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1297.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1297.rse deleted file mode 100644 index e0c2763fa2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1297.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1305.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1305.eng deleted file mode 100644 index f90657ff83..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1305.eng +++ /dev/null @@ -1,31 +0,0 @@ -; M1305 Metalstorm -M1305M 98 597 P 4.08 7.098 AT - 0.016 1288.076 - 0.043 1462.78 - 0.08 1370.986 - 0.407 1622.679 - 0.535 1640.446 - 0.787 1705.59 - 0.985 1693.745 - 1.13 1717.434 - 1.328 1693.745 - 1.349 1927.672 - 1.397 1726.317 - 1.751 1711.512 - 2.018 1687.823 - 2.275 1690.784 - 2.297 1892.139 - 2.318 1678.94 - 2.929 1412.441 - 3.748 1113.371 - 4.24 906.095 - 4.503 802.456 - 4.717 663.285 - 4.813 538.919 - 4.92 387.903 - 5.027 245.771 - 5.166 145.094 - 5.263 79.95 - 5.386 32.572 - 5.498 23.689 - 5.707 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1315.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1315.eng deleted file mode 100644 index c533a639e2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1315.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech M1315W -; converted from TMT test stand data 1999 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1315W 75 801 0 3.4496 5.6448 AT - 0.116 1728.683 - 0.349 1673.336 - 0.582 1686.810 - 0.816 1696.068 - 1.049 1663.167 - 1.282 1631.243 - 1.516 1620.471 - 1.749 1619.702 - 1.982 1621.042 - 2.216 1615.320 - 2.449 1567.089 - 2.682 1493.722 - 2.916 1420.079 - 3.149 1358.660 - 3.382 1292.507 - 3.616 1224.806 - 3.849 1171.995 - 4.082 928.809 - 4.316 577.949 - 4.549 395.445 - 4.782 314.006 - 5.016 228.273 - 5.249 159.803 - 5.482 118.348 - 5.716 109.782 - 5.949 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1315.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1315.rse deleted file mode 100644 index a7d2d6c1cd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1315.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1350.eng deleted file mode 100644 index f1384209c6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1350.eng +++ /dev/null @@ -1,26 +0,0 @@ -; AT M1350W DMS -M1350W 75 622 p 1.97 4.808 AT - 0.03 1428.886 - 0.044 1724.734 - 0.056 1548.484 - 0.078 1620.873 - 0.115 1589.399 - 0.178 1642.904 - 0.455 1749.913 - 0.496 1724.734 - 0.54 1737.324 - 1.132 1746.766 - 1.499 1731.029 - 1.639 1715.292 - 2.505 1334.466 - 3.086 1051.207 - 3.179 985.113 - 3.227 928.461 - 3.315 670.38 - 3.419 446.92 - 3.46 396.563 - 3.545 298.996 - 3.697 173.103 - 3.737 173.103 - 3.845 81.83 - 3.996 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1350_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1350_1.eng deleted file mode 100644 index 2eba410b79..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1350_1.eng +++ /dev/null @@ -1,19 +0,0 @@ -; from TMT cert letter 22 Jun 2014 -M1350 75 622 P 1.97 4.808 AT - 0.058 1591.743 - 0.45 1758.762 - 0.501 1723.334 - 0.717 1756.231 - 1.022 1758.762 - 1.651 1723.334 - 2.03 1561.376 - 2.213 1467.744 - 2.707 1245.052 - 3.029 1090.686 - 3.171 997.054 - 3.255 908.483 - 3.343 640.24 - 3.448 412.487 - 3.702 169.55 - 3.915 43.02 - 4.0 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1419.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1419.eng deleted file mode 100644 index 8238ecabf2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1419.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech M1419W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1419W 98 579 0 4.032 6.91622 AT - 0.154 1154.896 - 0.465 1241.151 - 0.776 1300.224 - 1.087 1358.364 - 1.399 1411.033 - 1.710 1461.033 - 2.022 1485.747 - 2.333 1503.653 - 2.644 1513.113 - 2.955 1511.947 - 3.267 1492.438 - 3.578 1418.368 - 3.890 1326.608 - 4.201 1219.222 - 4.513 1087.648 - 4.824 937.068 - 5.135 810.066 - 5.446 709.130 - 5.757 624.701 - 6.069 557.223 - 6.380 437.806 - 6.692 252.076 - 7.003 107.741 - 7.315 19.973 - 7.626 0.515 - 7.937 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1419.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1419.rse deleted file mode 100644 index 14defd0ed4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1419.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1500.eng deleted file mode 100644 index f650666d32..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1500.eng +++ /dev/null @@ -1,45 +0,0 @@ -; Curvefit of AeroTech Instructions by C. Kobel 11/19/08 -M1500G 75 665 0-6-10-14-18 2.631 4.896 AT - 0.012 1183.8 - 0.023 1614.273 - 0.050 1694.987 - 0.100 1716.511 - 0.150 1694.987 - 0.200 1603.512 - 0.250 1517.417 - 0.300 1490.512 - 0.400 1474.37 - 0.500 1485.132 - 0.600 1512.036 - 0.700 1533.56 - 0.800 1571.226 - 0.900 1608.892 - 1.000 1630.416 - 1.100 1657.321 - 1.200 1684.225 - 1.300 1694.987 - 1.400 1694.987 - 1.500 1700.368 - 1.600 1700.368 - 1.700 1705.749 - 1.800 1689.606 - 1.900 1662.702 - 2.000 1657.321 - 2.100 1608.892 - 2.200 1581.988 - 2.300 1555.083 - 2.400 1522.798 - 2.500 1490.512 - 2.600 1463.608 - 2.700 1431.322 - 2.800 1415.18 - 2.900 1388.275 - 3.000 1361.371 - 3.100 1372.132 - 3.200 1286.038 - 3.250 1226.848 - 3.300 973.945 - 3.400 478.901 - 3.450 220.617 - 3.500 80.714 - 3.600 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1550.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1550.eng deleted file mode 100644 index 75211ccfd9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1550.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech M1550R -; provided by ThrustCurve.org (www.thrustcurve.org) -M1550R 75 800 0 3.4496 5.6448 AT - 0.069 1720.759 - 0.212 2125.329 - 0.358 1995.947 - 0.501 1908.442 - 0.645 1868.713 - 0.790 1835.504 - 0.935 1808.662 - 1.079 1796.300 - 1.222 1785.423 - 1.368 1773.153 - 1.511 1746.590 - 1.655 1715.709 - 1.800 1689.633 - 1.945 1660.720 - 2.089 1633.277 - 2.232 1606.038 - 2.378 1570.222 - 2.521 1534.714 - 2.665 1503.345 - 2.810 1461.317 - 2.955 1427.572 - 3.099 1393.229 - 3.242 939.955 - 3.388 268.504 - 3.532 4.985 - 3.677 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1550.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1550.rse deleted file mode 100644 index 86016f2a4d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1550.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1600.eng deleted file mode 100644 index f145847623..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1600.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech M1600R -; provided by ThrustCurve.org (www.thrustcurve.org) -M1600R 98 579 0 4.032 6.91712 AT - 0.088 1370.361 - 0.268 1626.628 - 0.448 1672.654 - 0.628 1720.596 - 0.808 1763.287 - 0.987 1801.282 - 1.167 1829.825 - 1.348 1845.146 - 1.529 1856.370 - 1.710 1850.089 - 1.890 1847.370 - 2.070 1829.454 - 2.250 1810.982 - 2.430 1784.910 - 2.610 1754.267 - 2.790 1726.898 - 2.971 1689.288 - 3.152 1641.579 - 3.332 1581.589 - 3.513 1511.036 - 3.692 1431.400 - 3.872 1361.032 - 4.053 1234.566 - 4.232 621.206 - 4.414 42.471 - 4.595 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1600.rse deleted file mode 100644 index a7ddcf89ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1600.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780.eng deleted file mode 100644 index 6bc79404df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780.eng +++ /dev/null @@ -1,42 +0,0 @@ -; AT M1780NT 1" Core Revised -M1780NT 75 665 P 2.371 4.606 AT - 0.0090 1337.154 - 0.026 2005.731 - 0.04 2106.521 - 0.046 2163.636 - 0.085 2156.916 - 0.108 2126.679 - 0.134 2113.24 - 0.168 2130.039 - 0.205 2126.679 - 0.259 2197.233 - 0.299 2156.916 - 0.347 2130.039 - 0.399 2123.32 - 0.495 2103.161 - 0.595 2089.723 - 0.697 2079.644 - 0.8 2083.003 - 0.9 2076.284 - 0.999 2069.565 - 1.201 2056.126 - 1.398 2029.248 - 1.603 2002.371 - 1.799 1965.414 - 1.998 1904.94 - 2.2 1817.588 - 2.3 1757.114 - 2.354 1723.517 - 2.405 1713.438 - 2.46 1629.446 - 2.502 1558.893 - 2.571 1333.794 - 2.622 1115.415 - 2.67 890.316 - 2.724 665.217 - 2.758 571.146 - 2.798 507.312 - 2.83 446.838 - 2.901 265.415 - 3.003 73.913 - 3.035 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780_1.eng deleted file mode 100644 index 42b6beb7a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780_1.eng +++ /dev/null @@ -1,23 +0,0 @@ -M1780 75 665 P 2.56 4.715 AT - 0.028 2204.193 - 0.118 2566.025 - 0.173 2566.025 - 0.341 2214.151 - 0.44 2144.44 - 0.636 2114.564 - 1.34 2134.482 - 1.395 2204.193 - 1.648 2121.203 - 1.841 2041.534 - 1.874 1895.473 - 2.127 1643.186 - 2.353 1517.042 - 2.584 1460.61 - 2.672 1347.744 - 2.763 1068.901 - 2.829 723.666 - 2.939 438.183 - 2.999 292.122 - 3.101 172.617 - 3.272 36.515 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780_2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780_2.eng deleted file mode 100644 index 42b6beb7a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1780_2.eng +++ /dev/null @@ -1,23 +0,0 @@ -M1780 75 665 P 2.56 4.715 AT - 0.028 2204.193 - 0.118 2566.025 - 0.173 2566.025 - 0.341 2214.151 - 0.44 2144.44 - 0.636 2114.564 - 1.34 2134.482 - 1.395 2204.193 - 1.648 2121.203 - 1.841 2041.534 - 1.874 1895.473 - 2.127 1643.186 - 2.353 1517.042 - 2.584 1460.61 - 2.672 1347.744 - 2.763 1068.901 - 2.829 723.666 - 2.939 438.183 - 2.999 292.122 - 3.101 172.617 - 3.272 36.515 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1800.eng deleted file mode 100644 index 402a75fb67..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1800.eng +++ /dev/null @@ -1,43 +0,0 @@ -; Entered by Tim Van Milligan. Used John Coker's ThrustCurve Tracer software and -; data from TRA certification dated 10-14-08 -M1800FJ 98 751 4 5.599 9.162 Aerotech - 0.021 3007.361 - 0.043 1964.715 - 0.059 1858.322 - 0.069 1766.116 - 0.134 1829.951 - 0.192 1822.858 - 0.267 1822.858 - 0.363 1865.415 - 0.502 1936.344 - 0.582 1922.158 - 0.684 1964.715 - 1.132 2071.107 - 1.581 2149.129 - 1.923 2198.778 - 2.142 2220.057 - 2.393 2220.057 - 2.463 2198.778 - 2.655 2106.572 - 2.831 2007.272 - 2.922 1978.901 - 3.029 1915.065 - 3.21 1808.673 - 3.349 1695.187 - 3.526 1588.795 - 3.723 1439.845 - 3.851 1397.288 - 3.921 1361.824 - 4.017 1255.432 - 4.097 1120.668 - 4.167 978.811 - 4.263 780.212 - 4.327 624.169 - 4.402 453.941 - 4.428 375.92 - 4.482 276.621 - 4.53 177.321 - 4.583 99.3 - 4.653 42.557 - 4.76 21.279 - 4.952 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1845.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1845.eng deleted file mode 100644 index e83bfa0878..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1845.eng +++ /dev/null @@ -1,17 +0,0 @@ -M1845 98 597 P 3.7720000000000002 6.682 AT - 0.024 2261.638 - 0.067 2115.94 - 1.032 2268.261 - 1.354 2433.828 - 2.253 2288.129 - 2.406 2149.053 - 2.578 1821.232 - 3.065 1579.504 - 3.583 1410.627 - 3.838 1364.268 - 3.913 1218.569 - 3.995 685.445 - 4.109 400.671 - 4.352 248.35 - 4.498 33.113 - 4.729 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1850.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1850.eng deleted file mode 100644 index 6ee44babb0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1850.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -;75-7680 case -; Greg Gardner - 10/25/07 -M1850W 75 935 0 3.979 6.871 AT -0.1 2411 -0.2 2135 -0.3 2015 -0.4 2000 -0.5 2055 -1.0 2098 -1.5 1860 -2.0 1788 -2.5 1659 -3.0 1468 -3.25 1423 -3.35 1334 -3.5 1201 -3.75 934 -3.8 930 -4.0 881 -4.25 600 -4.5 468 -4.75 400 -5.0 290 -5.5 85 -6.0 23 -6.5 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1939.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1939.eng deleted file mode 100644 index ed359978cb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1939.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech M1939W -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1939W 98 732 0 5.656 8.98822 AT - 0.134 1905.185 - 0.406 2021.155 - 0.679 2095.900 - 0.952 2158.087 - 1.225 2198.211 - 1.498 2219.694 - 1.770 2228.643 - 2.042 2229.881 - 2.315 2225.641 - 2.587 2211.713 - 2.860 2164.724 - 3.133 2047.014 - 3.405 1916.238 - 3.677 1805.664 - 3.950 1658.489 - 4.223 1497.704 - 4.496 1339.452 - 4.769 1213.061 - 5.041 1102.130 - 5.313 966.508 - 5.585 670.253 - 5.858 443.975 - 6.131 155.355 - 6.404 41.358 - 6.677 5.775 - 6.950 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1939.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1939.rse deleted file mode 100644 index 8715090367..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M1939.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2000.eng deleted file mode 100644 index e2bf3ec0ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2000.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech M2000R -; provided by ThrustCurve.org (www.thrustcurve.org) -M2000R 98 732 0 5.65824 8.98688 AT - 0.091 1530.959 - 0.279 2186.270 - 0.466 2166.698 - 0.655 2187.237 - 0.844 2219.069 - 1.031 2248.071 - 1.220 2273.743 - 1.409 2298.306 - 1.596 2309.753 - 1.785 2315.708 - 1.974 2316.158 - 2.161 2306.313 - 2.350 2282.230 - 2.539 2252.104 - 2.726 2209.638 - 2.915 2168.800 - 3.104 2117.175 - 3.291 2067.533 - 3.480 2004.508 - 3.669 1934.442 - 3.856 1831.480 - 4.045 1745.634 - 4.234 1504.269 - 4.421 649.796 - 4.610 58.178 - 4.799 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2000.rse deleted file mode 100644 index e2ae83cceb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2000.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2030.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2030.rse deleted file mode 100644 index e1e0442120..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2030.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Took this data from the Aerotech Typical Time-Thrust Curve that comes with the M2030G motor. - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2100.eng deleted file mode 100644 index c171596a7d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2100.eng +++ /dev/null @@ -1,50 +0,0 @@ -; Entered by Tim Van Milligan for RockSim Users. Used John Coker's ThrustCurve -; Tracer software and TRA cert paperwork dated 10-14-08. -M2100G 98 597 4 4.03 7.03 Aerotech - 0.014 72.789 - 0.017 1148.45 - 0.021 1552.833 - 0.038 1593.272 - 0.042 1908.691 - 0.052 2062.357 - 0.077 2151.321 - 0.115 2207.935 - 0.167 2240.285 - 0.223 2256.461 - 0.272 2256.461 - 0.31 2232.198 - 0.415 2280.724 - 0.59 2385.863 - 0.701 2410.126 - 0.876 2507.179 - 0.959 2555.705 - 1.043 2588.055 - 1.176 2677.02 - 1.263 2782.159 - 1.333 2830.685 - 1.437 2846.861 - 1.517 2879.211 - 1.608 2968.176 - 1.667 2943.913 - 1.81 2935.825 - 1.926 2895.387 - 1.999 2846.861 - 2.041 2782.159 - 2.152 2531.442 - 2.393 1949.129 - 2.484 1787.376 - 2.56 1674.148 - 2.738 1504.307 - 2.836 1439.606 - 2.958 1366.817 - 3.091 1285.94 - 3.178 1229.326 - 3.23 1196.976 - 3.283 1180.8 - 3.401 1188.888 - 3.447 1140.362 - 3.478 1035.222 - 3.513 913.907 - 3.516 541.874 - 3.527 444.822 - 3.541 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2400.eng deleted file mode 100644 index 8ee08b53a9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2400.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech M2400T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M2400T 98 597 0 3.65254 6.4512 AT - 0.070 2441.945 - 0.211 2495.460 - 0.353 2556.133 - 0.495 2601.596 - 0.636 2637.660 - 0.778 2660.804 - 0.920 2676.486 - 1.061 2687.081 - 1.203 2695.807 - 1.345 2694.493 - 1.486 2684.268 - 1.628 2667.289 - 1.771 2629.961 - 1.914 2578.923 - 2.055 2522.074 - 2.197 2461.704 - 2.339 2393.518 - 2.480 2303.939 - 2.622 2201.610 - 2.764 2097.461 - 2.905 2010.409 - 3.047 1275.776 - 3.189 418.836 - 3.330 17.586 - 3.473 3.669 - 3.616 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2400.rse deleted file mode 100644 index adfc902620..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2400.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2500.eng deleted file mode 100644 index 2865725bb4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2500.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech M2500T -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M2500T 98 751 0 4.6592 8.064 AT - 0.082 2651.855 - 0.249 2780.285 - 0.416 2820.733 - 0.583 2843.010 - 0.751 2847.765 - 0.918 2851.215 - 1.084 2854.737 - 1.252 2861.690 - 1.420 2858.088 - 1.586 2851.086 - 1.754 2844.622 - 1.922 2830.855 - 2.089 2804.711 - 2.255 2765.796 - 2.423 2710.509 - 2.591 2648.262 - 2.757 2586.910 - 2.925 2520.794 - 3.093 2462.217 - 3.259 2419.937 - 3.426 1894.936 - 3.594 808.043 - 3.761 282.403 - 3.928 97.876 - 4.096 24.492 - 4.264 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2500.rse deleted file mode 100644 index 57691402a4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M2500.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech M2500T -Copyright Tripoli Motor Testing 1998 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M650.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M650.eng deleted file mode 100644 index 38c027ec25..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M650.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -;75-6400 case -; Greg Gardner - 10/25/07 -M650W 75 801 0 3.351 5.125 AT -0.08 1240 -0.12 1328 -0.25 1230 -0.5 1142 -1.0 1071 -1.5 1048 -2.0 1018 -2.5 982 -3.0 950 -3.5 853 -4.0 781 -5.0 595 -6.0 443 -7.0 297 -8.0 155 -9.0 88 -10.0 32 -10.5 12 -11.0 4 -11.5 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M650.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M650.rse deleted file mode 100644 index 2c7408050b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M650.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - -75-6400 case -Greg Gardner - 10/25/07 - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M685.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M685.eng deleted file mode 100644 index bc2dc5ecf9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M685.eng +++ /dev/null @@ -1,24 +0,0 @@ -; M685W-PS Moonburner -M685W-PS 75 936 P 4.32 7.008 AT - 0.083 1333.469 - 0.13 1368.376 - 0.249 1361.395 - 0.308 1380.012 - 0.403 1359.068 - 0.675 1184.53 - 1.018 1072.826 - 1.456 996.029 - 1.977 958.794 - 2.995 914.578 - 3.99 856.399 - 4.985 781.929 - 5.494 730.732 - 5.991 679.534 - 7.258 542.231 - 7.862 463.107 - 8.015 456.125 - 8.998 330.458 - 9.993 207.118 - 10.514 137.303 - 11.496 34.908 - 11.994 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M750.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M750.eng deleted file mode 100644 index 903d0a1ae4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M750.eng +++ /dev/null @@ -1,24 +0,0 @@ -; -;98-10240 case -; Greg Gardner - 10/25/07 -M750W 98 732 0 5.3 8.776 AT -0.1 1032 -0.2 992 -0.3 974 -0.48 966 -1.0 1055 -1.5 1152 -2.0 1192 -2.5 1218 -4.0 1103 -6.0 818 -8.0 561 -10.0 318 -11.0 216 -12.0 125 -13.0 76 -14.0 47 -15.0 23 -15.5 9 -16.0 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M750.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M750.rse deleted file mode 100644 index 26c1aa5b1f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M750.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - -98-10240 case -Greg Gardner - 10/25/07 - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M845.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M845.eng deleted file mode 100644 index a7e8c69921..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M845.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -M845HW 98 795.02 100 3.569 6.833 AT -0.015456 1332.26 -0.0463679 1706.62 -0.0772798 1178.12 -0.185471 1310.24 -0.973725 1222.16 -1.51468 1200.14 -1.97836 1123.07 -3.97218 1057 -4.20402 880.836 -6.01236 627.596 -6.495 418.397 -7.017 99.0941 -7.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M845.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M845.rse deleted file mode 100644 index 4f7d943c74..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_M845.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N1000.eng deleted file mode 100644 index c8d200073b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N1000.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @TI: 14137.65, @TIa: 14071.08, @TIe: 0.0%, @ThMax: 2137.42, @ThAvg: 1048.203, @Tb: 13.424 -; Exported using ThrustCurveTool, www.ThrustGear.com -N1048 98 1046 P 7.925 12.777 AT/RCS -0.0 0.457288 -0.152 0.314574 -0.162 40.2069 -0.164 148.3954 -0.168 598.904 -0.172 890.058 -0.176 995.096 -0.178 1158.031 -0.182 1342.306 -0.19 1556.716 -0.222 1959.8 -0.234 2050.53 -0.254 2111.01 -0.308 2119.9 -0.356 2073.29 -0.47 2091.07 -0.528 1989.543 -0.582 1825.825 -0.648 1733.526 -0.782 1658.07 -0.892 1701.725 -0.914 1633.231 -0.966 1669.558 -1.7839 1594.076 -1.8239 1551.156 -3.1999 1533.43 -5.4538 1378.986 -6.9577 1170.933 -10.9216 424.692 -13.5895 106.0499 -14.6754 12.60914 -16.1354 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2000.eng deleted file mode 100644 index 1fa87c659c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2000.eng +++ /dev/null @@ -1,30 +0,0 @@ -; AeroTech N2000W -; converted from TMT test stand data 1997 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -N2000W 98 1046 0 7.66707 12.2828 AT - 0.146 2775.075 - 0.446 2831.810 - 0.746 2834.354 - 1.046 2829.564 - 1.346 2777.650 - 1.646 2688.252 - 1.950 2597.973 - 2.254 2501.043 - 2.554 2415.747 - 2.854 2343.624 - 3.154 2262.579 - 3.454 2178.182 - 3.758 2104.164 - 4.062 2024.475 - 4.362 1935.616 - 4.663 1839.781 - 4.962 1756.910 - 5.262 1351.806 - 5.567 954.556 - 5.871 681.831 - 6.171 475.910 - 6.471 361.124 - 6.771 194.633 - 7.071 44.938 - 7.375 6.030 - 7.679 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2000.rse deleted file mode 100644 index 4f44a984f2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2000.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -AeroTech N2000W -Copyright Tripoli Motor Testing 1997 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2220.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2220.eng deleted file mode 100644 index 0022892b46..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N2220.eng +++ /dev/null @@ -1,27 +0,0 @@ -N2220DM 98 1046 P 7.183 11.997 AT - 0.045 2638.366 - 0.067 2528.97 - 0.084 3063.078 - 0.124 2426.009 - 0.186 2548.275 - 0.231 2599.755 - 0.298 2554.71 - 0.371 2644.801 - 0.534 2638.366 - 0.979 2561.145 - 1.142 2606.19 - 2.002 2638.366 - 2.289 2638.366 - 2.761 2580.45 - 3.121 2496.795 - 3.436 2335.919 - 3.678 2213.653 - 3.79 2129.998 - 4.004 1653.805 - 4.415 888.035 - 4.538 630.634 - 4.656 450.453 - 4.82 289.577 - 5.005 135.136 - 5.219 25.74 - 5.371 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N3300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N3300.eng deleted file mode 100644 index 4cd1a28fb4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N3300.eng +++ /dev/null @@ -1,18 +0,0 @@ -N3300 98 1046 P 7.5120000000000005 12.054 AT - 0.0070 2069.581 - 0.025 2444.865 - 0.298 2654.583 - 0.852 3068.499 - 1.197 3576.236 - 1.502 3841.143 - 1.719 3929.445 - 2.007 4188.832 - 2.419 4172.276 - 2.753 3885.294 - 3.193 3278.217 - 3.552 2847.744 - 3.786 2665.621 - 3.871 2345.525 - 4.003 866.465 - 4.092 209.718 - 4.18 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N4800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N4800.eng deleted file mode 100644 index b9db5111e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N4800.eng +++ /dev/null @@ -1,29 +0,0 @@ -; AeroTech N4800T -; provided by ThrustCurve.org (www.thrustcurve.org) -N4800T 98 1194 0 9.7664 14.784 AT - 0.098 4752.717 - 0.301 6007.533 - 0.506 5594.225 - 0.710 5270.361 - 0.914 5150.120 - 1.119 5108.054 - 1.324 5086.206 - 1.528 5031.651 - 1.731 4941.811 - 1.936 4800.400 - 2.140 4664.876 - 2.344 4527.840 - 2.549 4401.003 - 2.754 4263.565 - 2.958 4120.406 - 3.161 3971.136 - 3.366 3876.421 - 3.570 3916.232 - 3.774 3913.510 - 3.979 3312.758 - 4.184 1649.267 - 4.388 523.361 - 4.591 327.209 - 4.796 251.041 - 5.001 128.177 - 5.206 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N4800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N4800.rse deleted file mode 100644 index 61720ffcb6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/AeroTech_N4800.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -AeroTech N4800T -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Alpha_I250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Alpha_I250.eng deleted file mode 100644 index 8bfcf69300..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Alpha_I250.eng +++ /dev/null @@ -1,32 +0,0 @@ -I250 54 711 Plugged 0.353 1.855 AHR - 0.0020 78.6983 - 0.0040 84.8776 - 0.0060 131.6333 - 0.01 285.674 - 0.012 299.107 - 0.016 253.237 - 0.022 294.494 - 0.042 282.702 - 0.056 314.198 - 0.116 344.98 - 0.136 317.464 - 0.196 344.409 - 0.21 325.064 - 0.298 341.998 - 0.312 321.201 - 0.316 341.701 - 0.33 322.577 - 0.334 345.496 - 0.348 318.96 - 0.362 339.894 - 0.366 318.868 - 0.4779 307.21 - 0.5719 330.294 - 0.5839 308.011 - 0.5879 326.297 - 0.7919 294.471 - 1.4618 268.703 - 1.5998 228.345 - 1.8078 92.6199 - 2.3397 16.84115 - 2.7697 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_2A2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_2A2.eng deleted file mode 100644 index 7471c9d0e9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_2A2.eng +++ /dev/null @@ -1,39 +0,0 @@ -; -;Apogee 1/2A2 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -1/2A2 11 57 2-4-6 0.0015 0.0044 Apogee -0.007 0.19 -0.045 1.494 -0.078 3.152 -0.088 3.805 -0.093 3.805 -0.1 3.97 -0.105 3.696 -0.11 3.071 -0.117 2.554 -0.123 2.582 -0.132 2.31 -0.163 2.146 -0.2 1.984 -0.242 1.902 -0.253 2.01 -0.275 1.929 -0.342 1.929 -0.403 1.929 -0.41 1.848 -0.42 1.902 -0.467 1.902 -0.528 1.929 -0.565 1.929 -0.58 1.902 -0.593 1.848 -0.603 1.657 -0.61 1.141 -0.615 0.597 -0.622 0.244 -0.63 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_2A2.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_2A2.rse deleted file mode 100644 index 10c0d425f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_2A2.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - - Apogee 1/2A2 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_4A2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_4A2.eng deleted file mode 100644 index 3c66820b9d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_4A2.eng +++ /dev/null @@ -1,30 +0,0 @@ -;Apogee 1/4A2 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -1/4A2 11 38 2-4 0.0008 0.0036 Apogee -0.007 0.162 -0.023 0.65 -0.041 1.463 -0.058 2.519 -0.074 3.738 -0.079 3.9 -0.088 4.915 -0.097 5.119 -0.106 5.4 -0.11 5.119 -0.118 3.981 -0.125 3.656 -0.132 3.453 -0.136 3.209 -0.151 3.169 -0.156 2.966 -0.168 2.884 -0.18 2.397 -0.194 1.625 -0.207 1.056 -0.218 0.406 -0.23 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_4A2.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_4A2.rse deleted file mode 100644 index 8801ae5890..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_1_4A2.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - Apogee 1/4A2 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_A2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_A2.eng deleted file mode 100644 index 00e958569a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_A2.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;Apogee A2 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -A2 11 58 0-3-5-7 0.003 0.0067 Apogee -0.014 0.241 -0.036 0.895 -0.064 2.618 -0.1 4.82 -0.111 4.133 -0.125 2.687 -0.139 2.307 -0.185 2.031 -0.296 1.928 -0.481 1.825 -0.517 1.722 -0.538 1.791 -0.649 1.688 -0.748 1.757 -0.869 1.825 -1.04 1.894 -1.101 1.894 -1.119 1.825 -1.144 1.928 -1.229 1.859 -1.265 1.894 -1.283 1.757 -1.29 1.412 -1.293 0.688 -1.3 0.275 -1.31 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_A2.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_A2.rse deleted file mode 100644 index ba62e83160..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_A2.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - -Apogee A2 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B2.eng deleted file mode 100644 index 50c2fd7f6a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B2.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;Apogee B2 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -B2 11 88 0-3-5-7-9 0.006 0.0106 Apogee -0.057 1.637 -0.093 4.091 -0.121 5.48 -0.143 4.787 -0.157 3.478 -0.207 2.578 -0.328 2.087 -0.371 2.087 -0.406 1.882 -0.641 1.841 -0.869 1.841 -1.283 1.882 -1.361 1.882 -1.397 1.718 -1.439 1.841 -1.532 1.718 -1.71 1.841 -1.888 1.882 -2.095 1.8 -2.23 1.8 -2.295 1.677 -2.423 1.759 -2.444 1.637 -2.466 0.982 -2.494 0.327 -2.53 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B2.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B2.rse deleted file mode 100644 index 637d33ab20..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B2.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - -Apogee B2 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B7.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B7.eng deleted file mode 100644 index 30c41d60be..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B7.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -;Apogee B7 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -B7 13 50 4-6-8-10 0.0028 0.0091 Apogee -0.007 5.708 -0.013 7.211 -0.032 6.111 -0.045 8.116 -0.056 7.717 -0.069 9.02 -0.078 12.122 -0.087 14.76 -0.106 13.832 -0.117 13.733 -0.125 12.636 -0.155 12.438 -0.168 11.836 -0.2 11.243 -0.209 11.737 -0.219 10.739 -0.266 9.846 -0.29 9.849 -0.299 8.949 -0.367 7.456 -0.393 7.159 -0.429 5.761 -0.487 4.567 -0.571 2.975 -0.607 2.178 -0.669 1.084 -0.708 0.489 -0.74 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B7.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B7.rse deleted file mode 100644 index bb1db93578..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_B7.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -Apogee B7 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C10.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C10.eng deleted file mode 100644 index 416c05123c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C10.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Apogee C10 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -C10 18 50 4-7-10 0.0049 0.0176 Apogee -0.01 2.712 -0.019 5.842 -0.029 17.116 -0.037 25.72 -0.051 22.535 -0.07 20.446 -0.106 18.983 -0.164 17.085 -0.188 17.085 -0.2 15.824 -0.216 16.036 -0.255 15.602 -0.293 14.35 -0.343 13.503 -0.394 12.655 -0.41 11.605 -0.434 11.605 -0.521 9.287 -0.631 6.34 -0.741 4.021 -0.851 2.119 -0.911 1.48 -0.945 1.264 -0.96 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C10.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C10.rse deleted file mode 100644 index ad11959bb0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C10.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -Apogee C10 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C4.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C4.eng deleted file mode 100644 index af54909060..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C4.eng +++ /dev/null @@ -1,37 +0,0 @@ -; -;Apogee C4 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -C4 18 50 3-5-7 0.0045 0.017 Apogee -0.018 3.23 -0.041 6.874 -0.147 8.779 -0.294 10.683 -0.365 11.31 -0.388 10.521 -0.412 8.779 -0.441 7.04 -0.465 4.555 -0.529 3.479 -0.629 2.981 -0.653 3.23 -0.718 2.816 -0.853 2.733 -1.065 2.65 -1.253 2.567 -1.453 2.401 -1.694 2.484 -1.794 2.484 -1.812 2.733 -1.841 2.401 -1.947 2.401 -2.112 2.401 -2.235 2.401 -2.282 2.236 -2.312 1.656 -2.329 0.662 -2.35 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C4.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C4.rse deleted file mode 100644 index bc955a5657..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C4.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -Apogee C4 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C6.eng deleted file mode 100644 index 62cfe2415f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C6.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Apogee C6 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -C6 13 83 4-7-10 0.007 0.0151 Apogee -0.008 13.958 -0.016 21.1 -0.022 15.511 -0.03 12.831 -0.052 14.8 -0.081 15.927 -0.092 14.658 -0.114 16.069 -0.125 14.658 -0.136 15.369 -0.168 14.8 -0.214 13.816 -0.225 12.973 -0.247 13.958 -0.252 12.831 -0.285 12.547 -0.307 12.405 -0.317 12.831 -0.328 11.562 -0.347 11.988 -0.393 11.42 -0.442 10.719 -0.464 11.136 -0.488 9.164 -0.545 8.459 -0.624 7.754 -0.716 6.485 -0.838 5.075 -0.977 3.102 -1.096 1.833 -1.207 0.986 -1.32 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C6.rse deleted file mode 100644 index 586d006a74..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_C6.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Apogee C6 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D10.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D10.eng deleted file mode 100644 index 80d4ff933a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D10.eng +++ /dev/null @@ -1,41 +0,0 @@ -; -;Apogee D10 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -D10 18 70 3-5-7 0.0098 0.0259 Apogee -0.011 14.506 -0.018 25.13 -0.032 20.938 -0.079 19.065 -0.122 21.139 -0.136 19.686 -0.169 21.139 -0.201 20.728 -0.223 21.76 -0.233 20.938 -0.255 21.97 -0.276 20.938 -0.352 20.728 -0.402 20.107 -0.42 20.728 -0.459 20.107 -0.488 20.517 -0.556 18.243 -0.671 15.959 -0.707 14.717 -0.729 15.127 -0.779 12.853 -0.793 13.474 -0.836 11.401 -0.904 10.158 -0.926 10.569 -0.99 8.083 -1.026 8.498 -1.123 6.011 -1.231 2.487 -1.342 0.829 -1.4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D10.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D10.rse deleted file mode 100644 index 707bac3d27..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D10.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Apogee D10 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D3.eng deleted file mode 100644 index 5c23b4076d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D3.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -;Apogee D3 RASP.ENG file made from NAR published data -;File produced September 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -D3 18 77 3-5-7 0.0098 0.0249 Apogee -0.05 6.79 -0.168 8.788 -0.318 10.46 -0.385 10.07 -0.402 7.909 -0.469 5.432 -0.486 3.914 -0.687 3.115 -1.122 2.876 -2.06 2.636 -3.349 2.397 -4.639 2.156 -5.727 1.997 -6.163 1.837 -6.263 3.994 -6.347 2.317 -6.364 0.719 -6.39 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D3.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D3.rse deleted file mode 100644 index 2cf6c6e79e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_D3.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - -Apogee D3 RASP.ENG file made from NAR published data -File produced September 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_E6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_E6.eng deleted file mode 100644 index 75d54c701b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_E6.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -;Aerotech E6 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -E6 24 70 2-4-6-8-100 0.0215 0.0463 Apogee -0.056 18.59 -0.112 20.12 -0.168 17.575 -0.307 14.38 -0.531 10.45 -0.894 7.696 -1.146 6.244 -1.691 5.808 -2.836 5.663 -3.898 5.517 -4.275 5.227 -4.415 4.937 -5.058 5.082 -5.519 5.227 -5.603 6.679 -5.729 3.921 -5.882 2.323 -5.966 1.016 -6.06 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_E6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_E6.rse deleted file mode 100644 index c77683ec6b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_E6.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - -Aerotech E6 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_F10.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_F10.eng deleted file mode 100644 index 66c2154b38..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_F10.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;Aerotech F10 RASP.ENG file made from NAR published data -;File produced July 4, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -F10 29 93 4-6-8 0.0407 0.0841 Apogee -0.015 28.22 -0.077 26.082 -0.201 24.934 -0.31 22.806 -0.464 20.183 -0.573 17.886 -0.789 16.075 -1.068 13.946 -1.393 12.63 -1.718 11.155 -2.166 9.844 -2.677 9.515 -3.311 9.187 -3.683 8.859 -3.791 9.679 -4.101 9.679 -4.658 9.515 -5.168 9.023 -5.725 9.023 -6.112 8.531 -6.329 8.859 -6.499 7.546 -6.685 5.742 -6.778 4.921 -6.917 2.625 -7.025 1.312 -7.13 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_F10.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_F10.rse deleted file mode 100644 index 795e887da9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Apogee_F10.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -Aerotech F10 RASP.ENG file made from NAR published data -File produced July 4, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesarioni_G69.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesarioni_G69.rse deleted file mode 100644 index b662478959..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesarioni_G69.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - CTI Pro38-1G 117 G69SK - 14A - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E22.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E22.eng deleted file mode 100644 index 032433b0c4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E22.eng +++ /dev/null @@ -1,18 +0,0 @@ -;Smoky Sam 24mm 1G -;24-E22-SS-13A -24-E22-SS-13A 24 69 13-10-8-6-4 0.0203 0.0565 CTI -0.008 18.292 -0.026 30 -0.038 30.792 -0.067 18.708 -0.101 21.875 -0.33 26.083 -0.528 28.042 -0.716 27.875 -0.841 23.542 -0.912 17.833 -0.987 7 -1.016 3.333 -1.065 1.083 -1.087 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E22.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E22.rse deleted file mode 100644 index 896ad0b7df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E22.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Smoky Sam 24mm 1G -24-E22-SS-13A - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E31.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E31.eng deleted file mode 100644 index dad7408018..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E31.eng +++ /dev/null @@ -1,16 +0,0 @@ -;White 24mm 1G -;26-E31-WH-15A -26-E31-WH-15A 24 69 15-12-10-8-6 0.0169 0.052 CTI -0.02 43.824 -0.027 39.964 -0.049 26.781 -0.113 32.601 -0.193 34.739 -0.282 35.808 -0.5 34.442 -0.727 29.276 -0.771 22.743 -0.807 9.561 -0.84 3.563 -0.87 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E31.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E31.rse deleted file mode 100644 index 4cb1d8b421..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E31.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - White 24mm 1G -26-E31-WH-15A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E75.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E75.eng deleted file mode 100644 index 19902eb52e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E75.eng +++ /dev/null @@ -1,20 +0,0 @@ -; Pro24-1G Vmax 25-E75 -25-E75-VM-17A 24 69 17-14-12-10-8 0.016 0.052000000000000005 CTI - 0.0090 84.213 - 0.012 95.099 - 0.023 77.08 - 0.027 68.697 - 0.047 73.452 - 0.092 81.835 - 0.118 83.837 - 0.141 86.465 - 0.192 86.966 - 0.222 85.339 - 0.25 80.083 - 0.26 78.332 - 0.281 82.961 - 0.287 78.206 - 0.306 24.776 - 0.314 14.14 - 0.326 8.509 - 0.329 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E75.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E75.rse deleted file mode 100644 index 79fbe67b1d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_E75.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - Pro24-1G Vmax 25-E75 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F120.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F120.eng deleted file mode 100644 index 83b6f0d150..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F120.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Pro29-1G 56F120-VM 14A -F120-VM 29 98 14-11-9-7-5 0.0314 0.1062 CTI - 0.013 79.242 - 0.017 90.427 - 0.04 101.422 - 0.125 127.583 - 0.179 136.114 - 0.222 139.905 - 0.289 143.507 - 0.354 138.578 - 0.394 125.498 - 0.406 123.602 - 0.416 125.118 - 0.423 130.047 - 0.431 120.569 - 0.447 25.592 - 0.453 8.72 - 0.455 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F120.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F120.rse deleted file mode 100644 index f253f12a72..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F120.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro29-1G 56F120-VM 14A - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F240.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F240.eng deleted file mode 100644 index 21b818e95f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F240.eng +++ /dev/null @@ -1,27 +0,0 @@ -; Pro-24-3G VMax -68-F240-VM-15A 24 133 3-5-6-8-9-10 0.0303 0.0918 CTI - 0.0040 100.528 - 0.0070 197.493 - 0.01 222.032 - 0.022 241.425 - 0.028 237.863 - 0.041 239.446 - 0.058 252.507 - 0.077 263.984 - 0.089 275.462 - 0.097 271.504 - 0.104 273.879 - 0.119 278.628 - 0.147 281.398 - 0.177 272.296 - 0.207 258.443 - 0.246 226.385 - 0.253 218.47 - 0.259 188.786 - 0.266 127.045 - 0.272 74.802 - 0.28 31.266 - 0.286 15.831 - 0.294 8.707 - 0.31 3.562 - 0.328 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F240.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F240.rse deleted file mode 100644 index aa6cce26e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F240.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - Pro-24-3G VMax - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F29.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F29.eng deleted file mode 100644 index d1d0f35f9a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F29.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro29-1G 55F29-IM 12A -F29-IM 29 98 12-9-7-5-3 0.0376 0.1058 CTI - 0.0060 5.661 - 0.038 23.312 - 0.05 26.309 - 0.229 30.257 - 0.327 32.208 - 0.485 33.159 - 1.031 31.78 - 1.516 27.07 - 1.688 24.834 - 1.765 20.172 - 1.852 9.467 - 1.963 2.093 - 2.0 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F29.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F29.rse deleted file mode 100644 index 66cb44003a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F29.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro29-1G 55F29-IM 12A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F30.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F30.eng deleted file mode 100644 index d35847c1d2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F30.eng +++ /dev/null @@ -1,21 +0,0 @@ -; Pro-24-3G White Long Burn -73-F30-WH_LB-6A 24 133 2-3-5-6 0.04 0.1022 CTI - 0.014 54.222 - 0.056 43.456 - 0.092 50.185 - 0.16 54.063 - 0.232 48.364 - 0.363 45.752 - 0.499 43.14 - 0.655 40.29 - 0.843 37.836 - 1.216 32.612 - 1.368 30.317 - 1.54 26.359 - 1.675 23.509 - 1.861 19.077 - 2.013 14.565 - 2.159 10.053 - 2.302 4.828 - 2.462 1.504 - 2.598 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F30.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F30.rse deleted file mode 100644 index 571bd5c291..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F30.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - Pro-24-3G White Long Burn - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F31.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F31.rse deleted file mode 100644 index 70d60e7d19..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F31.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 56-F31-CL-12A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F32.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F32.rse deleted file mode 100644 index 0211713caf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F32.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - CTI 53-F32-WH-12A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36.eng deleted file mode 100644 index 557d583cfa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36.eng +++ /dev/null @@ -1,21 +0,0 @@ -F36-SS 29 98 2-4-6-8-11 0.035 0.104 CTI -0.01 12 -0.02 46 -0.03 75 -0.04 79 -0.06 77 -0.07 62 -0.08 32 -0.1 35 -0.2 38 -0.3 39 -0.4 41 -0.5 43 -0.6 43 -0.7 43 -0.8 43 -0.85 47 -0.92 54 -0.95 32 -0.99 8 -1.05 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36.rse deleted file mode 100644 index ad84b396bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36_1.eng deleted file mode 100644 index c1c2287177..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36_1.eng +++ /dev/null @@ -1,25 +0,0 @@ -F36-BS 29 98 5-7-9-11-14 0.032 0.101 CTI -0.01 12 -0.02 25 -0.03 41 -0.04 42 -0.05 42 -0.06 40 -0.07 34 -0.08 34 -0.09 35 -0.1 36 -0.2 40 -0.3 42 -0.4 43 -0.5 43 -0.6 43 -0.7 43 -0.8 42 -0.9 41 -1 40 -1.1 38 -1.24 37 -1.3 12 -1.4 2 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36_1.rse deleted file mode 100644 index 618c5b3b5e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F36_1.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F50.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F50.eng deleted file mode 100644 index b4821faf55..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F50.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Skidmark 24mm 3G -; 60-F50-SK-13A -60-F50-SK-13A 24 133 13-10-8-6-4 0.0382 0.0939 CTI - 0.015 64.982 - 0.022 69.516 - 0.064 55.537 - 0.118 62.81 - 0.342 62.149 - 0.536 59.41 - 0.743 53.837 - 0.884 46.942 - 0.976 40.047 - 1.096 12.562 - 1.246 2.078 - 1.298 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F50.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F50.rse deleted file mode 100644 index 0123dcac37..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F50.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Skidmark 24mm 3G -60-F50-SK-13A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51.eng deleted file mode 100644 index 850b6cc887..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51.eng +++ /dev/null @@ -1,12 +0,0 @@ -; Classic 24mm 3G -; 75-F51-CL-12A -75-F51-CL-12A 24 133 12-9-7-5 0.040 0.095 CTI - 0.02 75.924 - 0.031 84.148 - 0.062 70.441 - 0.117 73.659 - 1.211 38.737 - 1.376 14.779 - 1.456 7.271 - 1.532 3.337 - 1.577 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51.rse deleted file mode 100644 index f9bcffd401..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - CTI 50-F51-BS-13A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51_1.rse deleted file mode 100644 index 737d1a9e68..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F51_1.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - Classic 24mm 3G -75-F51-CL-12A - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F59.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F59.eng deleted file mode 100644 index 45a5457564..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F59.eng +++ /dev/null @@ -1,16 +0,0 @@ -F59-WT 29 98 3-5-7-9-12 0.031 0.099 CTI -0.01 16 -0.02 62 -0.03 67 -0.04 71 -0.07 58 -0.1 63 -0.2 67 -0.3 69 -0.4 67 -0.5 65 -0.6 63 -0.7 61 -0.87 60 -0.9 23 -0.97 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F59.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F59.rse deleted file mode 100644 index 0d98a16c12..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F59.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F70.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F70.rse deleted file mode 100644 index 98a6918a57..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F70.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 53-F70-WT-14A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F79.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F79.eng deleted file mode 100644 index 6e528da1a1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F79.eng +++ /dev/null @@ -1,25 +0,0 @@ -; Pro-24-3G Smoky Sam -68-F79-SS-13A 24 133 4-6-7-9-11 0.0401 0.1075 CTI - 0.0050 60.0 - 0.013 89.007 - 0.022 96.291 - 0.043 81.722 - 0.119 85.563 - 0.198 87.947 - 0.267 89.272 - 0.343 89.934 - 0.404 90.861 - 0.498 91.523 - 0.555 89.669 - 0.622 83.974 - 0.663 80.53 - 0.704 78.94 - 0.729 74.172 - 0.747 66.887 - 0.768 53.775 - 0.793 36.556 - 0.821 18.543 - 0.852 7.815 - 0.892 2.119 - 0.928 0.795 - 0.997 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F79.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F79.rse deleted file mode 100644 index 26f2dbf4ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F79.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - Pro-24-3G Smoky Sam - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F85.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F85.eng deleted file mode 100644 index ca1fd720df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F85.eng +++ /dev/null @@ -1,12 +0,0 @@ -; Pro24-3G White Thunder 74-F85 -74-F85-WT-15A 24 133 15-12-10-8-6 0.042 0.096 CTI - 0.01 76.074 - 0.023 100.185 - 0.04 92.425 - 0.118 100.878 - 0.283 102.402 - 0.51 96.443 - 0.688 87.436 - 0.787 25.912 - 0.852 7.206 - 0.873 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F85.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F85.rse deleted file mode 100644 index 54f88f5d34..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_F85.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - Pro24-3G White Thunder 74-F85 - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G100.eng deleted file mode 100644 index 9185e65a03..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G100.eng +++ /dev/null @@ -1,12 +0,0 @@ -; Pro24-6G Skidmark 114-G100 -114-G100-SK-14A 24 228 14-11-9-7-5 0.073 0.159 CTI - 0.0090 148.468 - 0.024 178.207 - 0.061 145.289 - 0.475 117.367 - 0.63 106.243 - 0.833 85.131 - 0.961 51.759 - 1.024 29.966 - 1.125 13.848 - 1.186 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G100.rse deleted file mode 100644 index 4f1168106a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G100.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - Pro24-6G Skidmark 114-G100 - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G106.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G106.eng deleted file mode 100644 index 094dd35147..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G106.eng +++ /dev/null @@ -1,19 +0,0 @@ -G106-SK 29 187 5-7-9-11-14 0.081 0.187 CTI -0.018 20 -0.023 80 -0.03 131 -0.05 105 -0.065 75 -0.1 94 -0.25 104 -0.4 111 -0.65 120 -0.86 123 -1.05 124 -1.13 121 -1.17 110 -1.2 85 -1.23 40 -1.25 20 -1.3 5 -1.36 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G106.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G106.rse deleted file mode 100644 index 1f68a20c5d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G106.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G107.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G107.eng deleted file mode 100644 index cef0f5617c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G107.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Pro-24-6G White/Dual Thrust -139-G107-WH_DT-12A 24 228 3-5-6-8-9-10 0.0757 0.1698 CTI - 0.0060 133.228 - 0.011 198.418 - 0.022 221.835 - 0.046 212.658 - 0.081 218.354 - 0.125 214.873 - 0.168 210.443 - 0.219 204.43 - 0.253 195.886 - 0.274 183.544 - 0.305 88.291 - 0.412 93.671 - 0.529 93.987 - 0.663 94.304 - 0.789 93.987 - 0.899 91.139 - 0.953 89.873 - 0.999 87.025 - 1.03 81.329 - 1.057 69.937 - 1.102 54.114 - 1.154 42.405 - 1.197 31.646 - 1.277 17.089 - 1.335 9.81 - 1.398 3.165 - 1.451 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G107.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G107.rse deleted file mode 100644 index b955d838d4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G107.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - Pro-24-6G White/Dual Thrust - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G115.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G115.rse deleted file mode 100644 index a77408f871..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G115.rse +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G117.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G117.eng deleted file mode 100644 index bd5a1a52d1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G117.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Pro-24-6G White -142-G117-WH-11A 24 228 4-6-8-9-10 0.0791 0.1725 CTI - 0.0080 168.643 - 0.013 177.339 - 0.022 177.866 - 0.035 171.278 - 0.063 157.839 - 0.103 154.941 - 0.151 151.515 - 0.196 148.88 - 0.246 147.563 - 0.311 144.137 - 0.391 140.711 - 0.474 138.076 - 0.564 135.705 - 0.662 131.225 - 0.762 125.955 - 0.858 116.733 - 0.928 101.713 - 0.973 83.004 - 1.038 57.444 - 1.08 42.688 - 1.131 31.884 - 1.185 17.655 - 1.224 9.486 - 1.258 5.27 - 1.322 2.372 - 1.4 0.791 - 1.441 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G117.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G117.rse deleted file mode 100644 index 8a12dc5873..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G117.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - Pro-24-6G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G118.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G118.eng deleted file mode 100644 index 809f0904a9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G118.eng +++ /dev/null @@ -1,17 +0,0 @@ -G118-BS 29 187 6-8-10-12-15 0.083 0.188 CTI -0.005 1.3 -0.012 80 -0.02 156 -0.04 148 -0.05 105 -0.11 121 -0.3 131 -0.5 134 -0.7 130 -0.95 126 -1.13 126 -1.18 115 -1.27 40 -1.31 20 -1.35 6 -1.37 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G118.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G118.rse deleted file mode 100644 index b833fc46f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G118.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G125.eng deleted file mode 100644 index 51545f7a71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G125.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pro29 3G 159G125-RL 14A -G125-RL 29 187 14-11-9-7-5 0.0896 0.1945 CTI - 0.0040 15.683 - 0.022 170.834 - 0.039 116.877 - 0.122 142.642 - 0.236 149.737 - 0.589 142.642 - 0.801 131.253 - 1.068 122.104 - 1.118 107.915 - 1.145 78.416 - 1.174 43.129 - 1.211 21.471 - 1.247 8.775 - 1.299 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G125.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G125.rse deleted file mode 100644 index b1424fdb58..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G125.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G126.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G126.eng deleted file mode 100644 index 21962a279d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G126.eng +++ /dev/null @@ -1,16 +0,0 @@ -G126-WT 29 142 4-6-8-10-13 0.059 0.145 CTI -0.01 55 -0.02 168 -0.03 157 -0.04 148 -0.05 125 -0.1 135 -0.2 141 -0.3 142 -0.4 141 -0.6 133 -0.75 127 -0.81 128 -0.86 60 -0.9 15 -0.95 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G126.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G126.rse deleted file mode 100644 index 6874c061f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G126.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G127.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G127.eng deleted file mode 100644 index df2ad5e1d8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G127.eng +++ /dev/null @@ -1,14 +0,0 @@ -; Pro24-6G RL 137-G127 -137-G127-RL-14A 24 228 14-11-9-7-5 0.081 0.166 CTI - 0.018 164.454 - 0.029 175.478 - 0.042 172.103 - 0.14 179.753 - 0.378 158.83 - 0.578 138.583 - 0.763 121.485 - 0.838 97.638 - 0.9 62.317 - 0.966 32.621 - 1.056 13.048 - 1.081 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G127.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G127.rse deleted file mode 100644 index a41d8a49c5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G127.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - Pro24-6G RL 137-G127 - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G131.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G131.eng deleted file mode 100644 index c5b5670fff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G131.eng +++ /dev/null @@ -1,25 +0,0 @@ -G131-SS 29 187 5-7-9-11-14 0.094 0.2 CTI -0.01 6 -0.02 40 -0.03 116 -0.04 131 -0.05 146 -0.06 147 -0.07 140 -0.08 136 -0.09 130 -0.1 126 -0.2 129 -0.3 132 -0.4 137 -0.5 139 -0.6 141 -0.7 142 -0.8 145 -0.85 150 -0.87 155 -0.9 116 -0.93 60 -0.95 30 -1 3 -1.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G131.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G131.rse deleted file mode 100644 index 125cf79bbf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G131.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G145.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G145.eng deleted file mode 100644 index 8154cbdb61..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G145.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; Pro24-6G 140G145-PK Pink -;based on RockSim file by Mark Koelsch -G145-PK 24 228 0 0.0772 0.1619 CTI -0.007 286.726 -0.013 346.018 -0.022 310.619 -0.039 226.991 -0.066 206.097 -0.343 174.779 -0.672 138.496 -0.775 75.664 -0.899 29.204 -0.982 13.274 -1.015 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G145.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G145.rse deleted file mode 100644 index 88a1ac6982..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G145.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pink Pro24 6G -140-G145-PK 15A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G150.eng deleted file mode 100644 index efac681b4e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G150.eng +++ /dev/null @@ -1,31 +0,0 @@ -; Pro-24-6G Blue Streak -143-G150-BS-13A 24 228 4-6-8-9-11-12 0.0659 0.1599 CTI - 0.0050 114.776 - 0.0060 177.441 - 0.01 222.625 - 0.016 243.404 - 0.019 247.032 - 0.037 215.369 - 0.077 206.135 - 0.12 204.485 - 0.163 200.198 - 0.204 195.91 - 0.249 192.942 - 0.316 186.675 - 0.387 180.409 - 0.444 176.121 - 0.536 168.206 - 0.616 160.62 - 0.639 156.662 - 0.676 142.48 - 0.715 114.776 - 0.75 93.008 - 0.784 72.23 - 0.831 49.802 - 0.889 31.662 - 0.923 21.768 - 0.953 14.842 - 0.996 8.245 - 1.03 5.937 - 1.061 2.309 - 1.099 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G150.rse deleted file mode 100644 index 72ee5460c9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G150.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Pro-24-6G Blue Streak - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G185.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G185.rse deleted file mode 100644 index 23e7ab8531..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G185.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G250.eng deleted file mode 100644 index fa5c38635c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G250.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro29-2G 110G250-VM 14A -G250-VM 29 142 14-11-9-7-5 0.0575 0.1413 CTI - 0.0060 151.621 - 0.011 198.079 - 0.016 203.121 - 0.031 201.681 - 0.075 226.17 - 0.122 250.3 - 0.216 280.192 - 0.25 287.035 - 0.287 284.874 - 0.354 269.748 - 0.374 258.583 - 0.4 233.373 - 0.413 234.094 - 0.42 227.611 - 0.433 137.935 - 0.445 33.854 - 0.454 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G250.rse deleted file mode 100644 index ec788ae8cd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G250.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro29-2G 110G250-VM 14A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G33.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G33.rse deleted file mode 100644 index 9aed79bc63..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G33.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 143-G33-MY-9A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G46.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G46.rse deleted file mode 100644 index b1fcb7f651..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G46.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G50.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G50.eng deleted file mode 100644 index 16c214e207..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G50.eng +++ /dev/null @@ -1,16 +0,0 @@ -G50-IM 38 127 6-8-11-12-15 0.0777 0.218 CTI -0.02 10 -0.04 58 -0.052 72 -0.07 65 -0.106 43 -0.23 51 -0.4 55 -0.85 57 -1.5 55 -2 51 -2.5 44.5 -2.78 44 -2.86 37 -2.93 20 -3.02 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G50.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G50.rse deleted file mode 100644 index b727aa455c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G50.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G54.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G54.eng deleted file mode 100644 index c280559970..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G54.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro29-3G 159G54-RL 12A -G54-RL 29 187 12-9-7-5-3 0.0968 0.1982 CTI - 0.018 107.269 - 0.031 113.588 - 0.059 103.508 - 0.135 121.712 - 0.22 104.561 - 0.299 95.534 - 0.432 88.312 - 0.959 69.657 - 1.757 43.479 - 2.418 20.762 - 2.851 9.478 - 3.013 5.567 - 3.026 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G54.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G54.rse deleted file mode 100644 index 9619b55e38..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G54.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro29-3G 159G54-RL 12A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G57.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G57.eng deleted file mode 100644 index 272b275846..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G57.eng +++ /dev/null @@ -1,17 +0,0 @@ -G57-CL 29 142 3-5-7-9-12 0.059 0.146 CTI -0.01 8 -0.02 70 -0.04 88 -0.05 80 -0.06 71 -0.08 76 -0.11 79 -0.2 81 -0.6 72 -1 56 -1.5 47 -1.6 48 -1.7 28 -1.8 14 -1.9 3 -1.93 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G57.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G57.rse deleted file mode 100644 index 5024cb7753..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G57.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G58.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G58.eng deleted file mode 100644 index 5767cc592f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G58.eng +++ /dev/null @@ -1,26 +0,0 @@ -; Pro-38-1G White -137-G58-WH-13A 38 127 5-7-8-10-12-13 0.0763 0.2125 CTI - 0.029 90.25 - 0.046 69.17 - 0.058 59.947 - 0.084 47.167 - 0.171 57.971 - 0.28 59.552 - 0.455 61.265 - 0.586 61.66 - 0.741 62.319 - 0.952 63.768 - 1.217 64.69 - 1.43 63.768 - 1.626 61.265 - 1.807 58.103 - 1.959 53.887 - 2.104 48.353 - 2.168 47.563 - 2.21 44.005 - 2.247 37.286 - 2.329 22.266 - 2.375 10.277 - 2.414 2.767 - 2.442 1.186 - 2.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G58.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G58.rse deleted file mode 100644 index 33d5d2905f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G58.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - Pro-38-1G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G60.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G60.eng deleted file mode 100644 index c39fdf9264..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G60.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Cesaroni G60 -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -G60 38 125 0 0.077056 0.2016 CSR - 0.043 65.216 - 0.130 74.906 - 0.218 84.596 - 0.305 83.963 - 0.393 81.982 - 0.480 81.956 - 0.568 81.138 - 0.655 80.530 - 0.743 79.923 - 0.830 78.867 - 0.918 76.675 - 1.005 75.118 - 1.094 73.732 - 1.182 71.315 - 1.270 68.781 - 1.357 66.853 - 1.445 65.111 - 1.532 63.526 - 1.620 61.229 - 1.707 59.249 - 1.795 57.110 - 1.882 51.671 - 1.970 18.562 - 2.057 2.667 - 2.146 1.470 - 2.234 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G60.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G60.rse deleted file mode 100644 index 8a584ec441..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G60.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G65.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G65.eng deleted file mode 100644 index 1997fc2f29..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G65.eng +++ /dev/null @@ -1,24 +0,0 @@ -; Pro-24-6G White Long Burn -144-G65-WH_LB-8A 24 228 3-5-6-7 0.08 0.1740 CTI - 0.011 157.857 - 0.024 149.524 - 0.042 132.143 - 0.057 125.476 - 0.094 134.048 - 0.122 131.19 - 0.175 106.429 - 0.269 94.048 - 0.376 87.381 - 0.54 82.143 - 0.707 78.333 - 0.845 74.762 - 1.002 71.19 - 1.206 65.476 - 1.376 57.857 - 1.553 48.333 - 1.726 39.048 - 1.914 28.333 - 2.061 18.095 - 2.205 8.571 - 2.299 3.095 - 2.398 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G65.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G65.rse deleted file mode 100644 index 719aa2f7bf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G65.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - Pro-24-6G White Long Burn - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G68.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G68.eng deleted file mode 100644 index cde6a4f36b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G68.eng +++ /dev/null @@ -1,32 +0,0 @@ -; Pro-29-2G White -108-G68-WH-13A 29 142 5-6-7-9-10-11 0.0599 0.1559 CTI - 0.012 50.329 - 0.017 79.315 - 0.019 86.693 - 0.03 91.831 - 0.047 73.386 - 0.048 81.686 - 0.049 65.876 - 0.061 58.235 - 0.088 66.798 - 0.12 70.883 - 0.2 72.991 - 0.307 75.099 - 0.38 75.626 - 0.487 76.416 - 0.614 76.548 - 0.726 75.626 - 0.818 73.518 - 0.987 70.487 - 1.096 68.116 - 1.269 63.505 - 1.388 61.528 - 1.446 57.444 - 1.483 49.144 - 1.537 29.381 - 1.569 18.05 - 1.613 5.665 - 1.638 2.899 - 1.676 1.449 - 1.723 0.395 - 1.759 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G68.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G68.rse deleted file mode 100644 index 196508a898..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G68.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - Pro-29-2G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69.eng deleted file mode 100644 index 9e4af928a1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69.eng +++ /dev/null @@ -1,21 +0,0 @@ -; CTI Pro38-1G 117 G69SK - 14A -G69SK 38 126 14-11-9-7-5 0.067 0.198 CTI - 0.015 49.371 - 0.023 79.41 - 0.035 91.872 - 0.064 82.605 - 0.099 52.407 - 0.166 57.041 - 0.228 59.278 - 0.375 64.231 - 1.297 69.024 - 1.453 68.864 - 1.533 67.746 - 1.589 65.189 - 1.686 58.639 - 1.735 42.821 - 1.781 26.363 - 1.816 13.901 - 1.89 5.432 - 1.954 1.278 - 1.969 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69.rse deleted file mode 100644 index 18693ec177..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - -Replaced by G46-Classic - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69SK.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69SK.rse deleted file mode 100644 index b662478959..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69SK.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - CTI Pro38-1G 117 G69SK - 14A - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_1.eng deleted file mode 100644 index c5d5addc63..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_1.eng +++ /dev/null @@ -1,25 +0,0 @@ -; Pro38 G69 -G69 38 127 5-7-9-12 0.066500 0.2045 Pro38 - 0.079 79.935 - 0.103 72.367 - 0.136 82.989 - 0.217 85.910 - 0.247 82.193 - 0.311 84.317 - 0.352 80.201 - 0.387 82.856 - 0.840 72.499 - 0.944 72.234 - 0.978 69.047 - 1.017 71.835 - 1.082 67.852 - 1.227 66.657 - 1.237 65.329 - 1.493 62.010 - 1.530 59.354 - 1.591 60.151 - 1.714 56.167 - 1.769 54.574 - 1.848 46.607 - 1.887 27.884 - 1.958 00.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_1.rse deleted file mode 100644 index 18693ec177..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_1.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - -Replaced by G46-Classic - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_2.eng deleted file mode 100644 index 06b0f47fd8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G69_2.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -133G69 38.0 127.00 3-5-7-9-12 0.08400 0.20510 CTI - 0.06 80.77 - 0.20 84.50 - 0.41 82.74 - 0.59 80.11 - 0.81 76.82 - 1.00 72.87 - 1.20 68.92 - 1.40 64.31 - 1.61 59.48 - 1.82 50.92 - 1.90 21.40 - 1.93 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G78.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G78.eng deleted file mode 100644 index 9daeedce14..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G78.eng +++ /dev/null @@ -1,20 +0,0 @@ -;CTI Pro38-1G 141 G78BS - 15A -G78BS 38 126 15-12-10-8-6 0.069 0.197 Cesaroni_Technology_Inc. -0.006 104.068 -0.018 137.928 -0.036 70.707 -0.047 62.242 -0.084 73.694 -0.135 78.176 -0.238 84.151 -0.438 89.628 -0.63 88.135 -0.859 87.139 -1.283 77.18 -1.447 70.707 -1.643 67.719 -1.713 64.234 -1.743 54.275 -1.79 18.424 -1.818 6.473 -1.852 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79.eng deleted file mode 100644 index dbbb08d55a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79.eng +++ /dev/null @@ -1,30 +0,0 @@ -; -; Pro38 G79SS -G79SS 38 127 6-8-10-13 0.069000 0.2070 Pro38 -0.042 67.279 -0.050 72.145 -0.065 76.176 -0.072 76.176 -0.082 74.647 -0.094 68.252 -0.109 66.167 -0.122 65.611 -0.433 81.041 -0.633 88.130 -0.643 87.574 -0.684 89.659 -0.723 89.798 -0.834 92.162 -0.939 93.135 -1.000 93.969 -1.151 91.884 -1.160 90.772 -1.185 91.189 -1.303 86.879 -1.499 77.149 -1.518 75.064 -1.540 66.584 -1.587 23.631 -1.607 10.982 -1.629 4.865 -1.631 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79.rse deleted file mode 100644 index e608f8f9f1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79_1.eng deleted file mode 100644 index 21566ab79d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G79_1.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -; -G79SS 38.0 127.00 13-10-8-6-4 0.08500 0.22600 CTI - 0.00 9.07 - 0.03 54.45 - 0.07 76.33 - 0.09 70.95 - 0.11 65.92 - 0.17 68.59 - 0.20 70.64 - 0.30 74.89 - 0.40 80.39 - 0.50 83.76 - 0.60 86.45 - 0.70 88.65 - 0.81 91.40 - 0.90 93.06 - 1.00 93.99 - 1.10 95.81 - 1.20 90.70 - 1.30 86.92 - 1.40 81.98 - 1.50 76.54 - 1.55 58.92 - 1.60 16.41 - 1.63 5.16 - 1.63 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G80.eng deleted file mode 100644 index 223bae4a0c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G80.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro29-3G 93G80-SK 14A -G80-SK 29 142 14-11-9-7-5 0.0564 0.1432 CTI - 0.0070 51.315 - 0.025 108.143 - 0.047 65.31 - 0.122 78.032 - 0.307 89.059 - 0.446 93.865 - 0.581 95.137 - 0.75 91.886 - 0.924 84.252 - 0.972 83.404 - 1.038 88.352 - 1.064 67.147 - 1.08 40.43 - 1.093 21.629 - 1.11 9.754 - 1.131 2.545 - 1.178 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G80.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G80.rse deleted file mode 100644 index 0aa246beb0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G80.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro29-3G 93G80-SK 14A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G83.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G83.eng deleted file mode 100644 index cc815bea97..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G83.eng +++ /dev/null @@ -1,17 +0,0 @@ -G83-BS 29 142 5-7-9-11-14 0.058 0.145 CTI -0.01 13 -0.02 82 -0.03 98 -0.04 100 -0.05 90 -0.06 86 -0.12 93 -0.2 96 -0.3 96 -0.7 92 -0.9 88 -1.07 83 -1.1 80 -1.2 30 -1.3 4 -1.33 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G83.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G83.rse deleted file mode 100644 index fbb6ec1ae7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G83.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G84.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G84.eng deleted file mode 100644 index 29bc86ec0c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G84.eng +++ /dev/null @@ -1,31 +0,0 @@ -; Pro-24-6G Green3 -131-G84-GR-10A 24 228 4-5-7-8-9 0.0773 0.1720 CTI - 0.0050 80.264 - 0.017 94.69 - 0.023 108.745 - 0.031 124.835 - 0.044 129.828 - 0.081 124.28 - 0.149 116.513 - 0.224 111.149 - 0.301 107.635 - 0.386 103.382 - 0.506 98.203 - 0.623 94.135 - 0.759 89.696 - 0.849 85.997 - 0.974 81.374 - 1.09 77.86 - 1.149 74.716 - 1.171 78.97 - 1.202 70.832 - 1.244 69.168 - 1.3 68.243 - 1.326 56.777 - 1.373 52.523 - 1.403 40.687 - 1.447 29.036 - 1.515 14.425 - 1.562 6.103 - 1.597 2.034 - 1.641 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G84.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G84.rse deleted file mode 100644 index be2bb34b1b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G84.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Pro-24-6G Green3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G88.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G88.eng deleted file mode 100644 index 3e12b047f7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G88.eng +++ /dev/null @@ -1,19 +0,0 @@ -G88-SS 29 142 2-4-6-8-11 0.064 0.152 CTI -0.03 7 -0.04 60 -0.05 90 -0.06 113 -0.07 116 -0.08 113 -0.1 86 -0.12 81 -0.15 86 -0.3 92 -0.4 95 -0.5 97 -0.75 100 -0.82 108 -0.84 106 -0.9 56 -0.93 25 -1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G88.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G88.rse deleted file mode 100644 index abc8353caa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_G88.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H100.eng deleted file mode 100644 index 711f96d464..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H100.eng +++ /dev/null @@ -1,12 +0,0 @@ -H100-IM 38 186 6-8-11-12-15 0.1544 0.327 CTI -0.016 68 -0.056 116 -0.09 118 -0.14 115 -0.5 116 -0.6 114 -1.25 113 -2.32 99 -2.44 100 -2.55 89 -2.77 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H100.rse deleted file mode 100644 index 55ddd83d02..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H100.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H110.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H110.eng deleted file mode 100644 index e240969917..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H110.eng +++ /dev/null @@ -1,27 +0,0 @@ -; Pro-38-2G White -269-H110-WH-14A 38 186 5-7-9-11-13-14 0.1526 0.3253 CTI - 0.029 93.733 - 0.052 118.066 - 0.093 98.531 - 0.153 109.327 - 0.238 113.439 - 0.461 118.923 - 0.592 120.979 - 0.72 122.693 - 0.896 124.406 - 1.15 124.92 - 1.246 122.521 - 1.461 119.608 - 1.622 117.381 - 1.79 115.667 - 1.922 112.583 - 2.114 112.754 - 2.174 111.726 - 2.21 98.874 - 2.259 69.4 - 2.319 47.466 - 2.365 28.96 - 2.441 12.166 - 2.526 7.368 - 2.597 2.228 - 2.692 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H110.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H110.rse deleted file mode 100644 index bb217b1c7b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H110.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - Pro-38-2G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H118.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H118.eng deleted file mode 100644 index bd2403090c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H118.eng +++ /dev/null @@ -1,22 +0,0 @@ -H118-CL 29 231 3-5-7-9-12 0.111 0.232 CTI -0.01 7 -0.02 144 -0.04 183 -0.06 182 -0.08 176 -0.09 173 -0.1 172 -0.2 160 -0.4 147 -0.5 142 -0.7 134 -0.8 127 -1 121 -1.1 118 -1.2 115 -1.4 109 -1.5 104 -1.6 75 -1.7 31 -1.8 13 -1.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H118.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H118.rse deleted file mode 100644 index b833fc46f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H118.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H120.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H120.eng deleted file mode 100644 index 6556837ce1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H120.eng +++ /dev/null @@ -1,35 +0,0 @@ -;Pro-38 Red Lightning 2 Grain reload -H120-14A 38 186 14-11-9-7-5 0.1366 0.295 CTI -0.016 53.023 -0.029 107.113 -0.036 124.55 -0.049 129.532 -0.062 117.789 -0.072 98.217 -0.131 123.838 -0.199 136.649 -0.258 144.122 -0.313 147.681 -0.369 146.257 -0.441 145.19 -0.558 143.411 -0.683 141.631 -0.777 140.92 -0.859 139.14 -0.98 136.293 -1.097 133.091 -1.251 128.82 -1.434 122.771 -1.558 118.856 -1.639 117.077 -1.731 117.077 -1.884 117.077 -1.927 105.334 -1.959 88.964 -1.995 68.325 -2.031 41.991 -2.083 18.505 -2.142 6.761 -2.181 2.135 -2.24 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H120.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H120.rse deleted file mode 100644 index 826dfc6f04..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H120.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123.eng deleted file mode 100644 index 781dc1b5e3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123.eng +++ /dev/null @@ -1,13 +0,0 @@ -H123-SK 29 231 3-5-7-9-12 0.106 0.228 CTI -0.021 10 -0.028 139 -0.055 139 -0.075 108 -0.13 120 -0.35 132 -0.65 140 -1 144 -1.15 143 -1.22 145 -1.35 23 -1.53 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123.rse deleted file mode 100644 index 2383ffb53e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_1.eng deleted file mode 100644 index 0678bc8663..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_1.eng +++ /dev/null @@ -1,48 +0,0 @@ -; Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -; Coker. Data from CAR web site. -H123 38 186 14 0.123 0.297 Cesaroni - 0.02 143.233 - 0.039 136.193 - 0.057 141.067 - 0.061 138.088 - 0.072 95.308 - 0.084 86.644 - 0.112 108.575 - 0.17 113.72 - 0.243 120.76 - 0.327 125.904 - 0.413 130.236 - 0.487 134.839 - 0.699 142.15 - 0.71 142.42 - 0.765 143.503 - 0.812 142.691 - 0.871 148.377 - 0.888 143.774 - 0.914 144.586 - 0.949 144.857 - 0.99 141.879 - 1.033 145.399 - 1.072 145.399 - 1.112 144.045 - 1.143 142.42 - 1.182 144.316 - 1.241 142.691 - 1.307 141.608 - 1.387 138.63 - 1.448 135.651 - 1.499 133.485 - 1.552 129.965 - 1.577 131.59 - 1.605 131.59 - 1.634 132.402 - 1.652 132.402 - 1.669 129.153 - 1.685 121.843 - 1.699 108.575 - 1.744 61.463 - 1.775 27.347 - 1.822 14.892 - 1.869 7.581 - 1.912 1.895 - 1.939 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_1.rse deleted file mode 100644 index e793069661..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_1.rse +++ /dev/null @@ -1,62 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_2.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_2.rse deleted file mode 100644 index 1ad55ec519..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H123_2.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - Skidmark - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H125.eng deleted file mode 100644 index d8576c3c4e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H125.eng +++ /dev/null @@ -1,34 +0,0 @@ -H125-TamedTiger 38 186 3-5-7-9-12 0.1380 0.293 CTI -0.01 1.252 -0.02 2.921 -0.03 9.635 -0.04 78.025 -0.05 128.019 -0.06 139.095 -0.07 98.5463 -0.08 93.122 -0.09 98.0152 -0.1 102.947 -0.2 128.398 -0.3 135.947 -0.4 140.309 -0.5 145.961 -0.6 148.616 -0.7 149.906 -0.8 150.589 -0.9 152.675 -1.0 154.078 -1.1 153.471 -1.2 151.992 -1.3 151.537 -1.4 146.757 -1.5 145.961 -1.6 141.371 -1.7 139.209 -1.8 133.595 -1.9 70.7805 -2.0 18.4726 -2.1 4.58967 -2.15 0.0 -; -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H125.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H125.rse deleted file mode 100644 index d9c9e0bcd2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H125.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H133.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H133.eng deleted file mode 100644 index bd80c04b06..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H133.eng +++ /dev/null @@ -1,13 +0,0 @@ -H133-BS 29 187 5-7-9-11-14 0.085 0.19 CTI -0.01 10 -0.017 100 -0.023 190 -0.028 200 -0.042 140 -0.05 135 -0.12 152 -0.35 154 -1 135 -1.065 110 -1.2 25 -1.28 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H133.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H133.rse deleted file mode 100644 index c60cde6af1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H133.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H135.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H135.eng deleted file mode 100644 index cdfd381430..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H135.eng +++ /dev/null @@ -1,25 +0,0 @@ -; Pro-29-4G White -217-H135-WH-12A 29 231 3-5-7-8-10-11 0.1198 0.2512 CTI - 0.012 166.804 - 0.054 158.622 - 0.101 155.718 - 0.156 153.079 - 0.223 151.496 - 0.312 150.44 - 0.566 150.968 - 0.706 149.12 - 0.946 143.842 - 1.121 140.411 - 1.222 136.452 - 1.278 136.979 - 1.341 131.437 - 1.374 126.686 - 1.4 117.185 - 1.431 100.029 - 1.482 71.261 - 1.535 49.355 - 1.558 30.88 - 1.598 11.877 - 1.62 5.015 - 1.644 2.375 - 1.676 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H135.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H135.rse deleted file mode 100644 index 8f9bfcb0aa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H135.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - Pro-29-4G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H140.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H140.eng deleted file mode 100644 index e90a49828c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H140.eng +++ /dev/null @@ -1,14 +0,0 @@ -H140-CL 29 276 2-4-6-8-11 0.139 0.277 CTI -0.015 30 -0.025 240 -0.04 245 -0.09 220 -0.2 200 -0.4 185 -0.8 160 -1.4 140 -1.49 100 -1.63 50 -1.75 35 -1.9 12 -2.05 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H140.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H140.rse deleted file mode 100644 index 76ef274119..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H140.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H143.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H143.eng deleted file mode 100644 index 4edc131400..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H143.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -H143SS 38.0 186.00 4-6-8-10-13 0.16540 0.34700 CTI - 0.06 114.68 - 0.19 134.25 - 0.40 149.61 - 0.60 158.10 - 0.80 163.77 - 1.00 167.00 - 1.21 160.93 - 1.40 148.80 - 1.60 128.59 - 1.63 117.26 - 1.65 106.35 - 1.70 35.63 - 1.73 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H143.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H143.rse deleted file mode 100644 index 20409d33ed..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H143.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H151.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H151.eng deleted file mode 100644 index 53a8dad625..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H151.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pro29-4G 207H151-RL 15A -H151-RL 29 231 15-12-10-8-6 0.118 0.238 CTI - 0.0080 125.295 - 0.021 209.602 - 0.052 160.928 - 0.118 186.779 - 0.293 190.738 - 0.465 183.518 - 0.683 171.641 - 0.988 145.557 - 1.133 134.145 - 1.221 74.292 - 1.293 29.81 - 1.372 10.014 - 1.398 6.521 - 1.4 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H151.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H151.rse deleted file mode 100644 index 6dfed446ca..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H151.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Pro29-4G 207H151-RL 15A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H152.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H152.eng deleted file mode 100644 index 190bf13c27..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H152.eng +++ /dev/null @@ -1,37 +0,0 @@ -H152BS 38 186 15-12-10-8-6 0.138 0.298 Cesaroni - 0.018 212.503 - 0.051 207.443 - 0.059 153.052 - 0.077 153.052 - 0.099 163.172 - 0.139 166.966 - 0.168 174.556 - 0.223 173.291 - 0.256 175.821 - 0.304 175.821 - 0.396 179.615 - 0.538 175.821 - 0.659 174.556 - 0.714 174.556 - 0.758 174.556 - 0.802 170.761 - 0.89 172.026 - 0.974 165.701 - 1.022 168.231 - 1.084 163.172 - 1.212 155.582 - 1.293 151.788 - 1.385 146.728 - 1.447 149.258 - 1.484 144.198 - 1.531 145.463 - 1.575 144.198 - 1.601 137.874 - 1.615 134.079 - 1.623 120.165 - 1.663 82.218 - 1.714 46.801 - 1.766 34.152 - 1.788 30.358 - 1.821 26.563 - 1.828 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H152.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H152.rse deleted file mode 100644 index 18f4f6bd5e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H152.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H153.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H153.eng deleted file mode 100644 index a95f09bd71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H153.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -244H153 38.0 186.00 4-6-8-10-13 0.14390 0.30390 CTI - 0.13 149.36 - 0.17 173.70 - 0.23 171.77 - 0.39 179.91 - 0.60 188.30 - 0.81 180.40 - 1.01 168.25 - 1.18 160.91 - 1.29 149.64 - 1.41 136.95 - 1.60 105.37 - 1.69 23.58 - 1.75 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H153.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H153.rse deleted file mode 100644 index 4679b6c87f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H153.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H159.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H159.eng deleted file mode 100644 index f5738571f4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H159.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro29-6G 298H159-GR 15A -H159-GR 29 320 15-12-10-8-6 0.1874 0.3428 CTI - 0.012 117.276 - 0.032 158.638 - 0.103 177.806 - 0.171 184.868 - 0.299 185.372 - 0.511 178.058 - 0.717 179.319 - 1.272 162.926 - 1.424 159.647 - 1.519 152.585 - 1.584 149.811 - 1.632 146.28 - 1.727 89.281 - 1.768 109.962 - 1.834 25.977 - 1.865 10.593 - 1.887 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H159.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H159.rse deleted file mode 100644 index ee7e2631e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H159.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro29-6G 298H159-GR 15A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160.eng deleted file mode 100644 index e72a54a30b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160.eng +++ /dev/null @@ -1,14 +0,0 @@ -H160-CL 29 320 3-5-7-9-12 0.166 0.319 CTI -0.015 10 -0.022 260 -0.04 316 -0.1 280 -0.25 241 -0.6 201 -1 175 -1.27 165 -1.35 140 -1.45 100 -1.65 48 -1.85 25 -2.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160.rse deleted file mode 100644 index e50e926175..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160_1.rse deleted file mode 100644 index 66a1d314a2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H160_1.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H163.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H163.eng deleted file mode 100644 index d8fe3f824a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H163.eng +++ /dev/null @@ -1,11 +0,0 @@ -H163-WT 29 187 5-7-9-11-14 0.086 0.187 CTI -0.018 10 -0.026 225 -0.055 165 -0.1 170 -0.2 175 -0.35 180 -0.9 175 -0.95 100 -0.98 45 -1.062 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H163.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H163.rse deleted file mode 100644 index 824d5b2c77..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H163.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H170.eng deleted file mode 100644 index 24d712db14..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H170.eng +++ /dev/null @@ -1,14 +0,0 @@ -H170-BS 29 231 5-7-9-11-14 0.111 0.232 CTI -0.01 150 -0.015 200 -0.025 240 -0.075 210 -0.13 205 -0.35 204 -0.7 205 -0.8 190 -0.9 185 -0.99 173 -1.1 60 -1.22 25 -1.34 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H170.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H170.rse deleted file mode 100644 index 4f6b3ea998..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H170.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H175.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H175.eng deleted file mode 100644 index 1d6cf4245b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H175.eng +++ /dev/null @@ -1,13 +0,0 @@ -H175-SS 29 231 5-7-9-11-14 0.122 0.247 CTI -0.021 13 -0.032 175 -0.057 215 -0.08 180 -0.13 175 -0.4 185 -0.6 190 -0.76 195 -0.84 236 -0.88 150 -0.92 30 -1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H175.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H175.rse deleted file mode 100644 index 6955cc6f76..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H175.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H180.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H180.eng deleted file mode 100644 index 79f5107290..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H180.eng +++ /dev/null @@ -1,15 +0,0 @@ -H180-SK 29 320 5-7-9-11-14 0.158 0.314 CTI -0.01 10 -0.02 250 -0.03 270 -0.07 239 -0.13 227 -0.35 218 -0.6 216 -0.8 207 -0.98 208 -1.06 204 -1.15 135 -1.23 65 -1.4 12 -1.56 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H180.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H180.rse deleted file mode 100644 index 671c1bc76c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H180.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H194.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H194.eng deleted file mode 100644 index 370edec10c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H194.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro29-5G 260H194-RL 14A -H194-RL 29 276 14-11-9-7-5 0.145 0.284 CTI - 0.0060 179.792 - 0.011 244.07 - 0.021 285.99 - 0.049 204.944 - 0.117 233.823 - 0.181 241.275 - 0.386 236.152 - 0.98 193.765 - 1.075 170.476 - 1.136 144.392 - 1.19 80.58 - 1.285 22.823 - 1.347 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H194.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H194.rse deleted file mode 100644 index 5f5e3fc20f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H194.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro29-4G 260H194-RL 14A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H200.eng deleted file mode 100644 index 8e67c1ac18..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H200.eng +++ /dev/null @@ -1,14 +0,0 @@ -H200-BS 29 276 5-7-9-11-14 0.136 0.274 CTI -0.01 40 -0.018 280 -0.026 295 -0.06 250 -0.15 236 -0.65 235 -0.8 227 -0.9 212 -0.98 205 -1.09 135 -1.2 68 -1.3 20 -1.4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H200.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H200.rse deleted file mode 100644 index 6528070217..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H200.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H225.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H225.rse deleted file mode 100644 index 2ca32b7783..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H225.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H226.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H226.eng deleted file mode 100644 index 31f0b0657b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H226.eng +++ /dev/null @@ -1,16 +0,0 @@ -H226-SK 29 365 5-7-9-11-14 0.175 0.360 CTI -0.007 9 -0.012 178 -0.017 320 -0.023 362 -0.047 319 -0.08 302 -0.14 291 -0.615 276 -0.95 257.5 -1 215 -1.077 105 -1.18 81 -1.29 31 -1.34 16 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H226.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H226.rse deleted file mode 100644 index 9fbd4c4638..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H226.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H233.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H233.eng deleted file mode 100644 index 1985ecb295..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H233.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro29 6G 311H233-RL 14A -H233-RL 29 320 14-11-9-7-5 0.1738 0.3276 CTI - 0.0040 98.643 - 0.01 263.822 - 0.018 348.041 - 0.051 263.822 - 0.156 299.185 - 0.82 262.426 - 0.988 228.46 - 1.05 214.501 - 1.111 142.38 - 1.17 84.218 - 1.242 49.321 - 1.331 17.681 - 1.399 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H233.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H233.rse deleted file mode 100644 index 2a45a0533f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H233.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H237.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H237.eng deleted file mode 100644 index 499d81ff04..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H237.eng +++ /dev/null @@ -1,12 +0,0 @@ -H237-SS 29 276 4-6-8-10-13 0.151 0.294 CTI -0.026 10 -0.028 154 -0.033 238 -0.055 270 -0.07 234 -0.71 259 -0.78 296 -0.8 280 -0.87 50 -0.9 10 -0.937 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H237.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H237.rse deleted file mode 100644 index 78995b4030..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H237.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255.eng deleted file mode 100644 index c1fbb36ad3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255.eng +++ /dev/null @@ -1,15 +0,0 @@ -H255-BS 29 320 5-7-9-11-14 0.162 0.318 CTI -0.015 10 -0.018 260 -0.024 404 -0.03 412 -0.047 375 -0.08 340 -0.2 316 -0.4 303 -0.6 295 -0.87 285 -0.93 273 -1 200 -1.1 80 -1.252 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255.rse deleted file mode 100644 index ea18851cc0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255_1.eng deleted file mode 100644 index 9064e456ae..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255_1.eng +++ /dev/null @@ -1,11 +0,0 @@ -H255-WT 29 231 5-7-9-11-14 0.113 0.232 CTI -0.018 10 -0.023 345 -0.039 325 -0.05 276 -0.13 287 -0.35 292 -0.75 259 -0.78 265 -0.87 40 -0.936 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255_1.rse deleted file mode 100644 index ea18851cc0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H255_1.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H295.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H295.eng deleted file mode 100644 index 481a4f7d4f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H295.eng +++ /dev/null @@ -1,14 +0,0 @@ -H295-SS 29 320 4-6-8-10-13 0.181 0.342 CTI -0.03 15 -0.031 320 -0.05 355 -0.075 325 -0.13 312 -0.35 315 -0.66 327 -0.72 368 -0.75 370 -0.78 290 -0.8 150 -0.85 25 -0.925 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H295.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H295.rse deleted file mode 100644 index 635db73f0f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H295.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H340.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H340.eng deleted file mode 100644 index c754fb65bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H340.eng +++ /dev/null @@ -1,20 +0,0 @@ -H340-SS 29 365 5-7-9-11-14 0.2067 0.391 CTI -0.017 6 -0.024 255 -0.0311 395 -0.035 423 -0.043 447.5 -0.06 398 -0.064 389 -0.075 397.5 -0.25 388 -0.4 382 -0.542 376 -0.62 379 -0.66 400 -0.68 407 -0.705 398 -0.74 248 -0.8 59.5 -0.85 8 -0.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H340.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H340.rse deleted file mode 100644 index a98dceae2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H340.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H399.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H399.eng deleted file mode 100644 index 05038f98a9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H399.eng +++ /dev/null @@ -1,14 +0,0 @@ -H399-WT 29 320 3-5-7-9-12 0.14 0.294 CTI -0.015 10 -0.02 320 -0.024 555 -0.05 490 -0.075 475 -0.1 468 -0.2 463 -0.53 451 -0.55 460 -0.575 400 -0.64 200 -0.685 25 -0.71 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H399.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H399.rse deleted file mode 100644 index d05ae2a114..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H399.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H400.rse deleted file mode 100644 index 6f306022cf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H400.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H410.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H410.eng deleted file mode 100644 index 8edb1a6ede..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H410.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro29-3G 168H410-VM 14A -H410-VM 29 187 14-11-9-7-5-3 0.0845 0.1825 CTI - 0.0040 152.778 - 0.0090 341.425 - 0.013 367.995 - 0.019 367.995 - 0.046 385.93 - 0.074 416.486 - 0.143 471.618 - 0.21 517.452 - 0.253 500.845 - 0.287 460.326 - 0.338 383.273 - 0.357 343.418 - 0.361 293.599 - 0.369 263.043 - 0.378 253.744 - 0.4 62.44 - 0.414 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H410.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H410.rse deleted file mode 100644 index 0c7d21e19c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H410.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro29-3G 168H410-VM 14A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H42.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H42.rse deleted file mode 100644 index 9873259db6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H42.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 186-H42-MY-10A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H53.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H53.rse deleted file mode 100644 index e07212e6e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H53.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - CTI 234-H53-MY-12A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H54.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H54.eng deleted file mode 100644 index fb4f84debf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H54.eng +++ /dev/null @@ -1,22 +0,0 @@ -; Pro-29-3G White Long Burn -168-H54-WH_LB-10A 29 187 3-5-7-8-9 0.0966 0.209 CTI - 0.017 103.061 - 0.047 83.272 - 0.088 91.821 - 0.155 97.836 - 0.199 89.288 - 0.271 80.264 - 0.406 76.623 - 0.599 73.773 - 0.898 69.024 - 1.182 66.016 - 1.475 60.475 - 1.785 53.826 - 2.099 44.802 - 2.296 38.945 - 2.577 27.546 - 2.845 16.148 - 3.097 6.491 - 3.199 2.058 - 3.298 1.108 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H54.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H54.rse deleted file mode 100644 index dabb5ffbdf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H54.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - Pro-29-3G White Long Burn - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H565.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H565.eng deleted file mode 100644 index 71609ac0e8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H565.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -; -H565 38 245 5-7-9-11-14 0.1742 0.3622 Cesaroni -0.01 106.91 -0.02 479.76 -0.0347144 528.926 -0.0515118 553.719 -0.0761478 578.512 -0.100784 586.777 -0.150056 611.57 -0.2 607.1 -0.3 614.73 -0.4 616.58 -0.5 622.37 -0.51 645.28 -0.52 628.99 -0.53 535.19 -0.54 327.35 -0.55 147.98 -0.56 60.36 -0.57 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H565.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H565.rse deleted file mode 100644 index 4a19d6c3f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H565.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H87.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H87.eng deleted file mode 100644 index a8b3b3b1f4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H87.eng +++ /dev/null @@ -1,16 +0,0 @@ -H87-IM 29 187 3-5-7-9-12 0.0927 0.205 CTI -0.018 5 -0.027 73 -0.032 139.2 -0.048 117 -0.056 87 -0.081 95 -0.147 101 -0.336 103 -0.52 101 -1.6 83 -1.686 81 -1.72 79 -1.778 60 -1.82 38 -1.94 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H87.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H87.rse deleted file mode 100644 index ac62fab370..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H87.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H90.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H90.eng deleted file mode 100644 index bffe23c27b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H90.eng +++ /dev/null @@ -1,13 +0,0 @@ -H90-CL 29 187 3-5-7-9-12 0.084 0.19 CTI -0.021 10 -0.028 154 -0.055 155 -0.075 108 -0.13 120 -0.35 115 -1.4 83 -1.48 84 -1.56 73 -1.69 22 -1.76 8 -1.85 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H90.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H90.rse deleted file mode 100644 index 906a43604f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_H90.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I100.eng deleted file mode 100644 index ec96606afe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I100.eng +++ /dev/null @@ -1,23 +0,0 @@ -; Pro-54-2G Red Lightning Long Burn -614-I100-RL_LB-17A 54 236 9-11-12-13-15-17 0.3501 0.807 CTI - 0.042 269.267 - 0.043 332.429 - 0.07 225.102 - 0.091 202.307 - 0.14 234.125 - 0.202 245.522 - 0.349 220.828 - 0.523 202.307 - 0.837 183.311 - 1.186 164.315 - 1.681 139.62 - 2.358 110.651 - 3.321 76.459 - 4.095 55.563 - 4.919 37.042 - 5.944 21.37 - 6.726 12.347 - 7.437 6.174 - 8.142 2.849 - 8.735 0.95 - 8.993 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I100.rse deleted file mode 100644 index 1f477923ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I100.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - Pro-54-2G Red Lightning Long Burn - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I120.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I120.eng deleted file mode 100644 index 442acb4f6e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I120.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Pro54-1G 502I120-IM 15A -I120-IM 54 143 15-14-13-12-11-10-9-8-7-6-5 0.3 0.6232000000000001 CTI - 0.035 13.687 - 0.047 87.183 - 0.067 148.493 - 0.096 129.744 - 0.212 141.931 - 0.385 142.118 - 0.671 141.743 - 1.032 139.681 - 1.545 136.868 - 2.15 127.869 - 3.757 92.433 - 4.031 89.058 - 4.122 67.122 - 4.216 23.436 - 4.283 5.25 - 4.3 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I120.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I120.rse deleted file mode 100644 index 616c946c23..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I120.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro54-1G 502I120-IM 15A - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I125.eng deleted file mode 100644 index 1de2c32d70..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I125.eng +++ /dev/null @@ -1,17 +0,0 @@ -; CTI Pro-38 5G -; 567 I125 WH LB 10A -567-I125-WH-LB-10 38 367 10-7-5-3 0.3556 0.647 CTI - 0.046 174.74 - 0.089 267.82 - 0.135 235.986 - 0.258 193.772 - 0.35 182.007 - 0.553 174.74 - 1.124 176.125 - 1.502 173.01 - 1.806 162.284 - 2.439 135.986 - 3.372 84.775 - 4.005 36.678 - 4.395 14.879 - 4.585 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I125.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I125.rse deleted file mode 100644 index 124d7e4206..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I125.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - CTI Pro-38 5G -567 I125 WH LB 10A - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I140.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I140.eng deleted file mode 100644 index 17824c3885..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I140.eng +++ /dev/null @@ -1,22 +0,0 @@ -; Pro54 1G 396 I140-SK 14A -I140-SK 54 143 14-13-12-11-10-9-8-7-6-5-4 0.2392 0.56429 CTI - 0.0080 81.304 - 0.02 137.174 - 0.043 157.174 - 0.065 121.087 - 0.16 136.087 - 0.353 150.652 - 0.54 156.304 - 0.702 160.217 - 0.976 156.957 - 1.298 151.304 - 1.619 146.087 - 2.057 136.304 - 2.489 121.522 - 2.604 119.348 - 2.671 122.174 - 2.708 111.739 - 2.779 61.304 - 2.84 25.217 - 2.901 8.478 - 2.902 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I140.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I140.rse deleted file mode 100644 index 5fd21ff724..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I140.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - Pro54 1G 396 I140-SK 14A - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I150.eng deleted file mode 100644 index 55d8908b9a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I150.eng +++ /dev/null @@ -1,24 +0,0 @@ -; CTI Pro54-1G 465 I150BS 11A -I150BS 54 153 11-10-9-8-7-6-5-4-3-2-1 0.226 0.5700000000000001 CTI - 0.017 11.039 - 0.039 103.397 - 0.045 164.846 - 0.065 179.932 - 0.09 153.439 - 0.166 162.638 - 0.194 161.902 - 0.303 169.261 - 0.483 171.837 - 0.666 173.309 - 0.834 171.469 - 1.275 168.525 - 1.725 156.015 - 2.559 128.05 - 2.77 122.53 - 2.899 118.851 - 2.978 119.219 - 3.003 99.349 - 3.034 82.791 - 3.087 66.233 - 3.16 19.502 - 3.208 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I150.rse deleted file mode 100644 index cb537f8334..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I150.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - CTI Pro54-1G 465 I150BS 11A - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I165.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I165.eng deleted file mode 100644 index de68b1027c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I165.eng +++ /dev/null @@ -1,16 +0,0 @@ -;Pro-54-1G C-Star 518-I165-17A -;Ejection adjustable from 7 to 17 -518-I165-CS-17A 54 69 17-15-13-11-9-7 0.267 0.594 CTI -0.027 133.424 -0.056 174.831 -0.067 179.973 -0.497 188.633 -1.018 184.032 -1.704 169.959 -2.95 129.364 -3.05 130.717 -3.168 44.655 -3.213 17.862 -3.271 3.518 -3.5 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I170.eng deleted file mode 100644 index 5b5ae0ece7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I170.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Cesaroni I170 -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I170 38 242 0 0.209216 0.404992 CSR - 0.044 133.251 - 0.134 230.114 - 0.226 224.136 - 0.318 223.695 - 0.409 223.888 - 0.501 225.265 - 0.593 226.670 - 0.684 229.397 - 0.775 231.998 - 0.866 233.034 - 0.957 233.144 - 1.049 232.703 - 1.141 231.574 - 1.232 227.745 - 1.324 225.844 - 1.416 221.160 - 1.506 217.396 - 1.597 211.711 - 1.689 205.678 - 1.780 198.020 - 1.872 125.016 - 1.964 61.847 - 2.055 23.279 - 2.147 2.066 - 2.239 0.799 - 2.330 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I170.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I170.rse deleted file mode 100644 index cabb32484a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I170.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I175.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I175.eng deleted file mode 100644 index b3829cf1df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I175.eng +++ /dev/null @@ -1,31 +0,0 @@ -; Pro38-3G White -411-I175-WH-14A 38 245 6-8-9-11-12-13 0.22890000000000002 0.4375 CTI - 0.019 149.422 - 0.038 180.347 - 0.052 166.763 - 0.106 184.971 - 0.148 187.572 - 0.232 187.861 - 0.338 189.017 - 0.518 190.751 - 0.604 192.197 - 0.733 193.353 - 0.877 195.087 - 1.005 193.931 - 1.128 193.353 - 1.333 193.064 - 1.495 190.751 - 1.648 188.15 - 1.79 183.526 - 1.921 178.035 - 2.001 178.324 - 2.043 176.59 - 2.089 151.156 - 2.147 115.318 - 2.212 70.231 - 2.274 47.11 - 2.32 22.832 - 2.368 8.671 - 2.396 3.757 - 2.435 3.179 - 2.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I175.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I175.rse deleted file mode 100644 index eb4acf3119..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I175.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Pro38-3G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I180.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I180.eng deleted file mode 100644 index b559f08ace..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I180.eng +++ /dev/null @@ -1,15 +0,0 @@ -; CTI Pro38-3G 338 I180 Skidmark 14A -I180SK 38 243 5-7-9-11-14 0.2 0.394 CTI - 0.0030 130.431 - 0.028 173.405 - 0.062 156.065 - 0.197 180.945 - 0.644 206.578 - 0.962 214.872 - 1.336 205.07 - 1.482 199.039 - 1.585 196.777 - 1.638 171.143 - 1.7 91.226 - 1.795 24.88 - 1.962 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I180.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I180.rse deleted file mode 100644 index ca16f6cee0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I180.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - CTI Pro38-3G 338 I180 Skidmark 14A - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I195.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I195.rse deleted file mode 100644 index 7e3427274f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I195.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I204.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I204.eng deleted file mode 100644 index b9105c7b3d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I204.eng +++ /dev/null @@ -1,15 +0,0 @@ -I204-IM 29 320 4-6-8-10-13 0.194 0.349 CTI -0.01 100 -0.012 395 -0.03 310 -0.3 286 -0.5 270 -0.7 251 -1 228 -1.1 215 -1.2 165 -1.3 125 -1.4 95 -1.5 52 -1.6 36 -1.72 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I204.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I204.rse deleted file mode 100644 index 8e5516de6e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I204.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I205.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I205.eng deleted file mode 100644 index baeddf0681..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I205.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -384I205 38.0 245.00 5-7-9-11-14 0.20610 0.40220 CTI - 0.10 181.50 - 0.13 213.30 - 0.20 210.10 - 0.40 226.61 - 0.60 235.80 - 0.80 234.00 - 1.00 232.80 - 1.20 227.70 - 1.40 216.80 - 1.60 197.21 - 1.74 183.13 - 1.80 87.30 - 1.88 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I205.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I205.rse deleted file mode 100644 index f4394d4aa3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I205.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - -Replaced by I170 Classic - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I212.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I212.eng deleted file mode 100644 index 4d4b40ff84..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I212.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -I212SS 38.0 245.00 5-7-9-11-14 0.24810 0.47500 CTI - 0.04 189.66 - 0.20 207.11 - 0.40 222.41 - 0.60 236.62 - 0.80 249.60 - 0.95 255.15 - 1.01 250.22 - 1.21 233.54 - 1.40 208.99 - 1.55 183.99 - 1.60 168.08 - 1.63 134.62 - 1.69 25.86 - 1.71 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I212.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I212.rse deleted file mode 100644 index 17c0abca78..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I212.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I216.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I216.eng deleted file mode 100644 index 5836994b29..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I216.eng +++ /dev/null @@ -1,17 +0,0 @@ -I216-CL(I) 38 367 5-7-9-11-14 0.3125 0.601 CTI -0.017 35 -0.03 300 -0.035 345 -0.05 325 -0.07 275 -0.14 292 -0.26 296 -0.8 280 -1.1 280.4 -1.62 255 -1.8 226 -2.105 210 -2.2 195 -2.45 80 -2.75 36 -3.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I216.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I216.rse deleted file mode 100644 index bf95a6e181..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I216.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - This motor is a standard Pro38-5G with a different nozzle to keep total impulse in 'I' range - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I218.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I218.eng deleted file mode 100644 index 48af3d9c8c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I218.eng +++ /dev/null @@ -1,21 +0,0 @@ -; CTI Pro54-1G 491 I218WT - 14A -I218WT 54 153 14-13-12-11-10-9-8-7-6-5-4 0.23 0.58 CTI - 0.01 12.222 - 0.022 129.788 - 0.047 215.926 - 0.072 250.846 - 0.079 208.36 - 0.11 233.968 - 0.188 249.1 - 0.436 263.651 - 0.783 258.994 - 1.195 235.714 - 1.614 201.375 - 1.834 191.481 - 1.964 183.915 - 2.074 178.095 - 2.143 179.841 - 2.172 87.884 - 2.188 50.053 - 2.217 18.624 - 2.252 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I218.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I218.rse deleted file mode 100644 index 381d5a52d2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I218.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - CTI Pro54-1G 491 I218WT - 14A - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I223.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I223.eng deleted file mode 100644 index 76ee916889..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I223.eng +++ /dev/null @@ -1,16 +0,0 @@ -; CTI Pro38-4G 434 I223 Skidmark 14A -I223SK 38 302 5-7-9-11-14 0.266 0.494 CTI - 0.016 199.183 - 0.024 260.157 - 0.07 207.313 - 0.148 227.637 - 0.425 244.71 - 0.721 254.466 - 1.015 256.905 - 1.3 248.775 - 1.459 240.645 - 1.615 234.954 - 1.712 195.931 - 1.782 119.51 - 1.9 24.39 - 1.984 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I223.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I223.rse deleted file mode 100644 index 30e13e05d8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I223.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - CTI Pro38-4G 434 I223 Skidmark 14A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I224.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I224.eng deleted file mode 100644 index 52e099e734..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I224.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pro29-6GXL 381I224-CL 15A -I224-CL 29 365 15-12-10-8-6 0.19669999999999999 0.37 CTI - 0.0080 357.455 - 0.02 433.079 - 0.111 343.833 - 0.229 318.938 - 0.479 295.922 - 0.836 277.133 - 1.022 269.618 - 1.097 233.919 - 1.233 117.899 - 1.294 93.004 - 1.39 62.003 - 1.667 26.774 - 1.692 17.38 - 1.7 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I224.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I224.rse deleted file mode 100644 index 5cd3d69917..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I224.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Pro29-6GXL 381I224-CL 15A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I236.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I236.eng deleted file mode 100644 index 46a166d65a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I236.eng +++ /dev/null @@ -1,29 +0,0 @@ -I236BS 38 245 17-14-12-10-8 0.20400000000000001 0.4 Cesaroni - 0.028 290.772 - 0.042 313.594 - 0.049 267.95 - 0.053 253.58 - 0.072 245.973 - 0.095 256.961 - 0.127 262.033 - 0.153 266.259 - 0.243 268.795 - 0.338 269.64 - 0.454 270.486 - 0.633 266.259 - 0.753 262.878 - 0.89 256.116 - 1.01 251.89 - 1.119 247.663 - 1.277 236.675 - 1.353 231.603 - 1.453 227.377 - 1.525 225.686 - 1.555 195.257 - 1.581 158.91 - 1.618 119.183 - 1.685 89.598 - 1.729 56.633 - 1.743 36.347 - 1.766 21.977 - 1.81 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I236.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I236.rse deleted file mode 100644 index b736574fdf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I236.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I240.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I240.eng deleted file mode 100644 index be07df1afe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I240.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Cesaroni I240 -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I240 38 302 0 0.274624 0.503552 CSR - 0.043 265.317 - 0.131 320.903 - 0.221 314.148 - 0.310 312.413 - 0.399 313.564 - 0.488 314.335 - 0.577 321.117 - 0.667 325.923 - 0.755 327.040 - 0.844 326.831 - 0.933 324.348 - 1.023 321.063 - 1.111 317.446 - 1.200 308.301 - 1.290 300.612 - 1.379 293.536 - 1.468 283.358 - 1.556 273.832 - 1.646 259.708 - 1.735 190.662 - 1.824 124.130 - 1.912 60.875 - 2.002 26.967 - 2.092 7.636 - 2.181 2.296 - 2.271 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I240.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I240.rse deleted file mode 100644 index eb1f4ba9a0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I240.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I242.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I242.eng deleted file mode 100644 index 7348d693ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I242.eng +++ /dev/null @@ -1,26 +0,0 @@ -; Pro-38-4G White -548-I242-WH-15A 38 303 6-8-9-11-13 0.22480000000000003 0.5498999999999999 CTI - 0.015 241.029 - 0.035 272.691 - 0.063 286.148 - 0.094 277.045 - 0.184 265.567 - 0.299 262.797 - 0.403 262.797 - 0.537 266.359 - 0.734 269.921 - 0.884 271.504 - 1.049 269.921 - 1.223 265.567 - 1.384 260.422 - 1.61 249.34 - 1.727 243.008 - 1.865 235.092 - 1.954 231.135 - 2.0 220.844 - 2.088 155.541 - 2.164 93.008 - 2.211 43.536 - 2.278 10.29 - 2.345 3.958 - 2.402 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I242.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I242.rse deleted file mode 100644 index 69c088fbe6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I242.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - Pro-38-4G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I243.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I243.eng deleted file mode 100644 index 78efa9badc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I243.eng +++ /dev/null @@ -1,27 +0,0 @@ -; Pro-29-6XGL White -382-I243-WH-13A 29 365 4-6-7-9-11-12 0.2121 0.3986 CTI - 0.016 443.392 - 0.03 416.3 - 0.061 365.419 - 0.082 331.718 - 0.122 317.181 - 0.174 303.304 - 0.268 298.018 - 0.367 295.374 - 0.514 294.714 - 0.701 290.749 - 0.808 280.837 - 0.968 266.96 - 1.058 247.797 - 1.105 224.009 - 1.155 207.489 - 1.178 202.203 - 1.206 167.181 - 1.254 158.59 - 1.297 154.626 - 1.336 132.819 - 1.395 109.692 - 1.486 69.383 - 1.574 25.771 - 1.649 6.608 - 1.692 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I243.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I243.rse deleted file mode 100644 index dbca1ca183..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I243.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - Pro-29-6XGL White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I255.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I255.rse deleted file mode 100644 index 5fe4eba9c1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I255.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - - Pro-38 Red Lightning 4 Grain reload - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I285.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I285.eng deleted file mode 100644 index 497f3501b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I285.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -512I285 38.0 303.00 6-8-10-12-15 0.27240 0.50590 CTI - 0.10 350.60 - 0.15 318.73 - 0.20 312.30 - 0.40 322.37 - 0.60 330.57 - 0.80 329.40 - 1.00 319.64 - 1.20 294.14 - 1.40 271.90 - 1.60 239.90 - 1.66 178.10 - 1.80 44.80 - 1.91 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I285.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I285.rse deleted file mode 100644 index a3be2e7388..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I285.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I287.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I287.eng deleted file mode 100644 index 12556e56a2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I287.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -I287SS 38.0 303.00 6-8-10-12-15 0.33080 0.60500 CTI - 0.05 275.86 - 0.20 292.53 - 0.41 309.20 - 0.61 327.53 - 0.80 341.70 - 0.90 344.20 - 1.01 331.70 - 1.20 311.70 - 1.40 280.03 - 1.53 245.02 - 1.58 176.62 - 1.60 141.76 - 1.64 68.99 - 1.70 17.48 - 1.70 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I287.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I287.rse deleted file mode 100644 index 79a15a33d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I287.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I297.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I297.eng deleted file mode 100644 index d9a3fd8557..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I297.eng +++ /dev/null @@ -1,19 +0,0 @@ -; CTI Pro38-5G 543 I297 Skidmark 15A -I297SM 38 360 6-8-10-12-15 0.329 0.591 CTI - 0.013 340.903 - 0.036 375.121 - 0.069 354.844 - 0.129 335.834 - 0.281 338.369 - 0.662 344.705 - 0.855 344.705 - 1.084 329.498 - 1.295 319.359 - 1.359 313.023 - 1.447 314.29 - 1.534 269.935 - 1.637 119.126 - 1.681 69.701 - 1.74 40.554 - 1.846 12.673 - 1.943 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I297.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I297.rse deleted file mode 100644 index 7487853782..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I297.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - CTI Pro38-5G 543 I297 Skidmark 15A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I303.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I303.eng deleted file mode 100644 index 60eef2a943..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I303.eng +++ /dev/null @@ -1,24 +0,0 @@ -I303BS 38 303 16-13-11-9-7 0.27 0.5 Cesaroni - 0.035 415.763 - 0.053 402.352 - 0.054 329.705 - 0.072 324.117 - 0.109 348.705 - 0.18 353.175 - 0.28 357.646 - 0.432 354.293 - 0.557 353.175 - 0.684 348.705 - 0.886 337.528 - 1.054 325.234 - 1.212 310.705 - 1.371 299.528 - 1.475 292.823 - 1.519 277.176 - 1.542 245.882 - 1.568 204.529 - 1.609 149.764 - 1.639 108.411 - 1.757 50.294 - 1.827 22.353 - 1.887 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I303.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I303.rse deleted file mode 100644 index 917cb7a69a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I303.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I345.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I345.rse deleted file mode 100644 index 414d83f0fb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I345.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I350.eng deleted file mode 100644 index 249406c738..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I350.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -I350SS 38.0 367.00 7-9-11-13-16 0.41350 0.78200 CTI - 0.05 399.74 - 0.13 390.06 - 0.19 386.19 - 0.40 388.13 - 0.60 388.13 - 0.80 388.13 - 1.00 389.91 - 1.20 387.38 - 1.33 368.77 - 1.44 350.38 - 1.52 320.37 - 1.60 164.79 - 1.68 36.77 - 1.71 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I350.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I350.rse deleted file mode 100644 index bccd7d6374..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I350.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I360.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I360.eng deleted file mode 100644 index dc8e5ceb47..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I360.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -; -I360 38 367 15 0.3346 0.5963 Cesaroni -0.08 555.5 -0.1 489.7 -0.13 448 -0.2 449 -0.4 483.7 -0.55 498 -0.6 494.9 -0.7 481.91 -0.8 457.9 -1 406.6 -1.2 344.4 -1.3 309.3 -1.4 182.2 -1.55 158.9 -1.6 101.8 -1.7 55.8 -1.77 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I360.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I360.rse deleted file mode 100644 index d7796cdbaa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I360.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I445.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I445.eng deleted file mode 100644 index 023311a5ba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I445.eng +++ /dev/null @@ -1,16 +0,0 @@ -I445-VM 54 143 6-7-8-9-10-11-12-13-14-15-16 0.242 0.575 CTI -0.02 315 -0.04 380 -0.054 365 -0.15 440 -0.25 493 -0.4 528 -0.55 529 -0.7 502 -0.8 485 -0.9 460 -0.95 430 -0.99 300 -1.02 100 -1.05 44 -1.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I445.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I445.rse deleted file mode 100644 index 90c5bb4932..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I445.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I470.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I470.rse deleted file mode 100644 index aeca82489d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I470.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I540.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I540.eng deleted file mode 100644 index 9c39ad088a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I540.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -; -I540WT 38 367 7-9-11-13-16 0.3288 0.5982 CTI -0.03 597.86 -0.04 611.31 -0.06 605.64 -0.12 612.36 -0.24 624.54 -0.36 626 -0.48 623.63 -0.6 616.42 -0.72 598.14 -0.84 583.16 -0.95 568.92 -0.96 558.53 -0.98 533.45 -1.02 436.53 -1.06 303.15 -1.09 184.92 -1.13 74.27 -1.18 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I540.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I540.rse deleted file mode 100644 index 1916f66968..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I540.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I55.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I55.rse deleted file mode 100644 index 8aafe86a50..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I55.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - CTI 395-I55-MY-9A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I566.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I566.rse deleted file mode 100644 index 9b5142db61..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I566.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I800.rse deleted file mode 100644 index ec72538992..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_I800.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1055.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1055.rse deleted file mode 100644 index 372affaf3d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1055.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1365.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1365.rse deleted file mode 100644 index 1ed5e97053..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1365.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve from the AMW web site and CAR/NAR/TRA certified -rocket motor list dated 9/28/08. The total weight was estimated based on -similar motors such as the J325TT, J395RR, and the J401BB - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J140.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J140.eng deleted file mode 100644 index 4d384352fc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J140.eng +++ /dev/null @@ -1,23 +0,0 @@ -; Pro-54-3G White long Burn Plugged -1211-J140-WH_LB-P 54 329 P 0.68 1.2798 CTI - 0.073 191.23 - 0.109 196.102 - 0.219 193.362 - 0.51 211.328 - 0.801 216.2 - 0.991 216.2 - 1.195 212.546 - 1.53 209.501 - 2.521 198.234 - 3.096 188.185 - 3.781 174.482 - 4.174 165.043 - 4.794 146.468 - 5.464 125.457 - 6.207 98.356 - 7.001 65.164 - 7.781 36.845 - 8.444 11.267 - 8.771 4.568 - 9.158 1.218 - 9.464 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J140.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J140.rse deleted file mode 100644 index 003ac47fc7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J140.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - Pro-54-3G White long Burn Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J145.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J145.rse deleted file mode 100644 index 0e43e8fdb6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J145.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - CTI 699-J145-SK-LB-19A - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J150.rse deleted file mode 100644 index 02022bd057..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J150.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 949-J150-MY-P - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1520.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1520.rse deleted file mode 100644 index 494bbf4b35..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J1520.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J210.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J210.eng deleted file mode 100644 index b9bde28f2f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J210.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -J210 54.0 236.00 6-16 0.08270 0.84200 CTI - 0.04 335.00 - 0.16 270.92 - 0.41 269.30 - 0.80 268.49 - 1.18 256.32 - 1.62 236.85 - 2.03 214.14 - 2.38 193.86 - 2.79 174.39 - 3.20 163.85 - 3.60 157.36 - 3.75 135.46 - 3.86 85.17 - 3.99 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J210.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J210.rse deleted file mode 100644 index f2c7bf4e1a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J210.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J240.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J240.rse deleted file mode 100644 index 242c346bd0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J240.rse +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J244.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J244.eng deleted file mode 100644 index 566861b67c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J244.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro54-2G White 867-J244 -867-J244-WH-14A 54 236 14-11-9-7-5 0.511 0.911 CTI - 0.029 154.144 - 0.1 262.541 - 0.161 235.691 - 0.484 256.575 - 0.853 261.215 - 1.348 266.519 - 1.904 262.541 - 2.422 251.934 - 2.855 235.691 - 3.176 223.094 - 3.252 221.768 - 3.362 184.972 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J244.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J244.rse deleted file mode 100644 index c74f509b38..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J244.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro54-2G White 867-J244 - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J250.eng deleted file mode 100644 index 7cd59233c3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J250.eng +++ /dev/null @@ -1,25 +0,0 @@ -; CTI Pro54-2G 683 I250 Skidmark 15A -J250SK 54 237 6-8-10-12-15 0.406 0.8300000000000001 CTI - 0.031 191.478 - 0.051 271.111 - 0.082 161.056 - 0.148 206.689 - 0.3 234.426 - 0.413 244.269 - 0.635 264.848 - 0.849 270.217 - 1.06 276.48 - 1.449 283.638 - 1.644 277.375 - 1.8 279.164 - 1.932 272.901 - 2.135 261.269 - 2.291 249.637 - 2.447 246.953 - 2.525 251.427 - 2.579 227.268 - 2.614 157.477 - 2.665 51.896 - 2.727 14.316 - 2.825 6.263 - 2.965 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J250.rse deleted file mode 100644 index ece9a7da62..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J250.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - CTI Pro54-2G 683 I250 Skidmark 15A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J270.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J270.eng deleted file mode 100644 index 218ca0c242..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J270.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Pro-38-5G Green3 -650-J270-GR-13A 38 367 5-7-8-9-10-11 0.376 0.6548 CTI - 0.0080 194.095 - 0.022 192.747 - 0.061 279.461 - 0.114 287.548 - 0.229 289.345 - 0.311 289.345 - 0.382 292.041 - 0.478 294.288 - 0.587 296.534 - 0.701 297.882 - 0.828 301.926 - 0.981 300.128 - 1.116 299.679 - 1.233 296.085 - 1.323 293.389 - 1.488 289.795 - 1.594 287.099 - 1.676 287.548 - 1.701 293.838 - 1.75 286.65 - 1.797 290.244 - 1.868 280.359 - 1.956 275.866 - 2.052 276.316 - 2.126 265.982 - 2.181 224.198 - 2.234 163.094 - 2.292 97.946 - 2.359 49.872 - 2.428 15.276 - 2.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J270.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J270.rse deleted file mode 100644 index 9c8a04897d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J270.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - Pro-38-5G Green3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J280.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J280.eng deleted file mode 100644 index dd8bf4f41c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J280.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -J280SS 54.0 236.00 6-16 0.51200 0.95400 CTI - 0.10 259.43 - 0.30 278.91 - 0.60 293.07 - 0.90 306.85 - 1.20 319.19 - 1.50 321.10 - 1.80 310.85 - 2.11 279.89 - 2.35 286.70 - 2.40 269.17 - 2.44 178.24 - 2.49 42.80 - 2.54 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J280.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J280.rse deleted file mode 100644 index 9aefd5bec5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J280.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J285.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J285.eng deleted file mode 100644 index a9c783e705..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J285.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -J285 38.0 367.00 6-8-10-12-15 0.31250 0.59500 CTI - 0.06 351.01 - 0.15 346.01 - 0.25 357.64 - 0.50 363.90 - 0.75 369.26 - 1.03 343.33 - 1.27 337.07 - 1.51 317.40 - 1.75 282.53 - 1.93 127.86 - 2.02 84.94 - 2.25 11.02 - 2.26 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J285.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J285.rse deleted file mode 100644 index f00a6a6f8a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J285.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J290.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J290.eng deleted file mode 100644 index 626cb55f9d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J290.eng +++ /dev/null @@ -1,28 +0,0 @@ -; Pro-38-5G White -684-J290-WH-15A 38 367 7-8-9-11-12-13 0.3815 0.6597999999999999 CTI - 0.015 334.565 - 0.028 364.116 - 0.037 379.42 - 0.061 391.557 - 0.083 379.42 - 0.107 372.559 - 0.169 355.145 - 0.289 343.536 - 0.381 341.425 - 0.588 337.203 - 0.803 334.565 - 1.011 330.871 - 1.256 324.538 - 1.498 321.372 - 1.684 312.929 - 1.805 306.069 - 1.844 301.319 - 1.89 269.129 - 1.942 243.272 - 1.979 223.747 - 2.043 156.201 - 2.128 118.734 - 2.192 86.016 - 2.279 35.356 - 2.334 15.831 - 2.402 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J290.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J290.rse deleted file mode 100644 index e793843605..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J290.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - - Pro-38-5G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J293.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J293.eng deleted file mode 100644 index 57dda2e616..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J293.eng +++ /dev/null @@ -1,22 +0,0 @@ -; CTI Pro54-2G 838 J293BS 13A -J293BS 54 237 13-12-11-10-9-8-7-6-5-4-3 0.41600000000000004 0.84 CTI - 0.019 22.847 - 0.032 250.277 - 0.044 386.32 - 0.06 302.202 - 0.073 256.508 - 0.13 285.586 - 0.266 309.471 - 0.487 318.818 - 0.734 325.049 - 1.432 324.01 - 1.786 309.471 - 2.074 294.933 - 2.33 280.394 - 2.488 273.124 - 2.58 272.086 - 2.634 258.585 - 2.713 163.044 - 2.795 70.618 - 2.852 20.77 - 2.896 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J293.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J293.rse deleted file mode 100644 index 15ffafd990..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J293.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - CTI Pro54-2G 838 J293BS 13A - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J295.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J295.eng deleted file mode 100644 index 922671b287..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J295.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -J295 54.0 329.00 6-16 0.59400 1.11900 CTI - 0.04 450.52 - 0.28 428.70 - 0.54 423.25 - 1.00 391.61 - 1.48 352.34 - 1.99 304.35 - 2.51 266.17 - 3.00 243.26 - 3.50 216.92 - 3.67 126.54 - 3.82 64.36 - 4.00 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J295.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J295.rse deleted file mode 100644 index 1ee164c2b3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J295.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J300.eng deleted file mode 100644 index efabce695f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J300.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Cesaroni J300 -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J300 38 360 0 0.340032 0.606592 CSR - 0.043 357.026 - 0.131 436.586 - 0.221 407.925 - 0.310 399.528 - 0.400 400.588 - 0.490 406.733 - 0.578 414.302 - 0.667 417.117 - 0.756 418.415 - 0.846 421.302 - 0.935 422.229 - 1.025 415.951 - 1.114 406.356 - 1.202 395.237 - 1.292 381.728 - 1.381 369.861 - 1.471 355.451 - 1.560 331.691 - 1.649 246.243 - 1.738 161.766 - 1.827 109.478 - 1.917 71.413 - 2.006 37.058 - 2.096 13.880 - 2.185 5.059 - 2.275 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J300.rse deleted file mode 100644 index 870c6ba4d4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J300.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J316.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J316.eng deleted file mode 100644 index 372d6ae959..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J316.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pink 38mm 5G -; 654-J316-PK-17A -654-J316-PK-17A 38 367 17-14-12-10-8 0.3508 0.6071000000000001 CTI - 0.017 393.07 - 0.026 443.25 - 0.064 381.123 - 0.223 393.07 - 0.503 379.331 - 1.029 354.241 - 1.52 320.789 - 1.672 313.023 - 1.695 296.296 - 1.816 145.759 - 1.901 88.411 - 2.043 32.855 - 2.184 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J316.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J316.rse deleted file mode 100644 index 1a0a63f8f2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J316.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pink 38mm 5G -654-J316-PK-17A - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J325.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J325.rse deleted file mode 100644 index 16a9cb26a5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J325.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J330.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J330.eng deleted file mode 100644 index c1e8e5eab7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J330.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -J330 38.0 421.00 7-9-11-13-16 0.37500 0.70200 CTI - 0.05 459.32 - 0.16 448.20 - 0.27 440.41 - 0.51 437.08 - 0.75 427.07 - 1.02 412.61 - 1.26 387.03 - 1.50 360.34 - 1.69 321.41 - 1.79 300.28 - 1.91 126.79 - 1.99 107.88 - 2.23 22.56 - 2.26 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J330.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J330.rse deleted file mode 100644 index b9c27812ed..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J330.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J335.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J335.rse deleted file mode 100644 index e3c865641f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J335.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - Pro-38 Red Lightning 5G. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J354.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J354.eng deleted file mode 100644 index 04c69105c4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J354.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Pro-38-6G White -819-J354-WH-16A 38 421 7-8-9-11-12-13 0.45780000000000004 0.7782000000000001 CTI - 0.016 472.749 - 0.024 487.678 - 0.04 519.668 - 0.08 499.052 - 0.124 476.303 - 0.167 457.109 - 0.223 447.156 - 0.357 430.806 - 0.508 423.697 - 0.612 418.72 - 0.845 413.033 - 1.038 406.635 - 1.307 390.284 - 1.422 382.464 - 1.532 372.512 - 1.624 368.957 - 1.687 364.692 - 1.763 317.773 - 1.837 280.806 - 1.94 220.379 - 2.054 171.327 - 2.143 128.673 - 2.177 95.261 - 2.235 62.559 - 2.321 24.171 - 2.359 12.085 - 2.402 4.976 - 2.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J354.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J354.rse deleted file mode 100644 index 0b095edd57..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J354.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - - Pro-38-6G White - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J355.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J355.rse deleted file mode 100644 index e9dc1761ab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J355.rse +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J357.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J357.eng deleted file mode 100644 index 766151b5f7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J357.eng +++ /dev/null @@ -1,20 +0,0 @@ -J357BS 38 367 17-14-12-10-8 0.337 0.601 Cesaroni - 0.019 514.383 - 0.042 502.824 - 0.054 446.473 - 0.073 434.914 - 0.122 433.469 - 0.258 430.579 - 0.474 427.69 - 0.952 404.571 - 1.236 381.453 - 1.386 372.784 - 1.454 367.004 - 1.487 345.33 - 1.515 317.877 - 1.552 268.751 - 1.615 196.506 - 1.655 134.375 - 1.721 49.127 - 1.758 26.008 - 1.824 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J357.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J357.rse deleted file mode 100644 index 1352329af4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J357.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360.eng deleted file mode 100644 index c476c0c825..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360.eng +++ /dev/null @@ -1,21 +0,0 @@ -; CTI Pro54-3G 1016 J3360 Skidmark 15A -J360SM 54 321 6-8-10-12-15 0.606 1.104 CTI - 0.017 560.653 - 0.058 287.423 - 0.167 328.23 - 0.358 363.715 - 0.538 374.36 - 0.85 397.425 - 1.163 400.973 - 1.458 400.973 - 1.733 395.651 - 1.983 381.457 - 2.271 356.618 - 2.496 340.65 - 2.592 351.295 - 2.646 289.198 - 2.679 172.099 - 2.725 86.937 - 2.804 19.516 - 2.904 5.323 - 2.975 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360.rse deleted file mode 100644 index a1a272fbfb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - CTI Pro54-3G 1016 J3360 Skidmark 15A - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360_1.eng deleted file mode 100644 index 680fa32afb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Cesaroni J360 -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J360 38 419 0 0.409024 0.709184 CSR - 0.041 618.905 - 0.124 616.584 - 0.207 563.785 - 0.291 557.730 - 0.374 558.409 - 0.457 562.088 - 0.541 561.267 - 0.624 563.219 - 0.708 565.328 - 0.793 566.558 - 0.876 549.383 - 0.959 529.633 - 1.043 511.099 - 1.126 483.285 - 1.209 445.397 - 1.293 421.658 - 1.377 378.330 - 1.461 261.647 - 1.545 197.445 - 1.628 146.570 - 1.711 101.807 - 1.795 78.039 - 1.878 47.847 - 1.961 31.861 - 2.046 9.220 - 2.130 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360_1.rse deleted file mode 100644 index ddea273ad0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J360_1.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J380.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J380.eng deleted file mode 100644 index ebd8eff61c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J380.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -J380SS 54.0 320.00 6-16 0.76900 1.29330 CTI - 0.05 368.48 - 0.30 348.31 - 0.60 378.83 - 0.90 400.93 - 1.20 419.52 - 1.50 433.09 - 1.80 434.60 - 2.10 408.81 - 2.40 369.92 - 2.56 410.58 - 2.59 297.80 - 2.71 45.25 - 2.73 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J380.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J380.rse deleted file mode 100644 index 042725c2dc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J380.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J381.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J381.eng deleted file mode 100644 index 5e619095bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J381.eng +++ /dev/null @@ -1,12 +0,0 @@ -; CTI Pro38-6G 660 G381SK - 15A -J381SK 38 419 15-12-10-8-6 0.396 0.6880000000000001 CTI - 0.048 505.029 - 0.111 473.244 - 0.294 461.471 - 0.968 436.75 - 1.353 392.015 - 1.385 366.116 - 1.556 137.735 - 1.662 47.089 - 1.706 22.367 - 1.874 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J381.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J381.rse deleted file mode 100644 index e9b4fdc05c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J381.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - CTI Pro38-6G 660 G381SK - 15A - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J394.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J394.eng deleted file mode 100644 index 3d4e75a752..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J394.eng +++ /dev/null @@ -1,38 +0,0 @@ -; Pro-386GXL Green3 -970-J394-GR-13A 38 500 4-7-9-11-13-14 0.5721 0.9389 CTI - 0.014 331.731 - 0.038 359.203 - 0.046 406.593 - 0.08 441.621 - 0.219 426.511 - 0.331 421.703 - 0.486 422.39 - 0.657 423.764 - 0.795 430.632 - 0.936 436.813 - 1.12 439.56 - 1.297 445.742 - 1.329 440.247 - 1.381 449.176 - 1.425 448.489 - 1.472 448.489 - 1.512 458.791 - 1.544 447.802 - 1.572 462.225 - 1.624 456.731 - 1.731 445.742 - 1.801 456.731 - 1.853 456.731 - 1.873 474.588 - 1.885 491.758 - 1.952 451.923 - 2.008 416.896 - 2.034 385.302 - 2.078 376.374 - 2.152 296.703 - 2.229 203.297 - 2.305 133.242 - 2.395 65.934 - 2.48 19.231 - 2.518 7.555 - 2.55 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J394.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J394.rse deleted file mode 100644 index 39f6631edf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J394.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - - Pro-386GXL Green3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J395.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J395.rse deleted file mode 100644 index 78e06660ce..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J395.rse +++ /dev/null @@ -1,67 +0,0 @@ - - - - Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J400.eng deleted file mode 100644 index ab756c1560..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J400.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -J400SS 38.0 421.00 7-9-11-13-16 0.48960 0.70200 CTI - 0.05 451.79 - 0.20 461.14 - 0.31 465.81 - 0.44 463.47 - 0.60 477.48 - 0.80 482.15 - 1.00 461.31 - 1.20 433.12 - 1.35 402.76 - 1.40 382.92 - 1.47 321.04 - 1.55 258.00 - 1.60 178.62 - 1.73 14.58 - 1.75 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J400.rse deleted file mode 100644 index cf2d3e6896..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J400.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J401.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J401.rse deleted file mode 100644 index 75e0e69688..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J401.rse +++ /dev/null @@ -1,61 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J410.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J410.eng deleted file mode 100644 index e176b034ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J410.eng +++ /dev/null @@ -1,23 +0,0 @@ -; Pro38 Red Lightning 6G. -J410-16A 38 421 16 0.4098 0.735 CTI - 0.023 375.45 - 0.029 446.221 - 0.042 510.996 - 0.11 499.0 - 0.22 495.402 - 0.442 491.803 - 0.675 475.01 - 0.901 464.214 - 1.092 448.62 - 1.221 437.825 - 1.34 429.428 - 1.492 419.832 - 1.553 389.844 - 1.592 349.06 - 1.65 273.491 - 1.689 196.721 - 1.75 122.351 - 1.809 64.774 - 1.889 28.788 - 1.941 13.195 - 1.989 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J410.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J410.rse deleted file mode 100644 index ddef2eecd5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J410.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J420.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J420.eng deleted file mode 100644 index 987813cd6d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J420.eng +++ /dev/null @@ -1,15 +0,0 @@ -J420-CL 38 500 6-8-10-12-15 0.522 0.874 CTI -0.015 360 -0.02 660 -0.035 800 -0.075 660 -0.25 625 -0.7 560 -1.45 495 -1.51 480 -1.62 350 -1.8 220 -1.9 150 -2 120 -2.25 48 -2.62 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J420.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J420.rse deleted file mode 100644 index 6c7a0ca0e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J420.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J425.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J425.eng deleted file mode 100644 index f220b24b9f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J425.eng +++ /dev/null @@ -1,83 +0,0 @@ -; Pro38 784J425-16A -J425 38 409.2 16-13-11-9-7 0.405 0.7000000000000001 CTI - 0.0060 4.399 - 0.01 92.386 - 0.011 272.759 - 0.012 434.068 - 0.013 507.39 - 0.016 589.511 - 0.02 668.699 - 0.021 720.025 - 0.027 659.901 - 0.037 632.038 - 0.053 589.511 - 0.069 566.048 - 0.098 554.317 - 0.135 552.85 - 0.167 548.451 - 0.206 546.984 - 0.251 542.585 - 0.289 542.585 - 0.326 538.186 - 0.369 533.786 - 0.41 526.454 - 0.455 527.921 - 0.489 523.521 - 0.508 520.588 - 0.524 520.588 - 0.561 517.655 - 0.589 522.055 - 0.62 517.655 - 0.656 513.256 - 0.687 510.323 - 0.72 505.924 - 0.75 507.39 - 0.787 505.924 - 0.818 504.457 - 0.856 500.058 - 0.887 495.659 - 0.919 494.192 - 0.952 492.726 - 0.987 489.793 - 1.017 489.793 - 1.05 485.394 - 1.078 482.461 - 1.113 482.461 - 1.146 479.528 - 1.18 479.528 - 1.217 472.196 - 1.252 473.662 - 1.288 470.729 - 1.321 464.863 - 1.348 451.665 - 1.366 431.135 - 1.382 401.806 - 1.395 378.343 - 1.407 357.813 - 1.421 338.749 - 1.445 325.551 - 1.476 313.819 - 1.498 300.621 - 1.521 278.625 - 1.541 249.296 - 1.556 224.366 - 1.568 206.769 - 1.58 184.772 - 1.596 161.309 - 1.607 140.779 - 1.625 117.316 - 1.641 93.853 - 1.67 73.322 - 1.69 63.057 - 1.717 52.792 - 1.745 48.393 - 1.772 45.46 - 1.796 42.527 - 1.821 42.527 - 1.849 38.128 - 1.884 29.329 - 1.906 26.396 - 1.929 19.064 - 1.955 16.131 - 1.978 10.265 - 1.996 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J430.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J430.eng deleted file mode 100644 index 8217f4c5a5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J430.eng +++ /dev/null @@ -1,27 +0,0 @@ -; Pro-54-2G White Thunder -821-J430-WT-18A 54 236 8-10-11-13-14-15-16 0.384 0.7998 CTI - 0.017 400.0 - 0.025 501.107 - 0.034 538.745 - 0.069 432.472 - 0.111 440.59 - 0.192 458.303 - 0.328 469.373 - 0.508 473.801 - 0.697 473.801 - 0.899 468.635 - 0.996 461.255 - 1.2 446.494 - 1.401 429.52 - 1.593 415.498 - 1.696 410.332 - 1.739 414.76 - 1.785 354.244 - 1.807 277.491 - 1.83 180.074 - 1.839 145.387 - 1.853 107.749 - 1.885 49.446 - 1.914 19.188 - 1.943 2.952 - 1.963 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J430.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J430.rse deleted file mode 100644 index d0166d47b4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J430.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - Pro-54-2G White Thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J440.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J440.eng deleted file mode 100644 index 54d1f807e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J440.eng +++ /dev/null @@ -1,16 +0,0 @@ -J440-BB 54 326 0 0.536 1.229 AMW/ProX -0.01 30 -0.02 700 -0.06 790 -0.1 800 -0.2 760 -0.4 725 -0.6 695 -0.8 680 -1 658 -1.32 600 -1.55 400 -1.7 180 -1.87 175 -2 75 -2.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J440.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J440.rse deleted file mode 100644 index 2cbbf9c5b8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J440.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J449.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J449.eng deleted file mode 100644 index 87b8d73dcf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J449.eng +++ /dev/null @@ -1,24 +0,0 @@ -; CTI Pro54-3G 1261 J449BS 15A -J449BS 54 321 15-14-13-12-11-10-9-8-7-6-5 0.624 1.122 CTI - 0.012 16.22 - 0.021 330.299 - 0.027 504.295 - 0.046 586.87 - 0.055 508.719 - 0.07 440.89 - 0.137 477.754 - 0.241 495.448 - 0.348 505.77 - 0.69 514.617 - 1.153 504.295 - 1.938 468.906 - 2.292 452.686 - 2.417 455.635 - 2.475 446.788 - 2.505 440.89 - 2.52 408.45 - 2.566 293.435 - 2.612 157.777 - 2.688 69.304 - 2.771 28.016 - 2.847 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J449.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J449.rse deleted file mode 100644 index 7d2b0fff70..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J449.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - CTI Pro54-3G 1261 J449BS 15A - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J453.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J453.eng deleted file mode 100644 index e09b402b3e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J453.eng +++ /dev/null @@ -1,14 +0,0 @@ -; White 38mm 6GXL -; 1013-J453-WH-16A -1013-J453-WH-16A 38 500 16-13-11-9-7 0.6132 0.9643 CTI - 0.018 663.789 - 0.04 725.18 - 0.105 630.216 - 0.23 578.417 - 0.451 543.885 - 1.454 535.252 - 1.797 291.607 - 1.91 188.969 - 2.088 128.537 - 2.276 19.185 - 2.364 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J453.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J453.rse deleted file mode 100644 index 15216234bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J453.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - White 38mm 6GXL -1013-J453-WH-16A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475.eng deleted file mode 100644 index 92f798a161..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475.eng +++ /dev/null @@ -1,23 +0,0 @@ -J475-BB 54 403 0 0.714 1.493 AMW/ProX -0.03 30 -0.04 500 -0.075 600 -0.1 515 -0.2 530 -0.4 540 -0.6 535 -0.8 535 -1 530 -1.2 520 -1.4 510 -1.6 500 -1.8 490 -2 480 -2.2 490 -2.28 450 -2.43 180 -2.5 100 -2.6 60 -2.8 28 -3 10 -3.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475.rse deleted file mode 100644 index c5810da343..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475_1.rse deleted file mode 100644 index 5785fc8592..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J475_1.rse +++ /dev/null @@ -1,71 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J520.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J520.eng deleted file mode 100644 index d51cb9bd6d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J520.eng +++ /dev/null @@ -1,22 +0,0 @@ -;CTI Pro38-6GXL 848 G520SK - 16A -J520SK 38 500 16-13-11-9-7 0.498 0.85 CTI -0.034 658.701 -0.076 614.964 -0.12 585.807 -0.225 580.505 -0.533 622.916 -0.724 626.893 -0.83 612.314 -0.982 607.012 -1.17 595.084 -1.259 569.902 -1.296 458.573 -1.329 405.558 -1.378 388.329 -1.418 302.181 -1.461 197.478 -1.493 135.186 -1.529 87.473 -1.587 45.062 -1.756 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J520.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J520.rse deleted file mode 100644 index 0eddd1d235..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J520.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - CTI Pro38-6GXL 848 G520SK - 16A - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J530.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J530.eng deleted file mode 100644 index 580d315bb5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J530.eng +++ /dev/null @@ -1,16 +0,0 @@ -J530-IM 38 500 6-8-10-12-15 0.625 0.977 CTI -0.01 30 -0.02 700 -0.06 790 -0.1 800 -0.2 760 -0.4 725 -0.6 695 -0.8 680 -1 658 -1.32 600 -1.55 400 -1.7 180 -1.87 175 -2 75 -2.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J530.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J530.rse deleted file mode 100644 index d2de10d102..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J530.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J580.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J580.eng deleted file mode 100644 index 6f5a64d0f4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J580.eng +++ /dev/null @@ -1,25 +0,0 @@ -; CTI Pro38-6GXL 896 J580SS - 17A -J580SS 38 510 17-14-12-10-8 0.6880000000000001 1.044 CTI - 0.0060 82.313 - 0.013 460.952 - 0.016 692.925 - 0.031 600.136 - 0.041 634.557 - 0.058 624.081 - 0.243 621.088 - 0.405 621.088 - 0.511 631.564 - 0.632 646.53 - 0.898 671.972 - 1.019 686.938 - 1.098 691.428 - 1.163 674.965 - 1.229 514.829 - 1.325 496.87 - 1.36 445.986 - 1.405 332.245 - 1.461 221.496 - 1.518 71.837 - 1.559 28.435 - 1.59 8.98 - 1.613 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J580.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J580.rse deleted file mode 100644 index afa552b917..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J580.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - CTI Pro38-6GXL 896 J580SS - 17A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J595.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J595.eng deleted file mode 100644 index b975fec6a3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J595.eng +++ /dev/null @@ -1,23 +0,0 @@ -;CTI Pro38-6GXL 985 J595BS - 16A -J595BS 38 500 16-13-11-9-7 0.511 0.866 CTI -0.009 644.368 -0.015 924.98 -0.032 868.858 -0.075 752.456 -0.168 729.591 -0.315 719.198 -0.475 712.962 -0.632 712.962 -0.775 704.648 -0.897 702.569 -0.979 700.491 -1.109 683.862 -1.178 600.718 -1.226 507.18 -1.293 411.564 -1.451 270.219 -1.529 205.782 -1.614 112.245 -1.644 58.201 -1.707 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J595.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J595.rse deleted file mode 100644 index b84d9a50b0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J595.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - CTI Pro38-6GXL 985 J595BS - 16A - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J600.eng deleted file mode 100644 index 665185c69f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J600.eng +++ /dev/null @@ -1,23 +0,0 @@ -; CTI Pro38-6GXL 999 J600RL - 16A -J600RL 38 510 16-13-11-9-7 0.551 0.906 CTI - 0.011 533.291 - 0.023 683.326 - 0.029 721.949 - 0.051 721.949 - 0.091 701.152 - 0.202 701.152 - 0.376 696.695 - 0.572 698.181 - 0.72 696.695 - 0.847 698.181 - 0.963 711.55 - 1.028 720.463 - 1.109 710.065 - 1.19 698.181 - 1.245 681.84 - 1.304 610.537 - 1.385 420.394 - 1.408 371.373 - 1.515 147.064 - 1.61 62.391 - 1.716 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J600.rse deleted file mode 100644 index 0e777a2dc9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J600.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - CTI Pro38-6GXL 999 J600RL - 16A - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J745.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J745.rse deleted file mode 100644 index 995c03ff3a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J745.rse +++ /dev/null @@ -1,75 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J760.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J760.eng deleted file mode 100644 index 3a066b50f8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J760.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Pro-54-3G White Thunder -1266-J760-WT-19A 54 329 8-10-12-14-16-18-19 0.5760 1.0768 CTI - 0.012 600.251 - 0.019 833.333 - 0.026 938.596 - 0.04 794.486 - 0.054 756.892 - 0.094 778.195 - 0.129 800.752 - 0.165 813.283 - 0.218 825.815 - 0.279 830.827 - 0.377 835.84 - 0.496 837.093 - 0.617 829.574 - 0.709 819.549 - 0.811 802.005 - 0.917 785.714 - 1.041 764.411 - 1.201 750.627 - 1.331 741.855 - 1.455 729.323 - 1.488 729.323 - 1.514 735.589 - 1.556 749.373 - 1.568 729.323 - 1.575 665.414 - 1.589 533.835 - 1.616 327.068 - 1.646 122.807 - 1.659 72.682 - 1.681 30.075 - 1.713 6.266 - 1.731 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J760.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J760.rse deleted file mode 100644 index 710cee22f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J760.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - - Pro-54-3G White Thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J94.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J94.rse deleted file mode 100644 index 080ad02c80..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_J94.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - CTI 644-J94-MY-P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1075.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1075.eng deleted file mode 100644 index 11597221fb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1075.eng +++ /dev/null @@ -1,41 +0,0 @@ -; AMW 54-2500 Skidmark Plugged -2245-K1075-SK-P 54 728 P 1.259 2.6388 CTI - 0.0070 1574.366 - 0.012 1038.184 - 0.017 1476.101 - 0.024 1083.044 - 0.029 1365.02 - 0.034 1117.223 - 0.041 1266.756 - 0.046 1162.083 - 0.049 1226.168 - 0.069 1159.947 - 0.107 1130.04 - 0.151 1108.678 - 0.21 1100.134 - 0.274 1102.27 - 0.332 1102.27 - 0.432 1115.087 - 0.523 1119.359 - 0.611 1132.176 - 0.674 1140.721 - 0.766 1149.266 - 0.881 1159.947 - 0.979 1179.172 - 1.141 1191.989 - 1.257 1189.853 - 1.379 1191.989 - 1.504 1202.67 - 1.599 1211.215 - 1.67 1232.577 - 1.744 1249.666 - 1.772 1226.168 - 1.802 1155.674 - 1.841 993.324 - 1.888 736.983 - 1.944 455.007 - 2.002 267.023 - 2.065 128.171 - 2.11 68.358 - 2.149 34.179 - 2.198 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1075.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1075.rse deleted file mode 100644 index e4bfa0b69e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1075.rse +++ /dev/null @@ -1,54 +0,0 @@ - - - - AMW 54-2500 Skidmark Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1085.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1085.rse deleted file mode 100644 index 0b7fc1e643..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1085.rse +++ /dev/null @@ -1,54 +0,0 @@ - - - -White Thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1130.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1130.eng deleted file mode 100644 index 80fb6e188f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1130.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Blue Baboon -K1130-BB 54 728 0 1.359 2.574 AMW/ProX -0.01 1000 -0.013 1490 -0.02 1548 -0.04 1500 -0.09 1335 -0.2 1325 -1 1325 -1.5 1325 -1.63 1345 -1.7 1155 -1.8 805 -1.9 685 -2 475 -2.1 315 -2.2 145 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1130.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1130.rse deleted file mode 100644 index 46c6f6b227..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1130.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1200.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1200.rse deleted file mode 100644 index a5be0dc194..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1200.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1250.eng deleted file mode 100644 index ee6b3a2695..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1250.eng +++ /dev/null @@ -1,18 +0,0 @@ -K1250-WW 54 491 0 0.925 1.815 AMW/ProX -0.01 600 -0.02 1400 -0.03 1610 -0.05 1360 -0.07 1410 -0.1 1440 -0.15 1470 -0.2 1480 -0.4 1480 -0.8 1395 -1.28 1185 -1.36 985 -1.4 680 -1.45 570 -1.5 210 -1.6 60 -1.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1250.rse deleted file mode 100644 index 00369aad5c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1250.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1440.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1440.rse deleted file mode 100644 index 6874db44cf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1440.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K160.eng deleted file mode 100644 index 855a6b8c46..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K160.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro54 4G 1526 K160-CL 6 -K160-CL 54 404 6 0.848 1.472 CTI - 0.027 160.187 - 0.08 242.037 - 0.321 260.656 - 0.455 259.602 - 0.957 270.492 - 1.593 272.248 - 2.102 265.222 - 2.564 254.333 - 2.925 239.578 - 3.956 190.047 - 5.301 138.759 - 7.617 67.799 - 9.19 25.644 - 9.572 15.808 - 9.679 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K160.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K160.rse deleted file mode 100644 index 8f905989f2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K160.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro54 4G 1526 K160-CL 6 - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1620.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1620.rse deleted file mode 100644 index b84dad6bb9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1620.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1720.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1720.rse deleted file mode 100644 index d07a1eb699..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K1720.rse +++ /dev/null @@ -1,65 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve from the AMW web site and CAR/NAR/TRA certified -rocket motor list dated 9/28/08. The total weight was estimated based on -similar motors such as the K455TT, K535RR and K665BB. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2000.eng deleted file mode 100644 index 1ebeedd0b0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2000.eng +++ /dev/null @@ -1,16 +0,0 @@ -; VMax 75mm 2G -; 2330-K2000-VM-P -2330-K2000-VM-P 75 350 P 1.1642 2.4645 CTI - 0.01 1979.532 - 0.029 1634.503 - 0.161 1947.368 - 0.321 2190.058 - 0.457 2397.661 - 0.548 2473.684 - 0.678 2383.041 - 0.768 2263.158 - 0.977 1923.977 - 1.027 1883.041 - 1.104 859.649 - 1.149 87.719 - 1.191 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2000.rse deleted file mode 100644 index addbb82af7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2000.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - VMax 75mm 2G -2330-K2000-VM-P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2045.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2045.eng deleted file mode 100644 index b9651c3bfd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2045.eng +++ /dev/null @@ -1,28 +0,0 @@ -;Cesaroni Pro54 K2045 Vmax -;By Karl Baumheckel -;from rocksim file by Thomas Raithby 11/28/09 -K2045Vmax 54 404 7-10-13-15-17 0.716 1.290 CTI -0.01 1165.25 -0.02 1854.79 -0.03 1907.47 -0.04 1947.47 -0.05 1944.77 -0.06 1970.16 -0.07 1994.77 -0.08 1998.62 -0.09 2018.23 -0.1 2034.77 -0.15 2042.46 -0.2 2138.98 -0.3 2183.98 -0.4 2164.75 -0.5 2148.98 -0.6 2154.75 -0.65 2091.91 -0.67 1507.52 -0.68 982.58 -0.69 481.87 -0.7 184.59 -0.72 36.15 -0.734 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2045.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2045.rse deleted file mode 100644 index 9aea9b4f69..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K2045.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K260.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K260.eng deleted file mode 100644 index a5dfb7b4eb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K260.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Pro54 6G 2285 K260-CL P -; Longburn -K260-CL 54 572 P 1.2413 2.0475 CTI - 0.042 325.731 - 0.101 430.409 - 0.422 422.807 - 0.773 426.901 - 1.178 429.825 - 1.517 425.731 - 2.011 413.45 - 3.195 356.725 - 4.51 289.474 - 6.015 174.269 - 6.997 91.228 - 7.366 66.667 - 7.902 43.275 - 8.479 25.731 - 8.687 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K260.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K260.rse deleted file mode 100644 index 9965fe31bf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K260.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro54 6G 2285 K260-CL P -Longburn - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K261.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K261.eng deleted file mode 100644 index 90598430a4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K261.eng +++ /dev/null @@ -1,27 +0,0 @@ -; Pro-54-5G White Long Burn Plugged -2021-K261-WH_LB-P 54 488 P 1.1519 1.9317 CTI - 0.035 283.061 - 0.069 321.706 - 0.124 345.797 - 0.228 336.763 - 0.525 347.302 - 0.85 359.348 - 1.334 356.336 - 1.79 359.348 - 2.039 354.329 - 2.412 353.325 - 2.793 349.812 - 3.131 344.291 - 3.774 323.714 - 4.652 278.545 - 5.281 230.866 - 5.571 206.775 - 5.993 166.625 - 6.325 137.516 - 6.615 102.384 - 7.085 55.207 - 7.362 35.634 - 7.694 20.577 - 8.129 9.536 - 8.502 2.509 - 8.979 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K261.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K261.rse deleted file mode 100644 index 84278eb955..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K261.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - Pro-54-5G White Long Burn Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K300.eng deleted file mode 100644 index d0bb41bf53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K300.eng +++ /dev/null @@ -1,21 +0,0 @@ -;Pro54 6GXL 2546 K300-CL P -;Longburn -;Uses a new threaded forward closure -K300-CL 54 649 0 1.3776 2.27 CTI -0.036 495.273 -0.132 543.273 -0.265 506.909 -0.734 493.091 -1.258 489.455 -1.811 482.909 -2.467 453.818 -3.737 375.273 -4.705 299.636 -6.047 165.091 -6.474 120.727 -6.829 90.182 -7.323 63.273 -7.72 46.545 -8.309 30.545 -8.37 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K300.rse deleted file mode 100644 index 1c3c24cd59..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K300.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - Pro54 6GXL 2546 K300-CL P -Longburn -Uses a new threaded forward closure - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K360.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K360.eng deleted file mode 100644 index 9896fed3c9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K360.eng +++ /dev/null @@ -1,13 +0,0 @@ -; Pro54-3G White 1281-K360 -1281-K360-WH-13A 54 236 13-10-8-6-4 0.747 1.232 CTI - 0.034 289.25 - 0.077 362.318 - 0.463 387.514 - 1.106 398.6 - 1.564 405.151 - 2.063 398.6 - 2.57 383.483 - 3.101 354.759 - 3.18 343.673 - 3.417 105.319 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K360.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K360.rse deleted file mode 100644 index b7aa8981d1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K360.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - Pro54-3G White 1281-K360 - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K400.eng deleted file mode 100644 index d9e2b1a169..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K400.eng +++ /dev/null @@ -1,12 +0,0 @@ -; Pro54 4G 1597 K400-GR 14A -K400-GR 54 404 14-13-12-11-10-9-8-7-6-5-4 0.969 1.5513 CTI - 0.014 359.164 - 0.102 475.4 - 1.193 444.649 - 2.807 384.994 - 3.364 370.234 - 3.599 363.469 - 3.693 329.028 - 3.859 169.742 - 3.967 57.196 - 4.017 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K400.rse deleted file mode 100644 index 6ce4061ed0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K400.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - Pro54 4G 1597 K400-GR 14A - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K445.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K445.eng deleted file mode 100644 index 366ef5b457..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K445.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -K445 54.0 404.00 7-17 0.79200 1.39800 CTI - 0.05 664.83 - 0.19 640.68 - 0.48 622.98 - 1.00 576.29 - 1.51 515.12 - 2.00 442.68 - 2.50 392.26 - 3.02 350.93 - 3.13 339.66 - 3.31 210.88 - 3.47 78.88 - 3.67 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K445.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K445.rse deleted file mode 100644 index e666bf80fd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K445.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K454.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K454.eng deleted file mode 100644 index 2579ece441..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K454.eng +++ /dev/null @@ -1,18 +0,0 @@ -K454-SK 54 404 10-11-12-13-14-15-16-17-18-19 0.821 1.391 CTI -0.021 10 -0.028 421 -0.032 586 -0.069 405 -0.2 475 -0.4 510 -0.6 530 -0.9 532 -1.2 525 -1.6 505 -2 470 -2.4 415 -2.55 410 -2.69 430 -2.93 70 -3 27 -3.15 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K454.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K454.rse deleted file mode 100644 index 51d068bf58..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K454.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K455.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K455.rse deleted file mode 100644 index 5517d6ca42..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K455.rse +++ /dev/null @@ -1,59 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K490.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K490.eng deleted file mode 100644 index 2728b8e3a6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K490.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro54-5G 1990K490-GR 16A -K490-GR 54 488 16-15-14-13-12-11-10-9-8-7-6 1.2012 1.8540999999999999 CTI - 0.013 445.79 - 0.024 376.662 - 0.083 559.232 - 0.121 584.047 - 0.316 573.412 - 0.727 569.867 - 1.116 553.914 - 1.875 522.009 - 1.893 593.796 - 1.944 519.35 - 2.658 479.468 - 3.063 473.264 - 3.358 444.018 - 3.618 448.449 - 3.894 240.177 - 4.055 31.019 - 4.066 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K490.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K490.rse deleted file mode 100644 index e2201ed38a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K490.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro54-5G 1990K490-GR 16A - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K500.rse deleted file mode 100644 index 099b72f09f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K500.rse +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510.eng deleted file mode 100644 index c673b791d9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; Cesaroni Pro75 2486K510 -; 'Classic Propellant' -; -; RockSim file by Kathy Miller -; wRasp Adaptation by Len Lekx -; -K510 75 350 0 1.19 2.59 CTI -0.10 645.25 -0.30 689.75 -0.50 658.60 -1.00 636.35 -1.60 600.75 -2.00 565.15 -2.40 534.00 -2.50 525.10 -3.00 471.70 -3.50 422.75 -3.70 400.50 -4.00 391.60 -4.40 382.70 -4.50 378.25 -4.60 333.75 -4.70 66.75 -4.84 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510.rse deleted file mode 100644 index e0c2c81295..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510_1.eng deleted file mode 100644 index ca5e64db02..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K510_1.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; -K510 75.0 350.00 0 1.19700 2.59000 CTI - 0.04 394.38 - 0.07 617.68 - 0.10 645.17 - 0.21 658.16 - 0.35 669.23 - 0.53 667.72 - 0.82 661.58 - 1.18 626.92 - 1.72 588.46 - 2.15 557.69 - 2.39 542.31 - 2.90 492.86 - 3.07 470.31 - 3.56 426.81 - 3.98 398.96 - 4.32 393.98 - 4.48 380.63 - 4.60 364.22 - 4.65 290.91 - 4.80 91.23 - 4.84 45.82 - 4.84 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K515.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K515.eng deleted file mode 100644 index 79397a14eb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K515.eng +++ /dev/null @@ -1,21 +0,0 @@ -K515-SK 54 488 6-7-8-9-10-11-12-13-14-15-16 1.013 1.654 CTI -0.01 10 -0.02 250 -0.028 550 -0.035 710 -0.06 540 -0.065 530 -0.1 560 -0.25 600 -0.5 612 -0.75 612 -1.1 602 -1.5 578 -2 531 -2.6 460 -2.78 458 -2.85 450 -2.95 300 -3.03 200 -3.18 40 -3.35 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K515.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K515.rse deleted file mode 100644 index e163066fee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K515.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K520.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K520.rse deleted file mode 100644 index c7829a05b4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K520.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - CTI 1711-K520-WH-17A - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K530.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K530.eng deleted file mode 100644 index df2132f99b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K530.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -K530SS 54.0 404.00 6-16 1.02500 1.63980 CTI - 0.05 533.59 - 0.09 503.98 - 0.29 514.09 - 0.60 534.31 - 0.90 557.41 - 1.20 577.63 - 1.50 587.74 - 1.80 596.40 - 2.10 535.44 - 2.31 502.54 - 2.47 551.63 - 2.56 393.94 - 2.60 274.37 - 2.64 137.19 - 2.67 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K530.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K530.rse deleted file mode 100644 index 696bd2917b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K530.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K535.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K535.rse deleted file mode 100644 index 9830181a71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K535.rse +++ /dev/null @@ -1,85 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K555.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K555.eng deleted file mode 100644 index 22538323d3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K555.eng +++ /dev/null @@ -1,14 +0,0 @@ -; Pro75-2G White 2406-K555 -2406-K555-WH-P 75 350 P 1.486 2.759 CTI - 0.038 426.052 - 0.07 585.324 - 0.137 522.412 - 0.751 543.914 - 1.732 629.124 - 2.057 639.477 - 3.221 571.786 - 3.84 516.041 - 4.091 472.241 - 4.163 398.976 - 4.274 148.919 - 4.314 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K555.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K555.rse deleted file mode 100644 index 16714eab26..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K555.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - Pro75-2G White 2406-K555 - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K570.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K570.eng deleted file mode 100644 index 0b41307997..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K570.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -K570 54.0 488.00 7-17 0.99000 1.68500 CTI - 0.04 892.67 - 0.50 797.99 - 1.00 738.68 - 1.50 659.37 - 2.00 585.96 - 2.50 512.88 - 2.97 417.16 - 3.20 224.79 - 3.47 67.00 - 3.59 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K570.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K570.rse deleted file mode 100644 index 0e880b4724..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K570.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K575.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K575.eng deleted file mode 100644 index 9beb7b4f34..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K575.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; -K575SS 75 395 1000 1.803 3.143 Cesaroni -0 16 -0.11 664.5 -0.43 620.2 -0.87 629 -1.3 637.92 -1.73 637.92 -2.17 629 -2.6 615.77 -3.03 553.75 -3.47 518.31 -3.9 438.57 -4.18 79.74 -4.33 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K575.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K575.rse deleted file mode 100644 index d03b9f37d0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K575.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K580.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K580.eng deleted file mode 100644 index 0d67f6e01b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K580.eng +++ /dev/null @@ -1,48 +0,0 @@ -;Created by Jesus Manuel Recuenco Andres 2011 -;with Tctracer v1.0 -K580 54.0 491.00 1000 0.89500 1.82300 Cesaroni - 0.02 624.92 - 0.03 1076.60 - 0.07 846.73 - 0.12 884.56 - 0.20 855.46 - 0.29 840.91 - 0.39 835.09 - 0.48 822.58 - 0.56 808.60 - 0.66 800.62 - 0.74 784.64 - 0.83 776.66 - 0.90 762.68 - 0.96 760.68 - 1.03 748.71 - 1.10 734.32 - 1.14 713.24 - 1.18 720.75 - 1.27 704.78 - 1.35 682.82 - 1.43 666.85 - 1.51 650.87 - 1.59 632.91 - 1.67 622.92 - 1.73 604.95 - 1.79 598.96 - 1.86 579.00 - 1.94 561.03 - 1.99 559.03 - 2.03 539.07 - 2.09 533.08 - 2.16 517.11 - 2.24 507.12 - 2.31 491.15 - 2.39 477.18 - 2.45 463.20 - 2.51 442.28 - 2.55 407.36 - 2.60 360.81 - 2.65 320.07 - 2.69 276.42 - 2.76 232.78 - 2.82 194.95 - 2.96 122.21 - 3.20 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K590.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K590.rse deleted file mode 100644 index 0cbf921617..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K590.rse +++ /dev/null @@ -1,52 +0,0 @@ - - - - Dual-Thrust - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K600.rse deleted file mode 100644 index f99327193b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K600.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 2130-K600-WH-17A - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K610.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K610.eng deleted file mode 100644 index 1a15953dff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K610.eng +++ /dev/null @@ -1,21 +0,0 @@ -; Skidmark -K610-SK 54 491 0 0.866 1.765 AMW/ProX -0.01 300 -0.02 745 -0.035 650 -0.06 560 -0.12 635 -0.21 670 -0.4 695 -0.7 700 -1 690 -1.35 665 -1.7 630 -2.05 585 -2.19 590 -2.24 500 -2.3 350 -2.4 205 -2.5 60 -2.6 15 -2.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K610.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K610.rse deleted file mode 100644 index 13eba8ff8f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K610.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K630.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K630.eng deleted file mode 100644 index e3fdc33d31..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K630.eng +++ /dev/null @@ -1,25 +0,0 @@ -; CTI Pro54-4G 1679 K630BS 15A -K630BS 54 405 15-14-13-12-11-10-9-8-7-6-5 0.912 1.41 CTI - 0.014 164.444 - 0.025 676.277 - 0.034 791.388 - 0.059 781.111 - 0.074 674.222 - 0.102 705.055 - 0.212 713.277 - 0.696 715.333 - 0.974 721.5 - 1.143 709.166 - 1.489 680.389 - 2.055 629.0 - 2.284 612.555 - 2.318 587.889 - 2.355 518.0 - 2.389 427.555 - 2.417 382.333 - 2.471 349.444 - 2.51 265.167 - 2.57 127.444 - 2.598 76.056 - 2.646 49.333 - 2.816 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K630.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K630.rse deleted file mode 100644 index 0d6ab78935..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K630.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - CTI Pro54-4G 1679 K630BS 15A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K635.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K635.rse deleted file mode 100644 index 409c7399aa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K635.rse +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650.eng deleted file mode 100644 index 153d50f660..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650.eng +++ /dev/null @@ -1,12 +0,0 @@ -;Pink 54mm 5G -;1997-K650-PK-21 -1997-K650-PK-21 54 488 21-19-17-15-13-11 1.0651 1.71 CTI -0.011 1353.5 -0.028 793.832 -0.186 815.421 -2.578 601.186 -2.689 479.953 -2.855 189.324 -3.086 43.179 -3.451 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650.rse deleted file mode 100644 index 3bc2f6b69a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650.rse +++ /dev/null @@ -1,25 +0,0 @@ - - - - Pink 54mm 5G -1997-K650-PK-21 - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650_1.eng deleted file mode 100644 index 8d9f29d170..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650_1.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -K650SS 54.0 488.00 6-16 1.28100 1.98990 CTI - 0.04 664.52 - 0.12 645.90 - 0.31 642.24 - 0.60 664.78 - 0.91 684.59 - 1.22 712.82 - 1.50 723.41 - 1.80 728.70 - 2.10 664.52 - 2.40 614.68 - 2.51 680.53 - 2.55 534.62 - 2.61 268.19 - 2.66 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650_1.rse deleted file mode 100644 index 190a5760ca..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K650_1.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K660.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K660.eng deleted file mode 100644 index 41caa36a7f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K660.eng +++ /dev/null @@ -1,19 +0,0 @@ -; -; -K660 54.0 572.00 7-17 1.17700 1.94900 CTI - 0.07 1078.90 - 0.23 1006.47 - 0.40 966.76 - 0.80 897.52 - 1.20 842.72 - 1.60 794.15 - 2.01 744.52 - 2.40 692.27 - 2.54 671.37 - 2.68 439.08 - 2.80 400.68 - 3.01 386.90 - 3.20 234.31 - 3.45 106.65 - 3.60 44.03 - 3.69 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K660.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K660.rse deleted file mode 100644 index 96c6149aa2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K660.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K661.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K661.eng deleted file mode 100644 index f3b9aae0e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K661.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Blue Streak 75mm 2G -; 2430-K661-BS-P -2430-K661-BS-P 75 350 P 1.2625 2.5278 CTI - 0.041 588.591 - 0.073 659.371 - 0.122 635.157 - 0.225 634.226 - 0.679 713.388 - 1.039 751.572 - 1.241 758.091 - 1.832 727.357 - 2.298 687.311 - 2.729 667.753 - 3.195 645.402 - 3.367 670.547 - 3.584 182.538 - 3.672 55.879 - 3.72 18.626 - 3.798 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K661.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K661.rse deleted file mode 100644 index 3d325976f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K661.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - Blue Streak 75mm 2G -2430-K661-BS-P - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K665.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K665.rse deleted file mode 100644 index 8d04058fa3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K665.rse +++ /dev/null @@ -1,58 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K671.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K671.rse deleted file mode 100644 index 974c7d7a60..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K671.rse +++ /dev/null @@ -1,87 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K675.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K675.eng deleted file mode 100644 index cd94afc7a0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K675.eng +++ /dev/null @@ -1,20 +0,0 @@ -K675-SK 54 572 8-9-10-11-12-13-14-15-16-17-18 1.2 1.94 CTI -0.01 10 -0.02 154 -0.025 930 -0.04 850 -0.05 800 -0.07 680 -0.1 700 -0.2 750 -0.3 780 -0.5 795 -1 808 -1.5 795 -1.9 751 -2.26 700 -2.43 450 -2.6 440 -2.68 400 -2.96 40 -3.09 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K675.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K675.rse deleted file mode 100644 index 08f8f7b958..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K675.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K701.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K701.rse deleted file mode 100644 index 497e720dab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K701.rse +++ /dev/null @@ -1,62 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K710.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K710.eng deleted file mode 100644 index aebb07b7f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K710.eng +++ /dev/null @@ -1,17 +0,0 @@ -K710-BB 54 491 0 0.902 1.812 AMW/ProX -0.01 500 -0.02 850 -0.025 910 -0.03 840 -0.06 860 -0.12 875 -0.2 875 -0.3 872 -1.1 815 -1.85 740 -1.95 720 -2.2 295 -2.37 280 -2.5 90 -2.6 20 -2.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K710.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K710.rse deleted file mode 100644 index 4a6765b671..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K710.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K711.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K711.rse deleted file mode 100644 index eb774f259f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K711.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - CTI 2377-K711-WH-18A - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K735.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K735.eng deleted file mode 100644 index 8d5e087ca1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K735.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Skidmark 75mm 2G -; 1955-K735-SK-P -1955-K735-SK-P 75 350 P 1.2221 2.5088 CTI - 0.053 683.157 - 0.142 593.64 - 0.408 697.291 - 0.893 848.057 - 1.109 886.926 - 1.24 882.214 - 1.362 889.282 - 2.0 783.274 - 2.346 706.714 - 2.439 648.999 - 2.612 123.675 - 2.676 36.514 - 2.754 12.956 - 2.831 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K735.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K735.rse deleted file mode 100644 index 5c648e8975..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K735.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Skidmark 75mm 2G -1955-K735-SK-P - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K740.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K740.eng deleted file mode 100644 index 45f4ac5dbb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K740.eng +++ /dev/null @@ -1,11 +0,0 @@ -; Pro54-4G C-Star 1874-K740 -1874-K740-CS-18A 54 404 18-16-14-12-10-8 0.9 1.469 CTI - 0.02 735.227 - 0.052 853.409 - 0.486 869.318 - 0.893 848.864 - 1.903 735.227 - 2.131 722.727 - 2.32 330.682 - 2.462 101.136 - 2.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K740.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K740.rse deleted file mode 100644 index 379c717b0d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K740.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - Pro54-4G C-Star 1874-K740 - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K750.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K750.rse deleted file mode 100644 index c9502f5cc1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K750.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K780.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K780.eng deleted file mode 100644 index b90ed383f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K780.eng +++ /dev/null @@ -1,27 +0,0 @@ -; CTI Pro54-5G 2108 J780BS 15A -K780BS 54 489 15-14-13-12-11-10-9-8-7-6-5 1.1400000000000001 1.7 CTI - 0.0080 15.972 - 0.016 511.106 - 0.017 1014.226 - 0.039 892.439 - 0.065 936.362 - 0.094 942.352 - 0.153 916.397 - 0.205 906.415 - 0.294 914.401 - 0.455 900.425 - 0.718 896.432 - 1.016 886.45 - 1.38 858.498 - 1.799 818.568 - 1.913 804.593 - 2.072 798.603 - 2.225 788.621 - 2.272 758.673 - 2.34 606.938 - 2.379 561.019 - 2.412 495.134 - 2.558 211.63 - 2.628 141.752 - 2.711 77.864 - 2.756 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K780.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K780.rse deleted file mode 100644 index 89dbb151ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K780.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - CTI Pro54-5G 2108 J780BS 15A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K815.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K815.eng deleted file mode 100644 index 9e46384941..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K815.eng +++ /dev/null @@ -1,17 +0,0 @@ -K815-SK 54 649 0 1.371 2.197 CTI -0.01 400 -0.015 600 -0.02 1200 -0.05 620 -0.07 720 -0.1 825 -0.3 910 -1 945 -1.5 970 -1.8 970 -2.12 930 -2.3 650 -2.43 640 -2.58 300 -2.7 150 -2.85 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K815.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K815.rse deleted file mode 100644 index f9ad1312ee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K815.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K820.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K820.eng deleted file mode 100644 index 67b3172b5a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K820.eng +++ /dev/null @@ -1,22 +0,0 @@ -K820-BS 54 572 7-8-9-10-11-12-13-14-15-16-17 1.232 1.982 CTI -0.01 800 -0.02 1400 -0.029 1720 -0.04 960 -0.1 1050 -0.2 1060 -0.4 1040 -0.6 1030 -1 1020 -1.5 980 -2 880 -2.1 800 -2.2 640 -2.3 520 -2.4 410 -2.5 390 -2.6 280 -2.7 180 -2.8 110 -2.9 50 -3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K820.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K820.rse deleted file mode 100644 index fdf396a5ca..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K820.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K855.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K855.rse deleted file mode 100644 index 70f45ac3e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K855.rse +++ /dev/null @@ -1,61 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K935.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K935.eng deleted file mode 100644 index 2595afbe2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K935.eng +++ /dev/null @@ -1,48 +0,0 @@ -;Created by Jesus Manuel Recuenco Andres 2011 -;with Tctracer v1.0 -K935 54.0 403.00 1000 0.73200 1.50800 Cesaroni - 0.01 1072.70 - 0.02 1043.71 - 0.04 974.21 - 0.07 1015.94 - 0.10 1029.21 - 0.14 1040.97 - 0.17 1049.51 - 0.22 1059.74 - 0.25 1064.00 - 0.29 1070.18 - 0.34 1072.70 - 0.39 1072.26 - 0.42 1069.80 - 0.45 1072.70 - 0.49 1069.80 - 0.52 1070.18 - 0.58 1064.00 - 0.64 1059.74 - 0.70 1055.30 - 0.76 1045.14 - 0.81 1035.01 - 0.85 1029.21 - 0.88 1022.20 - 0.91 1017.62 - 0.94 1014.72 - 0.97 1008.92 - 1.00 1003.42 - 1.06 985.72 - 1.12 965.87 - 1.16 950.93 - 1.21 936.66 - 1.26 919.04 - 1.30 903.29 - 1.34 890.05 - 1.38 876.17 - 1.43 861.06 - 1.48 846.96 - 1.51 719.71 - 1.54 619.58 - 1.56 510.26 - 1.58 415.14 - 1.60 295.72 - 1.63 181.49 - 1.66 66.76 - 1.70 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K940.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K940.eng deleted file mode 100644 index dfa5d6839c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K940.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Pro-54-4G White Thunder -1633-K940-WT-18A 54 404 8-10-12-14-15-17-18 0.768 1.3665 CTI - 0.01 885.714 - 0.011 1006.015 - 0.021 1115.789 - 0.035 1087.218 - 0.053 963.91 - 0.061 957.895 - 0.094 975.94 - 0.183 998.496 - 0.321 1022.556 - 0.394 1037.594 - 0.515 1046.617 - 0.626 1046.617 - 0.769 1033.083 - 0.929 1013.534 - 1.089 981.955 - 1.24 942.857 - 1.343 912.782 - 1.426 894.737 - 1.474 881.203 - 1.533 875.188 - 1.575 873.684 - 1.596 845.113 - 1.606 800.0 - 1.642 615.038 - 1.661 479.699 - 1.683 320.301 - 1.703 200.0 - 1.735 76.692 - 1.753 45.113 - 1.776 22.556 - 1.797 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K940.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K940.rse deleted file mode 100644 index 8fb15f17da..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_K940.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - Pro-54-4G White Thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1030.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1030.rse deleted file mode 100644 index 2df585a27a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1030.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1050.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1050.eng deleted file mode 100644 index a4593662f8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1050.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Blue Streak 75mm 3G -; 3727-L1050-BS-P -3727-L1050-BS-P 75 486 P 1.8634 3.4477 CTI - 0.035 721.412 - 0.081 1110.118 - 0.131 1057.412 - 0.249 1100.235 - 0.913 1194.118 - 1.125 1207.294 - 2.271 1100.235 - 2.797 1055.765 - 3.076 1042.588 - 3.122 996.471 - 3.23 807.059 - 3.452 289.882 - 3.544 123.529 - 3.685 36.235 - 3.731 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1050.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1050.rse deleted file mode 100644 index 848390c718..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1050.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Blue Streak 75mm 3G -3727-L1050-BS-P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1090.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1090.eng deleted file mode 100644 index 391d4064da..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1090.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -L1090SS 75 665 1000 3.491 5.461 Cesaroni -0 487.3 -0.11 1639.1 -0.22 1484.05 -0.44 1417.6 -0.87 1373.3 -1.31 1329 -1.74 1306.85 -2.18 1262.55 -2.61 1218.25 -3.05 1151.8 -3.21 775.25 -3.48 598.05 -3.92 553.75 -4.13 221.5 -4.35 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1090.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1090.rse deleted file mode 100644 index 2b6b35b126..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1090.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115.eng deleted file mode 100644 index 1914f3848c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115.eng +++ /dev/null @@ -1,23 +0,0 @@ -; -; Cesaroni Pro75 5015L1115 -; 'Classic Propellant' -; -; RockSim file by Kathy Miller -; wRasp Adaptation by Len Lekx -; -L1115 75 621 0 2.39 4.40 CTI -0.10 1468.85 -0.30 1490.75 -0.80 1401.75 -1.00 1437.35 -1.50 1335.00 -2.00 1268.25 -2.20 1246.00 -2.50 1112.50 -3.00 1090.25 -3.30 979.00 -3.80 979.00 -4.00 623.00 -4.20 311.50 -4.40 35.00 -4.48 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115.rse deleted file mode 100644 index 4c3637727a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115_1.eng deleted file mode 100644 index b02a52444b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1115_1.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -; -L1115 75.0 621.00 0 2.39400 4.40400 CTI - 0.01 45.46 - 0.01 522.52 - 0.01 984.04 - 0.04 1256.10 - 0.05 1389.85 - 0.08 1713.25 - 0.24 1515.65 - 0.30 1474.74 - 0.40 1443.28 - 0.42 1446.25 - 0.50 1430.02 - 0.76 1392.85 - 1.00 1361.70 - 1.28 1339.45 - 1.84 1259.35 - 2.25 1201.50 - 3.00 1076.11 - 3.50 990.86 - 3.92 832.85 - 4.00 607.78 - 4.10 434.99 - 4.22 288.73 - 4.38 156.49 - 4.48 86.39 - 5.00 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1276.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1276.eng deleted file mode 100644 index 0048f388a8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1276.eng +++ /dev/null @@ -1,24 +0,0 @@ -; AMX/ProX 2729L1276 RR -L1276RR 54 728 P 1.475 2.96 AMW - 0.015 76.924 - 0.017 692.317 - 0.026 1495.003 - 0.037 1244.164 - 0.052 1401.357 - 0.084 1307.71 - 0.127 1307.71 - 0.181 1367.911 - 0.289 1401.357 - 0.384 1408.046 - 0.807 1421.424 - 0.993 1461.558 - 1.215 1491.659 - 1.673 1474.936 - 1.727 1384.634 - 1.798 1083.627 - 1.947 531.78 - 1.986 351.175 - 2.047 177.26 - 2.092 93.647 - 2.144 33.445 - 2.185 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1276.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1276.rse deleted file mode 100644 index 47a1b0e3d8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1276.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - AMX/ProX 2729L1276 RR - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1290.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1290.eng deleted file mode 100644 index 0020182078..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1290.eng +++ /dev/null @@ -1,21 +0,0 @@ -; ABC-76-6000 4701L1290-SK P -L1290-SK 76 785 P 3.047 5.399 CTI - 0.022 117.623 - 0.081 786.023 - 0.11 797.226 - 0.176 1226.645 - 0.691 1357.337 - 1.231 1461.891 - 1.761 1476.828 - 2.008 1467.493 - 2.311 1417.082 - 2.835 1299.459 - 3.101 1235.98 - 3.167 1230.379 - 3.34 1321.863 - 3.373 1286.39 - 3.532 365.94 - 3.602 201.64 - 3.734 91.485 - 3.782 69.08 - 3.8 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1290.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1290.rse deleted file mode 100644 index 19fbd18f86..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1290.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - ABC-76-6000 4701L1290-SK P - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1350.eng deleted file mode 100644 index dff14438a3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1350.eng +++ /dev/null @@ -1,18 +0,0 @@ -; C-Star 75mm 3G -; 4263-L1350-CS-P -4263-L1350-CS-P 75 486 P 2.0245 3.5707 CTI - 0.016 1421.724 - 0.034 1345.218 - 0.049 1502.479 - 0.081 1415.348 - 0.21 1432.349 - 0.453 1432.349 - 0.809 1462.102 - 1.07 1534.357 - 1.28 1540.732 - 2.661 1283.589 - 2.843 1277.214 - 2.932 1115.702 - 3.037 488.784 - 3.163 82.881 - 3.284 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1350.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1350.rse deleted file mode 100644 index f43df57997..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1350.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - C-Star 75mm 3G -4263-L1350-CS-P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1355.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1355.eng deleted file mode 100644 index acbb81bea4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1355.eng +++ /dev/null @@ -1,16 +0,0 @@ -L1355-SS 75 621 0 3.076 4.962 CTI -0.1 80 -0.12 1300 -0.15 1600 -0.2 1500 -0.3 1540 -0.4 1560 -1.05 1660 -1.3 1750 -1.4 1750 -1.8 1590 -2.2 1270 -2.6 860 -2.82 680 -3.05 83 -3.25 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1355.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1355.rse deleted file mode 100644 index c453d1d632..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1355.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1395.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1395.eng deleted file mode 100644 index 12ca8e2af6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1395.eng +++ /dev/null @@ -1,14 +0,0 @@ -L1395-BS 75 621 0 2.475 4.323 CTI -0.02 100 -0.04 1400 -0.1 1800 -0.2 1500 -0.4 1540 -0.8 1591 -1.1 1641 -2.4 1481 -2.8 1446 -3 1500 -3.18 830 -3.35 100 -3.45 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1395.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1395.rse deleted file mode 100644 index e4fdae199f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1395.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1410.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1410.eng deleted file mode 100644 index 5d53d7c0ca..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1410.eng +++ /dev/null @@ -1,15 +0,0 @@ -L1410-SK 75 757 P 2.875 5.115 CTI -0.04 133 -0.065 1200 -0.077 1510 -0.13 1250 -0.35 1400 -1 1530 -1.5 1595 -2 1630 -2.3 1600 -2.6 1510 -2.9 1350 -3.25 1032 -3.4 120 -3.48 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1410.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1410.rse deleted file mode 100644 index aa4fe81b23..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1410.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1685.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1685.eng deleted file mode 100644 index 005a0c76a2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1685.eng +++ /dev/null @@ -1,16 +0,0 @@ -L1685-SS 75 757 0 3.83 6.051 CTI -0.055 100 -0.07 1000 -0.092 2300 -0.12 2150 -0.4 2150 -0.9 2050 -1.1 2060 -1.3 2150 -1.6 1900 -2.1 1600 -2.5 1150 -2.7 1000 -2.85 750 -3.02 200 -3.18 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1685.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1685.rse deleted file mode 100644 index 3171a964ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1685.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1720.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1720.rse deleted file mode 100644 index e4a717bb40..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L1720.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L2375.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L2375.rse deleted file mode 100644 index d3197a1bf2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L2375.rse +++ /dev/null @@ -1,53 +0,0 @@ - - - -White Thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L265.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L265.eng deleted file mode 100644 index f0a55e4002..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L265.eng +++ /dev/null @@ -1,30 +0,0 @@ -L265 54 649 P 1.603 2.481 CTI -0.056 471 -0.149 421.196 -0.28 426.63 -0.644 391.304 -0.961 375.906 -1.408 350.543 -1.837 335.145 -2.266 332.428 -3.227 318.841 -4.663 313.406 -5.82 317.029 -6.072 312.5 -6.333 279.891 -6.529 257.246 -6.79 248.188 -7.163 223.732 -7.527 189.312 -7.909 141.304 -8.002 145.833 -8.198 122.283 -8.441 97.826 -8.637 81.522 -8.954 79.71 -9.373 59.783 -9.672 36.232 -10.017 17.21 -10.549 15.399 -11.015 10.87 -11.472 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L265.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L265.rse deleted file mode 100644 index 9acd1b268e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L265.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI 2645-L265-MY-P - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3150.rse deleted file mode 100644 index f2eca1122f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3150.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3200.eng deleted file mode 100644 index 3bdbfb4cf5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3200.eng +++ /dev/null @@ -1,16 +0,0 @@ -; VMax 75mm 3G -; 3300-L3200-VM-P -3300-L3200-VM-P 75 486 P 1.6584 3.2637 CTI - 0.008 3315.23 - 0.024 2672.963 - 0.108 2975.207 - 0.415 3669.421 - 0.524 3711.924 - 0.644 3669.421 - 0.819 3225.502 - 0.911 3022.432 - 0.937 3050.767 - 0.957 2899.646 - 1.022 288.076 - 1.039 51.948 - 1.055 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3200.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3200.rse deleted file mode 100644 index 0b150ecb3a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L3200.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - VMax 75mm 3G -3300-L3200-VM-P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L395.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L395.eng deleted file mode 100644 index 4180574ecd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L395.eng +++ /dev/null @@ -1,16 +0,0 @@ -; CTI L395 long burn Mellow Propellant -; Not many data points. -; Made from the data in the Rocksim file below -L395 75 757 P 2.218 5.706 CTI -0.04 484.229 -0.129 484.229 -0.209 578.734 -0.547 553.644 -2.043 511.828 -7.329 439.068 -8.632 424.014 -9.573 297.73 -11.399 100.358 -12.445 30.108 -12.501 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L395.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L395.rse deleted file mode 100644 index 0768359c52..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L395.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - CTI 4937-L395-MY-P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L585.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L585.eng deleted file mode 100644 index 27c33b9f30..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L585.eng +++ /dev/null @@ -1,20 +0,0 @@ -L585-IM 75 350 0 1.524 2.784 CTI -0.01 200 -0.02 300 -0.04 500 -0.08 630 -0.1 650 -0.25 629 -0.4 639 -0.8 648 -1.2 654 -1.6 659 -2 653 -2.4 640 -2.8 610 -3.2 580 -3.6 550 -4 515 -4.2 510 -4.45 110 -4.57 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L585.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L585.rse deleted file mode 100644 index 321b9e6369..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L585.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L610.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L610.eng deleted file mode 100644 index 5cd2843a6e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L610.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -; -L610 98 394 0 2.415 4.975 CTI -0.06 262.5 -0.12 667.2 -0.25 929.7 -0.39 871.21 -0.65 849.83 -1.05 823.1 -1.5 785.69 -2 747.3 -2.5 707.3 -3 667.2 -3.48 641.38 -4 593.28 -4.47 561.21 -5 523.79 -5.44 502.41 -5.68 491.72 -6 475.69 -6.5 459.66 -7.01 443.62 -7.5 413.7 -8 284.7 -8.12 53.3 -8.13 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L610.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L610.rse deleted file mode 100644 index 8f1011173d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L610.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - -Data Entered by Tim Van Milligan based on RMS case weight. -Based on CAR certification data -This data has not been approved by Cesaroni or Canadian Association of Rocketry. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L640.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L640.eng deleted file mode 100644 index db0a78c127..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L640.eng +++ /dev/null @@ -1,16 +0,0 @@ -L640-DT 54 649 P 1.293 2.244 CTI -0.02 1200 -0.034 1540 -0.07 1300 -0.15 1460 -0.35 1510 -0.65 1540 -0.7 1510 -0.79 800 -0.86 570.25 -3.26 518 -3.55 330 -3.65 318 -4.15 102 -4.5 30 -5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L640.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L640.rse deleted file mode 100644 index e37cc2e782..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L640.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Classic Propellant, Dual-Thrust core - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L645.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L645.eng deleted file mode 100644 index 0985993c78..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L645.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Green 75mm 3G -; 3419-L645-GR-P -3419-L645-GR-P 75 486 P 2.1441 3.7518 CTI - 0.05 511.243 - 0.12 647.574 - 0.256 689.231 - 0.425 684.497 - 1.554 736.568 - 2.043 764.97 - 3.075 687.337 - 4.557 601.183 - 4.756 550.059 - 4.985 412.781 - 5.281 69.112 - 5.39 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L645.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L645.rse deleted file mode 100644 index 2e34c7725d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L645.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Green 75mm 3G -3419-L645-GR-P - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L730.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L730.eng deleted file mode 100644 index 33f1245767..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L730.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -; -L730 54.0 649.00 0 1.35100 2.24700 CTI - 0.00 81.36 - 0.01 1079.71 - 0.02 1216.59 - 0.04 1154.68 - 0.20 1127.51 - 0.45 1055.11 - 0.60 1028.17 - 0.75 995.24 - 1.00 959.33 - 1.50 898.71 - 2.00 830.70 - 2.50 730.76 - 2.60 592.55 - 2.70 510.96 - 2.90 487.88 - 3.00 405.72 - 3.10 299.80 - 3.20 296.09 - 3.30 251.85 - 3.40 171.70 - 3.50 165.26 - 3.60 139.38 - 3.65 117.77 - 3.77 45.38 - 3.77 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L730.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L730.rse deleted file mode 100644 index ebcb9ab00e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L730.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800.eng deleted file mode 100644 index 9795533f41..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800.eng +++ /dev/null @@ -1,24 +0,0 @@ -; -; Cesaroni Pro75 3757L800 -; 'Classic Propellant' -; -; RockSim file by Kathy Miller -; wRasp Adaptation by Len Lekx -; -L800 75 486 0 1.79 3.51 CTI -0.10 1023.50 -0.20 1005.70 -0.30 1023.50 -0.50 1014.60 -1.00 1010.15 -1.50 1001.25 -2.00 956.75 -2.40 890.00 -2.50 845.50 -3.00 756.50 -3.50 689.75 -3.70 667.50 -3.90 654.15 -4.00 623.00 -4.60 111.25 -4.67 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800.rse deleted file mode 100644 index 522f657973..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800_1.eng deleted file mode 100644 index 0ed573793d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L800_1.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -; -L800 75.0 486.00 0 1.79500 3.51100 CTI - 0.00 27.28 - 0.01 402.41 - 0.01 1285.54 - 0.12 1056.51 - 0.26 1041.73 - 0.71 1026.95 - 1.28 998.38 - 2.05 901.36 - 2.41 849.64 - 2.83 763.51 - 3.25 707.06 - 3.65 655.14 - 3.80 651.74 - 4.00 624.07 - 4.10 601.34 - 4.19 536.17 - 4.31 415.67 - 4.41 270.17 - 4.52 140.20 - 4.60 76.92 - 4.65 54.94 - 4.67 40.16 - 5.00 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L805.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L805.eng deleted file mode 100644 index 7bff0a4978..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L805.eng +++ /dev/null @@ -1,14 +0,0 @@ -;White 54mm 6GXL -;2833-L805-WH-P -2833-L805-WH-P 54 649 0 1.6752 2.5025 CTI -0.012 1618.1 -0.037 1171.8 -0.173 1027.97 -0.388 994.125 -0.626 985.664 -2.318 886.251 -3.054 448.414 -3.464 126.91 -3.608 40.188 -3.827 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L805.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L805.rse deleted file mode 100644 index 92b4eb523f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L805.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - White 54mm 6GXL -2833-L805-WH-P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L820.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L820.eng deleted file mode 100644 index 5186b085c2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L820.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Pro-75-3G Skidmark Plugged -2946-L820-SK-P 75 486 P 1.76 3.42 CTI - 0.026 497.361 - 0.038 662.269 - 0.058 738.786 - 0.079 750.66 - 0.114 721.636 - 0.152 697.889 - 0.213 679.42 - 0.377 718.997 - 0.547 754.617 - 0.743 792.876 - 0.962 839.05 - 1.067 860.158 - 1.629 957.784 - 1.81 957.784 - 2.044 941.953 - 2.249 923.483 - 2.462 902.375 - 2.994 808.707 - 3.064 816.623 - 3.149 794.195 - 3.213 800.792 - 3.266 831.135 - 3.339 866.755 - 3.386 832.454 - 3.415 725.594 - 3.509 221.636 - 3.526 141.161 - 3.591 47.493 - 3.632 27.704 - 3.699 6.596 - 3.801 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L820.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L820.rse deleted file mode 100644 index f64da313d2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L820.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - Pro-75-3G Skidmark Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L851.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L851.eng deleted file mode 100644 index b3d292e3e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L851.eng +++ /dev/null @@ -1,13 +0,0 @@ -; Pro75-3G White 3683-L851 -3683-L851-WH-P 75 486 P 2.195 3.789 CTI - 0.059 971.271 - 0.102 855.249 - 0.485 838.674 - 1.353 911.602 - 1.824 980.11 - 3.107 883.978 - 3.68 816.575 - 4.031 732.597 - 4.128 579.006 - 4.256 246.409 - 4.339 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L851.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L851.rse deleted file mode 100644 index d3b38a74e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L851.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - Pro75-3G White 3683-L851 - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L890.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L890.eng deleted file mode 100644 index 5289d09bc2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L890.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -L890SS 75 530 1000 2.671 4.346 Cesaroni -0 20 -0.05 1151.8 -0.41 1054.34 -0.83 1045.48 -1.24 1036.62 -1.65 1027.76 -2.07 1018.9 -2.89 886 -3.31 775.25 -3.72 664.5 -3.98 177.2 -4.13 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L890.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L890.rse deleted file mode 100644 index bee1ef52f1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L890.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L910.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L910.eng deleted file mode 100644 index 10ab728025..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L910.eng +++ /dev/null @@ -1,17 +0,0 @@ -;C-Star 75mm 2G -;2856-L910-CS-P -2856-L910-CS-P 75 350 0 1.3643 2.6158 CTI -0.034 858.741 -0.056 921.678 -0.305 952.448 -0.718 983.217 -1.221 1047.55 -1.642 1005.59 -1.842 973.427 -2.951 773.427 -3.035 584.615 -3.108 169.231 -3.152 72.727 -3.182 27.972 -3.262 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L910.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L910.rse deleted file mode 100644 index 49baf2e3a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L910.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - C-Star 75mm 2G -2856-L910-CS-P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L935.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L935.eng deleted file mode 100644 index f105d41651..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L935.eng +++ /dev/null @@ -1,11 +0,0 @@ -; Pro54-6GXL 3147L935-IM P -L935-IM 54 649 P 1.7347000000000001 2.5420000000000003 CTI - 0.012 1582.739 - 0.052 1365.5 - 0.159 1278.04 - 2.198 990.27 - 2.514 719.427 - 3.021 239.809 - 3.104 160.813 - 3.273 107.209 - 3.3 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L935.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L935.rse deleted file mode 100644 index 40ecc68eab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L935.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - Pro54-6GXL 3147L935-IM P - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L985.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L985.rse deleted file mode 100644 index c80564c7f1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L985.rse +++ /dev/null @@ -1,56 +0,0 @@ - - - -Entered by Tim Van Milligan for RockSim users. Used ThrustCurve Tracer by John -Coker. Data from CAR web site, thrust curve from AMW web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L990.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L990.eng deleted file mode 100644 index d739af4289..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L990.eng +++ /dev/null @@ -1,13 +0,0 @@ -L990-BS 54 649 0 1.417 2.236 CTI -0.01 800 -0.012 1450 -0.02 1625 -0.05 1320 -0.15 1230 -1.8 1150 -1.88 1105 -2 845 -2.203 825 -2.41 355 -2.6 320 -2.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L990.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L990.rse deleted file mode 100644 index b3cc7aabe7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L990.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L995.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L995.eng deleted file mode 100644 index 6493b62efc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L995.eng +++ /dev/null @@ -1,14 +0,0 @@ -L995-RL 75 486 0 1.996 3.591 CTI -0.02 50 -0.05 200 -0.09 1110 -0.14 1250 -0.25 1211 -0.9 1220 -1.2 1280 -1.4 1245 -2.4 940 -3.1 745 -3.32 740 -3.6 110 -3.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L995.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L995.rse deleted file mode 100644 index 50a43977a7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_L995.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1060.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1060.eng deleted file mode 100644 index b6d67625cf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1060.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; -M1060 98 548 0 3.622 6.673 CTI -0.07 131 -0.1 594 -0.2 1453 -0.238 1494 -0.378 1450 -0.378 1425 -0.5 1423 -1 1462 -1.5 1456 -2 1430 -2.5 1376 -3 1280 -3.5 1190 -4 1051 -4.5 976 -5 883 -5.5 835 -6 793 -6.5 321 -7 13 -7.229 7 -7.23 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1060.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1060.rse deleted file mode 100644 index ec70930fb0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1060.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1101.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1101.rse deleted file mode 100644 index b816d594df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1101.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - CTI 5198-M1101-WH-P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1160.eng deleted file mode 100644 index 4409696642..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1160.eng +++ /dev/null @@ -1,22 +0,0 @@ -; -M1160 75 757 P 3.454 5.698 Ces -0.063 954 -0.094 772 -0.126 1100 -0.220 1167 -0.410 1227 -1.009 1300 -1.451 1325 -1.766 1361 -1.924 1343 -2.507 1276 -2.996 1221 -3.485 1179 -4.022 1142 -4.337 1124 -4.479 1057 -4.747 814 -5.000 200 -5.141 18 -5.280 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1160.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1160.rse deleted file mode 100644 index f6bee28242..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1160.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Green3 Pro75 5G -5880-M1160-GR P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1230.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1230.eng deleted file mode 100644 index 629365b5cd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1230.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro75-4G 5506M1230-IM P -M1230-IM 75 621 P 2.992 4.844 CTI - 0.117 270.318 - 0.144 912.788 - 0.212 1296.047 - 0.408 1444.167 - 1.087 1497.861 - 1.767 1507.118 - 2.403 1434.91 - 2.949 1314.562 - 3.352 1209.027 - 3.648 1118.304 - 3.909 868.352 - 4.409 201.813 - 4.586 111.09 - 4.67 79.614 - 4.7 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1230.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1230.rse deleted file mode 100644 index afb16f79a0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1230.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro75-4G 5506M1230-IM P - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1290.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1290.eng deleted file mode 100644 index f17ec56675..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1290.eng +++ /dev/null @@ -1,20 +0,0 @@ -; Pro98 3G 7649 M1290-WH Plugged -7649-M1290-WH-P 98 548 P 4.421 7.4110000000000005 CTI - 0.024 227.074 - 0.063 873.362 - 0.107 1161.572 - 0.166 1399.563 - 0.292 1358.079 - 0.892 1434.498 - 1.398 1513.1 - 2.484 1558.952 - 2.748 1550.218 - 3.009 1506.55 - 4.091 1281.659 - 5.347 1026.201 - 5.473 984.716 - 5.596 718.341 - 5.663 469.432 - 5.789 213.974 - 5.856 192.14 - 6.046 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1290.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1290.rse deleted file mode 100644 index 1abbdd49a6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1290.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - Pro98 3G 7649 M1290-WH Plugged - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1300.eng deleted file mode 100644 index 64cd17c726..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1300.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro75-5G 6438M1300-IM/DT P -M1300-IM 75 757 P 3.595 5.657 CTI - 0.0090 394.105 - 0.057 934.778 - 0.086 2146.406 - 0.154 2615.423 - 0.314 2827.132 - 0.671 2758.734 - 0.97 2752.22 - 1.082 1172.543 - 1.187 1120.43 - 2.14 1172.543 - 2.7 1139.973 - 3.884 915.235 - 4.372 771.924 - 4.6 400.619 - 4.697 335.478 - 4.9 120.511 - 4.901 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1300.rse deleted file mode 100644 index 3a1f36c72a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1300.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro75-5G 6438M1300-IM/DT P - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400.eng deleted file mode 100644 index fee66b961f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400.eng +++ /dev/null @@ -1,22 +0,0 @@ -; -; Cesaroni Pro75 6251M1400 -; 'Classic Propellant' -; -; RockSim file by Kathy Miller -; wRasp Adaptation by Len Lekx -; -M1400 75 757 0 2.99 5.30 CTI -0.10 1993.60 -0.50 1891.25 -1.10 1780.00 -1.50 1691.00 -2.00 1602.00 -2.30 1557.50 -2.50 1513.00 -3.00 1335.00 -3.50 1223.75 -3.70 1112.00 -3.90 667.50 -4.00 534.00 -4.40 222.50 -4.47 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400.rse deleted file mode 100644 index 08be2a1ab6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400_1.eng deleted file mode 100644 index de7f4c8911..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1400_1.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -; -M1400 75.0 757.00 0 2.99200 5.30200 CTI - 0.02 991.61 - 0.07 1939.66 - 0.11 2291.75 - 0.14 1976.39 - 0.19 1962.48 - 0.29 1936.13 - 0.52 1881.02 - 0.75 1833.40 - 1.00 1778.08 - 1.25 1738.57 - 1.70 1654.82 - 2.40 1502.39 - 2.85 1389.48 - 3.25 1283.00 - 3.40 1232.23 - 3.53 1199.64 - 3.65 1083.69 - 3.70 909.39 - 3.90 641.50 - 4.00 502.82 - 4.03 463.03 - 4.22 336.09 - 4.43 138.68 - 4.47 93.21 - 5.00 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1401.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1401.eng deleted file mode 100644 index 764ebcbd8e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1401.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -M1401 75 757 1000 3.508 5.774 Ces -0.079 1669 -0.134 1562 -0.189 1513 -0.512 1507 -1.009 1519 -1.506 1574 -1.679 1598 -1.861 1604 -2.003 1574 -2.5 1513 -2.981 1483 -3.501 1471 -3.722 1434 -3.785 1404 -3.911 1191 -4.053 1009 -4.116 808 -4.235 595 -4.345 407 -4.447 200 -4.589 30 -4.794 60 -4.99 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1450.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1450.eng deleted file mode 100644 index e43f4d5e1b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1450.eng +++ /dev/null @@ -1,24 +0,0 @@ -; -; -M1450 98 702 0 4.83 8.578 CTI -0.01 60 -0.06 524 -0.1 2164 -0.151 2416 -0.25 2162 -0.5 2037 -0.75 2022 -1 2009 -1.5 2006 -2 1968 -2.5 1895 -3 1770 -3.5 1673 -4 1517 -4.5 1337 -5 1166 -5.5 954 -5.8 687 -6.2 360 -6.86 79 -6.87 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1450.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1450.rse deleted file mode 100644 index 846bf29e6e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1450.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1520.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1520.eng deleted file mode 100644 index e7a84de451..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1520.eng +++ /dev/null @@ -1,13 +0,0 @@ -; Pro98-3G 7579M1520-BS P -M1520-BS 98 548 P 3.737 6.718 CTI - 0.04 1427.795 - 0.082 1706.389 - 0.176 1620.489 - 0.748 1734.249 - 1.652 1827.113 - 2.676 1715.676 - 3.89 1423.152 - 4.399 1404.579 - 4.616 661.661 - 4.877 69.649 - 4.897 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1520.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1520.rse deleted file mode 100644 index 4ea01940cf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1520.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - Pro98-3G 7579M1520-BS P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1540.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1540.eng deleted file mode 100644 index ca05378119..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1540.eng +++ /dev/null @@ -1,16 +0,0 @@ -M1540-IM 75 757 0 3.778 5.906 CTI -0.02 800 -0.04 1250 -0.06 1800 -0.08 2400 -0.15 2060 -0.2 2000 -0.35 2100 -0.55 1940 -0.7 1900 -1.7 1830 -2.5 1720 -3.38 1550 -3.83 680 -4 530 -4.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1540.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1540.rse deleted file mode 100644 index 77a72cdaac..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1540.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1545.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1545.eng deleted file mode 100644 index 7f29020f02..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1545.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Pro-75-6GXL Green3 Plugged -8187-M1545-GR-P 75 1025 P 4.835 7.8783 CTI - 0.038 1517.15 - 0.063 1076.517 - 0.068 1282.322 - 0.076 1509.235 - 0.144 1741.425 - 0.207 1765.172 - 0.334 1749.34 - 0.537 1791.557 - 0.753 1794.195 - 1.053 1775.726 - 1.383 1788.918 - 1.704 1820.58 - 1.856 1828.496 - 2.013 1799.472 - 2.601 1686.016 - 2.905 1641.161 - 3.188 1617.414 - 3.472 1598.945 - 3.738 1583.113 - 3.958 1564.644 - 4.14 1543.536 - 4.216 1543.536 - 4.33 1482.85 - 4.453 1358.839 - 4.55 1187.335 - 4.723 1052.77 - 4.876 891.821 - 4.969 783.641 - 5.028 643.799 - 5.231 184.697 - 5.303 68.602 - 5.396 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1545.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1545.rse deleted file mode 100644 index e9e470fe42..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1545.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - - Pro-75-6GXL Green3 Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1560.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1560.eng deleted file mode 100644 index 4e8777a970..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1560.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro98-2G 5342M1560-WT P -M1560-WT 98 394 P 2.583 4.977 CTI - 0.037 1474.119 - 0.121 1436.502 - 0.328 1523.492 - 1.299 1775.056 - 1.545 1807.971 - 1.797 1807.971 - 1.998 1786.811 - 2.208 1737.439 - 2.462 1572.864 - 2.782 1415.343 - 3.086 1309.545 - 3.213 1290.736 - 3.258 1309.545 - 3.328 679.459 - 3.383 173.979 - 3.428 68.181 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1560.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1560.rse deleted file mode 100644 index 37190cedbd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1560.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro98-2G 5342M1560-WT P - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1590.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1590.eng deleted file mode 100644 index d7442f0ca7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1590.eng +++ /dev/null @@ -1,28 +0,0 @@ -M1590 75 893 P 3.59 6.0760000000000005 CTI - 0.053 2045.469 - 0.119 2130.875 - 0.133 2220.551 - 0.226 2305.957 - 0.363 2241.903 - 0.438 2177.849 - 0.571 2130.875 - 0.748 2092.443 - 0.973 2088.172 - 1.225 2100.983 - 1.433 2079.632 - 1.597 2032.659 - 1.995 1883.198 - 2.411 1759.36 - 3.362 1567.197 - 3.491 1533.035 - 3.721 1076.113 - 3.769 1012.059 - 3.871 973.626 - 3.946 896.761 - 4.074 687.517 - 4.132 640.544 - 4.203 619.192 - 4.504 294.65 - 4.641 226.325 - 4.716 170.812 - 4.8 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1590.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1590.rse deleted file mode 100644 index 3ac75cefd8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1590.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - Pro75-6G 7545M1590-CL P - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1630.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1630.eng deleted file mode 100644 index 3fac301f43..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1630.eng +++ /dev/null @@ -1,19 +0,0 @@ -; AMW75-7600 8212M1630-TT/DT P -M1630-TT 75 1039 P 4.349 7.237 CTI - 0.0030 147.481 - 0.032 2040.948 - 0.078 3235.069 - 0.158 3368.278 - 0.463 3258.856 - 0.647 2992.439 - 0.949 2697.477 - 1.052 2040.948 - 1.101 1883.952 - 1.392 1907.739 - 1.786 1812.59 - 3.6 1327.33 - 3.899 875.372 - 4.595 347.294 - 4.857 195.056 - 4.891 166.511 - 4.9 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1630.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1630.rse deleted file mode 100644 index 40587d748e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1630.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - AMW75-7600 8212M1630-TT/DT P - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1670.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1670.eng deleted file mode 100644 index 0d431d8068..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1670.eng +++ /dev/null @@ -1,16 +0,0 @@ -M1670-BS 75 757 0 3.101 5.231 CTI -0.055 100 -0.092 1500 -0.1 2000 -0.15 2200 -0.2 1800 -0.5 1950 -1 2034 -1.5 2000 -2 1900 -2.5 1760 -2.9 1700 -3 1650 -3.3 530 -3.4 350 -3.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1670.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1670.rse deleted file mode 100644 index 436d11eaac..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1670.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1675.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1675.eng deleted file mode 100644 index c8458c9027..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1675.eng +++ /dev/null @@ -1,20 +0,0 @@ -; Pro75-5G 6162M1675-PK P -M1675-PK 75 757 P 3.1590000000000003 5.223 CTI - 0.04 1350.521 - 0.077 1718.845 - 0.166 1877.036 - 0.307 2011.615 - 0.49 2028.143 - 0.616 2028.143 - 1.018 2073.003 - 1.594 1992.727 - 2.246 1860.508 - 2.762 1754.261 - 2.908 1737.734 - 3.023 1563.016 - 3.206 909.005 - 3.409 377.768 - 3.493 278.604 - 3.577 259.716 - 3.69 113.33 - 3.796 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1675.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1675.rse deleted file mode 100644 index 8bbd5feb1e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1675.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - Pro75-5G 6162M1675-PK P - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1770.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1770.rse deleted file mode 100644 index 0b7c7ca6dc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1770.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1770_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1770_1.rse deleted file mode 100644 index 573f9280ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1770_1.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1790.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1790.eng deleted file mode 100644 index 46897a3bea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1790.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro98-4G 8088M1790-SK P -M1790-SK 98 702 P 4.817 8.298 CTI - 0.059 1791.514 - 0.199 1596.375 - 0.6 1782.109 - 1.215 1913.769 - 1.973 2021.918 - 2.742 1970.195 - 3.387 1833.833 - 3.812 1652.801 - 4.28 1556.407 - 4.385 1295.438 - 4.476 355.011 - 4.541 91.692 - 4.597 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1790.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1790.rse deleted file mode 100644 index 510bb2e99f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1790.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro98-4G 8088M1790-SK P - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1800.eng deleted file mode 100644 index 93f89c3cc2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1800.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro98-4G 9870M1800-BS P -M1800-BS 98 702 P 4.9590000000000005 8.342 CTI - 0.02 1873.084 - 0.059 2177.212 - 0.265 1932.773 - 1.312 2077.731 - 1.826 2108.996 - 3.07 2009.515 - 4.468 1750.865 - 4.674 1736.653 - 4.89 1023.233 - 5.178 451.928 - 5.384 318.339 - 5.548 99.481 - 5.6 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1800.rse deleted file mode 100644 index 6f8b6cc9b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1800.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro98-4G 9870M1800-BS P - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1810.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1810.eng deleted file mode 100644 index 73b4fc23fd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1810.eng +++ /dev/null @@ -1,19 +0,0 @@ -M1810-RL 75 757 0 3.297 5.416 CTI -0.01 30 -0.03 120 -0.065 1000 -0.093 1500 -0.11 1950 -0.16 1850 -0.35 1915 -0.6 1965 -1.15 2085 -1.35 2080 -2.15 1970 -2.6 1820 -2.95 1810 -3.06 1715 -3.15 1185 -3.32 240 -3.4 90 -3.58 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1810.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1810.rse deleted file mode 100644 index 42a2cd1a45..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1810.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1830.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1830.eng deleted file mode 100644 index 5a5cbf6792..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1830.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; Pro75-4G 5604M1830-CS C-Star -;based on RockSim file by Mark Koelsch -M1830-CS 75 621 0 2.666 4.524 CTI - 0.018 2300.79 - 0.028 1952.86 - 0.155 2008.98 - 1.111 2121.21 - 1.452 2053.87 - 1.782 1958.47 - 2.608 1694.72 - 2.677 1546.02 - 3.06 115.039 - 3.165 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1830.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1830.rse deleted file mode 100644 index 1229e92043..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1830.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CStar Pro75 4G -5604-M1830-CS P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1890.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1890.rse deleted file mode 100644 index 055a0aa9db..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M1890.rse +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2020.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2020.eng deleted file mode 100644 index 5d9d9ee70f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2020.eng +++ /dev/null @@ -1,32 +0,0 @@ -; Pro-75-6G IMax Plugged -8429-M2020-IM-P 75 757 P 4.349 7.0318 CTI - 0.023 2070.111 - 0.036 1929.889 - 0.053 2147.601 - 0.073 2369.004 - 0.089 2505.535 - 0.136 2649.446 - 0.182 2627.306 - 0.262 2608.856 - 0.364 2616.236 - 0.566 2623.616 - 1.387 2575.646 - 1.639 2538.745 - 1.986 2450.185 - 2.198 2394.834 - 2.457 2295.203 - 2.708 2206.642 - 2.831 2162.362 - 2.933 2088.561 - 3.036 1988.93 - 3.109 1800.738 - 3.175 1594.096 - 3.307 1335.793 - 3.45 1014.76 - 3.589 708.487 - 3.698 601.476 - 3.814 461.255 - 3.996 339.483 - 4.115 202.952 - 4.201 88.561 - 4.301 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2020.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2020.rse deleted file mode 100644 index b743fb735e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2020.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - - Pro-75-6G IMax Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2045.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2045.eng deleted file mode 100644 index a6e550ef22..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2045.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Pro75-6G 7388-M2045-BS P -M2045-BS 75 893 P 3.739 6.071 CTI - 0.0040 556.851 - 0.019 1690.324 - 0.063 2359.204 - 0.153 2339.434 - 0.182 2570.083 - 0.247 2471.233 - 0.616 2497.593 - 1.028 2547.018 - 2.111 2316.369 - 2.551 2273.535 - 2.635 2253.765 - 2.796 1696.914 - 3.009 1472.855 - 3.349 247.123 - 3.541 108.734 - 3.587 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2045.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2045.rse deleted file mode 100644 index d9e51e5211..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2045.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro75-6G 7388-M2045-BS P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2050.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2050.eng deleted file mode 100644 index ca86e60e0c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2050.eng +++ /dev/null @@ -1,16 +0,0 @@ -; AMX75-7600 6774-M2050-SK P -M2050-BS 75 1039 P 4.172 7.1290000000000004 ABC - 0.038 2152.81 - 0.833 2506.091 - 1.189 2539.211 - 1.546 2500.571 - 1.775 2415.011 - 1.907 2279.77 - 2.168 2086.569 - 2.401 1973.409 - 2.616 1909.929 - 2.776 1871.288 - 2.918 1203.365 - 3.056 706.563 - 3.309 135.241 - 3.4 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2050.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2050.rse deleted file mode 100644 index 618abfc697..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2050.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - AMX75-7600 6774-M2050-SK P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2075.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2075.eng deleted file mode 100644 index 82e443fe53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2075.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pro75-6G 6287M2075-SS Plugged -M2075-SS 75 893 P 4.5931 7.1913 CTI - 0.034 2350.685 - 0.18 2652.055 - 0.243 2931.507 - 0.303 2734.247 - 0.453 2624.658 - 0.552 2564.384 - 0.813 2487.671 - 1.172 2498.63 - 2.028 2038.356 - 2.415 1610.959 - 2.567 1506.849 - 2.69 1386.301 - 3.01 224.658 - 3.029 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2075.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2075.rse deleted file mode 100644 index e5672e26de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2075.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Pro75-6G 6287M2075-SS Plugged - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2080.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2080.eng deleted file mode 100644 index 5f1661f211..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2080.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Pro-75-6GXL Skidmark Plugged -6827-M2080-SK-P 75 1025 P 4.107 7.0395 CTI - 0.027 1813.539 - 0.04 2084.323 - 0.067 2344.418 - 0.097 2276.722 - 0.132 2262.47 - 0.172 2269.596 - 0.218 2319.477 - 0.323 2415.677 - 0.447 2490.499 - 0.541 2522.565 - 0.676 2547.506 - 0.816 2554.632 - 1.026 2522.565 - 1.23 2519.002 - 1.459 2461.995 - 1.669 2369.359 - 1.987 2241.093 - 2.21 2134.204 - 2.539 2002.375 - 2.63 1991.686 - 2.7 1941.805 - 2.746 1842.043 - 2.784 1692.399 - 2.811 1542.755 - 2.843 1339.667 - 2.999 883.61 - 3.083 520.19 - 3.177 277.91 - 3.271 128.266 - 3.365 53.444 - 3.443 24.941 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2080.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2080.rse deleted file mode 100644 index 76bc4bf308..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2080.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - - Pro-75-6GXL Skidmark Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2150.eng deleted file mode 100644 index 24f9bf9255..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2150.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pro75-6G 7455M2150-RL P -M2150-RL 75 893 P 3.969 6.324 CTI - 0.027 999.465 - 0.067 1877.112 - 0.135 2286.865 - 0.239 2414.221 - 0.451 2345.006 - 0.796 2425.295 - 1.193 2610.791 - 1.75 2380.997 - 2.33 2228.724 - 2.908 2189.964 - 3.316 703.225 - 3.461 138.43 - 3.49 74.752 - 3.5 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2150.rse deleted file mode 100644 index 8018e73e3a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2150.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Pro75-6G 7455M2150-RL P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2245.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2245.eng deleted file mode 100644 index 4db1b65df5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2245.eng +++ /dev/null @@ -1,13 +0,0 @@ -; Imax Pro75 6GXL -; 9977 M2245-IM-P -9977-M2245-IM-P 75 1025 P 5.309 8.182 CTI - 0.043 3045.655 - 0.136 2629.813 - 1.393 3003.3 - 2.168 3007.151 - 2.708 2972.497 - 2.837 2883.938 - 3.152 1955.996 - 3.397 1409.241 - 3.878 562.156 - 4.371 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2245.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2245.rse deleted file mode 100644 index 4e1f7d6ac9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2245.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - Imax Pro75 6GXL -9977 M2245-IM-P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2250.eng deleted file mode 100644 index cef2bbca35..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2250.eng +++ /dev/null @@ -1,19 +0,0 @@ -; Pro75-4G 5472M2250-CS P -M2250-CS 75 621 P 2.628 4.415 CTI - 0.016 2542.114 - 0.051 2390.798 - 0.139 2582.466 - 0.259 2599.278 - 0.877 2663.168 - 1.388 2555.565 - 1.823 2458.05 - 1.86 2303.371 - 1.891 1926.761 - 1.997 1452.637 - 2.195 1452.637 - 2.244 1207.168 - 2.276 645.616 - 2.336 517.838 - 2.414 144.591 - 2.456 40.351 - 2.497 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2250.rse deleted file mode 100644 index 94a363c854..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2250.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - Pro75-4G 5472M2250-CS P - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2505.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2505.eng deleted file mode 100644 index 5d64794e26..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2505.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -M2505 98.0 548.00 0 3.42300 6.25800 CTI - 0.12 2600.00 - 0.21 2482.00 - 0.60 2715.00 - 0.90 2876.00 - 1.20 2938.00 - 1.50 2889.00 - 1.80 2785.00 - 2.10 2573.00 - 2.40 2349.00 - 2.70 2182.00 - 3.00 85.00 - 3.00 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2505.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2505.rse deleted file mode 100644 index 6a3cc60952..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M2505.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3100.eng deleted file mode 100644 index e6455e4eac..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3100.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro75-5G 6118M3100-WT P -M3100-WT 75 757 P 2.95 5.018 CTI - 0.02 3118.031 - 0.057 2976.886 - 0.148 3186.465 - 0.496 3391.768 - 0.817 3665.504 - 0.936 3532.913 - 1.173 3357.551 - 1.501 3199.297 - 1.717 3139.417 - 1.78 2412.304 - 1.812 2130.013 - 1.832 2031.639 - 1.937 346.448 - 1.985 81.266 - 2.0 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3100.rse deleted file mode 100644 index 6e779b24ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3100.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro75-5G 6118M3100-WT P - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3400.eng deleted file mode 100644 index 0a17e153df..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3400.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Pro98-4G 9994M3400-WT P -M3400-WT 98 702 P 4.766 8.108 CTI - 0.021 3639.453 - 0.049 3360.146 - 0.111 3300.899 - 0.374 3478.64 - 0.909 3774.874 - 1.059 3897.6 - 1.208 3884.904 - 1.571 3787.57 - 2.168 3402.465 - 2.467 3245.884 - 2.709 3292.435 - 2.734 3254.348 - 2.821 1032.589 - 2.876 550.15 - 2.93 165.045 - 2.99 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3400.rse deleted file mode 100644 index 43f5d0838d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3400.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro98-4G 9994M3400-WT P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3700.eng deleted file mode 100644 index 98bcebbcef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3700.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro75-6G 6800M3700-WT Plugged -; 5.3G case or 6G + 0.7 spacer -M3700-WT 75 803 P 3.1065 5.7785 CTI - 0.017 3815.753 - 0.04 3969.863 - 0.099 3914.384 - 0.245 3957.534 - 0.563 3951.37 - 0.727 4105.479 - 0.959 4031.507 - 1.25 3982.192 - 1.511 3994.521 - 1.595 3994.521 - 1.739 1306.849 - 1.772 1109.589 - 1.83 221.918 - 1.835 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3700.rse deleted file mode 100644 index 3f80fa691a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M3700.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro75-6G 6800M3700-WT Plugged -5.3G case or 6G + 0.7 spacer - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M4770.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M4770.rse deleted file mode 100644 index b5e3a33aa3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M4770.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M520.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M520.eng deleted file mode 100644 index 6b8e6634c4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M520.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; -M520 98.0 548.00 0 3.71300 6.69300 CTI - 0.01 1077.00 - 0.25 1062.83 - 0.38 1065.66 - 0.50 971.00 - 0.71 938.12 - 0.93 915.45 - 1.23 878.61 - 2.07 906.95 - 2.61 901.28 - 3.03 892.78 - 3.50 872.94 - 3.93 836.09 - 4.96 756.73 - 6.08 657.54 - 7.05 549.84 - 7.79 461.98 - 8.39 391.12 - 9.06 323.10 - 10.01 243.74 - 11.01 172.89 - 12.00 116.20 - 13.95 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M520.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M520.rse deleted file mode 100644 index dd3bcbc234..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M520.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M6400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M6400.eng deleted file mode 100644 index 53827381ee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M6400.eng +++ /dev/null @@ -1,15 +0,0 @@ -; CTI Pro-98 4G -; 8634 M6400-VM P -8634-M6400-VM-P 98 702 P 4.308 7.9190000000000005 CTI - 0.011 6079.636 - 0.135 6598.407 - 0.354 7080.774 - 0.503 7244.596 - 0.713 7162.685 - 0.954 6707.622 - 1.183 5688.282 - 1.233 5460.751 - 1.26 4914.676 - 1.288 3394.767 - 1.331 800.91 - 1.383 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M6400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M6400.rse deleted file mode 100644 index ab58678bf6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M6400.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - CTI Pro-98 4G -8634 M6400-VM P - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M795.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M795.eng deleted file mode 100644 index 3a11facb9c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M795.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; -M795 98 702 0 4.892 8.492 CTI -0.15 612.314 -0.21 1532.76 -0.245 1722 -0.43 1717.66 -0.5 1542.85 -0.62 1430.02 -0.8 1389.71 -1 1374.27 -1.5 1338.9 -2 1305.38 -3 1271.81 -4 1204 -5 1078 -6 928 -7 743 -8 563 -9 424.898 -10 299.697 -11 196.164 -12 116.759 -12.7 65.434 -12.76 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M795.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M795.rse deleted file mode 100644 index 51ea36015f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M795.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M840.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M840.eng deleted file mode 100644 index de8e1f3ed3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M840.eng +++ /dev/null @@ -1,13 +0,0 @@ -; Pro75-6G White/LB 7521-M840 -7521-M840-WH/LB-P 75 879.3 P 4.436 6.954 CTI - 0.072 1980.022 - 0.246 1447.281 - 0.835 1120.977 - 2.132 1094.34 - 3.922 1003.33 - 5.441 810.211 - 6.559 621.532 - 7.357 472.808 - 8.547 199.778 - 8.973 97.669 - 9.009 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M840.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M840.rse deleted file mode 100644 index 4be46d84b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_M840.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - Pro75-6G White/LB 7521-M840 - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N10000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N10000.eng deleted file mode 100644 index 3183b390bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N10000.eng +++ /dev/null @@ -1,23 +0,0 @@ -; Pro98 6G 10347 N10000-VM P -N10000-VM 98 1010 P 5.335 9.9185 CTI - 0.0090 8953.955 - 0.027 10257.379 - 0.074 10753.247 - 0.125 11036.6 - 0.212 11107.438 - 0.358 11277.45 - 0.457 11475.797 - 0.548 11461.629 - 0.599 11277.45 - 0.663 10866.588 - 0.766 9988.194 - 0.837 9350.649 - 0.888 8996.458 - 0.908 8968.123 - 0.923 8585.596 - 0.942 7820.543 - 0.961 6276.269 - 0.976 4491.145 - 0.988 3357.733 - 1.004 1657.615 - 1.008 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N10000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N10000.rse deleted file mode 100644 index 3c1fbfde16..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N10000.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - Pro98 6G 10347 N10000-VM P - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1100.eng deleted file mode 100644 index 119bc59d41..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1100.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -N1100 98 1010 0 4.517 11.644 CTI -0.16 2624 -0.33 2708 -0.91 2055 -1.22 1896 -2.44 1793 -3.66 1625 -4.88 1402 -6.12 1158 -7.41 854 -9.77 494 -12.18 111.2 -12.19 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1100.rse deleted file mode 100644 index b6e0c3a250..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1100.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - -N1100 Data Entered by Tim Van Milligan based on RMS case weight. -Based on CAR certification data -This data has not been approved by Cesaroni or Canadian Association of Rocketry. - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1560.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1560.rse deleted file mode 100644 index e15bae9a4e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1560.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - CTI 16803-N1560-WH-MB-P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1800.eng deleted file mode 100644 index eccfffbfaa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1800.eng +++ /dev/null @@ -1,21 +0,0 @@ -; Pro98 4G 10367 N1800-WH Plugged -10367-N1800-WH-P 98 702 P 4.8420000000000005 9.18 CTI - 0.077 1769.444 - 0.123 2205.556 - 0.193 2041.667 - 0.339 1988.889 - 0.744 1994.444 - 2.398 2144.444 - 2.726 2119.444 - 2.977 2077.778 - 3.933 1786.111 - 4.643 1525.0 - 4.986 1444.444 - 5.152 1352.778 - 5.225 1261.111 - 5.348 994.444 - 5.437 738.889 - 5.541 622.222 - 5.73 355.556 - 5.915 75.0 - 5.931 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1800.rse deleted file mode 100644 index 9d2a3f14cb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1800.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - Pro98 4G 10367 N1800-WH Plugged - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1975.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1975.eng deleted file mode 100644 index e158f93699..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1975.eng +++ /dev/null @@ -1,23 +0,0 @@ -; Pro98 6G 14272 N1975-GR P -N1975-GR 98 1010 P 8.584 13.2475 CTI - 0.04 1382.46 - 0.08 1699.147 - 0.201 1781.364 - 0.447 1793.544 - 0.678 1820.95 - 0.758 1927.527 - 0.853 1842.266 - 2.425 2088.916 - 2.52 2180.268 - 2.761 2198.538 - 3.434 2213.764 - 3.715 2268.575 - 4.077 2299.026 - 4.96 2238.124 - 5.492 2161.998 - 6.105 2024.97 - 6.446 1878.806 - 6.647 1668.697 - 7.074 602.923 - 7.239 140.073 - 7.254 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1975.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1975.rse deleted file mode 100644 index 6d6a9805f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N1975.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - Pro98 6G 14272 N1975-GR P - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2200.eng deleted file mode 100644 index 862106491d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2200.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -; Pro98-5G 12066N2200-PK Pink -;based on RockSim file by Mark Koelsch -N2200-PK 98 1010 0 6.308 11.356 CTI -0.033 2755.85 -0.143 2434.78 -0.624 2555.18 -1.814 2602.01 -2.67 2461.54 -4.186 2130.43 -4.66 2063.55 -4.796 1852.84 -5.067 775.92 -5.236 474.916 -5.497 180.602 -5.86 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2200.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2200.rse deleted file mode 100644 index 5b9cdf7e44..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2200.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pink Pro98 5G -12066-N2200-PK P -Note that the motor was fired in a 6G casing with a single Pro98-Spacer - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2500.eng deleted file mode 100644 index 59c1425b21..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2500.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; -N2500 98.0 1010.00 0 6.77800 11.66800 CTI - 0.02 773.70 - 0.05 3356.60 - 0.06 3657.80 - 0.10 3546.80 - 0.25 3403.80 - 0.40 3309.20 - 0.80 3262.50 - 1.00 3206.10 - 1.50 3088.50 - 2.00 2940.40 - 2.50 2792.60 - 3.00 2598.40 - 3.50 2402.50 - 4.00 2227.00 - 4.25 2152.50 - 4.40 2102.50 - 4.50 2007.00 - 4.60 1683.80 - 4.75 1269.50 - 5.00 767.30 - 5.41 341.30 - 5.42 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2500.rse deleted file mode 100644 index 69e0c1c892..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2500.rse +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2501.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2501.eng deleted file mode 100644 index ac7dd4564d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2501.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro98 6G 15227 N2501-WH Plugged -15227-N2501-WH-P 98 1010 P 8.704 13.308 CTI - 0.039 1715.546 - 0.059 2835.722 - 0.141 3488.423 - 0.224 3188.534 - 0.373 3135.612 - 2.237 2998.897 - 2.905 2928.335 - 3.45 2769.57 - 3.462 2787.211 - 4.537 2407.938 - 4.804 1949.283 - 5.165 1684.675 - 5.511 1181.918 - 6.013 313.12 - 6.088 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2501.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2501.rse deleted file mode 100644 index 414812db28..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2501.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro98 6G 15227 N2501-WH Plugged - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2540.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2540.eng deleted file mode 100644 index f942f09593..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2540.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Based on the Rocksim file by Andre Choquette -N2540 98 1239 P 10.7 16.2805 Ces -0.073 2586.93 -0.11 2789.97 -0.398 2761.96 -1.14 2761.96 -1.73 2828.47 -2.613 2894.98 -4.16 2747.96 -5.666 2565.93 -5.972 2415. -6.338 1953.33 -6.819 745.624 -7.061 101.517 -7.222 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2540.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2540.rse deleted file mode 100644 index 071781790b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2540.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Green 98mm 6GXL -17907-N2540-GR-P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2600.eng deleted file mode 100644 index cfa9c6e814..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2600.eng +++ /dev/null @@ -1,16 +0,0 @@ -; Pro98-6G 11077N2600-SK P -N2600-SK 98 1010 P 6.7700000000000005 11.482000000000001 CTI - 0.063 2794.141 - 0.199 2497.593 - 0.485 2619.507 - 0.907 2777.666 - 1.367 2902.875 - 1.749 2949.005 - 2.051 2972.07 - 2.764 2817.206 - 3.549 2392.154 - 3.767 2309.779 - 3.958 2385.564 - 4.177 639.226 - 4.265 138.389 - 4.297 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2600.rse deleted file mode 100644 index ca43ea6ab6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2600.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - Pro98-6G 11077N2600-SK P - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2850.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2850.eng deleted file mode 100644 index 0a8c647492..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2850.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro98-6G 13767N2850-BS P -N2850-BS 98 1010 P 6.965 11.688 CTI - 0.0030 286.922 - 0.085 3152.414 - 0.185 3103.973 - 0.322 3077.889 - 0.945 3212.034 - 1.725 3312.643 - 2.819 3118.878 - 4.163 2776.062 - 4.376 1982.369 - 4.538 845.86 - 4.763 435.972 - 4.849 149.05 - 4.9 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2850.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2850.rse deleted file mode 100644 index d355423ea0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2850.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro98-6G 13767N2850-BS P - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900.eng deleted file mode 100644 index 1923937c78..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro98-6GXL 17613N2900-CL P -N2900-CL 98 1239 P 8.788 14.166 CTI - 0.026 1863.57 - 0.074 3605.399 - 0.122 4022.127 - 0.361 3619.446 - 1.18 3497.706 - 1.981 3586.67 - 3.493 3155.895 - 4.648 2874.955 - 4.939 2322.439 - 5.205 1648.183 - 5.629 945.832 - 5.972 430.775 - 6.219 206.023 - 6.278 149.835 - 6.296 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900.rse deleted file mode 100644 index 04e27bdbad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro98-6GXL 17613N2900-CL P - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900_1.eng deleted file mode 100644 index 1923937c78..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N2900_1.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro98-6GXL 17613N2900-CL P -N2900-CL 98 1239 P 8.788 14.166 CTI - 0.026 1863.57 - 0.074 3605.399 - 0.122 4022.127 - 0.361 3619.446 - 1.18 3497.706 - 1.981 3586.67 - 3.493 3155.895 - 4.648 2874.955 - 4.939 2322.439 - 5.205 1648.183 - 5.629 945.832 - 5.972 430.775 - 6.219 206.023 - 6.278 149.835 - 6.296 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3180.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3180.rse deleted file mode 100644 index e6f63f2d8d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3180.rse +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3301.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3301.eng deleted file mode 100644 index c7b0fc241d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3301.eng +++ /dev/null @@ -1,15 +0,0 @@ -; Pro98-6GXL White 19318-N3301 -19318-N3301-WH-P 98 1239 P 10.919 16.525 CTI - 0.027 5000.0 - 0.074 4201.389 - 0.114 4415.509 - 0.325 4091.435 - 1.438 3993.056 - 2.391 3964.12 - 3.139 3842.593 - 4.033 3524.306 - 4.425 2557.87 - 4.774 2314.815 - 5.318 1116.898 - 5.793 329.861 - 5.875 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3301.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3301.rse deleted file mode 100644 index 08cbe83f33..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3301.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Pro98-6GXL White 19318-N3301 - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3400.eng deleted file mode 100644 index f74a6570f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3400.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro98-6GXL 14263N3400-SK P -N3400-SK 98 1239 P 8.471 13.972 CTI - 0.055 3602.205 - 0.177 3060.167 - 0.608 3397.34 - 1.537 3811.337 - 2.252 3973.522 - 2.86 3760.121 - 3.152 3597.937 - 3.545 3346.124 - 3.71 3627.813 - 3.837 2868.106 - 3.884 1907.803 - 3.999 1510.877 - 4.188 273.153 - 4.28 81.092 - 4.3 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3400.rse deleted file mode 100644 index ee476e1319..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3400.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro98-6GXL 14263N3400-SK P - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3800.eng deleted file mode 100644 index da27ee2ce4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3800.eng +++ /dev/null @@ -1,25 +0,0 @@ -; Pro98-6GXL 17631N3800-BS P -N3800-BS 98 1239 P 8.71 14.261000000000001 CTI - 0.016 2671.724 - 0.069 4632.012 - 0.159 4360.745 - 0.293 4355.626 - 1.11 4591.066 - 1.48 4703.667 - 1.847 4729.258 - 2.384 4683.194 - 2.628 4550.12 - 3.141 4135.542 - 3.343 4043.413 - 3.434 4022.94 - 3.497 3787.501 - 3.582 3204.021 - 3.681 2809.916 - 3.853 2385.102 - 4.042 1458.7 - 4.198 972.467 - 4.338 946.875 - 4.401 864.983 - 4.604 378.75 - 4.673 230.321 - 4.7 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3800.rse deleted file mode 100644 index 88849cbe5f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N3800.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - Pro98-6GXL 17631N3800-BS P - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N4100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N4100.eng deleted file mode 100644 index da5508265e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N4100.eng +++ /dev/null @@ -1,18 +0,0 @@ -; Pro98-6GXL 17790N4100-RL P -N4100-RL 98 1293 P 9.38 14.748000000000001 CTI - 0.0030 203.877 - 0.05 2362.879 - 0.078 3946.845 - 0.121 4281.412 - 0.652 4370.281 - 1.123 4453.923 - 1.655 4772.807 - 2.353 4621.206 - 3.035 4511.427 - 3.7 4375.509 - 3.733 4182.087 - 3.887 2969.282 - 4.036 1589.193 - 4.197 533.216 - 4.262 240.47 - 4.3 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N4100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N4100.rse deleted file mode 100644 index 14ef59d928..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N4100.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - Pro98-6GXL 17790N4100-RL P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5600.eng deleted file mode 100644 index aa1f4783a6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5600.eng +++ /dev/null @@ -1,23 +0,0 @@ -N5600WT 98 1010 P 6.363 11.28 CTI - 0.019 6750.0 - 0.041 6250.0 - 0.044 6078.947 - 0.077 5960.526 - 0.198 6144.737 - 0.749 6328.947 - 0.931 6447.368 - 1.049 6368.421 - 1.25 6118.421 - 1.501 5828.947 - 1.751 5500.0 - 1.999 5263.158 - 2.131 5131.579 - 2.17 5144.737 - 2.2 4986.842 - 2.252 4013.158 - 2.291 3013.158 - 2.335 2000.0 - 2.373 1000.0 - 2.401 500.0 - 2.448 171.053 - 2.483 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5600.rse deleted file mode 100644 index 52da96e926..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5600.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - CTI Pro-98 6G -13628 N5600-WT P - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5800.eng deleted file mode 100644 index 0d611cbd55..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5800.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Pro98-6GXL 20146N5800-CS P -N5800-CS 98 1239 P 9.425 14.826 CTI - 0.019 6694.9 - 0.049 6720.292 - 0.103 6593.334 - 0.384 6677.973 - 1.109 6957.279 - 1.569 6940.352 - 1.991 6720.292 - 2.622 6009.329 - 3.011 3275.507 - 3.192 2606.864 - 3.334 1599.666 - 3.423 1041.053 - 3.513 389.337 - 3.581 220.06 - 3.594 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5800.rse deleted file mode 100644 index 500de968a3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_N5800.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - Pro98-6GXL 20146N5800-CS P - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O25000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O25000.eng deleted file mode 100644 index 84e9fc538c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O25000.eng +++ /dev/null @@ -1,14 +0,0 @@ -; CTI 30,795-O25,000-VM-P -; Single-Use -O25,000-VM-P 132 1407 P 14.705 23.558 CTI - 0.0080 21113.445 - 0.022 24705.882 - 0.042 26281.513 - 0.067 24390.756 - 0.201 24044.118 - 0.56 25052.521 - 0.927 24075.63 - 1.202 22815.126 - 1.25 23602.941 - 1.297 4852.941 - 1.32 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O25000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O25000.rse deleted file mode 100644 index df73d78ce0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O25000.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - CTI 30,795-O25,000-VM-P -Single-Use - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3400.eng deleted file mode 100644 index 89d9a60616..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3400.eng +++ /dev/null @@ -1,18 +0,0 @@ -; CTI Pro-98 6GXL -; 21062 O3400-IM P -21062-O3400-IM-P 98 1239 P 11.272 16.842 CTI - 0.04 3959.811 - 0.052 4432.624 - 0.101 4515.366 - 0.19 4420.804 - 0.38 4391.253 - 0.965 4444.444 - 2.176 4698.582 - 2.887 4592.199 - 3.658 4225.768 - 4.17 2854.61 - 4.493 2559.102 - 4.881 1619.385 - 5.483 868.794 - 6.137 248.227 - 6.322 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3400.rse deleted file mode 100644 index bf02a05b08..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3400.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - CTI Pro-98 6GXL -21062 O3400-IM P - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3700.eng deleted file mode 100644 index 8fddc2a8eb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3700.eng +++ /dev/null @@ -1,36 +0,0 @@ -; Pro-150-40K Skidmark Plugged -29920-O3700-SK-P 161 957 P 17.157 31.3505 CTI - 0.052 1009.021 - 0.071 1646.907 - 0.084 2505.155 - 0.09 3183.634 - 0.116 3409.794 - 0.187 3114.046 - 0.245 3050.258 - 0.316 3108.247 - 0.445 3241.624 - 0.594 3461.985 - 0.819 3653.351 - 1.155 3676.546 - 1.503 3775.129 - 2.471 3931.701 - 3.277 4012.887 - 4.213 4030.284 - 4.787 3983.892 - 5.206 3925.902 - 5.671 3867.912 - 5.981 3850.515 - 6.413 3751.933 - 6.923 3618.557 - 7.387 3496.778 - 7.645 3363.402 - 7.819 3102.448 - 7.903 2905.284 - 7.942 2383.376 - 7.981 1948.454 - 8.026 1310.567 - 8.084 695.876 - 8.135 359.536 - 8.187 162.371 - 8.277 81.186 - 8.387 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3700.rse deleted file mode 100644 index 9c716e1b12..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O3700.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - - Pro-150-40K Skidmark Plugged - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O4900.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O4900.eng deleted file mode 100644 index a49b5338bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O4900.eng +++ /dev/null @@ -1,18 +0,0 @@ -O4900-BS 161 957 0 18.898 32.648 CTI -0.06 800 -0.1 4000 -0.15 5500 -0.25 5160 -0.45 5130 -0.8 5400 -1 5300 -2 5450 -3 5347 -4 5160 -5 4950 -6 4700 -6.8 4400 -7.05 4400 -7.3 3800 -7.6 300 -7.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O4900.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O4900.rse deleted file mode 100644 index a361b0b59b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O4900.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5100.eng deleted file mode 100644 index 6ed9444ac6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5100.eng +++ /dev/null @@ -1,44 +0,0 @@ -; -;Cesaroni Technologies Inc Motor Data File -;Composed by Carl Tulanko for 150mm "O" CAR Certed Motor -;24-Jun-2003 using CTI Cert graph to chart points -O5100 150 803 1000 13.245 23.577 Cesaroni -0.01 815.07 -0.02 1407.85 -0.03 2334.11 -0.04 3260.42 -0.05 4001.47 -0.07 4927.78 -0.07 5483.57 -0.09 5817.04 -0.13 6057.88 -0.2 6206.09 -0.3 6298.72 -0.43 6280.19 -0.6 6261.67 -0.78 6298.72 -0.97 6354.3 -1.05 6428.4 -1.12 6391.35 -1.34 6465.46 -1.49 6502.51 -1.75 6539.56 -1.88 6558.09 -2.16 6521.03 -2.36 6465.46 -2.58 6372.82 -2.96 6113.46 -3.56 5557.67 -4.13 4909.25 -4.72 4260.83 -4.83 4149.68 -4.93 3038.1 -5 2612 -5.1 2111.79 -5.23 1741.29 -5.32 1537.53 -5.52 1222.61 -5.8 907.69 -5.85 666.88 -5.89 333.44 -5.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5100.rse deleted file mode 100644 index eaedd822c7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5100.rse +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5800.eng deleted file mode 100644 index d1f8e4024e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5800.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Pro 150 O5800 White Thunder -O5800 150 754 P 13.950000000000001 26.368000000000002 CTI - 0.069 6337.621 - 0.103 5700.965 - 0.218 5874.598 - 0.378 6135.048 - 0.561 6337.621 - 0.745 6221.865 - 0.985 6221.865 - 1.18 6192.926 - 1.455 6308.682 - 1.753 6366.559 - 1.994 6337.621 - 2.269 6395.498 - 2.509 6308.682 - 2.83 6192.926 - 3.14 6048.232 - 3.426 5874.598 - 3.69 5729.904 - 3.965 5585.209 - 4.263 5382.637 - 4.572 5295.82 - 4.939 5180.064 - 5.053 5035.37 - 5.11 4717.042 - 5.133 4225.08 - 5.145 3675.241 - 5.156 3038.585 - 5.179 2344.051 - 5.214 1475.884 - 5.259 607.717 - 5.294 57.878 - 5.295 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5800.rse deleted file mode 100644 index 960bf3f1ee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O5800.rse +++ /dev/null @@ -1,54 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O8000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O8000.eng deleted file mode 100644 index 6031e41d24..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O8000.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Pro 150 O8000 White Thunder -O8000 150 957 P 18.61 32.672000000000004 CTI - 0.045 3964.63 - 0.046 6742.765 - 0.047 8623.794 - 0.125 7929.26 - 0.239 8160.772 - 0.364 8392.283 - 0.489 8508.039 - 0.614 8536.977 - 0.773 8392.283 - 0.989 8421.222 - 1.273 8479.1 - 1.602 8623.794 - 2.011 8565.916 - 2.33 8565.916 - 2.682 8479.1 - 3.102 8276.527 - 3.568 8045.016 - 3.886 7900.322 - 4.239 7668.81 - 4.591 7524.116 - 4.739 7524.116 - 4.909 7263.666 - 4.955 7003.215 - 4.977 6540.193 - 4.989 5845.659 - 5.0 5006.431 - 5.023 4051.447 - 5.034 3067.524 - 5.045 1996.785 - 5.08 1012.862 - 5.114 318.328 - 5.17 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O8000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O8000.rse deleted file mode 100644 index 0287609851..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Cesaroni_O8000.rse +++ /dev/null @@ -1,55 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. web site. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G100.eng deleted file mode 100644 index 27625aeedd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G100.eng +++ /dev/null @@ -1,7 +0,0 @@ -; -G100 38 406 0 0.093 0.511 Contrail_Rockets -0 182.756 -0.199105 177.584 -0.606264 132.757 -0.986577 53.4476 -1.43 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G100.rse deleted file mode 100644 index 3945691923..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G100.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G123.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G123.eng deleted file mode 100644 index 33a0249eb3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G123.eng +++ /dev/null @@ -1,9 +0,0 @@ -; -; -G123 38 406 0 0.083 0.511 Contrail_Rockets -0.00223714 217.239 -0.00671141 399.995 -0.0201342 220.687 -0.914989 72.4129 -0.955257 37.9306 -1.15 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G123.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G123.rse deleted file mode 100644 index 5814a43436..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G123.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G130.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G130.eng deleted file mode 100644 index 5b4f4187ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G130.eng +++ /dev/null @@ -1,8 +0,0 @@ -; -; -G130 38 406 0 0.093 0.516 Contrail_Rockets -0 662.061 -0.0145414 448.27 -0.0234899 241.376 -0.642058 41.3788 -0.86 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G130.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G130.rse deleted file mode 100644 index 33973e9141..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G130.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G234.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G234.eng deleted file mode 100644 index e363596f49..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G234.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -;G-234-HP Reload -;38mm/16 Inch Hardware -;Fast Nozzle -G234 38 406.4 0 0.498 0.544 Contrail_Rockets -0.00169492 245.419 -0.0973154 540.63 -0.183445 526.943 -0.202461 191.616 -0.237136 143.712 -0.260626 136.868 -0.533 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G234.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G234.rse deleted file mode 100644 index 821b61b510..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G234.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -G-234-HP Reload -38mm/16 Inch Hardware -Fast Nozzle - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G300.eng deleted file mode 100644 index b11822e305..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G300.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;G-300 PVC Motor for 38mm/16 Inch Case. -;Motor uses Fast Nozzle -;90cc's of Nitrous Oxide Used -G300 38 406.4 0 0.023 0.544 Contrail_Rockets -0.00111857 602.221 -0.0497763 814.367 -0.100671 670.655 -0.114094 266.893 -0.158837 239.52 -0.25 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G300.rse deleted file mode 100644 index e26e3109ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_G300.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -G-300 PVC Motor for 38mm/16 Inch Case. -Motor uses Fast Nozzle -90cc's of Nitrous Oxide Used - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H121.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H121.eng deleted file mode 100644 index 2d1b380bf4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H121.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -; -H121 38 516 0 0.11 0.612 Contrail_Rockets -0.00223714 251.721 -0.0402685 265.514 -0.0738255 203.446 -0.400447 179.308 -0.60179 134.481 -1.08949 127.585 -1.40268 93.1023 -1.61969 37.9306 -1.85 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H121.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H121.rse deleted file mode 100644 index 93ad3f6b2a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H121.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H141.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H141.eng deleted file mode 100644 index cabed3b841..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H141.eng +++ /dev/null @@ -1,9 +0,0 @@ -; -; -H141 38 516 0 0.125 0.612 Contrail_Rockets -0.00223714 265.514 -0.111857 262.066 -1.20134 106.895 -1.25951 55.1717 -1.3557 27.5859 -1.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H141.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H141.rse deleted file mode 100644 index 447440df22..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H141.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H211.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H211.eng deleted file mode 100644 index 966d41f5e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H211.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -; -H211 38 516 0 0.125 0.612 Contrail_Rockets -0.00111857 531.028 -0.0190157 634.475 -0.0223714 593.096 -0.033557 544.821 -0.296421 317.238 -0.313199 186.205 -0.743848 96.5506 -0.97 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H211.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H211.rse deleted file mode 100644 index 6b7c4a61c0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H211.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H222.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H222.eng deleted file mode 100644 index d708758990..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H222.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -;H-222-HP Reload -;38mm/16 inch Case Used -;Medium Nozzle Used For Reload -;140cc of Nitrous Oxide Used -H222 38 406.4 0 0.022 0.52 Contrail_Rockets -0 684.342 -0.0302013 656.968 -0.0525727 574.847 -0.0581655 349.014 -0.346756 260.05 -0.364653 191.616 -0.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H222.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H222.rse deleted file mode 100644 index dd6265f5bd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H222.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -H-222-HP Reload -38mm/16 inch Case Used -Medium Nozzle Used For Reload -140cc of Nitrous Oxide Used - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H246.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H246.eng deleted file mode 100644 index 0bd0b63988..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H246.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;H-246 HP Reload -;38mm/20 Inch Case Used -;Medium Nozzle Used -;185cc Nitrous Oxide Used -H246 38 508 0 0.022 0.598 Contrail_Rockets -0.00111857 609.064 -0.0123043 499.57 -0.502237 253.206 -0.514541 157.399 -0.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H246.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H246.rse deleted file mode 100644 index 4c624a8a74..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H246.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -H-246 HP Reload -38mm/20 Inch Case Used -Medium Nozzle Used -185cc Nitrous Oxide Used - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H248.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H248.rse deleted file mode 100644 index ea2ddca503..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H248.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -H-248-PVC Reload -38mm/28 Inch Hardware -Fast Nozzle - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H277.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H277.eng deleted file mode 100644 index 6032648418..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H277.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -; -H277 38 719 0 0.11 0.71 Contrail_Rockets -0 765.508 -0.0738255 703.44 -0.118568 337.927 -0.917226 179.308 -0.957494 75.8612 -0.995526 41.3788 -1.02908 48.2753 -1.15 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H277.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H277.rse deleted file mode 100644 index e533b472d6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H277.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H300.eng deleted file mode 100644 index 05f3910e92..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H300.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -H300 38 516 0 0.11 0.612 Contrail_Rockets -0 558.614 -0.115213 717.233 -0.12528 268.962 -0.214765 248.273 -0.286353 241.376 -0.334452 227.583 -0.62 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H300.rse deleted file mode 100644 index 6b0b415151..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H300.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H303.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H303.eng deleted file mode 100644 index e1cc505830..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H303.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -;H-303-PVC Hybrid Motor -;Uses Fast Nozzle -;38mm/20 Inch Hardware -;Uses 185cc Nitrous Oxide -H303 38 508 0 0.023 0.589 Contrail_Rockets -0 663.812 -0.0447427 780.15 -0.108501 704.872 -0.111857 342.171 -0.176734 328.484 -0.196868 307.954 -0.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H303.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H303.rse deleted file mode 100644 index e718511628..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H303.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -H-303-PVC Hybrid Motor -Uses Fast Nozzle -38mm/20 Inch Hardware -Uses 185cc Nitrous Oxide - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H340.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H340.eng deleted file mode 100644 index ab350daf69..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H340.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -H340 38 711.2 0 0.024 0.816 Contrail_Rockets -0 920.322 -0.0847458 715.806 -0.101695 345.121 -0.683051 332.338 -0.740678 255.645 -0.766102 153.387 -0.95 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H340.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H340.rse deleted file mode 100644 index 3692617fb3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_H340.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I155.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I155.eng deleted file mode 100644 index 934a4a3fa3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I155.eng +++ /dev/null @@ -1,8 +0,0 @@ -; -; -I155 38 711.2 0 0.045 0.725 Contrail_Rockets -0.0111857 222.411 -2.71253 150.555 -2.82998 82.121 -2.96421 58.1691 -3.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I155.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I155.rse deleted file mode 100644 index 14687044a8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I155.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I210.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I210.eng deleted file mode 100644 index 17ea5733f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I210.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -I210 38 922 0 0.125 0.87 Contrail_Rockets -0 468.96 -0.464206 386.202 -0.497763 206.894 -2.25391 110.343 -2.34899 41.3788 -2.40492 13.7929 -2.72 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I210.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I210.rse deleted file mode 100644 index f0c3428a7f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I210.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I221.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I221.eng deleted file mode 100644 index 63fa12da9e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I221.eng +++ /dev/null @@ -1,9 +0,0 @@ -; -; -I221 38 719 0 0.125 0.71 Contrail_Rockets -0 482.753 -0.503356 358.616 -0.519016 179.308 -1.49217 103.447 -1.53691 27.5859 -1.74 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I221.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I221.rse deleted file mode 100644 index dae6fe36e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I221.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I250.rse deleted file mode 100644 index 4728273a1b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I250.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -I-250-HP -38mm/28 Inch Hardware -430cc -Medium Nozzle - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I290.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I290.eng deleted file mode 100644 index 36c1a7a45e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I290.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -I290 38 914.4 0 0.068 0.884 Contrail_Rockets -0 521.516 -0.0847458 337.451 -0.138983 357.903 -0.19661 398.806 -0.308475 490.838 -0.40339 449.935 -0.589831 357.903 -0.762712 419.258 -0.932203 265.871 -1.08814 163.613 -1.24068 81.8064 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I290.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I290.rse deleted file mode 100644 index 8dfac0d4d5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I290.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I307.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I307.eng deleted file mode 100644 index eeabc88d89..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I307.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -; -I307 38 922 0 0.11 0.81 Contrail_Rockets -0.00223714 551.717 -0.199105 717.233 -0.210291 386.202 -0.756152 620.682 -0.834452 455.167 -0.941834 310.341 -1.09172 199.998 -1.22371 117.24 -1.85 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I307.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I307.rse deleted file mode 100644 index 02b8e15a2e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I307.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I333.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I333.eng deleted file mode 100644 index 3e7333ba06..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I333.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -;I-333-PVC Reload -;38mm/36 Inch Hardware -;Uses Fast Nozzle -;460cc Nitrous Oxide -I333 38 914.4 0 0.068 0.929 Contrail_Rockets -0.00894855 855.427 -0.0290828 881.09 -0.0536913 504.702 -0.604027 342.171 -0.796421 461.931 -1.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I333.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I333.rse deleted file mode 100644 index d19966ee55..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I333.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -I-333-PVC Reload -38mm/36 Inch Hardware -Uses Fast Nozzle -460cc Nitrous Oxide - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I400.eng deleted file mode 100644 index 6b34950051..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I400.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -;I-400-HP -;38mm/36 Inch Hardware -;Uses Fast/X-Fast Nozzle -;460cc Nitrous Oxide -I400 38 914.4 0 0.086 0.925 Contrail_Rockets -0.00447427 667.233 -0.0782998 898.199 -0.116331 598.799 -0.297539 521.811 -0.420582 410.605 -0.559284 487.594 -0.738255 367.834 -1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I400.rse deleted file mode 100644 index a0c95a7ca0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I400.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -I-400-HP -38mm/36 Inch Hardware -Uses Fast/X-Fast Nozzle -460cc Nitrous Oxide - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I500.eng deleted file mode 100644 index 31cfb23eb6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I500.eng +++ /dev/null @@ -1,9 +0,0 @@ -; -; -I500 38 719 0 0.748 0.8 Contrail_Rockets -0.00111857 1155.16 -0.0201342 706.888 -0.0313199 999.988 -0.574944 103.447 -0.623043 120.688 -0.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I500.rse deleted file mode 100644 index c1a94a9a3b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I500.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I727.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I727.eng deleted file mode 100644 index 31a5ddc43c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I727.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -; -I727 38 914.4 0 0.022 0.929 Contrail_Rockets -0.00847458 1278.22 -0.0355932 1661.69 -0.0983051 1508.31 -0.144068 1482.74 -0.171186 1175.97 -0.218644 1022.58 -0.422034 792.499 -0.75 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I727.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I727.rse deleted file mode 100644 index 3530340822..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I727.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I747.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I747.eng deleted file mode 100644 index 76de3965f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I747.eng +++ /dev/null @@ -1,5 +0,0 @@ -; -; -I747 38 711.2 0 0.068 0.839 Contrail_Rockets -0 1917.34 -0.45 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I747.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I747.rse deleted file mode 100644 index ea3e510641..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_I747.rse +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J150.eng deleted file mode 100644 index 9bd4adef94..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J150.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;J-150-HP -;38mm/36 Inch -;550cc -;Slow Nozzle -J150 38 914.4 0 0.091 0.839 Contrail_Rockets -0 266.893 -2.00224 184.772 -2.75727 150.555 -3.00895 92.3861 -4.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J150.rse deleted file mode 100644 index f7f13d37ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J150.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -J-150-HP -38mm/36 Inch -550cc -Slow Nozzle - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J222.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J222.eng deleted file mode 100644 index 2a3ceb778a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J222.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -;J-222-HP Reload -;Medium Nozzle -;38mm/48 Inch Hardware -;830cc -J222 38 1219.2 0 0.091 1.043 Contrail_Rockets -0.00559284 547.473 -0.167785 355.858 -2.86353 191.616 -2.95861 143.712 -3.08725 130.025 -3.46756 95.8079 -4.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J222.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J222.rse deleted file mode 100644 index 6a9ca99613..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J222.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -J-222-HP Reload -Medium Nozzle -38mm/48 Inch Hardware -830cc - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J234.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J234.eng deleted file mode 100644 index 574cbd3493..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J234.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;J-234-BG Reload -;Slow Nozzle -;54mm/36 Inch Hardware -J234 54 914.4 0 0.177 1.764 Contrail_Rockets -0.00559284 229.255 -0.503356 349.014 -3.47875 208.724 -3.62416 116.338 -3.75839 78.6993 -4.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J234.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J234.rse deleted file mode 100644 index 6dfd163927..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J234.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -J-234-BG Reload -Slow Nozzle -54mm/36 Inch Hardware - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J242.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J242.eng deleted file mode 100644 index a0c271f5c0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J242.eng +++ /dev/null @@ -1,8 +0,0 @@ -; -; -J242 38 1227 0 0.11 1.065 Contrail_Rockets -0.0111857 448.27 -1.73937 268.962 -1.76174 165.515 -2.97539 48.2753 -3.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J242.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J242.rse deleted file mode 100644 index 02e5b8e653..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J242.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J245.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J245.eng deleted file mode 100644 index 9fbd976d96..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J245.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -;J-245-BG Reload -;Slow Nozzle -;54mm/28 Inch Hardware -J245 54 711.2 0 0.1 1.55 Contrail_Rockets -0 444.822 -0.139821 355.858 -1.05145 307.954 -2.06376 184.772 -2.15884 102.651 -2.28188 68.4342 -2.62 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J245.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J245.rse deleted file mode 100644 index cd51df8486..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J245.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -J-245-BG Reload -Slow Nozzle -54mm/28 Inch Hardware - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J246.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J246.eng deleted file mode 100644 index 3dfff09891..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J246.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -;J-246-HP Reload -;38mm/36 Inch Hardware -;550cc -;Medium Nozzle -J246 38 914.4 0 0.068 0.861 Contrail_Rockets -0.0167785 492.726 -0.0279642 328.484 -0.134228 526.943 -0.341163 403.762 -0.520134 349.014 -2.00224 191.616 -2.12528 116.338 -2.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J246.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J246.rse deleted file mode 100644 index 581182b188..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J246.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -J-246-HP Reload -38mm/36 Inch Hardware -550cc -Medium Nozzle - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J272.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J272.eng deleted file mode 100644 index 314da9ac7c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J272.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -J272 54 914.4 0 0.114 1.746 Contrail_Rockets -0.00847458 398.806 -0.169492 572.645 -0.533898 460.161 -0.872881 388.58 -1.05932 357.903 -2.91525 204.516 -3.19492 71.5806 -3.51695 40.9032 -3.63559 51.129 -3.86 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J272.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J272.rse deleted file mode 100644 index d412b821c5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J272.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J292.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J292.eng deleted file mode 100644 index 3b4b919f8d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J292.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -J292 54 711.2 0 0.136 1.542 Contrail_Rockets -0.00847458 552.193 -0.262712 480.612 -0.423729 419.258 -0.762712 337.451 -1.97458 245.419 -2.07627 143.161 -2.53 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J292.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J292.rse deleted file mode 100644 index 3689460987..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J292.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J333.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J333.eng deleted file mode 100644 index 4a0dba86d0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J333.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -J333 38 1227 0 0.11 1.064 Contrail_Rockets -0 717.233 -0.204139 799.99 -0.752237 448.27 -0.763423 268.962 -2.16443 62.0682 -2.23714 27.5859 -2.4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J333.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J333.rse deleted file mode 100644 index 01d8a8047a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J333.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J345.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J345.eng deleted file mode 100644 index 72f66c6fe9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J345.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;J-345-PVC -;38mm/48 Inch Hardware -;735cc -;Fast Nozzle -J345 38 1219.2 0 0.098 1.118 Contrail_Rockets -0.00559284 881.09 -0.0782998 667.233 -1.21924 376.388 -1.26398 359.279 -2.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J345.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J345.rse deleted file mode 100644 index a302622afe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J345.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -J-345-PVC -38mm/48 Inch Hardware -735cc -Fast Nozzle - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J355.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J355.eng deleted file mode 100644 index 99af48c08e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J355.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -J355 54 711.2 0 0.09 1.564 Contrail_Rockets -0 562.419 -0.176271 501.064 -0.2 286.322 -0.433898 286.322 -0.688136 337.451 -0.701695 501.064 -0.80678 490.838 -1.00339 521.516 -1.21695 419.258 -1.31186 429.484 -1.37627 460.161 -1.49831 429.484 -1.54576 224.968 -1.64068 122.71 -1.91 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J355.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J355.rse deleted file mode 100644 index 53751b60ae..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J355.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J358.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J358.eng deleted file mode 100644 index 9f61faa4c6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J358.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -; -J358 54 914.4 0 0.111 1.743 Contrail_Rockets -0.00847458 726.032 -0.0932203 726.032 -0.110169 501.064 -0.483051 480.612 -0.550847 398.806 -2.23729 286.322 -2.32203 153.387 -2.44915 112.484 -2.69 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J358.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J358.rse deleted file mode 100644 index 35868c90ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J358.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J416.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J416.eng deleted file mode 100644 index 07e4551fee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J416.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -J416 54 914.4 0 0.158 1.7 Contrail_Rockets -0 787.386 -0.0762712 777.161 -0.211864 572.645 -0.432203 531.741 -0.864407 511.29 -1.26271 480.612 -1.82203 470.387 -2.00847 347.677 -2.13559 276.097 -2.24576 184.064 -2.40678 81.8064 -2.75 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J416.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J416.rse deleted file mode 100644 index c74b954ce9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J416.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J555.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J555.eng deleted file mode 100644 index a1b444eb2b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J555.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -J555 38 1227 0 0.166 1.132 Contrail_Rockets -0 931.023 -0.0581655 1344.81 -0.277405 810.335 -1.17226 241.376 -1.2774 68.9647 -1.31767 51.7235 -1.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J555.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J555.rse deleted file mode 100644 index 7b183b6fb5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J555.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J642.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J642.eng deleted file mode 100644 index 229af7ee53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J642.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; -J642 54 914.4 0 0.159 1.791 Contrail_Rockets -0.00677966 1482.74 -0.0779661 997.015 -0.471186 1303.79 -0.542373 818.064 -0.633898 741.37 -0.742373 587.983 -1.25085 485.725 -1.29831 332.338 -1.39661 178.951 -1.47458 51.129 -1.72 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J642.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J642.rse deleted file mode 100644 index 5d295edd84..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J642.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J800.eng deleted file mode 100644 index c33d77b7e0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J800.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -;J-800-HP -;38mm/48 Inch -;685cc -;XXF Nozzle (Short Nozzle) -J800 38 1219.2 0 0.105 1.148 Contrail_Rockets -0.00223714 1830.61 -0.52349 889.644 -0.639821 650.125 -0.740492 444.822 -0.823266 273.737 -0.90604 153.977 -0.997763 136.868 -1.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J800.rse deleted file mode 100644 index 6d32d07062..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_J800.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -J-800-HP -38mm/48 Inch -685cc -XXF Nozzle (Short Nozzle) - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K234.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K234.eng deleted file mode 100644 index 62ce6e175e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K234.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -;K-234-BG Reload -;Slow Nozzle -;54mm/48 Inch Hardware -K234 54 1219.2 0 0.385 2.063 Contrail_Rockets -0 92.3861 -0.234899 396.918 -0.973154 338.749 -5.97315 171.085 -6.05145 106.073 -6.19687 78.6993 -6.37584 54.7473 -7.05 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K234.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K234.rse deleted file mode 100644 index 43c02c3c8f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K234.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -K-234-BG Reload -Slow Nozzle -54mm/48 Inch Hardware - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K265.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K265.eng deleted file mode 100644 index 14fe5a08bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K265.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -K265 54 1219.2 0 0.271 2.085 Contrail_Rockets -0 470.387 -2.44068 347.677 -3.91525 224.968 -4.77966 173.839 -5.13559 112.484 -5.33898 51.129 -6.26 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K265.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K265.rse deleted file mode 100644 index 0777ba4d99..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K265.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K300.eng deleted file mode 100644 index 385b78cbac..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K300.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -;K-300-BS -;75mm/40 Inch Hardware -;2050cc -;Slow Nozzle -K300 75 1016 0 0.181 4.059 Contrail_Rockets -0 431.135 -0.324385 526.943 -0.98434 479.039 -1.1745 369.545 -5 280.58 -5.19016 171.085 -5.35794 102.651 -5.6264 54.7473 -5.79418 27.3737 -6.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K300.rse deleted file mode 100644 index 930004ae8e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K300.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - -K-300-BS -75mm/40 Inch Hardware -2050cc -Slow Nozzle - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K321.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K321.eng deleted file mode 100644 index 42c6698cd6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K321.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -;K-321-BG Reload -;54mm/48 Inch Hardware -;Medium Nozzle -K321 54 1219.2 0 0.183 2.043 Contrail_Rockets -0.00559284 218.989 -0.218121 410.605 -0.973154 718.559 -0.989933 732.246 -1.05705 444.822 -1.4877 403.762 -3.97092 232.676 -4.11633 88.9644 -4.23378 54.7473 -4.34564 54.7473 -4.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K321.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K321.rse deleted file mode 100644 index b1c0a8d2d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K321.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - -K-321-BG Reload -54mm/48 Inch Hardware -Medium Nozzle - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K404.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K404.eng deleted file mode 100644 index ad9e933285..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K404.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -;K-404-Sparky -;75mm/40 Inch Hardware -;2050cc -;Slow Nozzle -K404 75 1016 0 0.318 4.15 Contrail_Rockets -0.0111857 670.655 -4.63087 335.328 -4.80984 205.303 -4.9217 130.025 -5.0783 82.121 -5.26846 41.0605 -6.4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K404.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K404.rse deleted file mode 100644 index a587e46fbd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K404.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -K-404-Sparky -75mm/40 Inch Hardware -2050cc -Slow Nozzle - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K456.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K456.eng deleted file mode 100644 index 72e556e862..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K456.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -; -K456 75 813 0 0.58 3.704 Contrail_Rockets -0.00559284 681.026 -0.212528 896.541 -0.503356 775.853 -1.36465 577.579 -1.52685 525.856 -2.51119 370.685 -2.66779 129.309 -3.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K456.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K456.rse deleted file mode 100644 index 6d889d5a7e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K456.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K543.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K543.rse deleted file mode 100644 index d5bb6eb1f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K543.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - -Contrail Rockets Hybrid Rocket Motor (K543) -75mm-1400cc Motor Hardware w/ Slow Injector Kit and Nozzle -Black Smoke Reload -Data Input By Tom R. Sanders of Contrail Rockets LLC - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K555.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K555.rse deleted file mode 100644 index 71aa834561..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K555.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - -K-555-BG Reload -54mm/48 Inch Case -XF Nozzle - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K630.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K630.eng deleted file mode 100644 index 1da3faf61a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K630.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -;K-630-Sparky Reload -;75mm/41 Inch Hardare -;1400cc -;Medium Nozzle -K630 75 1041.4 0 0.075 3.55 Contrail_Rockets -0.00559284 307.954 -0.0978747 573.136 -0.500559 889.644 -1.75336 667.233 -1.85403 410.605 -1.93792 239.52 -2.04978 128.314 -2.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K630.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K630.rse deleted file mode 100644 index 7116a92ff2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K630.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -K-630-Sparky Reload -75mm/41 Inch Hardare -1400cc -Medium Nozzle - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K678.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K678.eng deleted file mode 100644 index 16febf9bdb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K678.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;K-678-Sparky -;75mm/40 Inch Hardware -;2050cc -;Medium Nozzle -K678 75 1016 0 0.827 4.05 Contrail_Rockets -0.00559284 1163.38 -2.21477 444.822 -2.32103 256.628 -2.38814 102.651 -2.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K678.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K678.rse deleted file mode 100644 index 2e78cd27ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K678.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -K-678-Sparky -75mm/40 Inch Hardware -2050cc -Medium Nozzle - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K707.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K707.eng deleted file mode 100644 index 3d6ec1eb21..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K707.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -K707 75 813 0 0.145 3.674 Contrail_Rockets -0.0466102 281.209 -0.122881 1278.22 -0.165254 894.757 -0.495763 1431.61 -0.618644 1150.4 -0.694915 945.886 -0.834746 920.322 -1.01271 664.677 -1.50847 536.854 -1.62288 281.209 -1.72881 127.822 -2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K707.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K707.rse deleted file mode 100644 index c722007e30..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K707.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -K-707-BG Reload -Medium Nozzle -1400cc - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K777.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K777.eng deleted file mode 100644 index befb6141c4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K777.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -K777 75 1016 0 0.645 4.05 Contrail_Rockets -0 931.023 -0.0950783 965.506 -0.111857 1793.08 -0.167785 1741.36 -0.206935 1344.81 -0.727069 1137.92 -1.00112 810.335 -1.97427 413.788 -2.04698 172.412 -2.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K777.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K777.rse deleted file mode 100644 index c08bb784fb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K777.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K888.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K888.rse deleted file mode 100644 index d233710c78..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_K888.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -Contrail Rockets Hybrid Rocket Motor (K888) -75mm-2000cc Hardware with Medium Injector Kit and Nozzle -Black Smoke Reload -Data Input By Tom R. Sanders of Contrail Rockets LLC. - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1222.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1222.eng deleted file mode 100644 index f11e7a169d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1222.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -;Contrail Rockets LLC Hybrid Rocket Motor (L1222) -;75mm-3200cc Motor System -;Sparky Hybrid Fuel -;Data Input By Tom R. Sanders of Contrail Rockets -L1222 75 1339.85 0 3.9 4.989 Contrail_Rockets -0 455 -0.25 455 -0.5 2725 -0.75 1816 -2.75 680 -3.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1222.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1222.rse deleted file mode 100644 index 7d41fdf15c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1222.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -Contrail Rockets LLC Hybrid Rocket Motor (L1222) -75mm-3200cc Motor System -Sparky Hybrid Fuel -Data Input By Tom R. Sanders of Contrail Rockets - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1428.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1428.rse deleted file mode 100644 index 0fc7dae32a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L1428.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -Contrail Rockets LLC. Hybrid Rocket Motor (L1428) -75mm-3200cc Motor Using Fast Injector Kit and Nozzle -Data Input By Tom R. Sanders of Contrail Rockets - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L2525.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L2525.eng deleted file mode 100644 index 032e4879fb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L2525.eng +++ /dev/null @@ -1,6 +0,0 @@ -; -; -L2525 75 1492.25 0 3.5 5.579 Contrail_Rockets -0 4200 -0.754759 3294.57 -1.9 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L2525.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L2525.rse deleted file mode 100644 index 28bc1f74fc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L2525.rse +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L369.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L369.eng deleted file mode 100644 index 7c1d69d8db..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L369.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -;L-369-Sparky -;Slow nozzle -;75mm/54 Inch Hardware -;3200cc -L369 75 1371.6 0 0.514 4.8 Contrail_Rockets -0.0223714 540.63 -1.45414 533.787 -8.92617 260.05 -9.08277 130.025 -9.28412 68.4342 -10.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L369.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L369.rse deleted file mode 100644 index fd9e40de0b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L369.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -L-369-Sparky -Slow nozzle -75mm/54 Inch Hardware -3200cc - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L800.eng deleted file mode 100644 index dadaba267e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L800.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -;L-800-Sparky -;75mm/54 Inch Hardware -;3200cc -;Medium Nozzle -L800 75 1371.6 0 0.988 4.726 Contrail_Rockets -0.00559284 1351.58 -0.167785 1129.16 -0.329978 1266.03 -0.553691 1248.92 -0.665548 1129.16 -3.48434 821.21 -3.5962 496.148 -3.69687 273.737 -3.83669 153.977 -4.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L800.rse deleted file mode 100644 index c32d944270..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_L800.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - -L-800-Sparky -75mm/54 Inch Hardware -3200cc -Medium Nozzle - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1491.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1491.rse deleted file mode 100644 index 685ae0e65c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1491.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -Contrail Rockets LLC. Hybrid Rocket Motor (M1491 -75mm-3200cc Motor Using Medium Injector Kit and Nozzle -Data Input By Tom R. Sanders of Contrail Rockets - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1575.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1575.eng deleted file mode 100644 index 3b4e0b85ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1575.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -;M-1575-Black Gold Reload -;5300cc -;98mm/60 Inch Hardware -M1575 98 1524 0 0.726 10.863 Contrail_Rockets -0.139821 2429.41 -0.503356 2976.89 -2.95302 1402.9 -3.06488 923.861 -3.21029 376.388 -3.31096 205.303 -4.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1575.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1575.rse deleted file mode 100644 index 41614302e7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M1575.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - -M-1575-Black Gold Reload -5300cc -98mm/60 Inch Hardware - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2281.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2281.rse deleted file mode 100644 index 3a1c533084..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2281.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - -Contrail Rockets LLC. Hybrid Rocket Motor (M2281) -75mm-3200cc Motor Using Fast Injector Kit and Nozzle -Data Input By Tom R. Sanders of Contrail Rockets - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2700.eng deleted file mode 100644 index 34bc383d98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2700.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -M2700 98 1524 0 0.412 10.432 Contrail_Rockets -0.00847458 2965.48 -0.0508475 3272.26 -0.105932 5930.96 -0.347458 5828.7 -0.504237 6442.25 -0.512712 5726.45 -0.601695 5112.9 -0.745763 3681.29 -0.902542 3067.74 -1.06356 2454.19 -1.18644 1942.9 -1.34322 1738.39 -1.75 715.806 -1.95763 102.258 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2700.rse deleted file mode 100644 index 73484330db..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2700.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2800.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2800.eng deleted file mode 100644 index a1b26b205c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2800.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -;M-2800-Black Gold Reload -;5300cc -;98mm/60 inch Hardware -M2800 98 1524 0 0.476 10.704 Contrail_Rockets -0.00838926 2395.2 -0.251678 2805.8 -0.545302 3695.45 -0.75783 5611.6 -0.911633 4311.35 -1.1745 3558.58 -1.4094 2258.33 -1.70861 1505.55 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2800.rse deleted file mode 100644 index 92cc39ec98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M2800.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -M-2800-Black Gold Reload -5300cc -98mm/60 inch Hardware - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M711.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M711.eng deleted file mode 100644 index 9570b1f5f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M711.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -;Contrail Rockets LLC Hybrid Rocket Motor. (M-711) -;75-3200cc Hardware Set -;Black Smoke Fuel -M711BS 75 1340 0 4.2 4.9 Contrail_Rockets -0 1140 -1.46697 1069.77 -4 680 -6.47256 589.147 -6.67413 279.07 -7.22 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M711.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M711.rse deleted file mode 100644 index 863d74d0d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_M711.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - -Contrail Rockets LLC Hybrid Rocket Motor. (M-711) -75-3200cc Hardware Set -Black Smoke Fuel - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_O6300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_O6300.eng deleted file mode 100644 index 3d0e4fd289..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_O6300.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -O6300 152 1828.8 0 3.175 28.576 Contrail_Rockets -0.0338983 12271 -0.728814 9714.51 -1.65254 9203.22 -2.37288 8947.57 -2.51695 6646.77 -2.78814 4601.61 -2.99153 4857.25 -3.27966 3579.03 -3.61017 1278.22 -4.29 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_O6300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_O6300.rse deleted file mode 100644 index 1d5d1387f9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Contrail_O6300.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_E12.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_E12.eng deleted file mode 100644 index 30b42e6b76..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_E12.eng +++ /dev/null @@ -1,10 +0,0 @@ -E12EM 24 101 0-4-8 0.02800 0.05320 EM - 0.01 31.17 - 0.13 24.43 - 0.17 23.34 - 1.50 14.83 - 2.00 10.28 - 2.50 4.80 - 2.91 2.30 - 2.92 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_F23.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_F23.eng deleted file mode 100644 index 0ea956385b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_F23.eng +++ /dev/null @@ -1,13 +0,0 @@ -F23EM 24 139 0-4-8 0.04760 0.07560 EM - 0.01 24.19 - 0.05 39.00 - 0.07 39.14 - 0.13 34.58 - 1.00 26.94 - 2.00 19.52 - 2.40 14.00 - 2.70 7.96 - 3.00 4.46 - 3.55 1.27 - 3.58 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G20.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G20.eng deleted file mode 100644 index c8fc64894f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G20.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -G20 29 149 3 0.0729 0.1179 Ellis_Mountain -0.0463679 46.6843 -0.278207 30.3888 -0.479134 26.8655 -1.00464 24.6634 -3.47759 22.0209 -4.32767 13.653 -5.11592 3.08293 -5.47 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G20.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G20.rse deleted file mode 100644 index 427550fd37..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G20.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G35.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G35.eng deleted file mode 100644 index 2c6da54f5d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G35.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -;Ellis Mountain G35 Single Use Motor -G35EM 29 165 6-10 0.082 0.135 Ellis_Mountain -0.01 51.12 -0.04 57.55 -0.08 43.78 -2.73 28.16 -3.28 28.16 -3.78 6.73 -4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G35.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G35.rse deleted file mode 100644 index 3575edcc0f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G35.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - Ellis Mountain G35 Single Use Motor - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G37.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G37.eng deleted file mode 100644 index 1df8f92c18..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G37.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; -G37 24 181 6-10-100 0.068 0.1133 Ellis_Mountain -0.0231839 69.586 -0.162287 55.9331 -0.332303 48.0056 -0.502318 44.9226 -0.996909 40.9589 -1.49923 38.7568 -2.00155 34.3526 -2.49614 28.1868 -2.75116 18.4976 -2.99845 5.28502 -3.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G37.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G37.rse deleted file mode 100644 index 22c58ba00f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_G37.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H275.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H275.eng deleted file mode 100644 index 1d83b445f7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H275.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -; -H275 29 275 10 0.142 0.255 Ellis_Mountain -0.0123648 792.752 -0.015456 356.739 -0.197836 312.697 -0.797527 268.655 -0.911901 255.442 -0.992272 123.317 -1.04173 39.6376 -1.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H275.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H275.rse deleted file mode 100644 index ef1a6ad48a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H275.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H48.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H48.eng deleted file mode 100644 index a6d69fbc98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H48.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -;Ellis Mountain Rocket Works -;H48 Single Use motor -H48 38 200 8-100 0.154 0.292 Ellis_Mountain -0.05 101.5 -0.1 101.5 -0.21 92.18 -0.46 86.48 -0.74 83.38 -1 80 -1.49 74.57 -1.99 68.36 -2.48 63.18 -2.99 56.45 -3.2 34.18 -3.5 18 -3.69 13.46 -4 11 -4.36 7.77 -4.4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H48.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H48.rse deleted file mode 100644 index 790a32dc28..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H48.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - -Ellis Mountain Rocket Works -H48 Single Use motor - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H50.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H50.eng deleted file mode 100644 index 717bcd09e2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H50.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -;Ellis Mountain Rocket Works -;H50 Single Use motor -H50 29 279 6-10 0.163 0.3 Ellis_Mountain -0.01 63.67 -0.17 108.9 -0.27 94.9 -0.47 81.43 -0.79 71.02 -1.27 64.9 -1.97 60.61 -2.56 56.94 -3.01 52.04 -3.52 45.31 -3.97 34.9 -4.49 18.37 -4.97 4.9 -5.28 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H50.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H50.rse deleted file mode 100644 index d3d8f04feb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_H50.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - -Ellis Mountain Rocket Works -H50 Single Use motor - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I130.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I130.eng deleted file mode 100644 index 005f74f35c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I130.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -; -I130 38 330 100 0.308 0.625 Ellis_Mountain -0.015456 266.453 -0.0540958 160.753 -0.502318 169.561 -2.23338 180.571 -2.48841 149.742 -2.99073 136.53 -3.49304 77.0732 -4.01082 26.4251 -4.43 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I130.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I130.rse deleted file mode 100644 index ec84693740..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I130.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I134.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I134.eng deleted file mode 100644 index 95a6c9adff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I134.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -;Ellis Mountain Rocket Works -;I134 38mm Single Use motor -I134 38 355 15 0.2807 0.5812 Ellis_Mountain -0.1 268.8 -0.2 138 -1 116 -2 102 -3 85 -4 67 -4.65 16.46 -4.82 6.86 -5.07 6.86 -5.15 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I134.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I134.rse deleted file mode 100644 index 273456117e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I134.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - -Ellis Mountain Rocket Works -I134 38mm Single Use motor - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I150.eng deleted file mode 100644 index bab3797fbc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I150.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain I150 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I150 38 229 0 0.172032 0.425152 EM - 0.050 101.298 - 0.152 159.193 - 0.255 169.686 - 0.358 179.603 - 0.460 188.152 - 0.564 193.364 - 0.667 204.520 - 0.769 212.046 - 0.872 212.937 - 0.975 208.076 - 1.077 196.555 - 1.180 191.025 - 1.283 186.106 - 1.386 181.835 - 1.490 177.947 - 1.592 175.877 - 1.695 173.744 - 1.798 170.664 - 1.900 161.823 - 2.003 149.111 - 2.106 124.923 - 2.208 68.392 - 2.311 20.122 - 2.415 7.794 - 2.518 4.464 - 2.621 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I150.rse deleted file mode 100644 index 57b9efba38..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I150.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I160.eng deleted file mode 100644 index 7d0e294066..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I160.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain I160 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I160 38 280 0 0.235648 0.528192 EM - 0.068 169.405 - 0.206 199.425 - 0.346 205.072 - 0.485 206.075 - 0.624 205.840 - 0.763 204.052 - 0.902 200.850 - 1.042 200.885 - 1.180 203.053 - 1.319 204.157 - 1.458 206.392 - 1.598 210.051 - 1.736 212.769 - 1.875 211.177 - 2.015 207.500 - 2.154 189.766 - 2.293 136.149 - 2.431 52.306 - 2.571 42.841 - 2.710 41.803 - 2.849 33.042 - 2.987 24.614 - 3.127 17.154 - 3.267 7.477 - 3.406 1.777 - 3.546 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I160.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I160.rse deleted file mode 100644 index f4930d7c8d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I160.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I230.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I230.eng deleted file mode 100644 index e9df182902..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I230.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain I230 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I230 38 331 0 0.282688 0.620928 EM - 0.058 292.627 - 0.178 317.660 - 0.298 309.874 - 0.418 305.243 - 0.537 299.679 - 0.657 298.170 - 0.777 294.591 - 0.897 293.800 - 1.018 289.736 - 1.138 288.222 - 1.257 284.614 - 1.377 281.149 - 1.497 274.879 - 1.617 269.775 - 1.736 258.925 - 1.856 242.249 - 1.976 207.607 - 2.097 136.698 - 2.217 86.506 - 2.336 74.324 - 2.456 51.246 - 2.576 45.546 - 2.696 27.050 - 2.816 6.382 - 2.936 1.423 - 3.057 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I230.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I230.rse deleted file mode 100644 index 96fc40af0e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I230.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I69.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I69.eng deleted file mode 100644 index c0d600535d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I69.eng +++ /dev/null @@ -1,19 +0,0 @@ -; -;Ellis Mountain Rocket Works -;I69 38mm Single Use motor -I69 29 406 10 0.236 0.4 Ellis_Mountain -0.05 78.67 -0.1 149.7 -0.25 133.5 -0.49 111.51 -0.75 100 -1.07 93.18 -1.48 87.83 -2 82.49 -2.5 78 -2.99 73.32 -3.5 64.5 -3.99 48.88 -4.5 29.79 -4.99 9.17 -5.28 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I69.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I69.rse deleted file mode 100644 index 2797712113..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_I69.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - -Ellis Mountain Rocket Works -I69 38mm Single Use motor - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J110.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J110.eng deleted file mode 100644 index 394d41d913..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J110.eng +++ /dev/null @@ -1,11 +0,0 @@ -; -; -J110 54 276.2 100 0.45359 0.8754 Ellis_Mountain -0.108192 193.784 -0.386399 147.54 -1.00464 139.833 -4.034 116.711 -5.00773 94.6899 -6.01236 67.1637 -6.53787 37.4355 -6.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J110.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J110.rse deleted file mode 100644 index 1fc9827bc6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J110.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J148.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J148.eng deleted file mode 100644 index 2b37673c6c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J148.eng +++ /dev/null @@ -1,12 +0,0 @@ -; -; -J148 54 355.6 14 0.67 1.179 Ellis_Mountain -0.139104 218.007 -0.231839 183.875 -0.448223 171.763 -1.00464 170.662 -2.10201 170.662 -5.02318 147.54 -5.31685 133.226 -5.67233 49.547 -6.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J148.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J148.rse deleted file mode 100644 index aa0dde2a21..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J148.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J228.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J228.eng deleted file mode 100644 index 54560e8d68..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J228.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -J228 38 562 6 0.27 0.8391 Ellis_Mountain -0.0309119 665.031 -0.0927357 444.822 -0.262751 356.739 -0.664606 343.526 -0.989181 317.101 -1.96291 259.847 -2.99845 193.784 -4.01855 118.913 -4.99227 35.2334 -5.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J228.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J228.rse deleted file mode 100644 index 9209599d25..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J228.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J270.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J270.eng deleted file mode 100644 index 7a810a8119..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J270.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain J270 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J270 38 384 0 0.341824 0.711872 EM - 0.057 357.607 - 0.175 386.516 - 0.294 368.069 - 0.412 360.627 - 0.530 356.068 - 0.648 353.900 - 0.767 351.910 - 0.885 349.900 - 1.003 348.675 - 1.121 347.552 - 1.240 343.075 - 1.358 338.000 - 1.476 330.566 - 1.594 315.474 - 1.712 293.325 - 1.831 266.102 - 1.949 184.040 - 2.067 131.638 - 2.185 109.171 - 2.304 89.570 - 2.422 74.945 - 2.540 55.700 - 2.658 31.860 - 2.777 17.751 - 2.896 10.109 - 3.015 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J270.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J270.rse deleted file mode 100644 index 19d8751a45..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J270.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J330.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J330.eng deleted file mode 100644 index 65c27f2dae..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J330.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain J330 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J330 38 433 0 0.407232 0.820736 EM - 0.055 482.013 - 0.169 515.156 - 0.283 509.959 - 0.398 511.485 - 0.512 509.155 - 0.626 503.627 - 0.740 495.461 - 0.854 486.118 - 0.969 477.786 - 1.083 472.073 - 1.197 455.861 - 1.310 433.714 - 1.425 407.542 - 1.540 367.945 - 1.654 271.221 - 1.768 203.711 - 1.881 152.800 - 1.996 106.108 - 2.110 91.404 - 2.225 72.286 - 2.339 63.983 - 2.452 61.809 - 2.567 42.010 - 2.681 16.437 - 2.796 4.496 - 2.910 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J330.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J330.rse deleted file mode 100644 index 3430537fc6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_J330.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_K475.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_K475.eng deleted file mode 100644 index 3fb8edb672..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_K475.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -K475 54 663.6 14 1.035 2.168 Ellis_Mountain -0.0463679 797.157 -0.15456 616.585 -0.278207 585.756 -0.479134 568.139 -2.92117 576.948 -3.29212 568.139 -4.00309 303.888 -4.51314 224.613 -5.02318 74.8711 -5.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_K475.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_K475.rse deleted file mode 100644 index f7f4cda55d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_K475.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L330.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L330.eng deleted file mode 100644 index a4c05428a1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L330.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain L330 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L330 76 381 0 1.46944 2.67008 EM - 0.194 298.963 - 0.584 378.807 - 0.975 376.204 - 1.366 382.475 - 1.757 391.163 - 2.148 399.442 - 2.539 406.048 - 2.930 407.731 - 3.321 405.666 - 3.711 400.636 - 4.103 393.384 - 4.494 384.520 - 4.884 377.009 - 5.275 368.385 - 5.666 359.041 - 6.057 350.117 - 6.448 341.587 - 6.839 337.109 - 7.230 300.039 - 7.621 194.602 - 8.011 123.445 - 8.403 66.942 - 8.794 32.233 - 9.184 8.248 - 9.576 1.563 - 9.968 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L330.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L330.rse deleted file mode 100644 index b74c89cce9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L330.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L600.eng deleted file mode 100644 index 1558fd22b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L600.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain L600 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L600 76 584 0 2.4407 4.11981 EM - 0.186 829.668 - 0.561 773.861 - 0.936 767.837 - 1.313 755.034 - 1.689 736.454 - 2.064 722.717 - 2.440 706.215 - 2.816 688.253 - 3.191 673.457 - 3.567 660.981 - 3.943 648.124 - 4.318 634.689 - 4.694 622.058 - 5.070 607.970 - 5.445 594.926 - 5.821 583.003 - 6.197 573.084 - 6.572 553.530 - 6.948 399.379 - 7.324 270.410 - 7.699 211.401 - 8.075 144.237 - 8.451 74.227 - 8.826 19.378 - 9.202 4.274 - 9.578 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L600.rse deleted file mode 100644 index 1d23bc4ea4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_L600.rse +++ /dev/null @@ -1,39 +0,0 @@ - - - -Ellis Mountain L600 -Copyright Tripoli Motor Testing 1998 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_M1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_M1000.eng deleted file mode 100644 index 5452e53965..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_M1000.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Ellis Mountain M1000 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1000 76 787 0 3.47514 5.5776 EM - 0.159 1897.088 - 0.481 1606.200 - 0.803 1441.676 - 1.125 1360.014 - 1.447 1299.506 - 1.769 1259.449 - 2.091 1231.131 - 2.413 1202.529 - 2.735 1179.968 - 3.057 1154.573 - 3.379 1108.815 - 3.701 1075.453 - 4.023 1045.316 - 4.345 1010.304 - 4.667 951.184 - 4.989 860.548 - 5.310 727.369 - 5.633 595.659 - 5.955 518.911 - 6.277 439.902 - 6.599 347.743 - 6.921 239.388 - 7.243 144.608 - 7.565 75.112 - 7.887 33.539 - 8.210 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_M1000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_M1000.rse deleted file mode 100644 index 146de42de7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Ellis_M1000.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A3.eng deleted file mode 100644 index e947f919b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A3.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;Estes 1/2A3T RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -1/2A3T 13 45 2-4 0.002 0.0066 Estes -0.024 0.501 -0.042 1.454 -0.064 3.009 -0.076 4.062 -0.088 4.914 -0.093 5.065 -0.103 6.068 -0.112 6.87 -0.117 7.021 -0.126 7.62 -0.137 7.472 -0.146 6.87 -0.153 6.118 -0.159 5.065 -0.166 4.363 -0.179 3.66 -0.197 2.908 -0.222 2.256 -0.25 2.156 -0.277 2.106 -0.294 2.056 -0.304 2.156 -0.316 1.955 -0.326 1.554 -0.339 1.053 -0.35 0.651 -0.36 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A3.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A3.rse deleted file mode 100644 index 0c1ffc8762..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A3.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - - Estes 1/2A3T RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A6.eng deleted file mode 100644 index 716ba46a9e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A6.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -;Estes 1/2A6 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -1/2A6 18 70 2 0.0026 0.0138 Estes -0.031 0.404 -0.064 1.258 -0.096 2.263 -0.124 3.467 -0.149 4.72 -0.172 6.023 -0.196 7.027 -0.21 7.528 -0.225 7.86 -0.235 7.482 -0.244 6.683 -0.254 5.685 -0.263 4.487 -0.269 4.087 -0.279 3.039 -0.29 1.79 -0.297 1.042 -0.306 0.593 -0.314 0.344 -0.33 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A6.rse deleted file mode 100644 index 77a235a2c6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_2A6.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - -Estes 1/2A6 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_4A3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_4A3.eng deleted file mode 100644 index e74ab247ae..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_4A3.eng +++ /dev/null @@ -1,34 +0,0 @@ -;Estes 1/4A3T RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -1/4A3T 13 45 3 0.00083 0.0061 Estes -0.016 0.243 -0.044 1.164 -0.08 2.698 -0.088 2.851 -0.096 3.312 -0.105 3.804 -0.116 4.325 -0.129 4.754 -0.131 4.754 -0.135 4.95 -0.139 4.815 -0.143 4.814 -0.149 4.66 -0.157 4.289 -0.173 3.548 -0.187 2.808 -0.194 2.592 -0.197 2.13 -0.202 1.913 -0.206 1.512 -0.213 1.389 -0.218 1.112 -0.227 0.802 -0.236 0.493 -0.241 0.277 -0.25 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_4A3.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_4A3.rse deleted file mode 100644 index fe2aebcf3f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_1_4A3.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - - Estes 1/4A3T RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A10.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A10.eng deleted file mode 100644 index 064f78c85b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A10.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -;Estes A10T RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -A10T 13 45 3-100 0.0038 0.00525 Estes -0.026 0.478 -0.055 1.919 -0.093 4.513 -0.124 8.165 -0.146 10.956 -0.166 12.64 -0.179 11.046 -0.194 7.966 -0.203 6.042 -0.209 3.154 -0.225 1.421 -0.26 1.225 -0.333 1.41 -0.456 1.206 -0.575 1.195 -0.663 1.282 -0.76 1.273 -0.811 1.268 -0.828 0.689 -0.85 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A10.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A10.rse deleted file mode 100644 index 353ff8d934..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A10.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - -Estes A10T RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A3.eng deleted file mode 100644 index 46d406d260..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A3.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Estes A3T RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -A3T 13 45 4 0.0033 0.0085 Estes -0.024 0.195 -0.048 0.899 -0.086 2.658 -0.11 4.183 -0.14 5.83 -0.159 5.395 -0.18 4.301 -0.199 3.635 -0.215 2.736 -0.234 2.267 -0.258 2.15 -0.315 2.072 -0.441 1.993 -0.554 2.033 -0.605 2.072 -0.673 1.954 -0.764 1.954 -0.874 2.072 -0.931 2.15 -0.953 2.072 -0.966 1.719 -0.977 1.173 -0.993 0.547 -1.01 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A3.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A3.rse deleted file mode 100644 index 84797f0b07..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A3.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -Estes A3T RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A8.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A8.eng deleted file mode 100644 index 22ab109983..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A8.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -;Estes A8 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -A8 18 70 3-5 0.0033 0.01635 Estes -0.041 0.512 -0.084 2.115 -0.127 4.358 -0.166 6.794 -0.192 8.588 -0.206 9.294 -0.226 9.73 -0.236 8.845 -0.247 7.179 -0.261 5.063 -0.277 3.717 -0.306 3.205 -0.351 2.884 -0.405 2.499 -0.467 2.371 -0.532 2.307 -0.589 2.371 -0.632 2.371 -0.652 2.243 -0.668 1.794 -0.684 1.153 -0.703 0.448 -0.73 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A8.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A8.rse deleted file mode 100644 index 1098ffe100..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_A8.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -Estes A8 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4.eng deleted file mode 100644 index 07eaa5472e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4.eng +++ /dev/null @@ -1,31 +0,0 @@ -; B4-4 -B4-4 18 70 P 0.006 0.0195 E - 0.058 2.361 - 0.102 2.921 - 0.122 3.797 - 0.15 5.866 - 0.18 8.373 - 0.199 9.882 - 0.208 10.88 - 0.216 11.367 - 0.238 11.245 - 0.245 10.832 - 0.262 8.982 - 0.293 6.134 - 0.322 5.306 - 0.357 4.917 - 0.388 4.795 - 0.416 4.746 - 0.46 4.625 - 0.502 4.576 - 0.544 4.357 - 0.575 4.503 - 0.605 4.527 - 0.674 4.552 - 0.731 4.454 - 0.88 4.454 - 0.915 4.503 - 0.96 4.406 - 1.0 4.065 - 1.047 2.556 - 1.049 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4.rse deleted file mode 100644 index bf576f87bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -Estes B4 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4_1.eng deleted file mode 100644 index 64b0998093..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B4_1.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -;Estes B4 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -B4 18 70 2-4 0.006 0.0189 Estes -0.02 0.418 -0.04 1.673 -0.065 4.076 -0.085 6.69 -0.105 9.304 -0.119 11.496 -0.136 12.75 -0.153 11.916 -0.173 10.666 -0.187 9.304 -0.198 7.214 -0.207 5.645 -0.226 4.809 -0.258 4.182 -0.326 3.763 -0.422 3.554 -0.549 3.345 -0.665 3.345 -0.776 3.345 -0.863 3.345 -0.94 3.449 -0.991 3.449 -1.002 2.404 -1.01 1.254 -1.03 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B6.eng deleted file mode 100644 index b7204010ee..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B6.eng +++ /dev/null @@ -1,26 +0,0 @@ -; Estes B6-0 from NAR data by Mark Koelsch -B6-0 18 70 0 0.0056 0.0156 E - 0.036 1.364 - 0.064 2.727 - 0.082 4.215 - 0.111 6.694 - 0.135 9.05 - 0.146 9.545 - 0.172 11.901 - 0.181 12.149 - 0.191 11.901 - 0.211 9.174 - 0.239 7.314 - 0.264 6.074 - 0.275 5.95 - 0.333 5.207 - 0.394 4.835 - 0.445 4.835 - 0.556 4.339 - 0.667 4.587 - 0.723 4.339 - 0.78 4.339 - 0.793 4.091 - 0.812 2.603 - 0.833 1.24 - 0.857 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B6.rse deleted file mode 100644 index 89ff7608c8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_B6.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -Estes B6 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C11.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C11.eng deleted file mode 100644 index 7e9a0283e3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C11.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;ESTES C11 RASP.ENG file made from NAR published data -;File produced JANUARY 1, 2002 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -C11 24 70 0-3-5-7 0.012 0.0353 Estes -0.034 1.692 -0.066 3.782 -0.107 7.566 -0.145 10.946 -0.183 14.832 -0.214 17.618 -0.226 18.213 -0.256 20.107 -0.281 21.208 -0.298 21.73 -0.306 20.206 -0.323 17.321 -0.337 14.931 -0.358 13.236 -0.385 11.947 -0.413 11.65 -0.468 10.946 -0.539 10.45 -0.619 10.648 -0.683 10.648 -0.715 10.648 -0.726 10.053 -0.74 8.163 -0.758 5.773 -0.778 3.185 -0.795 1.394 -0.81 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C11.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C11.rse deleted file mode 100644 index ccd10bb695..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C11.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -ESTES C11 RASP.ENG file made from NAR published data -File produced JANUARY 1, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C5.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C5.eng deleted file mode 100644 index a5ff563703..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C5.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -;Estes C5 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -C5 18 70 3 0.0113 0.0248 Estes -0.042 2.195 -0.107 9.118 -0.159 16.213 -0.21 21.85 -0.233 18.407 -0.27 13.677 -0.289 9.793 -0.303 7.092 -0.326 5.065 -0.401 4.39 -0.55 3.883 -0.802 3.714 -1.026 3.883 -1.291 3.883 -1.524 4.221 -1.683 4.221 -1.702 2.195 -1.73 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C5.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C5.rse deleted file mode 100644 index 884371a993..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C5.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - -Estes C5 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6.eng deleted file mode 100644 index 1d704125be..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6.eng +++ /dev/null @@ -1,23 +0,0 @@ -; C6-0 -C6-0 18 70 P 0.012480000000000002 0.0227 E - 0.014 0.633 - 0.026 1.533 - 0.067 2.726 - 0.099 5.136 - 0.15 9.103 - 0.183 11.465 - 0.207 11.635 - 0.219 11.391 - 0.262 6.377 - 0.333 5.014 - 0.349 5.209 - 0.392 4.722 - 0.475 4.771 - 0.653 4.746 - 0.913 4.673 - 1.366 4.625 - 1.607 4.625 - 1.745 4.868 - 1.978 4.795 - 2.023 0.828 - 2.024 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6.rse deleted file mode 100644 index 6098de9213..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -Estes C6 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6_1.eng deleted file mode 100644 index f7cf3a3892..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_C6_1.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -;Estes C6 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -C6 18 70 0-3-5-7 0.0108 0.0231 Estes -0.031 0.946 -0.092 4.826 -0.139 9.936 -0.192 14.09 -0.209 11.446 -0.231 7.381 -0.248 6.151 -0.292 5.489 -0.37 4.921 -0.475 4.448 -0.671 4.258 -0.702 4.542 -0.723 4.164 -0.85 4.448 -1.063 4.353 -1.211 4.353 -1.242 4.069 -1.303 4.258 -1.468 4.353 -1.656 4.448 -1.821 4.448 -1.834 2.933 -1.847 1.325 -1.86 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D11.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D11.eng deleted file mode 100644 index ca69c1a9b5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D11.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -;Estes D11 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -D11 24 70 100 0.0245 0.0448 Estes -0.033 2.393 -0.084 5.783 -0.144 12.17 -0.214 20.757 -0.261 24.35 -0.289 26.01 -0.311 23.334 -0.325 18.532 -0.338 14.536 -0.356 12.331 -0.398 10.72 -0.48 9.303 -0.618 8.676 -0.761 8.247 -0.955 8.209 -1.222 7.955 -1.402 8.319 -1.54 8.291 -1.701 8.459 -1.784 8.442 -1.803 6.239 -1.834 3.033 -1.86 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D11.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D11.rse deleted file mode 100644 index 1b5ac042c1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D11.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -Estes D11 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D12.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D12.eng deleted file mode 100644 index 0d9392912b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D12.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -;Estes D12 RASP.ENG file made from NAR published data -;File produced October 3, 2000 -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -D12 24 70 0-3-5-7 0.0211 0.0426 Estes -0.049 2.569 -0.116 9.369 -0.184 17.275 -0.237 24.258 -0.282 29.73 -0.297 27.01 -0.311 22.589 -0.322 17.99 -0.348 14.126 -0.386 12.099 -0.442 10.808 -0.546 9.876 -0.718 9.306 -0.879 9.105 -1.066 8.901 -1.257 8.698 -1.436 8.31 -1.59 8.294 -1.612 4.613 -1.65 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D12.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D12.rse deleted file mode 100644 index a09f053ba3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_D12.rse +++ /dev/null @@ -1,37 +0,0 @@ - - - -Estes D12 RASP.ENG file made from NAR published data -File produced October 3, 2000 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E12.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E12.eng deleted file mode 100644 index 0213b4b9d0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E12.eng +++ /dev/null @@ -1,33 +0,0 @@ -; Based on NAR Published Data, 7/31/12, C. J. Kobel -E12 24 95 0-4-6-8 0.0359 0.0599 Estes - 0.052 5.045 - 0.096 9.910 - 0.196 24.144 - 0.251 31.351 - 0.287 32.973 - 0.300 29.910 - 0.344 17.117 - 0.370 14.414 - 0.400 12.973 - 0.500 11.712 - 0.600 11.171 - 0.700 10.631 - 0.800 10.09 - 0.900 9.73 - 1.000 9.55 - 1.101 9.91 - 1.200 9.55 - 1.300 9.73 - 1.400 9.73 - 1.500 9.73 - 1.600 9.73 - 1.700 9.55 - 1.800 9.73 - 1.900 9.73 - 2.000 9.55 - 2.100 9.55 - 2.200 9.73 - 2.300 9.19 - 2.375 9.37 - 2.400 5.95 - 2.440 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E16.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E16.eng deleted file mode 100644 index 2688578310..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E16.eng +++ /dev/null @@ -1,36 +0,0 @@ -; File produced, 2013 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E16 29 114 0-4-6-8 .0400 .08200 E -0.150 1.371 -0.186 1.920 -0.206 3.387 -0.242 5.587 -0.252 7.422 -0.277 8.705 -0.333 13.474 -0.359 15.858 -0.374 16.592 -0.394 18.609 -0.435 21.544 -0.476 24.661 -0.521 26.440 -0.643 21.720 -0.725 20.432 -0.821 19.511 -0.898 18.958 -1.025 18.219 -1.142 18.032 -1.259 17.844 -1.396 17.472 -1.569 17.282 -1.757 17.275 -1.895 17.086 -2.027 17.816 -2.042 12.494 -2.052 8.457 -2.063 4.970 -2.090 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E30.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E30.eng deleted file mode 100644 index 096896d410..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E30.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Estes E30 -; from NAR data sheet updated 08/01/2010 -; created by David Moore 08/17/2012 -E30 24 70 4-7 .0178 .0470 ESTES - 0.01 49 - 0.02 49 - 0.05 46 - 0.10 44 - 0.20 43 - 0.25 42 - 0.30 41 - 0.35 40 - 0.40 39 - 0.45 38 - 0.50 37 - 0.55 35 - 0.60 33 - 0.65 32 - 0.70 31 - 0.75 30 - 0.80 27 - 0.85 25 - 0.90 20 - 0.91 19 - 0.93 12 - 0.95 5 - 0.97 1 - 1.00 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E9.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E9.eng deleted file mode 100644 index c7e56a78e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E9.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Estes E9-0 by Mark Koelsch from NAR data -E9-0 24 95 0 0.0358 0.056799999999999996 E - 0.046 1.913 - 0.235 16.696 - 0.273 18.435 - 0.326 14.957 - 0.38 12.174 - 0.44 10.435 - 0.835 9.043 - 1.093 8.87 - 1.496 8.696 - 1.997 8.696 - 2.498 8.696 - 3.014 9.217 - 3.037 5.043 - 3.067 1.217 - 3.09 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E9.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E9.rse deleted file mode 100644 index 3ddf10586e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_E9.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - -ESTES E9 RASP.ENG file made from NAR published data -File produced JANUARY 1, 2002 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F15.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F15.eng deleted file mode 100644 index 25af6df381..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F15.eng +++ /dev/null @@ -1,34 +0,0 @@ -; Estes F15 RASP.ENG file made from NAR published data -; File produced, 2013 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F15 29 114 0-4-6-8 .0600 .10300 E -0.148 7.638 -0.228 12.253 -0.294 16.391 -0.353 20.210 -0.382 22.756 -0.419 25.260 -0.477 23.074 -0.520 20.845 -0.593 19.093 -0.688 17.500 -0.855 16.225 -1.037 15.427 -1.205 14.948 -1.423 14.627 -1.452 15.741 -1.503 14.785 -1.736 14.623 -1.955 14.303 -2.210 14.141 -2.494 13.819 -2.763 13.338 -3.120 13.334 -3.382 13.013 -3.404 9.352 -3.418 4.895 -3.450 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F15_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F15_1.eng deleted file mode 100644 index 3006362368..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F15_1.eng +++ /dev/null @@ -1,31 +0,0 @@ -; Estes F15 RASP.ENG file made from NAR published data -; File produced by Howard Smart 7/1/2013 -;The data in the PDF file on the NAR website as of today is incorrect -;It is a copy-paste of the data for the Estes E16 data - a simple error -;I made this data file as an approximation of the curve that they display -;in the PDF file, which appears to be correct -; -F15 29 114 0-2-4-6 0.06 0.103 E -0.063 2.127 -0.118 4.407 -0.158 8.359 -0.228 13.68 -0.340 20.82 -0.386 26.75 -0.425 25.38 -0.481 22.19 -0.583 17.93 -0.883 16.11 -1.191 14.59 -1.364 15.35 -1.569 15.65 -1.727 14.74 -2.00 14.28 -2.39 13.68 -2.68 13.08 -2.96 13.07 -3.25 13.05 -3.35 13.0 -3.39 7.30 -3.40 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F26.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F26.eng deleted file mode 100644 index e005837a2a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F26.eng +++ /dev/null @@ -1,36 +0,0 @@ -; -;ESTES G80 -;From NAR Certification 11/28/2007 -;File created 08/17/2012 by David Moore -;Blue Thunder propellant [Relabeled Aerotech] -G80 29 128 7 0.0625 0.128 Estes - 0.006 1.2 - 0.008 7.5 - 0.010 33.8 - 0.012 64.6 - 0.014 62.9 - 0.016 58.8 - 0.018 74.9 - 0.020 85.0 - 0.022 91.1 - 0.026 94.0 - 0.028 98.4 - 0.032 97.7 - 0.074 97.3 - 0.124 95.4 - 0.376 99.3 - 0.680 99.4 - 0.994 91.6 - 1.246 83.0 - 1.282 77.4 - 1.316 62.0 - 1.360 44.6 - 1.424 29.1 - 1.504 21.2 - 1.598 19.3 - 1.656 16.3 - 1.676 13.9 - 1.678 11.8 - 1.714 5.1 - 1.734 1.4 - 1.808 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F50.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F50.eng deleted file mode 100644 index ba9296612d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_F50.eng +++ /dev/null @@ -1,37 +0,0 @@ -; Estes F50 Blue thunder Porpellant [Relabeled Aerotech] -; File produced July 4, 2000 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. -F50 29 98 6 .0379 .0836 Estes - 0.012 51.377 - 0.023 61.197 - 0.026 66.117 - 0.044 66.564 - 0.082 69.685 - 0.152 73.264 - 0.208 75.053 - 0.237 77.279 - 0.254 76.832 - 0.272 77.726 - 0.307 77.726 - 0.330 76.832 - 0.336 78.621 - 0.342 76.832 - 0.354 79.590 - 0.363 76.385 - 0.371 77.756 - 0.395 76.385 - 0.447 75.937 - 0.523 73.711 - 0.652 68.344 - 0.810 60.302 - 0.828 62.539 - 0.836 58.076 - 0.901 53.603 - 1.079 37.074 - 1.158 29.480 - 1.196 25.464 - 1.246 16.976 - 1.301 9.380 - 1.430 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_G40.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_G40.eng deleted file mode 100644 index 006dbba316..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_G40.eng +++ /dev/null @@ -1,16 +0,0 @@ -;ESTES G40W [Relabeled Aerotech] -;Entered for ESTES on 8/18/2012 by David Moore -;Original file by Tim VanMilligan -G40W 29 124 7 0.0538 0.123 AeroTech - 0.024 74.325 - 0.057 67.005 - 0.252 65.879 - 0.500 63.063 - 0.765 60.248 - 1.000 54.054 - 1.250 47.298 - 1.502 36.599 - 1.751 25.338 - 1.999 12.951 - 2.121 3.941 - 2.300 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_G40_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_G40_1.eng deleted file mode 100644 index c845b3165d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Estes_G40_1.eng +++ /dev/null @@ -1,16 +0,0 @@ -;ESTES G40W [Relabeled Aerotech] -;Entered for ESTES on 8/18/2012 by David Moore -;Original file by Tim VanMilligan -G40W 29 124 4-7-10 0.0538 0.123 AeroTech - 0.024 74.325 - 0.057 67.005 - 0.252 65.879 - 0.500 63.063 - 0.765 60.248 - 1.000 54.054 - 1.250 47.298 - 1.502 36.599 - 1.751 25.338 - 1.999 12.951 - 2.121 3.941 - 2.300 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_H186.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_H186.eng deleted file mode 100644 index 5050e039f5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_H186.eng +++ /dev/null @@ -1,15 +0,0 @@ -H186RT 38 248 18 0.1765 0.469 Gorilla_Rocket_Motors -0.008 40.184 -0.042 133.634 -0.058 178 -0.1 196.9 -0.192 204 -0.483 215 -0.842 220.33 -1.075 219 -1.267 219 -1.35 207 -1.42 165 -1.48 118.949 -1.542 75 -1.69 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_H225.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_H225.rse deleted file mode 100644 index c309620d29..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_H225.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I223.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I223.eng deleted file mode 100644 index 937652dd0e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I223.eng +++ /dev/null @@ -1,11 +0,0 @@ -I223GT 38 248 18 0.182 0.475 Gorilla_Rocket_Motors -0.02 170 -0.05 190 -0.141038 225 -0.462292 255 -0.681685 258 -0.887365 260 -1.14789 255 -1.32419 224.138 -1.40451 129.31 -1.48 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I324.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I324.eng deleted file mode 100644 index 4a7e835719..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I324.eng +++ /dev/null @@ -1,10 +0,0 @@ -I324RT 38 369 1000 0.298 0.688 Gorilla_Rocket_Motors -0.015 238.506 -0.09 310 -0.25 360 -0.65 365 -1.06758 369.24 -1.25563 365 -1.35 340 -1.48678 195.402 -1.65 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I389.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I389.eng deleted file mode 100644 index c118c83b32..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_I389.eng +++ /dev/null @@ -1,13 +0,0 @@ -I389GT 38 369 18 0.3026 0.6928 Gorilla_Rocket_Motors -0.016 181.961 -0.025 277.057 -0.045 379.719 -0.065 413.405 -0.366 450 -0.683 454.85 -1.066 443.265 -1.14398 421 -1.183 385 -1.241 280.84 -1.35 92.872 -1.42 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J167.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J167.rse deleted file mode 100644 index 15b08e387d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J167.rse +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J365.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J365.rse deleted file mode 100644 index d5d143c63a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J365.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J395.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J395.eng deleted file mode 100644 index 9615f71d8e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J395.eng +++ /dev/null @@ -1,13 +0,0 @@ -J395RT 54 326 1000 0.5406 1.1604 Gorilla_Rocket_Motors -0.06 267 -0.1 333.75 -0.16 356 -0.21 360.45 -0.33 387.15 -1 460.157 -1.5 453.9 -2.2 409.4 -2.4 360.45 -2.48 267 -2.57 44.5 -2.59 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J450.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J450.rse deleted file mode 100644 index 6cdc5ac923..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J450.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J465.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J465.rse deleted file mode 100644 index 550bb0b204..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J465.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J485.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J485.rse deleted file mode 100644 index 5c65668146..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_J485.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K1075.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K1075.rse deleted file mode 100644 index 585a60b784..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K1075.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K1185.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K1185.eng deleted file mode 100644 index 6df8081ac9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K1185.eng +++ /dev/null @@ -1,15 +0,0 @@ -K1185GT 54 728 1000 1.314 2.541 Gorilla_Rocket_Motors -0.01 575 -0.06 810 -0.12 1050 -0.17 1175 -0.68 1345 -0.82 1366.15 -0.92 1379 -1.65 1290.5 -1.8 1268.25 -1.85 1223.75 -1.87 1068 -1.92 801 -2.05 222.5 -2.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K222.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K222.rse deleted file mode 100644 index e830bdc59d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K222.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K327.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K327.rse deleted file mode 100644 index 6a63f1d7ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K327.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K470.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K470.rse deleted file mode 100644 index db41b9ff43..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K470.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K520.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K520.eng deleted file mode 100644 index 61e94ee238..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K520.eng +++ /dev/null @@ -1,14 +0,0 @@ -K520RT 54 430 1000 0.7211 1.4421 Gorilla_Rocket_Motors -0.05 400.5 -0.07 471.7 -0.16 502.85 -0.23 498.4 -0.35 529.55 -0.87 593.13 -1.2 605.2 -1.55 578.5 -1.85 569.6 -2.32 511.75 -2.45 387.15 -2.58 26.7 -2.61 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K533.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K533.rse deleted file mode 100644 index 43ca846d4d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K533.rse +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K555.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K555.eng deleted file mode 100644 index c399712408..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K555.eng +++ /dev/null @@ -1,26 +0,0 @@ -;The K555GT "Green Tornado" motor is a green flame, low smoke propellant. -;This reload produces a 9% "K" motor with 1397 N-seconds of total impulse, -;maximum thrust of 645.3 Newtons, and an average thrust of 556 Newtons, -;for a 2.51 second burn time. -K555GT 54 430 1000 0.78 1.52 Gorilla_Motors -0.025 267 -0.05 338.2 -0.1 471.7 -0.12 498.4 -0.15 511.75 -0.18 522.875 -0.2 534 -0.7 631.9 -0.75 636.35 -0.9 645.25 -1.15 636.35 -1.57 623 -1.87 614.1 -2.17 600.75 -2.25 578.5 -2.27 480.6 -2.3 356 -2.35 178 -2.45 66.75 -2.51 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K630.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K630.rse deleted file mode 100644 index 552466d67e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K630.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K700.eng deleted file mode 100644 index 15b3057c3c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K700.eng +++ /dev/null @@ -1,15 +0,0 @@ -K700RT 54 492 1000 0.90135 1.7535 Gorilla_Rocket_Motors -0.12 534 -0.18 658.6 -0.2 725.35 -0.24 747.6 -0.28 747.6 -0.4 783.2 -0.65 788.215 -1 787.65 -1.65 769.85 -2 729.8 -2.1 712 -2.2 645.25 -2.38 115.7 -2.41 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K763.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K763.rse deleted file mode 100644 index 99cd8f6606..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K763.rse +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K805.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K805.rse deleted file mode 100644 index 251b30e07c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K805.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K980.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K980.rse deleted file mode 100644 index fca11f39fc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_K980.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1065.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1065.eng deleted file mode 100644 index e4513f0db3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1065.eng +++ /dev/null @@ -1,9 +0,0 @@ -L1065BL 75 787 1000 2.693 5.329 Gorilla_Rocket_Motors -0.02 1334.47 -0.1 1312.23 -0.65 1779.29 -1.75 1757.05 -2.2 1245.5 -2.75 667.233 -3.5 222.411 -3.95 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1112.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1112.eng deleted file mode 100644 index caa9206f74..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1112.eng +++ /dev/null @@ -1,30 +0,0 @@ -L1112BT 75 497.8 P 1.8 3.628 Gorilla - 0.05 1131.791 - 0.071 1174.3 - 0.113 1176.957 - 0.176 1211.495 - 0.263 1293.855 - 0.397 1145.075 - 0.493 1129.134 - 0.786 1182.27 - 1.062 1254.003 - 1.078 1232.749 - 1.229 1275.258 - 1.308 1254.003 - 1.492 1283.228 - 2.002 1293.855 - 2.236 1299.169 - 2.345 1283.228 - 2.545 1227.435 - 2.608 1198.211 - 2.688 1190.24 - 2.759 1206.181 - 2.809 1168.986 - 2.884 892.68 - 2.922 672.167 - 3.009 504.789 - 3.223 225.827 - 3.26 108.928 - 3.331 37.195 - 3.44 5.314 - 3.595 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1150.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1150.rse deleted file mode 100644 index 5dc407976d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L1150.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L425.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L425.rse deleted file mode 100644 index f07c8e4c9f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L425.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L695.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L695.rse deleted file mode 100644 index 1f43fe28c3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L695.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L789.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L789.eng deleted file mode 100644 index 1b6b6c1abc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L789.eng +++ /dev/null @@ -1,11 +0,0 @@ -L789RT 75 497 1000 1.8 3.378 Gorilla_Rocket_Motors -0.05 600 -0.1 650 -0.2 712 -0.754163 850 -1.5 900 -2 906 -3.41332 867.816 -3.55 833.333 -3.92752 344.828 -4.17 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L985.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L985.eng deleted file mode 100644 index 67dbe1bbab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_L985.eng +++ /dev/null @@ -1,8 +0,0 @@ -L985GT 75 497 1000 1.875 3.453 Gorilla_Rocket_Motors -0.2 725 -0.3 795.5 -0.75 950 -1.5 1120 -2 1120 -3.4 1112.5 -3.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1025.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1025.rse deleted file mode 100644 index 10cb9998c7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1025.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1355.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1355.eng deleted file mode 100644 index 9118cc32ab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1355.eng +++ /dev/null @@ -1,8 +0,0 @@ -M1355RT 75 787 1000 2.831 5.216 Gorilla_Rocket_Motors_ -0.05 1334.47 -0.85 1779.29 -1.35 1868.25 -1.7 1890.49 -2.15 1859.36 -3.5 489.304 -3.81 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1465.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1465.rse deleted file mode 100644 index 3db24a4809..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1465.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1610.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1610.rse deleted file mode 100644 index fb7e9f7187..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1610.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1665.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1665.eng deleted file mode 100644 index bcaafaa588..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1665.eng +++ /dev/null @@ -1,10 +0,0 @@ -M1665WC 75 787 1000 2.95 5.579 Gorilla_Rocket_Motors -0.075 2068.42 -0.125 2001.7 -0.7 2224.11 -0.85 2268.59 -1.6 2268.59 -2.12 1801.53 -2.65 1178.78 -3.22 444.822 -3.42 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1952.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1952.eng deleted file mode 100644 index 6e50c9ab6b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_M1952.eng +++ /dev/null @@ -1,33 +0,0 @@ -M1952BT 75 784.9 P 2.97 5.4430000000000005 Gorilla - 0.025 1639.097 - 0.033 2397.644 - 0.046 2100.59 - 0.075 2519.648 - 0.096 2599.215 - 0.104 2689.392 - 0.187 2689.392 - 0.228 2620.434 - 0.274 2445.384 - 0.316 2328.685 - 0.403 2275.64 - 0.523 2291.553 - 1.001 2339.294 - 1.188 2344.598 - 1.499 2328.685 - 1.637 2302.162 - 1.794 2270.335 - 2.093 2238.508 - 2.193 2206.681 - 2.243 2143.027 - 2.368 1777.015 - 2.505 1310.217 - 2.525 1241.258 - 2.584 1220.04 - 2.609 1119.254 - 2.663 960.118 - 2.733 763.851 - 2.8 567.584 - 2.87 413.753 - 2.987 238.703 - 3.178 63.654 - 3.41 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_O2700.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_O2700.eng deleted file mode 100644 index f4129db96d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/GR_O2700.eng +++ /dev/null @@ -1,31 +0,0 @@ -O2700BL 152.4 1206.5 P 15.149000000000001 33.339 Gorilla - 0.037 446.335 - 0.056 612.765 - 0.121 627.895 - 0.26 1210.4 - 0.261 1331.44 - 0.501 1739.95 - 0.734 2322.455 - 0.994 2594.795 - 2.006 3147.04 - 3.008 3646.33 - 3.519 3805.195 - 4.318 3888.41 - 4.494 3850.585 - 4.995 3691.72 - 5.478 3578.245 - 6.193 3162.17 - 6.249 3245.385 - 6.314 3101.65 - 7.001 2345.15 - 7.456 1777.775 - 7.864 1210.4 - 7.994 1051.535 - 8.208 839.715 - 8.431 605.2 - 8.598 506.855 - 8.821 355.555 - 9.044 234.515 - 9.331 143.735 - 9.443 121.04 - 9.499 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I130.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I130.eng deleted file mode 100644 index 7749161715..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I130.eng +++ /dev/null @@ -1,17 +0,0 @@ -;hand entered from Cesaroni (Mike Dennett) curve data -;Andrew MacMillen NAR 77472 2/5/02 -;NOTE: NOT CTI OR TMT APPROVED -;Hypertek 300CC098J -I130 54 521 100 0.298 1.049 HyperTek -0.05 200 -0.1 223 -0.5 205 -1 187 -1.5 169 -2 151 -2.25 143 -2.4 89 -2.5 71 -3 40 -3.5 18 -4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I136.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I136.eng deleted file mode 100644 index 1cfe087e12..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I136.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -;Hypertek I136 Data entered by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Data from Mike Dennett at Hypertek -I136 54 546 100 0.283 1.001 Hypertek -0.155 256.236 -0.5 232.756 -1 212.85 -1.5 196.005 -2 174.976 -2.21 163.338 -2.4 100.912 -2.5 83.813 -3 42.468 -3.5 19.754 -3.7 15.262 -3.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I145.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I145.eng deleted file mode 100644 index 633d719bba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I145.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -;Hypertek I145 Data entered by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Data from Tripoli Certification - test date 9/8/01 -;Not endorsed by TRA or Hypertek -I145 54 546 100 0.311 1.068 Hypertek -0.057 256.195 -0.204 253.38 -0.497 236.488 -1.002 208.334 -1.205 199.888 -1.376 211.15 -1.482 197.073 -2.003 177.366 -2.125 168.92 -2.5 90.091 -2.997 45.045 -3.282 16.892 -3.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I205.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I205.eng deleted file mode 100644 index c9dbe183a9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I205.eng +++ /dev/null @@ -1,16 +0,0 @@ -; -;hand entered from Cesaroni (Mike Dennett) curve data -;Andrew MacMillen NAR 77472 2/5/02 -;NOTE: NOT CTI OR TMT APPROVED -;Hypertek 300CC125J -I205 54 521 100 0.298 1.049 HyperTek -0.05 312 -0.1 347 -0.5 312 -1 258 -1.35 223 -1.6 125 -1.75 80 -2 45 -2.25 22 -2.75 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I222.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I222.eng deleted file mode 100644 index fe386c60e5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I222.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -;Hypertek I222 Data entered by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Data from Mike Dennett at Hypertek -I222 54 546 100 0.28 1.013 Hypertek -0.037 394.146 -0.065 439.192 -0.12 450.547 -0.24 436.734 -0.5 411.158 -0.66 392.487 -1 338.349 -1.348 292.639 -1.432 259.337 -1.5 193.668 -1.67 117.056 -2 57.357 -2.3 22.358 -2.4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I225.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I225.eng deleted file mode 100644 index 7303e829c7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I225.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -;Hypertek I225 Data entered by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Data from Tripoli Certification - test date 9/8/01 -;Not endorsed by TRA or Hypertek -I225 54 546 100 0.298 1.067 Hypertek -0.012 309.686 -0.037 343.47 -0.106 351.916 -0.244 354.732 -0.497 337.84 -0.749 320.948 -0.998 298.425 -1.254 273.087 -1.433 239.303 -1.502 194.258 -1.755 101.352 -1.999 53.491 -2.211 11.261 -2.37 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I260.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I260.eng deleted file mode 100644 index 1d8c7a1bba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I260.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -;Hypertek I260 Data entered by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Data from Mike Dennett at Hypertek -I260 54 614 100 0.409 1.296 Hypertek -0.03 339.01 -0.041 425.115 -0.12 413.854 -0.216 394.146 -0.354 391.331 -0.497 368.808 -0.749 346.286 -1.002 306.871 -1.36 264.641 -1.454 228.042 -1.502 180.181 -1.686 109.798 -2.003 50.676 -2.2 27.483 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I310.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I310.eng deleted file mode 100644 index 5400e4e5e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_I310.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek I310 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I310 54 645 0 0.40096 1.30502 HT - 0.042 465.886 - 0.128 450.815 - 0.216 438.421 - 0.303 443.241 - 0.391 433.808 - 0.478 415.992 - 0.566 406.746 - 0.653 380.383 - 0.741 385.170 - 0.828 372.458 - 0.916 358.282 - 1.003 348.621 - 1.091 337.887 - 1.178 333.898 - 1.266 303.469 - 1.353 301.589 - 1.441 268.788 - 1.528 222.719 - 1.616 155.314 - 1.703 112.163 - 1.791 80.510 - 1.878 58.562 - 1.966 41.774 - 2.053 30.243 - 2.141 21.270 - 2.228 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J115.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J115.eng deleted file mode 100644 index 3c53b42efe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J115.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J115 (440CC076J) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J115 54 614 0 0.411264 1.28218 HT - 0.129 218.303 - 0.391 230.563 - 0.653 216.171 - 0.916 165.676 - 1.178 158.834 - 1.441 161.888 - 1.703 157.955 - 1.966 152.977 - 2.228 148.337 - 2.491 141.919 - 2.753 136.970 - 3.016 129.152 - 3.278 121.815 - 3.541 111.971 - 3.803 79.163 - 4.066 53.433 - 4.328 42.975 - 4.591 38.391 - 4.853 33.418 - 5.116 28.709 - 5.378 23.886 - 5.641 19.658 - 5.903 15.894 - 6.166 11.955 - 6.428 9.151 - 6.691 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J120.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J120.eng deleted file mode 100644 index 70d1bc524e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J120.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J120 (440CC076JFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J120 54 614 0 0.442176 1.29338 HT - 0.134 232.707 - 0.405 264.084 - 0.676 230.699 - 0.948 185.971 - 1.220 174.226 - 1.491 173.853 - 1.763 165.828 - 2.034 158.016 - 2.305 152.389 - 2.577 143.399 - 2.849 135.969 - 3.120 129.537 - 3.392 124.822 - 3.664 118.872 - 3.934 109.922 - 4.206 69.777 - 4.478 47.837 - 4.749 40.178 - 5.021 35.768 - 5.293 31.265 - 5.564 26.359 - 5.835 21.215 - 6.107 17.175 - 6.378 12.931 - 6.650 9.463 - 6.922 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J150.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J150.eng deleted file mode 100644 index 2a4ddc6b43..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J150.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J150 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J150 54 645 0 0.428288 1.30592 HT - 0.111 177.498 - 0.336 193.696 - 0.561 200.136 - 0.786 204.034 - 1.011 200.531 - 1.236 197.233 - 1.461 192.706 - 1.686 189.854 - 1.911 185.892 - 2.136 183.117 - 2.361 179.325 - 2.586 174.178 - 2.813 171.123 - 3.039 164.933 - 3.264 160.032 - 3.489 154.604 - 3.714 148.653 - 3.939 92.092 - 4.164 55.325 - 4.389 42.913 - 4.614 32.903 - 4.839 24.742 - 5.064 16.445 - 5.289 8.527 - 5.515 4.923 - 5.741 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J170.eng deleted file mode 100644 index 8e1c154628..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J170.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J170 (440CC098J) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J170 54 614 0 0.4032 1.28218 HT - 0.092 315.198 - 0.278 351.486 - 0.466 314.152 - 0.653 255.278 - 0.841 235.396 - 1.027 234.785 - 1.214 230.871 - 1.401 223.051 - 1.589 217.688 - 1.776 209.940 - 1.962 203.806 - 2.149 197.520 - 2.336 191.243 - 2.524 178.598 - 2.711 129.785 - 2.898 82.459 - 3.084 71.693 - 3.272 64.633 - 3.459 54.015 - 3.647 45.022 - 3.833 36.373 - 4.020 28.397 - 4.207 21.518 - 4.395 16.072 - 4.582 11.712 - 4.770 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J190.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J190.eng deleted file mode 100644 index aeaa71c4ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J190.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J190 (440CC098JFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J190 54 614 0 0.439488 1.29338 HT - 0.095 338.583 - 0.287 384.416 - 0.481 341.472 - 0.674 279.175 - 0.867 267.528 - 1.060 256.325 - 1.254 250.108 - 1.447 244.404 - 1.640 238.846 - 1.833 236.505 - 2.026 232.026 - 2.219 223.962 - 2.413 213.236 - 2.606 201.661 - 2.799 150.523 - 2.992 101.327 - 3.185 84.001 - 3.378 73.902 - 3.571 60.222 - 3.765 49.208 - 3.958 39.096 - 4.151 29.873 - 4.344 22.600 - 4.538 16.842 - 4.731 11.964 - 4.925 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J220.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J220.eng deleted file mode 100644 index d05cd2d42d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J220.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J220 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J220 54 645 0 0.417984 1.30502 HT - 0.071 277.975 - 0.215 271.735 - 0.358 289.851 - 0.502 298.227 - 0.647 293.803 - 0.792 290.609 - 0.935 283.211 - 1.079 276.013 - 1.223 271.808 - 1.368 269.774 - 1.513 262.986 - 1.656 257.451 - 1.800 253.286 - 1.944 245.781 - 2.089 239.739 - 2.233 230.852 - 2.377 220.234 - 2.521 159.239 - 2.665 97.180 - 2.809 73.147 - 2.954 58.766 - 3.098 48.973 - 3.242 37.549 - 3.385 27.410 - 3.530 19.267 - 3.675 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J250.eng deleted file mode 100644 index e61f1ed0bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J250.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J250 (440CC125J) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J250 54 614 0 0.40768 1.29248 HT - 0.064 409.711 - 0.194 453.238 - 0.324 416.509 - 0.454 383.773 - 0.584 359.202 - 0.715 343.963 - 0.845 336.331 - 0.975 328.849 - 1.105 318.614 - 1.235 309.097 - 1.366 306.155 - 1.496 290.597 - 1.626 283.180 - 1.756 261.190 - 1.886 200.168 - 2.017 143.646 - 2.147 126.521 - 2.277 113.229 - 2.407 91.310 - 2.538 71.216 - 2.668 54.183 - 2.798 40.347 - 2.928 29.057 - 3.058 20.139 - 3.190 13.793 - 3.321 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J250_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J250_1.eng deleted file mode 100644 index cd0de59185..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J250_1.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J250 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J250 54 645 0 0.404992 1.30637 HT - 0.055 356.092 - 0.168 316.638 - 0.281 357.597 - 0.395 351.765 - 0.508 354.216 - 0.622 354.162 - 0.735 338.625 - 0.849 332.051 - 0.963 323.651 - 1.076 315.678 - 1.190 305.773 - 1.303 298.769 - 1.417 288.922 - 1.530 293.337 - 1.644 276.552 - 1.757 269.543 - 1.871 223.360 - 1.984 131.511 - 2.098 98.246 - 2.211 76.331 - 2.325 60.095 - 2.439 47.691 - 2.552 36.215 - 2.666 26.693 - 2.779 20.007 - 2.893 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J270.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J270.eng deleted file mode 100644 index 0685897066..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J270.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J270 (440CC125JFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J270 54 614 0 0.419776 1.29606 HT - 0.064 438.643 - 0.193 498.603 - 0.322 468.869 - 0.451 438.261 - 0.581 412.686 - 0.711 390.684 - 0.841 376.193 - 0.970 362.205 - 1.100 347.649 - 1.230 333.459 - 1.359 324.401 - 1.489 311.483 - 1.619 298.076 - 1.749 278.397 - 1.878 220.239 - 2.007 150.276 - 2.137 125.603 - 2.268 121.989 - 2.397 91.398 - 2.526 71.671 - 2.656 55.779 - 2.786 41.822 - 2.916 30.460 - 3.045 22.243 - 3.175 16.420 - 3.305 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J295.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J295.eng deleted file mode 100644 index f9a28fed2d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J295.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -;Hypertek J295 Data entered by Tim Van Milligan -;For RockSim www.RockSim.com -;File Created March 2, 2005 -;Data from Tripoli Certification - test date 9/8/01 -;Not endorsed by TRA or Hypertek -J295 54 614 100 0.409 1.31 Hypertek -0.004 467.345 -0.244 461.714 -0.501 416.669 -1.002 377.254 -1.254 343.47 -1.364 315.317 -1.502 219.596 -1.751 112.613 -2.003 50.676 -2.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J317.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J317.eng deleted file mode 100644 index 0df45660e8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J317.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J317O (835CC172J) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J317O 81 552 0 0.704256 1.7575 HT - 0.071 438.483 - 0.215 471.024 - 0.358 459.716 - 0.502 447.348 - 0.647 431.653 - 0.792 418.545 - 0.935 407.806 - 1.079 400.212 - 1.223 395.752 - 1.368 382.516 - 1.513 372.890 - 1.656 368.033 - 1.800 349.298 - 1.944 336.071 - 2.089 324.486 - 2.233 301.205 - 2.377 233.601 - 2.521 176.972 - 2.665 132.539 - 2.809 96.229 - 2.954 69.718 - 3.098 49.457 - 3.242 33.983 - 3.385 23.063 - 3.530 16.524 - 3.675 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J330.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J330.eng deleted file mode 100644 index bc865f0360..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J330.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek J330O (835CC172JFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -J330O 81 552 0 0.727104 1.77722 HT - 0.068 453.500 - 0.206 485.741 - 0.345 476.873 - 0.483 463.622 - 0.623 439.951 - 0.761 423.260 - 0.900 426.386 - 1.040 415.245 - 1.178 443.371 - 1.317 431.352 - 1.456 407.015 - 1.595 392.143 - 1.733 390.332 - 1.872 360.092 - 2.010 334.240 - 2.150 307.215 - 2.289 225.611 - 2.427 169.224 - 2.567 126.562 - 2.705 93.167 - 2.844 68.293 - 2.983 48.099 - 3.122 32.856 - 3.260 21.857 - 3.400 15.193 - 3.540 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J330_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J330_1.eng deleted file mode 100644 index ab68026ea1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_J330_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek J330 (835/54-172-J) -; provided by ThrustCurve.org (www.thrustcurve.org) -J330 54 787 0 0.73024 1.59936 HT - 0.068 453.500 - 0.206 485.741 - 0.345 476.873 - 0.483 463.622 - 0.623 439.951 - 0.761 423.260 - 0.900 426.386 - 1.040 415.245 - 1.178 443.371 - 1.317 431.352 - 1.456 407.015 - 1.595 392.143 - 1.733 390.332 - 1.872 360.092 - 2.010 334.240 - 2.150 307.215 - 2.289 225.611 - 2.427 169.224 - 2.567 126.562 - 2.705 93.167 - 2.844 68.293 - 2.983 48.099 - 3.122 32.856 - 3.260 21.857 - 3.400 15.193 - 3.540 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_K240.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_K240.eng deleted file mode 100644 index 430f65983c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_K240.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek K240 -; converted from TMT test stand data 1998 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K240 81 552 0 0.789376 1.80723 HT - 0.131 278.007 - 0.396 329.552 - 0.660 338.024 - 0.925 334.092 - 1.191 326.199 - 1.456 319.745 - 1.721 315.195 - 1.985 311.182 - 2.250 302.916 - 2.516 305.943 - 2.781 289.975 - 3.046 281.781 - 3.310 273.330 - 3.575 268.852 - 3.841 255.702 - 4.106 251.068 - 4.371 234.820 - 4.635 159.972 - 4.900 96.543 - 5.166 73.367 - 5.431 55.477 - 5.696 40.928 - 5.960 29.542 - 6.225 21.250 - 6.491 14.787 - 6.756 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L200.eng deleted file mode 100644 index e63f402af4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L200.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L200 (1685CC098L) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L200 111 724 0 1.59398 3.89491 HT - 0.292 310.935 - 0.877 311.934 - 1.464 284.574 - 2.050 259.236 - 2.636 245.149 - 3.223 240.798 - 3.809 246.021 - 4.396 251.509 - 4.981 255.559 - 5.568 250.045 - 6.154 242.343 - 6.741 236.221 - 7.327 230.527 - 7.914 224.062 - 8.500 218.240 - 9.086 212.215 - 9.673 189.706 - 10.258 94.608 - 10.845 67.128 - 11.431 53.350 - 12.018 41.550 - 12.604 31.112 - 13.191 22.445 - 13.777 16.763 - 14.364 10.892 - 14.950 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L225.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L225.eng deleted file mode 100644 index 0fac4c3892..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L225.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L225 (1685CC098LFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L225 111 724 0 1.66118 3.94822 HT - 0.271 380.609 - 0.815 364.078 - 1.359 347.671 - 1.904 311.980 - 2.449 292.842 - 2.994 284.620 - 3.539 284.123 - 4.083 295.754 - 4.628 286.654 - 5.173 271.822 - 5.718 258.225 - 6.263 249.357 - 6.807 240.396 - 7.352 232.666 - 7.897 226.844 - 8.442 217.601 - 8.986 208.639 - 9.531 122.739 - 10.076 74.667 - 10.621 60.930 - 11.166 48.898 - 11.710 38.996 - 12.255 29.719 - 12.800 21.925 - 13.345 16.360 - 13.890 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L350.eng deleted file mode 100644 index b2a472d477..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L350.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L350 (1685CC125L) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L350 111 724 0 1.6025 3.90342 HT - 0.188 592.182 - 0.566 598.015 - 0.945 479.774 - 1.324 427.223 - 1.702 406.561 - 2.080 395.128 - 2.459 393.279 - 2.839 410.729 - 3.217 517.335 - 3.595 506.496 - 3.974 439.490 - 4.353 391.732 - 4.731 463.388 - 5.109 446.876 - 5.489 436.237 - 5.868 387.456 - 6.246 247.342 - 6.624 147.845 - 7.003 117.459 - 7.382 93.081 - 7.760 73.034 - 8.139 55.605 - 8.518 40.854 - 8.897 29.575 - 9.276 21.627 - 9.655 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L355.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L355.eng deleted file mode 100644 index 5acabd53a4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L355.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L355 (1685CC125LFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L355 111 724 0 1.61952 3.95405 HT - 0.185 638.681 - 0.559 623.792 - 0.933 538.081 - 1.307 493.173 - 1.682 465.144 - 2.056 432.702 - 2.430 410.644 - 2.804 388.862 - 3.178 395.452 - 3.553 384.851 - 3.927 370.103 - 4.301 356.484 - 4.675 346.195 - 5.049 342.684 - 5.424 325.430 - 5.798 317.798 - 6.172 272.453 - 6.546 156.214 - 6.920 117.579 - 7.295 93.203 - 7.669 73.056 - 8.043 56.997 - 8.417 42.994 - 8.791 30.338 - 9.166 21.725 - 9.541 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L475.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L475.eng deleted file mode 100644 index 97febe0bb2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L475.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L475 (1685CC172L) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L475 111 724 0 1.52992 3.89805 HT - 0.129 640.755 - 0.391 638.069 - 0.652 619.018 - 0.914 609.661 - 1.176 597.937 - 1.437 596.251 - 1.699 594.039 - 1.961 572.245 - 2.223 578.304 - 2.484 589.224 - 2.747 578.752 - 3.008 612.426 - 3.270 646.188 - 3.531 674.617 - 3.793 652.574 - 4.055 555.384 - 4.317 299.749 - 4.578 220.284 - 4.841 170.007 - 5.102 127.011 - 5.364 94.998 - 5.626 70.208 - 5.888 49.458 - 6.149 32.102 - 6.411 18.382 - 6.674 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L535.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L535.eng deleted file mode 100644 index fbd933af1a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L535.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L535 (1685CC172LFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L535 111 724 0 1.59667 3.94822 HT - 0.119 838.518 - 0.358 768.667 - 0.598 727.551 - 0.838 745.172 - 1.077 712.851 - 1.317 694.613 - 1.556 672.145 - 1.796 656.726 - 2.035 685.070 - 2.275 808.735 - 2.515 798.521 - 2.754 755.277 - 2.995 726.985 - 3.235 699.331 - 3.475 670.049 - 3.715 515.315 - 3.954 293.947 - 4.194 227.905 - 4.433 180.167 - 4.673 140.714 - 4.912 107.564 - 5.152 80.907 - 5.392 58.898 - 5.631 39.782 - 5.872 24.901 - 6.113 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L540.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L540.eng deleted file mode 100644 index 0aef661e59..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L540.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L540O (2800CC172L) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L540O 111 876 0 2.5303 5.656 HT - 0.191 685.548 - 0.574 665.171 - 0.957 635.467 - 1.341 634.122 - 1.725 656.225 - 2.109 706.931 - 2.493 696.526 - 2.876 777.726 - 3.260 775.919 - 3.645 781.611 - 4.028 712.736 - 4.411 695.555 - 4.796 701.251 - 5.180 645.985 - 5.564 607.757 - 5.947 546.408 - 6.331 387.372 - 6.716 234.214 - 7.099 181.086 - 7.482 139.253 - 7.867 106.109 - 8.251 78.293 - 8.634 54.851 - 9.018 36.384 - 9.402 20.375 - 9.786 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L540_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L540_1.eng deleted file mode 100644 index daf00e147f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L540_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek L540 (2800/75-172-L) -; provided by ThrustCurve.org (www.thrustcurve.org) -L540 75 1387 0 2.52224 5.05792 HT - 0.191 685.548 - 0.574 665.171 - 0.957 635.467 - 1.341 634.122 - 1.725 656.225 - 2.109 706.931 - 2.493 696.526 - 2.876 777.726 - 3.260 775.919 - 3.645 781.611 - 4.028 712.736 - 4.411 695.555 - 4.796 701.251 - 5.180 645.985 - 5.564 607.757 - 5.947 546.408 - 6.331 387.372 - 6.716 234.214 - 7.099 181.086 - 7.482 139.253 - 7.867 106.109 - 8.251 78.293 - 8.634 54.851 - 9.018 36.384 - 9.402 20.375 - 9.786 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L550.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L550.eng deleted file mode 100644 index faa27eb182..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L550.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L550 (1685CCRGL) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L550 111 724 0 1.53261 3.89805 HT - 0.124 816.849 - 0.375 796.043 - 0.626 781.861 - 0.877 767.440 - 1.129 759.627 - 1.380 735.948 - 1.631 714.454 - 1.883 701.582 - 2.134 674.667 - 2.385 656.493 - 2.637 636.076 - 2.889 612.409 - 3.140 587.801 - 3.391 567.170 - 3.642 559.971 - 3.894 534.157 - 4.145 444.562 - 4.396 280.510 - 4.648 216.702 - 4.899 163.136 - 5.150 120.571 - 5.402 86.544 - 5.653 59.990 - 5.904 39.527 - 6.156 25.914 - 6.408 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L570.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L570.eng deleted file mode 100644 index 5e8924a275..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L570.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L570O (2800CC172LFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L570O 111 876 0 2.57734 5.70618 HT - 0.181 793.916 - 0.547 800.029 - 0.914 811.765 - 1.280 761.283 - 1.647 725.674 - 2.014 733.246 - 2.380 783.159 - 2.747 795.348 - 3.112 823.178 - 3.478 831.812 - 3.845 805.614 - 4.211 780.534 - 4.578 741.917 - 4.945 628.980 - 5.311 547.886 - 5.678 537.830 - 6.044 330.850 - 6.409 230.792 - 6.776 180.510 - 7.143 140.226 - 7.509 108.348 - 7.876 81.342 - 8.243 59.608 - 8.609 41.592 - 8.976 25.536 - 9.343 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L570_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L570_1.eng deleted file mode 100644 index f23932061a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L570_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek L570 (2800/75-172-L-FX) -; provided by ThrustCurve.org (www.thrustcurve.org) -L570 75 1387 0 2.57152 5.10272 HT - 0.181 793.916 - 0.547 800.029 - 0.914 811.765 - 1.280 761.283 - 1.647 725.674 - 2.014 733.246 - 2.380 783.159 - 2.747 795.348 - 3.112 823.178 - 3.478 831.812 - 3.845 805.614 - 4.211 780.534 - 4.578 741.917 - 4.945 628.980 - 5.311 547.886 - 5.678 537.830 - 6.044 330.850 - 6.409 230.792 - 6.776 180.510 - 7.143 140.226 - 7.509 108.348 - 7.876 81.342 - 8.243 59.608 - 8.609 41.592 - 8.976 25.536 - 9.343 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L575.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L575.eng deleted file mode 100644 index 4c60ac0116..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L575.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L575O (2800CCRGL) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L575O 111 876 0 2.52134 5.65286 HT - 0.190 705.343 - 0.572 723.437 - 0.955 738.414 - 1.337 749.383 - 1.720 735.169 - 2.103 725.088 - 2.486 733.751 - 2.869 700.454 - 3.251 690.771 - 3.634 682.897 - 4.017 674.825 - 4.399 687.463 - 4.782 675.411 - 5.166 645.685 - 5.548 643.612 - 5.930 634.693 - 6.314 559.731 - 6.696 304.009 - 7.078 229.423 - 7.461 167.643 - 7.845 121.036 - 8.227 83.673 - 8.609 54.311 - 8.993 33.029 - 9.376 19.886 - 9.759 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L575_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L575_1.eng deleted file mode 100644 index e724caad48..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L575_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek L575 (2800/75-RG-L) -; provided by ThrustCurve.org (www.thrustcurve.org) -L575 75 1387 0 2.51328 5.06688 HT - 0.190 705.343 - 0.572 723.437 - 0.955 738.414 - 1.337 749.383 - 1.720 735.169 - 2.103 725.088 - 2.486 733.751 - 2.869 700.454 - 3.251 690.771 - 3.634 682.897 - 4.017 674.825 - 4.399 687.463 - 4.782 675.411 - 5.166 645.685 - 5.548 643.612 - 5.930 634.693 - 6.314 559.731 - 6.696 304.009 - 7.078 229.423 - 7.461 167.643 - 7.845 121.036 - 8.227 83.673 - 8.609 54.311 - 8.993 33.029 - 9.376 19.886 - 9.759 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L610.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L610.eng deleted file mode 100644 index 66a0dd0172..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L610.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L610 (1685CCRGLFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L610 111 724 0 1.57696 3.95091 HT - 0.110 850.823 - 0.333 837.700 - 0.556 775.061 - 0.779 739.656 - 1.002 807.273 - 1.225 809.462 - 1.448 801.752 - 1.671 789.534 - 1.894 763.842 - 2.117 858.087 - 2.340 890.644 - 2.563 837.593 - 2.785 749.631 - 3.008 648.961 - 3.231 643.064 - 3.454 637.413 - 3.677 431.325 - 3.900 276.205 - 4.123 220.930 - 4.346 166.632 - 4.569 124.031 - 4.792 89.721 - 5.015 64.295 - 5.237 45.360 - 5.461 30.400 - 5.685 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L625.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L625.eng deleted file mode 100644 index 7f43b47d6b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L625.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek L625O (2800CCRGLFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -L625O 111 876 0 2.56614 5.70618 HT - 0.169 855.024 - 0.509 896.169 - 0.851 905.926 - 1.193 902.118 - 1.534 853.016 - 1.876 953.210 - 2.218 904.246 - 2.559 856.525 - 2.901 743.522 - 3.243 758.646 - 3.584 751.619 - 3.926 745.737 - 4.267 751.907 - 4.607 728.305 - 4.949 691.703 - 5.291 658.843 - 5.632 504.450 - 5.974 279.745 - 6.316 216.661 - 6.657 164.957 - 6.999 123.426 - 7.341 89.428 - 7.682 62.955 - 8.024 43.519 - 8.366 27.956 - 8.707 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L625_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L625_1.eng deleted file mode 100644 index d89ebe518c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L625_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek L625 (2800/75-RG-L-FX) -; provided by ThrustCurve.org (www.thrustcurve.org) -L625 75 1387 0 2.56256 5.11616 HT - 0.169 855.024 - 0.509 896.169 - 0.851 905.926 - 1.193 902.118 - 1.534 853.016 - 1.876 953.210 - 2.218 904.246 - 2.559 856.525 - 2.901 743.522 - 3.243 758.646 - 3.584 751.619 - 3.926 745.737 - 4.267 751.907 - 4.607 728.305 - 4.949 691.703 - 5.291 658.843 - 5.632 504.450 - 5.974 279.745 - 6.316 216.661 - 6.657 164.957 - 6.999 123.426 - 7.341 89.428 - 7.682 62.955 - 8.024 43.519 - 8.366 27.956 - 8.707 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L740.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L740.eng deleted file mode 100644 index c4bca42627..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L740.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; -L740 75 1422.4 100 2.667 6.416 HyperTek -0.02 767.76 -0.05 1084.9 -0.07 1166.87 -0.09 1198.96 -0.12 1183.37 -0.38 1088.96 -0.63 1139.56 -0.89 1130.73 -1.15 1109 -1.4 1096.6 -1.66 1048.51 -1.92 1026.67 -2.18 980.7 -2.43 949.74 -2.69 909.63 -2.95 893.62 -3.21 866.64 -3.46 825.26 -3.72 820.05 -3.98 789.78 -4.24 874.08 -4.49 804.36 -4.75 738.04 -5.01 383.77 -5.38 255.83 -5.75 183.27 -6.13 130.48 -6.5 94.03 -6.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L970.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L970.eng deleted file mode 100644 index 282a8e5103..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_L970.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -; -L970 75 1422.4 100 2.532 6.323 HyperTek -0.01 534.31 -0.02 1007.71 -0.03 1320.67 -0.04 1463.43 -0.05 1482.44 -0.25 1315.87 -0.44 1362.79 -0.64 1441.44 -0.84 1452.58 -1.04 1418.39 -1.23 1403.65 -1.43 1337.52 -1.63 1311.22 -1.83 1257.09 -2.02 1279.26 -2.22 1229.81 -2.42 1174.23 -2.62 1162.77 -2.81 1122.04 -3.02 1108.55 -3.21 1058.31 -3.41 981.23 -3.61 959.35 -3.8 778.83 -4.09 437.55 -4.38 294.3 -4.66 194.71 -4.94 129.33 -5.23 86.31 -5.23 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1000.eng deleted file mode 100644 index 78084cd03f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1000.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek M1000O (4630CCRGM) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1000O 111 1147 0 4.17446 8.90714 HT - 0.197 1368.441 - 0.593 1448.113 - 0.989 1482.178 - 1.384 1431.137 - 1.780 1410.278 - 2.176 1399.905 - 2.573 1365.973 - 2.970 1338.653 - 3.366 1295.695 - 3.761 1280.192 - 4.157 1235.621 - 4.553 1212.944 - 4.950 1196.996 - 5.347 1172.466 - 5.743 1129.416 - 6.139 1051.999 - 6.534 635.308 - 6.930 474.427 - 7.327 359.958 - 7.724 272.962 - 8.120 205.206 - 8.516 149.099 - 8.911 103.639 - 9.307 70.124 - 9.704 48.706 - 10.101 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1000_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1000_1.eng deleted file mode 100644 index b1ae51b251..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1000_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek M1000 (4630/98-RG-M) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1000 98 1405 0 4.17536 8.72704 HT - 0.197 1368.441 - 0.593 1448.113 - 0.989 1482.178 - 1.384 1431.137 - 1.780 1410.278 - 2.176 1399.905 - 2.573 1365.973 - 2.970 1338.653 - 3.366 1295.695 - 3.761 1280.192 - 4.157 1235.621 - 4.553 1212.944 - 4.950 1196.996 - 5.347 1172.466 - 5.743 1129.416 - 6.139 1051.999 - 6.534 635.308 - 6.930 474.427 - 7.327 359.958 - 7.724 272.962 - 8.120 205.206 - 8.516 149.099 - 8.911 103.639 - 9.307 70.124 - 9.704 48.706 - 10.101 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1001.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1001.eng deleted file mode 100644 index 43c01a15c9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1001.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; -M1001 98 1493.5 100 5.161 10.092 HyperTek -0.04 1394.15 -0.08 1440.23 -0.12 1322.3 -0.16 1328.89 -0.2 1340.76 -0.57 1411.23 -0.95 1420.87 -1.32 1415.98 -1.69 1404.61 -2.07 1384.44 -2.44 1370.95 -2.82 1354.19 -3.19 1318.56 -3.57 1326.82 -3.94 1338.4 -4.32 1247.32 -4.69 1287.12 -5.07 1220.48 -5.44 1123.54 -5.82 1075.29 -6.19 1078.11 -6.56 996.41 -6.94 953.17 -7.31 676.72 -7.83 419.5 -8.35 285.78 -8.87 192.18 -9.39 128.7 -9.87 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1010.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1010.eng deleted file mode 100644 index bd8292c04b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1010.eng +++ /dev/null @@ -1,30 +0,0 @@ -; HyperTek M1010O (4630CCRGMFX) -; converted from TMT test stand data 2001 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1010O 111 1147 0 4.27571 8.99987 HT - 0.199 1473.475 - 0.599 1472.868 - 0.999 1463.740 - 1.399 1380.769 - 1.799 1408.210 - 2.199 1383.970 - 2.599 1332.771 - 2.999 1356.808 - 3.399 1339.075 - 3.799 1306.425 - 4.199 1266.222 - 4.599 1223.656 - 4.999 1190.978 - 5.399 1145.190 - 5.799 1103.440 - 6.199 1060.790 - 6.599 696.828 - 6.999 487.469 - 7.399 377.853 - 7.799 288.215 - 8.199 221.430 - 8.599 166.674 - 8.999 123.710 - 9.399 90.168 - 9.800 64.566 - 10.201 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1010_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1010_1.eng deleted file mode 100644 index 465642f36b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1010_1.eng +++ /dev/null @@ -1,29 +0,0 @@ -; HyperTek M1010 (4630/98-RG-M-FX) -; provided by ThrustCurve.org (www.thrustcurve.org) -M1010 98 1405 0 4.23808 8.82112 HT - 0.199 1473.475 - 0.599 1472.868 - 0.999 1463.740 - 1.399 1380.769 - 1.799 1408.210 - 2.199 1383.970 - 2.599 1332.771 - 2.999 1356.808 - 3.399 1339.075 - 3.799 1306.425 - 4.199 1266.222 - 4.599 1223.656 - 4.999 1190.978 - 5.399 1145.190 - 5.799 1103.440 - 6.199 1060.790 - 6.599 696.828 - 6.999 487.469 - 7.399 377.853 - 7.799 288.215 - 8.199 221.430 - 8.599 166.674 - 8.999 123.710 - 9.399 90.168 - 9.800 64.566 - 10.201 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1015.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1015.eng deleted file mode 100644 index 5356c39c55..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1015.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -; -M1015 98 1150.6 100 3.25 7.158 HyperTek -0.04 1515.05 -0.08 1634.37 -0.12 1566.94 -0.16 1507.27 -0.2 1476.97 -0.41 1418.21 -0.63 1420.43 -0.85 1436.22 -1.06 1405.26 -1.28 1371.12 -1.49 1355 -1.71 1320.03 -1.93 1286.83 -2.14 1268.82 -2.36 1267.85 -2.58 1281.29 -2.79 1248.5 -3.01 1268.31 -3.23 1273.39 -3.44 1298.31 -3.66 1213.66 -3.87 1167.24 -4.09 1134.88 -4.31 1121.39 -4.69 544.64 -5.07 363.55 -5.46 234.8 -5.84 149.45 -6.22 94.73 -6.23 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1040.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1040.eng deleted file mode 100644 index c2472ae589..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M1040.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; -M1040 98 1493.5 100 5.293 10.181 HyperTek -0.02 1288.12 -0.05 1545.28 -0.07 1583.82 -0.09 1530.98 -0.12 1497.57 -0.53 1421.58 -0.95 1430.43 -1.37 1412.05 -1.78 1398.74 -2.2 1371.89 -2.61 1382.63 -3.03 1406.27 -3.44 1478.77 -3.86 1420.86 -4.27 1377.59 -4.69 1333.74 -5.1 1289.09 -5.52 1274.62 -5.93 1176.1 -6.35 1152.46 -6.77 891.06 -7.18 582.18 -7.6 429.01 -8.01 320.71 -8.43 238.67 -8.84 175.92 -9.25 128.91 -9.66 92.08 -9.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M740.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M740.eng deleted file mode 100644 index 82a9354d5e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M740.eng +++ /dev/null @@ -1,33 +0,0 @@ -; -; -M740 75 1422.4 100 2.589 6.322 HyperTek -0.04 979.34 -0.08 1135.85 -0.12 1065.56 -0.16 1026.83 -0.2 1022.88 -0.44 982.86 -0.68 1065.61 -0.91 1100.92 -1.15 1067.05 -1.39 1072.92 -1.63 1013.29 -1.87 1016.51 -2.11 1012.36 -2.35 1007.02 -2.58 968.14 -2.82 948.67 -3.06 944 -3.3 905.49 -3.54 899.55 -3.77 866.23 -4.02 847.5 -4.25 822.68 -4.49 813.98 -4.73 789.25 -4.97 752.47 -5.21 344.76 -5.45 271.93 -5.84 195.15 -6.46 108.81 -6.97 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M956.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M956.eng deleted file mode 100644 index cd5ab55d08..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M956.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; -M956 98 1150.6 100 3.162 7.061 HyperTek -0.04 1325.32 -0.08 1335.19 -0.12 1273.52 -0.16 1245.8 -0.2 1261.01 -0.46 1283.75 -0.71 1339.94 -0.97 1333.16 -1.23 1322.79 -1.49 1330.11 -1.75 1294.72 -2.01 1271.81 -2.27 1246.37 -2.52 1233.02 -2.78 1214.19 -3.04 1199.4 -3.3 1152.16 -3.56 1128.04 -3.81 1119.3 -4.08 1098.79 -4.33 1054.12 -4.59 1031.85 -4.85 964.95 -5.11 548.37 -5.45 373.37 -5.79 248.05 -6.14 160.88 -6.48 109.1 -6.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M960.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M960.eng deleted file mode 100644 index 28e272d665..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Hypertek_M960.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; -M960 75 1422.4 100 2.629 6.414 HyperTek -0.01 508.27 -0.02 1058.4 -0.03 1393.68 -0.04 1534.58 -0.05 1585.27 -0.25 1375.21 -0.44 1354.52 -0.64 1365.14 -0.84 1385.36 -1.04 1418.42 -1.23 1358.94 -1.43 1347.56 -1.63 1291.46 -1.83 1241.32 -2.02 1235.83 -2.22 1221.66 -2.42 1181.59 -2.62 1150.77 -2.81 1105.59 -3.02 1040.1 -3.21 982.54 -3.41 999.65 -3.61 943.72 -3.8 871.92 -4.11 526.67 -4.42 330.98 -4.72 212.71 -5.03 135.8 -5.33 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_G135.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_G135.rse deleted file mode 100644 index 22b00c4083..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_G135.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Oct 14, -2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_G82.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_G82.rse deleted file mode 100644 index f52137a842..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_G82.rse +++ /dev/null @@ -1,66 +0,0 @@ - - - - Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Oct 14, -2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_H130.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_H130.rse deleted file mode 100644 index ffa17b57b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_H130.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Oct 14, -2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_H225.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_H225.rse deleted file mode 100644 index 40e2357256..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_H225.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Oct 14, -2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I170.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I170.eng deleted file mode 100644 index 6e9c0a4e54..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I170.eng +++ /dev/null @@ -1,26 +0,0 @@ -;Data entered by Tim Van Milligan -;Based on TRA Certification 6-19-2002 -;And Instructions provided by Aerotech. -I170S 38 258 14 0.1819 0.52 Kosdon-by-Aerotech -0.019 194.885 -0.131 190.481 -0.255 191.582 -0.513 199.289 -0.641 204.794 -0.753 206.996 -0.88 209.199 -1 208.098 -1.051 208.098 -1.147 206.996 -1.24 201.491 -1.391 198.188 -1.537 190.481 -1.707 181.672 -1.746 178.369 -1.781 173.96 -1.808 168.46 -1.854 132.12 -1.939 53.951 -2.005 22.02 -2.059 9.909 -2.13 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I170.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I170.rse deleted file mode 100644 index 8f09f19ede..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I170.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - -Data entered by Tim Van Milligan -Based on TRA Certification 6-19-2002 -And Instructions provided by Aerotech. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I280.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I280.eng deleted file mode 100644 index 0ebb3d073b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I280.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -I280F 38 258 14 .182 0.52 Kosdon-by-AeroTech -0.009 253.24 -0.055 255.442 -0.219 277.463 -0.482 301.686 -0.67 323.707 -0.735 330.314 -0.797 323.707 -1.001 297.282 -1.162 266.453 -1.205 259.847 -1.236 237.826 -1.363 50.6481 -1.428 26.4251 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I280.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I280.rse deleted file mode 100644 index e1ff6a8b39..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I280.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I301.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I301.eng deleted file mode 100644 index b189e7bd08..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I301.eng +++ /dev/null @@ -1,25 +0,0 @@ -; KBA I301W -I301W 38 369.6 18 0.295031 0.724 KBA - 0.0080 266.093 - 0.014 327.114 - 0.03 354.124 - 0.058 350.122 - 0.107 335.117 - 0.133 326.114 - 0.189 326.114 - 0.217 333.116 - 0.237 383.134 - 0.253 402.14 - 0.287 395.138 - 0.33 381.133 - 0.72 381.133 - 1.035 341.119 - 1.437 317.111 - 1.57 262.092 - 1.698 130.045 - 1.789 83.029 - 1.833 74.026 - 1.867 53.019 - 1.893 23.008 - 1.916 13.005 - 1.952 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I301.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I301.rse deleted file mode 100644 index cb0e941499..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I301.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - -KBA I301W - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I310.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I310.eng deleted file mode 100644 index 23f3c5c2ed..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I310.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -;Kosdon by AeroTech I310S -;Copyright Tripoli Motor Testing 2001 (www.tripoli.org) -;provided by ThrustCurve.org (www.thrustcurve.org) -I310S 38 368 6-0 0.312256 0.713216 Kosdon-by-AeroTech -0.045 334.66 -0.136 314.409 -0.228 322.556 -0.32 326.871 -0.411 331.851 -0.503 335.911 -0.595 336.933 -0.686 340.151 -0.778 342.066 -0.87 344.722 -0.961 348.578 -1.053 349.548 -1.146 351.943 -1.239 347.939 -1.33 345.079 -1.422 337.035 -1.514 333.332 -1.605 323.832 -1.697 289 -1.789 215.097 -1.88 136.596 -1.972 83.863 -2.064 37.922 -2.155 20.736 -2.248 5.943 -2.341 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I310.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I310.rse deleted file mode 100644 index 1b63a803bf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I310.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -Kosdon by AeroTech I310S -Copyright Tripoli Motor Testing 2001 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I370.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I370.eng deleted file mode 100644 index cb88f11ecf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I370.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -;Kosdon by AeroTech I370F -;Copyright Tripoli Motor Testing 2001 (www.tripoli.org) -;provided by ThrustCurve.org (www.thrustcurve.org) -I370F 38 368 100 0.312256 0.705152 Kosdon-by-AeroTech -0.035 373.074 -0.109 389.927 -0.184 401.07 -0.259 416.613 -0.334 429.598 -0.409 438.025 -0.484 443.83 -0.559 447.326 -0.634 446.764 -0.709 447.263 -0.784 444.735 -0.859 441.302 -0.933 435.676 -1.007 425.29 -1.082 414.897 -1.157 404.222 -1.232 395.358 -1.307 382.062 -1.382 334.152 -1.457 275.974 -1.532 179.654 -1.607 83.023 -1.682 39.608 -1.757 16.105 -1.832 4.151 -1.907 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I370.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I370.rse deleted file mode 100644 index bb420b599f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I370.rse +++ /dev/null @@ -1,44 +0,0 @@ - - - -Kosdon by AeroTech I370F -Copyright Tripoli Motor Testing 2001 (www.tripoli.org) -provided by ThrustCurve.org (www.thrustcurve.org) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I450.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I450.eng deleted file mode 100644 index b6d9ced199..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I450.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -I450F 38 370 14 0.3032 0.73 Kosdon-by-AeroTech -0.012 634.202 -0.037 550.523 -0.108 519.693 -0.241 510.885 -0.639 550.523 -0.729 554.927 -0.809 546.118 -0.939 497.672 -1.072 471.247 -1.128 440.418 -1.165 387.568 -1.211 206.996 -1.295 88.0836 -1.36 26.4251 -1.41 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I450.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I450.rse deleted file mode 100644 index 23c6b7f2b7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I450.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I550.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I550.eng deleted file mode 100644 index 488b2002b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I550.eng +++ /dev/null @@ -1,28 +0,0 @@ -; KBA I550R -I550R 38 369.6 20 0.295 0.713 KBA - 0.016 156.054 - 0.028 278.097 - 0.04 427.149 - 0.054 550.192 - 0.08 542.189 - 0.245 588.205 - 0.332 611.213 - 0.424 631.22 - 0.496 638.223 - 0.613 644.225 - 0.71 643.225 - 0.758 631.22 - 0.846 603.211 - 0.894 613.214 - 0.915 611.213 - 0.939 586.205 - 0.949 546.191 - 0.959 505.176 - 0.969 469.164 - 0.983 381.133 - 0.999 278.097 - 1.011 200.07 - 1.029 112.039 - 1.053 42.015 - 1.069 15.005 - 1.089 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I550.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I550.rse deleted file mode 100644 index 6165e234db..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_I550.rse +++ /dev/null @@ -1,41 +0,0 @@ - - - -KBA I550R - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J405.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J405.eng deleted file mode 100644 index 2a655c9983..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J405.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -J405S 38 476 14 0.367 0.88 Kosdon-by-AeroTech -0.009 528.502 -0.024 488.864 -0.046 462.439 -0.136 462.439 -0.268 458.035 -0.986 453.631 -1.421 444.822 -1.523 255.442 -1.697 92.4878 -1.93 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J405.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J405.rse deleted file mode 100644 index d096070908..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J405.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J520.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J520.rse deleted file mode 100644 index ccd7083005..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J520.rse +++ /dev/null @@ -1,55 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Nov. 25, -2007. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J605.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J605.eng deleted file mode 100644 index 9716ec2282..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J605.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -J605F 38 476 14 0.367 0.88 Kosdon-by-AeroTech -0.024 886.341 -0.037 704.669 -0.077 660.627 -0.438 704.669 -0.506 715.679 -0.59 710.174 -0.853 655.122 -0.973 594.564 -1.041 412.892 -1.091 324.808 -1.177 132.125 -1.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J605.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J605.rse deleted file mode 100644 index 604369401e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J605.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J740.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J740.rse deleted file mode 100644 index b7e72c47ac..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_J740.rse +++ /dev/null @@ -1,56 +0,0 @@ - - - -Animal Compatible. Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Oct 14, -2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K1750.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K1750.eng deleted file mode 100644 index 826fc735b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K1750.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -K1750R 54.0 728.00 0 1.25300 2.56000 KBA - 0.02 1309.09 - 0.03 1679.77 - 0.05 1736.54 - 0.11 1689.79 - 0.26 1799.99 - 0.40 1913.54 - 0.46 1896.84 - 0.68 2023.74 - 0.90 2133.94 - 0.95 2097.21 - 1.00 2050.46 - 1.05 1920.21 - 1.10 1793.31 - 1.16 1676.43 - 1.21 1719.85 - 1.25 1526.15 - 1.27 1302.41 - 1.32 874.95 - 1.35 454.17 - 1.36 317.25 - 1.37 200.37 - 1.40 90.17 - 1.46 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K1750.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K1750.rse deleted file mode 100644 index 8e51a081fc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K1750.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - MFR data converted from RASP file from Mark Koelsch - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K400.eng deleted file mode 100644 index cb90df9cad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K400.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -; -K400S 54 403 6-10-14 0.713216 1.50931 Kosdon-by-AeroTech -0.074 465.928 -0.225 441.922 -0.377 442.414 -0.529 445.492 -0.681 449.048 -0.833 451.88 -0.985 454.481 -1.138 456.929 -1.29 458.237 -1.442 457.021 -1.594 455.62 -1.746 451.772 -1.897 446.421 -2.048 438.843 -2.2 429.377 -2.352 419.003 -2.504 408.274 -2.656 397.608 -2.808 388.018 -2.96 367.07 -3.113 263.666 -3.265 114.378 -3.417 46.238 -3.569 8.62 -3.721 2.401 -3.873 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K400.rse deleted file mode 100644 index dae9d7ccd9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K400.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K600.eng deleted file mode 100644 index a52b6f192b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K600.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Kosdon by AeroTech K600F -; provided by ThrustCurve.org (www.thrustcurve.org) -K600F 54 403 0 0.68096 1.41568 KBA - 0.045 639.654 - 0.148 711.292 - 0.252 695.617 - 0.358 696.252 - 0.462 701.336 - 0.568 703.242 - 0.670 705.265 - 0.772 704.302 - 0.878 702.819 - 0.982 701.336 - 1.088 696.888 - 1.192 689.262 - 1.295 681.245 - 1.398 668.928 - 1.502 653.465 - 1.608 637.366 - 1.712 619.785 - 1.818 599.451 - 1.920 586.275 - 2.022 510.698 - 2.128 334.676 - 2.232 125.397 - 2.338 37.916 - 2.442 17.157 - 2.548 4.025 - 2.653 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K700.rse deleted file mode 100644 index 5f5f929d22..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K700.rse +++ /dev/null @@ -1,51 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Nov 25, -2007. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K750.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K750.eng deleted file mode 100644 index 2a40ae62ed..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K750.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Kosdon by Aerotech K750 White Lightning. -K750W 54 728 0 1.315 2.62 KBA - 0.0080 266.075 - 0.012 457.102 - 0.02 750.467 - 0.032 999.485 - 0.044 1112.055 - 0.06 1180.279 - 0.095 1098.41 - 0.127 1057.476 - 0.163 1040.42 - 0.334 1050.653 - 0.62 1054.064 - 0.998 975.607 - 1.324 907.382 - 1.69 903.971 - 2.06 886.915 - 2.184 828.924 - 2.299 757.289 - 2.394 651.541 - 2.502 556.028 - 2.609 450.28 - 2.784 327.476 - 2.999 245.607 - 3.039 201.261 - 3.134 92.103 - 3.206 40.935 - 3.337 6.822 - 3.468 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K750.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K750.rse deleted file mode 100644 index 04bd833ce7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_K750.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - -Kosdon by Aerotech K750 White Lightning. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1000.eng deleted file mode 100644 index d03b16d3ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1000.eng +++ /dev/null @@ -1,29 +0,0 @@ -; Kosdon by AeroTech L1000S -; provided by ThrustCurve.org (www.thrustcurve.org) -L1000S 54 728 0 1.232 2.32512 KBA - 0.055 795.305 - 0.175 981.574 - 0.295 989.173 - 0.415 1008.634 - 0.535 1028.836 - 0.655 1048.483 - 0.775 1067.573 - 0.895 1087.034 - 1.015 1108.719 - 1.135 1131.516 - 1.255 1156.908 - 1.375 1177.296 - 1.498 1199.596 - 1.620 1212.881 - 1.740 1227.153 - 1.860 1232.342 - 1.980 1249.950 - 2.100 1026.056 - 2.220 737.107 - 2.340 565.851 - 2.460 313.414 - 2.580 89.706 - 2.700 20.758 - 2.820 8.526 - 2.942 5.338 - 3.065 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1000.rse deleted file mode 100644 index 40fa1890ce..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1000.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1400.eng deleted file mode 100644 index 559ae80384..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1400.eng +++ /dev/null @@ -1,18 +0,0 @@ -; -; -L1400F 54 727 100 1.248 2.502 Kosdon-by-AeroTech -0.037 1541.46 -0.061 1453.38 -0.166 1354.29 -1.001 1772.68 -1.279 1783.69 -1.329 1882.79 -1.387 1992.89 -1.486 1387.32 -1.604 869.826 -1.65 748.711 -1.666 726.69 -1.69 924.878 -1.697 594.564 -1.758 319.303 -1.88 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1400.rse deleted file mode 100644 index 6071f48b08..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L1400.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L2300.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L2300.rse deleted file mode 100644 index a2fe890efe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_L2300.rse +++ /dev/null @@ -1,63 +0,0 @@ - - - -Animal Compatible. Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data TRA certification dated Oct 14, -2008. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M1450.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M1450.eng deleted file mode 100644 index 2374eb289f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M1450.eng +++ /dev/null @@ -1,22 +0,0 @@ -; KBA M1450W -M1450W 75 1038.9 0 4.15 7.6000000000000005 KBA - 0.035 1842.929 - 0.076 2287.088 - 0.146 1968.884 - 0.215 1882.704 - 0.291 1836.299 - 0.499 1862.816 - 1.005 1935.738 - 1.559 1889.333 - 2.155 1816.412 - 2.862 1750.119 - 3.493 1663.939 - 3.853 1358.994 - 4.221 1060.678 - 4.484 788.88 - 4.761 523.71 - 4.942 258.54 - 5.323 258.54 - 5.6 172.36 - 5.801 119.326 - 5.96 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M1450.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M1450.rse deleted file mode 100644 index f935b5c1e4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M1450.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - -KBA M1450W - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M2900.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M2900.rse deleted file mode 100644 index 64e1b4cd3a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M2900.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - -@File: 070616w11.txt, @Pts-I: 1207, @Pts-O: 32, @Sm: 5, @CO: 5% -@TI: 5460.0, @TIa: 5447.69, @TIe: 0.0%, @ThMax: 3102.43, @ThAvg: 2675.68, @Tb: 2.036 -Exported using ThrustCurveTool, www.ThrustGear.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M3500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M3500.eng deleted file mode 100644 index 20cf79d9b4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M3500.eng +++ /dev/null @@ -1,36 +0,0 @@ -; @File: M3500.txt, @Pts-I: 1176, @Pts-O: 32, @Sm: 3, @CO: 5% -; @TI: 7311.23, @TIa: 7305.44, @TIe: 0.0%, @ThMax: 4059.41, @ThAvg: 3454.11, @Tb: 2.115 -; Exported using ThrustCurveTool, www.ThrustGear.com -M3500 75 1039 0 3.755 7.173 AT/RCS -0.0 0.371006 -0.106 8.86696 -0.122 135.5975 -0.13 670.948 -0.14 1587.827 -0.156 2299.92 -0.178 2751.17 -0.188 2731.01 -0.196 2914.16 -0.2 2842.83 -0.208 2985.3 -0.21 2903.6 -0.248 3027.96 -0.932 3723.01 -1.5879 4059.41 -1.9859 3900.58 -2.0279 3759.75 -2.0399 3495.75 -2.0539 3522.63 -2.0739 3313.47 -2.0819 2962.24 -2.0899 2964.52 -2.1039 2484.66 -2.1639 1015.768 -2.1879 602.438 -2.1979 218.762 -2.2059 440.947 -2.2119 274.648 -2.2199 474.133 -2.2219 353.742 -2.2399 180.0836 -2.3499 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M3500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M3500.rse deleted file mode 100644 index d1e07ff6d1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/KBA_M3500.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - -@File: M3500.txt, @Pts-I: 1176, @Pts-O: 32, @Sm: 3, @CO: 5% -@TI: 7311.23, @TIa: 7305.44, @TIe: 0.0%, @ThMax: 4059.41, @ThAvg: 3454.11, @Tb: 2.115 -Exported using ThrustCurveTool, www.ThrustGear.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_G65.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_G65.eng deleted file mode 100644 index c53b17f774..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_G65.eng +++ /dev/null @@ -1,17 +0,0 @@ -G65-DH 29 205.7 11 0.093 0.218 Kosdon - 0.028 31.802 - 0.049 70.288 - 0.082 58.742 - 0.142 64.414 - 0.716 79.606 - 1.179 88.721 - 1.568 75.352 - 1.606 74.34 - 1.611 68.06 - 1.704 57.122 - 1.773 45.981 - 1.812 30.181 - 1.853 18.838 - 1.894 11.343 - 1.936 5.469 - 2.026 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_H155.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_H155.eng deleted file mode 100644 index aff0610c95..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_H155.eng +++ /dev/null @@ -1,35 +0,0 @@ -H155F 28.4 205.7 7 0.081 0.20600000000000002 Kosdon - 0.005 39.948 - 0.009 78.254 - 0.025 121.759 - 0.032 123.948 - 0.057 123.401 - 0.081 123.948 - 0.121 124.222 - 0.172 129.421 - 0.201 131.883 - 0.296 135.44 - 0.337 137.903 - 0.397 138.723 - 0.436 134.619 - 0.493 139.271 - 0.552 135.44 - 0.599 138.997 - 0.691 137.629 - 0.796 135.44 - 0.888 132.978 - 0.935 129.147 - 0.971 130.789 - 0.991 128.6 - 1.015 112.183 - 1.057 89.199 - 1.093 67.31 - 1.152 44.599 - 1.192 32.56 - 1.236 21.342 - 1.264 16.417 - 1.291 12.586 - 1.312 10.124 - 1.352 5.746 - 1.393 2.736 - 1.465 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_I560.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_I560.eng deleted file mode 100644 index 016a910034..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Kosdon_I560.eng +++ /dev/null @@ -1,54 +0,0 @@ -;Manufacturer: Kosdon TRM -;Entered: Dec 29, 2009 -;Last Updated: December 15, 2010 -;Mfr. Designation: I-560F -;Previous Designation: I-800 -;Brand Name: I560F -;Common Name: I-560 -;Motor Type: reload -;Delays: 20 -;Diameter: 29.0mm -;Length: 59.7cm -;Total Weight: -;Propellant Weight: 246g -;Propellant Weight, advertised: 235g -;Delay Length: .735" -;Cert. Org.: Tripoli Rocketry Association, Inc. -;Cert. Designation: I551 (26% I) -;Cert. Date: -;Average Thrust: 550.9N -;Maximum Thrust: -;Total Impulse: 404.2Ns -;Total Impulse, advertised 436 Ns -;Burn Time: 0.7s -;Burn Time, advertised: .76s -;Propellant Info: Fast -;Advertised Lift: 200 Lbs. -;Advertised Data taken from Frank Kosdon's 1998 Catalog -I560 28.956000 597.408000 0 0.246362 0.530712 K -0.01 589.55 -0.05 867.33 -0.08 850.44 -0.11 858.52 -0.14 870.51 -0.17 884.49 -0.20 899.92 -0.23 917.48 -0.27 932.37 -0.30 948.22 -0.33 963.32 -0.36 973.92 -0.39 943.05 -0.42 678.73 -0.45 237.05 -0.48 221.40 -0.52 212.53 -0.55 202.72 -0.58 200.00 -0.61 188.21 -0.64 145.22 -0.68 96.66 -0.71 60.02 -0.74 32.13 -0.77 10.50 -0.80 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G69.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G69.rse deleted file mode 100644 index 6d37f31d7a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G69.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G80.eng deleted file mode 100644 index 1d73b3c393..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G80.eng +++ /dev/null @@ -1,5 +0,0 @@ -G80-LW 38 127 5-8-10-13-17 0.06 0.275 Loki -0.00931677 112.069 -0.416149 112.069 -0.872671 89.6552 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G80.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G80.rse deleted file mode 100644 index 05341a29bb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_G80.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H100.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H100.eng deleted file mode 100644 index 18809eb4ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H100.eng +++ /dev/null @@ -1,10 +0,0 @@ -H100-SP 38 178 5-8-10-13-17 0.12 0.335 Loki -0.015528 127.586 -0.151398 127.586 -0.477484 139.655 -0.74146 146.552 -1.00543 150 -1.13742 122.414 -1.30823 86.2069 -1.59938 39.6552 -2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H100.rse deleted file mode 100644 index 069bfb65bc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H100.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H144.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H144.eng deleted file mode 100644 index 2712a80612..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H144.eng +++ /dev/null @@ -1,25 +0,0 @@ -; -; -H144 38 178 5-8-10-13-17 0.12 0.335 Loki -0.02 209 -0.04 247.6 -0.05 241.2 -0.1 247.6 -0.15 244.4 -0.2 237.9 -0.25 231.54 -0.3 228.3 -0.4 215.32 -0.45 212.43 -0.5 204.48 -0.6 194.36 -0.7 189.7 -0.8 170.4 -0.9 154.3 -1 127.83 -1.1 109.3 -1.2 80.4 -1.3 64.6 -1.4 44.6 -1.5 32.1 -1.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H144.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H144.rse deleted file mode 100644 index 4a70dce5fd..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H144.rse +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H160.eng deleted file mode 100644 index 61861708e3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H160.eng +++ /dev/null @@ -1,5 +0,0 @@ -H160-LB 38 178 7-9-12-15 0.12 0.335 Loki -0.015528 288.793 -0.599379 237.069 -1.03106 107.759 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H160.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H160.rse deleted file mode 100644 index c6b70d28e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H160.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500.eng deleted file mode 100644 index e531d0457c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500.eng +++ /dev/null @@ -1,11 +0,0 @@ -H500-LW 38 292 5-7-9-12-15 0.16 0.454 Loki -0.001 189.286 -0.0116009 534.733 -0.099768 539.465 -0.199536 544.197 -0.302784 553.662 -0.402552 548.93 -0.50464 544.197 -0.584687 435.358 -0.61949 9.4643 -0.62 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500.rse deleted file mode 100644 index 5d4913d72a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500_1.eng deleted file mode 100644 index 20c571c1d0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H500_1.eng +++ /dev/null @@ -1,13 +0,0 @@ -; -; -H500 38 292 5-7-9-12-15 0.16 0.454 Loki -0.001 189.286 -0.0116009 534.733 -0.099768 539.465 -0.199536 544.197 -0.302784 553.662 -0.402552 548.93 -0.50464 544.197 -0.584687 435.358 -0.61949 9.4643 -0.62 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H90.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H90.eng deleted file mode 100644 index e25c0eee53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H90.eng +++ /dev/null @@ -1,5 +0,0 @@ -H90-LR 38 178 5-8-10-14 0.12 0.335 Loki -0.0543478 146.552 -1.51398 94.8276 -2.1972 44.8276 -2.6087 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H90.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H90.rse deleted file mode 100644 index 9d0bfe80f8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_H90.rse +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I110.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I110.eng deleted file mode 100644 index 01aac02d13..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I110.eng +++ /dev/null @@ -1,11 +0,0 @@ -I110-LW 38 292 5-8-12 0.289 0.589 Loki -0 282.365 -0.0348028 218.735 -0.12181 170.944 -0.214617 163.592 -0.400232 169.106 -1.50232 176.458 -2.00116 152.563 -2.5 108.448 -2.99884 64.3338 -4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I110.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I110.rse deleted file mode 100644 index 4588b2372c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I110.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I210.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I210.eng deleted file mode 100644 index d703120632..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I210.eng +++ /dev/null @@ -1,6 +0,0 @@ -I210-LR 38 292 5-8-10-14 0.24 0.54 Loki -0.00388199 452.586 -0.0427019 387.931 -1.00155 271.552 -1.80901 77.5862 -2.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I210.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I210.rse deleted file mode 100644 index 2d3ad572e1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I210.rse +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I316.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I316.eng deleted file mode 100644 index 3b24081c68..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I316.eng +++ /dev/null @@ -1,8 +0,0 @@ -I316-SP 38 292 5-8-10-13-17 0.24 0.54 Loki -0.00931677 448.276 -0.127329 491.379 -0.242236 500 -0.347826 482.759 -0.484472 439.655 -1 258.621 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I405.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I405.eng deleted file mode 100644 index 87015bc021..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I405.eng +++ /dev/null @@ -1,23 +0,0 @@ -; -; -I405 38 292 5-8-10-13-17 0.24 0.54 Loki -0.01 151.1 -0.03 781.4 -0.05 800.7 -0.06 755.7 -0.09 724.3 -0.12 697.7 -0.15 701 -0.17 675.3 -0.2 643.1 -0.3 607.7 -0.4 569.2 -0.5 517.7 -0.6 472.7 -0.7 392.3 -0.8 318.3 -0.9 241.2 -1 151.1 -1.1 93.3 -1.15 40 -1.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I405.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I405.rse deleted file mode 100644 index 46f11f7b9f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I405.rse +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I430.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I430.eng deleted file mode 100644 index f2af3aa0ea..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_I430.eng +++ /dev/null @@ -1,10 +0,0 @@ -; -; -I430-LB 38 292 7-9-12-15 0.24 0.54 Loki -0.00931677 534.483 -0.0310559 448.276 -0.0962733 465.517 -0.372671 456.897 -0.748447 439.655 -1.14907 422.414 -1.2 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J1000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J1000.rse deleted file mode 100644 index 7368c5c5b6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J1000.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J1026.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J1026.eng deleted file mode 100644 index f75d90f6d7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J1026.eng +++ /dev/null @@ -1,27 +0,0 @@ -J1026 38 625.5 P 0.616 1.172 Loki - 0.019 62.798 - 0.034 795.446 - 0.045 1167.004 - 0.07 1182.703 - 0.149 1153.921 - 0.249 1146.071 - 0.4 1161.77 - 0.49 1185.32 - 0.6 1193.17 - 0.8 1180.087 - 0.851 1172.237 - 0.899 1169.62 - 0.922 1159.154 - 0.947 1167.004 - 0.979 1127.755 - 1.009 1067.573 - 1.089 669.85 - 1.13 486.688 - 1.142 468.371 - 1.151 408.19 - 1.161 316.609 - 1.176 222.411 - 1.201 128.213 - 1.227 65.415 - 1.264 26.166 - 1.297 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J175.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J175.eng deleted file mode 100644 index d8882d6f6a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J175.eng +++ /dev/null @@ -1,19 +0,0 @@ -J175-LW 54 327 0 0.59 1.264 Loki -0.01 4.8 -0.1 420.4 -0.2 347.5 -0.3 349.9 -0.4 364.5 -0.5 320.7 -1 296.4 -1.5 279.4 -2 260 -2.5 238.1 -3 209 -3.5 172 -4 133.6 -4.5 102 -5 75.3 -5.5 46.2 -6 17 -6.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J175.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J175.rse deleted file mode 100644 index aef205f3a8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J175.rse +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J300.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J300.eng deleted file mode 100644 index 677e90e94e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J300.eng +++ /dev/null @@ -1,25 +0,0 @@ -J300LR 54 327 P 0.62 1.315 Loki - 0.015 78.248 - 0.025 89.305 - 0.06 358.069 - 0.076 395.492 - 0.111 403.147 - 0.176 381.033 - 0.287 365.724 - 0.504 363.172 - 0.998 361.471 - 1.497 363.172 - 2.001 344.461 - 2.227 331.703 - 2.504 310.44 - 2.993 270.465 - 3.255 242.398 - 3.502 222.836 - 3.578 222.836 - 3.643 190.516 - 3.699 134.382 - 3.724 118.222 - 3.8 106.315 - 3.926 44.227 - 3.996 29.768 - 4.278 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J320.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J320.eng deleted file mode 100644 index 6ec48d0aaa..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J320.eng +++ /dev/null @@ -1,6 +0,0 @@ -J320-LR 38 406 5-8-10-14 0.372 0.752 Loki -0.015528 534.031 -0.100932 439.791 -1.94099 319.372 -2.18944 78.534 -2.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J320.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J320.rse deleted file mode 100644 index c19082d0c0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J320.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J350.eng deleted file mode 100644 index cf1e8fa357..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J350.eng +++ /dev/null @@ -1,9 +0,0 @@ -J350-SF 54 327 0 0.59 1.26 Loki -0.02 325.858 -0.5 397.098 -1 457.784 -1.5 447.23 -2 415.567 -2.2 401.055 -2.5 48.8127 -2.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J396.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J396.eng deleted file mode 100644 index e7da7cbb5a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J396.eng +++ /dev/null @@ -1,11 +0,0 @@ -J396-SP 38 406 5-8-10-13-17 0.372 0.752 Loki -0.00621118 396.552 -0.201863 413.793 -0.400621 439.655 -0.593168 491.379 -0.717391 543.103 -0.801242 508.621 -0.993789 491.379 -1.20186 448.276 -1.40062 250 -1.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J396.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J396.rse deleted file mode 100644 index b65cea8ad3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J396.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J525.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J525.eng deleted file mode 100644 index 2aae0e317a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J525.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -; -J525 54 327 0 0.59 1.264 Loki -0.01 210.9 -0.03 499.3 -0.05 628.5 -0.1 594 -0.13 568.2 -0.15 559.6 -0.2 555.3 -0.3 572.5 -0.4 589.7 -0.5 606.9 -0.6 624.2 -0.7 637.1 -0.8 645.7 -0.9 650 -1 658.6 -1.1 637.1 -1.2 628.5 -1.3 615.5 -1.41 586.27 -1.52 561.52 -1.67 536.78 -1.78 517.74 -1.85 485.38 -1.92 91.37 -2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J525.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J525.rse deleted file mode 100644 index adc16226c6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J525.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J528.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J528.eng deleted file mode 100644 index 00424fe1b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J528.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -J528 38 406 5-8-10-13-17 0.372 0.752 Loki -0.01 704.2 -0.02 1019 -0.03 983.9 -0.05 881.1 -0.1 797.5 -0.15 771.7 -0.17 765.72 -0.21 765.72 -0.25 778.2 -0.42 789.28 -0.51 771.61 -0.6 756.89 -0.66 751 -0.71 762.78 -0.76 697.99 -0.8 665.59 -0.84 612.58 -0.92 488.88 -0.95 385.81 -1.02 282.73 -1.06 179.65 -1.14 53.01 -1.19 35.34 -1.23 32.2 -1.25 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J528.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J528.rse deleted file mode 100644 index 6649dce2f3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J528.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J650.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J650.eng deleted file mode 100644 index 84761bc649..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J650.eng +++ /dev/null @@ -1,10 +0,0 @@ -J650-SF 38 625 7-9-12-15 0.573 1.143 Loki -0.01 744.063 -0.2 754.617 -0.4 770.449 -0.6 833.773 -0.8 875.989 -1 923.483 -1.1 401.055 -1.2 295.515 -1.45 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J712.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J712.eng deleted file mode 100644 index 9f6354bb7f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J712.eng +++ /dev/null @@ -1,7 +0,0 @@ -J712-LB 38 406 7-9-12-15 0.372 0.752 Loki -0.00931677 870.69 -0.0496894 810.345 -0.791925 793.103 -1 706.897 -1.06211 172.414 -1.2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J712.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J712.rse deleted file mode 100644 index 453e819f46..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J712.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J820.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J820.eng deleted file mode 100644 index 7ebfc58b84..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J820.eng +++ /dev/null @@ -1,20 +0,0 @@ -J820-LW 54 327 0 0.57 1.244 Loki -0.01 4.8 -0.02 982.43 -0.07 1033.1 -0.11 982.43 -0.2 959.9 -0.3 943.02 -0.4 947 -0.5 972.8 -0.6 981.4 -0.7 990 -0.8 990 -0.9 981.4 -0.95 1033.1 -1 981.4 -1.1 641.4 -1.2 353 -1.3 206.6 -1.4 120.5 -1.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J820.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J820.rse deleted file mode 100644 index 2fa55b5438..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_J820.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K1127.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K1127.eng deleted file mode 100644 index 0bba56b34f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K1127.eng +++ /dev/null @@ -1,37 +0,0 @@ -K1127LB 38 625.5 P 0.624 1.172 Loki - 0.009 77.978 - 0.021 1002.962 - 0.033 1368.654 - 0.045 1210.008 - 0.058 1365.965 - 0.067 1263.786 - 0.08 1360.587 - 0.092 1255.719 - 0.105 1331.009 - 0.117 1242.275 - 0.13 1312.186 - 0.142 1261.097 - 0.155 1304.12 - 0.167 1261.097 - 0.218 1290.675 - 0.395 1325.631 - 0.542 1368.654 - 0.689 1392.854 - 0.726 1382.098 - 0.755 1344.453 - 0.814 1110.518 - 0.867 949.184 - 0.874 1099.763 - 0.883 962.629 - 0.908 847.006 - 0.989 548.537 - 0.997 363.002 - 1.003 715.249 - 1.014 494.759 - 1.048 406.025 - 1.091 352.247 - 1.152 228.557 - 1.198 158.645 - 1.244 69.912 - 1.286 32.267 - 1.37 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K250.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K250.eng deleted file mode 100644 index c873dd417a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K250.eng +++ /dev/null @@ -1,24 +0,0 @@ -; -; -K250 54 498 0 0.952544 1.79169 Loki -0.03 800 -0.1 682 -0.125 574 -0.15 476 -0.175 447 -0.25 385 -0.45 340 -0.6 320 -1 313 -1.5 300 -2 297 -2.5 303 -3 294 -3.5 287 -4 248 -4.5 222 -5 187 -5.5 147 -6 114 -6.5 62 -7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K250.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K250.rse deleted file mode 100644 index 63a8d09dba..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K250.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K350.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K350.eng deleted file mode 100644 index b7df74cd49..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K350.eng +++ /dev/null @@ -1,24 +0,0 @@ -; -; -K350 54 702 0 1.4 2.54012 Loki -0.025 1329 -0.0375 1061 -0.1 1006 -0.15 891 -0.2 768 -0.4 571 -0.5 542 -0.75 486 -1 486 -1.25 477 -1.5 481 -2.5058 460 -3.00464 427 -3.5 375 -4 333 -4.5 297 -5 249 -5.5 210 -6 164 -6.5 98 -7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K350.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K350.rse deleted file mode 100644 index 85907aac74..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K350.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K527.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K527.eng deleted file mode 100644 index 2c72ae37a6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K527.eng +++ /dev/null @@ -1,27 +0,0 @@ -K527LR 54 492.1 P 1.0150000000000001 1.973 Loki - 0.023 87.866 - 0.051 624.477 - 0.06 701.36 - 0.079 759.414 - 0.125 707.636 - 0.176 682.531 - 0.269 654.288 - 0.501 649.581 - 1.01 644.874 - 1.265 640.167 - 1.52 646.443 - 1.701 643.305 - 2.035 618.201 - 2.526 567.991 - 2.827 539.749 - 2.943 530.335 - 2.999 513.075 - 3.04 442.468 - 3.115 356.171 - 3.309 219.665 - 3.481 91.004 - 3.546 59.623 - 3.652 43.933 - 3.791 37.657 - 3.967 10.983 - 4.129 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K690.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K690.eng deleted file mode 100644 index 5350ae5a65..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K690.eng +++ /dev/null @@ -1,12 +0,0 @@ -K690-SF 54 498 0 0.95 1.8 Loki -0.01 643.799 -0.25 688.654 -0.5 730.871 -0.749636 770.449 -1 807.388 -1.25 796.834 -1.5 762.533 -1.75 733.509 -2 696.57 -2.25 659.631 -2.35 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K830.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K830.eng deleted file mode 100644 index 81f3c4388a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K830.eng +++ /dev/null @@ -1,8 +0,0 @@ -K830-SF 54 726 0 1.4 2.4 Loki -0.02 670.185 -0.5 775.726 -1 886.544 -1.5 986.807 -2 1092.35 -2.5 1187.34 -2.7 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K960.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K960.eng deleted file mode 100644 index 3061322978..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K960.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -; -K960 54 498 0 0.929864 1.74633 Loki -0.03 1210 -0.05 1512 -0.075 1535 -0.1 1502 -0.125 1437 -0.2 1237 -0.3 1175 -0.5 1139 -0.6 1130 -0.7 1156 -0.8 1182 -0.9 1192 -1 1166 -1.1 1139 -1.2 1101 -1.3 1091 -1.4 1026 -1.5 839 -1.6 790 -1.7 575 -1.8 284 -1.9 150 -2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K960.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K960.rse deleted file mode 100644 index 473eda36b4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_K960.rse +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1400.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1400.eng deleted file mode 100644 index 4ded67e6fe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1400.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -L1400 54 726 0 1.4 2.54 Loki -0.00580046 1606.3 -0.11891 1535.7 -0.327726 1535.7 -0.49884 1588.65 -1.00058 1782.82 -1.40661 1906.38 -1.49942 1376.83 -1.60673 953.19 -1.74594 547.202 -1.90545 335.382 -1.99826 211.82 -2 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1400.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1400.rse deleted file mode 100644 index dcc228c35c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1400.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1482.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1482.eng deleted file mode 100644 index 7214159db6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1482.eng +++ /dev/null @@ -1,10 +0,0 @@ -L1482-LB 76 498 0 1.814 3.538 Loki -0.00776398 1344.83 -0.0465839 1241.38 -0.48913 1551.72 -1.01708 1568.97 -1.99534 1603.45 -2.3913 1586.21 -2.48447 1758.62 -2.50776 103.448 -2.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1482.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1482.rse deleted file mode 100644 index 8b967a17f0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L1482.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L480.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L480.rse deleted file mode 100644 index 55ab83034d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L480.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L780.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L780.eng deleted file mode 100644 index c13b650e24..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L780.eng +++ /dev/null @@ -1,10 +0,0 @@ -L780-SF 76 498 0 1.8 3.5 Loki -0.02 506.596 -0.5 696.57 -1 844.327 -1.5 897.098 -2 934.037 -2.5 918.206 -3 865.435 -3.5 802.111 -3.8 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L840.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L840.eng deleted file mode 100644 index 334227464a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L840.eng +++ /dev/null @@ -1,25 +0,0 @@ -L840CT 75 498 P 2.074 3.748 Loki - 0.021 889.644 - 0.046 1182.485 - 0.077 1082.4 - 0.139 978.608 - 0.303 971.195 - 0.662 1015.677 - 1.011 1108.348 - 1.33 1149.124 - 1.689 1189.899 - 1.971 1163.951 - 2.089 1145.417 - 2.3 1034.211 - 2.633 893.351 - 2.823 822.921 - 3.455 656.112 - 3.737 596.803 - 3.891 585.682 - 3.984 385.512 - 4.112 355.858 - 4.215 203.877 - 4.292 140.86 - 4.384 103.792 - 4.589 63.016 - 4.8 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L930.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L930.eng deleted file mode 100644 index 59dbeb5aec..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L930.eng +++ /dev/null @@ -1,24 +0,0 @@ -; -; -L930 76 498 0 1.81437 3.53802 Loki -0.025 532 -0.05 1123 -0.075 1123 -0.125 1094 -0.2 930 -0.5 881 -0.6 878 -0.75 898 -1 921 -1.25 940 -1.5 1012 -1.75 1081 -2 1100 -2.25 1120 -2.5 1051 -2.75 980 -3 934 -3.25 826 -3.5 722 -3.75 280 -4 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L930.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L930.rse deleted file mode 100644 index 72fa9436ef..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_L930.rse +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1200.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1200.eng deleted file mode 100644 index 5828ada504..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1200.eng +++ /dev/null @@ -1,12 +0,0 @@ -M1200-SF 76 785 0 2.968 5.368 Loki -0.02 1018.47 -0.5 1203.17 -1 1303.43 -1.5 1398.42 -2 1514.51 -2.5 1498.68 -3 1408.97 -3.5 1203.17 -4 411.609 -4.25 89.7098 -4.5 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1650.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1650.eng deleted file mode 100644 index 8f27028727..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1650.eng +++ /dev/null @@ -1,22 +0,0 @@ -M1650LC 76 784.2 P 3.23 5.63 Loki - 0.015 1912.965 - 0.046 3779.835 - 0.097 3149.862 - 0.132 2865.606 - 0.183 2642.811 - 0.295 2458.429 - 0.407 2350.873 - 0.509 2297.095 - 0.91 2097.347 - 1.495 1920.648 - 1.612 1882.235 - 2.772 1336.771 - 3.266 1044.832 - 3.342 960.324 - 3.398 860.45 - 3.505 798.989 - 3.606 629.972 - 3.81 361.082 - 3.901 238.16 - 4.008 153.652 - 4.613 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1882.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1882.eng deleted file mode 100644 index 8d4d687790..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1882.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -M1882 75 785 0 3.12979 5.53383 Loki -0.01 4.8 -0.0174014 2579.22 -0.0696056 2392.32 -0.232019 2298.87 -0.50464 2261.49 -0.771462 2298.87 -0.986079 2411.01 -1.1891 2579.22 -1.49652 2597.91 -1.72854 2485.77 -2.00116 2354.94 -2.5 1644.72 -2.99884 242.97 -3.25 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1882.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1882.rse deleted file mode 100644 index 1464a21e10..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1882.rse +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1969.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1969.eng deleted file mode 100644 index 7d3c852a3b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M1969.eng +++ /dev/null @@ -1,28 +0,0 @@ -M1969SF 75 1038 P 4.266 7.189 Loki - 0.036 263.323 - 0.044 1504.064 - 0.075 2204.77 - 0.087 2356.515 - 0.186 2204.77 - 0.23 2280.643 - 0.274 2240.475 - 0.503 2347.589 - 1.003 2432.388 - 1.058 2454.703 - 1.495 2307.421 - 2.002 2236.012 - 2.315 2186.918 - 2.501 2182.454 - 2.628 2169.065 - 2.815 2244.938 - 2.882 2191.381 - 3.045 1338.929 - 3.096 1142.553 - 3.164 1044.365 - 3.267 964.029 - 3.378 807.821 - 3.5 504.33 - 3.639 267.786 - 3.77 102.651 - 3.881 22.315 - 3.96 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M2550.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M2550.eng deleted file mode 100644 index e7e0821c96..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M2550.eng +++ /dev/null @@ -1,9 +0,0 @@ -M2550-LB 76 785 0 3.13 5.53 Loki -0.00776398 2974.14 -0.0621118 2887.93 -0.427019 2887.93 -0.861801 3017.24 -1.49845 2974.14 -2.11957 2413.79 -2.45342 474.138 -2.6 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M2550.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M2550.rse deleted file mode 100644 index 89dbd155ce..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M2550.rse +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3000.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3000.eng deleted file mode 100644 index 8eb8a99040..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3000.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -M3000-LW 76 1038 P 4.064 6.857 Loki -0.083333 3234.3980 -0.166666 3626.9781 -0.333333 4104.8876 -0.5 4045.3220 -0.666667 3824.0989 -0.833333 3649.3737 -1.0 3669.9088 -1.166667 3815.3653 -1.333333 3859.8580 -1.5 3781.1602 -1.666667 3626.9781 -1.833333 3434.5774 -2.0 3093.3818 -2.166667 2643.3598 -2.333333 2052.4438 -2.416667 950.4439 -2.5 846.5966 -2.666667 764.3097 -2.833333 718.9958 -2.916667 718.7712 -3.0 542.0856 -3.166667 410.3503 -3.333333 272.3106 -3.5 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3000.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3000.rse deleted file mode 100644 index 77daa2ab7b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3000.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3464.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3464.eng deleted file mode 100644 index 71a7a19e44..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M3464.eng +++ /dev/null @@ -1,25 +0,0 @@ -M3400LB 76 1038.2 P 4.464 7.597 Loki - 0.007 4907.495 - 0.02 4008.216 - 0.047 3866.9 - 0.35 3866.9 - 0.502 3866.9 - 0.579 3892.594 - 1.239 4277.999 - 1.808 4303.693 - 1.886 4303.693 - 1.919 4188.071 - 2.0 3404.414 - 2.064 2916.234 - 2.152 2569.369 - 2.242 2569.369 - 2.283 2440.901 - 2.347 1965.567 - 2.384 1541.621 - 2.434 1104.829 - 2.485 835.045 - 2.545 719.423 - 2.596 475.333 - 2.717 205.55 - 2.862 51.387 - 2.976 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M900.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M900.rse deleted file mode 100644 index 501d18b89c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_M900.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_N3800.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_N3800.rse deleted file mode 100644 index 612af7f25d..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Loki_N3800.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_F50.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_F50.eng deleted file mode 100644 index 6970c3e405..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_F50.eng +++ /dev/null @@ -1,20 +0,0 @@ -; -F50T 29.0 98.00 4-6-9 0.03790 0.08490 AT - 0.01 37.97 - 0.02 56.27 - 0.03 65.08 - 0.12 71.86 - 0.23 75.25 - 0.33 77.29 - 0.35 77.70 - 0.45 75.25 - 0.59 71.86 - 0.72 65.76 - 0.83 58.98 - 1.01 43.39 - 1.19 25.76 - 1.25 15.59 - 1.30 8.81 - 1.36 4.75 - 1.42 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_G40.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_G40.eng deleted file mode 100644 index 8bdc364b3e..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_G40.eng +++ /dev/null @@ -1,22 +0,0 @@ -; PML G40W is the same as the Aerotech G40W. -G40W 29 124 4-7-10 0.0624 0.115 PML - 0.015 40.0 - 0.037 66.479 - 0.066 60.845 - 0.161 55.775 - 0.308 55.775 - 0.447 54.085 - 0.549 52.394 - 0.637 51.268 - 0.857 52.958 - 1.018 52.394 - 1.172 50.141 - 1.362 46.761 - 1.611 41.69 - 1.691 41.127 - 1.845 34.366 - 1.999 30.423 - 2.372 23.099 - 2.585 13.521 - 2.738 6.761 - 3.039 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_G80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_G80.eng deleted file mode 100644 index c30becead3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PML_G80.eng +++ /dev/null @@ -1,19 +0,0 @@ -; PML G80T is the same as the old Aerotech G480T. -G80T 29 124 4-7-10 0.0574 0.106 PML - 0.0070 82.746 - 0.018 104.754 - 0.051 104.754 - 0.095 97.711 - 0.245 94.19 - 0.458 95.07 - 0.6 93.31 - 0.86 84.507 - 1.003 76.585 - 1.139 69.542 - 1.252 57.218 - 1.303 51.056 - 1.34 37.852 - 1.38 19.366 - 1.424 7.923 - 1.461 2.641 - 1.497 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_H70.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_H70.eng deleted file mode 100644 index 192ca4ce15..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_H70.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -H70 38 462 100 0.318 0.627 Propulsion-Polymers -0.05 170.9 -0.09 122.3 -0.37 106.8 -0.74 97.9 -1.11 93.4 -1.48 89 -1.84 84.5 -2.21 77.1 -2.33 74 -2.58 41.5 -2.95 23.7 -3.32 15.6 -3.69 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_I160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_I160.eng deleted file mode 100644 index c56c2fcb65..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_I160.eng +++ /dev/null @@ -1,15 +0,0 @@ -; -; -I160 38 646 20-100 0.31 0.856 Propulsion-Polymers -0.04 298.9 -0.08 272.5 -0.32 264.7 -0.65 241.3 -0.97 218 -1.29 194.6 -1.61 179 -2 163.5 -2.26 93.4 -2.58 62.3 -2.9 31.1 -3.23 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_I80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_I80.eng deleted file mode 100644 index f6e0132d91..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_I80.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -I80 38 646 100 0.332 0.842 Propulsion-Polymers -0.04 198.7 -0.08 158.4 -0.57 133.4 -0.9 114.5 -1.15 110 -1.73 108 -2.3 106 -2.88 104 -3.45 96.3 -3.75 66.7 -4.03 50 -4.6 35.6 -5.18 22.2 -5.75 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_J140.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_J140.eng deleted file mode 100644 index 3102b99645..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/PP_J140.eng +++ /dev/null @@ -1,17 +0,0 @@ -; Propulsion Polymers 664NS-J140 -; from CAR data sheet -; created by John Coker 5/2006 -J140 38 881 P 0.626 1.166 PP - 0.02 249 - 0.20 320 - 0.25 240 - 0.30 236 - 0.35 191 - 0.45 236 - 1.15 223 - 1.60 178 - 3.05 165 - 3.40 102 - 4.25 45 - 4.95 22 - 5.00 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A3.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A3.eng deleted file mode 100644 index 27b627e96f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A3.eng +++ /dev/null @@ -1,27 +0,0 @@ -;Quest A3T -;File produced by Howard Smart from NAR certification thrust curve -;9 May 2014 -A3T 13 55 2-4 0.0036 0.009 Q -0.0925926 0.494186 -0.123457 0.988372 -0.192901 2.73256 -0.243056 1.51163 -0.25463 1.2936 -0.281636 1.13372 -0.320216 1.03198 -0.37037 0.901163 -0.401235 0.799419 -0.455247 0.843023 -0.505401 0.799419 -0.748457 0.784884 -0.841049 0.799419 -0.914352 0.65407 -1.00309 0.712209 -1.25386 0.625 -1.50077 0.697674 -1.7554 0.741279 -2.00231 0.770349 -2.05633 0.741279 -2.07562 0.56686 -2.1 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A6.eng deleted file mode 100644 index 9ce8d42409..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A6.eng +++ /dev/null @@ -1,8 +0,0 @@ -; -; -A6Q 18 70 4 0.0035 0.0153 Quest -0.1 4.8 -0.2 11.82 -0.23 7.9 -0.3 4.8 -0.41 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A6.rse deleted file mode 100644 index 99ecaae3f6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A6.rse +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A8.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A8.eng deleted file mode 100644 index 0dd1fc9fac..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_A8.eng +++ /dev/null @@ -1,34 +0,0 @@ -;Quest A8 RASP.ENG file made from NAR published data -; File produced Aug 2009 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -A8 18 69 3- 0.0063 0.0131 QU -0.073 2.139 -0.085 2.599 -0.097 3.317 -0.110 4.035 -0.122 4.34 -0.135 4.955 -0.147 5.569 -0.160 6.132 -0.173 6.85 -0.185 7.361 -0.197 7.976 -0.210 8.281 -0.222 8.741 -0.235 9.407 -0.247 9.712 -0.260 11.14 -0.273 10.063 -0.285 8.768 -0.297 6.647 -0.310 5.042 -0.322 3.953 -0.335 3.019 -0.347 2.136 -0.360 1.512 -0.372 1.043 -0.380 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B4.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B4.eng deleted file mode 100644 index 9b71d97651..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B4.eng +++ /dev/null @@ -1,33 +0,0 @@ -;QUEST B4 RASP.ENG file made from NAR published data -; File produced SEPTEMBER, 2009 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -B4 19 70 4- 0.0104 0.0166 Q -0.033 1.091 -0.061 2.250 -0.104 4.228 -0.138 6.002 -0.184 8.457 -0.222 10.504 -0.258 12.810 -0.275 9.412 -0.289 6.070 -0.298 4.842 -0.309 4.228 -0.329 3.751 -0.359 3.546 -0.444 3.410 -0.550 3.274 -0.646 3.478 -0.723 3.615 -0.787 3.751 -0.814 3.751 -0.831 3.478 -0.843 2.796 -0.862 1.773 -0.882 0.818 -0.904 0.136 -0.910 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B6.eng deleted file mode 100644 index 97d8266ea0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B6.eng +++ /dev/null @@ -1,14 +0,0 @@ -; -; -B6Q 18 70 0-2-4 0.0065 0.0162 Quest -0.1 7 -0.18 14.38 -0.2 10.2 -0.24 6.6 -0.3 6 -0.4 6.1 -0.5 6.2 -0.6 6.3 -0.65 6.6 -0.7 3 -0.75 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B6.rse deleted file mode 100644 index 79a8020ae9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_B6.rse +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_C6.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_C6.eng deleted file mode 100644 index 8234f20921..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_C6.eng +++ /dev/null @@ -1,31 +0,0 @@ -; Quest C6-0 from NAR data -C6-0 18 70 0 0.0083 0.0216 Q - 0.02 0.497 - 0.057 2.539 - 0.089 5.132 - 0.129 7.947 - 0.159 9.437 - 0.171 21.247 - 0.181 23.234 - 0.194 22.958 - 0.204 22.185 - 0.218 19.592 - 0.233 17.881 - 0.258 10.486 - 0.308 2.428 - 0.338 2.539 - 0.385 2.98 - 0.412 3.091 - 0.442 3.422 - 0.459 2.98 - 0.536 3.256 - 0.732 3.311 - 0.747 2.483 - 0.78 2.98 - 1.323 3.587 - 1.365 2.815 - 1.887 3.808 - 1.974 3.256 - 2.1 3.532 - 2.227 3.201 - 2.247 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_C6.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_C6.rse deleted file mode 100644 index 5ab5f2f4ff..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_C6.rse +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5.eng deleted file mode 100644 index d1226505d2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5.eng +++ /dev/null @@ -1,35 +0,0 @@ -; QUEST D5 RASP.ENG FILE -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -D5 20 96 4-6 0.0240 0.0451 QUEST -0.010 1.014 -0.122 2.652 -0.172 4.836 -0.273 7.723 -0.331 10.610 -0.390 13.809 -0.448 16.800 -0.480 12.403 -0.484 8.266 -0.517 5.221 -0.713 4.125 -0.974 4.121 -1.135 3.338 -1.324 3.101 -1.550 3.254 -1.971 3.169 -2.393 3.162 -2.752 3.391 -3.069 3.386 -3.547 3.301 -3.694 3.064 -3.948 3.294 -4.215 3.290 -4.412 3.287 -4.496 2.505 -4.586 1.801 -4.610 0.000 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5_1.eng deleted file mode 100644 index 4d247aded6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5_1.eng +++ /dev/null @@ -1,35 +0,0 @@ -;QUEST D5 RASP.ENG FILE -;The total impulse, peak thrust, average thrust and burn time are -;the same as the averaged static test data on the NAR web site in -;the certification file. The curve drawn with these data points is as -;close to the certification curve as can be with such a limited -;number of points (32) allowed with wRASP up to v1.6. -D5 20 96 4-6 0.024 0.0451 QUEST -0.01 1.014 -0.122 2.652 -0.172 4.836 -0.273 7.723 -0.331 10.61 -0.39 13.809 -0.448 16.8 -0.48 12.403 -0.484 8.266 -0.517 5.221 -0.713 4.125 -0.974 4.121 -1.135 3.338 -1.324 3.101 -1.55 3.254 -1.971 3.169 -2.393 3.162 -2.752 3.391 -3.069 3.386 -3.547 3.301 -3.694 3.064 -3.948 3.294 -4.215 3.29 -4.412 3.287 -4.496 2.505 -4.586 1.801 -4.61 0 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5_2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5_2.eng deleted file mode 100644 index 74c5a20929..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D5_2.eng +++ /dev/null @@ -1,24 +0,0 @@ -; Quest D5-0 by Mark Koelsch from NAR data -D5-0 20 88 0 0.025 0.0384 Q - 0.096 1.241 - 0.252 5.897 - 0.304 8.586 - 0.357 10.552 - 0.391 11.483 - 0.435 9.828 - 0.557 6.103 - 0.583 5.172 - 0.67 5.172 - 1.078 4.966 - 1.2 4.345 - 1.73 4.759 - 1.8 4.759 - 1.887 4.138 - 2.391 5.069 - 2.626 4.966 - 3.009 5.379 - 3.357 5.276 - 3.661 5.69 - 3.835 3.103 - 3.887 1.655 - 3.983 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D8.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D8.eng deleted file mode 100644 index 9252d72f6c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_D8.eng +++ /dev/null @@ -1,38 +0,0 @@ -; QUEST D8 RASP.ENG FILE -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -D8 24 70 0-3-5 0.0220 0.454 QUEST -0.002 1.014 -0.010 1.565 -0.130 5.178 -0.217 8.911 -0.298 14.812 -0.351 20.231 -0.414 25.289 -0.442 28.882 -0.470 23.844 -0.487 17.461 -0.508 13.367 -0.537 10.958 -0.600 9.152 -0.673 8.791 -0.828 8.309 -0.933 8.068 -1.136 7.105 -1.350 6.743 -1.480 6.623 -1.602 6.502 -1.648 7.105 -1.683 6.382 -1.743 6.262 -1.865 6.141 -1.974 6.141 -2.104 6.262 -2.132 5.419 -2.170 3.492 -2.191 1.926 -2.200 0.000 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx.eng deleted file mode 100644 index 0caf9294cf..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @File: q003.txt, @Pts-I: 769, @Pts-O: 31, @Sm: 0, @CO: 0% -; @TI: 0.1991613, @TIa: 0.1991608, @TIe: +0.1%, @ThMax: 1.624927, @ThAvg: 0.255335, @Tb: 0.78 -; Exported using ThrustCurveTool, www.ThrustGear.com -MAXXII 0 0 0.76 0.0 0.0 QUEST - 0.026 0.0394607 - 0.036 0.1214556 - 0.04 0.206028 - 0.05 0.444676 - 0.056 0.680251 - 0.06 0.899565 - 0.066 1.358816 - 0.068 1.475611 - 0.07 1.56653 - 0.074 1.624927 - 0.088 1.190166 - 0.112 0.830955 - 0.126 0.439917 - 0.134 0.319751 - 0.144 0.248959 - 0.174 0.1656754 - 0.206 0.1918503 - 0.258 0.1262147 - 0.342 0.1601231 - 0.366 0.1386081 - 0.384 0.1794569 - 0.494 0.218422 - 0.546 0.1540751 - 0.56 0.178168 - 0.608 0.1523896 - 0.682 0.209499 - 0.698 0.1837202 - 0.712 0.220206 - 0.742 0.209003 - 0.768 0.040353 - 0.785 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx.rse deleted file mode 100644 index c694f30031..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx.rse +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_1.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_1.eng deleted file mode 100644 index 5ea10d96a9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_1.eng +++ /dev/null @@ -1,35 +0,0 @@ -; @File: q0016.txt, @Pts-I: 815, @Pts-O: 31, @Sm: 0, @CO: 3% -; @TI: 0.1497473, @TIa: 0.1488623, @TIe: -0.06%, @ThMax: 2.09889, @ThAvg: 0.1862529, @Tb: 0.804 -; Exported using ThrustCurveTool, www.ThrustGear.com -1/8A0.2 0 0 0.81 0.0 0.0 QUEST - 0.016 0.0530363 - 0.02 0.0985533 - 0.024 0.176654 - 0.03 0.415869 - 0.032 0.434918 - 0.038 0.657991 - 0.052 1.247306 - 0.058 1.453536 - 0.064 1.700872 - 0.066 1.755612 - 0.07 1.951716 - 0.074 2.06541 - 0.076 2.09889 - 0.078 2.09889 - 0.08 2.02811 - 0.082 1.911814 - 0.084 1.619262 - 0.086 1.151861 - 0.088 0.728272 - 0.09 0.433614 - 0.092 0.292953 - 0.098 0.217459 - 0.154 0.224377 - 0.172 0.150186 - 0.196 0.0998567 - 0.23 0.078602 - 0.414 0.0625608 - 0.7559 0.082111 - 0.8219 0.0607562 - 0.8339 0.0208536 -0.834 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_1.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_1.rse deleted file mode 100644 index 2fe681673f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_1.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - - QUEST MICROMAXX II RASP.ENG file made from NAR published data -File produced Dec 29, 2001 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_2.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_2.eng deleted file mode 100644 index 8ed80b4b49..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_2.eng +++ /dev/null @@ -1,39 +0,0 @@ -; Traced from NAR certification data dated 1-29-2009 -MicroMaxxII 6 26 NE-1 5.0E-4 0.0010 Q - 0.021 0.015 - 0.036 0.05 - 0.043 0.103 - 0.049 0.198 - 0.08 1.636 - 0.092 1.3 - 0.109 0.995 - 0.124 0.805 - 0.133 0.442 - 0.143 0.301 - 0.164 0.21 - 0.186 0.149 - 0.199 0.183 - 0.235 0.145 - 0.256 0.145 - 0.293 0.149 - 0.327 0.164 - 0.367 0.156 - 0.387 0.175 - 0.409 0.183 - 0.431 0.191 - 0.461 0.21 - 0.474 0.202 - 0.49 0.217 - 0.505 0.175 - 0.513 0.198 - 0.537 0.172 - 0.553 0.175 - 0.602 0.156 - 0.623 0.175 - 0.644 0.183 - 0.674 0.21 - 0.689 0.191 - 0.697 0.229 - 0.731 0.21 - 0.753 0.092 - 0.771 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_II.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_II.eng deleted file mode 100644 index 8ed80b4b49..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_II.eng +++ /dev/null @@ -1,39 +0,0 @@ -; Traced from NAR certification data dated 1-29-2009 -MicroMaxxII 6 26 NE-1 5.0E-4 0.0010 Q - 0.021 0.015 - 0.036 0.05 - 0.043 0.103 - 0.049 0.198 - 0.08 1.636 - 0.092 1.3 - 0.109 0.995 - 0.124 0.805 - 0.133 0.442 - 0.143 0.301 - 0.164 0.21 - 0.186 0.149 - 0.199 0.183 - 0.235 0.145 - 0.256 0.145 - 0.293 0.149 - 0.327 0.164 - 0.367 0.156 - 0.387 0.175 - 0.409 0.183 - 0.431 0.191 - 0.461 0.21 - 0.474 0.202 - 0.49 0.217 - 0.505 0.175 - 0.513 0.198 - 0.537 0.172 - 0.553 0.175 - 0.602 0.156 - 0.623 0.175 - 0.644 0.183 - 0.674 0.21 - 0.689 0.191 - 0.697 0.229 - 0.731 0.21 - 0.753 0.092 - 0.771 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_II.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_II.rse deleted file mode 100644 index 2fe681673f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Quest_Micro_Maxx_II.rse +++ /dev/null @@ -1,49 +0,0 @@ - - - - QUEST MICROMAXX II RASP.ENG file made from NAR published data -File produced Dec 29, 2001 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_H70.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_H70.eng deleted file mode 100644 index 354ef5a027..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_H70.eng +++ /dev/null @@ -1,30 +0,0 @@ -; RATT Works H70H -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -H70H 29 457 0 0.106176 0.348992 RTW - 0.051 124.137 - 0.156 134.902 - 0.261 127.047 - 0.367 115.870 - 0.473 110.286 - 0.578 108.630 - 0.683 105.741 - 0.789 104.108 - 0.894 101.515 - 1.000 98.471 - 1.105 93.809 - 1.210 90.543 - 1.316 85.219 - 1.421 74.353 - 1.527 57.739 - 1.632 44.019 - 1.738 34.554 - 1.843 27.992 - 1.948 22.691 - 2.054 19.064 - 2.159 15.665 - 2.265 12.897 - 2.370 11.332 - 2.475 10.107 - 2.581 8.591 - 2.688 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_I80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_I80.eng deleted file mode 100644 index d8a361fd85..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_I80.eng +++ /dev/null @@ -1,30 +0,0 @@ -; RATT Works I80H -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I80H 29 730 0 0.21952 0.549248 RTW - 0.093 84.101 - 0.280 102.075 - 0.469 118.708 - 0.657 117.130 - 0.846 114.829 - 1.034 112.225 - 1.222 109.818 - 1.410 107.622 - 1.599 105.945 - 1.787 102.168 - 1.976 100.449 - 2.164 99.265 - 2.352 96.272 - 2.541 91.951 - 2.729 89.380 - 2.918 86.430 - 3.105 54.544 - 3.294 41.902 - 3.482 33.368 - 3.671 26.516 - 3.859 21.324 - 4.047 16.951 - 4.235 14.387 - 4.424 13.456 - 4.612 12.777 - 4.801 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_I90.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_I90.eng deleted file mode 100644 index 69db50b486..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_I90.eng +++ /dev/null @@ -1,30 +0,0 @@ -; RATT Works I90LH -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -I90LH 29 921 0 0.285376 0.684544 RTW - 0.127 137.737 - 0.383 121.431 - 0.640 117.048 - 0.897 121.354 - 1.154 118.436 - 1.410 116.538 - 1.668 114.826 - 1.925 112.358 - 2.181 110.303 - 2.439 107.768 - 2.696 105.749 - 2.952 104.733 - 3.209 102.802 - 3.467 95.410 - 3.723 68.281 - 3.980 55.000 - 4.237 43.620 - 4.494 33.784 - 4.751 31.704 - 5.008 27.714 - 5.265 24.875 - 5.522 22.930 - 5.779 21.379 - 6.035 20.884 - 6.293 18.637 - 6.550 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_J160.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_J160.eng deleted file mode 100644 index e39baf83dc..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_J160.eng +++ /dev/null @@ -1,26 +0,0 @@ -; -;J160 data entered by Tim Van Milligan -;Thrust Curve based on TRA certification dated 10/24/2003. -;Propellant weight based on 80F degree day, 490cc Oxidizer + 4.25g AP weight. -J160 38 1219 100 0.327926 0.544 RATT_Works -0.015456 262.049 -0.185471 255.442 -0.278207 240.028 -0.278207 229.017 -0.386399 251.038 -0.510046 242.23 -0.64915 213.603 -0.788253 189.38 -1.00464 178.369 -1.45286 160.753 -2.00927 147.54 -2.44204 129.923 -2.90572 121.115 -2.96754 162.955 -3.15301 149.742 -3.32303 125.519 -3.67852 94.6899 -3.97218 74.8711 -4.32767 46.2439 -4.69861 19.8188 -5.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_K240.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_K240.eng deleted file mode 100644 index 4c9e7ca269..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_K240.eng +++ /dev/null @@ -1,30 +0,0 @@ -; RATT Works K240H -; converted from TMT test stand data 2002 (www.tripoli.org) -; provided by ThrustCurve.org (www.thrustcurve.org) -K240H 64 908 0 1.29338 2.81434 RTW - 0.164 413.978 - 0.493 392.975 - 0.822 370.841 - 1.151 362.058 - 1.480 337.839 - 1.809 321.401 - 2.139 285.118 - 2.468 280.031 - 2.798 275.060 - 3.128 278.392 - 3.457 274.394 - 3.786 252.302 - 4.116 272.858 - 4.445 264.671 - 4.774 255.572 - 5.103 210.314 - 5.433 163.955 - 5.764 126.239 - 6.093 98.015 - 6.422 74.491 - 6.751 55.617 - 7.080 40.778 - 7.409 29.618 - 7.739 21.915 - 8.069 17.214 - 8.399 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_L600.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_L600.eng deleted file mode 100644 index aa97415c9f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_L600.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -;Rattworks L600 Hybrid -;prepared by Andrew MacMillen NAR 77472 2/28/04 -;based on TMT thrust data from Paul Holmes & TMT cert doc -;NOX weight calc'd at .7048gm/cc, 75 deg F @ 812 psi -;compiled with RockSim7 EngEdit -;within 3 percent for total impulse -;peak and average thrust are off due to data spike smoothing -;accurate thrust profile -;NOTE: NOT RATT, CAR, TMT OR NAR APPROVED -;Rattworks L600 -L600 64 1066 100 1.863 2.25 RATT_Works -0 88.62 -0.02 153.82 -0.19 158.02 -0.35 169.94 -0.4 1127.04 -0.78 1001.2 -2.23 778.11 -2.84 736.24 -3.07 704 -3.62 673.43 -3.81 435.29 -3.89 350.43 -4.14 240.05 -4.31 197.19 -4.49 165.4 -4.66 139.26 -4.82 119.21 -5.01 99.01 -5.34 70.99 -5.93 49.74 -6.49 38.96 -6.98 36.42 -7.1 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_M900.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_M900.eng deleted file mode 100644 index df948e79b9..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RATT_M900.eng +++ /dev/null @@ -1,23 +0,0 @@ -; -;Rattworks M900 Hybrid -;prepared by Andrew MacMillen NAR 77472 12/23/04 -;based on TMT thrust data from Paul Holmes & TMT cert doc -;NOX weight calc'd at .7048gm/cc, 75 deg F @ 812 psi -;compiled with RockSim6 EngEdit -;within 2 percent for total impulse -;peak and average thrust are off due to data spike smoothing -;accurate thrust profile -;NOTE: NOT RATT, CAR, TMT OR NAR APPROVED -;Rattworks M900 -M900 69 1828 100 3.288 5.956 RATT_Works -0.04 151.9 -0.43 241.76 -0.5 1054.61 -7.04 718.06 -7.22 346.42 -7.26 297.14 -7.35 241.24 -7.48 200.65 -7.66 164.8 -12.28 49.36 -12.3 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_E15.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_E15.eng deleted file mode 100644 index e6fd9718a6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_E15.eng +++ /dev/null @@ -1,40 +0,0 @@ -; RocketVision E15 RASP.ENG file made from NAR published data -; File produced December 10, 2000 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -E15 24 70 4-7 .0201 .0501 RV -0.020 23.330 -0.036 27.318 -0.058 28.840 -0.079 27.171 -0.139 25.638 -0.183 24.263 -0.237 24.106 -0.297 22.426 -0.373 21.964 -0.400 20.894 -0.443 21.355 -0.487 20.442 -0.617 19.833 -0.742 18.457 -0.812 20.000 -0.850 18.006 -0.899 18.467 -1.035 17.711 -1.100 16.945 -1.160 16.945 -1.377 15.736 -1.426 14.656 -1.436 16.198 -1.463 14.813 -1.550 14.361 -1.572 15.432 -1.610 13.752 -1.827 12.839 -2.126 10.098 -2.337 6.116 -2.538 1.369 -2.640 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_F32.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_F32.eng deleted file mode 100644 index 9c1decaf89..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_F32.eng +++ /dev/null @@ -1,11 +0,0 @@ -; Rocketvision F32 -; from NAR data sheet updated 11/2000 -; created by John Coker 5/2006 -F32 24 124 5-10-15 .0377 .0695 RV - 0.01 50 - 0.05 56 - 0.10 48 - 2.00 24 - 2.20 19 - 2.45 5 - 2.72 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_F72.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_F72.eng deleted file mode 100644 index f53740d335..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_F72.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Same motor as the Aerotech F72T single use from NAR cert data -F72T 24 124 5-10-15 0.0368 0.0746 Rocketvision - 0.0040 37.671 - 0.01 78.082 - 0.017 97.26 - 0.027 91.781 - 0.043 89.726 - 0.06 80.822 - 0.087 84.932 - 0.101 78.767 - 0.132 81.507 - 0.143 78.767 - 0.171 81.507 - 0.192 78.082 - 0.215 80.822 - 0.24 78.082 - 0.264 81.507 - 0.279 78.767 - 0.298 80.137 - 0.517 76.027 - 0.68 70.548 - 0.855 58.219 - 0.934 49.315 - 0.961 43.151 - 0.996 31.507 - 1.025 21.233 - 1.054 14.384 - 1.103 7.534 - 1.147 3.425 - 1.196 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_G55.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_G55.eng deleted file mode 100644 index b2366d2956..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/RV_G55.eng +++ /dev/null @@ -1,30 +0,0 @@ -; Same motor as the Aerotech G55W single use from NAR cert data -G55W 24 177 5-10-15 0.0625 0.115 Rocketvision - 0.0040 74.648 - 0.012 85.211 - 0.054 81.69 - 0.128 73.239 - 0.182 73.944 - 0.231 69.718 - 0.508 69.014 - 0.868 67.606 - 1.037 65.493 - 1.07 67.606 - 1.091 64.085 - 1.14 63.38 - 1.161 66.901 - 1.19 62.676 - 1.269 62.676 - 1.397 59.155 - 1.496 57.042 - 1.583 52.113 - 1.653 45.07 - 1.719 38.028 - 1.76 31.69 - 1.831 24.648 - 1.901 19.014 - 1.988 12.676 - 2.083 9.155 - 2.169 5.634 - 2.252 3.521 - 2.36 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_E25.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_E25.eng deleted file mode 100644 index 5ad73138ce..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_E25.eng +++ /dev/null @@ -1,35 +0,0 @@ -;ROADRUNNER E25R WRASP FILE -E25R 29 76 4-7 0.02 0.078 RR - 0.0 1.15995 - 0.0 4.0904 - 0.01 13.9194 - 0.02 24.481 - 0.025 28.327 - 0.04 33.028 - 0.045 33.639 - 0.07 33.516 - 0.12 35.287 - 0.195 36.569 - 0.245 38.278 - 0.28 37.668 - 0.315 38.657 - 0.35 37.729 - 0.385 37.973 - 0.45 36.691 - 0.56 36.569 - 0.73 32.295 - 0.82 29.487 - 0.9 26.068 - 0.92 25.824 - 0.945 24.176 - 0.995 22.772 - 1.035 20.024 - 1.08 18.5592 - 1.165 14.2247 - 1.19 13.6142 - 1.31 7.2039 - 1.395 4.2735 - 1.445 3.602 - 1.49 2.1978 - 1.505 0.79365 - 1.506 0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_E25.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_E25.rse deleted file mode 100644 index 5f3bcb44d4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_E25.rse +++ /dev/null @@ -1,48 +0,0 @@ - - - - ROADRUNNER E25R WRASP FILE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F35.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F35.eng deleted file mode 100644 index d2486dc63f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F35.eng +++ /dev/null @@ -1,37 +0,0 @@ -; ROADRUNNER F35 RASP.ENG FILE -; File produced April 5, 2006 -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F35 29 112 6-10 0.040 0.111 RR -0.023 33.700 -0.040 44.462 -0.081 47.206 -0.121 48.579 -0.166 49.270 -0.242 49.550 -0.315 51.010 -0.411 50.111 -0.528 49.710 -0.664 48.208 -0.791 47.256 -0.896 46.986 -1.000 45.484 -1.097 44.943 -1.194 42.338 -1.277 40.400 -1.323 40.706 -1.356 37.691 -1.402 35.637 -1.451 32.753 -1.505 29.467 -1.578 25.491 -1.675 20.833 -1.750 17.137 -1.828 13.021 -1.907 8.638 -1.984 5.075 -2.049 2.610 -2.130 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F35.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F35.rse deleted file mode 100644 index 507dbc2e53..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F35.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - ROADRUNNER F35 RASP.ENG FILE -File produced April 5, 2006 -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F45.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F45.eng deleted file mode 100644 index 11833a21de..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F45.eng +++ /dev/null @@ -1,33 +0,0 @@ -; ROADRUNNER F45R RASP ENG FILE -F45R 29 93 5-8-14 0.03 0.093 RR - 0.0 4.1971 - 0.019 45.500 - 0.038 53.070 - 0.057 52.402 - 0.095 54.741 - 0.113 55.298 - 0.132 56.744 - 0.151 57.190 - 0.227 60.419 - 0.284 61.754 - 0.416 62.422 - 0.491 60.753 - 0.510 61.420 - 0.567 60.307 - 0.624 58.414 - 0.662 58.080 - 0.737 55.298 - 0.775 52.959 - 0.813 51.513 - 0.888 46.169 - 0.983 34.701 - 1.002 31.807 - 1.096 23.902 - 1.134 21.453 - 1.210 14.106 - 1.229 12.992 - 1.285 8.4282 - 1.342 5.5328 - 1.361 5.4218 - 1.418 2.9723 - 1.420 0.0 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F45.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F45.rse deleted file mode 100644 index ec264b16ad..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F45.rse +++ /dev/null @@ -1,46 +0,0 @@ - - - - ROADRUNNER F45R RASP ENG FILE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F60.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F60.eng deleted file mode 100644 index d8cacf9772..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F60.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -; ROADRUNNER F60 RASP.ENG FILE -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -F60R 29 112 4-7-10 0.038 0.109 RR -0.013 45.860 -0.021 63.937 -0.029 72.291 -0.041 75.214 -0.061 74.374 -0.087 76.872 -0.155 83.122 -0.231 86.440 -0.309 88.088 -0.329 90.070 -0.345 88.33 -0.395 87.90 -0.454 87.208 -0.514 87.188 -0.616 82.141 -0.699 77.105 -0.765 70.400 -0.807 61.611 -0.859 51.983 -0.926 42.355 -0.978 33.556 -1.022 21.430 -1.061 13.056 -1.101 6.776 -1.133 3.423 -1.190 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F60.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F60.rse deleted file mode 100644 index a74e0cda47..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_F60.rse +++ /dev/null @@ -1,42 +0,0 @@ - - - - ROADRUNNER F60 RASP.ENG FILE -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_G80.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_G80.eng deleted file mode 100644 index 4d9ababc7c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_G80.eng +++ /dev/null @@ -1,35 +0,0 @@ -; -; ROADRUNNER G80 RASP.ENG FILE -; The total impulse, peak thrust, average thrust and burn time are -; the same as the averaged static test data on the NAR web site in -; the certification file. The curve drawn with these data points is as -; close to the certification curve as can be with such a limited -; number of points (32) allowed with wRASP up to v1.6. -G80R 29 140 4-7-10 0.055 0.133 RR -0.012 63.563 -0.028 84.077 -0.057 89.563 -0.119 96.03 -0.206 102.518 -0.242 104.42 -0.297 106.923 -0.356 109.826 -0.422 111.829 -0.483 111.328 -0.558 112.632 -0.622 112.750 -0.683 112.129 -0.739 109.125 -0.796 102.017 -0.863 90.494 -0.901 82.750 -0.935 72.41 -0.976 59.869 -1.018 49.826 -1.028 44.321 -1.042 39.805 -1.073 28.272 -1.113 18.231 -1.170 11.176 -1.218 4.636 -1.310 0.000 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_G80.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_G80.rse deleted file mode 100644 index f5796694ab..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/Roadrunner_G80.rse +++ /dev/null @@ -1,43 +0,0 @@ - - - -ROADRUNNER G80 RASP.ENG FILE -The total impulse, peak thrust, average thrust and burn time are -the same as the averaged static test data on the NAR web site in -the certification file. The curve drawn with these data points is as -close to the certification curve as can be with such a limited -number of points (32) allowed with wRASP up to v1.6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_A3.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_A3.rse deleted file mode 100644 index 5e4f94e065..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_A3.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_B4.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_B4.rse deleted file mode 100644 index 9680f7e5a5..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_B4.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_C3.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_C3.rse deleted file mode 100644 index 2e72864e52..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SCR_C3.rse +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G125.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G125.eng deleted file mode 100644 index 475ed67d85..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G125.eng +++ /dev/null @@ -1,17 +0,0 @@ -; -; -; -G125 38.0 408.00 1 0.15800 0.53700 SRS - 0.01 346.87 - 0.04 325.72 - 0.07 324.57 - 0.08 415.57 - 0.09 219.61 - 0.13 194.84 - 0.20 177.77 - 0.40 157.13 - 0.60 131.89 - 0.80 88.31 - 1.00 42.44 - 1.09 14.64 - 1.20 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G125.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G125.rse deleted file mode 100644 index c6d9714dc0..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G125.rse +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G63.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G63.eng deleted file mode 100644 index 988d871c4b..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G63.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -;Sky Ripper Systems 29/75 G63 -G63 29 304.80 0 .06500 .23600 SRS - 0.01 121.91 - 0.03 142.66 - 0.07 156.57 - 0.09 133.60 - 0.13 100.62 - 0.18 114.82 - 0.20 105.21 - 0.27 104.91 - 0.35 93.38 - 0.41 83.85 - 0.50 67.95 - 0.65 61.99 - 0.83 61.99 - 0.93 40.14 - 1.09 17.09 - 1.18 13.78 - 1.29 5.56 - 1.30 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G63.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G63.rse deleted file mode 100644 index 181b9ebd98..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G63.rse +++ /dev/null @@ -1,28 +0,0 @@ - - - - Sky Ripper Systems 29/75 G63 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G69.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G69.eng deleted file mode 100644 index 7c73a6a9e4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G69.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -; -;Sky Ripper Systems 29/125 G69 -G69 29 406.40 0 .10700 .33300 SRS - 0.01 99.80 - 0.04 137.51 - 0.07 103.01 - 0.13 94.13 - 0.30 80.09 - 0.49 72.20 - 0.57 70.72 - 0.65 71.96 - 0.74 80.83 - 0.81 81.81 - 0.94 73.43 - 1.01 74.42 - 1.06 85.02 - 1.11 83.78 - 1.19 62.10 - 1.24 60.62 - 1.32 65.30 - 1.37 64.81 - 1.43 52.98 - 1.49 48.55 - 1.55 44.85 - 1.64 28.59 - 1.85 17.74 - 1.99 14.29 - 2.00 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G69.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G69.rse deleted file mode 100644 index 2e19495cb7..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_G69.rse +++ /dev/null @@ -1,35 +0,0 @@ - - - - Sky Ripper Systems 29/125 G69 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H124.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H124.eng deleted file mode 100644 index 88c0bcb1b2..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H124.eng +++ /dev/null @@ -1,34 +0,0 @@ -; -; Sky Ripper Systems 38mm hybrid motors -; prepared for SRS by Andrew MacMillen NAR 77472 8/10/04 -; -; based on TMT thrust data & cert docs -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim6 EngEdit -; -; -; SRS H124 38/220 PVC -H124_pvc 38.0 508.00 0 0.14200 0.66400 SRS - 0.01 198.24 - 0.02 300.84 - 0.03 314.34 - 0.03 316.00 - 0.04 305.39 - 0.08 280.35 - 0.11 221.43 - 0.69 168.38 - 0.78 180.85 - 0.81 158.64 - 0.84 167.59 - 0.89 152.32 - 0.92 120.70 - 0.95 123.55 - 1.06 82.23 - 1.35 48.36 - 1.55 25.63 - 1.60 21.88 - 1.62 23.66 - 1.66 18.58 - 1.67 12.46 - 1.68 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H124.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H124.rse deleted file mode 100644 index 69f46919d1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H124.rse +++ /dev/null @@ -1,71 +0,0 @@ - - - -Sky Ripper Systems 38mm motor simulation file. -SRS H124 38/220 PVC fuel for Rocksim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H155.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H155.eng deleted file mode 100644 index d77c6a9cfb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H155.eng +++ /dev/null @@ -1,21 +0,0 @@ -; -; Sky Ripper Systems 38mm hybrid motors -; prepared by Andrew MacMillen NAR 77472 8/10/04 -; -; based on TMT thrust data & cert docs -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim6 EngEdit -; -; -; SRS H155 38/220 PP -H155_pp 38.0 508.00 0 0.14200 0.66400 SRS - 0.03 308.75 - 0.05 362.22 - 0.09 252.41 - 1.02 102.11 - 1.08 119.98 - 1.45 33.45 - 1.66 19.06 - 1.68 12.59 - 1.69 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H155.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H155.rse deleted file mode 100644 index 1c3e436561..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H155.rse +++ /dev/null @@ -1,70 +0,0 @@ - - - -SRS H155 38/220 PP fuel - for Rocksim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H78.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H78.eng deleted file mode 100644 index 3cc038238c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H78.eng +++ /dev/null @@ -1,27 +0,0 @@ -; -;Sky Ripper Systems 29/185 H78 -H78 29 520.70 0 .15800 .41800 SRS - 0.01 138.21 - 0.08 150.10 - 0.12 142.67 - 0.15 132.27 - 0.22 130.49 - 0.29 90.30 - 0.34 88.27 - 0.40 86.81 - 0.61 86.52 - 0.72 81.59 - 0.76 71.72 - 0.86 64.46 - 1.01 63.30 - 1.18 62.42 - 1.28 60.39 - 1.50 57.49 - 1.80 58.36 - 1.89 59.23 - 2.01 55.46 - 2.21 36.29 - 2.36 22.94 - 2.54 13.36 - 2.72 9.58 - 2.75 0.00 diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H78.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H78.rse deleted file mode 100644 index 7f9eea40fe..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_H78.rse +++ /dev/null @@ -1,34 +0,0 @@ - - - -Sky Ripper Systems 29/185 H78 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I117.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I117.eng deleted file mode 100644 index aad7b0df5c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I117.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; Sky Ripper Systems 38mm hybrid motors -; prepared by Andrew MacMillen NAR 77472 8/10/04 -; -; based on TMT thrust data & cert docs -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim6 EngEdit -; -; -; SRS I117 38/580 PVC -I117_pvc 38.0 914.00 0 0.37000 1.13300 SRS - 0.01 203.36 - 0.02 339.95 - 0.02 358.77 - 0.03 367.94 - 0.03 361.47 - 0.06 277.40 - 0.08 277.11 - 0.15 250.99 - 0.27 256.14 - 0.30 248.56 - 0.42 194.78 - 0.47 222.59 - 1.35 174.82 - 1.39 184.03 - 1.79 150.12 - 2.12 156.59 - 3.42 54.16 - 3.80 40.00 - 4.20 17.22 - 4.23 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I117.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I117.rse deleted file mode 100644 index a5b9f26a1f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I117.rse +++ /dev/null @@ -1,57 +0,0 @@ - - - -SRS I117 38/580 PVC fuel - for Rocksim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I119.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I119.eng deleted file mode 100644 index 7821c00e4f..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I119.eng +++ /dev/null @@ -1,31 +0,0 @@ -; -; Sky Ripper Systems 38mm hybrid motors -; prepared by Andrew MacMillen NAR 77472 8/10/04 -; -; based on TMT thrust data & cert docs -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim6 EngEdit -; -; -; SRS I119 38/400 PVC -I119_pvc 38.0 711.00 0 0.26400 0.96700 SRS - 0.00 192.14 - 0.01 262.20 - 0.02 341.53 - 0.03 338.42 - 0.06 221.25 - 0.07 195.93 - 0.11 189.23 - 0.15 202.20 - 0.18 233.36 - 0.47 230.26 - 0.99 200.90 - 1.18 165.36 - 1.27 172.11 - 1.48 162.61 - 2.18 74.18 - 2.92 24.69 - 2.97 10.98 - 3.10 10.06 - 3.12 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I119.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I119.rse deleted file mode 100644 index f9366566b3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I119.rse +++ /dev/null @@ -1,72 +0,0 @@ - - - -SRS I119 38/400 PVC fuel - for Rocksim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I147.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I147.eng deleted file mode 100644 index 921ed1a544..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I147.eng +++ /dev/null @@ -1,28 +0,0 @@ -; -; Sky Ripper Systems 38mm hybrid motors -; prepared by Andrew MacMillen NAR 77472 8/10/04 -; -; based on TMT thrust data & cert docs -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim6 EngEdit -; -; -; SRS I147 38/400 PP -I147_pp 38.0 711.00 0 0.26400 0.96700 SRS - 0.00 194.47 - 0.02 366.71 - 0.03 390.09 - 0.03 392.30 - 0.05 359.02 - 0.07 217.40 - 0.10 207.68 - 0.38 241.52 - 1.07 183.80 - 2.33 141.34 - 2.51 100.04 - 2.75 71.51 - 3.32 34.49 - 3.89 17.18 - 4.43 7.17 - 4.45 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I147.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I147.rse deleted file mode 100644 index 84729e87e6..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_I147.rse +++ /dev/null @@ -1,59 +0,0 @@ - - - -SRS I147 38/400 PP fuel - for Rocksim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J144.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J144.eng deleted file mode 100644 index c4f4dadbe3..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J144.eng +++ /dev/null @@ -1,29 +0,0 @@ -; -; Sky Ripper Systems 38mm hybrid motors -; prepared by Andrew MacMillen NAR 77472 8/10/04 -; -; based on TMT thrust data & cert docs -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim6 EngEdit -; -; -; SRS J144 38/580 PP -J144_pp 38.0 914.00 0 0.37000 1.13300 SRS - 0.01 301.25 - 0.03 376.44 - 0.03 376.86 - 0.08 247.31 - 0.22 273.45 - 0.45 263.59 - 0.79 231.99 - 1.09 175.69 - 1.21 185.68 - 2.05 149.60 - 2.86 127.64 - 3.42 69.07 - 3.88 42.69 - 4.59 20.49 - 5.20 10.00 - 5.80 6.12 - 5.80 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J144.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J144.rse deleted file mode 100644 index ab698bfc71..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J144.rse +++ /dev/null @@ -1,69 +0,0 @@ - - - -SRS J144 38/580 PP fuel - for Rocksim - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J261.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J261.eng deleted file mode 100644 index ebfa8323ae..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J261.eng +++ /dev/null @@ -1,33 +0,0 @@ -;Sky Ripper Systems 54/830 J261 Gold Insert -J261 54.0 731.50 0 0.56470 1.90250 SRS - 0.02 1303.39 - 0.09 903.88 - 0.21 591.22 - 0.42 349.57 - 0.61 304.62 - 0.81 329.59 - 1.01 277.16 - 1.21 294.64 - 1.39 232.21 - 1.61 197.26 - 1.82 255.99 - 2.00 274.66 - 2.20 269.67 - 2.41 189.77 - 2.61 294.64 - 2.82 212.24 - 3.01 254.69 - 3.21 225.29 - 3.41 194.76 - 3.59 156.32 - 3.74 229.72 - 3.85 237.71 - 3.90 156.32 - 4.00 112.76 - 4.20 140.19 - 4.40 192.26 - 4.48 106.66 - 4.61 54.86 - 4.76 33.52 - 4.95 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J263.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J263.eng deleted file mode 100644 index 963a225f82..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J263.eng +++ /dev/null @@ -1,26 +0,0 @@ -;Sky Ripper Systems 54/550 J263 Gold Insert -J263 54.0 606.50 0 0.37420 1.59830 SRS - 0.01 1359.46 - 0.09 794.32 - 0.15 559.93 - 0.21 419.30 - 0.40 296.89 - 0.61 286.48 - 0.81 265.64 - 1.01 244.81 - 1.20 247.41 - 1.40 244.81 - 1.60 231.79 - 1.81 200.53 - 2.01 205.74 - 2.21 205.74 - 2.41 195.32 - 2.60 174.49 - 2.80 166.68 - 2.91 161.47 - 3.00 138.03 - 3.08 98.96 - 3.21 62.50 - 3.41 28.74 - 3.60 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J337.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J337.eng deleted file mode 100644 index a60b6e6dc8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J337.eng +++ /dev/null @@ -1,22 +0,0 @@ -;Sky Ripper Systems 54/830 J337 Black Insert -J337 54.0 731.50 0 0.56470 1.90250 SRS - 0.00 8.88 - 0.01 1521.03 - 0.10 585.29 - 0.20 651.28 - 0.41 589.45 - 0.50 548.23 - 0.60 539.99 - 0.99 461.67 - 1.40 416.33 - 1.60 391.59 - 1.80 387.47 - 1.91 364.90 - 2.01 239.43 - 2.20 171.02 - 2.40 119.72 - 2.60 72.68 - 2.80 42.76 - 3.00 21.68 - 3.10 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J348.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J348.eng deleted file mode 100644 index efd3d0fba1..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_J348.eng +++ /dev/null @@ -1,19 +0,0 @@ -;Sky Ripper Systems 54/550 J348 Black Insert -J348 54.0 606.50 0 0.37420 1.59830 SRS - 0.00 8.88 - 0.02 451.80 - 0.13 557.60 - 0.14 1203.84 - 0.20 617.65 - 0.40 549.02 - 0.60 494.69 - 0.79 406.05 - 1.01 354.57 - 1.20 334.56 - 1.31 303.10 - 1.40 237.34 - 1.60 148.69 - 1.80 82.92 - 2.00 37.17 - 2.20 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_K257.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_K257.eng deleted file mode 100644 index a926d86c2c..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_K257.eng +++ /dev/null @@ -1,34 +0,0 @@ -;Sky Ripper Systems 54/1130 K257 Gold Insert -K257 54.0 911.40 0 0.76880 2.31070 SRS - 0.07 1133.08 - 0.20 529.98 - 0.40 333.69 - 0.59 363.13 - 0.80 347.18 - 0.98 366.40 - 1.20 356.59 - 1.40 310.79 - 1.60 274.80 - 1.81 337.71 - 2.00 356.59 - 2.20 294.43 - 2.40 314.06 - 2.60 294.43 - 2.81 333.69 - 3.00 340.23 - 3.22 319.78 - 3.41 292.68 - 3.59 249.32 - 3.79 278.07 - 4.00 243.90 - 4.21 281.35 - 4.41 235.54 - 4.60 251.90 - 4.81 211.38 - 5.01 222.22 - 5.20 189.70 - 5.41 153.23 - 5.60 81.40 - 5.80 23.94 - 6.10 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_K347.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_K347.eng deleted file mode 100644 index aee6041ef8..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/SkyR_K347.eng +++ /dev/null @@ -1,28 +0,0 @@ -;Sky Ripper Systems 54/1130 K347 Black Insert -K347 54.0 911.40 0 0.76880 2.31070 SRS - 0.00 8.88 - 0.03 1474.51 - 0.11 972.20 - 0.19 737.25 - 0.40 697.22 - 0.61 673.87 - 0.81 653.85 - 1.01 600.40 - 1.20 550.44 - 1.40 530.42 - 1.60 533.76 - 1.80 517.08 - 1.89 396.98 - 1.95 493.19 - 2.06 393.65 - 2.13 443.69 - 2.30 365.38 - 2.30 292.31 - 2.40 257.92 - 2.60 184.84 - 2.79 124.66 - 3.00 81.67 - 3.21 51.58 - 3.41 21.49 - 3.58 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_G55.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_G55.rse deleted file mode 100644 index 18b2ed0a9a..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_G55.rse +++ /dev/null @@ -1,40 +0,0 @@ - - - - Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. certification dated -June 8, 2006. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_H100.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_H100.rse deleted file mode 100644 index 10ba8c1381..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_H100.rse +++ /dev/null @@ -1,45 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. certification dated -10-29-04. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_I110.eng b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_I110.eng deleted file mode 100644 index 6f73ee8a26..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_I110.eng +++ /dev/null @@ -1,32 +0,0 @@ -; -; West Coast Hybrid motor -; prepared for WestCoast/Scott Harrison by -; Andrew MacMillen NAR 77472 9/13/02 -; -; based on CAR thrust curves & cert letters -; since the cert letters and test curves don't agree -; the data is hand entered data points from CAR thrust curves -; NOX weight calc'd at 90 deg. F; 0.5469 gm/cc; 984 psi -; compiled with RockSim5 EngEdit -; -; within 2-3 percent for total impulse, peak and average thrust -; accurate thrust profile -; -; NOTE: NOT WCH, CAR, TMT OR NAR APPROVED -; -; West Coast Hybrids I110 -; -I110H 38.0 606.00 0 0.32700 0.82400 WCH - 0.05 240.00 - 0.38 200.00 - 0.76 182.00 - 1.14 160.00 - 1.52 142.00 - 1.90 125.00 - 2.23 113.00 - 2.66 71.00 - 3.04 44.00 - 3.42 29.00 - 3.78 22.00 - 4.00 0.00 -; diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_I110.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_I110.rse deleted file mode 100644 index 480fddcfeb..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_I110.rse +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_K460.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_K460.rse deleted file mode 100644 index 10f0d135f4..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_K460.rse +++ /dev/null @@ -1,64 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. certification dated -3-5-05. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_L600.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_L600.rse deleted file mode 100644 index f9dc4eafca..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_L600.rse +++ /dev/null @@ -1,50 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. certification dated -6-30-06. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_M700.rse b/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_M700.rse deleted file mode 100644 index ccda5e8a06..0000000000 --- a/core/resources-src/datafiles/thrustcurves/thrustcurve.org/WCH_M700.rse +++ /dev/null @@ -1,47 +0,0 @@ - - - -Input by Tim Van Milligan for RockSim users. Used John Coker's ThrustCruve -Tracer program. Thrust curve and engine data from C.A.R. certification dated -5-30-06. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/resources-src/pix/splashscreen-1.1.png b/core/resources-src/pix/splashscreen-1.1.png new file mode 100644 index 0000000000..680d3f4f15 Binary files /dev/null and b/core/resources-src/pix/splashscreen-1.1.png differ diff --git a/core/resources-src/pix/splashscreen-1.1.xcf.gz b/core/resources-src/pix/splashscreen-1.1.xcf.gz new file mode 100644 index 0000000000..00ec73bb11 Binary files /dev/null and b/core/resources-src/pix/splashscreen-1.1.xcf.gz differ diff --git a/core/resources/build.properties b/core/resources/build.properties index 9895ce0ced..fce6927bd7 100644 --- a/core/resources/build.properties +++ b/core/resources/build.properties @@ -1,7 +1,7 @@ # The OpenRocket build version -build.version=15.03dev +build.version=19-xx-alpha10 # The source of the package. When building a package for a specific diff --git a/core/resources/datafiles/thrustcurves/thrustcurves.ser b/core/resources/datafiles/thrustcurves/thrustcurves.ser index 4f447a5423..eef07e2d82 100644 Binary files a/core/resources/datafiles/thrustcurves/thrustcurves.ser and b/core/resources/datafiles/thrustcurves/thrustcurves.ser differ diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index e1ae196c33..90b271386f 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -37,15 +37,14 @@ RocketActions.EditAct.Edit = Edit RocketActions.EditAct.ttip.Edit = Edit the selected component. RocketActions.NewStageAct.Newstage = New stage RocketActions.NewStageAct.ttip.Newstage = Add a new stage to the rocket design. -RocketActions.ActBoosterstage = Booster stage RocketActions.MoveUpAct.Moveup = Move up RocketActions.MoveUpAct.ttip.Moveup = Move this component upwards. RocketActions.MoveDownAct.Movedown = Move down RocketActions.MoveDownAct.ttip.Movedown = Move this component downwards. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Side view -RocketPanel.FigTypeAct.Backview = Back view +RocketPanel.FigTypeAct.SideView = Side view +RocketPanel.FigTypeAct.BackView = Back view RocketPanel.FigTypeAct.Figure3D = 3D Figure RocketPanel.FigTypeAct.Finished = 3D Finished RocketPanel.FigTypeAct.Unfinished = 3D Unfinished @@ -157,6 +156,7 @@ bugreport.dlg.provideDescription.title = Bug description missing debuglogdlg.but.clear = Clear debuglogdlg.OpenRocketdebuglog = OpenRocket debug log debuglogdlg.Displayloglines = Display log lines: +debuglogdlg.ToggleDetails = Details debuglogdlg.Follow = Follow debuglogdlg.col.Time = Time debuglogdlg.col.Level = Level @@ -334,7 +334,7 @@ generalprefs.lbl.languageEffect = The language will change the next time you sta ! Simulation edit dialog simedtdlg.but.runsimulation = Run simulation simedtdlg.but.resettodefault = Reset to default -simedtdlg.but.savedefault = Save as default +simedtdlg.but.savedefault = Save as default simedtdlg.but.add = Add simedtdlg.but.remove = Remove simedtdlg.title.Editsim = Edit simulation @@ -664,13 +664,20 @@ compaddbuttons.Trapezoidal = Trapezoidal compaddbuttons.Elliptical = Elliptical compaddbuttons.Freeform = Freeform compaddbuttons.Tubefin = Tube fins -compaddbuttons.Launchlug = Launch lug +compaddbuttons.Launchlug = Launch Lug +compaddbuttons.RailButton = Rail Button compaddbuttons.Innercomponent = Inner component compaddbuttons.Innertube = Inner tube compaddbuttons.Coupler = Coupler compaddbuttons.Centeringring = Centering\nring compaddbuttons.Bulkhead = Bulkhead compaddbuttons.Engineblock = Engine\nblock +compaddbuttons.Fueltank = Fuel Tank +compaddbuttons.assembly = Assembly Components +compaddbuttons.newBooster.lbl = New\nBoosters +compaddbuttons.newBooster.ttip = Add a new set booster stage to the rocket design. +compaddbuttons.newPods.lbl = New Pods +compaddbuttons.newPods.ttip = Add a new set of pods to the rocket design. compaddbuttons.Massobjects = Mass objects compaddbuttons.Parachute = Parachute compaddbuttons.Streamer = Streamer @@ -816,14 +823,13 @@ RocketCfg.lbl.Comments = Comments: RocketCfg.lbl.Revisionhistory = Revision history: RocketCfg.lbl.Material = Material: -! ShockCordConfig -ShockCordCfg.lbl.Shockcordlength = Shock cord length: - ! RocketComponentConfig RocketCompCfg.lbl.Componentname = Component name: RocketCompCfg.ttip.Thecomponentname = The component name. RocketCompCfg.tab.Override = Override RocketCompCfg.tab.MassandCGoverride = Mass and CG override options +RocketCompCfg.tab.Assembly = General +RocketCompCfg.tab.AssemblyComment = Options for locating stages parallel to other stages RocketCompCfg.tab.Figure = Figure RocketCompCfg.tab.Figstyleopt = Figure style options RocketCompCfg.tab.Comment = Comment @@ -863,6 +869,8 @@ RocketCompCfg.title.Noseconeshoulder = Nose cone shoulder RocketCompCfg.title.Aftshoulder = Aft shoulder RocketCompCfg.border.Foreshoulder = Fore shoulder !RocketCompCfg.lbl.Length = Length: +RocketCompCfg.lbl.InstanceCount = Instance Count +RocketCompCfg.lbl.InstanceSeparation = Instance Separation ! BulkheadConfig BulkheadCfg.tab.Diameter = Diameter: @@ -888,6 +896,10 @@ StageConfig.tab.Separation.ttip = Stage separation options StageConfig.separation.lbl.title = Select when this stage separates: StageConfig.separation.lbl.plus = plus StageConfig.separation.lbl.seconds = seconds +StageConfig.parallel.radius = Radial Distance +StageConfig.parallel.angle = Angle +StageConfig.parallel.count = Number of Copies +StageConfig.parallel.offset = Offset Value !EllipticalFinSetConfig EllipticalFinSetCfg.Nbroffins = Number of fins: @@ -963,6 +975,15 @@ LaunchLugCfg.lbl.plus = plus LaunchLugCfg.tab.General = General LaunchLugCfg.tab.Generalprop = General properties +! LaunchLugConfig +RailBtnCfg.lbl.OuterDiam = Outer Diameter: +RailBtnCfg.lbl.TotalHeight = Total Height +RailBtnCfg.lbl.Angle = Angular Position: +RailBtnCfg.lbl.PosRelativeTo = Position relative to: +RailBtnCfg.lbl.Plus = plus +RailBtnCfg.tab.General = General +RailBtnCfg.tab.GeneralProp = General properties + ! MassComponentConfig MassComponentCfg.lbl.Mass = Mass: MassComponentCfg.lbl.Density = Approximate density: @@ -1013,13 +1034,11 @@ NoseConeCfg.tab.ttip.Shoulder = Shoulder properties ! ParachuteConfig ParachuteCfg.lbl.Canopy = Canopy: ParachuteCfg.lbl.Diameter = Diameter: -ParachuteCfg.lbl.Material = Material: ParachuteCfg.combo.MaterialModel = The component material affects the weight of the component. ParachuteCfg.lbl.longA1 = Drag coefficient CD: ParachuteCfg.lbl.longB1 = The drag coefficient relative to the total area of the parachute.
ParachuteCfg.lbl.longB2 = A larger drag coefficient yields a slowed descent rate. ParachuteCfg.lbl.longB3 = A typical value for parachutes is 0.8. -ParachuteCfg.but.Reset = Reset ParachuteCfg.lbl.Shroudlines = Shroud lines: ParachuteCfg.lbl.Numberoflines = Number of lines: ParachuteCfg.lbl.Linelength = Line length: @@ -1165,6 +1184,7 @@ TCMotorSelPan.checkbox.hideSimilar = Hide very similar thrust curves TCMotorSelPan.checkbox.hideUsed = Hide motors already used in the mount TCMotorSelPan.checkbox.limitlength = Limit motor length to mount length TCMotorSelPan.checkbox.limitdiameter = Limit motor diameter to mount diameter +TCMotorSelPan.checkbox.hideUnavailable = Hide motors which are not in regular production TCMotorSelPan.btn.details = Show Details TCMotorSelPan.btn.filter = Filter Motors TCMotorSelPan.MotorSize = Motor Dimensions @@ -1182,6 +1202,9 @@ TCMotorSelPan.lbl.Maxthrust = Max. thrust: TCMotorSelPan.lbl.Burntime = Burn time: TCMotorSelPan.lbl.Launchmass = Launch mass: TCMotorSelPan.lbl.Emptymass = Empty mass: +TCMotorSelPan.lbl.Caseinfo = Case info: +TCMotorSelPan.lbl.Propinfo = Propellant: +TCMotorSelPan.lbl.CompatibleCases = Compatible Cases TCMotorSelPan.lbl.Datapoints = Data points: TCMotorSelPan.lbl.Digest = Digest: TCMotorSelPan.title.Thrustcurve = Thrust curve: @@ -1283,6 +1306,7 @@ Material.CUSTOM = Custom Databases.materials.types.Bulk = Bulk Databases.materials.types.Line = Line Databases.materials.types.Surface = Surface +Databases.materials.types.Custom = Custom ! BULK_MATERIAL material.acrylic = Acrylic @@ -1369,14 +1393,36 @@ Shape.Haackseries.desc2 = The Haack series nose cones are designed to min ! RocketComponent -RocketComponent.Position.TOP = Top of the parent component -RocketComponent.Position.MIDDLE = Middle of the parent component -RocketComponent.Position.BOTTOM = Bottom of the parent component -RocketComponent.Position.AFTER = After the parent component -RocketComponent.Position.ABSOLUTE = Tip of the nose cone +RocketComponent.Position.Method.Axial.Label = Radius Positioning Method +RocketComponent.Position.Method.Axial.ABSOLUTE = Tip of the nose cone +RocketComponent.Position.Method.Axial.AFTER = After the sibling component +RocketComponent.Position.Method.Axial.BOTTOM = Bottom of the parent component +RocketComponent.Position.Method.Axial.MIDDLE = Middle of the parent component +RocketComponent.Position.Method.Axial.TOP = Top of the parent component + +RocketComponent.Position.Method.Radius.Label = Radius Positioning Method +RocketComponent.Position.Method.Radius.FREE = Position relative to the component's center +RocketComponent.Position.Method.Radius.SURFACE = Position on the target component surface (without offset) +RocketComponent.Position.Method.Radius.RELATIVE = Position relative to the component surface +RocketComponent.Position.Method.Radius.COAXIAL = Position on the same axis as the target component + +RocketComponent.Position.Method.Angle.Label = Angle Positioning Method +RocketComponent.Position.Method.Angle.RELATIVE = Relative to the parent component +RocketComponent.Position.Method.Angle.FIXED = Angle is fixed. +RocketComponent.Position.Method.Angle.MIRROR_XY = Mirror relative to the rocket's x-y plane + +RocketComponent.Direction.X = "X axis" +RocketComponent.Direction.Y = "Y axis" +RocketComponent.Direction.Z = "Z axis" +RocketComponent.Direction.AXIAL = "Axial" +RocketComponent.Direction.RADIAL = "Radial" +RocketComponent.Direction.ANGULAR = "Angular" + ! LaunchLug -LaunchLug.Launchlug = Launch lug +LaunchLug.Launchlug = Launch Lug +! LaunchButton +RailButton.RailButton = Rail Button ! NoseCone NoseCone.NoseCone = Nose cone ! Transition @@ -1391,6 +1437,10 @@ Stage.SeparationEvent.EJECTION = Current stage ejection charge Stage.SeparationEvent.LAUNCH = Launch Stage.SeparationEvent.NEVER = Never +BoosterSet.BoosterSet = Booster Set + +PodSet.PodSet = Pod Set + ! BodyTube BodyTube.BodyTube = Body tube ! TubeCoupler @@ -1412,6 +1462,26 @@ MassComponent.Tracker = Tracker MassComponent.Payload = Payload MassComponent.RecoveryHardware = Recovery hardware MassComponent.Battery = Battery +! Fuel Tanks +FuelType.Fuel = Fuel +FuelType.LOX = Liquid Oxygen +FuelType.Kerosene = Kerosene +FuelType.RP1 = RP1 +FuelTank.FuelTank = Fuel tank +FuelTank.lbl.type = Type of Fuel +FuelTank.lbl.tankmass = Mass of empty tank +FuelTank.lbl.fuelqty = Amount of fuel at liftoff +FuelTank.lbl.Radialdistance = Radial Distance +FuelTank.lbl.Radialdirection = Radial Direction +FuelTank.lbl.drainrate = Fuel Drain Rate, mass/second +FuelTank.lbl.length = Length +FuelTank.lbl.diameter = Diameter +FuelTank.tab.Radialpos = Radial Position +FuelTank.tab.ttip.Radialpos = The radial position & distance +FuelTank.tab.General = Fuel Tank +FuelTank.tab.ttip.General = Fuel settings +! Engine Nozzle +Nozzle.Nozzle = Engine Nozzle ! Parachute Parachute.Parachute = Parachute ! ShockCord @@ -1445,8 +1515,15 @@ MotorMount.IgnitionEvent.short.EJECTION_CHARGE = Ejection charge MotorMount.IgnitionEvent.short.BURNOUT = Burnout MotorMount.IgnitionEvent.short.NEVER = Never +FlightConfiguration.noMotors = No motors + +MotorConfiguration.empty = None + !ComponentIcons +ComponentIcons.Stage = Axial Stage +ComponentIcons.Boosters = Booster Stage +ComponentIcons.Pods = Pod Stage ComponentIcons.Nosecone = Nose cone ComponentIcons.Bodytube = Body tube ComponentIcons.Transition = Transition @@ -1454,7 +1531,8 @@ ComponentIcons.Trapezoidalfinset = Trapezoidal fin set ComponentIcons.Ellipticalfinset = Elliptical fin set ComponentIcons.Freeformfinset = Freeform fin set ComponentIcons.Tubefinset = Tube fin set -ComponentIcons.Launchlug = Launch lug +ComponentIcons.Launchlug = Launch Lugs +ComponentIcons.RailButton = Rail Buttons ComponentIcons.Innertube = Inner tube ComponentIcons.Tubecoupler = Tube coupler ComponentIcons.Centeringring = Centering ring @@ -1508,12 +1586,12 @@ FlightEvent.Type.GROUND_HIT = Ground hit FlightEvent.Type.SIMULATION_END = Simulation end FlightEvent.Type.ALTITUDE = Altitude change FlightEvent.Type.TUMBLE = Tumbling -FlightEvent.Type.EXCEPTION = Exception +FlightEvent.Type.EXCEPTION = Exception ! ThrustCurveMotorColumns TCurveMotorCol.MANUFACTURER = Manufacturer TCurveMotorCol.DESIGNATION = Designation -TCurveMotorCol.TYPE = Type +TCurveMotorCol.CASEINFO = Case TCurveMotorCol.DIAMETER = Diameter TCurveMotorCol.LENGTH = Length TCurveMotorCol.TOTAL_IMPULSE = Total Impulse @@ -1999,6 +2077,7 @@ PhotoFrame.fileFilter.png = PNG Image PhotoFrame.menu.edit.copy = Copy Image PhotoFrame.menu.edit.copy.desc = Copy image to clipboard PhotoFrame.menu.edit.settings = Photo Settings +PhotoFrame.menu.edit.unk = Unknown Setting PhotoFrame.menu.window = Window PhotoFrame.menu.window.size = Size PhotoFrame.menu.window.size.portrait = {0} Portrait diff --git a/core/resources/l10n/messages_cs.properties b/core/resources/l10n/messages_cs.properties index cc77e423b4..535fe403dc 100644 --- a/core/resources/l10n/messages_cs.properties +++ b/core/resources/l10n/messages_cs.properties @@ -44,10 +44,10 @@ RocketActions.MoveDownAct.Movedown = Presun dolu RocketActions.MoveDownAct.ttip.Movedown = Presun tuto komponentu smerem dolu. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Pohled ze strany -RocketPanel.FigTypeAct.ttip.Sideview = Pohled ze strany -RocketPanel.FigTypeAct.Backview = Zpetný pohled -RocketPanel.FigTypeAct.ttip.Backview = Zadní pohled +RocketPanel.FigTypeAct.SideView = Pohled ze strany +RocketPanel.FigTypeAct.ttip.SideView = Pohled ze strany +RocketPanel.FigTypeAct.BackView = Zpetný pohled +RocketPanel.FigTypeAct.ttip.BackView = Zadní pohled RocketPanel.FigViewAct.2D = 2D Pohled RocketPanel.FigViewAct.ttip.2D = 2D Pohled RocketPanel.FigViewAct.3D = 3D Pohled diff --git a/core/resources/l10n/messages_de.properties b/core/resources/l10n/messages_de.properties index 49ce7885bc..93456531bf 100644 --- a/core/resources/l10n/messages_de.properties +++ b/core/resources/l10n/messages_de.properties @@ -44,10 +44,10 @@ RocketActions.MoveDownAct.Movedown = Nach unten verschieben RocketActions.MoveDownAct.ttip.Movedown = Verschiebt diese Komponente nach unten. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Seitenansicht -RocketPanel.FigTypeAct.ttip.Sideview = Seitenansicht -RocketPanel.FigTypeAct.Backview = Rückansicht -RocketPanel.FigTypeAct.ttip.Backview = Vorderansicht +RocketPanel.FigTypeAct.SideView = Seitenansicht +RocketPanel.FigTypeAct.ttip.SideView = Seitenansicht +RocketPanel.FigTypeAct.BackView = Rückansicht +RocketPanel.FigTypeAct.ttip.BackView = Vorderansicht RocketPanel.FigViewAct.2D = 2D Ansicht RocketPanel.FigViewAct.ttip.2D = 2D Ansicht RocketPanel.FigViewAct.3D = 3D Ansicht diff --git a/core/resources/l10n/messages_es.properties b/core/resources/l10n/messages_es.properties index 591e52d72e..2e9bd3c359 100644 --- a/core/resources/l10n/messages_es.properties +++ b/core/resources/l10n/messages_es.properties @@ -892,14 +892,14 @@ RocketInfo.massWithoutMotors = Masa sin motores: RocketInfo.stabText = Estabilidad: RocketInfo.velocityValue = N/A -RocketPanel.FigTypeAct.Backview = Vista trasera +RocketPanel.FigTypeAct.BackView = Vista trasera RocketPanel.FigTypeAct.Figure3D = Esquema en 3D RocketPanel.FigTypeAct.Finished = Acabado en 3D ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Vista lateral +RocketPanel.FigTypeAct.SideView = Vista lateral RocketPanel.FigTypeAct.Unfinished = Sin acabado en 3D -RocketPanel.FigTypeAct.ttip.Backview = Vista desde atr\u00e1s -RocketPanel.FigTypeAct.ttip.Sideview = Vista desde un lateral +RocketPanel.FigTypeAct.ttip.BackView = Vista desde atr\u00e1s +RocketPanel.FigTypeAct.ttip.SideView = Vista desde un lateral RocketPanel.FigViewAct.2D = Vista 2D RocketPanel.FigViewAct.3D = Vista 3D RocketPanel.FigViewAct.ttip.2D = Vista en 2D diff --git a/core/resources/l10n/messages_fr.properties b/core/resources/l10n/messages_fr.properties index 128cb91418..c5fd192712 100644 --- a/core/resources/l10n/messages_fr.properties +++ b/core/resources/l10n/messages_fr.properties @@ -819,6 +819,7 @@ RocketCompCfg.but.Setforall = Appliquer \u00E0 tous RocketCompCfg.but.ttip.Setforall = R\u00E9gler la finition pour tous les composants de la fus\u00E9e. RocketCompCfg.checkbox.Endcapped = Arri\u00E8re clos RocketCompCfg.checkbox.Overridecenterofgrav = Forcer le centre de gravit\u00E9: +RocketCompCfg.checkbox.Overridecoeffofdrag = Modifier le coefficient de trainee: RocketCompCfg.checkbox.Overridemass = Forcer la masse: RocketCompCfg.checkbox.OverridemassandCG = Forcer la masse et le centre de gravit\u00E9 de tous les sous composants RocketCompCfg.checkbox.Usedefaultcolor = Utiliser la couleur par d\u00E9faut @@ -883,14 +884,14 @@ RocketInfo.massWithoutMotors = Masse sans moteurs RocketInfo.stabText = Stabilit\u00E9: RocketInfo.velocityValue = N/A -RocketPanel.FigTypeAct.Backview = Vue arri\u00E8re +RocketPanel.FigTypeAct.BackView = Vue arri\u00E8re RocketPanel.FigTypeAct.Figure3D = Figure 3D RocketPanel.FigTypeAct.Finished = Finitions en 3D ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Vue de cot\u00E9 +RocketPanel.FigTypeAct.SideView = Vue de cot\u00E9 RocketPanel.FigTypeAct.Unfinished = Sans finissions 3D -RocketPanel.FigTypeAct.ttip.Backview = Vue arri\u00E8re -RocketPanel.FigTypeAct.ttip.Sideview = Vue de cot\u00E9 +RocketPanel.FigTypeAct.ttip.BackView = Vue arri\u00E8re +RocketPanel.FigTypeAct.ttip.SideView = Vue de cot\u00E9 RocketPanel.FigViewAct.2D = Vue 2D RocketPanel.FigViewAct.3D = Vue 3D RocketPanel.FigViewAct.ttip.2D = Vue 2D diff --git a/core/resources/l10n/messages_it.properties b/core/resources/l10n/messages_it.properties index 9846743660..99c664f0d5 100644 --- a/core/resources/l10n/messages_it.properties +++ b/core/resources/l10n/messages_it.properties @@ -44,10 +44,10 @@ RocketActions.MoveDownAct.Movedown = Muove giu' RocketActions.MoveDownAct.ttip.Movedown = Muovi questo componente verso il basso. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Vista laterale -RocketPanel.FigTypeAct.ttip.Sideview = Vista laterale -RocketPanel.FigTypeAct.Backview = Vista da sotto -RocketPanel.FigTypeAct.ttip.Backview = Vista da dietro +RocketPanel.FigTypeAct.SideView = Vista laterale +RocketPanel.FigTypeAct.ttip.SideView = Vista laterale +RocketPanel.FigTypeAct.BackView = Vista da sotto +RocketPanel.FigTypeAct.ttip.BackView = Vista da dietro RocketPanel.FigViewAct.2D = 2D View RocketPanel.FigViewAct.ttip.2D = 2D View RocketPanel.FigViewAct.3D = 3D View diff --git a/core/resources/l10n/messages_ja.properties b/core/resources/l10n/messages_ja.properties index 9ac720d0ed..1b1133f775 100644 --- a/core/resources/l10n/messages_ja.properties +++ b/core/resources/l10n/messages_ja.properties @@ -40,10 +40,10 @@ RocketActions.MoveDownAct.Movedown = \u4E0B\u306B\u79FB\u52D5 RocketActions.MoveDownAct.ttip.Movedown = \u90E8\u54C1\u3092\u4E0B\u306E\u968E\u5C64\u306B\u79FB\u52D5 ! RocketPanel -RocketPanel.FigTypeAct.Sideview = \u5074\u9762\u56F3 -RocketPanel.FigTypeAct.ttip.Sideview = \u5074\u9762\u56F3 -RocketPanel.FigTypeAct.Backview = \u80CC\u9762\u56F3 -RocketPanel.FigTypeAct.ttip.Backview = \u5F8C\u308D\u304B\u3089\u306E\u56F3 +RocketPanel.FigTypeAct.SideView = \u5074\u9762\u56F3 +RocketPanel.FigTypeAct.ttip.SideView = \u5074\u9762\u56F3 +RocketPanel.FigTypeAct.BackView = \u80CC\u9762\u56F3 +RocketPanel.FigTypeAct.ttip.BackView = \u5F8C\u308D\u304B\u3089\u306E\u56F3 RocketPanel.FigViewAct.2D = 2D View RocketPanel.FigViewAct.ttip.2D = 2D View RocketPanel.FigViewAct.3D = 3D View diff --git a/core/resources/l10n/messages_pl.properties b/core/resources/l10n/messages_pl.properties index 783b36b413..ac5384fa13 100644 --- a/core/resources/l10n/messages_pl.properties +++ b/core/resources/l10n/messages_pl.properties @@ -44,10 +44,10 @@ RocketActions.MoveDownAct.ttip.Movedown = Przesu\u0144 wybran\u0105 cz\u0119\u015B\u0107 w dó\u0142. ! RocketPanel - RocketPanel.FigTypeAct.Sideview = Widok z boku - RocketPanel.FigTypeAct.ttip.Sideview = Widok z boku - RocketPanel.FigTypeAct.Backview = Widok z ty\u0142u - RocketPanel.FigTypeAct.ttip.Backview = Widok tylny + RocketPanel.FigTypeAct.SideView = Widok z boku + RocketPanel.FigTypeAct.ttip.SideView = Widok z boku + RocketPanel.FigTypeAct.BackView = Widok z ty\u0142u + RocketPanel.FigTypeAct.ttip.BackView = Widok tylny RocketPanel.FigViewAct.2D = Widok 2D RocketPanel.FigViewAct.ttip.2D = Widok 2D RocketPanel.FigViewAct.3D = Widok 3D diff --git a/core/resources/l10n/messages_pt.properties b/core/resources/l10n/messages_pt.properties index fa5b1aead4..33b1c387a3 100644 --- a/core/resources/l10n/messages_pt.properties +++ b/core/resources/l10n/messages_pt.properties @@ -804,6 +804,7 @@ RocketCompCfg.but.Setforall = Definir para todos RocketCompCfg.but.ttip.Setforall = Definir este acabamento para todos os componentes do foguete. RocketCompCfg.checkbox.Endcapped = Fim tampado RocketCompCfg.checkbox.Overridecenterofgrav = Modificar o centro de gravidade: +RocketCompCfg.checkbox.Overridecoeffofdrag = Modificar o coeficiente de arrasto: RocketCompCfg.checkbox.Overridemass = Modificar massa: RocketCompCfg.checkbox.OverridemassandCG = Modificar a massa e o CG de todos os subcomponentes RocketCompCfg.checkbox.Usedefaultcolor = Use a cor padr\u00e3o @@ -867,14 +868,14 @@ RocketInfo.massWithoutMotors = Massa sem motores RocketInfo.stabText = Estabilidade: RocketInfo.velocityValue = N/D -RocketPanel.FigTypeAct.Backview = Vista traseira +RocketPanel.FigTypeAct.BackView = Vista traseira RocketPanel.FigTypeAct.Figure3D = Figura 3D RocketPanel.FigTypeAct.Finished = 3D Acabado # RocketPanel -RocketPanel.FigTypeAct.Sideview = Vista lateral +RocketPanel.FigTypeAct.SideView = Vista lateral RocketPanel.FigTypeAct.Unfinished = 3D Inacabado -RocketPanel.FigTypeAct.ttip.Backview = Vista traseira -RocketPanel.FigTypeAct.ttip.Sideview = Vista lateral +RocketPanel.FigTypeAct.ttip.BackView = Vista traseira +RocketPanel.FigTypeAct.ttip.SideView = Vista lateral RocketPanel.FigViewAct.2D = Vista 2D RocketPanel.FigViewAct.3D = Vista 3D RocketPanel.FigViewAct.ttip.2D = Vista 2D diff --git a/core/resources/l10n/messages_ru.properties b/core/resources/l10n/messages_ru.properties index 224e266913..9ae7b59705 100644 --- a/core/resources/l10n/messages_ru.properties +++ b/core/resources/l10n/messages_ru.properties @@ -44,8 +44,8 @@ RocketActions.MoveDownAct.Movedown = \u041f\u0435\u0440\u0435\u043c\u0435\u0441\ RocketActions.MoveDownAct.ttip.Movedown = \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u043d\u0438\u0437. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = \u0412\u0438\u0434 \u0441\u0431\u043e\u043a\u0443 -RocketPanel.FigTypeAct.Backview = \u0412\u0438\u0434 \u0441\u0437\u0430\u0434\u0438 +RocketPanel.FigTypeAct.SideView = \u0412\u0438\u0434 \u0441\u0431\u043e\u043a\u0443 +RocketPanel.FigTypeAct.BackView = \u0412\u0438\u0434 \u0441\u0437\u0430\u0434\u0438 RocketPanel.FigTypeAct.Figure3D = 3D \u0441\u0445\u0435\u043c\u0430 RocketPanel.FigTypeAct.Finished = 3D \u043e\u0442\u0434\u0435\u043b\u043a\u0430 RocketPanel.FigTypeAct.Unfinished = 3D \u0447\u0435\u0440\u043d\u043e\u0432\u0430\u044f diff --git a/core/resources/l10n/messages_tr.properties b/core/resources/l10n/messages_tr.properties index e6ff1e8d63..309e09e9e4 100644 --- a/core/resources/l10n/messages_tr.properties +++ b/core/resources/l10n/messages_tr.properties @@ -50,8 +50,8 @@ RocketActions.MoveDownAct.ttip.Movedown = A\u015fa\u011f\u0131ya do\u011fru bu p ettir. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Yandan G\u00f6r\u00fcn\u00fc\u015f -RocketPanel.FigTypeAct.Backview = Arkadan G\u00f6r\u00fcn\u00fc\u015f +RocketPanel.FigTypeAct.SideView = Yandan G\u00f6r\u00fcn\u00fc\u015f +RocketPanel.FigTypeAct.BackView = Arkadan G\u00f6r\u00fcn\u00fc\u015f RocketPanel.FigTypeAct.Figure3D = 3D Resimlendirme RocketPanel.FigTypeAct.Finished = 3D Bitmi\u015f RocketPanel.FigTypeAct.Unfinished = 3D Bitmemi\u015f diff --git a/core/resources/l10n/messages_uk_UA.properties b/core/resources/l10n/messages_uk_UA.properties index a1ca5c98bc..05fbebbc7f 100644 --- a/core/resources/l10n/messages_uk_UA.properties +++ b/core/resources/l10n/messages_uk_UA.properties @@ -46,8 +46,8 @@ RocketActions.MoveDownAct.Movedown = Move down RocketActions.MoveDownAct.ttip.Movedown = Move this component downwards. ! RocketPanel -RocketPanel.FigTypeAct.Sideview = Side view -RocketPanel.FigTypeAct.Backview = Back view +RocketPanel.FigTypeAct.SideView = Side view +RocketPanel.FigTypeAct.BackView = Back view RocketPanel.FigTypeAct.Figure3D = 3D Figure RocketPanel.FigTypeAct.Finished = 3D Finished RocketPanel.FigTypeAct.Unfinished = 3D Unfinished @@ -799,6 +799,7 @@ RocketCompCfg.but.ttip.Setforall = Set this finish for all components of the roc RocketCompCfg.lbl.Overridemassorcenter = Override the mass or center of gravity of the RocketCompCfg.checkbox.Overridemass = Override mass: RocketCompCfg.checkbox.Overridecenterofgrav = Override center of gravity: +RocketCompCfg.checkbox.Overridecoeffofdrag = Override coefficient of drag: RocketCompCfg.checkbox.OverridemassandCG = Override mass and CG of all subcomponents RocketCompCfg.lbl.longB1 = The overridden mass does not include motors.
RocketCompCfg.lbl.longB2 = The center of gravity is measured from the front end of the diff --git a/core/resources/l10n/messages_zh_CN.properties b/core/resources/l10n/messages_zh_CN.properties index 28ad7cd476..3f82873dc2 100644 --- a/core/resources/l10n/messages_zh_CN.properties +++ b/core/resources/l10n/messages_zh_CN.properties @@ -1,2044 +1,1960 @@ -# -# Simplified Chinese translation file -# -# Should you need to add new logical keys here is the proposed method -# -# className.ComponentType.componentName -# -# -# Text tokens within braces should not be translated, e.g. -# "The file '{filename}' exists." -# They are pieces that are inserted dynamically. -# - - -! Set to the name of the current translation file (used for debugging purposes) -debug.currentFile = messages_zh_CN.properties - -! RocketActions -RocketActions.checkbox.Donotaskmeagain = \u4e0d\u518d\u63d0\u793a -RocketActions.lbl.Youcanchangedefop = \u4f60\u53ef\u4ee5\u4fee\u6539\u7f3a\u7701\u8bbe\u7f6e -RocketActions.showConfirmDialog.lbl1 = \u5220\u9664\u9009\u5b9a\u4eff\u771f? -RocketActions.showConfirmDialog.lbl2 = \u8be5\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500 -RocketActions.showConfirmDialog.title = \u5220\u9664\u4eff\u771f -RocketActions.DelCompAct.Delete = \u5220\u9664 -RocketActions.DelCompAct.ttip.Delete = \u5220\u9664\u9009\u5b9a\u7ec4\u4ef6 -RocketActions.DelSimuAct.Delete = \u5220\u9664 -RocketActions.DelSimuAct.ttip.Delete = \u5220\u9664\u9009\u5b9a\u4eff\u771f -RocketActions.DelAct.Delete = \u5220\u9664 -RocketActions.DelAct.ttip.Delete = \u5220\u9664\u9009\u5b9a\u90e8\u4ef6\u6216\u4eff\u771f -RocketActions.CutAction.Cut = \u526a\u5207 -RocketActions.CutAction.ttip.Cut = \u526a\u5207\u7ec4\u4ef6\u6216\u4eff\u771f\u5230\u526a\u5207\u677f\uff0c\u5e76\u4ece\u8bbe\u8ba1\u4e2d\u79fb\u9664 -RocketActions.CopyAct.Copy = \u590d\u5236 -RocketActions.CopyAct.ttip.Copy = \u590d\u5236\u7ec4\u4ef6(\u53ca\u5b50\u7ec4\u4ef6)\u5230\u526a\u8d34\u677f -RocketActions.PasteAct.Paste = \u7c98\u8d34 -RocketActions.PasteAct.ttip.Paste = \u5c06\u526a\u8d34\u677f\u91cc\u7684\u90e8\u4ef6\u6216\u4eff\u771f\u7c98\u8d34\u5230\u8be5\u8bbe\u8ba1\u4e2d -RocketActions.EditAct.Edit = \u7f16\u8f91 -RocketActions.EditAct.ttip.Edit = \u7f16\u8f91\u9009\u4e2d\u7ec4\u4ef6 -RocketActions.NewStageAct.Newstage = \u65b0\u5efa\u4e00\u7ea7 -RocketActions.NewStageAct.ttip.Newstage = \u5728\u8bbe\u8ba1\u4e2d\u65b0\u5efa\u4e00\u7ea7 -RocketActions.ActBoosterstage = \u52a9\u63a8\u7ea7 -RocketActions.MoveUpAct.Moveup = \u5411\u4e0a\u79fb\u52a8 -RocketActions.MoveUpAct.ttip.Moveup = \u5411\u4e0a\u79fb\u52a8\u8be5\u90e8\u4ef6 -RocketActions.MoveDownAct.Movedown = \u5411\u4e0b\u79fb\u52a8 -RocketActions.MoveDownAct.ttip.Movedown = \u5411\u4e0b\u79fb\u52a8\u8be5\u90e8\u4ef6 - -! RocketPanel -RocketPanel.FigTypeAct.Sideview = \u4fa7\u89c6\u56fe -RocketPanel.FigTypeAct.Backview = \u540e\u89c6\u56fe -RocketPanel.FigTypeAct.Figure3D = \u4e09\u7ef4\u56fe -RocketPanel.FigTypeAct.Finished = \u4e09\u7ef4\u7cbe\u7ec6\u56fe -RocketPanel.FigTypeAct.Unfinished = \u4e09\u7ef4\u8349\u56fe - - -RocketPanel.lbl.Flightcfg = \u98de\u884c\u914d\u7f6e: -RocketPanel.lbl.infoMessage = \u5355\u51fb\u9009\u62e9    Shift+\u5355\u51fb\u9009\u62e9\u5176\u4ed6    \u53cc\u51fb\u7f16\u8f91    \u5355\u51fb+\u62d6\u52a8\u79fb\u52a8\u7ec4\u4ef6 -RocketPanel.lbl.ViewType = \u89c6\u56fe\u7c7b\u578b: - -! BasicFrame -BasicFrame.tab.Rocketdesign = \u706b\u7bad\u8bbe\u8ba1 -BasicFrame.tab.Flightconfig = \u7ec4\u4ef6\u8bbe\u7f6e -BasicFrame.tab.Flightsim = \u98de\u884c\u4eff\u771f -BasicFrame.title.Addnewcomp = \u6dfb\u52a0\u65b0\u7ec4\u4ef6 -BasicFrame.dlg.lbl1 = \u8bbe\u8ba1\u7a3f ' -BasicFrame.dlg.lbl2 = ' \u5c1a\u672a\u4fdd\u5b58 -BasicFrame.dlg.lbl3 = \u662f\u5426\u4fdd\u5b58? -BasicFrame.dlg.title = \u672a\u4fdd\u5b58 -BasicFrame.StageName.Sustainer = \u4e3b\u53d1\u52a8\u673a -BasicFrame.WarningDialog.txt1 = \u6253\u5f00\u8bbe\u8ba1\u7a3f\u65f6\u53d1\u751f\u4ee5\u4e0b\u95ee\u9898 -BasicFrame.WarningDialog.txt2 = \u90e8\u5206\u8bbe\u8ba1\u5185\u5bb9\u6ca1\u6709\u88ab\u6b63\u786e\u8f7d\u5165 -BasicFrame.WarningDialog.title = \u6253\u5f00\u6587\u4ef6\u65f6\u8b66\u544a - - -! General error messages used in multiple contexts -error.fileExists.title = \u6587\u4ef6\u5df2\u5b58\u5728 -error.fileExists.desc = \u6587\u4ef6 '{filename}' \u5df2\u5b58\u5728\uff0c\u8986\u76d6? - -error.writing.title = \u6587\u4ef6\u5199\u5165\u5931\u8d25 -error.writing.desc = \u4fdd\u5b58\u6587\u4ef6\u65f6\u53d1\u751f\u9519\u8bef: -Configuration.lbl.override = \u8be5\u53c2\u6570\u53ef\u5728\u4e0d\u540c\u7684\u8bbe\u7f6e\u6587\u4ef6\u4e2d\u88ab\u8986\u5199. - - -! Labels used in buttons of dialog windows -# TODO: Rename these to "btn.xxx" -button.ok = \u786e\u5b9a -button.cancel = \u53d6\u6d88 -button.close = \u5173\u95ed - -! Common labels used in buttons of dialog windows -dlg.but.ok = \u786e\u5b9a -dlg.but.cancel = \u53d6\u6d88 -dlg.but.close = \u5173\u95ed - -! General file type names -filetypes.pdf = PDF\u6587\u4ef6(*.pdf) -BasicFrame.SimpleFileFilter1 = \u652f\u6301\u7684\u706b\u7bad\u8bbe\u8ba1\u7a3f(*.ork; *.rkt) -BasicFrame.SimpleFileFilter2 = OpenRocket\u8bbe\u8ba1\u7a3f(*.ork) -BasicFrame.SimpleFileFilter3 = RockSim\u8bbe\u8ba1\u7a3f(*.rkt) -BasicFrame.SimpleFileFilter4 = OpenRocket\u914d\u7f6e(*.orc) -filetypes.images = \u56fe\u50cf\u6587\u4ef6 - - -! About Dialog -AboutDialog.lbl.version = \u7248\u672c -! The texts below provide additional credits for the translation maintainer -! - In AboutDialog.lbl.translation replace "English" with the current language. -! - AboutDialog.lbl.translator is the translator / group name (may be empty) -! - AboutDialog.lbl.translatorWebsite is a URL to the translator / group (may be empty) -! - AboutDialog.lbl.translatorIcon is the file name of an icon under pix/translators/ (may be empty) -AboutDialog.lbl.translation = \u7b80\u4f53\u4e2d\u6587\u7ffb\u8bd1: -AboutDialog.lbl.translator = Yilun Zhu -AboutDialog.lbl.translatorWebsite = http://sa.kechuang.org/ -AboutDialog.lbl.translatorIcon = logoKCSASimplifiedChinese.png - - -! Print dialog -PrintDialog.title = \u6253\u5370/\u5bfc\u51fa -PrintDialog.but.previewAndPrint = \u9884\u89c8 & \u6253\u5370 -PrintDialog.checkbox.showByStage = \u6309\u7ea7\u663e\u793a -PrintDialog.lbl.selectElements = \u9009\u62e9\u4ee5\u4e0b\u5143\u7d20: -printdlg.but.saveaspdf = \u4fdd\u5b58\u4e3aPDF -printdlg.but.preview = \u9884\u89c8 -printdlg.but.settings = \u8bbe\u7f6e -PrintDialog.error.preview.title = \u65e0\u6cd5\u6253\u5f00\u9884\u89c8 -PrintDialog.error.preview.desc1 = \u65e0\u6cd5\u6253\u5f00PDF\u9884\u89c8 -PrintDialog.error.preview.desc2 = \u8bf7\u6539\u7528\"\u4fdd\u5b58\u4e3aPDF\"\u9009\u9879 - -!PrintSettingsDialog -PrintSettingsDialog.title = \u6253\u5370\u8bbe\u7f6e -PrintSettingsDialog.lbl.Templatefillcolor = \u6a21\u677f\u586b\u5145\u8272: -PrintSettingsDialog.lbl.Templatebordercolor = \u6a21\u677f\u80cc\u666f\u8272: -PrintSettingsDialog.lbl.Papersize = \u7eb8\u5f20\u5927\u5c0f: -PrintSettingsDialog.lbl.Paperorientation = \u6253\u5370\u65b9\u5411: -PrintSettingsDialog.but.Reset = \u91cd\u7f6e -PrintSettingsDialog.but.Close = \u5173\u95ed - - -! Bug Report dialog -bugreport.dlg.title = \u9519\u8bef\u62a5\u544a -bugreport.dlg.but.Sendbugreport = \u53d1\u9001\u9519\u8bef\u62a5\u544a -bugreport.dlg.but.Sendbugreport.Ttip = \u81ea\u52a8\u53d1\u9001\u9519\u8bef\u62a5\u544a\u7ed9OpenRocket\u5f00\u53d1\u7ec4 -bugreport.dlg.successmsg1 = \u9519\u8bef\u62a5\u544a\u5df2\u53d1\u9001 -bugreport.dlg.successmsg2 = \u611f\u8c22\u60a8\u5bf9OpenRocket\u7684\u652f\u6301! -bugreport.dlg.successmsg3 = \u9519\u8bef\u62a5\u544a\u5df2\u53d1\u9001 -bugreport.dlg.connectedInternet = \u5982\u679c\u8fde\u63a5\u5230\u4e92\u8054\u7f51,\u70b9\u51fb\u53d1\u9001\u9519\u8bef\u62a5\u544a\u5373\u53ef -bugreport.dlg.otherwise = \u5426\u5219\u8bf7\u5c06\u9519\u8bef\u62a5\u544a\u53d1\u9001\u5230: -bugreport.lbl.Theinformation = \u4ee5\u4e0a\u4fe1\u606f\u53ef\u80fd\u4f1a\u88ab\u5199\u5165\u9519\u8bef\u62a5\u544a\u4e2d. \u8bf7\u786e\u8ba4\u6ca1\u6709\u5305\u542b\u4efb\u4f55\u60a8\u4e0d\u613f\u610f\u516c\u5f00\u7684\u654f\u611f\u4fe1\u606f -bugreport.dlg.failedmsg1 = OpenRocket\u65e0\u6cd5\u53d1\u9001\u9519\u8bef\u62a5\u544a: -bugreport.dlg.failedmsg2 = \u8bf7\u624b\u52a8\u53d1\u9001\u9519\u8bef\u62a5\u544a\u81f3 -bugreport.dlg.failedmsg3 = \u53d1\u9001\u65f6\u53d1\u751f\u9519\u8bef -bugreport.reportDialog.txt = \u60a8\u53ef\u4ee5\u586b\u5199\u5e76\u53d1\u9001\u4ee5\u4e0b\u8868\u683c\u5411OpenRocket\u62a5\u544a\u9519\u8bef
\u60a8\u4e5f\u53ef\u4ee5\u5728OpenRocket\u7f51\u7ad9\u62a5\u544a\u9519\u8bef\u5e76\u9644\u4e0a\u76f8\u5173\u6587\u4ef6 -bugreport.reportDialog.txt2 = \u8bf7\u7b80\u8ff0\u5f53\u5f02\u5e38\u53d1\u751f\u7684\u65f6\u5019\u60a8\u6b63\u5728\u505a\u4ec0\u4e48 -bugreport.dlg.provideDescription = \u8bf7\u9996\u5148\u63d0\u4f9b\u9519\u8bef\u63cf\u8ff0. -bugreport.dlg.provideDescription.title = \u7f3a\u5c11\u9519\u8bef\u63cf\u8ff0 - - -! Debug log dialog -debuglogdlg.but.clear = \u6e05\u7a7a -debuglogdlg.OpenRocketdebuglog = OpenRocket \u8c03\u8bd5\u65e5\u5fd7 -debuglogdlg.Displayloglines = \u663e\u793a\u65e5\u5fd7\u884c: -debuglogdlg.Follow = \u8ddf\u968f -debuglogdlg.col.Time = \u65f6\u95f4 -debuglogdlg.col.Level = \u7ea7\u522b -debuglogdlg.col.Location = \u4f4d\u7f6e -debuglogdlg.col.Message = \u6d88\u606f -debuglogdlg.lbl.Loglinenbr = \u65e5\u5fd7\u884c\u53f7: -debuglogdlg.lbl.Time = \u65f6\u95f4: -debuglogdlg.lbl.Level = \u7ea7\u522b: -debuglogdlg.lbl.Location = \u4f4d\u7f6e: -debuglogdlg.lbl.Logmessage = \u8c03\u8bd5\u4fe1\u606f: -debuglogdlg.lbl.Stacktrace = \u5806\u6808\u8ddf\u8e2a: - - -! MotorChooserDialog -MotorChooserDialog.title = \u9009\u62e9\u706b\u7bad\u53d1\u52a8\u673a - -! Edit Motor configuration dialog -edtmotorconfdlg.col.configuration = \u914d\u7f6e -edtmotorconfdlg.but.Removeconfiguration = \u79fb\u9664 -edtmotorconfdlg.but.Renameconfiguration = \u91cd\u547d\u540d -edtmotorconfdlg.but.Newconfiguration = \u65b0\u5efa -edtmotorconfdlg.but.Copyconfiguration = \u590d\u5236 -edtmotorconfdlg.title.Editmotorconf = \u7f16\u8f91\u98de\u884c\u914d\u7f6e -edtmotorconfdlg.title.Renameconf = \u91cd\u547d\u540d\u98de\u884c\u914d\u7f6e -edtmotorconfdlg.title.Selectdeploymentconf = \u9009\u62e9\u90e8\u7f72\u914d\u7f6e -edtmotorconfdlg.title.Selectignitionconf = \u9009\u62e9\u70b9\u706b\u914d\u7f6e -edtmotorconfdlg.title.Selectseparationconf = \u9009\u62e9\u5206\u79bb\u914d\u7f6e -edtmotorconfdlg.lbl.Selectedconf = \u9009\u62e9\u98de\u884c\u914d\u7f6e: -edtmotorconfdlg.selectcomp = \u6307\u5b9a\u53d1\u52a8\u673a\u5ea7\u7ec4\u4ef6: -edtmotorconfdlg.lbl.Configname = \u914d\u7f6e\u540d\u79f0: -edtmotorconfdlg.lbl.Motortab = \u53d1\u52a8\u673a -edtmotorconfdlg.lbl.Recoverytab = \u56de\u6536 -edtmotorconfdlg.lbl.Stagetab = \u7ea7 -edtmotorconfdlg.tbl.None = \u65e0 -edtmotorconfdlg.tbl.Motorheader = \u53d1\u52a8\u673a -edtmotorconfdlg.tbl.Mountheader = \u53d1\u52a8\u673a\u5ea7 -edtmotorconfdlg.tbl.Ignitionheader = \u70b9\u706b -edtmotorconfdlg.but.Resetdeployment = \u91cd\u7f6e\u5230\u9ed8\u8ba4\u503c -edtmotorconfdlg.but.Selectdeployment = \u9009\u62e9\u90e8\u7f72 -edtmotorconfdlg.tbl.Recoveryheader = \u56de\u6536\u8bbe\u5907 -edtmotorconfdlg.tbl.Deploymentheader = \u90e8\u7f72 -edtmotorconfdlg.but.Resetseparation = \u91cd\u7f6e\u5230\u9ed8\u8ba4\u503c -edtmotorconfdlg.but.Selectseparation = \u9009\u62e9\u8131\u79bb -edtmotorconfdlg.tbl.Stageheader = \u7ea7 -edtmotorconfdlg.tbl.Separationheader = \u5206\u79bb - -! Rename FlightConfiguration Dialog -RenameConfigDialog.title = \u91cd\u547d\u540d\u914d\u7f6e -RenameConfigDialog.lbl.name = \u98de\u884c\u914d\u7f6e\u540d\u79f0: -RenameConfigDialog.but.reset = \u91cd\u7f6e\u5230\u9ed8\u8ba4\u503c - -! Example design dialog -exdesigndlg.but.open = \u6253\u5f00 -exdesigndlg.lbl.Selectexample = \u9009\u62e9\u8303\u4f8b\u8bbe\u8ba1\u7a3f: -exdesigndlg.lbl.Openexampledesign = \u6253\u5f00\u8303\u4f8b\u8bbe\u8ba1\u7a3f -exdesigndlg.lbl.Exampledesignsnotfound = \u8303\u4f8b\u8bbe\u8ba1\u7a3f\u672a\u627e\u5230 -exdesigndlg.lbl.Examplesnotfound = \u8303\u4f8b\u672a\u627e\u5230 - - -! Material edit panel -matedtpan.but.new = \u65b0\u5efa -matedtpan.but.edit = \u7f16\u8f91 -matedtpan.but.delete = \u5220\u9664 -matedtpan.but.revertall = \u6062\u590d\u6240\u6709 -matedtpan.col.Material = \u6750\u6599 -matedtpan.col.Type = \u7c7b\u578b -matedtpan.col.Density = \u5bc6\u5ea6 -matedtpan.col.but.ttip.New = \u65b0\u52a0\u4e00\u79cd\u65b0\u7684\u6750\u6599 -matedtpan.title.Addcustmaterial = \u65b0\u52a0\u81ea\u5b9a\u4e49\u6750\u6599 -matedtpan.but.ttip.edit = \u7f16\u8f91\u5df2\u5b58\u5728\u7684\u6750\u6599 -matedtpan.title.Editmaterial = \u7f16\u8f91\u6750\u6599\u53c2\u6570 -matedtpan.title2.Editmaterial = \u65e0\u6cd5\u4fee\u6539\u5185\u5efa\u6750\u6599 -matedtpan.but.ttip.delete = \u5220\u9664\u81ea\u5b9a\u4e49\u6750\u6599 -matedtpan.but.ttip.revertall = \u5220\u9664\u6240\u6709\u81ea\u5b9a\u4e49\u6750\u6599 -matedtpan.title.Deletealluser-defined = \u5220\u9664\u6240\u6709\u81ea\u5b9a\u4e49\u6750\u6599? -matedtpan.title.Revertall = \u5168\u90e8\u590d\u539f? -matedtpan.lbl.edtmaterials = \u7f16\u8f91\u6750\u6599\u4e0d\u4f1a\u5f71\u54cd\u73b0\u6709\u7684\u706b\u7bad\u8bbe\u8ba1 - -!MaterialModel -MaterialModel.title.Material = \u6750\u6599 -MaterialModel.title.Defcustmat = \u8bbe\u7f6e\u81ea\u5b9a\u4e49\u6750\u6599 - - -! Preference dialog -pref.dlg.but.add = \u6dfb\u52a0 -pref.dlg.but.reset = \u91cd\u7f6e -pref.dlg.but.checknow = \u68c0\u67e5 -pref.dlg.but.openlast = \u5728\u542f\u52a8\u7684\u65f6\u5019\u6253\u5f00\u4e0a\u6b21\u8bbe\u8ba1 -pref.dlg.but.defaultmetric = \u7f3a\u7701\u516c\u5236 -pref.dlg.but.defaultimperial = \u7f3a\u7701\u82f1\u5236 -pref.dlg.title.Preferences = \u9996\u9009\u9879 -pref.dlg.tab.Units = \u5355\u4f4d\u5236 -pref.dlg.tab.Colors = \u663e\u793a: -pref.dlg.tab.Defaultunits = \u7f3a\u7701\u5355\u4f4d -pref.dlg.tab.Materials = \u6750\u6599 -pref.dlg.tab.Custommaterials = \u81ea\u5b9a\u4e49\u6750\u6599 -pref.dlg.tab.Options = \u9009\u9879 -pref.dlg.tab.Design = \u8bbe\u8ba1 -pref.dlg.tab.Simulation = \u4eff\u771f -pref.dlg.tab.Launch = \u53d1\u5c04 -pref.dlg.tab.Miscellaneousoptions = \u6742\u9879 -pref.dlg.lbl.RockSimWarning = \u4fdd\u5b58RockSim\u683c\u5f0f\u65f6\u663e\u793a\u8b66\u544a - -pref.dlg.tab.Graphics = \u56fe\u50cf -pref.dlg.lbl.DecalEditor = \u56fe\u50cf\u7f16\u8f91\u5668 -pref.dlg.opengl.lbl.title = \u4e09\u7ef4\u56fe\u50cf -pref.dlg.opengl.but.enableGL = \u542f\u7528\u4e09\u7ef4\u56fe\u50cf -pref.dlg.opengl.but.enableAA = \u542f\u7528\u53cd\u952f\u9f7f -pref.dlg.opengl.lbl.useFBO = \u79bb\u7ebf\u6e32\u67d3 - -#N/A -pref.dlg.ttip.DefaultMach1 = \u672c\u8bbe\u5b9a\u5c06\u5728\u4e0b\u6b21\u542f\u52a8OpenRocket\u65f6\u751f\u6548.
-#N/A - -pref.dlg.lbl.Positiontoinsert = \u65b0\u7ec4\u4ef6\u63d2\u5165\u4f4d\u7f6e: -pref.dlg.lbl.Confirmdeletion = \u786e\u8ba4\u5220\u9664\u4eff\u771f: -pref.dlg.checkbox.Runsimulations = \u5728\u67e5\u770b\u4eff\u771f\u9762\u677f\u65f6\u91cd\u65b0\u8fd0\u884c\u8fc7\u65f6\u7684\u4eff\u771f\u9879. -pref.dlg.checkbox.Updateestimates = \u5728\u8bbe\u8ba1\u7a97\u53e3\u66f4\u65b0\u9884\u4f30\u7684\u98de\u884c\u53c2\u6570. -pref.dlg.lbl.User-definedthrust = \u81ea\u5b9a\u4e49\u63a8\u529b\u66f2\u7ebf: -pref.dlg.lbl.Windspeed = \u98ce\u901f -pref.dlg.Allthrustcurvefiles = \u652f\u6301\u7684\u63a8\u529b\u66f2\u7ebf\u6587\u4ef6(*.eng; *.rse; *.zip; \u6587\u4ef6\u5939) -pref.dlg.RASPfiles = RASP\u53d1\u52a8\u673a\u6587\u4ef6(*.eng) -pref.dlg.RockSimfiles = RockSim\u53d1\u52a8\u673a\u6587\u4ef6(*.rse) -pref.dlg.ZIParchives = ZIP\u538b\u7f29\u5305(*.zip) -pref.dlg.checkbox.Checkupdates = \u542f\u52a8\u65f6\u68c0\u67e5\u66f4\u65b0 -pref.dlg.ttip.Checkupdatesnow = \u73b0\u5728\u68c0\u67e5\u8f6f\u4ef6\u66f4\u65b0 -pref.dlg.lbl.Selectprefunits = \u8bf7\u9009\u62e9\u5355\u4f4d\u5236: -pref.dlg.lbl.Rocketinfofontsize = \u706b\u7bad\u8bbe\u8ba1\u9762\u677f\u7684\u6587\u5b57\u5927\u5c0f: -pref.dlg.PrefFontSmall = \u5c0f -pref.dlg.PrefFontMedium = \u4e2d -pref.dlg.PrefFontLarge = \u5927 -pref.dlg.lbl.Rocketdimensions = \u706b\u7bad\u5c3a\u5bf8: -pref.dlg.lbl.Linedensity = \u7ebf\u6027\u5bc6\u5ea6: -pref.dlg.lbl.Motordimensions = \u53d1\u52a8\u673a\u5c3a\u5bf8: -pref.dlg.lbl.Surfacedensity = \u8868\u9762\u5bc6\u5ea6: -pref.dlg.lbl.Distance = \u8ddd\u79bb: -pref.dlg.lbl.Bulkdensity = \u4f53\u79ef\u5bc6\u5ea6: -pref.dlg.lbl.Velocity = \u901f\u7387: -pref.dlg.lbl.Surfaceroughness = \u8868\u9762\u7c97\u7cd9\u5ea6: -pref.dlg.lbl.Acceleration = \u52a0\u901f\u5ea6: -pref.dlg.lbl.Area = \u9762\u79ef: -pref.dlg.lbl.Mass = \u8d28\u91cf: -pref.dlg.lbl.Angle = \u89d2\u5ea6: -pref.dlg.lbl.Force = \u529b: -pref.dlg.lbl.Rollrate = \u89d2\u901f\u5ea6: -pref.dlg.lbl.Totalimpulse = \u603b\u51b2\u91cf: -pref.dlg.lbl.Temperature = \u6e29\u5ea6: -pref.dlg.lbl.Momentofinertia = \u8f6c\u52a8\u60ef\u91cf: -pref.dlg.lbl.Pressure = \u538b\u529b: -pref.dlg.lbl.Stability = \u7a33\u5b9a\u6027: -pref.dlg.lbl.FlightTime = \u98de\u884c\u65f6\u95f4: -pref.dlg.lbl.effect1 = \u66f4\u6539\u5c06\u5728\u4e0b\u6b21\u542f\u52a8\u7a97\u53e3\u540e\u751f\u6548 -pref.dlg.lbl.Checkingupdates = \u6b63\u5728\u68c0\u67e5\u66f4\u65b0... -pref.dlg.lbl.msg1 = \u8fde\u63a5\u670d\u52a1\u5668\u65f6\u53d1\u751f\u9519\u8bef -pref.dlg.lbl.msg2 = \u65e0\u6cd5\u83b7\u53d6\u66f4\u65b0\u4fe1\u606f -pref.dlg.lbl.msg3 = \u60a8\u4f7f\u7528\u7684\u5df2\u7ecf\u662fOpenRocket\u6700\u65b0\u7248\u672c -pref.dlg.lbl.msg4 = \u65e0\u53ef\u7528\u66f4\u65b0 -pref.dlg.PrefChoiseSelector1 = \u603b\u662f\u8be2\u95ee -pref.dlg.PrefChoiseSelector2 = \u63d2\u5728\u4e2d\u95f4 -pref.dlg.PrefChoiseSelector3 = \u63d2\u5728\u6700\u540e -pref.dlg.PrefBooleanSelector1 = \u5220\u9664 -pref.dlg.PrefBooleanSelector2 = \u786e\u8ba4 -pref.dlg.Add = \u6dfb\u52a0 -pref.dlg.DescriptionArea.Adddirectories = \u4efb\u4f55\u65b0\u6dfb\u52a0\u7684RASP\u53d1\u52a8\u673a\u6587\u4ef6(*.eng), RockSim\u53d1\u52a8\u673a\u6587\u4ef6(*.rse), ZIP\u538b\u7f29\u5305\u6216\u6587\u4ef6\u5939\u6240\u5305\u542b\u7684\u63a8\u529b\u66f2\u7ebf\u5c06\u5728\u4e0b\u6b21\u542f\u52a8OpenRocket\u65f6\u751f\u6548 - -PreferencesDialog.lbl.language = \u754c\u9762\u8bed\u8a00: -PreferencesDialog.languages.default = \u7cfb\u7edf\u9ed8\u8ba4 -PreferencesDialog.lbl.languageEffect = \u8bed\u8a00\u8bbe\u7f6e\u5c06\u5728OpenRocket\u91cd\u542f\u540e\u751f\u6548 - -generalprefs.lbl.language = \u754c\u9762\u8bed\u8a00 -generalprefs.languages.default = \u7cfb\u7edf\u9ed8\u8ba4 -generalprefs.lbl.languageEffect = \u65b0\u7684\u8bed\u8a00\u5c06\u5728\u4e0b\u6b21\u542f\u52a8OpenRocket\u65f6\u751f\u6548. - - -! Simulation edit dialog -simedtdlg.but.runsimulation = \u8fd0\u884c\u4eff\u771f -simedtdlg.but.resettodefault = \u6062\u590d\u9ed8\u8ba4 -simedtdlg.but.savedefault = \u8bbe\u4e3a\u9ed8\u8ba4 -simedtdlg.but.add = \u6dfb\u52a0 -simedtdlg.but.remove = \u79fb\u9664 -simedtdlg.title.Editsim = \u7f16\u8f91\u4eff\u771f -simedtdlg.lbl.Simname = \u4eff\u771f\u540d\u79f0: -simedtdlg.tab.Launchcond = \u53d1\u5c04\u6761\u4ef6 -simedtdlg.tab.Simopt = \u6a21\u62df\u9009\u9879 -simedtdlg.tab.Plotdata = \u6570\u636e\u7ed8\u56fe -simedtdlg.tab.CustomExpressions = \u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f -simedtdlg.tab.Exportdata = \u8f93\u51fa\u6570\u636e -simedtdlg.lbl.Flightcfg = \u98de\u884c\u914d\u7f6e: -simedtdlg.lbl.ttip.Flightcfg = \u9009\u62e9\u8981\u4f7f\u7528\u7684\u98de\u884c\u914d\u7f6e. -simedtdlg.combo.ttip.Flightcfg = \u9009\u62e9\u8981\u4f7f\u7528\u7684\u98de\u884c\u914d\u7f6e. -simedtdlg.lbl.Wind = \u98ce\u573a\u6761\u4ef6 -simedtdlg.lbl.Averwindspeed = \u5e73\u5747\u98ce\u901f: -simedtdlg.lbl.ttip.Averwindspeed = \u76f8\u5bf9\u4e8e\u5730\u9762\u7684\u5e73\u5747\u98ce\u901f -simedtdlg.lbl.Stddeviation = \u6807\u51c6\u5dee: -simedtdlg.lbl.Winddirection = \u98ce\u5411: -simedtdlg.lbl.ttip.Winddirection = \u98ce\u5411, 0-360\u5ea6.
0 \u662f\u5317\u98ce,
90 \u662f\u4e1c\u98ce -simedtdlg.lbl.ttip.Stddeviation = \u98ce\u901f\u7684\u6807\u51c6\u504f\u5dee.
\u98ce\u901f\u572895%\u7684\u65f6\u95f4\u5185\u5e94\u5904\u4e8e\u4e24\u500d\u7684\u6807\u51c6\u5dee\u4ee5\u5185. -simedtdlg.lbl.Turbulenceintensity = \u6e4d\u6d41\u5f3a\u5ea6: -simedtdlg.lbl.ttip.Turbulenceintensity1 = \u6e4d\u6d41\u5f3a\u5ea6\u8fd1\u4f3c\u4e3a\u6807\u51c6\u5dee\u9664\u4ee5\u5e73\u5747\u98ce\u901f.
-simedtdlg.lbl.ttip.Turbulenceintensity2 = \u5178\u578b\u53d6\u503c\u8303\u56f4\u662f\u4ece -simedtdlg.lbl.ttip.Turbulenceintensity3 = \u5230 -simedtdlg.border.Atmoscond = \u5927\u6c14\u6761\u4ef6 -simedtdlg.checkbox.InterStdAtmosphere = \u4f7f\u7528\u56fd\u9645\u6807\u51c6\u5927\u6c14\u6a21\u578b -simedtdlg.checkbox.ttip.InterStdAtmosphere1 = \u9009\u62e9\u4f7f\u7528\u56fd\u9645\u6807\u51c6\u5927\u6c14\u6a21\u578b.
\u8be5\u6a21\u578b\u7684\u5927\u6c14\u6e29\u5ea6\u4e3a -simedtdlg.checkbox.ttip.InterStdAtmosphere2 = , \u5927\u6c14\u538b\u4e3a -simedtdlg.checkbox.ttip.InterStdAtmosphere3 = \u4e14\u5747\u4e3a\u6d77\u5e73\u9762\u503c. -simedtdlg.lbl.Temperature = \u6e29\u5ea6: -simedtdlg.lbl.ttip.Temperature = \u53d1\u5c04\u5730\u70b9\u7684\u6e29\u5ea6. -simedtdlg.lbl.Pressure = \u538b\u529b: -simedtdlg.lbl.ttip.Pressure = \u53d1\u5c04\u5730\u70b9\u7684\u5927\u6c14\u538b\u529b. -simedtdlg.lbl.Launchsite = \u53d1\u5c04\u5730\u70b9 -simedtdlg.lbl.Latitude = \u7eac\u5ea6: -simedtdlg.lbl.ttip.Latitude = \u53d1\u5c04\u5730\u70b9\u7684\u7eac\u5ea6\u4f1a\u5f71\u54cd\u5730\u7403\u7684\u5f15\u529b.
\u5317\u534a\u7403\u4e3a\u6b63\u503c,\u5357\u534a\u7403\u4e3a\u8d1f\u503c. - -simedtdlg.lbl.Longitude = \u7ecf\u5ea6: -simedtdlg.lbl.ttip.Longitude = \u9700\u8981\u5929\u6c14\u9884\u62a5\u4ee5\u53ca\u9ad8\u7a0b\u6a21\u578b. - -simedtdlg.lbl.Altitude = \u6d77\u62d4\u9ad8\u5ea6: -simedtdlg.lbl.ttip.Altitude = \u53d1\u5c04\u9ad8\u5ea6\u57fa\u4e8e\u6d77\u5e73\u9762.
\u8fd9\u4f1a\u5f71\u54cd\u5927\u6c14\u6a21\u578b\u4e2d\u706b\u7bad\u7684\u4f4d\u7f6e. -simedtdlg.border.Launchrod = \u53d1\u5c04\u67b6 -simedtdlg.lbl.Length = \u957f\u5ea6: -simedtdlg.lbl.ttip.Length = \u53d1\u5c04\u67b6\u7684\u603b\u957f\u5ea6. -simedtdlg.checkbox.Intowind = \u603b\u662f\u987a\u98ce\u6216\u9006\u98ce\u53d1\u5c04 -simedtdlg.checkbox.ttip.Intowind1 = \u52fe\u9009\u540e\u53d1\u5c04\u6746\u5c06\u4f1a\u6307\u5411\u98ce\u5411.
-simedtdlg.checkbox.ttip.Intowind2 = 0\u89d2\u5ea6\u53d1\u5c04\u5373\u53d1\u5c04\u6746\u5782\u76f4\u5411\u4e0a.
-simedtdlg.checkbox.ttip.Intowind3 = \u8d1f\u53d1\u5c04\u6746\u89d2\u5ea6\u5c06\u987a\u98ce\u53d1\u5c04.
\u53d6\u6d88\u52fe\u9009\u672c\u9879\u540e\u4f60\u53ef\u4ee5\u6307\u5b9a\u4efb\u610f\u53d1\u5c04\u6746\u89d2\u5ea6. -simedtdlg.checkbox.ttip.Intowind4 = \u53d6\u6d88\u52fe\u9009\u672c\u9879\u540e\u4f60\u53ef\u4ee5\u6307\u5b9a\u4efb\u610f\u53d1\u5c04\u6746\u89d2\u5ea6. -simedtdlg.lbl.Angle = \u89d2\u5ea6: -simedtdlg.lbl.ttip.Angle = \u53d1\u5c04\u67b6\u76f8\u5bf9\u4e8e\u5782\u76f4\u65b9\u5411\u7684\u89d2\u5ea6.
\u6b63\u89d2\u5ea6\u6307\u5411\u8fce\u98ce\u9762. -simedtdlg.lbl.Direction = \u65b9\u5411: -simedtdlg.lbl.ttip.Direction1 = \u53d1\u5c04\u67b6\u76f8\u5bf9\u4e8e\u98ce\u7684\u65b9\u5411.
-simedtdlg.lbl.ttip.Direction2 = - -simedtdlg.lbl.ttip.Direction3 = 0 = \u5317 -simedtdlg.border.Simopt = \u4eff\u771f\u9009\u9879 -simedtdlg.lbl.Calcmethod = \u8ba1\u7b97\u65b9\u6cd5: -simedtdlg.lbl.ttip.Calcmethod = Extended Barrowman\u7b97\u6cd5\u662f\u901a\u8fc7
\u6269\u5c55Barrowman\u65b9\u7a0b\u5f0f\u6765\u9002\u5e94\u66f4\u591a\u7ec4\u4ef6\u7684\u6c14\u52a8\u529b\u8ba1\u7b97. -simedtdlg.lbl.ExtBarrowman = Extended Barrowman -simedtdlg.lbl.Simmethod = \u4eff\u771f\u65b9\u6cd5: -simedtdlg.lbl.ttip.Simmethod1 = 6\u81ea\u7531\u5ea6\u6a21\u62df\u53ef\u4ee5\u6a21\u62df\u706b\u7bad\u7684\u5404\u79cd\u98de\u884c\u60c5\u51b5.
-simedtdlg.lbl.ttip.Simmethod2 = \u79ef\u5206\u65b9\u6cd5\u91c7\u75284\u9636Runge-Kutta\u6570\u503c\u79ef\u5206. -simedtdlg.lbl.GeodeticMethod = \u5927\u5730\u6d4b\u91cf\u8ba1\u7b97: -simedtdlg.lbl.ttip.GeodeticMethodTip = \u76f8\u5bf9\u4e8e\u5730\u7403\u7684\u5750\u6807\u8ba1\u7b97. \u53ef\u8ba1\u7b97\u79d1\u91cc\u5965\u5229\u6548\u5e94. -simedtdlg.lbl.Timestep = \u65f6\u95f4\u6b65\u957f: -simedtdlg.lbl.ttip.Timestep1 = \u4eff\u771f\u6b65\u9aa4\u4e4b\u95f4\u7684\u65f6\u95f4.
\u66f4\u5c0f\u7684\u65f6\u95f4\u6b65\u957f\u8ba1\u7b97\u66f4\u6162, \u7ed3\u679c\u66f4\u7cbe\u786e.
-simedtdlg.lbl.ttip.Timestep2 = 4\u9636\u6a21\u62df\u65b9\u6cd5\u975e\u5e38\u7cbe\u786e\uff0c\u5982\u679c\u65f6\u95f4\u6b65\u957f\u4e3a -simedtdlg.but.ttip.resettodefault = \u91cd\u7f6e\u65f6\u95f4\u6b65\u957f\u4e3a\u7f3a\u7701\u503c ( -simedtdlg.border.SimExt = \u6a21\u62df\u6269\u5c55 -simedtdlg.SimExt.desc = \u6a21\u62df\u6269\u5c55\u80fd\u5728\u6a21\u62df\u8fc7\u7a0b\u4e2d\u542f\u7528\u9ad8\u7ea7\u7279\u6027\u4ee5\u53ca\u81ea\u5b9a\u4e49\u529f\u80fd. \u6bd4\u5982\u786c\u4ef6\u5728\u73af\u6d4b\u8bd5. -simedtdlg.SimExt.noExtensions = \u65e0\u6269\u5c55\u5b9a\u4e49\u9879 -simedtdlg.SimExt.add = \u6dfb\u52a0\u6269\u5c55 -simedtdlg.SimExt.copyExtension = \u590d\u5236\u6269\u5c55 -simedtdlg.lbl.Noflightdata = \u65e0\u53ef\u7528\u98de\u884c\u6570\u636e -simedtdlg.lbl.runsimfirst = \u8bf7\u5148\u8fd0\u884c\u4eff\u771f -simedtdlg.chart.Simflight = \u5df2\u4eff\u771f\u7684\u98de\u884c -simedtdlg.dlg.Simres = \u4eff\u771f\u7ed3\u679c -simedtdlg.IntensityDesc.None = \u65e0 -simedtdlg.IntensityDesc.Verylow = \u5f88\u4f4e -simedtdlg.IntensityDesc.Low = \u4f4e -simedtdlg.IntensityDesc.Medium = \u4e2d -simedtdlg.IntensityDesc.High = \u9ad8 -simedtdlg.IntensityDesc.Veryhigh = \u5f88\u9ad8 -simedtdlg.IntensityDesc.Extreme = \u6781\u9ad8 - -SimulationExtension.airstart.name.alt = Air-start ({alt}) -SimulationExtension.airstart.name.altvel = Air-start ({alt}, {vel}) -SimulationExtension.javacode.name = Java\u4ee3\u7801 -SimulationExtension.javacode.name.none = \u65e0 -SimulationExtension.javacode.desc = \u6dfb\u52a0\u81ea\u5b9a\u4e49SimulationListener(\u76d1\u542c\u4e8b\u4ef6) -SimulationExtension.javacode.className = \u5b8c\u6574\u7684Java\u7c7b\u540d: - -SimulationExtension.scripting.name = {language}\u811a\u672c -SimulationExtension.scripting.desc = \u81ea\u5b9a\u4e49OpenRocket\u6269\u5c55\u811a\u672c. -SimulationExtension.scripting.language.label = \u8bed\u8a00: -SimulationExtension.scripting.warning.disabled = \u4e0d\u53ef\u4fe1\u811a\u672c\u5df2\u88ab\u7981\u7528. \u4f60\u9700\u8981\u5728\u4eff\u771f\u9009\u9879\u4e2d\u624b\u52a8\u542f\u7528. -SimulationExtension.scripting.text.enabled = \u542f\u7528\u811a\u672c -SimulationExtension.scripting.text.enabled.ttip = \u811a\u672c\u53ea\u6709\u5728\u542f\u7528\u540e\u624d\u4f1a\u88ab\u6267\u884c. -SimulationExtension.scripting.text.trusted = \u5728\u672c\u673a\u4e0a\u4fe1\u4efb\u8be5\u811a\u672c -SimulationExtension.scripting.text.trusted.msg = \u4e0d\u53ef\u4fe1\u7684\u811a\u672c\u4f1a\u5728\u8bfb\u53d6\u65f6\u88ab\u7981\u7528 -SimulationExtension.scripting.text.trusted.clear = \u6e05\u9664\u811a\u672c\u4fe1\u4efb -SimulationExtension.scripting.text.trusted.clear.ttip = \u6e05\u9664\u5bf9\u6240\u6709\u811a\u672c\u7684\u4fe1\u4efb -SimulationExtension.scripting.text.trusted.cleared = \u6240\u6709\u811a\u672c\u5df2\u4e0d\u88ab\u672c\u673a\u4fe1\u4efb. -SimulationExtension.scripting.text.trusted.cleared.title = \u5df2\u6e05\u9664 - -SimulationEditDialog.btn.plot = \u6570\u636e\u56fe -SimulationEditDialog.btn.export = \u5bfc\u51fa -SimulationEditDialog.btn.edit = \u7f16\u8f91 -SimulationEditDialog.btn.simulate = \u4eff\u771f -SimulationEditDialog.btn.simulateAndPlot = \u4eff\u771f & \u6570\u636e\u56fe - -GeodeticComputationStrategy.flat.name = \u5e73\u9762\u5730\u7403 -GeodeticComputationStrategy.flat.desc = \u5728\u8ba1\u7b97\u65f6\u628a\u5730\u9762\u5f53\u6210\u5e73\u9762, \u9002\u7528\u4e8e\u4f4e\u7a7a\u98de\u884c. -GeodeticComputationStrategy.spherical.name = \u7403\u5f62 -GeodeticComputationStrategy.spherical.desc = \u8ba1\u7b97\u5927\u5730\u6d4b\u91cf\u65f6\u4f7f\u7528\u7403\u5f62\u5730\u7403.
\u5bf9\u51e0\u4e4e\u6240\u6709\u7684\u8ba1\u7b97\u60c5\u51b5\u90fd\u5f88\u7cbe\u786e. -GeodeticComputationStrategy.wgs84.name = WGS84 \u692d\u5706 -GeodeticComputationStrategy.wgs84.desc = \u8ba1\u7b97\u5927\u5730\u6d4b\u91cf\u65f6\u4f7f\u7528\u4f7f\u7528WGS84\u4ee5\u53caVincenty\u8ddd\u79bb\u516c\u5f0f.
\u975e\u5e38\u6162. - - - - -! Simulation Panel -simpanel.but.newsimulation = \u65b0\u5efa\u4eff\u771f -simpanel.but.editsimulation = \u7f16\u8f91\u4eff\u771f -simpanel.but.runsimulations = \u8fd0\u884c\u4eff\u771f -simpanel.but.deletesimulations = \u5220\u9664\u4eff\u771f -simpanel.but.plotexport = \u7ed8\u56fe/\u8f93\u51fa -simpanel.but.ttip.newsimulation = \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u4eff\u771f -simpanel.but.ttip.editsim = \u7f16\u8f91\u9009\u4e2d\u7684\u4eff\u771f -simpanel.but.ttip.runsimu = \u91cd\u65b0\u8fd0\u884c\u9009\u4e2d\u7684\u4eff\u771f -simpanel.but.ttip.deletesim = \u5220\u9664\u9009\u4e2d\u7684\u4eff\u771f -simpanel.checkbox.donotask = \u4e0d\u518d\u8be2\u95ee -simpanel.lbl.defpref = \u60a8\u53ef\u5728\u9996\u9009\u9879\u4e2d\u4fee\u6539\u9ed8\u8ba4\u64cd\u4f5c. -simpanel.dlg.lbl.DeleteSim1 = \u5220\u9664\u9009\u4e2d\u7684\u4eff\u771f? -simpanel.dlg.lbl.DeleteSim2 = \u8be5\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500. -simpanel.dlg.lbl.DeleteSim3 = \u5220\u9664\u4eff\u771f -simpanel.col.Name = \u540d\u79f0 -simpanel.col.Motors = \u53d1\u52a8\u673a -simpanel.col.Configuration = \u914d\u7f6e -simpanel.col.Velocityoffrod = \u79bb\u67b6\u901f\u5ea6 -simpanel.col.Velocityatdeploy = \u6709\u6548\u8d1f\u8377\u901f\u5ea6 -simpanel.col.OptimumCoastTime = \u6700\u957f\u5ef6\u6ede\u65f6\u95f4 -simpanel.col.OptimumCoastTime.ttip = \u4ece\u6700\u540e\u4e00\u7ea7\u53d1\u52a8\u673a\u71c3\u5c3d\u81f3\u8fbe\u5230\u6700\u9ad8\u9ad8\u5ea6\u7684\u65f6\u95f4. -simpanel.col.Apogee = \u6700\u9ad8\u70b9 -simpanel.col.Maxvelocity = \u6700\u5927\u901f\u5ea6 -simpanel.col.Maxacceleration = \u6700\u5927\u52a0\u901f\u5ea6 -simpanel.col.Timetoapogee = \u6700\u9ad8\u70b9\u65f6\u95f4 -simpanel.col.Flighttime = \u98de\u884c\u65f6\u95f4 -simpanel.col.Groundhitvelocity = \u649e\u51fb\u5730\u9762\u901f\u5ea6 -simpanel.ttip.uptodate = \u6700\u65b0\u7684\u6570\u636e -simpanel.ttip.loaded = \u4ece\u6587\u4ef6\u8f7d\u5165\u6570\u636e -simpanel.ttip.outdated = \u6570\u636e\u5df2\u8fc7\u671f
\u70b9\u51fb\u8fd0\u884c\u4eff\u771f\u91cd\u65b0\u8ba1\u7b97. -simpanel.ttip.external = \u5bfc\u5165\u7684\u6570\u636e -simpanel.ttip.notSimulated = \u672a\u8fdb\u884c\u8fc7\u4eff\u771f
\u70b9\u51fb\u8fd0\u884c\u4eff\u771f. -simpanel.ttip.noData = \u65e0\u53ef\u7528\u7684\u4eff\u771f\u6570\u636e. -simpanel.ttip.noWarnings = \u672a\u6709\u8b66\u544a. -simpanel.ttip.warnings = \u8b66\u544a: - -! SimulationRunDialog -SimuRunDlg.title.RunSim = \u8fd0\u884c\u4eff\u771f... -SimuRunDlg.lbl.Running = \u6b63\u5728\u4eff\u771f ... -SimuRunDlg.lbl.Simutime = \u4eff\u771f\u65f6\u95f4: -SimuRunDlg.lbl.Altitude = \u9ad8\u5ea6: -SimuRunDlg.lbl.Velocity = \u901f\u5ea6: -SimuRunDlg.msg.Unabletosim = \u65e0\u6cd5\u8fd0\u884c\u4eff\u771f: -SimuRunDlg.msg.errorOccurred = \u4eff\u771f\u65f6\u51fa\u73b0\u9519\u8bef: - -BasicEventSimulationEngine.error.noMotorsDefined = \u53d1\u52a8\u673a\u672a\u5b9a\u4e49 -BasicEventSimulationEngine.error.earlyMotorBurnout = \u53d1\u52a8\u673a\u8d77\u98de\u524d\u5df2\u71c3\u5c3d. -BasicEventSimulationEngine.error.noIgnition = \u53d1\u52a8\u673a\u672a\u70b9\u706b -BasicEventSimulationEngine.error.NaNResult = \u6a21\u62df\u7ed3\u679c\u975e\u6570\u503c,\u8bf7\u6c47\u62a5bug - - -RK4SimulationStepper.error.valuesTooLarge = \u4eff\u771f\u6570\u503c\u8d85\u51fa\u9650\u5236. \u8bf7\u7f29\u5c0f\u65f6\u95f4\u6b65\u957f. - -SimulationModifierTree.OptimizationParameters = \u4f18\u5316\u53c2\u6570 - -! SimulationExportPanel -SimExpPan.desc = CSV\u6570\u636e\u6587\u4ef6 (*.csv) -SimExpPan.border.Vartoexport = \u5bfc\u51fa\u53d8\u91cf -SimExpPan.border.Stage = \u5bfc\u51fa\u706b\u7bad\u7ea7 -SimExpPan.but.Selectall = \u5168\u9009 -SimExpPan.but.Selectnone = \u53d6\u6d88\u5168\u9009 -SimExpPan.border.Fieldsep = \u6570\u636e\u5206\u9694\u7b26 -SimExpPan.lbl.Fieldsepstr = \u6570\u636e\u5206\u9694\u5b57\u7b26\u4e32: -SimExpPan.lbl.longA1 = \u5b57\u7b26\u4e32\u7528\u4e8e\u5206\u9694\u8f93\u51fa\u6587\u4ef6\u4e2d\u7684\u6570\u636e\u57df.
-SimExpPan.lbl.longA2 = \u4f7f\u7528 ',' \u4f5c\u4e3aCSV\u6570\u636e\u7684\u5206\u9694\u7b26. -SimExpPan.checkbox.Includesimudesc = \u4eff\u771f\u63cf\u8ff0 -SimExpPan.checkbox.ttip.Includesimudesc = \u5728\u6587\u4ef6\u5934\u52a0\u4e0a\u6ce8\u91ca\u884c\u7528\u4e8e\u63cf\u8ff0\u4eff\u771f\u5185\u5bb9. -SimExpPan.border.Comments = \u6ce8\u91ca -SimExpPan.checkbox.Includefielddesc = \u6570\u636e\u57df\u63cf\u8ff0 -SimExpPan.checkbox.ttip.Includefielddesc = \u6ce8\u91ca\u884c\u7528\u4e8e\u63cf\u8ff0\u8f93\u51fa\u53d8\u91cf. -SimExpPan.checkbox.Incflightevents = \u98de\u884c\u4e8b\u4ef6 -SimExpPan.checkbox.ttip.Incflightevents = \u6ce8\u91ca\u884c\u7528\u4e8e\u63cf\u8ff0\u98de\u884c\u4e8b\u4ef6. -SimExpPan.lbl.Commentchar = \u6ce8\u91ca\u6807\u8bc6\u7b26: -SimExpPan.lbl.ttip.Commentchar = \u7528\u4e8e\u6807\u8bb0\u6ce8\u91ca\u884c\u7684\u6807\u8bc6\u7b26. -SimExpPan.Fileexists.desc1 = \u6587\u4ef6 \" -SimExpPan.Fileexists.desc2 = \" \u5df2\u5b58\u5728. \u8986\u76d6? -SimExpPan.Fileexists.title = \u6587\u4ef6\u5df2\u5b58\u5728 -SimExpPan.ExportingVar.desc1 = \u8f93\u51fa1\u4e2a\u53d8\u91cf\uff0c\u5171\u8ba1 -SimExpPan.ExportingVar.desc2 = \u8f93\u51fa -SimExpPan.ExportingVar.desc3 = \u4e2a\u53d8\u91cf, \u5171\u8ba1 -SimExpPan.Col.Variable = \u53d8\u91cf -SimExpPan.Col.Unit = \u5355\u4f4d - - -CsvOptionPanel.separator.space = \u7a7a\u683c -CsvOptionPanel.separator.tab = \u5236\u8868\u7b26(Tab) - - -! Custom expression general stuff -customExpression.Name = \u540d\u79f0 -customExpression.Symbol = \u7b26\u53f7 -customExpression.Expression = \u8868\u8fbe\u5f0f -customExpression.Units = \u5355\u4f4d -customExpression.Operator = \u7b97\u5b50 -customExpression.Description = \u63cf\u8ff0 - -! Custom expression panel -customExpressionPanel.but.NewExpression = \u65b0\u5efa\u8868\u8fbe\u5f0f -customExpressionPanel.but.ttip.NewExpression = \u65b0\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f -customExpressionPanel.but.Import = \u5bfc\u5165 -customExpressionPanel.but.ttip.Import = \u4ece\u5916\u90e8.ork\u6587\u4ef6\u5bfc\u5165\u8868\u8fbe\u5f0f -customExpressionPanel.lbl.UpdateNote = \u8bf7\u5148\u8fd0\u884c\u4eff\u771f, \u7136\u540e\u518d\u7ed8\u56fe. -customExpressionPanel.lbl.CalcNote = \u8868\u8fbe\u5f0f\u5c06\u6309\u663e\u793a\u987a\u5e8f\u8fdb\u884c\u8ba1\u7b97. -customExpressionPanel.lbl.CustomExpressions = \u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f -customExpression.Units.but.ttip.Remove = \u79fb\u9664\u8868\u8fbe\u5f0f -customExpression.Units.but.ttip.Edit = \u7f16\u8f91\u8868\u8fbe\u5f0f -customExpression.Units.but.ttip.MoveUp = \u63d0\u524d\u8868\u8fbe\u5f0f\u8ba1\u7b97\u987a\u5e8f -customExpression.Units.but.ttip.MoveDown = \u5ef6\u540e\u8868\u8fbe\u5f0f\u8ba1\u7b97\u987a\u5e8f - - -! Custom expression builder window -ExpressionBuilderDialog.title = \u8868\u8fbe\u5f0f\u751f\u6210\u5668 -ExpressionBuilderDialog.InsertVariable = \u63d2\u5165\u53d8\u91cf -ExpressionBuilderDialog.InsertOperator = \u63d2\u5165\u7b97\u5b50 -ExpressionBuilderDialog.led.ttip.Name = \u540d\u79f0\u4e0d\u80fd\u91cd\u590d -ExpressionBuilderDialog.led.ttip.Symbol = \u7b26\u53f7\u4e0d\u80fd\u91cd\u590d -ExpressionBuilderDialog.led.ttip.Expression = \u8868\u8fbe\u5f0f\u5fc5\u987b\u4f7f\u7528\u5b9a\u4e49\u8fc7\u7684\u7b26\u53f7\u548c\u7b97\u5b50 -ExpressionBuilderDialog.CopyToOtherSimulations = \u590d\u5236\u5230\u5176\u4ed6\u4eff\u771f -ExpressionBuilderDialog.CopyToOtherSimulations.ttip = \u5c06\u8868\u8fbe\u5f0f\u590d\u5236\u5230\u5176\u4ed6\u8bbe\u8ba1\u7a3f.
\u4e0d\u4f1a\u8986\u76d6\u5176\u4ed6\u4eff\u771f\u4e2d\u73b0\u6709\u7684\u7684\u8868\u8fbe\u5f0f. - -! Custom expression variable selector -CustomVariableSelector.title = \u9009\u62e9\u53d8\u91cf - -! Custom operator selector -CustomOperatorSelector.title = \u9009\u62e9\u7b97\u5b50 - -! Operators -Operator.plus = \u52a0 -Operator.minus = \u51cf -Operator.star = \u4e58 -Operator.div = \u9664 -Operator.mod = \u6a21 -Operator.pow = \u6307\u6570 -Operator.abs = \u7edd\u5bf9\u503c -Operator.ceil = \u5411\u4e0a\u53d6\u6574 -Operator.floor = \u5411\u4e0b\u53d6\u6574 -Operator.sqrt = \u5e73\u65b9\u6839 -Operator.cbrt = \u7acb\u65b9\u6839 -Operator.exp = \u6307\u6570\u51fd\u6570 (e^x) -Operator.ln = \u81ea\u7136\u5bf9\u6570 -Operator.sin = \u6b63\u5f26 Sin -Operator.cos = \u4f59\u5f26 Cos -Operator.tan = \u6b63\u5207 Tan -Operator.asin = \u53cd\u6b63\u5f26 ArcSin -Operator.acos = \u53cd\u4f59\u5f26 ArcCos -Operator.atan = \u53cd\u6b63\u5207 ArcTan -Operator.hsin = \u53cc\u66f2\u6b63\u5f26 Sinh -Operator.hcos = \u53cc\u66f2\u4f59\u5f26 Cosh -Operator.htan = \u53cc\u66f2\u6b63\u5207 Tanh -Operator.log10 = \u5e38\u7528\u5bf9\u6570 (\u5e95\u6570\u4e3a10) -Operator.round = \u56db\u820d\u4e94\u5165 -Operator.random = \u4ea7\u751f\u4e00\u4e2a\u4ecb\u4e8e0\u5230\u8bbe\u5b9a\u503c\u4e4b\u95f4\u7684\u968f\u673a\u6570 -Operator.expm1 = \u548c exp(x)-1 \u4e00\u6837, \u4f46\u5bf9\u4e8e\u8f83\u5c0f\u7684\u6570\u5b57x\u66f4\u7cbe\u786e -Operator.mean = \u7b97\u672f\u5e73\u5747\u6570 -Operator.min = \u53d6\u6700\u5c0f\u503c -Operator.max = \u53d6\u6700\u5927\u503c -Operator.var = \u65b9\u5dee -Operator.stdev = \u6807\u51c6\u5dee -Operator.rms = \u5747\u65b9\u6839 -Operator.lclip = \u9650\u5236\u6570\u503c(\u53c2\u65701)\u4e0d\u5c0f\u4e8e\u53e6\u4e00\u4e2a\u6570\u503c(\u53c2\u65702) -Operator.uclip = \u9650\u5236\u6570\u503c(\u53c2\u65701)\u4e0d\u5927\u4e8e\u53e6\u4e00\u4e2a\u6570\u503c(\u53c2\u65702) -Operator.binf = \u7ed9\u51fa\u6570\u503c(\u53c2\u65701)\u76f8\u5bf9\u4e8e\u4e0b\u754c(\u53c2\u65702)\u548c\u4e0a\u754c(\u53c2\u65703)\u7684\u6bd4\u4f8b -Operator.trapz = \u5bf9\u4e8e\u7ed9\u5b9a\u8303\u56f4\u4f7f\u7528\u68af\u5f62\u79ef\u5206 -Operator.tnear = \u7ed9\u51fa\u6570\u636e\u70b9(\u53c2\u65701)\u6700\u63a5\u8fd1\u6570\u503c(\u53c2\u65702)\u7684\u65f6\u95f4 - -! MotorPlot -MotorPlot.title.Motorplot = \u53d1\u52a8\u673a\u56fe\u8868 -MotorPlot.but.Select = \u9009\u62e9 -MotorPlot.Chart.Motorthrustcurve = \u53d1\u52a8\u673a\u63a8\u529b\u66f2\u7ebf -MotorPlot.Chart.Time = \u65f6\u95f4 / s -MotorPlot.Chart.Thrust = \u63a8\u529b / N -MotorPlot.txt.Designation = \u578b\u53f7: -MotorPlot.txt.Manufacturer = \u5236\u9020\u5546: -MotorPlot.txt.Type = \u7c7b\u522b: -MotorPlot.txt.Delays = \u5ef6\u65f6: -MotorPlot.txt.Comment = \u6ce8\u91ca:\n - -! Simulation plot panel -simplotpanel.lbl.Presetplotconf = \u9884\u8bbe\u7ed8\u56fe\u8bbe\u7f6e: -simplotpanel.lbl.Xaxistype = X\u8f74\u7c7b\u522b: -simplotpanel.lbl.Unit = \u5355\u4f4d: -simplotpanel.lbl.Yaxistypes = Y\u8f74\u7c7b\u522b: -simplotpanel.lbl.Flightevents = \u98de\u884c\u4e8b\u4ef6: -simplotpanel.but.All = \u5168\u9009\u4e8b\u4ef6 -simplotpanel.but.None = \u53d6\u6d88\u5168\u9009\u4e8b\u4ef6 -simplotpanel.but.NewYaxisplottype = \u65b0\u5efaY\u8f74\u7c7b\u522b -simplotpanel.lbl.Axis = \u8f74: -simplotpanel.but.ttip.Removethisplot = \u5220\u9664\u8be5Y\u8f74\u7c7b\u522b -simplotpanel.Desc = \u6570\u636e\u5c06\u6309\u65f6\u95f4\u987a\u5e8f\u7ed8\u5236, \u5373\u4f7fX\u8f74\u4e0d\u662f\u65f6\u95f4. -simplotpanel.OptionPane.lbl1 = \u6700\u591a\u7ed8\u523615\u5e45\u56fe. -simplotpanel.OptionPane.lbl2 = \u65e0\u6cd5\u65b0\u589e\u7ed8\u56fe -simplotpanel.AUTO_NAME = \u81ea\u52a8 -simplotpanel.LEFT_NAME = \u5de6 -simplotpanel.RIGHT_NAME = \u53f3 -simplotpanel.CUSTOM = \u81ea\u5b9a\u4e49 -SimulationPlotPanel.error.noPlotSelected = \u8bf7\u5728Y\u8f74\u6dfb\u52a0\u81f3\u5c111\u4e2a\u53d8\u91cf. -SimulationPlotPanel.error.noPlotSelected.title = \u6ca1\u6709\u6570\u636e - -! Component add buttons -compaddbuttons.Bodycompandfinsets = \u7bad\u4f53\u90e8\u4ef6\u548c\u7a33\u5b9a\u7ffc -compaddbuttons.Nosecone = \u5934\u9525 -compaddbuttons.Bodytube = \u7bad\u4f53 -compaddbuttons.Transition = \u7ea7\u95f4\u6bb5 -compaddbuttons.Trapezoidal = \u68af\u5f62\u7a33\u5b9a\u7ffc -compaddbuttons.Elliptical = \u692d\u5706\u7a33\u5b9a\u7ffc -compaddbuttons.Freeform = \u81ea\u7531\u66f2\u9762 -compaddbuttons.Tubefin = \u7ba1\u5f62\u7ffc -compaddbuttons.Launchlug = \u53d1\u5c04\u5957\u67c4 -compaddbuttons.Innercomponent = \u5185\u90e8\u90e8\u4ef6 -compaddbuttons.Innertube = \u5185\u7b52 -compaddbuttons.Coupler = \u8fde\u63a5\u5668 -compaddbuttons.Centeringring = \u4e2d\u5fc3\u73af -compaddbuttons.Bulkhead = \u9694\u677f -compaddbuttons.Engineblock = \u53d1\u52a8\u673a -compaddbuttons.Massobjects = \u8f7d\u8377\u90e8\u4ef6 -compaddbuttons.Parachute = \u964d\u843d\u4f1e -compaddbuttons.Streamer = \u98d8\u5e26 -compaddbuttons.Shockcord = \u51cf\u9707\u7d22 -compaddbuttons.Masscomponent = \u4e3b\u8f7d\u8377 -compaddbuttons.Donotaskmeagain = \u4e0d\u518d\u8be2\u95ee -compaddbuttons.Selectcomppos = \u9009\u62e9\u90e8\u4ef6\u4f4d\u7f6e -compaddbuttons.lbl.Youcanchange = \u4f60\u53ef\u4ee5\u5728\u9996\u9009\u9879\u4e2d\u8bbe\u5b9a\u9ed8\u8ba4\u64cd\u4f5c. -compaddbuttons.lbl.insertcomp = \u7d27\u63a5\u5f53\u524d\u7ec4\u4ef6\u6dfb\u52a0\u65b0\u7ec4\u4ef6\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u65b0\u7ec4\u4ef6? -compaddbuttons.askPosition.Inserthere = \u5728\u6b64\u63d2\u5165 -compaddbuttons.askPosition.Addtotheend = \u5728\u5c3e\u90e8\u6dfb\u52a0 -compaddbuttons.askPosition.Cancel = \u53d6\u6d88 - -! Component Analysis Dialog -componentanalysisdlg.componentanalysis = \u7ec4\u4ef6\u5206\u6790 -componentanalysisdlg.lbl.winddir = \u98ce\u5411: -componentanalysisdlg.TitledBorder.warnings = \u8b66\u544a: -componentanalysisdlg.ToggleBut.worst = \u6700\u574f\u60c5\u51b5 -componentanalysisdlg.lbl.angleofattack = \u653b\u89d2: -componentanalysisdlg.lbl.machnumber = \u9a6c\u8d6b: -componentanalysisdlg.lbl.rollrate = \u89d2\u901f\u5ea6: -componentanalysisdlg.lbl.activestages = \u6709\u6548\u7ea7: -componentanalysisdlg.lbl.motorconf = \u53d1\u52a8\u673a\u8bbe\u7f6e: -componentanalysisdlg.TabStability.Col = \u7ec4\u4ef6 -componentanalysisdlg.TabStability.Col.CG = \u91cd\u5fc3 -componentanalysisdlg.TabStability.Col.Mass = \u8d28\u91cf -componentanalysisdlg.TabStability.Col.CP = \u538b\u5fc3 -componentanalysisdlg.TabStability = \u7a33\u5b9a\u6027 -componentanalysisdlg.TabStability.ttip = \u7a33\u5b9a\u6027\u4fe1\u606f -componentanalysisdlg.dragTableModel.Col.Component = \u7ec4\u4ef6 -componentanalysisdlg.dragTableModel.Col.Pressure = \u538b\u529b CD -componentanalysisdlg.dragTableModel.Col.Base = \u57fa\u51c6 CD -componentanalysisdlg.dragTableModel.Col.friction = \u6469\u64e6 CD -componentanalysisdlg.dragTableModel.Col.total = \u603b CD -componentanalysisdlg.dragTabchar = \u963b\u529b\u7279\u6027 -componentanalysisdlg.dragTabchar.ttip = \u963b\u529b\u7279\u6027 -componentanalysisdlg.rollTableModel.Col.component = \u7ec4\u4ef6 -componentanalysisdlg.rollTableModel.Col.rollforc = \u6eda\u8f6c\u529b\u7cfb\u6570 -componentanalysisdlg.rollTableModel.Col.rolldamp = \u6eda\u8f6c\u963b\u5c3c\u7cfb\u6570 -componentanalysisdlg.rollTableModel.Col.total = \u603b Cl -componentanalysisdlg.rollTableModel = \u6eda\u8f6c\u52a8\u529b\u5b66 -componentanalysisdlg.rollTableModel.ttip = \u6eda\u8f6c\u52a8\u529b\u5b66 -componentanalysisdlg.println.closingmethod = \u8c03\u7528\u5173\u95ed\u4e8b\u4ef6: -componentanalysisdlg.println.settingnam = \u8bbe\u7f6e\u975e\u6570\u5b57\u503c -componentanalysisdlg.lbl.reflenght = \u53c2\u8003\u957f\u5ea6: -componentanalysisdlg.lbl.refarea = \u53c2\u8003\u9762\u79ef: -!componentanalysisdlg.But.close = \u5173\u95ed -componentanalysisdlg.TabStability.Col.Component = \u7ec4\u4ef6 -componentanalysisdlg.TOTAL = \u603b\u5171 -componentanalysisdlg.noWarnings = \u6ca1\u6709\u8b66\u544a. - -! Custom Material dialog -custmatdlg.title.Custommaterial = \u81ea\u5b9a\u4e49\u6750\u6599 -custmatdlg.lbl.Materialname = \u6750\u6599\u540d\u79f0: -custmatdlg.lbl.Materialtype = \u6750\u6599\u7c7b\u578b: -custmatdlg.lbl.Materialdensity = \u6750\u6599\u5bc6\u5ea6: -custmatdlg.checkbox.Addmaterial = \u6dfb\u52a0\u6750\u6599\u5230\u6570\u636e\u5e93 - - -! Ring Component Config -ringcompcfg.OuterRadius = \u5916\u76f4\u5f84 -ringcompcfg.Automatic = \u81ea\u52a8 -ringcompcfg.InnerRadius = \u5185\u76f4\u5f84 -ringcompcfg.Thickness = \u539a\u5ea6 -ringcompcfg.Length = \u957f\u5ea6 -ringcompcfg.Positionrelativeto = \u76f8\u5bf9\u4f4d\u7f6e\u81ea: -ringcompcfg.plus = \u52a0 -ringcompcfg.PositionValue = \u4f4d\u7f6e\u503c -ringcompcfg.Radialdistance = \u5f84\u5411\u8ddd\u79bb: -ringcompcfg.Distancefrom = \u5230\u706b\u7bad\u4e2d\u5fc3\u7ebf\u7684\u8ddd\u79bb -ringcompcfg.Radialdirection = \u5f84\u5411: -ringcompcfg.radialdirectionfrom = \u4ece\u706b\u7bad\u4e2d\u5fc3\u7ebf\u6cbf\u5f84\u5411 -ringcompcfg.but.Reset = \u91cd\u7f6e -ringcompcfg.but.Resetcomponant = \u91cd\u7f6e\u6240\u6709\u7ec4\u4ef6\u5bf9\u9f50\u4e2d\u5fc3\u7ebf -ringcompcfg.EngineBlock.desc = \u53d1\u52a8\u673a\u5ea7\u7528\u4e8e\u9632\u6b62\u53d1\u52a8\u673a\u5411\u524d\u7a9c\u51fa\u7bad\u4f53.

\u6dfb\u52a0\u53d1\u52a8\u673a\u524d\u8bf7\u5148\u6dfb\u52a0\u7bad\u4f53\u6216\u5185\u7ba1\u5e76\u5728\u53d1\u52a8\u673a\u9875\u9762\u4e0a\u6807\u8bb0\u4e3a\u53d1\u52a8\u673a\u5ea7. -ringcompcfg.note.desc = \u6ce8\u610f: \u5185\u7ba1\u4e0d\u4f1a\u5f71\u54cd\u7a7a\u6c14\u52a8\u529b\u5b66(\u5373\u4f7f\u662f\u8d85\u51fa\u7bad\u4f53\u4e5f\u4e0d\u4f1a). - - -! Body Tube Config -BodyTubecfg.lbl.Bodytubelength = \u7bad\u4f53\u957f\u5ea6: -BodyTubecfg.lbl.Outerdiameter = \u5916\u76f4\u5f84: -BodyTubecfg.lbl.Innerdiameter = \u5185\u76f4\u5f84: -BodyTubecfg.lbl.Wallthickness = \u58c1\u539a: -BodyTubecfg.tab.General = \u5e38\u89c4 -BodyTubecfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 -BodyTubecfg.tab.Motor = \u53d1\u52a8\u673a -BodyTubecfg.tab.Motormountconf = \u53d1\u52a8\u673a\u5ea7\u8bbe\u7f6e -BodyTubecfg.checkbox.Automatic = \u81ea\u52a8 -BodyTubecfg.checkbox.Filled = \u5b9e\u5fc3 - -! FinSetConfig -FinSetConfig.tab.Fintabs = \u7a33\u5b9a\u7ffc -FinSetConfig.tab.Through-the-wall = \u7a7f\u8fc7\u7ba1\u58c1\u7684\u5c3e\u7ffc -FinSetConfig.but.Converttofreeform = \u8f6c\u4e3a\u81ea\u7531\u66f2\u9762 -FinSetConfig.but.Converttofreeform.ttip = \u5c06\u7ffc\u8f6c\u6362\u4e3a\u81ea\u7531\u66f2\u9762\u7ffc -FinSetConfig.Convertfinset = \u8f6c\u6362\u7ffc -FinSetConfig.but.Splitfins = \u5206\u79bb\u7ffc -FinSetConfig.but.Splitfins.ttip = \u5c06\u4e00\u4e2a\u7ffc\u5206\u6210\u591a\u4e2a\u7ffc -FinSetConfig.but.AutoCalc = \u81ea\u52a8\u8ba1\u7b97 -FinSetConfig.lbl.Through-the-wall = \u7a7f\u8fc7\u7ba1\u58c1\u7684\u5c3e\u7ffc: -FinSetConfig.lbl.Tablength = \u677f\u957f: -FinSetConfig.ttip.Tablength = \u7ffc\u677f\u7684\u957f\u5ea6. -FinSetConfig.lbl.Tabheight = \u677f\u9ad8: -FinSetConfig.ttip.Tabheight = \u7ffc\u5c55\u65b9\u5411\u7684\u9ad8\u5ea6. -FinSetConfig.lbl.Tabposition = \u4f4d\u7f6e: -FinSetConfig.ttip.Tabposition = \u7ffc\u677f\u7684\u4f4d\u7f6e. -FinSetConfig.lbl.relativeto = \u76f8\u5bf9\u4e8e - -!FinMarkingGuide -FinMarkingGuide.lbl.Front = \u524d - -! MotorDatabaseLoadingDialog -MotorDbLoadDlg.title = \u8bfb\u53d6\u53d1\u52a8\u673a\u6570\u636e -MotorDbLoadDlg.Loadingmotors = \u6b63\u5728\u8bfb\u53d6\u53d1\u52a8\u673a\u6570\u636e... - -! AppearanceConfig -AppearanceCfg.lbl.Appearance = \u5916\u89c2 -AppearanceCfg.lbl.Usedefault = \u4f7f\u7528\u9ed8\u8ba4 -AppearanceCfg.but.edit = \u7f16\u8f91 -AppearanceCfg.but.savedefault = \u8bbe\u4e3a\u9ed8\u8ba4\u5916\u89c2 -AppearanceCfg.lbl.Texture = \u7eb9\u7406: -AppearanceCfg.lbl.shine = \u5149\u4eae: -AppearanceCfg.lbl.color.Color = \u8272\u5f69: -AppearanceCfg.lbl.color.diffuse = \u6269\u6563\u8272\u5f69: -AppearanceCfg.lbl.color.ambient = \u73af\u5883\u8272: -AppearanceCfg.lbl.color.specular = \u9ad8\u5149\u989c\u8272: -AppearanceCfg.lbl.texture.scale = \u7f29\u653e: -AppearanceCfg.lbl.texture.offset = \u4f4d\u79fb: -AppearanceCfg.lbl.texture.center = \u5c45\u4e2d: -AppearanceCfg.lbl.texture.rotation = \u65cb\u8f6c: -AppearanceCfg.lbl.texture.repeat = \u91cd\u590d: - -! Texture Wrap Modes -TextureWrap.Repeat = \u91cd\u590d -TextureWrap.Mirror = \u91cd\u590d & \u955c\u50cf -TextureWrap.Clamp = \u56fa\u5b9a\u8fb9\u7f18\u50cf\u7d20 -TextureWrap.Sticker = \u8d34\u7eb8 - -! RocketConfig -RocketCfg.lbl.Designname = \u8bbe\u8ba1\u7a3f\u540d\u79f0: -RocketCfg.lbl.Designer = \u8bbe\u8ba1\u4eba: -RocketCfg.lbl.Comments = \u6ce8\u91ca: -RocketCfg.lbl.Revisionhistory = \u4fee\u8ba2\u5386\u53f2: -RocketCfg.lbl.Material = \u6750\u6599: - -! ShockCordConfig -ShockCordCfg.lbl.Shockcordlength = \u51cf\u9707\u7d22\u957f\u5ea6: - -! RocketComponentConfig -RocketCompCfg.lbl.Componentname = \u7ec4\u4ef6\u540d\u79f0: -RocketCompCfg.ttip.Thecomponentname = \u7ec4\u4ef6\u540d\u79f0. -RocketCompCfg.tab.Override = \u8986\u5199 -RocketCompCfg.tab.MassandCGoverride = \u8d28\u91cf\u53ca\u91cd\u5fc3\u9009\u9879 -RocketCompCfg.tab.Figure = \u6837\u5f0f -RocketCompCfg.tab.Figstyleopt = \u6837\u5f0f\u9009\u9879 -RocketCompCfg.tab.Comment = \u6ce8\u91ca -RocketCompCfg.tab.Specifyacomment = \u7ec4\u4ef6\u6ce8\u91ca -RocketCompCfg.tab.Appearance = \u5916\u89c2 -RocketCompCfg.lbl.Mass = \u8d28\u91cf: -RocketCompCfg.lbl.Componentmass = \u7ec4\u4ef6\u8d28\u91cf: -RocketCompCfg.lbl.overriddento = (\u8986\u5199\u5230 -RocketCompCfg.lbl.overriddenby = (\u88ab\u8986\u5199 -RocketCompCfg.lbl.Componentmaterial = \u7ec4\u4ef6\u6750\u6599: -RocketCompCfg.lbl.Componentfinish = \u7ec4\u4ef6\u8868\u9762\u5904\u7406: -RocketCompCfg.lbl.ttip.componentmaterialaffects = \u7ec4\u4ef6\u6750\u6599\u5c06\u4f1a\u5f71\u54cd\u5230\u7ec4\u4ef6\u91cd\u91cf. -RocketCompCfg.combo.ttip.componentmaterialaffects = \u7ec4\u4ef6\u6750\u6599\u5c06\u4f1a\u5f71\u54cd\u5230\u7ec4\u4ef6\u91cd\u91cf. -RocketCompCfg.lbl.longA1 = \u8868\u9762\u5904\u7406\u5c06\u4f1a\u5f71\u54cd\u5230\u7ec4\u4ef6\u7684\u7a7a\u6c14\u52a8\u529b.
-RocketCompCfg.lbl.longA2 = \u8be5\u6570\u503c\u4e3a\u5e73\u5747\u8868\u9762\u7c97\u7cd9\u5ea6. -RocketCompCfg.but.Setforall = \u8bbe\u7f6e\u6240\u6709 -RocketCompCfg.but.ttip.Setforall = \u5bf9\u6240\u6709\u7684\u7ec4\u4ef6\u4f7f\u7528\u540c\u79cd\u8868\u9762\u5904\u7406. -RocketCompCfg.lbl.Overridemassorcenter = \u8986\u5199\u91cd\u91cf\u6216\u91cd\u5fc3 -RocketCompCfg.checkbox.Overridemass = \u8986\u5199\u8d28\u91cf: -RocketCompCfg.checkbox.Overridecenterofgrav = \u8986\u5199\u91cd\u5fc3: -RocketCompCfg.checkbox.OverridemassandCG = \u8986\u5199\u6240\u6709\u7ec4\u4ef6\u7684\u91cd\u91cf\u548c\u91cd\u5fc3 -RocketCompCfg.lbl.longB1 = \u8986\u5199\u8d28\u91cf\u4e0d\u5305\u62ec\u53d1\u52a8\u673a.
-RocketCompCfg.lbl.longB2 = \u91cd\u5fc3\u4ece\u5934\u90e8\u5f00\u59cb\u8ba1\u7b97 -RocketCompCfg.lbl.Commentsonthe = \u6ce8\u91ca -RocketCompCfg.lbl.Figurestyle = \u6837\u5f0f: -RocketCompCfg.lbl.Componentcolor = \u7ec4\u4ef6\u989c\u8272: -RocketCompCfg.lbl.Choosecolor = \u989c\u8272\u9009\u62e9 -RocketCompCfg.checkbox.Usedefaultcolor = \u9ed8\u8ba4\u989c\u8272 -RocketCompCfg.lbl.Complinestyle = \u7ec4\u4ef6\u7ebf\u578b: -RocketCompCfg.but.Saveasdefstyle = \u4fdd\u5b58\u4e3a\u9ed8\u8ba4\u6837\u5f0f -RocketCompCfg.lbl.Diameter = \u76f4\u5f84: -RocketCompCfg.lbl.Length = \u957f\u5ea6: -RocketCompCfg.lbl.Thickness = \u539a\u5ea6: -RocketCompCfg.checkbox.Endcapped = \u6709\u7aef\u76d6 -RocketCompCfg.ttip.Endcapped = \u8fde\u63a5\u5904\u7ec8\u7aef\u662f\u5426\u6709\u76d6. -RocketCompCfg.title.Noseconeshoulder = \u5934\u9525\u8fde\u63a5\u5904 -RocketCompCfg.title.Aftshoulder = \u524d\u8fde\u63a5\u5904 -RocketCompCfg.border.Foreshoulder = \u540e\u8fde\u63a5\u5904 -!RocketCompCfg.lbl.Length = \u957f\u5ea6: - -! BulkheadConfig -BulkheadCfg.tab.Diameter = \u76f4\u5f84: -BulkheadCfg.tab.Thickness = \u539a\u5ea6: -BulkheadCfg.tab.General = \u5e38\u89c4 -BulkheadCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 - -!CenteringRingConfig -CenteringRingCfg.tab.Outerdiam = \u5916\u76f4\u5f84: -CenteringRingCfg.tab.Innerdiam = \u5185\u76f4\u5f84: -CenteringRingCfg.tab.Thickness = \u539a\u5ea6: -CenteringRingCfg.tab.General = \u5e38\u89c4 -CenteringRingCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 - -!ComponentConfigDialog -ComponentCfgDlg.configuration = \u8bbe\u7f6e -ComponentCfgDlg.configuration1 = -ComponentCfgDlg.Modify = \u4fee\u6539 - -!StageConfig -StageConfig.tab.Separation = \u5206\u79bb -StageConfig.tab.Separation.ttip = \u591a\u7ea7\u5206\u79bb\u9009\u9879 -StageConfig.separation.lbl.title = \u8bbe\u5b9a\u5206\u79bb\u65f6\u673a: -StageConfig.separation.lbl.plus = \u52a0 -StageConfig.separation.lbl.seconds = \u79d2 - -!EllipticalFinSetConfig -EllipticalFinSetCfg.Nbroffins = \u7a33\u5b9a\u7ffc\u6570\u91cf: -EllipticalFinSetCfg.Rotation = \u65cb\u5ea6: -EllipticalFinSetCfg.Fincant = \u7a33\u5b9a\u7ffc\u9762\u89d2: -EllipticalFinSetCfg.Rootchord = \u7ffc\u6839\u5f26\u957f: -EllipticalFinSetCfg.Height = \u9ad8\u5ea6: -EllipticalFinSetCfg.Positionrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -EllipticalFinSetCfg.plus = \u52a0 -EllipticalFinSetCfg.FincrossSection = \u7a33\u5b9a\u7ffc\u6a2a\u622a\u9762: -EllipticalFinSetCfg.Thickness = \u539a\u5ea6: -EllipticalFinSetCfg.General = \u5e38\u89c4 -EllipticalFinSetCfg.Generalproperties = \u5e38\u89c4\u5c5e\u6027 -EllipticalFinSetCfg.ttip.Fincant = \u7a33\u5b9a\u7ffc\u7ffc\u9762\u4e0e\u7bad\u4f53\u4e4b\u95f4\u7684\u5939\u89d2. - -!FreeformFinSetConfig -FreeformFinSetCfg.tab.General = \u5e38\u89c4 -FreeformFinSetCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 -FreeformFinSetCfg.tab.Shape = \u5f62\u72b6 -FreeformFinSetCfg.tab.ttip.Finshape = \u7a33\u5b9a\u7ffc\u5f62\u72b6 -FreeformFinSetCfg.lbl.Numberoffins = \u7a33\u5b9a\u7ffc\u6570\u91cf: -FreeformFinSetCfg.lbl.Finrotation = \u7a33\u5b9a\u7ffc\u65cb\u5ea6: -FreeformFinSetCfg.lbl.Fincant = \u7a33\u5b9a\u7ffc\u9762\u89d2: -FreeformFinSetCfg.lbl.ttip.Fincant = \u7a33\u5b9a\u7ffc\u7ffc\u9762\u4e0e\u7bad\u4f53\u4e4b\u95f4\u7684\u5939\u89d2. -FreeformFinSetCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -FreeformFinSetCfg.lbl.plus = \u52a0 -FreeformFinSetCfg.lbl.FincrossSection = \u7a33\u5b9a\u7ffc\u6a2a\u5207\u9762: -FreeformFinSetCfg.lbl.Thickness = \u539a\u5ea6: -! doubleClick1 + 2 form the message "Double-click to edit", split approximately at the middle -FreeformFinSetConfig.lbl.doubleClick1 = \u53cc\u51fb -FreeformFinSetConfig.lbl.doubleClick2 = \u7f16\u8f91 -FreeformFinSetConfig.lbl.clickDrag = \u5355\u51fb+\u62d6\u62fd: \u6dfb\u52a0,\u79fb\u52a8\u70b9 -FreeformFinSetConfig.lbl.ctrlClick = Ctrl+\u5355\u51fb: \u5220\u9664\u70b9 -FreeformFinSetConfig.lbl.scaleFin = \u7f29\u653e\u7a33\u5b9a\u7ffc - -!TubeFinSetConfig -TubeFinSetCfg.lbl.Nbroffins = \u7ffc\u6570\u91cf: -TubeFinSetCfg.lbl.Length = \u957f\u5ea6: -TubeFinSetCfg.lbl.Outerdiam = \u5916\u76f4\u5f84: -TubeFinSetCfg.checkbox.Automatic = \u81ea\u52a8 -TubeFinSetCfg.lbl.Innerdiam = \u5185\u76f4\u5f84: -TubeFinSetCfg.lbl.Thickness = \u539a\u5ea6: -TubeFinSetCfg.lbl.Finrotation = \u7ffc\u7fc5\u65cb\u5ea6: -TubeFinSetCfg.lbl.ttip.Finrotation = \u7a33\u5b9a\u7ffc\u7ec4\u5408\u91cc\u7b2c\u4e00\u7247\u7684\u89d2\u5ea6 - -!InnerTubeConfig -InnerTubeCfg.tab.Motor = \u53d1\u52a8\u673a -InnerTubeCfg.tab.ttip.Motor = \u53d1\u52a8\u673a\u5ea7\u8bbe\u7f6e -InnerTubeCfg.tab.Cluster = \u7c07 -InnerTubeCfg.tab.ttip.Cluster = \u7c07\u8bbe\u7f6e -InnerTubeCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e -InnerTubeCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e -InnerTubeCfg.lbl.Selectclustercfg = \u9009\u62e9\u7c07\u8bbe\u7f6e: -InnerTubeCfg.lbl.TubeSep = \u7bad\u4f53\u5206\u6bb5: -InnerTubeCfg.lbl.ttip.TubeSep = \u8bbe\u7f6e\u7bad\u4f53\u5206\u6bb5, 1.0 = \u7d27\u90bb -InnerTubeCfg.lbl.Rotation = \u65cb\u5ea6: -InnerTubeCfg.lbl.ttip.Rotation = \u8bbe\u7f6e\u7c07\u7684\u65cb\u5ea6\u89d2 -InnerTubeCfg.lbl.Rotangle = \u8bbe\u7f6e\u7c07\u7684\u65cb\u5ea6\u89d2 -InnerTubeCfg.but.Splitcluster = \u62c6\u5206\u7c07 -InnerTubeCfg.lbl.longA1 = \u5c06\u7c07\u62c6\u5206\u6210\u4e0d\u540c\u7684\u7ec4\u4ef6.
-InnerTubeCfg.lbl.longA2 = \u4e5f\u4f1a\u5236\u5185\u7ba1\u7684\u5168\u90e8\u90e8\u4ef6. -InnerTubeCfg.but.Resetsettings = \u91cd\u7f6e\u8bbe\u7f6e -InnerTubeCfg.but.ttip.Resetsettings = \u64a4\u9500\u62c6\u5206\u65cb\u8f6c\u5230\u6700\u521d\u503c - -! LaunchLugConfig -LaunchLugCfg.lbl.Length = \u957f\u5ea6: -LaunchLugCfg.lbl.Outerdiam = \u5916\u76f4\u5f84: -LaunchLugCfg.lbl.Innerdiam = \u5185\u76f4\u5f84: -LaunchLugCfg.lbl.Thickness = \u539a\u5ea6: -LaunchLugCfg.lbl.Radialpos = \u5f84\u5411\u4f4d\u7f6e: -LaunchLugCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -LaunchLugCfg.lbl.plus = \u52a0 -LaunchLugCfg.tab.General = \u5e38\u89c4 -LaunchLugCfg.tab.Generalprop = \u5e38\u89c4\u5c5e\u6027 - -! MassComponentConfig -MassComponentCfg.lbl.Mass = \u8d28\u91cf: -MassComponentCfg.lbl.Density = \u8fd1\u4f3c\u5bc6\u5ea6: -MassComponentCfg.lbl.Length = \u957f\u5ea6: -MassComponentCfg.lbl.Diameter = \u76f4\u5f84: -MassComponentCfg.lbl.PosRelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -MassComponentCfg.lbl.plus = \u52a0 -MassComponentCfg.tab.General = \u5e38\u89c4 -MassComponentCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 -MassComponentCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e -MassComponentCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e\u8bbe\u7f6e -MassComponentCfg.lbl.Radialdistance = \u5f84\u5411\u8ddd\u79bb: -MassComponentCfg.lbl.Radialdirection = \u5f84\u5411\u65b9\u5411: -MassComponentCfg.but.Reset = \u91cd\u7f6e -MassComponentCfg.lbl.type = \u7c7b\u578b - -! MotorConfig -MotorCfg.checkbox.compmotormount = \u8be5\u7ec4\u4ef6\u4e3a\u53d1\u52a8\u673a\u5ea7 -MotorCfg.lbl.Flightcfg = \u98de\u884c\u914d\u7f6e: -MotorCfg.but.New = \u65b0\u5efa -MotorCfg.but.FlightcfgEdit = \u7f16\u8f91 -MotorCfg.lbl.Currentmotor = \u5f53\u524d\u53d1\u52a8\u673a: -MotorCfg.lbl.Motoroverhang = \u53d1\u52a8\u673a\u6a2a\u7f69\u91cf: -MotorCfg.lbl.Ignitionat = \u70b9\u706b\u65f6\u523b: -MotorCfg.lbl.plus = \u52a0 -MotorCfg.lbl.seconds = \u79d2 -MotorCfg.lbl.longA1 = \u5f53\u524d\u8bbe\u8ba1\u7a3f\u4e3a\u5355\u7ea7\u706b\u7bad. -MotorCfg.lbl.longA2 = \u70b9\u51fb\"\u65b0\u5efa\u7ea7\"\u5efa\u7acb\u65b0\u7684\u706b\u7bad\u7ea7. -MotorCfg.lbl.longB1 = \u5f53\u524d\u8bbe\u8ba1\u7a3f\u6709 -MotorCfg.lbl.longB2 = \u4e2a\u706b\u7bad\u7ea7. -MotorCfg.but.Selectmotor = \u9009\u62e9\u53d1\u52a8\u673a -MotorCfg.but.Removemotor = \u79fb\u9664\u53d1\u52a8\u673a -MotorCfg.lbl.motorLabel = \u65e0 - -! NoseConeConfig -NoseConeCfg.lbl.Noseconeshape = \u5934\u9525\u5916\u5f62: -NoseConeCfg.lbl.Shapeparam = \u5916\u5f62\u53c2\u6570: -NoseConeCfg.lbl.Noseconelength = \u5934\u9525\u957f\u5ea6: -NoseConeCfg.lbl.Basediam = \u5e95\u5ea7\u76f4\u5f84: -NoseConeCfg.checkbox.Automatic = \u81ea\u52a8 -NoseConeCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConeCfg.checkbox.Filled = \u5b9e\u5fc3 -NoseConeCfg.tab.General = \u5e38\u89c4 -NoseConeCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 -NoseConeCfg.tab.Shoulder = \u8fde\u63a5\u5904 -NoseConeCfg.tab.ttip.Shoulder = \u8fde\u63a5\u5904\u5c5e\u6027 - -! ParachuteConfig -ParachuteCfg.lbl.Canopy = \u4f1e\u8863: -ParachuteCfg.lbl.Diameter = \u76f4\u5f84: -ParachuteCfg.lbl.Material = \u6750\u6599: -ParachuteCfg.combo.MaterialModel = \u6750\u6599\u4f1a\u5f71\u54cd\u7ec4\u4ef6\u91cd\u91cf. -ParachuteCfg.lbl.longA1 = \u963b\u529b\u7cfb\u6570 CD: -ParachuteCfg.lbl.longB1 = \u963b\u529b\u7cfb\u6570\u7531\u964d\u843d\u4f1e\u9762\u79ef\u51b3\u5b9a.
-ParachuteCfg.lbl.longB2 = \u9ad8\u963b\u529b\u7cfb\u6570\u80fd\u653e\u7f13\u4e0b\u964d\u901f\u7387. -ParachuteCfg.lbl.longB3 = \u964d\u843d\u4f1e\u7684\u963b\u529b\u7cfb\u6570\u901a\u5e38\u4e3a0.8. -ParachuteCfg.but.Reset = \u91cd\u7f6e -ParachuteCfg.lbl.Shroudlines = \u540a\u7d22: -ParachuteCfg.lbl.Numberoflines = \u540a\u7d22\u6570\u91cf: -ParachuteCfg.lbl.Linelength = \u957f\u5ea6: -ParachuteCfg.lbl.Material = \u6750\u6599: -ParachuteCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -ParachuteCfg.lbl.plus = \u52a0 -ParachuteCfg.lbl.Packedlength = \u4f1e\u5305\u957f\u5ea6: -ParachuteCfg.lbl.Packeddiam = \u4f1e\u5305\u76f4\u5f84: -ParachuteCfg.lbl.Deploysat = \u5c55\u5f00\u65f6\u673a: -ParachuteCfg.lbl.seconds = \u79d2 -ParachuteCfg.lbl.Altitude = \u9ad8\u5ea6: -ParachuteCfg.tab.General = \u5e38\u89c4 -ParachuteCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 -ParachuteCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e -ParachuteCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e\u8bbe\u7f6e -ParachuteCfg.lbl.Radialdistance = \u5f84\u5411\u8ddd\u79bb: -ParachuteCfg.lbl.Radialdirection = \u5f84\u5411\u65b9\u5411: -ParachuteCfg.but.Reset = \u91cd\u7f6e -ParachuteCfg.lbl.plusdelay = \u52a0 - -! ShockCordConfig -ShockCordCfg.lbl.Shockcordlength = \u51cf\u9707\u7d22\u957f\u5ea6: -ShockCordCfg.lbl.Shockcordmaterial = \u51cf\u9707\u7d22\u6750\u6599: -ShockCordCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -ShockCordCfg.lbl.plus = \u52a0 -ShockCordCfg.lbl.Packedlength = \u4f1e\u5305\u957f\u5ea6: -ShockCordCfg.lbl.Packeddiam = \u4f1e\u5305\u76f4\u5f84: -ShockCordCfg.tab.General = \u5e38\u89c4 -ShockCordCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 - -!SleeveConfig -SleeveCfg.tab.Outerdiam = \u5957\u7ba1\u5916\u76f4\u5f84: -SleeveCfg.tab.Innerdiam = \u5957\u7ba1\u5185\u76f4\u5f84: -SleeveCfg.tab.Wallthickness = \u58c1\u539a: -SleeveCfg.tab.Length = \u957f\u5ea6: -SleeveCfg.tab.General = \u5e38\u89c4 -SleeveCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 - -! StreamerConfig -StreamerCfg.lbl.Striplength = \u98d8\u5e26\u957f\u5ea6: -StreamerCfg.lbl.Stripwidth = \u98d8\u5e26\u5bbd\u5ea6: -StreamerCfg.lbl.Striparea = \u98d8\u5e26\u9762\u79ef: -StreamerCfg.lbl.Aspectratio = \u9ad8\u5bbd\u6bd4: -StreamerCfg.lbl.Material = \u6750\u6599: -StreamerCfg.combo.ttip.MaterialModel = \u6750\u6599\u4f1a\u5f71\u54cd\u7ec4\u4ef6\u91cd\u91cf. -StreamerCfg.lbl.longA1 = \u963b\u529b\u7cfb\u6570 CD: -StreamerCfg.lbl.longB1 = \u963b\u529b\u7cfb\u6570\u7531\u98d8\u5e26\u9762\u79ef\u51b3\u5b9a.
-StreamerCfg.lbl.longB2 = \u9ad8\u963b\u529b\u7cfb\u6570\u80fd\u653e\u7f13\u4e0b\u964d\u901f\u7387. -StreamerCfg.lbl.Automatic = \u81ea\u52a8 -StreamerCfg.lbl.longC1 = \u963b\u529b\u7cfb\u6570\u7531\u98d8\u5e26\u9762\u79ef\u51b3\u5b9a. -StreamerCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -StreamerCfg.lbl.plus = \u52a0 -StreamerCfg.lbl.Packedlength = \u98d8\u5e26\u5305\u957f\u5ea6: -StreamerCfg.lbl.Packeddiam = \u98d8\u5e26\u5305\u76f4\u5f84: -StreamerCfg.lbl.Deploysat = \u5c55\u5f00\u65f6\u673a: -StreamerCfg.lbl.seconds = \u79d2 -StreamerCfg.lbl.Altitude = \u9ad8\u5ea6: -StreamerCfg.tab.General = \u5e38\u89c4 -StreamerCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 -StreamerCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e -StreamerCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e\u8bbe\u7f6e -StreamerCfg.lbl.Radialdistance = \u5f84\u5411\u8ddd\u79bb: -StreamerCfg.lbl.Radialdirection = \u5f84\u5411\u65b9\u5411: -StreamerCfg.but.Reset = \u91cd\u7f6e -StreamerCfg.lbl.plusdelay = \u52a0 - -! ThicknessRingComponentConfig -ThicknessRingCompCfg.tab.Outerdiam = \u5916\u76f4\u5f84: -ThicknessRingCompCfg.tab.Innerdiam = \u5185\u76f4\u5f84: -ThicknessRingCompCfg.tab.Wallthickness = \u58c1\u539a: -ThicknessRingCompCfg.tab.Length = \u957f\u5ea6: -ThicknessRingCompCfg.tab.General = \u5e38\u89c4 -ThicknessRingCompCfg.tab.Generalprop = \u5e38\u89c4\u5c5e\u6027 - -! TransitionConfig -TransitionCfg.lbl.Transitionshape = \u7ea7\u95f4\u6bb5\u5f62\u72b6: -TransitionCfg.checkbox.Clipped = \u88c1\u526a -TransitionCfg.lbl.Shapeparam = \u5f62\u72b6\u53c2\u6570: -TransitionCfg.lbl.Transitionlength = \u7ea7\u95f4\u6bb5\u76f4\u5f84: -TransitionCfg.lbl.Forediam = \u524d\u76f4\u5f84 -TransitionCfg.checkbox.Automatic = \u81ea\u52a8 -TransitionCfg.lbl.Aftdiam = \u540e\u76f4\u5f84: -TransitionCfg.lbl.Wallthickness = \u58c1\u539a: -TransitionCfg.checkbox.Filled = \u5b9e\u5fc3 -TransitionCfg.tab.General = \u5e38\u89c4 -TransitionCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 -TransitionCfg.tab.Shoulder = \u8fde\u63a5\u5904 -TransitionCfg.tab.Shoulderproperties = \u8fde\u63a5\u5904\u5c5e\u6027 - -! TrapezoidFinSetConfig -TrapezoidFinSetCfg.lbl.Nbroffins = \u7a33\u5b9a\u7ffc\u6570\u91cf: -TrapezoidFinSetCfg.lbl.ttip.Nbroffins = \u68af\u5f62\u7a33\u5b9a\u7ffc\u7684\u6570\u91cf. -TrapezoidFinSetCfg.lbl.Finrotation = \u7a33\u5b9a\u7ffc\u65cb\u89d2: -TrapezoidFinSetCfg.lbl.ttip.Finrotation = \u7a33\u5b9a\u7ffc\u7ec4\u5408\u91cc\u7b2c\u4e00\u7247\u7684\u89d2\u5ea6 -TrapezoidFinSetCfg.lbl.Fincant = \u7a33\u5b9a\u7ffc\u9762\u89d2: -TrapezoidFinSetCfg.lbl.ttip.Fincant = \u7a33\u5b9a\u7ffc\u7ffc\u9762\u4e0e\u7bad\u4f53\u4e4b\u95f4\u7684\u5939\u89d2. -TrapezoidFinSetCfg.lbl.Rootchord = \u7ffc\u6839\u5f26: -TrapezoidFinSetCfg.lbl.Tipchord = \u7ffc\u68a2\u5f26: -TrapezoidFinSetCfg.lbl.Height = \u9ad8\u5ea6: -TrapezoidFinSetCfg.lbl.Sweeplength = \u540e\u63a0\u957f\u5ea6: -TrapezoidFinSetCfg.lbl.Sweepangle = \u540e\u63a0\u89d2: -TrapezoidFinSetCfg.lbl.FincrossSection = \u7a33\u5b9a\u7ffc\u6a2a\u622a\u9762: -TrapezoidFinSetCfg.lbl.Thickness = \u539a\u5ea6: -TrapezoidFinSetCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: -TrapezoidFinSetCfg.lbl.plus = \u52a0 -TrapezoidFinSetCfg.tab.General = \u5e38\u89c4 -TrapezoidFinSetCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 - -! Fin Fillets -FinSetCfg.lbl.Finfilletmaterial = \u63a5\u7f1d\u6750\u6599: -FinSetCfg.lbl.Filletradius = \u63a5\u7f1d\u534a\u5f84: -FinsetCfg.ttip.Finfillets1 = \u5c06\u9884\u4f30\u8d28\u91cf\u6dfb\u52a0\u5230\u7ffc\u6839\u90e8.
-FinsetCfg.ttip.Finfillets2 = \u5047\u5b9a\u63a5\u7f1d\u5185\u51f9\u4e14\u548c\u7bad\u4f53\u3001\u7ffc\u677f\u76f8\u5207.
-FinsetCfg.ttip.Finfillets3 = \u65e0\u63a5\u7f1d\u60c5\u51b5\u4e0b\u5c06\u8bbe\u5b9a\u63a5\u7f1d\u534a\u5f84\u4e3a0. - -! Save RKT Warning Dialog -SaveRktWarningDialog.txt1=\u5bfc\u51fa\u5230RockSim\u6587\u4ef6\u683c\u5f0f\u65e0\u6cd5\u4fdd\u5168\u6240\u6709OpenRocket\u7279\u6027. -#N/A - -saveAs.openrocket.title=\u4fdd\u5b58\u4e3aOpenRocket ork\u6587\u4ef6 -saveAs.rocksim.title=\u5bfc\u51fa\u4e3aRockSim rtk\u6587\u4ef6 - -! StorageOptionChooser -StorageOptChooser.lbl.Simdatatostore = \u4fdd\u5b58\u4eff\u771f\u6570\u636e: -StorageOptChooser.rdbut.Allsimdata = \u6240\u6709\u4eff\u771f\u6570\u636e -StorageOptChooser.lbl.longA1 = \u4fdd\u5b58\u6240\u6709\u4eff\u771f\u6570\u636e.
-StorageOptChooser.lbl.longA2 = \u6587\u4ef6\u4f53\u79ef\u4f1a\u5f88\u5927! -StorageOptChooser.rdbut.Every = \u6bcf\u4e00\u4e2a -StorageOptChooser.lbl.longB1 = \u6bcf\u9694\u6570\u4e2a\u6570\u636e\u4fdd\u5b58\u4e00\u6b21.
-StorageOptChooser.lbl.longB2 = \u95f4\u9694\u8d8a\u5927\u6587\u4ef6\u4f53\u79ef\u8d8a\u5c0f. -StorageOptChooser.lbl.seconds = \u79d2 -StorageOptChooser.rdbut.Onlyprimfig = \u4ec5\u4fdd\u7559\u4e3b\u8981\u6570\u636e -StorageOptChooser.lbl.longC1 = \u4ec5\u4fdd\u7559\u7b80\u62a5\u8868\u683c\u4e2d\u663e\u793a\u7684\u6570\u636e.
-StorageOptChooser.lbl.longC2 = \u6587\u4ef6\u4f53\u79ef\u6700\u5c0f. -StorageOptChooser.lbl.longD1 = \u6839\u636e\u5f53\u524d\u8bbe\u7f6e\u6765\u4f30\u8ba1\u751f\u6210\u6587\u4ef6\u5927\u5927\u5c0f. -StorageOptChooser.ttip.Saveopt = \u4fdd\u5b58\u9009\u9879 -StorageOptChooser.lbl.Estfilesize = \u9884\u8ba1\u6587\u4ef6\u4f53\u79ef: -StorageOptChooser.lbl.Saveopt = \u4fdd\u5b58\u9009\u9879 - -! ThrustCurveMotorSelectionPanel -TCMotorSelPan.lbl.Selrocketmotor = \u9009\u62e9\u706b\u7bad\u53d1\u52a8\u673a: -TCMotorSelPan.checkbox.hideSimilar = \u9690\u85cf\u76f8\u4f3c\u7684\u63a8\u529b\u66f2\u7ebf -TCMotorSelPan.checkbox.hideUsed = \u9690\u85cf\u5df2\u4f7f\u7528\u7684\u53d1\u52a8\u673a -TCMotorSelPan.checkbox.limitlength = \u957f\u5ea6\u4e0d\u8d85\u8fc7\u5f53\u524d\u53d1\u52a8\u673a\u5ea7\u957f\u5ea6 -TCMotorSelPan.checkbox.limitdiameter = \u76f4\u5f84\u4e0d\u8d85\u8fc7\u5f53\u524d\u53d1\u52a8\u673a\u5ea7\u76f4\u5f84 -TCMotorSelPan.btn.details = \u663e\u793a\u8be6\u60c5 -TCMotorSelPan.btn.filter = \u7b5b\u9009\u53d1\u52a8\u673a -TCMotorSelPan.MotorSize = \u53d1\u52a8\u673a\u5c3a\u5bf8 -TCMotorSelPan.Diameter = \u76f4\u5f84 -TCMotorSelPan.Length = \u957f\u5ea6 -TCMotorSelPan.MotorMountDimensions = \u53d1\u52a8\u673a\u5ea7\u5c3a\u5bf8: -TCMotorSelPan.lbl.Search = \u641c\u7d22: -TCMotorSelPan.lbl.Selectthrustcurve = \u9009\u62e9\u63a8\u529b\u66f2\u7ebf: -TCMotorSelPan.lbl.Ejectionchargedelay = \u5f39\u5c04\u5ef6\u65f6: -TCMotorSelPan.equalsIgnoreCase.None = \u65e0 -TCMotorSelPan.lbl.NumberofsecondsorNone = (\u79d2\u6570\u6216\"\u65e0\") -TCMotorSelPan.lbl.Totalimpulse = \u603b\u51b2\u91cf: -TCMotorSelPan.lbl.Avgthrust = \u5e73\u5747\u63a8\u529b: -TCMotorSelPan.lbl.Maxthrust = \u6700\u5927\u63a8\u529b: -TCMotorSelPan.lbl.Burntime = \u71c3\u70e7\u65f6\u95f4: -TCMotorSelPan.lbl.Launchmass = \u53d1\u5c04\u8d28\u91cf: -TCMotorSelPan.lbl.Emptymass = \u71c3\u5c3d\u8d28\u91cf: -TCMotorSelPan.lbl.Datapoints = \u6570\u636e\u70b9: -TCMotorSelPan.lbl.Digest = \u6458\u8981: -TCMotorSelPan.title.Thrustcurve = \u63a8\u529b\u66f2\u7ebf: -TCMotorSelPan.title.Thrust = \u63a8\u529b -TCMotorSelPan.delayBox.None = \u65e0 -TCMotorSelPan.noDescription = \u63cf\u8ff0\u4e0d\u53ef\u7528. -TCMotorSelPan.btn.checkAll = \u5168\u9009 -TCMotorSelPan.btn.checkNone = \u5168\u6e05\u7a7a -TCMotorSelPan.btn.close = \u5173\u95ed - - - -! PlotDialog -PlotDialog.CheckBox.Showdatapoints = \u663e\u793a\u6570\u636e\u70b9 -PlotDialog.lbl.Chart = \u5de6\u952e\u62d6\u62fd\u79fb\u52a8\u6570\u636e\u533a. \u6eda\u8f6e\u7f29\u653e. ctrl-\u6eda\u8f6e\u4ec5\u7f29\u653eX\u8f74. ctrl-\u5de6\u952e\u62d6\u62fd\u79fb\u52a8\u89c6\u56fe. \u53f3\u952e\u8fc7\u62fd\u8c03\u6574\u663e\u793a\u5927\u5c0f. - -ComponentTree.ttip.massoverride = \u8986\u5199\u91cd\u91cf -ComponentTree.ttip.cgoverride = \u8986\u5199\u91cd\u5fc3 -! "main" prefix is used for the main application dialog - -# FIXME: Rename the description keys - -main.menu.file = \u6587\u4ef6 -main.menu.file.desc = \u6587\u4ef6\u5904\u7406\u4efb\u52a1 -main.menu.file.new = \u65b0\u5efa -main.menu.file.new.desc = \u65b0\u5efa\u706b\u7bad\u8bbe\u8ba1\u7a3f -main.menu.file.open = \u6253\u5f00... -main.menu.file.open.desc = \u6253\u5f00\u706b\u7bad\u8bbe\u8ba1 -main.menu.file.openRecent = \u6700\u8fd1\u6253\u5f00... -main.menu.file.openRecent.desc = \u6253\u5f00\u6700\u8fd1\u7684\u706b\u7bad\u8bbe\u8ba1 -main.menu.file.openExample = \u6253\u5f00\u8303\u4f8b... -main.menu.file.openExample.desc = \u6253\u5f00\u706b\u7bad\u8bbe\u8ba1\u8303\u4f8b -main.menu.file.save = \u4fdd\u5b58 -main.menu.file.save.desc = \u4fdd\u5b58\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1 -main.menu.file.saveAs = \u53e6\u5b58\u4e3a... -main.menu.file.saveAs.desc = \u4fdd\u5b58\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1\u5230\u65b0\u6587\u4ef6 -main.menu.file.import = \u5bfc\u5165... -main.menu.file.import.desc = \u4eceRockSim rtk\u6587\u4ef6\u5bfc\u5165\u6a21\u578b -main.menu.file.export = \u5bfc\u51fa... -main.menu.file.export.desc = \u5bfc\u51fa\u6a21\u578b\u5230RockSim rkt\u6587\u4ef6 -main.menu.file.print = \u6253\u5370/\u5bfc\u51faPDF... -main.menu.file.print.desc = \u5c06\u5404\u4e2a\u7ec4\u4ef6\u6253\u5370\u6216\u4fdd\u5b58\u4e3aPDF\u6587\u4ef6 -main.menu.file.close = \u5173\u95ed -main.menu.file.close.desc = \u5173\u95ed\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1 -main.menu.file.quit = \u9000\u51fa -main.menu.file.quit.desc = \u9000\u51fa\u7a0b\u5e8f -main.menu.file.exportDecal = \u5bfc\u51fa\u8d34\u82b1 -main.menu.file.exportDecal.desc = \u5bfc\u51fa\u5f53\u524d\u8bbe\u8ba1\u7a3f\u7684\u8d34\u82b1\u4f9b\u5916\u90e8\u7a0b\u5e8f\u4fee\u6539\u7f16\u8f91. - -main.menu.edit = \u7f16\u8f91 -main.menu.edit.desc = \u706b\u7bad\u7f16\u8f91 -main.menu.edit.undo = \u64a4\u9500 -main.menu.edit.undo.desc = \u64a4\u9500\u64cd\u4f5c -main.menu.edit.redo = \u91cd\u505a -main.menu.edit.redo.desc = \u91cd\u505a\u64cd\u4f5c -main.menu.edit.cut = \u526a\u5207 -main.menu.edit.copy = \u590d\u5236 -main.menu.edit.paste = \u7c98\u8d34 -main.menu.edit.delete = \u5220\u9664 -main.menu.edit.resize = \u7f29\u653e... -main.menu.edit.resize.desc = \u7f29\u653e\u706b\u7bad\u8bbe\u8ba1\u7a3f -main.menu.edit.editpreset= \u7f16\u8f91\u7ec4\u4ef6\u9884\u8bbe\u6587\u4ef6 -main.menu.edit.preferences = \u9996\u9009\u9879 -main.menu.edit.preferences.desc = \u4fee\u6539\u5e94\u7528\u7a0b\u5e8f\u9996\u9009\u9879 - -main.menu.analyze = \u5206\u6790 -main.menu.analyze.desc = \u706b\u7bad\u5206\u6790 -main.menu.analyze.componentAnalysis = \u7ec4\u4ef6\u5206\u6790 -main.menu.analyze.componentAnalysis.desc = \u4ec5\u5206\u6790\u706b\u7bad\u90e8\u4ef6 -main.menu.analyze.optimization = \u706b\u7bad\u4f18\u5316 -main.menu.analyze.optimization.desc = \u5e38\u89c4\u706b\u7bad\u8bbe\u8ba1\u4f18\u5316 -main.menu.analyze.customExpressions = \u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f -main.menu.analyze.customExpressions.desc = \u901a\u8fc7\u81ea\u5b9a\u4e49\u7684\u6570\u5b66\u8868\u8fbe\u5f0f\u6765\u5b9a\u4e49\u65b0\u7684\u98de\u884c\u6570\u636e\u7c7b\u578b - -main.menu.help = \u5e2e\u52a9 -main.menu.help.desc = OpenRocket\u76f8\u5173\u4fe1\u606f -main.menu.help.tours = \u6559\u7a0b -main.menu.help.tours.desc = OpenRocket\u76f8\u5173\u6559\u7a0b -main.menu.help.license = \u8bb8\u53ef\u8bc1 -main.menu.help.license.desc = OpenRocket \u8bb8\u53ef\u8bc1\u4fe1\u606f -main.menu.help.bugReport = \u9519\u8bef\u62a5\u544a -main.menu.help.bugReport.desc = \u5173\u4e8e\u5982\u4f55\u62a5\u544aOpenRocket\u4e2d\u7684\u9519\u8bef -main.menu.help.debugLog = \u8c03\u8bd5\u65e5\u5fd7 -main.menu.help.debugLog.desc = \u67e5\u770bOpenRocket\u8c03\u8bd5\u65e5\u5fd7 -main.menu.help.about = \u5173\u4e8e -main.menu.help.about.desc = OpenRocket\u7248\u6743\u4fe1\u606f - -main.menu.debug = \u8c03\u8bd5 -main.menu.debug.whatisthismenu = \u8fd9\u662f\u4ec0\u4e48\u83dc\u5355? -main.menu.debug.createtestrocket = \u5efa\u7acb\u6d4b\u8bd5\u706b\u7bad - -! database -! Translate here all material database -! - -Material.CUSTOM = \u81ea\u5b9a\u4e49 - -! Material database -Databases.materials.types.Bulk = \u4f53 -Databases.materials.types.Line = \u7ebf -Databases.materials.types.Surface = \u9762 - -! BULK_MATERIAL -material.acrylic = \u4e9a\u514b\u529b -material.aluminum = \u94dd -material.balsa = \u8f7b\u6728 -material.basswood = \u6934\u6728 -material.birch = \u6866\u6728 -material.brass = \u9ec4\u94dc -material.cardboard = \u786c\u7eb8\u677f -material.carbon_fiber = \u78b3\u7ea4\u7ef4 -material.cork = \u8f6f\u6728 -material.depron_xps = Depron(\u6324\u5851\u805a\u82ef\u4e59\u70ef) -material.fiberglass = \u73bb\u7483\u7ea4\u7ef4 -material.kraft_phenolic = Kraft phenolic -material.maple = \u67ab\u6728 -material.paper_office = \u529e\u516c\u7eb8 -material.pine = \u677e\u6728 -material.plywood_birch = \u80f6\u5408\u677f(\u6866\u6728) -material.polycarbonate_lexan = \u805a\u78b3\u9178\u916f(Lexan) -material.polystyrene = \u805a\u82ef\u4e59\u70ef -material.pvc = PVC -material.spruce = \u6749\u6728 -material.steel = \u94a2\u94c1 -material.styrofoam_generic_eps = \u53d1\u6ce1\u805a\u82ef\u4e59\u70ef -material.styrofoam_blue_foam_xps = \u6324\u5851\u805a\u82ef\u4e59\u70ef \"Blue foam\" -material.titanium = \u949b -material.quantum_tubing = Quantum tubing -material.blue_tube = Blue tube -!SURFACE_MATERIAL -material.ripstop_nylon = \u683c\u5b50\u5c3c\u9f99 -material.mylar = \u805a\u916f\u8584\u819c (\u805a\u4e59\u70ef\u5bf9\u82ef\u4e8c\u9178) -material.polyethylene_thin = \u805a\u4e59\u70ef (\u8f7b\u8584) -material.polyethylene_heavy = \u805a\u4e59\u70ef (\u539a\u91cd) -material.silk = \u4e1d\u7ef8 -material.paper_office = \u529e\u516c\u7eb8 -material.cellophane = \u73bb\u7483\u7eb8 -material.crepe_paper = \u76b1\u7eb9\u7eb8 -! LINE_MATERIAL -material.thread_heavy_duty = \u7ebf (\u5927\u8f7d\u91cd) -material.elastic_cord_round_2_mm_1_16_in = \u677e\u7d27\u7ef3 (\u5706 2 mm, 1/16 in) -material.elastic_cord_flat_6_mm_1_4_in = \u677e\u7d27\u7ef3 (\u6241 6 mm, 1/4 in) -material.elastic_cord_flat_12_mm_1_2_in = \u677e\u7d27\u7ef3 (\u6241 12 mm, 1/2 in) -material.elastic_cord_flat_19_mm_3_4_in = \u677e\u7d27\u7ef3 (\u6241 19 mm, 3/4 in) -material.elastic_cord_flat_25_mm_1_in = \u677e\u7d27\u7ef3 (\u6241 25 mm, 1 in) -material.braided_nylon_2_mm_1_16_in = \u5c3c\u9f99\u7f16\u7ec7\u7ef3 (2 mm, 1/16 in) -material.braided_nylon_3_mm_1_8_in = \u5c3c\u9f99\u7f16\u7ec7\u7ef3 (3 mm, 1/8 in) -material.tubular_nylon_11_mm_7_16_in = \u5c3c\u9f99\u7f16\u7ec7\u5e26 (11 mm, 7/16 in) -material.tubular_nylon_14_mm_9_16_in = \u5c3c\u9f99\u7f16\u7ec7\u5e26 (14 mm, 9/16 in) -material.tubular_nylon_25_mm_1_in = \u5c3c\u9f99\u7f16\u7ec7\u5e26 (25 mm, 1 in) - -! ExternalComponent -ExternalComponent.Rough = \u7c97\u7cd9 -ExternalComponent.Unfinished = \u7c97\u52a0\u5de5 -ExternalComponent.Regularpaint = \u666e\u901a\u6d82\u6599 -ExternalComponent.Smoothpaint = \u5149\u6ed1\u6d82\u6599 -ExternalComponent.Polished = \u629b\u5149 - -! LineStyle -LineStyle.Solid = \u5b9e\u7ebf -LineStyle.Dashed = \u865a\u7ebf -LineStyle.Dotted = \u70b9\u865a\u7ebf -LineStyle.Dash-dotted = \u70b9\u5212\u7ebf -LineStyle.Defaultstyle = \u9ed8\u8ba4\u6837\u5f0f - -! Shape -Shape.Conical = \u5706\u9525 -Shape.Conical.desc1 = \u5706\u9525\u5934\u9525\u90e8\u9762\u56fe\u4e3a\u4e09\u89d2\u5f62. -Shape.Conical.desc2 = \u5706\u9525\u7ea7\u95f4\u6bb5\u4e3a\u76f4\u7ebf. -Shape.Ogive = \u5c16\u9876\u62f1 -Shape.Ogive.desc1 = \u5c16\u9876\u5934\u9525\u7684\u90e8\u9762\u56fe\u4e3a\u5706\u5f27\u5207\u6bb5. \u5f62\u72b6\u53c2\u65701\u4e3a\u5207\u9762\u5c16\u62f1, \u548c\u7bad\u4f53\u5e73\u6ed1\u8fc7\u6e21, \u53c2\u6570\u5c0f\u4e8e1\u4e3a\u5272\u9762\u5c16\u62f1. -Shape.Ogive.desc2 = \u5c16\u9876\u7ea7\u95f4\u6bb5\u4e3a\u5706\u5f27\u5207\u6bb5. \u5f62\u72b6\u53c2\u65701\u4e3a\u5207\u9762\u5c16\u62f1, \u548c\u540e\u7aef\u7bad\u4f53\u5e73\u6ed1\u8fc7\u6e21, \u53c2\u6570\u5c0f\u4e8e1\u4e3a\u5272\u9762\u5c16\u62f1. -Shape.Ellipsoid = \u692d\u5706\u4f53 -Shape.Ellipsoid.desc1 = \u692d\u5706\u5934\u9525\u7684\u90e8\u9762\u56fe\u4e3a\u534a\u692d\u5706, \u957f\u8f74\u662f\u77ed\u8f74\u7684\u4e24\u500d. -Shape.Ellipsoid.desc2 = \u692d\u5706\u7ea7\u95f4\u6bb5\u4e3a\u534a\u692d\u5706, \u957f\u8f74\u662f\u77ed\u8f74\u7684\u4e24\u500d. \u82e5\u672a\u88c1\u526a, \u90e8\u9762\u56fe\u5c06\u5339\u914d\u76f8\u5e94\u534a\u5f84. -Shape.Powerseries = \u5e42\u7ea7\u6570 -Shape.Powerseries.desc1 = \u5e42\u7ea7\u6570\u5934\u9525\u90e8\u9762\u56fe\u662f\u7531\u534a\u5f84 × (x / \u957f\u5ea6)k, \u5176\u4e2dk\u662f\u5f62\u72b6\u53c2\u6570. k=0.5\u65f6\u4e3a\u00bd\u5e42\u5373\u629b\u7269\u7ebf, k=0.75\u65f6\u4e3a\u00be\u5e42, k=1\u65f6\u4e3a\u5706\u9525. -Shape.Powerseries.desc2 = \u5e42\u7ea7\u6570\u7ea7\u95f4\u6bb5\u662f\u7531\u534a\u5f84 × (x / \u957f\u5ea6)k, \u5176\u4e2dk\u662f\u5f62\u72b6\u53c2\u6570. k=0.5\u65f6\u4e3a\u00bd\u5e42\u5373\u629b\u7269\u7ebf, k=0.75\u65f6\u4e3a\u00be\u5e42, k=1\u65f6\u4e3a\u5706\u9525. -Shape.Parabolicseries = \u629b\u7269\u7ebf -Shape.Parabolicseries.desc1 = \u629b\u7269\u7ebf\u5934\u9525\u90e8\u9762\u56fe\u4e3a\u629b\u7269\u7ebf. \u53c2\u6570\u51b3\u5b9a\u4e86\u629b\u7269\u7ebf\u7684\u5f62\u72b6. \u53c2\u65701.0\u4e3a\u5168\u629b\u7269\u7ebf, \u4e0e\u7bad\u4f53\u76f8\u5207, 0.75\u4e3a3/4 \u629b\u7269\u7ebf, 0.5 \u4e3a1/2 \u629b\u7269\u7ebf, 0\u4e3a\u5706\u9525. -Shape.Parabolicseries.desc2 = \u629b\u7269\u7ebf\u7ea7\u95f4\u6bb5\u4e3a\u629b\u7269\u7ebf. \u53c2\u6570\u51b3\u5b9a\u4e86\u629b\u7269\u7ebf\u7684\u5f62\u72b6. \u53c2\u65701.0\u4e3a\u5168\u629b\u7269\u7ebf, \u4e0e\u7bad\u4f53\u76f8\u5207, 0.75\u4e3a3/4 \u629b\u7269\u7ebf, 0.5 \u4e3a1/2 \u629b\u7269\u7ebf, 0\u4e3a\u5706\u9525. -Shape.Haackseries = Haack\u66f2\u7ebf -Shape.Haackseries.desc1 = Haack\u7ea7\u6570\u5934\u9525\u7528\u4e8e\u6700\u5c0f\u5316\u963b\u529b, \u5f62\u72b6\u53c2\u65700\u4ea7\u751fLD-Haack\u6216\u8005\u51af\u5361\u95e8\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u76f4\u5f84\u963b\u529b\u6700\u5c0f; \u5f62\u72b6\u53c2\u65700.333\u4ea7\u751fLV-Haack\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u4f53\u79ef\u963b\u529b\u6700\u5c0f. -Shape.Haackseries.desc2 = Haack\u7ea7\u6570\u5934\u9525\u7528\u4e8e\u6700\u5c0f\u5316\u963b\u529b, \u5f62\u72b6\u53c2\u65700\u4ea7\u751fLD-Haack\u6216\u8005\u51af\u5361\u95e8\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u76f4\u5f84\u963b\u529b\u6700\u5c0f; \u5f62\u72b6\u53c2\u65700.333\u4ea7\u751fLV-Haack\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u4f53\u79ef\u963b\u529b\u6700\u5c0f. - - -! RocketComponent -RocketComponent.Position.TOP = \u7236\u7ec4\u4ef6\u9876\u90e8 -RocketComponent.Position.MIDDLE = \u7236\u7ec4\u4ef6\u4e2d\u90e8 -RocketComponent.Position.BOTTOM = \u7236\u7ec4\u4ef6\u5e95\u90e8 -RocketComponent.Position.AFTER = \u7236\u7ec4\u4ef6\u4e4b\u540e -RocketComponent.Position.ABSOLUTE = \u5934\u9525\u5c16\u7aef - -! LaunchLug -LaunchLug.Launchlug = \u53d1\u5c04\u8854\u5957 -! NoseCone -NoseCone.NoseCone = \u5934\u9525 -! Transition -Transition.Transition = \u7ea7\u95f4\u6bb5 -!Stage -Stage.Stage = \u706b\u7bad\u7ea7 - -Stage.SeparationEvent.UPPER_IGNITION = \u4e0a\u7ea7\u53d1\u52a8\u673a\u70b9\u706b -Stage.SeparationEvent.IGNITION = \u672c\u7ea7\u53d1\u52a8\u673a\u70b9\u706b -Stage.SeparationEvent.BURNOUT = \u672c\u7ea7\u53d1\u52a8\u673a\u71c3\u5c3d -Stage.SeparationEvent.EJECTION = \u672c\u7ea7\u5f39\u5c04 -Stage.SeparationEvent.LAUNCH = \u53d1\u5c04 -Stage.SeparationEvent.NEVER = \u4ece\u4e0d - -! BodyTube -BodyTube.BodyTube = \u7bad\u4f53 -! TubeCoupler -TubeCoupler.TubeCoupler = \u8fde\u63a5\u5668 -!InnerTube -InnerTube.InnerTube = \u5185\u7ba1 -! TrapezoidFinSet -TrapezoidFinSet.TrapezoidFinSet = \u68af\u5f62\u7a33\u5b9a\u7ffc -! FreeformFinSet -FreeformFinSet.FreeformFinSet = \u81ea\u7531\u66f2\u9762\u7a33\u5b9a\u7ffc -! TubeFinSEt -TubeFinSet.TubeFinSet = \u7ba1\u5f62\u7ffc -!MassComponent -MassComponent.MassComponent = \u8d28\u91cf\u7ec4\u4ef6 -MassComponent.Altimeter = \u9ad8\u5ea6\u8ba1 -MassComponent.FlightComputer = \u98de\u63a7 -MassComponent.DeploymentCharge = \u5f00\u4f1e\u836f -MassComponent.Tracker = \u8ffd\u8e2a\u5668 -MassComponent.Payload = \u6709\u6548\u8f7d\u8377 -MassComponent.RecoveryHardware = \u56de\u6536\u8bbe\u5907 -MassComponent.Battery = \u7535\u6c60 -! Parachute -Parachute.Parachute = \u964d\u843d\u4f1e -! ShockCord -ShockCord.ShockCord = \u51cf\u9707\u7d22 -! Bulkhead -Bulkhead.Bulkhead = \u9694\u677f -! CenteringRing -CenteringRing.CenteringRing = \u4e2d\u5fc3\u73af -! EngineBlock -EngineBlock.EngineBlock = \u53d1\u52a8\u673a\u5757 -! Streamer -Streamer.Streamer = \u5f69\u5e26 -! Sleeve -Sleeve.Sleeve = \u5c01\u5957 - -!Rocket -Rocket.motorCount.Nomotor = [\u65e0\u53d1\u52a8\u673a] -Rocket.motorCount.noStageMotors = [\u65e0\u5206\u7ea7\u53d1\u52a8\u673a] -Rocket.compname.Rocket = \u706b\u7bad - -!MotorMount -MotorMount.IgnitionEvent.AUTOMATIC = \u81ea\u52a8 (\u53d1\u5c04\u6216\u5f39\u5c04) -MotorMount.IgnitionEvent.LAUNCH = \u53d1\u5c04 -MotorMount.IgnitionEvent.EJECTION_CHARGE = \u524d\u7ea7\u7b2c\u4e00\u6b21\u5f39\u5c04 -MotorMount.IgnitionEvent.BURNOUT = \u524d\u7ea7\u7b2c\u4e00\u6b21\u71c3\u5c3d -MotorMount.IgnitionEvent.NEVER = \u4ece\u4e0d - -MotorMount.IgnitionEvent.short.AUTOMATIC = \u81ea\u52a8 -MotorMount.IgnitionEvent.short.LAUNCH = \u53d1\u5c04 -MotorMount.IgnitionEvent.short.EJECTION_CHARGE = \u5f39\u5c04 -MotorMount.IgnitionEvent.short.BURNOUT = \u70e7\u5c3d -MotorMount.IgnitionEvent.short.NEVER = \u4ece\u4e0d - - -!ComponentIcons -ComponentIcons.Nosecone = \u5934\u9525 -ComponentIcons.Bodytube = \u7bad\u4f53 -ComponentIcons.Transition = \u7ea7\u95f4\u6bb5 -ComponentIcons.Trapezoidalfinset = \u68af\u5f62\u7a33\u5b9a\u7ffc -ComponentIcons.Ellipticalfinset = \u692d\u5706\u7a33\u5b9a\u7ffc -ComponentIcons.Freeformfinset = \u66f2\u9762\u7a33\u5b9a\u7ffc -ComponentIcons.Tubefinset = \u7ba1\u5f62\u7ffc -ComponentIcons.Launchlug = \u53d1\u5c04\u8854\u5957 -ComponentIcons.Innertube = \u5185\u7ba1 -ComponentIcons.Tubecoupler = \u8fde\u63a5\u5668 -ComponentIcons.Centeringring = \u4e2d\u5fc3\u73af -ComponentIcons.Bulkhead = \u9694\u677f -ComponentIcons.Engineblock = \u53d1\u52a8\u673a -ComponentIcons.Parachute = \u964d\u843d\u4f1e -ComponentIcons.Streamer = \u98d8\u5e26 -ComponentIcons.Shockcord = \u51cf\u9707\u7d22 -ComponentIcons.Masscomponent = \u8d28\u91cf\u7ec4\u4ef6 -ComponentIcons.disabled = (\u5df2\u7981\u7528) -ComponentIcons.Altimeter = \u9ad8\u5ea6\u8ba1 -ComponentIcons.Flightcomputer = \u98de\u63a7 -ComponentIcons.Battery = \u7535\u6c60 -ComponentIcons.Tracker = \u8ddf\u8e2a\u5668 -ComponentIcons.Recoveryhardware = \u56de\u6536\u8bbe\u5907 -ComponentIcons.Payload = \u6709\u6548\u8f7d\u8377 -ComponentIcons.Deploymentcharge = \u5f00\u4f1e\u836f - -! StageAction -StageAction.Stage = \u7ea7 - -! RecoveryDevice -RecoveryDevice.DeployEvent.LAUNCH = \u53d1\u5c04 (\u52a0 NN \u79d2) -RecoveryDevice.DeployEvent.EJECTION = \u672c\u7ea7\u7b2c\u4e00\u6b21\u5f39\u5c04 -RecoveryDevice.DeployEvent.APOGEE = \u6700\u9ad8\u70b9 -RecoveryDevice.DeployEvent.ALTITUDE = \u6307\u5b9a\u4e0b\u964d\u9ad8\u5ea6 -RecoveryDevice.DeployEvent.CURRENT_STAGE_SEPARATION = \u5f53\u524d\u7ea7\u95f4\u5206\u79bb -RecoveryDevice.DeployEvent.LOWER_STAGE_SEPARATION = \u6b21\u7ea7\u7ea7\u95f4\u5206\u79bb -RecoveryDevice.DeployEvent.NEVER = \u4ece\u4e0d - -RecoveryDevice.DeployEvent.short.LAUNCH = \u53d1\u5c04 -RecoveryDevice.DeployEvent.short.EJECTION = \u5f39\u5c04 -RecoveryDevice.DeployEvent.short.APOGEE = \u6700\u9ad8\u70b9 -RecoveryDevice.DeployEvent.short.ALTITUDE = \u9ad8\u5ea6 -RecoveryDevice.DeployEvent.short.CURRENT_STAGE_SEPARATION = \u5f53\u524d\u7ea7\u95f4\u5206\u79bb -RecoveryDevice.DeployEvent.short.LOWER_STAGE_SEPARATION = \u6b21\u7ea7\u7ea7\u95f4\u5206\u79bb -RecoveryDevice.DeployEvent.short.NEVER = \u4ece\u4e0d - - -! FlightEvent -FlightEvent.Type.LAUNCH = \u53d1\u5c04 -FlightEvent.Type.IGNITION = \u53d1\u52a8\u673a\u70b9\u706b -FlightEvent.Type.LIFTOFF = \u8d77\u98de -FlightEvent.Type.LAUNCHROD = \u79bb\u67b6 -FlightEvent.Type.BURNOUT = \u53d1\u52a8\u673a\u70e7\u5c3d -FlightEvent.Type.EJECTION_CHARGE = \u5f39\u5c04 -FlightEvent.Type.STAGE_SEPARATION = \u7ea7\u95f4\u5206\u79bb -FlightEvent.Type.APOGEE = \u6700\u9ad8\u70b9 -FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT = \u56de\u6536\u88c5\u7f6e\u542f\u52a8 -FlightEvent.Type.GROUND_HIT = \u7740\u5730 -FlightEvent.Type.SIMULATION_END = \u4eff\u771f\u7ed3\u675f -FlightEvent.Type.ALTITUDE = \u9ad8\u5ea6\u53d8\u5316 -FlightEvent.Type.TUMBLE = \u7ffb\u6eda -FlightEvent.Type.EXCEPTION = \u5f02\u5e38 - -! ThrustCurveMotorColumns -TCurveMotorCol.MANUFACTURER = \u5236\u9020\u5546 -TCurveMotorCol.DESIGNATION = \u540d\u79f0 -TCurveMotorCol.TYPE = \u7c7b\u578b -TCurveMotorCol.DIAMETER = \u76f4\u5f84 -TCurveMotorCol.LENGTH = \u957f\u5ea6 -TCurveMotorCol.TOTAL_IMPULSE = \u603b\u51b2 - -TCurveMotor.ttip.diameter = \u76f4\u5f84: -TCurveMotor.ttip.length = \u957f\u5ea6: -TCurveMotor.ttip.maxThrust = \u6700\u5927\u63a8\u529b: -TCurveMotor.ttip.avgThrust = \u5e73\u5747\u63a8\u529b: -TCurveMotor.ttip.burnTime = \u71c3\u70e7\u65f6\u95f4: -TCurveMotor.ttip.totalImpulse = \u603b\u51b2\u529b: -TCurveMotor.ttip.launchMass = \u53d1\u5c04\u8d28\u91cf: -TCurveMotor.ttip.emptyMass = \u71c3\u5c3d\u8d28\u91cf: - -! RocketInfo -RocketInfo.lengthLine.Length = \u957f\u5ea6 -RocketInfo.lengthLine.maxdiameter = , \u6700\u5927\u76f4\u5f84 -RocketInfo.massWithMotors = \u542b\u53d1\u52a8\u673a\u7684\u603b\u8d28\u91cf -RocketInfo.massWithoutMotors = \u4e0d\u542b\u53d1\u52a8\u673a\u7684\u51c0\u8d28\u91cf -RocketInfo.at = \u4f4d\u7f6e(\u7c73) -RocketInfo.cgText = CG(\u91cd\u5fc3): -RocketInfo.cpText = CP(\u538b\u5fc3): -RocketInfo.stabText = \u7a33\u5b9a\u6027: -RocketInfo.Warning = \u8b66\u544a: -RocketInfo.Calculating = \u8ba1\u7b97\u4e2d... -RocketInfo.Apogee = \u6700\u9ad8\u70b9: -RocketInfo.Maxvelocity = \u6700\u5927\u901f\u5ea6: -RocketInfo.Maxacceleration = \u6700\u5927\u52a0\u901f\u5ea6: -RocketInfo.apogeeValue = N/A -RocketInfo.Mach = (\u9a6c\u8d6b -RocketInfo.velocityValue = N/A -RocketInfo.accelerationValue = N/A - -! FinSet -FinSet.CrossSection.SQUARE = \u77e9\u5f62 -FinSet.CrossSection.ROUNDED = \u5706\u5f62 -FinSet.CrossSection.AIRFOIL = \u7ffc\u578b -FinSet.TabRelativePosition.FRONT = \u7ffc\u6839\u5f26\u524d\u7f18 -FinSet.TabRelativePosition.CENTER = \u7ffc\u6839\u5f26\u4e2d\u70b9 -FinSet.TabRelativePosition.END = \u7ffc\u6839\u5f26\u540e\u7f18 - -! FlightDataType -FlightDataType.TYPE_TIME = \u65f6\u95f4 -FlightDataType.TYPE_ALTITUDE = \u9ad8\u5ea6 -FlightDataType.TYPE_VELOCITY_Z = \u5782\u76f4\u901f\u5ea6 -FlightDataType.TYPE_ACCELERATION_Z = \u5782\u76f4\u52a0\u901f\u5ea6 -FlightDataType.TYPE_VELOCITY_TOTAL = \u603b\u901f\u5ea6 -FlightDataType.TYPE_ACCELERATION_TOTAL = \u603b\u52a0\u901f\u5ea6 -FlightDataType.TYPE_POSITION_X = \u8fce\u98ce\u4f4d\u7f6e -FlightDataType.TYPE_POSITION_Y = \u5e73\u884c\u98ce\u4f4d\u7f6e -FlightDataType.TYPE_POSITION_XY = \u6a2a\u5411\u8de8\u8ddd -FlightDataType.TYPE_POSITION_DIRECTION = \u6c34\u5e73\u65b9\u5411 -FlightDataType.TYPE_VELOCITY_XY = \u6a2a\u5411\u901f\u5ea6 -FlightDataType.TYPE_ACCELERATION_XY = \u6a2a\u5411\u52a0\u901f\u5ea6 -FlightDataType.TYPE_AOA = \u653b\u89d2 -FlightDataType.TYPE_ROLL_RATE = \u6eda\u8f6c\u89d2\u901f\u5ea6 -FlightDataType.TYPE_PITCH_RATE = \u4fef\u4ef0\u89d2\u901f\u5ea6 -FlightDataType.TYPE_YAW_RATE = \u504f\u822a\u89d2\u901f\u5ea6 -FlightDataType.TYPE_MASS = \u8d28\u91cf -FlightDataType.TYPE_PROPELLANT_MASS = \u63a8\u8fdb\u5242\u8d28\u91cf -FlightDataType.TYPE_LONGITUDINAL_INERTIA = \u7eb5\u5411\u8f6c\u52a8\u60ef\u91cf -FlightDataType.TYPE_ROTATIONAL_INERTIA = \u6a2a\u5411\u8f6c\u52a8\u60ef\u91cf -FlightDataType.TYPE_CP_LOCATION = CP \u538b\u5fc3\u4f4d\u7f6e -FlightDataType.TYPE_CG_LOCATION = CG \u91cd\u5fc3\u4f4d\u7f6e -FlightDataType.TYPE_STABILITY = \u7a33\u5b9a\u88d5\u91cf -FlightDataType.TYPE_MACH_NUMBER = \u9a6c\u8d6b\u6570 -FlightDataType.TYPE_REYNOLDS_NUMBER = \u96f7\u8bfa\u6570 -FlightDataType.TYPE_THRUST_FORCE = \u63a8\u529b -FlightDataType.TYPE_DRAG_FORCE = \u963b\u529b -FlightDataType.TYPE_DRAG_COEFF = \u963b\u529b\u7cfb\u6570 -FlightDataType.TYPE_AXIAL_DRAG_COEFF = \u8f74\u5411\u963b\u529b\u7cfb\u6570 -FlightDataType.TYPE_FRICTION_DRAG_COEFF = \u6469\u64e6\u963b\u529b\u7cfb\u6570 -FlightDataType.TYPE_PRESSURE_DRAG_COEFF = \u538b\u5dee\u963b\u529b\u7cfb\u6570 -FlightDataType.TYPE_BASE_DRAG_COEFF = \u57fa\u51c6\u963b\u529b\u7cfb\u6570 -FlightDataType.TYPE_NORMAL_FORCE_COEFF = \u6cd5\u5411\u529b\u7cfb\u6570 -FlightDataType.TYPE_PITCH_MOMENT_COEFF = \u4fef\u4ef0\u529b\u77e9\u7cfb\u6570 -FlightDataType.TYPE_YAW_MOMENT_COEFF = \u504f\u822a\u529b\u77e9\u7cfb\u6570 -FlightDataType.TYPE_SIDE_FORCE_COEFF = \u4fa7\u5411\u529b\u7cfb\u6570 -FlightDataType.TYPE_ROLL_MOMENT_COEFF = \u6eda\u8f6c\u529b\u77e9\u7cfb\u6570 -FlightDataType.TYPE_ROLL_FORCING_COEFF = \u6eda\u8f6c\u529b\u7cfb\u6570 -FlightDataType.TYPE_ROLL_DAMPING_COEFF = \u6eda\u8f6c\u963b\u5c3c\u7cfb\u6570 -FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF = \u4fef\u4ef0\u963b\u5c3c\u7cfb\u6570 -FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF = \u504f\u822a\u963b\u5c3c\u7cfb\u6570 -FlightDataType.TYPE_REFERENCE_LENGTH = \u53c2\u8003\u957f\u5ea6 -FlightDataType.TYPE_REFERENCE_AREA = \u53c2\u8003\u9762\u79ef -FlightDataType.TYPE_ORIENTATION_THETA = \u5782\u76f4\u65b9\u5411 (\u5929\u9876\u89d2) -FlightDataType.TYPE_ORIENTATION_PHI = \u6c34\u5e73\u65b9\u5411 (\u65b9\u4f4d\u89d2) -FlightDataType.TYPE_WIND_VELOCITY = \u98ce\u901f -FlightDataType.TYPE_AIR_TEMPERATURE = \u7a7a\u6c14\u6e29\u5ea6 -FlightDataType.TYPE_AIR_PRESSURE = \u7a7a\u6c14\u538b\u529b -FlightDataType.TYPE_SPEED_OF_SOUND = \u97f3\u901f -FlightDataType.TYPE_TIME_STEP = \u6a21\u62df\u65f6\u95f4\u6b65 -FlightDataType.TYPE_COMPUTATION_TIME = \u8ba1\u7b97\u65f6\u95f4 -FlightDataType.TYPE_LATITUDE = \u7eac\u5ea6 -FlightDataType.TYPE_LONGITUDE = \u7ecf\u5ea6 -FlightDataType.TYPE_CORIOLIS_ACCELERATION = \u79d1\u91cc\u5965\u5229\u52a0\u901f\u5ea6 -FlightDataType.TYPE_GRAVITY = \u91cd\u529b\u52a0\u901f\u5ea6 - -! PlotConfiguration -PlotConfiguration.Verticalmotion = \u5782\u76f4\u8fd0\u52a8 vs. \u65f6\u95f4 -PlotConfiguration.Totalmotion = \u603b\u4f53\u4f4d\u79fb vs. \u65f6\u95f4 -PlotConfiguration.Flightside = \u98de\u884c\u4fa7\u89c6\u5256\u9762 -PlotConfiguration.Stability = \u7a33\u5b9a\u6027 vs. \u65f6\u95f4 -PlotConfiguration.Dragcoef = \u963b\u529b\u7cfb\u6570 vs. \u9a6c\u8d6b\u6570 -PlotConfiguration.Rollcharacteristics = \u6eda\u8f6c\u7279\u5f81 -PlotConfiguration.Angleofattack = \u653b\u89d2\u548c\u65b9\u5411 vs. \u65f6\u95f4 -PlotConfiguration.Simulationtime = \u6a21\u62df\u65f6\u95f4\u6b65\u957f vs. \u8ba1\u7b97\u65f6\u95f4 -PlotConfiguration.Groundtrack = \u5730\u9762\u822a\u8ff9 - -! Warning -Warning.LargeAOA.str1 = \u653b\u89d2\u592a\u5927. -Warning.LargeAOA.str2 = \u653b\u89d2\u592a\u5927 ( -Warning.DISCONTINUITY = \u7bad\u4f53\u76f4\u5f84\u4e0d\u8fde\u7eed. -Warning.THICK_FIN = \u539a\u7ffc\u6a21\u578b\u53ef\u80fd\u4e0d\u51c6\u786e. -Warning.JAGGED_EDGED_FIN = \u952f\u9f7f\u7ffc\u9884\u6d4b\u53ef\u80fd\u4e0d\u51c6\u786e. -Warning.LISTENERS_AFFECTED = \u76d1\u542c\u5668\u4fee\u6539\u4e86\u98de\u884c\u4eff\u771f -Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = \u5728\u5f15\u64ce\u4ecd\u7136\u5de5\u4f5c\u7684\u65f6\u5019\u56de\u6536\u8bbe\u5907\u6253\u5f00. -Warning.FILE_INVALID_PARAMETER = \u65e0\u6548\u53c2\u6570, \u5ffd\u7565. -Warning.PARALLEL_FINS = \u592a\u591a\u5e73\u884c\u7684\u5c3e\u7ffc -Warning.SUPERSONIC = \u8d85\u97f3\u901f\u73af\u5883\u4e0b\u7684\u8ba1\u7b97\u7ed3\u679c\u53ef\u80fd\u4e0d\u51c6\u786e. -Warning.RECOVERY_LAUNCH_ROD = \u56de\u6536\u88c5\u7f6e\u5728\u53d1\u5c04\u67b6\u4e0a\u89e6\u53d1. -Warning.RECOVERY_HIGH_SPEED = \u56de\u6536\u88c5\u7f6e\u5206\u79bb\u65f6\u901f\u5ea6\u592a\u9ad8 -Warning.TUMBLE_UNDER_THRUST = \u706b\u7bad\u7ea7\u5728\u63a8\u529b\u4f5c\u7528\u4e0b\u5f00\u59cb\u503e\u8986. - - -! Scale dialog -ScaleDialog.lbl.scaleRocket = \u6574\u4e2a\u706b\u7bad -ScaleDialog.lbl.scaleSubselection = \u9009\u4e2d\u7ec4\u4ef6\u53ca\u6240\u6709\u5b50\u7ec4\u4ef6 -ScaleDialog.lbl.scaleSelection = \u4ec5\u9009\u4e2d\u7ec4\u4ef6 -ScaleDialog.title = \u7f29\u653e -ScaleDialog.lbl.scale = \u7f29\u653e: -ScaleDialog.lbl.scale.ttip = \u9009\u62e9\u7f29\u653e\u6574\u4e2a\u8bbe\u8ba1\u56fe\u6216\u4ec5\u7f29\u653e\u9009\u4e2d\u7ec4\u4ef6 -ScaleDialog.lbl.scaling = \u7f29\u653e\u6bd4\u4f8b: -ScaleDialog.lbl.scaling.ttip = \u5927\u4e8e100%\u8868\u793a\u653e\u5927, \u5c0f\u4e8e100%\u8868\u793a\u7f29\u5c0f. -! The scaleFrom/scaleTo pair creates a phrase "Scale from [...] to [...]" -ScaleDialog.lbl.scaleFrom = \u7f29\u653e\u81ea -ScaleDialog.lbl.scaleTo = \u5230 -ScaleDialog.lbl.scaleFromTo.ttip = \u6839\u636e\u539f\u59cb\u5927\u5c0f\u548c\u76ee\u6807\u5927\u5c0f\u786e\u5b9a\u7f29\u653e\u6bd4\u4f8b. -ScaleDialog.checkbox.scaleMass = \u66f4\u65b0\u8d28\u91cf\u503c -ScaleDialog.checkbox.scaleMass.ttip = \u6839\u636e\u539f\u59cb\u7f29\u653e\u503c, \u7acb\u65b9\u5173\u7cfb\u7f29\u653e\u7ec4\u4ef6\u8d28\u91cf -ScaleDialog.button.scale = \u7f29\u653e -ScaleDialog.undo.scaleRocket = \u7f29\u653e\u706b\u7bad -ScaleDialog.undo.scaleComponent = \u7f29\u653e\u5355\u4e2a\u7ec4\u4ef6 -ScaleDialog.undo.scaleComponents = \u7f29\u653e\u591a\u4e2a\u7ec4\u4ef6 - -!icons -Icons.Undo = \u64a4\u9500 -Icons.Redo = \u91cd\u505a - -OpenRocketPrintable.Partsdetail = \u90e8\u4ef6\u4fe1\u606f -OpenRocketPrintable.Fintemplates = \u5c3e\u7ffc\u6a21\u677f -OpenRocketPrintable.Transitiontemplates = \u7ea7\u95f4\u6bb5\u6a21\u677f -OpenRocketPrintable.Noseconetemplates = \u5934\u9525\u6a21\u677f -OpenRocketPrintable.Finmarkingguide = \u5c3e\u7ffc\u5236\u4f5c\u5411\u5bfc -OpenRocketPrintable.DesignReport = \u8bbe\u8ba1\u62a5\u544a -OpenRocketPrintable.Centeringringtemplates = \u4e2d\u5fc3\u73af\u6a21\u677f - -OpenRocketDocument.Redo = \u64a4\u9500 -OpenRocketDocument.Undo = \u91cd\u505a - -!EllipticalFinSet -EllipticalFinSet.Ellipticalfinset = \u692d\u5706\u7a33\u5b9a\u7ffc - -! Optimization - -! Modifiers - -optimization.modifier.nosecone.length = \u957f\u5ea6 -optimization.modifier.nosecone.length.desc = \u4f18\u5316\u5934\u9525\u957f\u5ea6. -optimization.modifier.nosecone.diameter = \u76f4\u5f84 -optimization.modifier.nosecone.diameter.desc = \u4f18\u5316\u5934\u9525\u76f4\u5f84. -optimization.modifier.nosecone.thickness = \u539a\u5ea6 -optimization.modifier.nosecone.thickness.desc = \u4f18\u5316\u5934\u9525\u58c1\u539a\u5ea6. -optimization.modifier.nosecone.shapeparameter = \u5916\u5f62\u53c2\u6570 -optimization.modifier.nosecone.shapeparameter.desc = \u4f18\u5316\u5934\u9525\u5916\u5f62\u53c2\u6570. - -optimization.modifier.transition.length = \u957f\u5ea6 -optimization.modifier.transition.length.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u957f\u5ea6. -optimization.modifier.transition.forediameter = \u524d\u76f4\u5f84 -optimization.modifier.transition.forediameter.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u524d\u76f4\u5f84. -optimization.modifier.transition.aftdiameter = \u540e\u76f4\u5f84 -optimization.modifier.transition.aftdiameter.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u540e\u76f4\u5f84. -optimization.modifier.transition.thickness = \u539a\u5ea6 -optimization.modifier.transition.thickness.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u58c1\u539a\u5ea6. -optimization.modifier.transition.shapeparameter = \u5916\u5f62\u53c2\u6570 -optimization.modifier.transition.shapeparameter.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u5916\u5f62\u53c2\u6570. - -optimization.modifier.bodytube.length = \u957f\u5ea6 -optimization.modifier.bodytube.length.desc = \u4f18\u5316\u7bad\u4f53\u957f\u5ea6. -optimization.modifier.bodytube.outerDiameter = \u5916\u76f4\u5f84 -optimization.modifier.bodytube.outerDiameter.desc = \u4f18\u5316\u7bad\u7b52\u5916\u76f4\u5f84, \u540c\u65f6\u4fdd\u6301\u58c1\u539a\u5ea6\u4e0d\u53d8. -optimization.modifier.bodytube.thickness = \u539a\u5ea6 -optimization.modifier.bodytube.thickness.desc = \u4f18\u5316\u7bad\u7b52\u58c1\u539a\u5ea6. - -optimization.modifier.trapezoidfinset.rootChord = \u7ffc\u6839\u5f26 -optimization.modifier.trapezoidfinset.rootChord.desc = \u4f18\u5316\u7ffc\u6839\u5f26\u957f\u5ea6 (\u7a33\u5b9a\u7ffc\u4e0e\u7bad\u4f53\u76f8\u63a5\u7684\u8fb9\u7684\u957f\u5ea6). -optimization.modifier.trapezoidfinset.tipChord = \u7ffc\u68a2\u5f26 -optimization.modifier.trapezoidfinset.tipChord.desc = \u4f18\u5316\u7ffc\u68a2\u5f26\u957f\u5ea6 (\u7a33\u5b9a\u7ffc\u5916\u7f18\u957f\u5ea6). -optimization.modifier.trapezoidfinset.sweep = \u63a0\u7ffc -optimization.modifier.trapezoidfinset.sweep.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u63a0\u7ffc\u957f\u5ea6 (\u63a0\u7ffc\u524d\u7f18\u5411\u540e\u4f38\u5c55\u7684\u957f\u5ea6). -optimization.modifier.trapezoidfinset.height = \u9ad8\u5ea6 -optimization.modifier.trapezoidfinset.height.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u9ad8\u5ea6 (\u534a\u7ffc\u5c55). - -optimization.modifier.ellipticalfinset.length = \u7ffc\u6839\u5f26 -optimization.modifier.ellipticalfinset.length.desc = \u4f18\u5316\u7ffc\u6839\u5f26\u957f\u5ea6. -optimization.modifier.ellipticalfinset.height = \u9ad8\u5ea6 -optimization.modifier.ellipticalfinset.height.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u9ad8\u5ea6 (\u534a\u7ffc\u5c55). - -optimization.modifier.finset.cant = \u9762\u89d2\u89d2\u5ea6 -optimization.modifier.finset.cant.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u9762\u89d2\u89d2\u5ea6. -optimization.modifier.finset.position = \u4f4d\u7f6e -optimization.modifier.finset.position.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u5b89\u88c5\u4e8e\u7bad\u4f53\u7684\u4f4d\u7f6e. - -optimization.modifier.launchlug.length = \u957f\u5ea6 -optimization.modifier.launchlug.length.desc = \u4f18\u5316\u53d1\u5c04\u5bfc\u5411\u7b52\u957f\u5ea6. -optimization.modifier.launchlug.outerDiameter = \u5916\u76f4\u5f84 -optimization.modifier.launchlug.outerDiameter.desc = \u4f18\u5316\u53d1\u5c04\u5bfc\u5411\u7b52\u7684\u5916\u76f4\u5f84. -optimization.modifier.launchlug.thickness = \u539a\u5ea6 -optimization.modifier.launchlug.thickness.desc = \u4f18\u5316\u5bfc\u5411\u7b52\u539a\u5ea6\u4f46\u662f\u4fdd\u6301\u5916\u76f4\u5f84. -optimization.modifier.launchlug.position = \u4f4d\u7f6e -optimization.modifier.launchlug.position.desc = \u4f18\u5316\u5bfc\u5411\u7b52\u5728\u7bad\u4f53\u4e0a\u7684\u4f4d\u7f6e. - - -optimization.modifier.internalcomponent.position = \u4f4d\u7f6e -optimization.modifier.internalcomponent.position.desc = \u4f18\u5316\u7ec4\u4ef6\u76f8\u5bf9\u4e8e\u7236\u7ec4\u4ef6\u7684\u4f4d\u7f6e. - -optimization.modifier.masscomponent.mass = \u8d28\u91cf -optimization.modifier.masscomponent.mass.desc = \u4f18\u5316\u8d28\u91cf\u7ec4\u4ef6. - -optimization.modifier.parachute.diameter = \u76f4\u5f84 -optimization.modifier.parachute.diameter.desc = \u4f18\u5316\u964d\u843d\u4f1e\u4f1e\u8863\u76f4\u5f84. -optimization.modifier.parachute.coefficient = \u963b\u529b\u7cfb\u6570 -optimization.modifier.parachute.coefficient.desc = \u4f18\u5316\u964d\u843d\u4f1e\u963b\u529b\u7cfb\u6570. \u964d\u843d\u4f1e\u963b\u529b\u7cfb\u6570\u4e00\u822c\u4e3a0.8. - -optimization.modifier.streamer.length = \u957f\u5ea6 -optimization.modifier.streamer.length.desc = \u4f18\u5316\u98d8\u5e26\u957f\u5ea6. -optimization.modifier.streamer.width = \u5bbd\u5ea6 -optimization.modifier.streamer.width.desc = \u4f18\u5316\u98d8\u5e26\u5bbd\u5ea6. -optimization.modifier.streamer.aspectRatio = \u957f\u5bbd\u6bd4 -optimization.modifier.streamer.aspectRatio.desc = \u4f18\u5316\u98d8\u5e26\u957f\u5bbd\u6bd4 (\u957f\u5ea6/\u5bbd\u5ea6). \u8be5\u6570\u503c\u4e0d\u80fd\u540c\u65f6\u5e94\u7528\u5728\u957f\u5ea6\u6216\u8005\u5bbd\u5ea6\u4e0a. -optimization.modifier.streamer.coefficient = \u963b\u529b\u7cfb\u6570 -optimization.modifier.streamer.coefficient.desc = \u4f18\u5316\u98d8\u5e26\u963b\u529b\u7cfb\u6570. - -optimization.modifier.recoverydevice.deployDelay = \u6fc0\u53d1\u5ef6\u65f6 -optimization.modifier.recoverydevice.deployDelay.desc = \u4f18\u5316\u56de\u6536\u8bbe\u5907\u6fc0\u53d1\u5ef6\u65f6. -optimization.modifier.recoverydevice.deployAltitude = \u6fc0\u53d1\u9ad8\u5ea6 -optimization.modifier.recoverydevice.deployAltitude.desc = \u4f18\u5316\u56de\u6536\u8bbe\u5907\u6fc0\u53d1\u9ad8\u5ea6. - -optimization.modifier.rocketcomponent.overrideMass = \u8986\u5199\u8d28\u91cf -optimization.modifier.rocketcomponent.overrideMass.desc = \u4f18\u5316\u7ec4\u4ef6\u8986\u5199\u8d28\u91cf. -optimization.modifier.rocketcomponent.overrideCG = \u8986\u5199\u91cd\u5fc3 -optimization.modifier.rocketcomponent.overrideCG.desc = \u4f18\u5316\u7ec4\u4ef6\u8986\u5199\u91cd\u5fc3. - -optimization.modifier.motormount.overhang = \u53d1\u52a8\u673a\u7a81\u51fa -optimization.modifier.motormount.overhang.desc = \u4f18\u5316\u53d1\u52a8\u673a\u7a81\u51fa. -optimization.modifier.motormount.delay = \u53d1\u52a8\u673a\u70b9\u706b\u5ef6\u65f6 -optimization.modifier.motormount.delay.desc = \u4f18\u5316\u53d1\u52a8\u673a\u70b9\u706b\u5ef6\u65f6. - - - - -! General rocket design optimization dialog - -GeneralOptimizationDialog.title = \u706b\u7bad\u4f18\u5316 -GeneralOptimizationDialog.goal.maximize = \u6700\u5927\u503c -GeneralOptimizationDialog.goal.minimize = \u6700\u5c0f\u503c -GeneralOptimizationDialog.goal.seek = \u76ee\u6807\u503c -GeneralOptimizationDialog.btn.start = \u5f00\u59cb\u53c2\u6570\u4f18\u5316 -GeneralOptimizationDialog.btn.stop = \u505c\u6b62\u53c2\u6570\u4f18\u5316 -GeneralOptimizationDialog.lbl.paramsToOptimize = \u4f18\u5316\u53c2\u6570: -GeneralOptimizationDialog.btn.add = \u6dfb\u52a0 -GeneralOptimizationDialog.btn.add.ttip = \u6dfb\u52a0\u9009\u62e9\u53c2\u6570\u5230\u4f18\u5316\u5217\u8868 -GeneralOptimizationDialog.btn.remove = \u79fb\u9664 -GeneralOptimizationDialog.btn.remove.ttip = \u79fb\u9664\u4f18\u5316\u5217\u8868\u4e2d\u7684\u53c2\u6570 -GeneralOptimizationDialog.btn.removeAll = \u79fb\u9664\u6240\u6709 -GeneralOptimizationDialog.btn.removeAll.ttip = \u79fb\u9664\u4f18\u5316\u5217\u8868\u4e2d\u7684\u6240\u6709\u53c2\u6570 -GeneralOptimizationDialog.lbl.availableParams = \u53ef\u7528\u53c2\u6570: -GeneralOptimizationDialog.lbl.optimizationOpts = \u4f18\u5316\u9009\u9879 -GeneralOptimizationDialog.lbl.optimizeSim = \u4f18\u5316\u4eff\u771f: -GeneralOptimizationDialog.lbl.optimizeSim.ttip = \u9009\u62e9\u9700\u8981\u4f18\u5316\u7684\u4eff\u771f -GeneralOptimizationDialog.lbl.optimizeValue = \u4f18\u5316\u6307\u6807: -GeneralOptimizationDialog.lbl.optimizeValue.ttip = \u9009\u62e9\u9700\u8981\u4f18\u5316\u7684\u6307\u6807 -GeneralOptimizationDialog.lbl.optimizeGoal = \u4f18\u5316\u76ee\u6807: -GeneralOptimizationDialog.lbl.optimizeGoal.ttip = \u9009\u62e9\u9700\u8981\u4f18\u5316\u7684\u76ee\u6807 -GeneralOptimizationDialog.lbl.optimizeGoalValue.ttip = \u786e\u5b9a\u76ee\u6807\u503c -GeneralOptimizationDialog.lbl.requireStability = \u7a33\u5b9a\u6027\u9700\u6c42 -GeneralOptimizationDialog.lbl.requireMinStability = \u6700\u5c0f\u7a33\u5b9a\u6027: -GeneralOptimizationDialog.lbl.requireMinStability.ttip = \u9700\u8981\u5b9a\u4e49\u8bbe\u8ba1\u7684\u6700\u5c0f\u9759\u7a33\u5b9a\u6027\u8fb9\u754c -GeneralOptimizationDialog.lbl.requireMaxStability = \u6700\u5927\u7a33\u5b9a\u6027: -GeneralOptimizationDialog.lbl.requireMaxStability.ttip = \u9700\u8981\u5b9a\u4e49\u8bbe\u8ba1\u7684\u6700\u5927\u9759\u7a33\u5b9a\u6027\u8fb9\u754c -GeneralOptimizationDialog.status.bestValue = \u6700\u4f73\u503c: -GeneralOptimizationDialog.status.bestValue.ttip = \u76ee\u524d\u5f97\u5230\u7684\u6700\u4f73\u4f18\u5316\u503c. -GeneralOptimizationDialog.status.stepCount = \u4f18\u5316\u6b65\u6570: -GeneralOptimizationDialog.status.stepCount.ttip = \u5df2\u6267\u884c\u7684\u4f18\u5316\u6b65\u6570. -GeneralOptimizationDialog.status.evalCount = \u8bc4\u4f30\u6b21\u6570: -GeneralOptimizationDialog.status.evalCount.ttip = \u5df2\u6267\u884c\u7684\u8bc4\u4f30\u6b21\u6570. -GeneralOptimizationDialog.status.stepSize = \u6b65\u957f\u5927\u5c0f: -GeneralOptimizationDialog.status.stepSize.ttip = \u76ee\u524d\u4f18\u5316\u6b65\u957f\u5927\u5c0f (\u76f8\u5bf9\u4e8e\u4f18\u5316\u53c2\u6570\u8303\u56f4) -GeneralOptimizationDialog.btn.plotPath = \u7ed8\u5236\u4f18\u5316\u8def\u5f84 -GeneralOptimizationDialog.btn.plotPath.ttip = \u7ed8\u5236\u4f18\u5316\u8def\u5f84 (\u4ec5\u4f7f\u75281\u7ef4\u548c2\u7ef4\u4f18\u5316) -GeneralOptimizationDialog.btn.save = \u4fdd\u5b58\u4f18\u5316\u8def\u5f84 -GeneralOptimizationDialog.btn.save.ttip = \u4fdd\u5b58\u6a21\u62df\u7684\u51fd\u6570\u8ba1\u7b97\u503c\u5230 CSV \u6587\u4ef6. -GeneralOptimizationDialog.btn.apply = \u5e94\u7528\u4f18\u5316 -GeneralOptimizationDialog.btn.apply.ttip = \u5e94\u7528\u4f18\u5316\u7ed3\u679c\u5230\u706b\u7bad\u8bbe\u8ba1\u4e2d -GeneralOptimizationDialog.btn.reset = \u91cd\u7f6e -GeneralOptimizationDialog.btn.reset.ttip = \u91cd\u7f6e\u706b\u7bad\u8bbe\u8ba1\u4e3a\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1 -GeneralOptimizationDialog.btn.close = \u5173\u95ed -GeneralOptimizationDialog.btn.close.ttip = \u5173\u95ed\u7a97\u53e3\u4e0d\u6539\u53d8\u706b\u7bad\u8bbe\u8ba1 -GeneralOptimizationDialog.error.selectParams.text = \u8bf7\u9996\u5148\u9009\u62e9\u53ef\u7528\u4f18\u5316\u53c2\u6570. -GeneralOptimizationDialog.error.selectParams.title = \u786e\u5b9a\u4f18\u5316\u53c2\u6570 -GeneralOptimizationDialog.error.optimizationFailure.text = \u65e0\u6cd5\u8fd0\u884c\u4f18\u5316: -GeneralOptimizationDialog.error.optimizationFailure.title = \u4f18\u5316\u5931\u8d25 -GeneralOptimizationDialog.undoText = \u5e94\u7528\u4f18\u5316 -GeneralOptimizationDialog.basicSimulationName = \u57fa\u672c\u4eff\u771f -GeneralOptimizationDialog.noSimulationName = \u6ca1\u6709\u4eff\u771f -GeneralOptimizationDialog.table.col.parameter = \u53c2\u6570 -GeneralOptimizationDialog.table.col.current = \u76ee\u524d\u503c -GeneralOptimizationDialog.table.col.min = \u6700\u5c0f\u503c -GeneralOptimizationDialog.table.col.max = \u6700\u5927\u503c -GeneralOptimizationDialog.export.header = \u5305\u62ec\u6807\u9898\u884c -GeneralOptimizationDialog.export.header.ttip = \u6807\u9898\u884c\u8bb0\u5f55\u4e86\u6570\u636e\u57df\u63cf\u8ff0. -GeneralOptimizationDialog.export.stability = \u7a33\u5b9a\u6027 - - -! Dialog for plotting optimization results -OptimizationPlotDialog.title = \u4f18\u5316\u7ed3\u679c -OptimizationPlotDialog.lbl.zoomInstructions = \u70b9\u4e2d\u540c\u65f6\u5411\u53f3\u62d6\u52a8\u653e\u5927, \u5411\u5de6\u62d6\u52a8\u7f29\u5c0f -OptimizationPlotDialog.plot1d.title = \u4f18\u5316\u7ed3\u679c -OptimizationPlotDialog.plot1d.series = \u4f18\u5316\u7ed3\u679c -OptimizationPlotDialog.plot2d.title = \u4f18\u5316\u8def\u5f84 -OptimizationPlotDialog.plot2d.path = \u4f18\u5316\u8def\u5f84 -OptimizationPlotDialog.plot2d.evals = \u76ee\u6807\u51fd\u6570\u8ba1\u7b97 -OptimizationPlotDialog.plot.ttip.stability = \u7a33\u5b9a\u6027: -OptimizationPlotDialog.plot.label.optimum = \u6700\u4f18\u503c - -! Optimization parameters -MaximumAltitudeParameter.name = \u6700\u9ad8\u70b9\u9ad8\u5ea6 -MaximumVelocityParameter.name = \u6700\u5927\u901f\u5ea6 -MaximumAccelerationParameter.name = \u6700\u5927\u52a0\u901f\u5ea6 -StabilityParameter.name = \u7a33\u5b9a\u6027 -GroundHitVelocityParameter.name = \u7740\u5730\u901f\u5ea6 -LandingDistanceParameter.name = \u843d\u5730\u8ddd\u79bb -TotalFlightTimeParameter.name = \u603b\u98de\u884c\u65f6\u95f4 -DeploymentVelocityParameter.name = \u964d\u843d\u4f1e\u91ca\u653e\u65f6\u901f\u5ea6 - - -! Compass directions drawn on a compass rose. -CompassRose.lbl.north = N -CompassRose.lbl.east = E -CompassRose.lbl.south = S -CompassRose.lbl.west = W - -! Compass directions with subdirections. These might not be localized even if the directions on the compass rose are. -CompassSelectionButton.lbl.N = N -CompassSelectionButton.lbl.NE = NE -CompassSelectionButton.lbl.E = E -CompassSelectionButton.lbl.SE = SE -CompassSelectionButton.lbl.S = S -CompassSelectionButton.lbl.SW = SW -CompassSelectionButton.lbl.W = W -CompassSelectionButton.lbl.NW = NW - - -SlideShowDialog.btn.next = \u4e0b\u4e00\u9875 -SlideShowDialog.btn.prev = \u4e0a\u4e00\u9875 - -SlideShowLinkListener.error.title = \u6ca1\u6709\u627e\u5230\u76f8\u5173\u6559\u7a0b -SlideShowLinkListener.error.msg = \u5f88\u9057\u61be, \u6240\u9009\u7684\u6559\u7a0b\u8fd8\u672a\u88ab\u64b0\u5199. - -GuidedTourSelectionDialog.title = \u6307\u5bfc\u6559\u7a0b -GuidedTourSelectionDialog.lbl.selectTour = \u9009\u62e9\u6307\u5bfc\u6559\u7a0b: -GuidedTourSelectionDialog.lbl.description = \u6559\u7a0b\u8bf4\u660e: -GuidedTourSelectionDialog.lbl.length = \u5e7b\u706f\u7247\u9875\u6570: -GuidedTourSelectionDialog.btn.start = \u5f00\u59cb\u6559\u7a0b! - - -! Custom Fin BMP Importer -CustomFinImport.button.label = \u5bfc\u5165\u56fe\u7247\u6587\u4ef6 -CustomFinImport.badFinImage = \u65e0\u6548\u5c3e\u7ffc\u56fe\u7247. \u8bf7\u786e\u8ba4\u7a33\u5b9a\u7ffc\u533a\u57df\u4e3a\u6df1\u8272\u5e76\u4e14\u548c\u56fe\u7247\u5e95\u8fb9\u63a5\u58e4. -CustomFinImport.errorLoadingFile = \u6587\u4ef6\u8bfb\u53d6\u9519\u8bef: -CustomFinImport.errorParsingFile = \u89e3\u6790\u5c3e\u7ffc\u56fe\u7247\u662f\u53d1\u751f\u9519\u8bef: -CustomFinImport.undo = \u5bfc\u5165\u66f2\u9762\u7a33\u5b9a\u7ffc\u5f62\u72b6 -CustomFinImport.error.title = \u8bfb\u53d6\u7ffc\u6570\u636e\u51fa\u9519 -CustomFinImport.error.badimage = \u65e0\u6cd5\u4ece\u56fe\u50cf\u63a8\u6d4b\u7a33\u5b9a\u7ffc\u5f62\u72b6. -CustomFinImport.description = \u56fe\u50cf\u5c06\u4f1a\u88ab\u8f6c\u6362\u4e3a\u9ed1\u767d\u56fe\u50cf(\u7a33\u5b9a\u7ffc\u4e3a\u9ed1\u8272\u533a\u57df), \u8bf7\u4fdd\u8bc1\u6df1\u8272\u533a\u57df\u4e3a\u7a33\u5b9a\u7ffc, \u6d45\u8272\u533a\u57df\u4e3a\u80cc\u666f. \u7a33\u5b9a\u7ffc\u5fc5\u987b\u548c\u56fe\u7247\u5e95\u8fb9\u63a5\u58e4\uff0c\u63a5\u89e6\u533a\u57df\u5373\u662f\u7a33\u5b9a\u7ffc\u4e0e\u7bad\u4f53\u7684\u8fde\u63a5\u70b9. - - -PresetModel.lbl.select = \u9009\u62e9\u9884\u8bbe -PresetModel.lbl.database = \u4ece\u6570\u636e\u5e93... - -DecalModel.lbl.select = <\u65e0> -DecalModel.lbl.choose = \u4ece\u6587\u4ef6... - -! Export Decal Dialog -ExportDecalDialog.title = \u5bfc\u51fa\u8d34\u82b1 -ExportDecalDialog.decalList.lbl = \u8d34\u82b1 -ExportDecalDialog.exception = \u65e0\u6cd5\u4fdd\u5b58\u8d34\u82b1\u5230\u6587\u4ef6 ''{0}'' - -! Component Preset Chooser Dialog -ComponentPresetChooserDialog.title = \u9009\u62e9\u7ec4\u4ef6\u9884\u8bbe -ComponentPresetChooserDialog.filter.label = \u6587\u672c\u8fc7\u6ee4: -ComponentPresetChooserDialog.checkbox.filterAftDiameter = \u5339\u914d\u540e\u76f4\u5f84 -ComponentPresetChooserDialog.checkbox.filterForeDiameter = \u5339\u914d\u524d\u76f4\u5f84 -ComponentPresetChooserDialog.menu.sortAsc = \u5347\u5e8f -ComponentPresetChooserDialog.menu.sortDesc = \u964d\u5e8f -ComponentPresetChooserDialog.menu.units = \u5355\u4f4d -ComponentPresetChooserDialog.checkbox.showAllCompatible = \u663e\u793a\u6240\u6709\u517c\u5bb9\u7ec4\u4ef6 -ComponentPresetChooserDialog.lbl.favorites = \u6dfb\u52a0\u5230\u9884\u8bbe\u4e0b\u62c9\u6846 -table.column.Favorite = \u6536\u85cf -table.column.Manufacturer = \u5236\u9020\u5546 -table.column.PartNo = \u578b\u53f7 -table.column.Description = \u7b80\u4ecb -table.column.Type = \u7c7b\u578b -table.column.Length = \u957f -table.column.Width = \u5bbd -table.column.InnerDiameter = \u5185\u76f4\u5f84 -table.column.OuterDiameter = \u5916\u76f4\u5f84 -table.column.AftOuterDiameter = \u524d\u90e8\u5916\u76f4\u5f84 -table.column.AftShoulderLength = \u524d\u90e8\u8fde\u63a5\u5668\u957f\u5ea6 -table.column.AftShoulderDiameter = \u524d\u90e8\u8fde\u63a5\u5668\u76f4\u5f84 -table.column.ForeShoulderLength = \u540e\u90e8\u8fde\u63a5\u5668\u957f\u5ea6 -table.column.ForeShoulderDiameter = \u540e\u90e8\u8fde\u63a5\u5668\u76f4\u5f84 -table.column.ForeOuterDiameter = \u540e\u90e8\u5916\u76f4\u5f84 -table.column.Shape = \u5f62\u72b6 -table.column.Material = \u6750\u6599 -table.column.Finish = \u8868\u9762\u5904\u7406 -table.column.Thickness = \u539a\u5ea6 -table.column.Filled = \u5b9e\u5fc3 -table.column.Mass = \u8d28\u91cf -table.column.Diameter = \u76f4\u5f84 -table.column.Sides = \u8fb9\u957f -table.column.LineCount = \u7ef3\u7d22\u6570\u91cf -table.column.LineLength = \u7ef3\u7d22\u957f\u5ea6 -table.column.LineMaterial = \u7ef3\u7d22\u6750\u6599 - -! Edit Decal Dialog -EditDecalDialog.title = \u7f16\u8f91\u8d34\u82b1 -EditDecalDialog.lbl.prompt = \u8be2\u95ee\u7528\u6237 -EditDecalDialog.lbl.select = \u9009\u62e9\u7f16\u8f91\u5668 -EditDecalDialog.lbl.system = \u4f7f\u7528\u9ed8\u8ba4\u7f16\u8f91\u5668 -EditDecalDialog.lbl.cmdline = \u547d\u4ee4\u884c -EditDecalDialog.lbl.cmdline.help = \u6587\u4ef6\u540d\u5c06\u88ab\u8f6c\u6362\u4e3a ''%%'' -EditDecalDialog.lbl.always = \u603b\u4f7f\u7528\u8fd9\u4e9b\u8bbe\u7f6e -EditDecalDialog.btn.chooser = \u9009\u62e9\u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f -EditDecalHelper.createFileException = \u65e0\u6cd5\u521b\u5efa\u4e34\u65f6\u6587\u4ef6 {0} -EditDecalHelper.launchSystemEditorException = \u65e0\u6cd5\u542f\u52a8\u7cfb\u7edf\u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f -EditDecalHelper.launchCustomEditorException = \u65e0\u6cd5\u6839\u636e\u53c2\u6570 ''{0}'' \u6765\u542f\u52a8\u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f -EditDecalHelper.editPreferencesHelp = \u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f\u53ef\u4ee5\u5728\u9996\u9009\u9879\u4e2d\u4fee\u6539. - -MotorConfigurationPanel.lbl.motorMounts = \u53d1\u52a8\u673a\u5ea7: -MotorConfigurationPanel.lbl.motorConfiguration = \u53d1\u52a8\u673a\u914d\u7f6e: -MotorConfigurationPanel.btn.removeMotor = \u79fb\u9664\u53d1\u52a8\u673a -MotorConfigurationPanel.btn.selectMotor = \u9009\u62e9\u53d1\u52a8\u673a -MotorConfigurationPanel.btn.selectIgnition = \u9009\u62e9\u70b9\u706b -MotorConfigurationPanel.btn.resetIgnition = \u91cd\u7f6e\u70b9\u706b -MotorConfigurationPanel.lbl.nomotors = \u65e0\u53d1\u52a8\u673a\u5ea7.\u8bf7\u5148\u5728\u5de6\u4fa7\u9009\u62e9\u7bad\u4f53\u4f5c\u4e3a\u53d1\u52a8\u673a\u5ea7. - -MotorConfigurationTableModel.table.ignition.default = \u9ed8\u8ba4 ({0}) -RecoveryConfigurationPanel.table.deployment.default = \u9ed8\u8ba4 ({0}) -SeparationConfigurationPanel.table.separation.default = \u9ed8\u8ba4 ({0}) - -IgnitionSelectionDialog.opt.title = \u53d7\u5230\u5f71\u54cd\u7684\u98de\u884c\u914d\u7f6e: -IgnitionSelectionDialog.opt.default = \u6839\u636e\u9ed8\u8ba4\u70b9\u706b\u4e8b\u4ef6\u66f4\u65b0\u6240\u6709\u914d\u7f6e -IgnitionSelectionDialog.opt.override = \u4ec5\u66f4\u65b0 {0} \u98de\u884c\u914d\u7f6e - -DeploymentSelectionDialog.opt.title = \u53d7\u5230\u5f71\u54cd\u7684\u98de\u884c\u914d\u7f6e: -DeploymentSelectionDialog.opt.default = \u6839\u636e\u9ed8\u8ba4\u91ca\u653e\u4e8b\u4ef6\u66f4\u65b0\u6240\u6709\u914d\u7f6e -DeploymentSelectionDialog.opt.override = \u4ec5\u66f4\u65b0 {0} \u98de\u884c\u914d\u7f6e - -SeparationSelectionDialog.opt.title = \u53d7\u5230\u5f71\u54cd\u7684\u98de\u884c\u914d\u7f6e: -SeparationSelectionDialog.opt.default = \u6839\u636e\u9ed8\u8ba4\u5206\u79bb\u4e8b\u4ef6\u66f4\u65b0\u6240\u6709\u914d\u7f6e -SeparationSelectionDialog.opt.override = \u4ec5\u66f4\u65b0 {0} \u98de\u884c\u914d\u7f6e - -MotorConfigurationPanel.description = \u9009\u62e9\u53d1\u52a8\u673a\u4ee5\u53ca\u70b9\u706b\u4e8b\u4ef6\u5e94\u7528\u4e0e\u5f53\u524d\u914d\u7f6e.
\u53d1\u52a8\u673a\u5ea7: \u9009\u62e9\u4f5c\u4e3a\u53d1\u52a8\u673a\u5ea7\u7684\u7ec4\u4ef6.
\u53d1\u52a8\u673a\u914d\u7f6e: \u4e3a\u6bcf\u4e00\u4e2a\u53d1\u52a8\u673a\u5ea7\u9009\u62e9\u53d1\u52a8\u673a\u53ca\u70b9\u706b\u4e8b\u4ef6. - -MotorDescriptionSubstitutor.description = \u914d\u7f6e\u9009\u9879\u4e2d\u7684\u53d1\u52a8\u673a - - -!Photo Panel -PhotoFrame.title = \u7167\u76f8\u9986 -PhotoFrame.desc = \u521b\u5efa\u706b\u7bad\u5199\u5b9e3D\u56fe -PhotoFrame.menu.file.save = \u4fdd\u5b58\u56fe\u50cf... -PhotoFrame.fileFilter.png = PNG\u56fe\u50cf -PhotoFrame.menu.edit.copy = \u590d\u5236\u56fe\u7247 -PhotoFrame.menu.edit.copy.desc = \u590d\u5236\u56fe\u7247\u5230\u526a\u8d34\u677f -PhotoFrame.menu.edit.settings = \u56fe\u50cf\u8bbe\u7f6e -PhotoFrame.menu.window = \u7a97\u53e3 -PhotoFrame.menu.window.size = \u5927\u5c0f -PhotoFrame.menu.window.size.portrait = {0} \u76f8\u7247 - -!Photo Settings -PhotoSettingsConfig.title = \u8bbe\u7f6e -PhotoSettingsConfig.colorChooser.title = \u9009\u8272\u677f - -PhotoSettingsConfig.tab.orientation = \u65b9\u5411 -PhotoSettingsConfig.lbl.rocket = \u706b\u7bad -PhotoSettingsConfig.lbl.pitch = \u503e\u89d2 -PhotoSettingsConfig.lbl.yaw = \u65cb\u89d2 -PhotoSettingsConfig.lbl.roll = \u65cb\u8f6c -PhotoSettingsConfig.lbl.advance = \u9ad8\u7ea7 -PhotoSettingsConfig.lbl.camera = \u76f8\u673a -PhotoSettingsConfig.lbl.vAz = \u89c6\u65b9\u4f4d\u89d2 -PhotoSettingsConfig.lbl.vAlt = \u89c6\u9ad8\u5ea6 -PhotoSettingsConfig.lbl.vDist = \u89c6\u8ddd -PhotoSettingsConfig.lbl.fov = \u89c6\u573a - -PhotoSettingsConfig.tab.environment = \u73af\u5883 -PhotoSettingsConfig.lbl.light = \u5149\u7167 -PhotoSettingsConfig.lbl.sun = \u9633\u5149 -PhotoSettingsConfig.lbl.amb = \u73af\u5883 -PhotoSettingsConfig.lbl.lightAz = \u5149\u7167\u65b9\u4f4d -PhotoSettingsConfig.lbl.lightAlt = \u5149\u7167\u9ad8\u5ea6 -PhotoSettingsConfig.lbl.sky = \u5929\u7a7a -PhotoSettingsConfig.lbl.skyColor = \u5929\u7a7a\u989c\u8272 -PhotoSettingsConfig.lbl.skyImage = \u5929\u7a7a\u56fe\u7247 -PhotoSettingsConfig.lbl.skyCredit = \u56fe\u7247\u6ce8\u89e3 - -PhotoSettingsConfig.tab.effects = \u7279\u6548 -PhotoSettingsConfig.lbl.smokeFlame = \u7130\u70df -PhotoSettingsConfig.lbl.smoke = \u70df\u96fe -PhotoSettingsConfig.lbl.smokeOpacity = \u70df\u900f\u660e\u5ea6 -PhotoSettingsConfig.lbl.flame = \u706b\u7130 -PhotoSettingsConfig.lbl.flameAspect = \u706b\u7130\u5916\u89c2\u89d2\u5ea6 -PhotoSettingsConfig.lbl.sparks = \u706b\u661f -PhotoSettingsConfig.lbl.sparkConcentration = \u706b\u661f\u6d53\u5ea6 -PhotoSettingsConfig.lbl.sparkWeight = \u706b\u661f\u91cd\u91cf -PhotoSettingsConfig.lbl.exhaustScale = \u5c3e\u6c14\u5927\u5c0f -PhotoSettingsConfig.lbl.effects = \u6548\u679c -PhotoSettingsConfig.lbl.speed = \u901f\u5ea6 +# +# Simplified Chinese translation file +# +# Should you need to add new logical keys here is the proposed method +# +# className.ComponentType.componentName +# +# +# Text tokens within braces should not be translated, e.g. +# "The file '{filename}' exists." +# They are pieces that are inserted dynamically. +# + + +! Set to the name of the current translation file (used for debugging purposes) +debug.currentFile = messages_zh_CN.properties + +! RocketActions +RocketActions.checkbox.Donotaskmeagain = \u4e0d\u518d\u63d0\u793a +RocketActions.lbl.Youcanchangedefop = \u4f60\u53ef\u4ee5\u4fee\u6539\u7f3a\u7701\u8bbe\u7f6e +RocketActions.showConfirmDialog.lbl1 = \u5220\u9664\u9009\u5b9a\u4eff\u771f? +RocketActions.showConfirmDialog.lbl2 = \u8be5\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500 +RocketActions.showConfirmDialog.title = \u5220\u9664\u4eff\u771f +RocketActions.DelCompAct.Delete = \u5220\u9664 +RocketActions.DelCompAct.ttip.Delete = \u5220\u9664\u9009\u5b9a\u7ec4\u4ef6 +RocketActions.DelSimuAct.Delete = \u5220\u9664 +RocketActions.DelSimuAct.ttip.Delete = \u5220\u9664\u9009\u5b9a\u4eff\u771f +RocketActions.DelAct.Delete = \u5220\u9664 +RocketActions.DelAct.ttip.Delete = \u5220\u9664\u9009\u5b9a\u90e8\u4ef6\u6216\u4eff\u771f +RocketActions.CutAction.Cut = \u526a\u5207 +RocketActions.CutAction.ttip.Cut = \u526a\u5207\u7ec4\u4ef6\u6216\u4eff\u771f\u5230\u526a\u5207\u677f\uff0c\u5e76\u4ece\u8bbe\u8ba1\u4e2d\u79fb\u9664 +RocketActions.CopyAct.Copy = \u590d\u5236 +RocketActions.CopyAct.ttip.Copy = \u590d\u5236\u7ec4\u4ef6(\u53ca\u5b50\u7ec4\u4ef6)\u5230\u526a\u8d34\u677f +RocketActions.PasteAct.Paste = \u7c98\u8d34 +RocketActions.PasteAct.ttip.Paste = \u5c06\u526a\u8d34\u677f\u91cc\u7684\u90e8\u4ef6\u6216\u4eff\u771f\u7c98\u8d34\u5230\u8be5\u8bbe\u8ba1\u4e2d +RocketActions.EditAct.Edit = \u7f16\u8f91 +RocketActions.EditAct.ttip.Edit = \u7f16\u8f91\u9009\u4e2d\u7ec4\u4ef6 +RocketActions.NewStageAct.Newstage = \u65b0\u5efa\u4e00\u7ea7 +RocketActions.NewStageAct.ttip.Newstage = \u5728\u8bbe\u8ba1\u4e2d\u65b0\u5efa\u4e00\u7ea7 +RocketActions.ActBoosterstage = \u52a9\u63a8\u7ea7 +RocketActions.MoveUpAct.Moveup = \u5411\u4e0a\u79fb\u52a8 +RocketActions.MoveUpAct.ttip.Moveup = \u5411\u4e0a\u79fb\u52a8\u8be5\u90e8\u4ef6 +RocketActions.MoveDownAct.Movedown = \u5411\u4e0b\u79fb\u52a8 +RocketActions.MoveDownAct.ttip.Movedown = \u5411\u4e0b\u79fb\u52a8\u8be5\u90e8\u4ef6 + +! RocketPanel +RocketPanel.FigTypeAct.Sideview = \u4fa7\u89c6\u56fe +RocketPanel.FigTypeAct.Backview = \u540e\u89c6\u56fe +RocketPanel.FigTypeAct.Figure3D = \u4e09\u7ef4\u56fe +RocketPanel.FigTypeAct.Finished = \u4e09\u7ef4\u7cbe\u7ec6\u56fe +RocketPanel.FigTypeAct.Unfinished = \u4e09\u7ef4\u8349\u56fe + + +RocketPanel.lbl.Flightcfg = \u98de\u884c\u914d\u7f6e: +RocketPanel.lbl.infoMessage = \u5355\u51fb\u9009\u62e9    Shift+\u5355\u51fb\u9009\u62e9\u5176\u4ed6    \u53cc\u51fb\u7f16\u8f91    \u5355\u51fb+\u62d6\u52a8\u79fb\u52a8\u7ec4\u4ef6 +RocketPanel.lbl.ViewType = \u89c6\u56fe\u7c7b\u578b: + +! BasicFrame +BasicFrame.tab.Rocketdesign = \u706b\u7bad\u8bbe\u8ba1 +BasicFrame.tab.Flightconfig = \u7ec4\u4ef6\u8bbe\u7f6e +BasicFrame.tab.Flightsim = \u98de\u884c\u4eff\u771f +BasicFrame.title.Addnewcomp = \u6dfb\u52a0\u65b0\u7ec4\u4ef6 +BasicFrame.dlg.lbl1 = \u8bbe\u8ba1\u7a3f ' +BasicFrame.dlg.lbl2 = ' \u5c1a\u672a\u4fdd\u5b58 +BasicFrame.dlg.lbl3 = \u662f\u5426\u4fdd\u5b58? +BasicFrame.dlg.title = \u672a\u4fdd\u5b58 +BasicFrame.StageName.Sustainer = \u4e3b\u53d1\u52a8\u673a +BasicFrame.WarningDialog.txt1 = \u6253\u5f00\u8bbe\u8ba1\u7a3f\u65f6\u53d1\u751f\u4ee5\u4e0b\u95ee\u9898 +BasicFrame.WarningDialog.txt2 = \u90e8\u5206\u8bbe\u8ba1\u5185\u5bb9\u6ca1\u6709\u88ab\u6b63\u786e\u8f7d\u5165 +BasicFrame.WarningDialog.title = \u6253\u5f00\u6587\u4ef6\u65f6\u8b66\u544a + + +! General error messages used in multiple contexts +error.fileExists.title = \u6587\u4ef6\u5df2\u5b58\u5728 +error.fileExists.desc = \u6587\u4ef6 '{filename}' \u5df2\u5b58\u5728\uff0c\u8986\u76d6? + +error.writing.title = \u6587\u4ef6\u5199\u5165\u5931\u8d25 +error.writing.desc = \u4fdd\u5b58\u6587\u4ef6\u65f6\u53d1\u751f\u9519\u8bef: +Configuration.lbl.override = \u8be5\u53c2\u6570\u53ef\u5728\u4e0d\u540c\u7684\u8bbe\u7f6e\u6587\u4ef6\u4e2d\u88ab\u8986\u5199. + + +! Labels used in buttons of dialog windows +# TODO: Rename these to "btn.xxx" +button.ok = \u786e\u5b9a +button.cancel = \u53d6\u6d88 +button.close = \u5173\u95ed + +! Common labels used in buttons of dialog windows +dlg.but.ok = \u786e\u5b9a +dlg.but.cancel = \u53d6\u6d88 +dlg.but.close = \u5173\u95ed + +! General file type names +filetypes.pdf = PDF\u6587\u4ef6(*.pdf) +BasicFrame.SimpleFileFilter1 = \u652f\u6301\u7684\u706b\u7bad\u8bbe\u8ba1\u7a3f(*.ork; *.rkt) +BasicFrame.SimpleFileFilter2 = OpenRocket\u8bbe\u8ba1\u7a3f(*.ork) +BasicFrame.SimpleFileFilter3 = RockSim\u8bbe\u8ba1\u7a3f(*.rkt) +BasicFrame.SimpleFileFilter4 = OpenRocket\u914d\u7f6e(*.orc) +filetypes.images = \u56fe\u50cf\u6587\u4ef6 + + +! About Dialog +AboutDialog.lbl.version = \u7248\u672c +! The texts below provide additional credits for the translation maintainer +! - In AboutDialog.lbl.translation replace "English" with the current language. +! - AboutDialog.lbl.translator is the translator / group name (may be empty) +! - AboutDialog.lbl.translatorWebsite is a URL to the translator / group (may be empty) +! - AboutDialog.lbl.translatorIcon is the file name of an icon under pix/translators/ (may be empty) +AboutDialog.lbl.translation = \u7b80\u4f53\u4e2d\u6587\u7ffb\u8bd1: +AboutDialog.lbl.translator = Yilun Zhu +AboutDialog.lbl.translatorWebsite = http://sa.kechuang.org/ +AboutDialog.lbl.translatorIcon = logoKCSASimplifiedChinese.png + + +! Print dialog +PrintDialog.title = \u6253\u5370/\u5bfc\u51fa +PrintDialog.but.previewAndPrint = \u9884\u89c8 & \u6253\u5370 +PrintDialog.checkbox.showByStage = \u6309\u7ea7\u663e\u793a +PrintDialog.lbl.selectElements = \u9009\u62e9\u4ee5\u4e0b\u5143\u7d20: +printdlg.but.saveaspdf = \u4fdd\u5b58\u4e3aPDF +printdlg.but.preview = \u9884\u89c8 +printdlg.but.settings = \u8bbe\u7f6e +PrintDialog.error.preview.title = \u65e0\u6cd5\u6253\u5f00\u9884\u89c8 +PrintDialog.error.preview.desc1 = \u65e0\u6cd5\u6253\u5f00PDF\u9884\u89c8 +PrintDialog.error.preview.desc2 = \u8bf7\u6539\u7528\"\u4fdd\u5b58\u4e3aPDF\"\u9009\u9879 + +!PrintSettingsDialog +PrintSettingsDialog.title = \u6253\u5370\u8bbe\u7f6e +PrintSettingsDialog.lbl.Templatefillcolor = \u6a21\u677f\u586b\u5145\u8272: +PrintSettingsDialog.lbl.Templatebordercolor = \u6a21\u677f\u80cc\u666f\u8272: +PrintSettingsDialog.lbl.Papersize = \u7eb8\u5f20\u5927\u5c0f: +PrintSettingsDialog.lbl.Paperorientation = \u6253\u5370\u65b9\u5411: +PrintSettingsDialog.but.Reset = \u91cd\u7f6e +PrintSettingsDialog.but.Close = \u5173\u95ed + + +! Bug Report dialog +bugreport.dlg.title = \u9519\u8bef\u62a5\u544a +bugreport.dlg.but.Sendbugreport = \u53d1\u9001\u9519\u8bef\u62a5\u544a +bugreport.dlg.but.Sendbugreport.Ttip = \u81ea\u52a8\u53d1\u9001\u9519\u8bef\u62a5\u544a\u7ed9OpenRocket\u5f00\u53d1\u7ec4 +bugreport.dlg.successmsg1 = \u9519\u8bef\u62a5\u544a\u5df2\u53d1\u9001 +bugreport.dlg.successmsg2 = \u611f\u8c22\u60a8\u5bf9OpenRocket\u7684\u652f\u6301! +bugreport.dlg.successmsg3 = \u9519\u8bef\u62a5\u544a\u5df2\u53d1\u9001 +bugreport.dlg.connectedInternet = \u5982\u679c\u8fde\u63a5\u5230\u4e92\u8054\u7f51,\u70b9\u51fb\u53d1\u9001\u9519\u8bef\u62a5\u544a\u5373\u53ef +bugreport.dlg.otherwise = \u5426\u5219\u8bf7\u5c06\u9519\u8bef\u62a5\u544a\u53d1\u9001\u5230: +bugreport.lbl.Theinformation = \u4ee5\u4e0a\u4fe1\u606f\u53ef\u80fd\u4f1a\u88ab\u5199\u5165\u9519\u8bef\u62a5\u544a\u4e2d. \u8bf7\u786e\u8ba4\u6ca1\u6709\u5305\u542b\u4efb\u4f55\u60a8\u4e0d\u613f\u610f\u516c\u5f00\u7684\u654f\u611f\u4fe1\u606f +bugreport.dlg.failedmsg1 = OpenRocket\u65e0\u6cd5\u53d1\u9001\u9519\u8bef\u62a5\u544a: +bugreport.dlg.failedmsg2 = \u8bf7\u624b\u52a8\u53d1\u9001\u9519\u8bef\u62a5\u544a\u81f3 +bugreport.dlg.failedmsg3 = \u53d1\u9001\u65f6\u53d1\u751f\u9519\u8bef +bugreport.reportDialog.txt = \u60a8\u53ef\u4ee5\u586b\u5199\u5e76\u53d1\u9001\u4ee5\u4e0b\u8868\u683c\u5411OpenRocket\u62a5\u544a\u9519\u8bef
\u60a8\u4e5f\u53ef\u4ee5\u5728OpenRocket\u7f51\u7ad9\u62a5\u544a\u9519\u8bef\u5e76\u9644\u4e0a\u76f8\u5173\u6587\u4ef6 +bugreport.reportDialog.txt2 = \u8bf7\u7b80\u8ff0\u5f53\u5f02\u5e38\u53d1\u751f\u7684\u65f6\u5019\u60a8\u6b63\u5728\u505a\u4ec0\u4e48 +bugreport.dlg.provideDescription = \u8bf7\u9996\u5148\u63d0\u4f9b\u9519\u8bef\u63cf\u8ff0. +bugreport.dlg.provideDescription.title = \u7f3a\u5c11\u9519\u8bef\u63cf\u8ff0 + + +! Debug log dialog +debuglogdlg.but.clear = \u6e05\u7a7a +debuglogdlg.OpenRocketdebuglog = OpenRocket \u8c03\u8bd5\u65e5\u5fd7 +debuglogdlg.Displayloglines = \u663e\u793a\u65e5\u5fd7\u884c: +debuglogdlg.Follow = \u8ddf\u968f +debuglogdlg.col.Time = \u65f6\u95f4 +debuglogdlg.col.Level = \u7ea7\u522b +debuglogdlg.col.Location = \u4f4d\u7f6e +debuglogdlg.col.Message = \u6d88\u606f +debuglogdlg.lbl.Loglinenbr = \u65e5\u5fd7\u884c\u53f7: +debuglogdlg.lbl.Time = \u65f6\u95f4: +debuglogdlg.lbl.Level = \u7ea7\u522b: +debuglogdlg.lbl.Location = \u4f4d\u7f6e: +debuglogdlg.lbl.Logmessage = \u8c03\u8bd5\u4fe1\u606f: +debuglogdlg.lbl.Stacktrace = \u5806\u6808\u8ddf\u8e2a: + + +! MotorChooserDialog +MotorChooserDialog.title = \u9009\u62e9\u706b\u7bad\u53d1\u52a8\u673a + +! Edit Motor configuration dialog +edtmotorconfdlg.col.configuration = \u914d\u7f6e +edtmotorconfdlg.but.Removeconfiguration = \u79fb\u9664 +edtmotorconfdlg.but.Renameconfiguration = \u91cd\u547d\u540d +edtmotorconfdlg.but.Newconfiguration = \u65b0\u5efa +edtmotorconfdlg.but.Copyconfiguration = \u590d\u5236 +edtmotorconfdlg.title.Editmotorconf = \u7f16\u8f91\u98de\u884c\u914d\u7f6e +edtmotorconfdlg.title.Renameconf = \u91cd\u547d\u540d\u98de\u884c\u914d\u7f6e +edtmotorconfdlg.title.Selectdeploymentconf = \u9009\u62e9\u90e8\u7f72\u914d\u7f6e +edtmotorconfdlg.title.Selectignitionconf = \u9009\u62e9\u70b9\u706b\u914d\u7f6e +edtmotorconfdlg.title.Selectseparationconf = \u9009\u62e9\u5206\u79bb\u914d\u7f6e +edtmotorconfdlg.lbl.Selectedconf = \u9009\u62e9\u98de\u884c\u914d\u7f6e: +edtmotorconfdlg.selectcomp = \u6307\u5b9a\u53d1\u52a8\u673a\u5ea7\u7ec4\u4ef6: +edtmotorconfdlg.lbl.Configname = \u914d\u7f6e\u540d\u79f0: +edtmotorconfdlg.lbl.Motortab = \u53d1\u52a8\u673a +edtmotorconfdlg.lbl.Recoverytab = \u56de\u6536 +edtmotorconfdlg.lbl.Stagetab = \u7ea7 +edtmotorconfdlg.tbl.None = \u65e0 +edtmotorconfdlg.tbl.Motorheader = \u53d1\u52a8\u673a +edtmotorconfdlg.tbl.Mountheader = \u53d1\u52a8\u673a\u5ea7 +edtmotorconfdlg.tbl.Ignitionheader = \u70b9\u706b +edtmotorconfdlg.but.Resetdeployment = \u91cd\u7f6e\u5230\u9ed8\u8ba4\u503c +edtmotorconfdlg.but.Selectdeployment = \u9009\u62e9\u90e8\u7f72 +edtmotorconfdlg.tbl.Recoveryheader = \u56de\u6536\u8bbe\u5907 +edtmotorconfdlg.tbl.Deploymentheader = \u90e8\u7f72 +edtmotorconfdlg.but.Resetseparation = \u91cd\u7f6e\u5230\u9ed8\u8ba4\u503c +edtmotorconfdlg.but.Selectseparation = \u9009\u62e9\u8131\u79bb +edtmotorconfdlg.tbl.Stageheader = \u7ea7 +edtmotorconfdlg.tbl.Separationheader = \u5206\u79bb + +! Rename FlightConfiguration Dialog +RenameConfigDialog.title = \u91cd\u547d\u540d\u914d\u7f6e +RenameConfigDialog.lbl.name = \u98de\u884c\u914d\u7f6e\u540d\u79f0: +RenameConfigDialog.but.reset = \u91cd\u7f6e\u5230\u9ed8\u8ba4\u503c + +! Example design dialog +exdesigndlg.but.open = \u6253\u5f00 +exdesigndlg.lbl.Selectexample = \u9009\u62e9\u8303\u4f8b\u8bbe\u8ba1\u7a3f: +exdesigndlg.lbl.Openexampledesign = \u6253\u5f00\u8303\u4f8b\u8bbe\u8ba1\u7a3f +exdesigndlg.lbl.Exampledesignsnotfound = \u8303\u4f8b\u8bbe\u8ba1\u7a3f\u672a\u627e\u5230 +exdesigndlg.lbl.Examplesnotfound = \u8303\u4f8b\u672a\u627e\u5230 + + +! Material edit panel +matedtpan.but.new = \u65b0\u5efa +matedtpan.but.edit = \u7f16\u8f91 +matedtpan.but.delete = \u5220\u9664 +matedtpan.but.revertall = \u6062\u590d\u6240\u6709 +matedtpan.col.Material = \u6750\u6599 +matedtpan.col.Type = \u7c7b\u578b +matedtpan.col.Density = \u5bc6\u5ea6 +matedtpan.col.but.ttip.New = \u65b0\u52a0\u4e00\u79cd\u65b0\u7684\u6750\u6599 +matedtpan.title.Addcustmaterial = \u65b0\u52a0\u81ea\u5b9a\u4e49\u6750\u6599 +matedtpan.but.ttip.edit = \u7f16\u8f91\u5df2\u5b58\u5728\u7684\u6750\u6599 +matedtpan.title.Editmaterial = \u7f16\u8f91\u6750\u6599\u53c2\u6570 +matedtpan.title2.Editmaterial = \u65e0\u6cd5\u4fee\u6539\u5185\u5efa\u6750\u6599 +matedtpan.but.ttip.delete = \u5220\u9664\u81ea\u5b9a\u4e49\u6750\u6599 +matedtpan.but.ttip.revertall = \u5220\u9664\u6240\u6709\u81ea\u5b9a\u4e49\u6750\u6599 +matedtpan.title.Deletealluser-defined = \u5220\u9664\u6240\u6709\u81ea\u5b9a\u4e49\u6750\u6599? +matedtpan.title.Revertall = \u5168\u90e8\u590d\u539f? +matedtpan.lbl.edtmaterials = \u7f16\u8f91\u6750\u6599\u4e0d\u4f1a\u5f71\u54cd\u73b0\u6709\u7684\u706b\u7bad\u8bbe\u8ba1 + +!MaterialModel +MaterialModel.title.Material = \u6750\u6599 +MaterialModel.title.Defcustmat = \u8bbe\u7f6e\u81ea\u5b9a\u4e49\u6750\u6599 + + +! Preference dialog +pref.dlg.but.add = \u6dfb\u52a0 +pref.dlg.but.reset = \u91cd\u7f6e +pref.dlg.but.checknow = \u68c0\u67e5 +pref.dlg.but.openlast = \u5728\u542f\u52a8\u7684\u65f6\u5019\u6253\u5f00\u4e0a\u6b21\u8bbe\u8ba1 +pref.dlg.but.defaultmetric = \u7f3a\u7701\u516c\u5236 +pref.dlg.but.defaultimperial = \u7f3a\u7701\u82f1\u5236 +pref.dlg.title.Preferences = \u9996\u9009\u9879 +pref.dlg.tab.Units = \u5355\u4f4d\u5236 +pref.dlg.tab.Colors = \u663e\u793a: +pref.dlg.tab.Defaultunits = \u7f3a\u7701\u5355\u4f4d +pref.dlg.tab.Materials = \u6750\u6599 +pref.dlg.tab.Custommaterials = \u81ea\u5b9a\u4e49\u6750\u6599 +pref.dlg.tab.Options = \u9009\u9879 +pref.dlg.tab.Design = \u8bbe\u8ba1 +pref.dlg.tab.Simulation = \u4eff\u771f +pref.dlg.tab.Launch = \u53d1\u5c04 +pref.dlg.tab.Miscellaneousoptions = \u6742\u9879 +pref.dlg.lbl.RockSimWarning = \u4fdd\u5b58RockSim\u683c\u5f0f\u65f6\u663e\u793a\u8b66\u544a + +pref.dlg.tab.Graphics = \u56fe\u50cf +pref.dlg.lbl.DecalEditor = \u56fe\u50cf\u7f16\u8f91\u5668 +pref.dlg.opengl.lbl.title = \u4e09\u7ef4\u56fe\u50cf +pref.dlg.opengl.but.enableGL = \u542f\u7528\u4e09\u7ef4\u56fe\u50cf +pref.dlg.opengl.but.enableAA = \u542f\u7528\u53cd\u952f\u9f7f +pref.dlg.opengl.lbl.useFBO = \u79bb\u7ebf\u6e32\u67d3 + +#N/A +pref.dlg.ttip.DefaultMach1 = \u672c\u8bbe\u5b9a\u5c06\u5728\u4e0b\u6b21\u542f\u52a8OpenRocket\u65f6\u751f\u6548.
+#N/A + +pref.dlg.lbl.Positiontoinsert = \u65b0\u7ec4\u4ef6\u63d2\u5165\u4f4d\u7f6e: +pref.dlg.lbl.Confirmdeletion = \u786e\u8ba4\u5220\u9664\u4eff\u771f: +pref.dlg.checkbox.Runsimulations = \u5728\u67e5\u770b\u4eff\u771f\u9762\u677f\u65f6\u91cd\u65b0\u8fd0\u884c\u8fc7\u65f6\u7684\u4eff\u771f\u9879. +pref.dlg.checkbox.Updateestimates = \u5728\u8bbe\u8ba1\u7a97\u53e3\u66f4\u65b0\u9884\u4f30\u7684\u98de\u884c\u53c2\u6570. +pref.dlg.lbl.User-definedthrust = \u81ea\u5b9a\u4e49\u63a8\u529b\u66f2\u7ebf: +pref.dlg.lbl.Windspeed = \u98ce\u901f +pref.dlg.Allthrustcurvefiles = \u652f\u6301\u7684\u63a8\u529b\u66f2\u7ebf\u6587\u4ef6(*.eng; *.rse; *.zip; \u6587\u4ef6\u5939) +pref.dlg.RASPfiles = RASP\u53d1\u52a8\u673a\u6587\u4ef6(*.eng) +pref.dlg.RockSimfiles = RockSim\u53d1\u52a8\u673a\u6587\u4ef6(*.rse) +pref.dlg.ZIParchives = ZIP\u538b\u7f29\u5305(*.zip) +pref.dlg.checkbox.Checkupdates = \u542f\u52a8\u65f6\u68c0\u67e5\u66f4\u65b0 +pref.dlg.ttip.Checkupdatesnow = \u73b0\u5728\u68c0\u67e5\u8f6f\u4ef6\u66f4\u65b0 +pref.dlg.lbl.Selectprefunits = \u8bf7\u9009\u62e9\u5355\u4f4d\u5236: +pref.dlg.lbl.Rocketinfofontsize = \u706b\u7bad\u8bbe\u8ba1\u9762\u677f\u7684\u6587\u5b57\u5927\u5c0f: +pref.dlg.PrefFontSmall = \u5c0f +pref.dlg.PrefFontMedium = \u4e2d +pref.dlg.PrefFontLarge = \u5927 +pref.dlg.lbl.Rocketdimensions = \u706b\u7bad\u5c3a\u5bf8: +pref.dlg.lbl.Linedensity = \u7ebf\u6027\u5bc6\u5ea6: +pref.dlg.lbl.Motordimensions = \u53d1\u52a8\u673a\u5c3a\u5bf8: +pref.dlg.lbl.Surfacedensity = \u8868\u9762\u5bc6\u5ea6: +pref.dlg.lbl.Distance = \u8ddd\u79bb: +pref.dlg.lbl.Bulkdensity = \u4f53\u79ef\u5bc6\u5ea6: +pref.dlg.lbl.Velocity = \u901f\u7387: +pref.dlg.lbl.Surfaceroughness = \u8868\u9762\u7c97\u7cd9\u5ea6: +pref.dlg.lbl.Acceleration = \u52a0\u901f\u5ea6: +pref.dlg.lbl.Area = \u9762\u79ef: +pref.dlg.lbl.Mass = \u8d28\u91cf: +pref.dlg.lbl.Angle = \u89d2\u5ea6: +pref.dlg.lbl.Force = \u529b: +pref.dlg.lbl.Rollrate = \u89d2\u901f\u5ea6: +pref.dlg.lbl.Totalimpulse = \u603b\u51b2\u91cf: +pref.dlg.lbl.Temperature = \u6e29\u5ea6: +pref.dlg.lbl.Momentofinertia = \u8f6c\u52a8\u60ef\u91cf: +pref.dlg.lbl.Pressure = \u538b\u529b: +pref.dlg.lbl.Stability = \u7a33\u5b9a\u6027: +pref.dlg.lbl.FlightTime = \u98de\u884c\u65f6\u95f4: +pref.dlg.lbl.effect1 = \u66f4\u6539\u5c06\u5728\u4e0b\u6b21\u542f\u52a8\u7a97\u53e3\u540e\u751f\u6548 +pref.dlg.lbl.Checkingupdates = \u6b63\u5728\u68c0\u67e5\u66f4\u65b0... +pref.dlg.lbl.msg1 = \u8fde\u63a5\u670d\u52a1\u5668\u65f6\u53d1\u751f\u9519\u8bef +pref.dlg.lbl.msg2 = \u65e0\u6cd5\u83b7\u53d6\u66f4\u65b0\u4fe1\u606f +pref.dlg.lbl.msg3 = \u60a8\u4f7f\u7528\u7684\u5df2\u7ecf\u662fOpenRocket\u6700\u65b0\u7248\u672c +pref.dlg.lbl.msg4 = \u65e0\u53ef\u7528\u66f4\u65b0 +pref.dlg.PrefChoiseSelector1 = \u603b\u662f\u8be2\u95ee +pref.dlg.PrefChoiseSelector2 = \u63d2\u5728\u4e2d\u95f4 +pref.dlg.PrefChoiseSelector3 = \u63d2\u5728\u6700\u540e +pref.dlg.PrefBooleanSelector1 = \u5220\u9664 +pref.dlg.PrefBooleanSelector2 = \u786e\u8ba4 +pref.dlg.Add = \u6dfb\u52a0 +pref.dlg.DescriptionArea.Adddirectories = \u4efb\u4f55\u65b0\u6dfb\u52a0\u7684RASP\u53d1\u52a8\u673a\u6587\u4ef6(*.eng), RockSim\u53d1\u52a8\u673a\u6587\u4ef6(*.rse), ZIP\u538b\u7f29\u5305\u6216\u6587\u4ef6\u5939\u6240\u5305\u542b\u7684\u63a8\u529b\u66f2\u7ebf\u5c06\u5728\u4e0b\u6b21\u542f\u52a8OpenRocket\u65f6\u751f\u6548 + +PreferencesDialog.lbl.language = \u754c\u9762\u8bed\u8a00: +PreferencesDialog.languages.default = \u7cfb\u7edf\u9ed8\u8ba4 +PreferencesDialog.lbl.languageEffect = \u8bed\u8a00\u8bbe\u7f6e\u5c06\u5728OpenRocket\u91cd\u542f\u540e\u751f\u6548 + +generalprefs.lbl.language = \u754c\u9762\u8bed\u8a00 +generalprefs.languages.default = \u7cfb\u7edf\u9ed8\u8ba4 +generalprefs.lbl.languageEffect = \u65b0\u7684\u8bed\u8a00\u5c06\u5728\u4e0b\u6b21\u542f\u52a8OpenRocket\u65f6\u751f\u6548. + + +! Simulation edit dialog +simedtdlg.but.runsimulation = \u8fd0\u884c\u4eff\u771f +simedtdlg.but.resettodefault = \u6062\u590d\u9ed8\u8ba4 +simedtdlg.but.savedefault = \u8bbe\u4e3a\u9ed8\u8ba4 +simedtdlg.but.add = \u6dfb\u52a0 +simedtdlg.but.remove = \u79fb\u9664 +simedtdlg.title.Editsim = \u7f16\u8f91\u4eff\u771f +simedtdlg.lbl.Simname = \u4eff\u771f\u540d\u79f0: +simedtdlg.tab.Launchcond = \u53d1\u5c04\u6761\u4ef6 +simedtdlg.tab.Simopt = \u6a21\u62df\u9009\u9879 +simedtdlg.tab.Plotdata = \u6570\u636e\u7ed8\u56fe +simedtdlg.tab.CustomExpressions = \u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f +simedtdlg.tab.Exportdata = \u8f93\u51fa\u6570\u636e +simedtdlg.lbl.Flightcfg = \u98de\u884c\u914d\u7f6e: +simedtdlg.lbl.ttip.Flightcfg = \u9009\u62e9\u8981\u4f7f\u7528\u7684\u98de\u884c\u914d\u7f6e. +simedtdlg.combo.ttip.Flightcfg = \u9009\u62e9\u8981\u4f7f\u7528\u7684\u98de\u884c\u914d\u7f6e. +simedtdlg.lbl.Wind = \u98ce\u573a\u6761\u4ef6 +simedtdlg.lbl.Averwindspeed = \u5e73\u5747\u98ce\u901f: +simedtdlg.lbl.ttip.Averwindspeed = \u76f8\u5bf9\u4e8e\u5730\u9762\u7684\u5e73\u5747\u98ce\u901f +simedtdlg.lbl.Stddeviation = \u6807\u51c6\u5dee: +simedtdlg.lbl.Winddirection = \u98ce\u5411: +simedtdlg.lbl.ttip.Winddirection = \u98ce\u5411, 0-360\u5ea6.
0 \u662f\u5317\u98ce,
90 \u662f\u4e1c\u98ce +simedtdlg.lbl.ttip.Stddeviation = \u98ce\u901f\u7684\u6807\u51c6\u504f\u5dee.
\u98ce\u901f\u572895%\u7684\u65f6\u95f4\u5185\u5e94\u5904\u4e8e\u4e24\u500d\u7684\u6807\u51c6\u5dee\u4ee5\u5185. +simedtdlg.lbl.Turbulenceintensity = \u6e4d\u6d41\u5f3a\u5ea6: +simedtdlg.lbl.ttip.Turbulenceintensity1 = \u6e4d\u6d41\u5f3a\u5ea6\u8fd1\u4f3c\u4e3a\u6807\u51c6\u5dee\u9664\u4ee5\u5e73\u5747\u98ce\u901f.
+simedtdlg.lbl.ttip.Turbulenceintensity2 = \u5178\u578b\u53d6\u503c\u8303\u56f4\u662f\u4ece +simedtdlg.lbl.ttip.Turbulenceintensity3 = \u5230 +simedtdlg.border.Atmoscond = \u5927\u6c14\u6761\u4ef6 +simedtdlg.checkbox.InterStdAtmosphere = \u4f7f\u7528\u56fd\u9645\u6807\u51c6\u5927\u6c14\u6a21\u578b +simedtdlg.checkbox.ttip.InterStdAtmosphere1 = \u9009\u62e9\u4f7f\u7528\u56fd\u9645\u6807\u51c6\u5927\u6c14\u6a21\u578b.
\u8be5\u6a21\u578b\u7684\u5927\u6c14\u6e29\u5ea6\u4e3a +simedtdlg.checkbox.ttip.InterStdAtmosphere2 = , \u5927\u6c14\u538b\u4e3a +simedtdlg.checkbox.ttip.InterStdAtmosphere3 = \u4e14\u5747\u4e3a\u6d77\u5e73\u9762\u503c. +simedtdlg.lbl.Temperature = \u6e29\u5ea6: +simedtdlg.lbl.ttip.Temperature = \u53d1\u5c04\u5730\u70b9\u7684\u6e29\u5ea6. +simedtdlg.lbl.Pressure = \u538b\u529b: +simedtdlg.lbl.ttip.Pressure = \u53d1\u5c04\u5730\u70b9\u7684\u5927\u6c14\u538b\u529b. +simedtdlg.lbl.Launchsite = \u53d1\u5c04\u5730\u70b9 +simedtdlg.lbl.Latitude = \u7eac\u5ea6: +simedtdlg.lbl.ttip.Latitude = \u53d1\u5c04\u5730\u70b9\u7684\u7eac\u5ea6\u4f1a\u5f71\u54cd\u5730\u7403\u7684\u5f15\u529b.
\u5317\u534a\u7403\u4e3a\u6b63\u503c,\u5357\u534a\u7403\u4e3a\u8d1f\u503c. + +simedtdlg.lbl.Longitude = \u7ecf\u5ea6: +simedtdlg.lbl.ttip.Longitude = \u9700\u8981\u5929\u6c14\u9884\u62a5\u4ee5\u53ca\u9ad8\u7a0b\u6a21\u578b. + +simedtdlg.lbl.Altitude = \u6d77\u62d4\u9ad8\u5ea6: +simedtdlg.lbl.ttip.Altitude = \u53d1\u5c04\u9ad8\u5ea6\u57fa\u4e8e\u6d77\u5e73\u9762.
\u8fd9\u4f1a\u5f71\u54cd\u5927\u6c14\u6a21\u578b\u4e2d\u706b\u7bad\u7684\u4f4d\u7f6e. +simedtdlg.border.Launchrod = \u53d1\u5c04\u67b6 +simedtdlg.lbl.Length = \u957f\u5ea6: +simedtdlg.lbl.ttip.Length = \u53d1\u5c04\u67b6\u7684\u603b\u957f\u5ea6. +simedtdlg.checkbox.Intowind = \u603b\u662f\u987a\u98ce\u6216\u9006\u98ce\u53d1\u5c04 +simedtdlg.checkbox.ttip.Intowind1 = \u52fe\u9009\u540e\u53d1\u5c04\u6746\u5c06\u4f1a\u6307\u5411\u98ce\u5411.
+simedtdlg.checkbox.ttip.Intowind2 = 0\u89d2\u5ea6\u53d1\u5c04\u5373\u53d1\u5c04\u6746\u5782\u76f4\u5411\u4e0a.
+simedtdlg.checkbox.ttip.Intowind3 = \u8d1f\u53d1\u5c04\u6746\u89d2\u5ea6\u5c06\u987a\u98ce\u53d1\u5c04.
\u53d6\u6d88\u52fe\u9009\u672c\u9879\u540e\u4f60\u53ef\u4ee5\u6307\u5b9a\u4efb\u610f\u53d1\u5c04\u6746\u89d2\u5ea6. +simedtdlg.checkbox.ttip.Intowind4 = \u53d6\u6d88\u52fe\u9009\u672c\u9879\u540e\u4f60\u53ef\u4ee5\u6307\u5b9a\u4efb\u610f\u53d1\u5c04\u6746\u89d2\u5ea6. +simedtdlg.lbl.Angle = \u89d2\u5ea6: +simedtdlg.lbl.ttip.Angle = \u53d1\u5c04\u67b6\u76f8\u5bf9\u4e8e\u5782\u76f4\u65b9\u5411\u7684\u89d2\u5ea6.
\u6b63\u89d2\u5ea6\u6307\u5411\u8fce\u98ce\u9762. +simedtdlg.lbl.Direction = \u65b9\u5411: +simedtdlg.lbl.ttip.Direction1 = \u53d1\u5c04\u67b6\u76f8\u5bf9\u4e8e\u98ce\u7684\u65b9\u5411.
+simedtdlg.lbl.ttip.Direction2 = - +simedtdlg.lbl.ttip.Direction3 = 0 = \u5317 +simedtdlg.border.Simopt = \u4eff\u771f\u9009\u9879 +simedtdlg.lbl.Calcmethod = \u8ba1\u7b97\u65b9\u6cd5: +simedtdlg.lbl.ttip.Calcmethod = Extended Barrowman\u7b97\u6cd5\u662f\u901a\u8fc7
\u6269\u5c55Barrowman\u65b9\u7a0b\u5f0f\u6765\u9002\u5e94\u66f4\u591a\u7ec4\u4ef6\u7684\u6c14\u52a8\u529b\u8ba1\u7b97. +simedtdlg.lbl.ExtBarrowman = Extended Barrowman +simedtdlg.lbl.Simmethod = \u4eff\u771f\u65b9\u6cd5: +simedtdlg.lbl.ttip.Simmethod1 = 6\u81ea\u7531\u5ea6\u6a21\u62df\u53ef\u4ee5\u6a21\u62df\u706b\u7bad\u7684\u5404\u79cd\u98de\u884c\u60c5\u51b5.
+simedtdlg.lbl.ttip.Simmethod2 = \u79ef\u5206\u65b9\u6cd5\u91c7\u75284\u9636Runge-Kutta\u6570\u503c\u79ef\u5206. +simedtdlg.lbl.GeodeticMethod = \u5927\u5730\u6d4b\u91cf\u8ba1\u7b97: +simedtdlg.lbl.ttip.GeodeticMethodTip = \u76f8\u5bf9\u4e8e\u5730\u7403\u7684\u5750\u6807\u8ba1\u7b97. \u53ef\u8ba1\u7b97\u79d1\u91cc\u5965\u5229\u6548\u5e94. +simedtdlg.lbl.Timestep = \u65f6\u95f4\u6b65\u957f: +simedtdlg.lbl.ttip.Timestep1 = \u4eff\u771f\u6b65\u9aa4\u4e4b\u95f4\u7684\u65f6\u95f4.
\u66f4\u5c0f\u7684\u65f6\u95f4\u6b65\u957f\u8ba1\u7b97\u66f4\u6162, \u7ed3\u679c\u66f4\u7cbe\u786e.
+simedtdlg.lbl.ttip.Timestep2 = 4\u9636\u6a21\u62df\u65b9\u6cd5\u975e\u5e38\u7cbe\u786e\uff0c\u5982\u679c\u65f6\u95f4\u6b65\u957f\u4e3a +simedtdlg.but.ttip.resettodefault = \u91cd\u7f6e\u65f6\u95f4\u6b65\u957f\u4e3a\u7f3a\u7701\u503c ( +simedtdlg.border.SimExt = \u6a21\u62df\u6269\u5c55 +simedtdlg.SimExt.desc = \u6a21\u62df\u6269\u5c55\u80fd\u5728\u6a21\u62df\u8fc7\u7a0b\u4e2d\u542f\u7528\u9ad8\u7ea7\u7279\u6027\u4ee5\u53ca\u81ea\u5b9a\u4e49\u529f\u80fd. \u6bd4\u5982\u786c\u4ef6\u5728\u73af\u6d4b\u8bd5. +simedtdlg.SimExt.noExtensions = \u65e0\u6269\u5c55\u5b9a\u4e49\u9879 +simedtdlg.SimExt.add = \u6dfb\u52a0\u6269\u5c55 +simedtdlg.SimExt.copyExtension = \u590d\u5236\u6269\u5c55 +simedtdlg.lbl.Noflightdata = \u65e0\u53ef\u7528\u98de\u884c\u6570\u636e +simedtdlg.lbl.runsimfirst = \u8bf7\u5148\u8fd0\u884c\u4eff\u771f +simedtdlg.chart.Simflight = \u5df2\u4eff\u771f\u7684\u98de\u884c +simedtdlg.dlg.Simres = \u4eff\u771f\u7ed3\u679c +simedtdlg.IntensityDesc.None = \u65e0 +simedtdlg.IntensityDesc.Verylow = \u5f88\u4f4e +simedtdlg.IntensityDesc.Low = \u4f4e +simedtdlg.IntensityDesc.Medium = \u4e2d +simedtdlg.IntensityDesc.High = \u9ad8 +simedtdlg.IntensityDesc.Veryhigh = \u5f88\u9ad8 +simedtdlg.IntensityDesc.Extreme = \u6781\u9ad8 + +SimulationExtension.airstart.name.alt = Air-start ({alt}) +SimulationExtension.airstart.name.altvel = Air-start ({alt}, {vel}) +SimulationExtension.javacode.name = Java\u4ee3\u7801 +SimulationExtension.javacode.name.none = \u65e0 +SimulationExtension.javacode.desc = \u6dfb\u52a0\u81ea\u5b9a\u4e49SimulationListener(\u76d1\u542c\u4e8b\u4ef6) +SimulationExtension.javacode.className = \u5b8c\u6574\u7684Java\u7c7b\u540d: + +SimulationExtension.scripting.name = {language}\u811a\u672c +SimulationExtension.scripting.desc = \u81ea\u5b9a\u4e49OpenRocket\u6269\u5c55\u811a\u672c. +SimulationExtension.scripting.language.label = \u8bed\u8a00: +SimulationExtension.scripting.warning.disabled = \u4e0d\u53ef\u4fe1\u811a\u672c\u5df2\u88ab\u7981\u7528. \u4f60\u9700\u8981\u5728\u4eff\u771f\u9009\u9879\u4e2d\u624b\u52a8\u542f\u7528. +SimulationExtension.scripting.text.enabled = \u542f\u7528\u811a\u672c +SimulationExtension.scripting.text.enabled.ttip = \u811a\u672c\u53ea\u6709\u5728\u542f\u7528\u540e\u624d\u4f1a\u88ab\u6267\u884c. +SimulationExtension.scripting.text.trusted = \u5728\u672c\u673a\u4e0a\u4fe1\u4efb\u8be5\u811a\u672c +SimulationExtension.scripting.text.trusted.msg = \u4e0d\u53ef\u4fe1\u7684\u811a\u672c\u4f1a\u5728\u8bfb\u53d6\u65f6\u88ab\u7981\u7528 +SimulationExtension.scripting.text.trusted.clear = \u6e05\u9664\u811a\u672c\u4fe1\u4efb +SimulationExtension.scripting.text.trusted.clear.ttip = \u6e05\u9664\u5bf9\u6240\u6709\u811a\u672c\u7684\u4fe1\u4efb +SimulationExtension.scripting.text.trusted.cleared = \u6240\u6709\u811a\u672c\u5df2\u4e0d\u88ab\u672c\u673a\u4fe1\u4efb. +SimulationExtension.scripting.text.trusted.cleared.title = \u5df2\u6e05\u9664 + +SimulationEditDialog.btn.plot = \u6570\u636e\u56fe +SimulationEditDialog.btn.export = \u5bfc\u51fa +SimulationEditDialog.btn.edit = \u7f16\u8f91 +SimulationEditDialog.btn.simulate = \u4eff\u771f +SimulationEditDialog.btn.simulateAndPlot = \u4eff\u771f & \u6570\u636e\u56fe + +GeodeticComputationStrategy.flat.name = \u5e73\u9762\u5730\u7403 +GeodeticComputationStrategy.flat.desc = \u5728\u8ba1\u7b97\u65f6\u628a\u5730\u9762\u5f53\u6210\u5e73\u9762, \u9002\u7528\u4e8e\u4f4e\u7a7a\u98de\u884c. +GeodeticComputationStrategy.spherical.name = \u7403\u5f62 +GeodeticComputationStrategy.spherical.desc = \u8ba1\u7b97\u5927\u5730\u6d4b\u91cf\u65f6\u4f7f\u7528\u7403\u5f62\u5730\u7403.
\u5bf9\u51e0\u4e4e\u6240\u6709\u7684\u8ba1\u7b97\u60c5\u51b5\u90fd\u5f88\u7cbe\u786e. +GeodeticComputationStrategy.wgs84.name = WGS84 \u692d\u5706 +GeodeticComputationStrategy.wgs84.desc = \u8ba1\u7b97\u5927\u5730\u6d4b\u91cf\u65f6\u4f7f\u7528\u4f7f\u7528WGS84\u4ee5\u53caVincenty\u8ddd\u79bb\u516c\u5f0f.
\u975e\u5e38\u6162. + + + + +! Simulation Panel +simpanel.but.newsimulation = \u65b0\u5efa\u4eff\u771f +simpanel.but.editsimulation = \u7f16\u8f91\u4eff\u771f +simpanel.but.runsimulations = \u8fd0\u884c\u4eff\u771f +simpanel.but.deletesimulations = \u5220\u9664\u4eff\u771f +simpanel.but.plotexport = \u7ed8\u56fe/\u8f93\u51fa +simpanel.but.ttip.newsimulation = \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u4eff\u771f +simpanel.but.ttip.editsim = \u7f16\u8f91\u9009\u4e2d\u7684\u4eff\u771f +simpanel.but.ttip.runsimu = \u91cd\u65b0\u8fd0\u884c\u9009\u4e2d\u7684\u4eff\u771f +simpanel.but.ttip.deletesim = \u5220\u9664\u9009\u4e2d\u7684\u4eff\u771f +simpanel.checkbox.donotask = \u4e0d\u518d\u8be2\u95ee +simpanel.lbl.defpref = \u60a8\u53ef\u5728\u9996\u9009\u9879\u4e2d\u4fee\u6539\u9ed8\u8ba4\u64cd\u4f5c. +simpanel.dlg.lbl.DeleteSim1 = \u5220\u9664\u9009\u4e2d\u7684\u4eff\u771f? +simpanel.dlg.lbl.DeleteSim2 = \u8be5\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500. +simpanel.dlg.lbl.DeleteSim3 = \u5220\u9664\u4eff\u771f +simpanel.col.Name = \u540d\u79f0 +simpanel.col.Motors = \u53d1\u52a8\u673a +simpanel.col.Configuration = \u914d\u7f6e +simpanel.col.Velocityoffrod = \u79bb\u67b6\u901f\u5ea6 +simpanel.col.Velocityatdeploy = \u6709\u6548\u8d1f\u8377\u901f\u5ea6 +simpanel.col.OptimumCoastTime = \u6700\u957f\u5ef6\u6ede\u65f6\u95f4 +simpanel.col.OptimumCoastTime.ttip = \u4ece\u6700\u540e\u4e00\u7ea7\u53d1\u52a8\u673a\u71c3\u5c3d\u81f3\u8fbe\u5230\u6700\u9ad8\u9ad8\u5ea6\u7684\u65f6\u95f4. +simpanel.col.Apogee = \u6700\u9ad8\u70b9 +simpanel.col.Maxvelocity = \u6700\u5927\u901f\u5ea6 +simpanel.col.Maxacceleration = \u6700\u5927\u52a0\u901f\u5ea6 +simpanel.col.Timetoapogee = \u6700\u9ad8\u70b9\u65f6\u95f4 +simpanel.col.Flighttime = \u98de\u884c\u65f6\u95f4 +simpanel.col.Groundhitvelocity = \u649e\u51fb\u5730\u9762\u901f\u5ea6 +simpanel.ttip.uptodate = \u6700\u65b0\u7684\u6570\u636e +simpanel.ttip.loaded = \u4ece\u6587\u4ef6\u8f7d\u5165\u6570\u636e +simpanel.ttip.outdated = \u6570\u636e\u5df2\u8fc7\u671f
\u70b9\u51fb\u8fd0\u884c\u4eff\u771f\u91cd\u65b0\u8ba1\u7b97. +simpanel.ttip.external = \u5bfc\u5165\u7684\u6570\u636e +simpanel.ttip.notSimulated = \u672a\u8fdb\u884c\u8fc7\u4eff\u771f
\u70b9\u51fb\u8fd0\u884c\u4eff\u771f. +simpanel.ttip.noData = \u65e0\u53ef\u7528\u7684\u4eff\u771f\u6570\u636e. +simpanel.ttip.noWarnings = \u672a\u6709\u8b66\u544a. +simpanel.ttip.warnings = \u8b66\u544a: + +! SimulationRunDialog +SimuRunDlg.title.RunSim = \u8fd0\u884c\u4eff\u771f... +SimuRunDlg.lbl.Running = \u6b63\u5728\u4eff\u771f ... +SimuRunDlg.lbl.Simutime = \u4eff\u771f\u65f6\u95f4: +SimuRunDlg.lbl.Altitude = \u9ad8\u5ea6: +SimuRunDlg.lbl.Velocity = \u901f\u5ea6: +SimuRunDlg.msg.Unabletosim = \u65e0\u6cd5\u8fd0\u884c\u4eff\u771f: +SimuRunDlg.msg.errorOccurred = \u4eff\u771f\u65f6\u51fa\u73b0\u9519\u8bef: + +BasicEventSimulationEngine.error.noMotorsDefined = \u53d1\u52a8\u673a\u672a\u5b9a\u4e49 +BasicEventSimulationEngine.error.earlyMotorBurnout = \u53d1\u52a8\u673a\u8d77\u98de\u524d\u5df2\u71c3\u5c3d. +BasicEventSimulationEngine.error.noIgnition = \u53d1\u52a8\u673a\u672a\u70b9\u706b +BasicEventSimulationEngine.error.NaNResult = \u6a21\u62df\u7ed3\u679c\u975e\u6570\u503c,\u8bf7\u6c47\u62a5bug + + +RK4SimulationStepper.error.valuesTooLarge = \u4eff\u771f\u6570\u503c\u8d85\u51fa\u9650\u5236. \u8bf7\u7f29\u5c0f\u65f6\u95f4\u6b65\u957f. + +SimulationModifierTree.OptimizationParameters = \u4f18\u5316\u53c2\u6570 + +! SimulationExportPanel +SimExpPan.desc = CSV\u6570\u636e\u6587\u4ef6 (*.csv) +SimExpPan.border.Vartoexport = \u5bfc\u51fa\u53d8\u91cf +SimExpPan.border.Stage = \u5bfc\u51fa\u706b\u7bad\u7ea7 +SimExpPan.but.Selectall = \u5168\u9009 +SimExpPan.but.Selectnone = \u53d6\u6d88\u5168\u9009 +SimExpPan.border.Fieldsep = \u6570\u636e\u5206\u9694\u7b26 +SimExpPan.lbl.Fieldsepstr = \u6570\u636e\u5206\u9694\u5b57\u7b26\u4e32: +SimExpPan.lbl.longA1 = \u5b57\u7b26\u4e32\u7528\u4e8e\u5206\u9694\u8f93\u51fa\u6587\u4ef6\u4e2d\u7684\u6570\u636e\u57df.
+SimExpPan.lbl.longA2 = \u4f7f\u7528 ',' \u4f5c\u4e3aCSV\u6570\u636e\u7684\u5206\u9694\u7b26. +SimExpPan.checkbox.Includesimudesc = \u4eff\u771f\u63cf\u8ff0 +SimExpPan.checkbox.ttip.Includesimudesc = \u5728\u6587\u4ef6\u5934\u52a0\u4e0a\u6ce8\u91ca\u884c\u7528\u4e8e\u63cf\u8ff0\u4eff\u771f\u5185\u5bb9. +SimExpPan.border.Comments = \u6ce8\u91ca +SimExpPan.checkbox.Includefielddesc = \u6570\u636e\u57df\u63cf\u8ff0 +SimExpPan.checkbox.ttip.Includefielddesc = \u6ce8\u91ca\u884c\u7528\u4e8e\u63cf\u8ff0\u8f93\u51fa\u53d8\u91cf. +SimExpPan.checkbox.Incflightevents = \u98de\u884c\u4e8b\u4ef6 +SimExpPan.checkbox.ttip.Incflightevents = \u6ce8\u91ca\u884c\u7528\u4e8e\u63cf\u8ff0\u98de\u884c\u4e8b\u4ef6. +SimExpPan.lbl.Commentchar = \u6ce8\u91ca\u6807\u8bc6\u7b26: +SimExpPan.lbl.ttip.Commentchar = \u7528\u4e8e\u6807\u8bb0\u6ce8\u91ca\u884c\u7684\u6807\u8bc6\u7b26. +SimExpPan.Fileexists.desc1 = \u6587\u4ef6 \" +SimExpPan.Fileexists.desc2 = \" \u5df2\u5b58\u5728. \u8986\u76d6? +SimExpPan.Fileexists.title = \u6587\u4ef6\u5df2\u5b58\u5728 +SimExpPan.ExportingVar.desc1 = \u8f93\u51fa1\u4e2a\u53d8\u91cf\uff0c\u5171\u8ba1 +SimExpPan.ExportingVar.desc2 = \u8f93\u51fa +SimExpPan.ExportingVar.desc3 = \u4e2a\u53d8\u91cf, \u5171\u8ba1 +SimExpPan.Col.Variable = \u53d8\u91cf +SimExpPan.Col.Unit = \u5355\u4f4d + + +CsvOptionPanel.separator.space = \u7a7a\u683c +CsvOptionPanel.separator.tab = \u5236\u8868\u7b26(Tab) + + +! Custom expression general stuff +customExpression.Name = \u540d\u79f0 +customExpression.Symbol = \u7b26\u53f7 +customExpression.Expression = \u8868\u8fbe\u5f0f +customExpression.Units = \u5355\u4f4d +customExpression.Operator = \u7b97\u5b50 +customExpression.Description = \u63cf\u8ff0 + +! Custom expression panel +customExpressionPanel.but.NewExpression = \u65b0\u5efa\u8868\u8fbe\u5f0f +customExpressionPanel.but.ttip.NewExpression = \u65b0\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f +customExpressionPanel.but.Import = \u5bfc\u5165 +customExpressionPanel.but.ttip.Import = \u4ece\u5916\u90e8.ork\u6587\u4ef6\u5bfc\u5165\u8868\u8fbe\u5f0f +customExpressionPanel.lbl.UpdateNote = \u8bf7\u5148\u8fd0\u884c\u4eff\u771f, \u7136\u540e\u518d\u7ed8\u56fe. +customExpressionPanel.lbl.CalcNote = \u8868\u8fbe\u5f0f\u5c06\u6309\u663e\u793a\u987a\u5e8f\u8fdb\u884c\u8ba1\u7b97. +customExpressionPanel.lbl.CustomExpressions = \u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f +customExpression.Units.but.ttip.Remove = \u79fb\u9664\u8868\u8fbe\u5f0f +customExpression.Units.but.ttip.Edit = \u7f16\u8f91\u8868\u8fbe\u5f0f +customExpression.Units.but.ttip.MoveUp = \u63d0\u524d\u8868\u8fbe\u5f0f\u8ba1\u7b97\u987a\u5e8f +customExpression.Units.but.ttip.MoveDown = \u5ef6\u540e\u8868\u8fbe\u5f0f\u8ba1\u7b97\u987a\u5e8f + + +! Custom expression builder window +ExpressionBuilderDialog.title = \u8868\u8fbe\u5f0f\u751f\u6210\u5668 +ExpressionBuilderDialog.InsertVariable = \u63d2\u5165\u53d8\u91cf +ExpressionBuilderDialog.InsertOperator = \u63d2\u5165\u7b97\u5b50 +ExpressionBuilderDialog.led.ttip.Name = \u540d\u79f0\u4e0d\u80fd\u91cd\u590d +ExpressionBuilderDialog.led.ttip.Symbol = \u7b26\u53f7\u4e0d\u80fd\u91cd\u590d +ExpressionBuilderDialog.led.ttip.Expression = \u8868\u8fbe\u5f0f\u5fc5\u987b\u4f7f\u7528\u5b9a\u4e49\u8fc7\u7684\u7b26\u53f7\u548c\u7b97\u5b50 +ExpressionBuilderDialog.CopyToOtherSimulations = \u590d\u5236\u5230\u5176\u4ed6\u4eff\u771f +ExpressionBuilderDialog.CopyToOtherSimulations.ttip = \u5c06\u8868\u8fbe\u5f0f\u590d\u5236\u5230\u5176\u4ed6\u8bbe\u8ba1\u7a3f.
\u4e0d\u4f1a\u8986\u76d6\u5176\u4ed6\u4eff\u771f\u4e2d\u73b0\u6709\u7684\u7684\u8868\u8fbe\u5f0f. + +! Custom expression variable selector +CustomVariableSelector.title = \u9009\u62e9\u53d8\u91cf + +! Custom operator selector +CustomOperatorSelector.title = \u9009\u62e9\u7b97\u5b50 + +! Operators +Operator.plus = \u52a0 +Operator.minus = \u51cf +Operator.star = \u4e58 +Operator.div = \u9664 +Operator.mod = \u6a21 +Operator.pow = \u6307\u6570 +Operator.abs = \u7edd\u5bf9\u503c +Operator.ceil = \u5411\u4e0a\u53d6\u6574 +Operator.floor = \u5411\u4e0b\u53d6\u6574 +Operator.sqrt = \u5e73\u65b9\u6839 +Operator.cbrt = \u7acb\u65b9\u6839 +Operator.exp = \u6307\u6570\u51fd\u6570 (e^x) +Operator.ln = \u81ea\u7136\u5bf9\u6570 +Operator.sin = \u6b63\u5f26 Sin +Operator.cos = \u4f59\u5f26 Cos +Operator.tan = \u6b63\u5207 Tan +Operator.asin = \u53cd\u6b63\u5f26 ArcSin +Operator.acos = \u53cd\u4f59\u5f26 ArcCos +Operator.atan = \u53cd\u6b63\u5207 ArcTan +Operator.hsin = \u53cc\u66f2\u6b63\u5f26 Sinh +Operator.hcos = \u53cc\u66f2\u4f59\u5f26 Cosh +Operator.htan = \u53cc\u66f2\u6b63\u5207 Tanh +Operator.log10 = \u5e38\u7528\u5bf9\u6570 (\u5e95\u6570\u4e3a10) +Operator.round = \u56db\u820d\u4e94\u5165 +Operator.random = \u4ea7\u751f\u4e00\u4e2a\u4ecb\u4e8e0\u5230\u8bbe\u5b9a\u503c\u4e4b\u95f4\u7684\u968f\u673a\u6570 +Operator.expm1 = \u548c exp(x)-1 \u4e00\u6837, \u4f46\u5bf9\u4e8e\u8f83\u5c0f\u7684\u6570\u5b57x\u66f4\u7cbe\u786e +Operator.mean = \u7b97\u672f\u5e73\u5747\u6570 +Operator.min = \u53d6\u6700\u5c0f\u503c +Operator.max = \u53d6\u6700\u5927\u503c +Operator.var = \u65b9\u5dee +Operator.stdev = \u6807\u51c6\u5dee +Operator.rms = \u5747\u65b9\u6839 +Operator.lclip = \u9650\u5236\u6570\u503c(\u53c2\u65701)\u4e0d\u5c0f\u4e8e\u53e6\u4e00\u4e2a\u6570\u503c(\u53c2\u65702) +Operator.uclip = \u9650\u5236\u6570\u503c(\u53c2\u65701)\u4e0d\u5927\u4e8e\u53e6\u4e00\u4e2a\u6570\u503c(\u53c2\u65702) +Operator.binf = \u7ed9\u51fa\u6570\u503c(\u53c2\u65701)\u76f8\u5bf9\u4e8e\u4e0b\u754c(\u53c2\u65702)\u548c\u4e0a\u754c(\u53c2\u65703)\u7684\u6bd4\u4f8b +Operator.trapz = \u5bf9\u4e8e\u7ed9\u5b9a\u8303\u56f4\u4f7f\u7528\u68af\u5f62\u79ef\u5206 +Operator.tnear = \u7ed9\u51fa\u6570\u636e\u70b9(\u53c2\u65701)\u6700\u63a5\u8fd1\u6570\u503c(\u53c2\u65702)\u7684\u65f6\u95f4 + +! MotorPlot +MotorPlot.title.Motorplot = \u53d1\u52a8\u673a\u56fe\u8868 +MotorPlot.but.Select = \u9009\u62e9 +MotorPlot.Chart.Motorthrustcurve = \u53d1\u52a8\u673a\u63a8\u529b\u66f2\u7ebf +MotorPlot.Chart.Time = \u65f6\u95f4 / s +MotorPlot.Chart.Thrust = \u63a8\u529b / N +MotorPlot.txt.Designation = \u578b\u53f7: +MotorPlot.txt.Manufacturer = \u5236\u9020\u5546: +MotorPlot.txt.Type = \u7c7b\u522b: +MotorPlot.txt.Delays = \u5ef6\u65f6: +MotorPlot.txt.Comment = \u6ce8\u91ca:\n + +! Simulation plot panel +simplotpanel.lbl.Presetplotconf = \u9884\u8bbe\u7ed8\u56fe\u8bbe\u7f6e: +simplotpanel.lbl.Xaxistype = X\u8f74\u7c7b\u522b: +simplotpanel.lbl.Unit = \u5355\u4f4d: +simplotpanel.lbl.Yaxistypes = Y\u8f74\u7c7b\u522b: +simplotpanel.lbl.Flightevents = \u98de\u884c\u4e8b\u4ef6: +simplotpanel.but.All = \u5168\u9009\u4e8b\u4ef6 +simplotpanel.but.None = \u53d6\u6d88\u5168\u9009\u4e8b\u4ef6 +simplotpanel.but.NewYaxisplottype = \u65b0\u5efaY\u8f74\u7c7b\u522b +simplotpanel.lbl.Axis = \u8f74: +simplotpanel.but.ttip.Removethisplot = \u5220\u9664\u8be5Y\u8f74\u7c7b\u522b +simplotpanel.Desc = \u6570\u636e\u5c06\u6309\u65f6\u95f4\u987a\u5e8f\u7ed8\u5236, \u5373\u4f7fX\u8f74\u4e0d\u662f\u65f6\u95f4. +simplotpanel.OptionPane.lbl1 = \u6700\u591a\u7ed8\u523615\u5e45\u56fe. +simplotpanel.OptionPane.lbl2 = \u65e0\u6cd5\u65b0\u589e\u7ed8\u56fe +simplotpanel.AUTO_NAME = \u81ea\u52a8 +simplotpanel.LEFT_NAME = \u5de6 +simplotpanel.RIGHT_NAME = \u53f3 +simplotpanel.CUSTOM = \u81ea\u5b9a\u4e49 +SimulationPlotPanel.error.noPlotSelected = \u8bf7\u5728Y\u8f74\u6dfb\u52a0\u81f3\u5c111\u4e2a\u53d8\u91cf. +SimulationPlotPanel.error.noPlotSelected.title = \u6ca1\u6709\u6570\u636e + +! Component add buttons +compaddbuttons.Bodycompandfinsets = \u7bad\u4f53\u90e8\u4ef6\u548c\u7a33\u5b9a\u7ffc +compaddbuttons.Nosecone = \u5934\u9525 +compaddbuttons.Bodytube = \u7bad\u4f53 +compaddbuttons.Transition = \u7ea7\u95f4\u6bb5 +compaddbuttons.Trapezoidal = \u68af\u5f62\u7a33\u5b9a\u7ffc +compaddbuttons.Elliptical = \u692d\u5706\u7a33\u5b9a\u7ffc +compaddbuttons.Freeform = \u81ea\u7531\u66f2\u9762 +compaddbuttons.Tubefin = \u7ba1\u5f62\u7ffc +compaddbuttons.Launchlug = \u53d1\u5c04\u5957\u67c4 +compaddbuttons.Innercomponent = \u5185\u90e8\u90e8\u4ef6 +compaddbuttons.Innertube = \u5185\u7b52 +compaddbuttons.Coupler = \u8fde\u63a5\u5668 +compaddbuttons.Centeringring = \u4e2d\u5fc3\u73af +compaddbuttons.Bulkhead = \u9694\u677f +compaddbuttons.Engineblock = \u53d1\u52a8\u673a +compaddbuttons.Massobjects = \u8f7d\u8377\u90e8\u4ef6 +compaddbuttons.Parachute = \u964d\u843d\u4f1e +compaddbuttons.Streamer = \u98d8\u5e26 +compaddbuttons.Shockcord = \u51cf\u9707\u7d22 +compaddbuttons.Masscomponent = \u4e3b\u8f7d\u8377 +compaddbuttons.Donotaskmeagain = \u4e0d\u518d\u8be2\u95ee +compaddbuttons.Selectcomppos = \u9009\u62e9\u90e8\u4ef6\u4f4d\u7f6e +compaddbuttons.lbl.Youcanchange = \u4f60\u53ef\u4ee5\u5728\u9996\u9009\u9879\u4e2d\u8bbe\u5b9a\u9ed8\u8ba4\u64cd\u4f5c. +compaddbuttons.lbl.insertcomp = \u7d27\u63a5\u5f53\u524d\u7ec4\u4ef6\u6dfb\u52a0\u65b0\u7ec4\u4ef6\u6216\u5728\u5c3e\u90e8\u6dfb\u52a0\u65b0\u7ec4\u4ef6? +compaddbuttons.askPosition.Inserthere = \u5728\u6b64\u63d2\u5165 +compaddbuttons.askPosition.Addtotheend = \u5728\u5c3e\u90e8\u6dfb\u52a0 +compaddbuttons.askPosition.Cancel = \u53d6\u6d88 + +! Component Analysis Dialog +componentanalysisdlg.componentanalysis = \u7ec4\u4ef6\u5206\u6790 +componentanalysisdlg.lbl.winddir = \u98ce\u5411: +componentanalysisdlg.TitledBorder.warnings = \u8b66\u544a: +componentanalysisdlg.ToggleBut.worst = \u6700\u574f\u60c5\u51b5 +componentanalysisdlg.lbl.angleofattack = \u653b\u89d2: +componentanalysisdlg.lbl.machnumber = \u9a6c\u8d6b: +componentanalysisdlg.lbl.rollrate = \u89d2\u901f\u5ea6: +componentanalysisdlg.lbl.activestages = \u6709\u6548\u7ea7: +componentanalysisdlg.lbl.motorconf = \u53d1\u52a8\u673a\u8bbe\u7f6e: +componentanalysisdlg.TabStability.Col = \u7ec4\u4ef6 +componentanalysisdlg.TabStability.Col.CG = \u91cd\u5fc3 +componentanalysisdlg.TabStability.Col.Mass = \u8d28\u91cf +componentanalysisdlg.TabStability.Col.CP = \u538b\u5fc3 +componentanalysisdlg.TabStability = \u7a33\u5b9a\u6027 +componentanalysisdlg.TabStability.ttip = \u7a33\u5b9a\u6027\u4fe1\u606f +componentanalysisdlg.dragTableModel.Col.Component = \u7ec4\u4ef6 +componentanalysisdlg.dragTableModel.Col.Pressure = \u538b\u529b CD +componentanalysisdlg.dragTableModel.Col.Base = \u57fa\u51c6 CD +componentanalysisdlg.dragTableModel.Col.friction = \u6469\u64e6 CD +componentanalysisdlg.dragTableModel.Col.total = \u603b CD +componentanalysisdlg.dragTabchar = \u963b\u529b\u7279\u6027 +componentanalysisdlg.dragTabchar.ttip = \u963b\u529b\u7279\u6027 +componentanalysisdlg.rollTableModel.Col.component = \u7ec4\u4ef6 +componentanalysisdlg.rollTableModel.Col.rollforc = \u6eda\u8f6c\u529b\u7cfb\u6570 +componentanalysisdlg.rollTableModel.Col.rolldamp = \u6eda\u8f6c\u963b\u5c3c\u7cfb\u6570 +componentanalysisdlg.rollTableModel.Col.total = \u603b Cl +componentanalysisdlg.rollTableModel = \u6eda\u8f6c\u52a8\u529b\u5b66 +componentanalysisdlg.rollTableModel.ttip = \u6eda\u8f6c\u52a8\u529b\u5b66 +componentanalysisdlg.println.closingmethod = \u8c03\u7528\u5173\u95ed\u4e8b\u4ef6: +componentanalysisdlg.println.settingnam = \u8bbe\u7f6e\u975e\u6570\u5b57\u503c +componentanalysisdlg.lbl.reflenght = \u53c2\u8003\u957f\u5ea6: +componentanalysisdlg.lbl.refarea = \u53c2\u8003\u9762\u79ef: +!componentanalysisdlg.But.close = \u5173\u95ed +componentanalysisdlg.TabStability.Col.Component = \u7ec4\u4ef6 +componentanalysisdlg.TOTAL = \u603b\u5171 +componentanalysisdlg.noWarnings = \u6ca1\u6709\u8b66\u544a. + +! Custom Material dialog +custmatdlg.title.Custommaterial = \u81ea\u5b9a\u4e49\u6750\u6599 +custmatdlg.lbl.Materialname = \u6750\u6599\u540d\u79f0: +custmatdlg.lbl.Materialtype = \u6750\u6599\u7c7b\u578b: +custmatdlg.lbl.Materialdensity = \u6750\u6599\u5bc6\u5ea6: +custmatdlg.checkbox.Addmaterial = \u6dfb\u52a0\u6750\u6599\u5230\u6570\u636e\u5e93 + + +! Ring Component Config +ringcompcfg.OuterRadius = \u5916\u76f4\u5f84 +ringcompcfg.Automatic = \u81ea\u52a8 +ringcompcfg.InnerRadius = \u5185\u76f4\u5f84 +ringcompcfg.Thickness = \u539a\u5ea6 +ringcompcfg.Length = \u957f\u5ea6 +ringcompcfg.Positionrelativeto = \u76f8\u5bf9\u4f4d\u7f6e\u81ea: +ringcompcfg.plus = \u52a0 +ringcompcfg.PositionValue = \u4f4d\u7f6e\u503c +ringcompcfg.Radialdistance = \u5f84\u5411\u8ddd\u79bb: +ringcompcfg.Distancefrom = \u5230\u706b\u7bad\u4e2d\u5fc3\u7ebf\u7684\u8ddd\u79bb +ringcompcfg.Radialdirection = \u5f84\u5411: +ringcompcfg.radialdirectionfrom = \u4ece\u706b\u7bad\u4e2d\u5fc3\u7ebf\u6cbf\u5f84\u5411 +ringcompcfg.but.Reset = \u91cd\u7f6e +ringcompcfg.but.Resetcomponant = \u91cd\u7f6e\u6240\u6709\u7ec4\u4ef6\u5bf9\u9f50\u4e2d\u5fc3\u7ebf +ringcompcfg.EngineBlock.desc = \u53d1\u52a8\u673a\u5ea7\u7528\u4e8e\u9632\u6b62\u53d1\u52a8\u673a\u5411\u524d\u7a9c\u51fa\u7bad\u4f53.

\u6dfb\u52a0\u53d1\u52a8\u673a\u524d\u8bf7\u5148\u6dfb\u52a0\u7bad\u4f53\u6216\u5185\u7ba1\u5e76\u5728\u53d1\u52a8\u673a\u9875\u9762\u4e0a\u6807\u8bb0\u4e3a\u53d1\u52a8\u673a\u5ea7. +ringcompcfg.note.desc = \u6ce8\u610f: \u5185\u7ba1\u4e0d\u4f1a\u5f71\u54cd\u7a7a\u6c14\u52a8\u529b\u5b66(\u5373\u4f7f\u662f\u8d85\u51fa\u7bad\u4f53\u4e5f\u4e0d\u4f1a). + + +! Body Tube Config +BodyTubecfg.lbl.Bodytubelength = \u7bad\u4f53\u957f\u5ea6: +BodyTubecfg.lbl.Outerdiameter = \u5916\u76f4\u5f84: +BodyTubecfg.lbl.Innerdiameter = \u5185\u76f4\u5f84: +BodyTubecfg.lbl.Wallthickness = \u58c1\u539a: +BodyTubecfg.tab.General = \u5e38\u89c4 +BodyTubecfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 +BodyTubecfg.tab.Motor = \u53d1\u52a8\u673a +BodyTubecfg.tab.Motormountconf = \u53d1\u52a8\u673a\u5ea7\u8bbe\u7f6e +BodyTubecfg.checkbox.Automatic = \u81ea\u52a8 +BodyTubecfg.checkbox.Filled = \u5b9e\u5fc3 + +! FinSetConfig +FinSetConfig.tab.Fintabs = \u7a33\u5b9a\u7ffc +FinSetConfig.tab.Through-the-wall = \u7a7f\u8fc7\u7ba1\u58c1\u7684\u5c3e\u7ffc +FinSetConfig.but.Converttofreeform = \u8f6c\u4e3a\u81ea\u7531\u66f2\u9762 +FinSetConfig.but.Converttofreeform.ttip = \u5c06\u7ffc\u8f6c\u6362\u4e3a\u81ea\u7531\u66f2\u9762\u7ffc +FinSetConfig.Convertfinset = \u8f6c\u6362\u7ffc +FinSetConfig.but.Splitfins = \u5206\u79bb\u7ffc +FinSetConfig.but.Splitfins.ttip = \u5c06\u4e00\u4e2a\u7ffc\u5206\u6210\u591a\u4e2a\u7ffc +FinSetConfig.but.AutoCalc = \u81ea\u52a8\u8ba1\u7b97 +FinSetConfig.lbl.Through-the-wall = \u7a7f\u8fc7\u7ba1\u58c1\u7684\u5c3e\u7ffc: +FinSetConfig.lbl.Tablength = \u677f\u957f: +FinSetConfig.ttip.Tablength = \u7ffc\u677f\u7684\u957f\u5ea6. +FinSetConfig.lbl.Tabheight = \u677f\u9ad8: +FinSetConfig.ttip.Tabheight = \u7ffc\u5c55\u65b9\u5411\u7684\u9ad8\u5ea6. +FinSetConfig.lbl.Tabposition = \u4f4d\u7f6e: +FinSetConfig.ttip.Tabposition = \u7ffc\u677f\u7684\u4f4d\u7f6e. +FinSetConfig.lbl.relativeto = \u76f8\u5bf9\u4e8e + +!FinMarkingGuide +FinMarkingGuide.lbl.Front = \u524d + +! MotorDatabaseLoadingDialog +MotorDbLoadDlg.title = \u8bfb\u53d6\u53d1\u52a8\u673a\u6570\u636e +MotorDbLoadDlg.Loadingmotors = \u6b63\u5728\u8bfb\u53d6\u53d1\u52a8\u673a\u6570\u636e... + +! AppearanceConfig +AppearanceCfg.lbl.Appearance = \u5916\u89c2 +AppearanceCfg.lbl.Usedefault = \u4f7f\u7528\u9ed8\u8ba4 +AppearanceCfg.but.edit = \u7f16\u8f91 +AppearanceCfg.but.savedefault = \u8bbe\u4e3a\u9ed8\u8ba4\u5916\u89c2 +AppearanceCfg.lbl.Texture = \u7eb9\u7406: +AppearanceCfg.lbl.shine = \u5149\u4eae: +AppearanceCfg.lbl.color.Color = \u8272\u5f69: +AppearanceCfg.lbl.color.diffuse = \u6269\u6563\u8272\u5f69: +AppearanceCfg.lbl.color.ambient = \u73af\u5883\u8272: +AppearanceCfg.lbl.color.specular = \u9ad8\u5149\u989c\u8272: +AppearanceCfg.lbl.texture.scale = \u7f29\u653e: +AppearanceCfg.lbl.texture.offset = \u4f4d\u79fb: +AppearanceCfg.lbl.texture.center = \u5c45\u4e2d: +AppearanceCfg.lbl.texture.rotation = \u65cb\u8f6c: +AppearanceCfg.lbl.texture.repeat = \u91cd\u590d: + +! Texture Wrap Modes +TextureWrap.Repeat = \u91cd\u590d +TextureWrap.Mirror = \u91cd\u590d & \u955c\u50cf +TextureWrap.Clamp = \u56fa\u5b9a\u8fb9\u7f18\u50cf\u7d20 +TextureWrap.Sticker = \u8d34\u7eb8 + +! RocketConfig +RocketCfg.lbl.Designname = \u8bbe\u8ba1\u7a3f\u540d\u79f0: +RocketCfg.lbl.Designer = \u8bbe\u8ba1\u4eba: +RocketCfg.lbl.Comments = \u6ce8\u91ca: +RocketCfg.lbl.Revisionhistory = \u4fee\u8ba2\u5386\u53f2: +RocketCfg.lbl.Material = \u6750\u6599: + +! ShockCordConfig +ShockCordCfg.lbl.Shockcordlength = \u51cf\u9707\u7d22\u957f\u5ea6: + +! RocketComponentConfig +RocketCompCfg.lbl.Componentname = \u7ec4\u4ef6\u540d\u79f0: +RocketCompCfg.ttip.Thecomponentname = \u7ec4\u4ef6\u540d\u79f0. +RocketCompCfg.tab.Override = \u8986\u5199 +RocketCompCfg.tab.MassandCGoverride = \u8d28\u91cf\u53ca\u91cd\u5fc3\u9009\u9879 +RocketCompCfg.tab.Figure = \u6837\u5f0f +RocketCompCfg.tab.Figstyleopt = \u6837\u5f0f\u9009\u9879 +RocketCompCfg.tab.Comment = \u6ce8\u91ca +RocketCompCfg.tab.Specifyacomment = \u7ec4\u4ef6\u6ce8\u91ca +RocketCompCfg.tab.Appearance = \u5916\u89c2 +RocketCompCfg.lbl.Mass = \u8d28\u91cf: +RocketCompCfg.lbl.Componentmass = \u7ec4\u4ef6\u8d28\u91cf: +RocketCompCfg.lbl.overriddento = (\u8986\u5199\u5230 +RocketCompCfg.lbl.overriddenby = (\u88ab\u8986\u5199 +RocketCompCfg.lbl.Componentmaterial = \u7ec4\u4ef6\u6750\u6599: +RocketCompCfg.lbl.Componentfinish = \u7ec4\u4ef6\u8868\u9762\u5904\u7406: +RocketCompCfg.lbl.ttip.componentmaterialaffects = \u7ec4\u4ef6\u6750\u6599\u5c06\u4f1a\u5f71\u54cd\u5230\u7ec4\u4ef6\u91cd\u91cf. +RocketCompCfg.combo.ttip.componentmaterialaffects = \u7ec4\u4ef6\u6750\u6599\u5c06\u4f1a\u5f71\u54cd\u5230\u7ec4\u4ef6\u91cd\u91cf. +RocketCompCfg.lbl.longA1 = \u8868\u9762\u5904\u7406\u5c06\u4f1a\u5f71\u54cd\u5230\u7ec4\u4ef6\u7684\u7a7a\u6c14\u52a8\u529b.
+RocketCompCfg.lbl.longA2 = \u8be5\u6570\u503c\u4e3a\u5e73\u5747\u8868\u9762\u7c97\u7cd9\u5ea6. +RocketCompCfg.but.Setforall = \u8bbe\u7f6e\u6240\u6709 +RocketCompCfg.but.ttip.Setforall = \u5bf9\u6240\u6709\u7684\u7ec4\u4ef6\u4f7f\u7528\u540c\u79cd\u8868\u9762\u5904\u7406. +RocketCompCfg.lbl.Overridemassorcenter = \u8986\u5199\u91cd\u91cf\u6216\u91cd\u5fc3 +RocketCompCfg.checkbox.Overridemass = \u8986\u5199\u8d28\u91cf: +RocketCompCfg.checkbox.Overridecenterofgrav = \u8986\u5199\u91cd\u5fc3: +RocketCompCfg.checkbox.OverridemassandCG = \u8986\u5199\u6240\u6709\u7ec4\u4ef6\u7684\u91cd\u91cf\u548c\u91cd\u5fc3 +RocketCompCfg.lbl.longB1 = \u8986\u5199\u8d28\u91cf\u4e0d\u5305\u62ec\u53d1\u52a8\u673a.
+RocketCompCfg.lbl.longB2 = \u91cd\u5fc3\u4ece\u5934\u90e8\u5f00\u59cb\u8ba1\u7b97 +RocketCompCfg.lbl.Commentsonthe = \u6ce8\u91ca +RocketCompCfg.lbl.Figurestyle = \u6837\u5f0f: +RocketCompCfg.lbl.Componentcolor = \u7ec4\u4ef6\u989c\u8272: +RocketCompCfg.lbl.Choosecolor = \u989c\u8272\u9009\u62e9 +RocketCompCfg.checkbox.Usedefaultcolor = \u9ed8\u8ba4\u989c\u8272 +RocketCompCfg.lbl.Complinestyle = \u7ec4\u4ef6\u7ebf\u578b: +RocketCompCfg.but.Saveasdefstyle = \u4fdd\u5b58\u4e3a\u9ed8\u8ba4\u6837\u5f0f +RocketCompCfg.lbl.Diameter = \u76f4\u5f84: +RocketCompCfg.lbl.Length = \u957f\u5ea6: +RocketCompCfg.lbl.Thickness = \u539a\u5ea6: +RocketCompCfg.checkbox.Endcapped = \u6709\u7aef\u76d6 +RocketCompCfg.ttip.Endcapped = \u8fde\u63a5\u5904\u7ec8\u7aef\u662f\u5426\u6709\u76d6. +RocketCompCfg.title.Noseconeshoulder = \u5934\u9525\u8fde\u63a5\u5904 +RocketCompCfg.title.Aftshoulder = \u524d\u8fde\u63a5\u5904 +RocketCompCfg.border.Foreshoulder = \u540e\u8fde\u63a5\u5904 +!RocketCompCfg.lbl.Length = \u957f\u5ea6: + +! BulkheadConfig +BulkheadCfg.tab.Diameter = \u76f4\u5f84: +BulkheadCfg.tab.Thickness = \u539a\u5ea6: +BulkheadCfg.tab.General = \u5e38\u89c4 +BulkheadCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 + +!CenteringRingConfig +CenteringRingCfg.tab.Outerdiam = \u5916\u76f4\u5f84: +CenteringRingCfg.tab.Innerdiam = \u5185\u76f4\u5f84: +CenteringRingCfg.tab.Thickness = \u539a\u5ea6: +CenteringRingCfg.tab.General = \u5e38\u89c4 +CenteringRingCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 + +!ComponentConfigDialog +ComponentCfgDlg.configuration = \u8bbe\u7f6e +ComponentCfgDlg.configuration1 = +ComponentCfgDlg.Modify = \u4fee\u6539 + +!StageConfig +StageConfig.tab.Separation = \u5206\u79bb +StageConfig.tab.Separation.ttip = \u591a\u7ea7\u5206\u79bb\u9009\u9879 +StageConfig.separation.lbl.title = \u8bbe\u5b9a\u5206\u79bb\u65f6\u673a: +StageConfig.separation.lbl.plus = \u52a0 +StageConfig.separation.lbl.seconds = \u79d2 + +!EllipticalFinSetConfig +EllipticalFinSetCfg.Nbroffins = \u7a33\u5b9a\u7ffc\u6570\u91cf: +EllipticalFinSetCfg.Rotation = \u65cb\u5ea6: +EllipticalFinSetCfg.Fincant = \u7a33\u5b9a\u7ffc\u9762\u89d2: +EllipticalFinSetCfg.Rootchord = \u7ffc\u6839\u5f26\u957f: +EllipticalFinSetCfg.Height = \u9ad8\u5ea6: +EllipticalFinSetCfg.Positionrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +EllipticalFinSetCfg.plus = \u52a0 +EllipticalFinSetCfg.FincrossSection = \u7a33\u5b9a\u7ffc\u6a2a\u622a\u9762: +EllipticalFinSetCfg.Thickness = \u539a\u5ea6: +EllipticalFinSetCfg.General = \u5e38\u89c4 +EllipticalFinSetCfg.Generalproperties = \u5e38\u89c4\u5c5e\u6027 +EllipticalFinSetCfg.ttip.Fincant = \u7a33\u5b9a\u7ffc\u7ffc\u9762\u4e0e\u7bad\u4f53\u4e4b\u95f4\u7684\u5939\u89d2. + +!FreeformFinSetConfig +FreeformFinSetCfg.tab.General = \u5e38\u89c4 +FreeformFinSetCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 +FreeformFinSetCfg.tab.Shape = \u5f62\u72b6 +FreeformFinSetCfg.tab.ttip.Finshape = \u7a33\u5b9a\u7ffc\u5f62\u72b6 +FreeformFinSetCfg.lbl.Numberoffins = \u7a33\u5b9a\u7ffc\u6570\u91cf: +FreeformFinSetCfg.lbl.Finrotation = \u7a33\u5b9a\u7ffc\u65cb\u5ea6: +FreeformFinSetCfg.lbl.Fincant = \u7a33\u5b9a\u7ffc\u9762\u89d2: +FreeformFinSetCfg.lbl.ttip.Fincant = \u7a33\u5b9a\u7ffc\u7ffc\u9762\u4e0e\u7bad\u4f53\u4e4b\u95f4\u7684\u5939\u89d2. +FreeformFinSetCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +FreeformFinSetCfg.lbl.plus = \u52a0 +FreeformFinSetCfg.lbl.FincrossSection = \u7a33\u5b9a\u7ffc\u6a2a\u5207\u9762: +FreeformFinSetCfg.lbl.Thickness = \u539a\u5ea6: +! doubleClick1 + 2 form the message "Double-click to edit", split approximately at the middle +FreeformFinSetConfig.lbl.doubleClick1 = \u53cc\u51fb +FreeformFinSetConfig.lbl.doubleClick2 = \u7f16\u8f91 +FreeformFinSetConfig.lbl.clickDrag = \u5355\u51fb+\u62d6\u62fd: \u6dfb\u52a0,\u79fb\u52a8\u70b9 +FreeformFinSetConfig.lbl.ctrlClick = Ctrl+\u5355\u51fb: \u5220\u9664\u70b9 +FreeformFinSetConfig.lbl.scaleFin = \u7f29\u653e\u7a33\u5b9a\u7ffc + +!TubeFinSetConfig +TubeFinSetCfg.lbl.Nbroffins = \u7ffc\u6570\u91cf: +TubeFinSetCfg.lbl.Length = \u957f\u5ea6: +TubeFinSetCfg.lbl.Outerdiam = \u5916\u76f4\u5f84: +TubeFinSetCfg.checkbox.Automatic = \u81ea\u52a8 +TubeFinSetCfg.lbl.Innerdiam = \u5185\u76f4\u5f84: +TubeFinSetCfg.lbl.Thickness = \u539a\u5ea6: +TubeFinSetCfg.lbl.Finrotation = \u7ffc\u7fc5\u65cb\u5ea6: +TubeFinSetCfg.lbl.ttip.Finrotation = \u7a33\u5b9a\u7ffc\u7ec4\u5408\u91cc\u7b2c\u4e00\u7247\u7684\u89d2\u5ea6 + +!InnerTubeConfig +InnerTubeCfg.tab.Motor = \u53d1\u52a8\u673a +InnerTubeCfg.tab.ttip.Motor = \u53d1\u52a8\u673a\u5ea7\u8bbe\u7f6e +InnerTubeCfg.tab.Cluster = \u7c07 +InnerTubeCfg.tab.ttip.Cluster = \u7c07\u8bbe\u7f6e +InnerTubeCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e +InnerTubeCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e +InnerTubeCfg.lbl.Selectclustercfg = \u9009\u62e9\u7c07\u8bbe\u7f6e: +InnerTubeCfg.lbl.TubeSep = \u7bad\u4f53\u5206\u6bb5: +InnerTubeCfg.lbl.ttip.TubeSep = \u8bbe\u7f6e\u7bad\u4f53\u5206\u6bb5, 1.0 = \u7d27\u90bb +InnerTubeCfg.lbl.Rotation = \u65cb\u5ea6: +InnerTubeCfg.lbl.ttip.Rotation = \u8bbe\u7f6e\u7c07\u7684\u65cb\u5ea6\u89d2 +InnerTubeCfg.lbl.Rotangle = \u8bbe\u7f6e\u7c07\u7684\u65cb\u5ea6\u89d2 +InnerTubeCfg.but.Splitcluster = \u62c6\u5206\u7c07 +InnerTubeCfg.lbl.longA1 = \u5c06\u7c07\u62c6\u5206\u6210\u4e0d\u540c\u7684\u7ec4\u4ef6.
+InnerTubeCfg.lbl.longA2 = \u4e5f\u4f1a\u5236\u5185\u7ba1\u7684\u5168\u90e8\u90e8\u4ef6. +InnerTubeCfg.but.Resetsettings = \u91cd\u7f6e\u8bbe\u7f6e +InnerTubeCfg.but.ttip.Resetsettings = \u64a4\u9500\u62c6\u5206\u65cb\u8f6c\u5230\u6700\u521d\u503c + +! LaunchLugConfig +LaunchLugCfg.lbl.Length = \u957f\u5ea6: +LaunchLugCfg.lbl.Outerdiam = \u5916\u76f4\u5f84: +LaunchLugCfg.lbl.Innerdiam = \u5185\u76f4\u5f84: +LaunchLugCfg.lbl.Thickness = \u539a\u5ea6: +LaunchLugCfg.lbl.Radialpos = \u5f84\u5411\u4f4d\u7f6e: +LaunchLugCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +LaunchLugCfg.lbl.plus = \u52a0 +LaunchLugCfg.tab.General = \u5e38\u89c4 +LaunchLugCfg.tab.Generalprop = \u5e38\u89c4\u5c5e\u6027 + +! MassComponentConfig +MassComponentCfg.lbl.Mass = \u8d28\u91cf: +MassComponentCfg.lbl.Density = \u8fd1\u4f3c\u5bc6\u5ea6: +MassComponentCfg.lbl.Length = \u957f\u5ea6: +MassComponentCfg.lbl.Diameter = \u76f4\u5f84: +MassComponentCfg.lbl.PosRelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +MassComponentCfg.lbl.plus = \u52a0 +MassComponentCfg.tab.General = \u5e38\u89c4 +MassComponentCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 +MassComponentCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e +MassComponentCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e\u8bbe\u7f6e +MassComponentCfg.lbl.Radialdistance = \u5f84\u5411\u8ddd\u79bb: +MassComponentCfg.lbl.Radialdirection = \u5f84\u5411\u65b9\u5411: +MassComponentCfg.but.Reset = \u91cd\u7f6e +MassComponentCfg.lbl.type = \u7c7b\u578b + +! MotorConfig +MotorCfg.checkbox.compmotormount = \u8be5\u7ec4\u4ef6\u4e3a\u53d1\u52a8\u673a\u5ea7 +MotorCfg.lbl.Flightcfg = \u98de\u884c\u914d\u7f6e: +MotorCfg.but.New = \u65b0\u5efa +MotorCfg.but.FlightcfgEdit = \u7f16\u8f91 +MotorCfg.lbl.Currentmotor = \u5f53\u524d\u53d1\u52a8\u673a: +MotorCfg.lbl.Motoroverhang = \u53d1\u52a8\u673a\u6a2a\u7f69\u91cf: +MotorCfg.lbl.Ignitionat = \u70b9\u706b\u65f6\u523b: +MotorCfg.lbl.plus = \u52a0 +MotorCfg.lbl.seconds = \u79d2 +MotorCfg.lbl.longA1 = \u5f53\u524d\u8bbe\u8ba1\u7a3f\u4e3a\u5355\u7ea7\u706b\u7bad. +MotorCfg.lbl.longA2 = \u70b9\u51fb\"\u65b0\u5efa\u7ea7\"\u5efa\u7acb\u65b0\u7684\u706b\u7bad\u7ea7. +MotorCfg.lbl.longB1 = \u5f53\u524d\u8bbe\u8ba1\u7a3f\u6709 +MotorCfg.lbl.longB2 = \u4e2a\u706b\u7bad\u7ea7. +MotorCfg.but.Selectmotor = \u9009\u62e9\u53d1\u52a8\u673a +MotorCfg.but.Removemotor = \u79fb\u9664\u53d1\u52a8\u673a +MotorCfg.lbl.motorLabel = \u65e0 + +! NoseConeConfig +NoseConeCfg.lbl.Noseconeshape = \u5934\u9525\u5916\u5f62: +NoseConeCfg.lbl.Shapeparam = \u5916\u5f62\u53c2\u6570: +NoseConeCfg.lbl.Noseconelength = \u5934\u9525\u957f\u5ea6: +NoseConeCfg.lbl.Basediam = \u5e95\u5ea7\u76f4\u5f84: +NoseConeCfg.checkbox.Automatic = \u81ea\u52a8 +NoseConeCfg.lbl.Wallthickness = \u58c1\u539a: +NoseConeCfg.checkbox.Filled = \u5b9e\u5fc3 +NoseConeCfg.tab.General = \u5e38\u89c4 +NoseConeCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 +NoseConeCfg.tab.Shoulder = \u8fde\u63a5\u5904 +NoseConeCfg.tab.ttip.Shoulder = \u8fde\u63a5\u5904\u5c5e\u6027 + +! ParachuteConfig +ParachuteCfg.lbl.Canopy = \u4f1e\u8863: +ParachuteCfg.lbl.Diameter = \u76f4\u5f84: +ParachuteCfg.lbl.Material = \u6750\u6599: +ParachuteCfg.combo.MaterialModel = \u6750\u6599\u4f1a\u5f71\u54cd\u7ec4\u4ef6\u91cd\u91cf. +ParachuteCfg.lbl.longA1 = \u963b\u529b\u7cfb\u6570 CD: +ParachuteCfg.lbl.longB1 = \u963b\u529b\u7cfb\u6570\u7531\u964d\u843d\u4f1e\u9762\u79ef\u51b3\u5b9a.
+ParachuteCfg.lbl.longB2 = \u9ad8\u963b\u529b\u7cfb\u6570\u80fd\u653e\u7f13\u4e0b\u964d\u901f\u7387. +ParachuteCfg.lbl.longB3 = \u964d\u843d\u4f1e\u7684\u963b\u529b\u7cfb\u6570\u901a\u5e38\u4e3a0.8. +ParachuteCfg.but.Reset = \u91cd\u7f6e +ParachuteCfg.lbl.Shroudlines = \u540a\u7d22: +ParachuteCfg.lbl.Numberoflines = \u540a\u7d22\u6570\u91cf: +ParachuteCfg.lbl.Linelength = \u957f\u5ea6: +ParachuteCfg.lbl.Material = \u6750\u6599: +ParachuteCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +ParachuteCfg.lbl.plus = \u52a0 +ParachuteCfg.lbl.Packedlength = \u4f1e\u5305\u957f\u5ea6: +ParachuteCfg.lbl.Packeddiam = \u4f1e\u5305\u76f4\u5f84: +ParachuteCfg.lbl.Deploysat = \u5c55\u5f00\u65f6\u673a: +ParachuteCfg.lbl.seconds = \u79d2 +ParachuteCfg.lbl.Altitude = \u9ad8\u5ea6: +ParachuteCfg.tab.General = \u5e38\u89c4 +ParachuteCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 +ParachuteCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e +ParachuteCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e\u8bbe\u7f6e +ParachuteCfg.lbl.Radialdistance = \u5f84\u5411\u8ddd\u79bb: +ParachuteCfg.lbl.Radialdirection = \u5f84\u5411\u65b9\u5411: +ParachuteCfg.but.Reset = \u91cd\u7f6e +ParachuteCfg.lbl.plusdelay = \u52a0 + +! ShockCordConfig +ShockCordCfg.lbl.Shockcordlength = \u51cf\u9707\u7d22\u957f\u5ea6: +ShockCordCfg.lbl.Shockcordmaterial = \u51cf\u9707\u7d22\u6750\u6599: +ShockCordCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +ShockCordCfg.lbl.plus = \u52a0 +ShockCordCfg.lbl.Packedlength = \u4f1e\u5305\u957f\u5ea6: +ShockCordCfg.lbl.Packeddiam = \u4f1e\u5305\u76f4\u5f84: +ShockCordCfg.tab.General = \u5e38\u89c4 +ShockCordCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 + +!SleeveConfig +SleeveCfg.tab.Outerdiam = \u5957\u7ba1\u5916\u76f4\u5f84: +SleeveCfg.tab.Innerdiam = \u5957\u7ba1\u5185\u76f4\u5f84: +SleeveCfg.tab.Wallthickness = \u58c1\u539a: +SleeveCfg.tab.Length = \u957f\u5ea6: +SleeveCfg.tab.General = \u5e38\u89c4 +SleeveCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 + +! StreamerConfig +StreamerCfg.lbl.Striplength = \u98d8\u5e26\u957f\u5ea6: +StreamerCfg.lbl.Stripwidth = \u98d8\u5e26\u5bbd\u5ea6: +StreamerCfg.lbl.Striparea = \u98d8\u5e26\u9762\u79ef: +StreamerCfg.lbl.Aspectratio = \u9ad8\u5bbd\u6bd4: +StreamerCfg.lbl.Material = \u6750\u6599: +StreamerCfg.combo.ttip.MaterialModel = \u6750\u6599\u4f1a\u5f71\u54cd\u7ec4\u4ef6\u91cd\u91cf. +StreamerCfg.lbl.longA1 = \u963b\u529b\u7cfb\u6570 CD: +StreamerCfg.lbl.longB1 = \u963b\u529b\u7cfb\u6570\u7531\u98d8\u5e26\u9762\u79ef\u51b3\u5b9a.
+StreamerCfg.lbl.longB2 = \u9ad8\u963b\u529b\u7cfb\u6570\u80fd\u653e\u7f13\u4e0b\u964d\u901f\u7387. +StreamerCfg.lbl.Automatic = \u81ea\u52a8 +StreamerCfg.lbl.longC1 = \u963b\u529b\u7cfb\u6570\u7531\u98d8\u5e26\u9762\u79ef\u51b3\u5b9a. +StreamerCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +StreamerCfg.lbl.plus = \u52a0 +StreamerCfg.lbl.Packedlength = \u98d8\u5e26\u5305\u957f\u5ea6: +StreamerCfg.lbl.Packeddiam = \u98d8\u5e26\u5305\u76f4\u5f84: +StreamerCfg.lbl.Deploysat = \u5c55\u5f00\u65f6\u673a: +StreamerCfg.lbl.seconds = \u79d2 +StreamerCfg.lbl.Altitude = \u9ad8\u5ea6: +StreamerCfg.tab.General = \u5e38\u89c4 +StreamerCfg.tab.ttip.General = \u5e38\u89c4\u5c5e\u6027 +StreamerCfg.tab.Radialpos = \u5f84\u5411\u4f4d\u7f6e +StreamerCfg.tab.ttip.Radialpos = \u5f84\u5411\u4f4d\u7f6e\u8bbe\u7f6e +StreamerCfg.lbl.Radialdistance = \u5f84\u5411\u8ddd\u79bb: +StreamerCfg.lbl.Radialdirection = \u5f84\u5411\u65b9\u5411: +StreamerCfg.but.Reset = \u91cd\u7f6e +StreamerCfg.lbl.plusdelay = \u52a0 + +! ThicknessRingComponentConfig +ThicknessRingCompCfg.tab.Outerdiam = \u5916\u76f4\u5f84: +ThicknessRingCompCfg.tab.Innerdiam = \u5185\u76f4\u5f84: +ThicknessRingCompCfg.tab.Wallthickness = \u58c1\u539a: +ThicknessRingCompCfg.tab.Length = \u957f\u5ea6: +ThicknessRingCompCfg.tab.General = \u5e38\u89c4 +ThicknessRingCompCfg.tab.Generalprop = \u5e38\u89c4\u5c5e\u6027 + +! TransitionConfig +TransitionCfg.lbl.Transitionshape = \u7ea7\u95f4\u6bb5\u5f62\u72b6: +TransitionCfg.checkbox.Clipped = \u88c1\u526a +TransitionCfg.lbl.Shapeparam = \u5f62\u72b6\u53c2\u6570: +TransitionCfg.lbl.Transitionlength = \u7ea7\u95f4\u6bb5\u76f4\u5f84: +TransitionCfg.lbl.Forediam = \u524d\u76f4\u5f84 +TransitionCfg.checkbox.Automatic = \u81ea\u52a8 +TransitionCfg.lbl.Aftdiam = \u540e\u76f4\u5f84: +TransitionCfg.lbl.Wallthickness = \u58c1\u539a: +TransitionCfg.checkbox.Filled = \u5b9e\u5fc3 +TransitionCfg.tab.General = \u5e38\u89c4 +TransitionCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 +TransitionCfg.tab.Shoulder = \u8fde\u63a5\u5904 +TransitionCfg.tab.Shoulderproperties = \u8fde\u63a5\u5904\u5c5e\u6027 + +! TrapezoidFinSetConfig +TrapezoidFinSetCfg.lbl.Nbroffins = \u7a33\u5b9a\u7ffc\u6570\u91cf: +TrapezoidFinSetCfg.lbl.ttip.Nbroffins = \u68af\u5f62\u7a33\u5b9a\u7ffc\u7684\u6570\u91cf. +TrapezoidFinSetCfg.lbl.Finrotation = \u7a33\u5b9a\u7ffc\u65cb\u89d2: +TrapezoidFinSetCfg.lbl.ttip.Finrotation = \u7a33\u5b9a\u7ffc\u7ec4\u5408\u91cc\u7b2c\u4e00\u7247\u7684\u89d2\u5ea6 +TrapezoidFinSetCfg.lbl.Fincant = \u7a33\u5b9a\u7ffc\u9762\u89d2: +TrapezoidFinSetCfg.lbl.ttip.Fincant = \u7a33\u5b9a\u7ffc\u7ffc\u9762\u4e0e\u7bad\u4f53\u4e4b\u95f4\u7684\u5939\u89d2. +TrapezoidFinSetCfg.lbl.Rootchord = \u7ffc\u6839\u5f26: +TrapezoidFinSetCfg.lbl.Tipchord = \u7ffc\u68a2\u5f26: +TrapezoidFinSetCfg.lbl.Height = \u9ad8\u5ea6: +TrapezoidFinSetCfg.lbl.Sweeplength = \u540e\u63a0\u957f\u5ea6: +TrapezoidFinSetCfg.lbl.Sweepangle = \u540e\u63a0\u89d2: +TrapezoidFinSetCfg.lbl.FincrossSection = \u7a33\u5b9a\u7ffc\u6a2a\u622a\u9762: +TrapezoidFinSetCfg.lbl.Thickness = \u539a\u5ea6: +TrapezoidFinSetCfg.lbl.Posrelativeto = \u76f8\u5bf9\u4f4d\u7f6e: +TrapezoidFinSetCfg.lbl.plus = \u52a0 +TrapezoidFinSetCfg.tab.General = \u5e38\u89c4 +TrapezoidFinSetCfg.tab.Generalproperties = \u5e38\u89c4\u5c5e\u6027 + +! Fin Fillets +FinSetCfg.lbl.Finfilletmaterial = \u63a5\u7f1d\u6750\u6599: +FinSetCfg.lbl.Filletradius = \u63a5\u7f1d\u534a\u5f84: +FinsetCfg.ttip.Finfillets1 = \u5c06\u9884\u4f30\u8d28\u91cf\u6dfb\u52a0\u5230\u7ffc\u6839\u90e8.
+FinsetCfg.ttip.Finfillets2 = \u5047\u5b9a\u63a5\u7f1d\u5185\u51f9\u4e14\u548c\u7bad\u4f53\u3001\u7ffc\u677f\u76f8\u5207.
+FinsetCfg.ttip.Finfillets3 = \u65e0\u63a5\u7f1d\u60c5\u51b5\u4e0b\u5c06\u8bbe\u5b9a\u63a5\u7f1d\u534a\u5f84\u4e3a0. + +! Save RKT Warning Dialog +SaveRktWarningDialog.txt1=\u5bfc\u51fa\u5230RockSim\u6587\u4ef6\u683c\u5f0f\u65e0\u6cd5\u4fdd\u5168\u6240\u6709OpenRocket\u7279\u6027. +#N/A + +saveAs.openrocket.title=\u4fdd\u5b58\u4e3aOpenRocket ork\u6587\u4ef6 +saveAs.rocksim.title=\u5bfc\u51fa\u4e3aRockSim rtk\u6587\u4ef6 + +! StorageOptionChooser +StorageOptChooser.lbl.Simdatatostore = \u4fdd\u5b58\u4eff\u771f\u6570\u636e: +StorageOptChooser.rdbut.Allsimdata = \u6240\u6709\u4eff\u771f\u6570\u636e +StorageOptChooser.lbl.longA1 = \u4fdd\u5b58\u6240\u6709\u4eff\u771f\u6570\u636e.
+StorageOptChooser.lbl.longA2 = \u6587\u4ef6\u4f53\u79ef\u4f1a\u5f88\u5927! +StorageOptChooser.rdbut.Every = \u6bcf\u4e00\u4e2a +StorageOptChooser.lbl.longB1 = \u6bcf\u9694\u6570\u4e2a\u6570\u636e\u4fdd\u5b58\u4e00\u6b21.
+StorageOptChooser.lbl.longB2 = \u95f4\u9694\u8d8a\u5927\u6587\u4ef6\u4f53\u79ef\u8d8a\u5c0f. +StorageOptChooser.lbl.seconds = \u79d2 +StorageOptChooser.rdbut.Onlyprimfig = \u4ec5\u4fdd\u7559\u4e3b\u8981\u6570\u636e +StorageOptChooser.lbl.longC1 = \u4ec5\u4fdd\u7559\u7b80\u62a5\u8868\u683c\u4e2d\u663e\u793a\u7684\u6570\u636e.
+StorageOptChooser.lbl.longC2 = \u6587\u4ef6\u4f53\u79ef\u6700\u5c0f. +StorageOptChooser.lbl.longD1 = \u6839\u636e\u5f53\u524d\u8bbe\u7f6e\u6765\u4f30\u8ba1\u751f\u6210\u6587\u4ef6\u5927\u5927\u5c0f. +StorageOptChooser.ttip.Saveopt = \u4fdd\u5b58\u9009\u9879 +StorageOptChooser.lbl.Estfilesize = \u9884\u8ba1\u6587\u4ef6\u4f53\u79ef: +StorageOptChooser.lbl.Saveopt = \u4fdd\u5b58\u9009\u9879 + +! ThrustCurveMotorSelectionPanel +TCMotorSelPan.lbl.Selrocketmotor = \u9009\u62e9\u706b\u7bad\u53d1\u52a8\u673a: +TCMotorSelPan.checkbox.hideSimilar = \u9690\u85cf\u76f8\u4f3c\u7684\u63a8\u529b\u66f2\u7ebf +TCMotorSelPan.checkbox.hideUsed = \u9690\u85cf\u5df2\u4f7f\u7528\u7684\u53d1\u52a8\u673a +TCMotorSelPan.checkbox.limitlength = \u957f\u5ea6\u4e0d\u8d85\u8fc7\u5f53\u524d\u53d1\u52a8\u673a\u5ea7\u957f\u5ea6 +TCMotorSelPan.checkbox.limitdiameter = \u76f4\u5f84\u4e0d\u8d85\u8fc7\u5f53\u524d\u53d1\u52a8\u673a\u5ea7\u76f4\u5f84 +TCMotorSelPan.btn.details = \u663e\u793a\u8be6\u60c5 +TCMotorSelPan.btn.filter = \u7b5b\u9009\u53d1\u52a8\u673a +TCMotorSelPan.MotorSize = \u53d1\u52a8\u673a\u5c3a\u5bf8 +TCMotorSelPan.Diameter = \u76f4\u5f84 +TCMotorSelPan.Length = \u957f\u5ea6 +TCMotorSelPan.MotorMountDimensions = \u53d1\u52a8\u673a\u5ea7\u5c3a\u5bf8: +TCMotorSelPan.lbl.Search = \u641c\u7d22: +TCMotorSelPan.lbl.Selectthrustcurve = \u9009\u62e9\u63a8\u529b\u66f2\u7ebf: +TCMotorSelPan.lbl.Ejectionchargedelay = \u5f39\u5c04\u5ef6\u65f6: +TCMotorSelPan.equalsIgnoreCase.None = \u65e0 +TCMotorSelPan.lbl.NumberofsecondsorNone = (\u79d2\u6570\u6216\"\u65e0\") +TCMotorSelPan.lbl.Totalimpulse = \u603b\u51b2\u91cf: +TCMotorSelPan.lbl.Avgthrust = \u5e73\u5747\u63a8\u529b: +TCMotorSelPan.lbl.Maxthrust = \u6700\u5927\u63a8\u529b: +TCMotorSelPan.lbl.Burntime = \u71c3\u70e7\u65f6\u95f4: +TCMotorSelPan.lbl.Launchmass = \u53d1\u5c04\u8d28\u91cf: +TCMotorSelPan.lbl.Emptymass = \u71c3\u5c3d\u8d28\u91cf: +TCMotorSelPan.lbl.Datapoints = \u6570\u636e\u70b9: +TCMotorSelPan.lbl.Digest = \u6458\u8981: +TCMotorSelPan.title.Thrustcurve = \u63a8\u529b\u66f2\u7ebf: +TCMotorSelPan.title.Thrust = \u63a8\u529b +TCMotorSelPan.delayBox.None = \u65e0 +TCMotorSelPan.noDescription = \u63cf\u8ff0\u4e0d\u53ef\u7528. +TCMotorSelPan.btn.checkAll = \u5168\u9009 +TCMotorSelPan.btn.checkNone = \u5168\u6e05\u7a7a +TCMotorSelPan.btn.close = \u5173\u95ed + + + +! PlotDialog +PlotDialog.CheckBox.Showdatapoints = \u663e\u793a\u6570\u636e\u70b9 +PlotDialog.lbl.Chart = \u5de6\u952e\u62d6\u62fd\u79fb\u52a8\u6570\u636e\u533a. \u6eda\u8f6e\u7f29\u653e. ctrl-\u6eda\u8f6e\u4ec5\u7f29\u653eX\u8f74. ctrl-\u5de6\u952e\u62d6\u62fd\u79fb\u52a8\u89c6\u56fe. \u53f3\u952e\u8fc7\u62fd\u8c03\u6574\u663e\u793a\u5927\u5c0f. + +ComponentTree.ttip.massoverride = \u8986\u5199\u91cd\u91cf +ComponentTree.ttip.cgoverride = \u8986\u5199\u91cd\u5fc3 +! "main" prefix is used for the main application dialog + +# FIXME: Rename the description keys + +main.menu.file = \u6587\u4ef6 +main.menu.file.desc = \u6587\u4ef6\u5904\u7406\u4efb\u52a1 +main.menu.file.new = \u65b0\u5efa +main.menu.file.new.desc = \u65b0\u5efa\u706b\u7bad\u8bbe\u8ba1\u7a3f +main.menu.file.open = \u6253\u5f00... +main.menu.file.open.desc = \u6253\u5f00\u706b\u7bad\u8bbe\u8ba1 +main.menu.file.openRecent = \u6700\u8fd1\u6253\u5f00... +main.menu.file.openRecent.desc = \u6253\u5f00\u6700\u8fd1\u7684\u706b\u7bad\u8bbe\u8ba1 +main.menu.file.openExample = \u6253\u5f00\u8303\u4f8b... +main.menu.file.openExample.desc = \u6253\u5f00\u706b\u7bad\u8bbe\u8ba1\u8303\u4f8b +main.menu.file.save = \u4fdd\u5b58 +main.menu.file.save.desc = \u4fdd\u5b58\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1 +main.menu.file.saveAs = \u53e6\u5b58\u4e3a... +main.menu.file.saveAs.desc = \u4fdd\u5b58\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1\u5230\u65b0\u6587\u4ef6 +main.menu.file.import = \u5bfc\u5165... +main.menu.file.import.desc = \u4eceRockSim rtk\u6587\u4ef6\u5bfc\u5165\u6a21\u578b +main.menu.file.export = \u5bfc\u51fa... +main.menu.file.export.desc = \u5bfc\u51fa\u6a21\u578b\u5230RockSim rkt\u6587\u4ef6 +main.menu.file.print = \u6253\u5370/\u5bfc\u51faPDF... +main.menu.file.print.desc = \u5c06\u5404\u4e2a\u7ec4\u4ef6\u6253\u5370\u6216\u4fdd\u5b58\u4e3aPDF\u6587\u4ef6 +main.menu.file.close = \u5173\u95ed +main.menu.file.close.desc = \u5173\u95ed\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1 +main.menu.file.quit = \u9000\u51fa +main.menu.file.quit.desc = \u9000\u51fa\u7a0b\u5e8f +main.menu.file.exportDecal = \u5bfc\u51fa\u8d34\u82b1 +main.menu.file.exportDecal.desc = \u5bfc\u51fa\u5f53\u524d\u8bbe\u8ba1\u7a3f\u7684\u8d34\u82b1\u4f9b\u5916\u90e8\u7a0b\u5e8f\u4fee\u6539\u7f16\u8f91. + +main.menu.edit = \u7f16\u8f91 +main.menu.edit.desc = \u706b\u7bad\u7f16\u8f91 +main.menu.edit.undo = \u64a4\u9500 +main.menu.edit.undo.desc = \u64a4\u9500\u64cd\u4f5c +main.menu.edit.redo = \u91cd\u505a +main.menu.edit.redo.desc = \u91cd\u505a\u64cd\u4f5c +main.menu.edit.cut = \u526a\u5207 +main.menu.edit.copy = \u590d\u5236 +main.menu.edit.paste = \u7c98\u8d34 +main.menu.edit.delete = \u5220\u9664 +main.menu.edit.resize = \u7f29\u653e... +main.menu.edit.resize.desc = \u7f29\u653e\u706b\u7bad\u8bbe\u8ba1\u7a3f +main.menu.edit.editpreset= \u7f16\u8f91\u7ec4\u4ef6\u9884\u8bbe\u6587\u4ef6 +main.menu.edit.preferences = \u9996\u9009\u9879 +main.menu.edit.preferences.desc = \u4fee\u6539\u5e94\u7528\u7a0b\u5e8f\u9996\u9009\u9879 + +main.menu.analyze = \u5206\u6790 +main.menu.analyze.desc = \u706b\u7bad\u5206\u6790 +main.menu.analyze.componentAnalysis = \u7ec4\u4ef6\u5206\u6790 +main.menu.analyze.componentAnalysis.desc = \u4ec5\u5206\u6790\u706b\u7bad\u90e8\u4ef6 +main.menu.analyze.optimization = \u706b\u7bad\u4f18\u5316 +main.menu.analyze.optimization.desc = \u5e38\u89c4\u706b\u7bad\u8bbe\u8ba1\u4f18\u5316 +main.menu.analyze.customExpressions = \u81ea\u5b9a\u4e49\u8868\u8fbe\u5f0f +main.menu.analyze.customExpressions.desc = \u901a\u8fc7\u81ea\u5b9a\u4e49\u7684\u6570\u5b66\u8868\u8fbe\u5f0f\u6765\u5b9a\u4e49\u65b0\u7684\u98de\u884c\u6570\u636e\u7c7b\u578b + +main.menu.help = \u5e2e\u52a9 +main.menu.help.desc = OpenRocket\u76f8\u5173\u4fe1\u606f +main.menu.help.tours = \u6559\u7a0b +main.menu.help.tours.desc = OpenRocket\u76f8\u5173\u6559\u7a0b +main.menu.help.license = \u8bb8\u53ef\u8bc1 +main.menu.help.license.desc = OpenRocket \u8bb8\u53ef\u8bc1\u4fe1\u606f +main.menu.help.bugReport = \u9519\u8bef\u62a5\u544a +main.menu.help.bugReport.desc = \u5173\u4e8e\u5982\u4f55\u62a5\u544aOpenRocket\u4e2d\u7684\u9519\u8bef +main.menu.help.debugLog = \u8c03\u8bd5\u65e5\u5fd7 +main.menu.help.debugLog.desc = \u67e5\u770bOpenRocket\u8c03\u8bd5\u65e5\u5fd7 +main.menu.help.about = \u5173\u4e8e +main.menu.help.about.desc = OpenRocket\u7248\u6743\u4fe1\u606f + +main.menu.debug = \u8c03\u8bd5 +main.menu.debug.whatisthismenu = \u8fd9\u662f\u4ec0\u4e48\u83dc\u5355? +main.menu.debug.createtestrocket = \u5efa\u7acb\u6d4b\u8bd5\u706b\u7bad + +! database +! Translate here all material database +! + +Material.CUSTOM = \u81ea\u5b9a\u4e49 + +! Material database +Databases.materials.types.Bulk = \u4f53 +Databases.materials.types.Line = \u7ebf +Databases.materials.types.Surface = \u9762 + +! BULK_MATERIAL +material.acrylic = \u4e9a\u514b\u529b +material.aluminum = \u94dd +material.balsa = \u8f7b\u6728 +material.basswood = \u6934\u6728 +material.birch = \u6866\u6728 +material.brass = \u9ec4\u94dc +material.cardboard = \u786c\u7eb8\u677f +material.carbon_fiber = \u78b3\u7ea4\u7ef4 +material.cork = \u8f6f\u6728 +material.depron_xps = Depron(\u6324\u5851\u805a\u82ef\u4e59\u70ef) +material.fiberglass = \u73bb\u7483\u7ea4\u7ef4 +material.kraft_phenolic = Kraft phenolic +material.maple = \u67ab\u6728 +material.paper_office = \u529e\u516c\u7eb8 +material.pine = \u677e\u6728 +material.plywood_birch = \u80f6\u5408\u677f(\u6866\u6728) +material.polycarbonate_lexan = \u805a\u78b3\u9178\u916f(Lexan) +material.polystyrene = \u805a\u82ef\u4e59\u70ef +material.pvc = PVC +material.spruce = \u6749\u6728 +material.steel = \u94a2\u94c1 +material.styrofoam_generic_eps = \u53d1\u6ce1\u805a\u82ef\u4e59\u70ef +material.styrofoam_blue_foam_xps = \u6324\u5851\u805a\u82ef\u4e59\u70ef \"Blue foam\" +material.titanium = \u949b +material.quantum_tubing = Quantum tubing +material.blue_tube = Blue tube +!SURFACE_MATERIAL +material.ripstop_nylon = \u683c\u5b50\u5c3c\u9f99 +material.mylar = \u805a\u916f\u8584\u819c (\u805a\u4e59\u70ef\u5bf9\u82ef\u4e8c\u9178) +material.polyethylene_thin = \u805a\u4e59\u70ef (\u8f7b\u8584) +material.polyethylene_heavy = \u805a\u4e59\u70ef (\u539a\u91cd) +material.silk = \u4e1d\u7ef8 +material.paper_office = \u529e\u516c\u7eb8 +material.cellophane = \u73bb\u7483\u7eb8 +material.crepe_paper = \u76b1\u7eb9\u7eb8 +! LINE_MATERIAL +material.thread_heavy_duty = \u7ebf (\u5927\u8f7d\u91cd) +material.elastic_cord_round_2_mm_1_16_in = \u677e\u7d27\u7ef3 (\u5706 2 mm, 1/16 in) +material.elastic_cord_flat_6_mm_1_4_in = \u677e\u7d27\u7ef3 (\u6241 6 mm, 1/4 in) +material.elastic_cord_flat_12_mm_1_2_in = \u677e\u7d27\u7ef3 (\u6241 12 mm, 1/2 in) +material.elastic_cord_flat_19_mm_3_4_in = \u677e\u7d27\u7ef3 (\u6241 19 mm, 3/4 in) +material.elastic_cord_flat_25_mm_1_in = \u677e\u7d27\u7ef3 (\u6241 25 mm, 1 in) +material.braided_nylon_2_mm_1_16_in = \u5c3c\u9f99\u7f16\u7ec7\u7ef3 (2 mm, 1/16 in) +material.braided_nylon_3_mm_1_8_in = \u5c3c\u9f99\u7f16\u7ec7\u7ef3 (3 mm, 1/8 in) +material.tubular_nylon_11_mm_7_16_in = \u5c3c\u9f99\u7f16\u7ec7\u5e26 (11 mm, 7/16 in) +material.tubular_nylon_14_mm_9_16_in = \u5c3c\u9f99\u7f16\u7ec7\u5e26 (14 mm, 9/16 in) +material.tubular_nylon_25_mm_1_in = \u5c3c\u9f99\u7f16\u7ec7\u5e26 (25 mm, 1 in) + +! ExternalComponent +ExternalComponent.Rough = \u7c97\u7cd9 +ExternalComponent.Unfinished = \u7c97\u52a0\u5de5 +ExternalComponent.Regularpaint = \u666e\u901a\u6d82\u6599 +ExternalComponent.Smoothpaint = \u5149\u6ed1\u6d82\u6599 +ExternalComponent.Polished = \u629b\u5149 + +! LineStyle +LineStyle.Solid = \u5b9e\u7ebf +LineStyle.Dashed = \u865a\u7ebf +LineStyle.Dotted = \u70b9\u865a\u7ebf +LineStyle.Dash-dotted = \u70b9\u5212\u7ebf +LineStyle.Defaultstyle = \u9ed8\u8ba4\u6837\u5f0f + +! Shape +Shape.Conical = \u5706\u9525 +Shape.Conical.desc1 = \u5706\u9525\u5934\u9525\u90e8\u9762\u56fe\u4e3a\u4e09\u89d2\u5f62. +Shape.Conical.desc2 = \u5706\u9525\u7ea7\u95f4\u6bb5\u4e3a\u76f4\u7ebf. +Shape.Ogive = \u5c16\u9876\u62f1 +Shape.Ogive.desc1 = \u5c16\u9876\u5934\u9525\u7684\u90e8\u9762\u56fe\u4e3a\u5706\u5f27\u5207\u6bb5. \u5f62\u72b6\u53c2\u65701\u4e3a\u5207\u9762\u5c16\u62f1, \u548c\u7bad\u4f53\u5e73\u6ed1\u8fc7\u6e21, \u53c2\u6570\u5c0f\u4e8e1\u4e3a\u5272\u9762\u5c16\u62f1. +Shape.Ogive.desc2 = \u5c16\u9876\u7ea7\u95f4\u6bb5\u4e3a\u5706\u5f27\u5207\u6bb5. \u5f62\u72b6\u53c2\u65701\u4e3a\u5207\u9762\u5c16\u62f1, \u548c\u540e\u7aef\u7bad\u4f53\u5e73\u6ed1\u8fc7\u6e21, \u53c2\u6570\u5c0f\u4e8e1\u4e3a\u5272\u9762\u5c16\u62f1. +Shape.Ellipsoid = \u692d\u5706\u4f53 +Shape.Ellipsoid.desc1 = \u692d\u5706\u5934\u9525\u7684\u90e8\u9762\u56fe\u4e3a\u534a\u692d\u5706, \u957f\u8f74\u662f\u77ed\u8f74\u7684\u4e24\u500d. +Shape.Ellipsoid.desc2 = \u692d\u5706\u7ea7\u95f4\u6bb5\u4e3a\u534a\u692d\u5706, \u957f\u8f74\u662f\u77ed\u8f74\u7684\u4e24\u500d. \u82e5\u672a\u88c1\u526a, \u90e8\u9762\u56fe\u5c06\u5339\u914d\u76f8\u5e94\u534a\u5f84. +Shape.Powerseries = \u5e42\u7ea7\u6570 +Shape.Powerseries.desc1 = \u5e42\u7ea7\u6570\u5934\u9525\u90e8\u9762\u56fe\u662f\u7531\u534a\u5f84 × (x / \u957f\u5ea6)k, \u5176\u4e2dk\u662f\u5f62\u72b6\u53c2\u6570. k=0.5\u65f6\u4e3a\u00bd\u5e42\u5373\u629b\u7269\u7ebf, k=0.75\u65f6\u4e3a\u00be\u5e42, k=1\u65f6\u4e3a\u5706\u9525. +Shape.Powerseries.desc2 = \u5e42\u7ea7\u6570\u7ea7\u95f4\u6bb5\u662f\u7531\u534a\u5f84 × (x / \u957f\u5ea6)k, \u5176\u4e2dk\u662f\u5f62\u72b6\u53c2\u6570. k=0.5\u65f6\u4e3a\u00bd\u5e42\u5373\u629b\u7269\u7ebf, k=0.75\u65f6\u4e3a\u00be\u5e42, k=1\u65f6\u4e3a\u5706\u9525. +Shape.Parabolicseries = \u629b\u7269\u7ebf +Shape.Parabolicseries.desc1 = \u629b\u7269\u7ebf\u5934\u9525\u90e8\u9762\u56fe\u4e3a\u629b\u7269\u7ebf. \u53c2\u6570\u51b3\u5b9a\u4e86\u629b\u7269\u7ebf\u7684\u5f62\u72b6. \u53c2\u65701.0\u4e3a\u5168\u629b\u7269\u7ebf, \u4e0e\u7bad\u4f53\u76f8\u5207, 0.75\u4e3a3/4 \u629b\u7269\u7ebf, 0.5 \u4e3a1/2 \u629b\u7269\u7ebf, 0\u4e3a\u5706\u9525. +Shape.Parabolicseries.desc2 = \u629b\u7269\u7ebf\u7ea7\u95f4\u6bb5\u4e3a\u629b\u7269\u7ebf. \u53c2\u6570\u51b3\u5b9a\u4e86\u629b\u7269\u7ebf\u7684\u5f62\u72b6. \u53c2\u65701.0\u4e3a\u5168\u629b\u7269\u7ebf, \u4e0e\u7bad\u4f53\u76f8\u5207, 0.75\u4e3a3/4 \u629b\u7269\u7ebf, 0.5 \u4e3a1/2 \u629b\u7269\u7ebf, 0\u4e3a\u5706\u9525. +Shape.Haackseries = Haack\u66f2\u7ebf +Shape.Haackseries.desc1 = Haack\u7ea7\u6570\u5934\u9525\u7528\u4e8e\u6700\u5c0f\u5316\u963b\u529b, \u5f62\u72b6\u53c2\u65700\u4ea7\u751fLD-Haack\u6216\u8005\u51af\u5361\u95e8\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u76f4\u5f84\u963b\u529b\u6700\u5c0f; \u5f62\u72b6\u53c2\u65700.333\u4ea7\u751fLV-Haack\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u4f53\u79ef\u963b\u529b\u6700\u5c0f. +Shape.Haackseries.desc2 = Haack\u7ea7\u6570\u5934\u9525\u7528\u4e8e\u6700\u5c0f\u5316\u963b\u529b, \u5f62\u72b6\u53c2\u65700\u4ea7\u751fLD-Haack\u6216\u8005\u51af\u5361\u95e8\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u76f4\u5f84\u963b\u529b\u6700\u5c0f; \u5f62\u72b6\u53c2\u65700.333\u4ea7\u751fLV-Haack\u5934\u9525, \u5bf9\u4e8e\u65e2\u5b9a\u7684\u957f\u5ea6\u548c\u4f53\u79ef\u963b\u529b\u6700\u5c0f. + + +! RocketComponent +RocketComponent.Position.TOP = \u7236\u7ec4\u4ef6\u9876\u90e8 +RocketComponent.Position.MIDDLE = \u7236\u7ec4\u4ef6\u4e2d\u90e8 +RocketComponent.Position.BOTTOM = \u7236\u7ec4\u4ef6\u5e95\u90e8 +RocketComponent.Position.AFTER = \u7236\u7ec4\u4ef6\u4e4b\u540e +RocketComponent.Position.ABSOLUTE = \u5934\u9525\u5c16\u7aef + +! LaunchLug +LaunchLug.Launchlug = \u53d1\u5c04\u8854\u5957 +! NoseCone +NoseCone.NoseCone = \u5934\u9525 +! Transition +Transition.Transition = \u7ea7\u95f4\u6bb5 +!Stage +Stage.Stage = \u706b\u7bad\u7ea7 + +Stage.SeparationEvent.UPPER_IGNITION = \u4e0a\u7ea7\u53d1\u52a8\u673a\u70b9\u706b +Stage.SeparationEvent.IGNITION = \u672c\u7ea7\u53d1\u52a8\u673a\u70b9\u706b +Stage.SeparationEvent.BURNOUT = \u672c\u7ea7\u53d1\u52a8\u673a\u71c3\u5c3d +Stage.SeparationEvent.EJECTION = \u672c\u7ea7\u5f39\u5c04 +Stage.SeparationEvent.LAUNCH = \u53d1\u5c04 +Stage.SeparationEvent.NEVER = \u4ece\u4e0d + +! BodyTube +BodyTube.BodyTube = \u7bad\u4f53 +! TubeCoupler +TubeCoupler.TubeCoupler = \u8fde\u63a5\u5668 +!InnerTube +InnerTube.InnerTube = \u5185\u7ba1 +! TrapezoidFinSet +TrapezoidFinSet.TrapezoidFinSet = \u68af\u5f62\u7a33\u5b9a\u7ffc +! FreeformFinSet +FreeformFinSet.FreeformFinSet = \u81ea\u7531\u66f2\u9762\u7a33\u5b9a\u7ffc +! TubeFinSEt +TubeFinSet.TubeFinSet = \u7ba1\u5f62\u7ffc +!MassComponent +MassComponent.MassComponent = \u8d28\u91cf\u7ec4\u4ef6 +MassComponent.Altimeter = \u9ad8\u5ea6\u8ba1 +MassComponent.FlightComputer = \u98de\u63a7 +MassComponent.DeploymentCharge = \u5f00\u4f1e\u836f +MassComponent.Tracker = \u8ffd\u8e2a\u5668 +MassComponent.Payload = \u6709\u6548\u8f7d\u8377 +MassComponent.RecoveryHardware = \u56de\u6536\u8bbe\u5907 +MassComponent.Battery = \u7535\u6c60 +! Parachute +Parachute.Parachute = \u964d\u843d\u4f1e +! ShockCord +ShockCord.ShockCord = \u51cf\u9707\u7d22 +! Bulkhead +Bulkhead.Bulkhead = \u9694\u677f +! CenteringRing +CenteringRing.CenteringRing = \u4e2d\u5fc3\u73af +! EngineBlock +EngineBlock.EngineBlock = \u53d1\u52a8\u673a\u5757 +! Streamer +Streamer.Streamer = \u5f69\u5e26 +! Sleeve +Sleeve.Sleeve = \u5c01\u5957 + +!Rocket +Rocket.motorCount.Nomotor = [\u65e0\u53d1\u52a8\u673a] +Rocket.motorCount.noStageMotors = [\u65e0\u5206\u7ea7\u53d1\u52a8\u673a] +Rocket.compname.Rocket = \u706b\u7bad + +!MotorMount +MotorMount.IgnitionEvent.AUTOMATIC = \u81ea\u52a8 (\u53d1\u5c04\u6216\u5f39\u5c04) +MotorMount.IgnitionEvent.LAUNCH = \u53d1\u5c04 +MotorMount.IgnitionEvent.EJECTION_CHARGE = \u524d\u7ea7\u7b2c\u4e00\u6b21\u5f39\u5c04 +MotorMount.IgnitionEvent.BURNOUT = \u524d\u7ea7\u7b2c\u4e00\u6b21\u71c3\u5c3d +MotorMount.IgnitionEvent.NEVER = \u4ece\u4e0d + +MotorMount.IgnitionEvent.short.AUTOMATIC = \u81ea\u52a8 +MotorMount.IgnitionEvent.short.LAUNCH = \u53d1\u5c04 +MotorMount.IgnitionEvent.short.EJECTION_CHARGE = \u5f39\u5c04 +MotorMount.IgnitionEvent.short.BURNOUT = \u70e7\u5c3d +MotorMount.IgnitionEvent.short.NEVER = \u4ece\u4e0d + + +!ComponentIcons +ComponentIcons.Nosecone = \u5934\u9525 +ComponentIcons.Bodytube = \u7bad\u4f53 +ComponentIcons.Transition = \u7ea7\u95f4\u6bb5 +ComponentIcons.Trapezoidalfinset = \u68af\u5f62\u7a33\u5b9a\u7ffc +ComponentIcons.Ellipticalfinset = \u692d\u5706\u7a33\u5b9a\u7ffc +ComponentIcons.Freeformfinset = \u66f2\u9762\u7a33\u5b9a\u7ffc +ComponentIcons.Tubefinset = \u7ba1\u5f62\u7ffc +ComponentIcons.Launchlug = \u53d1\u5c04\u8854\u5957 +ComponentIcons.Innertube = \u5185\u7ba1 +ComponentIcons.Tubecoupler = \u8fde\u63a5\u5668 +ComponentIcons.Centeringring = \u4e2d\u5fc3\u73af +ComponentIcons.Bulkhead = \u9694\u677f +ComponentIcons.Engineblock = \u53d1\u52a8\u673a +ComponentIcons.Parachute = \u964d\u843d\u4f1e +ComponentIcons.Streamer = \u98d8\u5e26 +ComponentIcons.Shockcord = \u51cf\u9707\u7d22 +ComponentIcons.Masscomponent = \u8d28\u91cf\u7ec4\u4ef6 +ComponentIcons.disabled = (\u5df2\u7981\u7528) +ComponentIcons.Altimeter = \u9ad8\u5ea6\u8ba1 +ComponentIcons.Flightcomputer = \u98de\u63a7 +ComponentIcons.Battery = \u7535\u6c60 +ComponentIcons.Tracker = \u8ddf\u8e2a\u5668 +ComponentIcons.Recoveryhardware = \u56de\u6536\u8bbe\u5907 +ComponentIcons.Payload = \u6709\u6548\u8f7d\u8377 +ComponentIcons.Deploymentcharge = \u5f00\u4f1e\u836f + +! StageAction +StageAction.Stage = \u7ea7 + +! RecoveryDevice +RecoveryDevice.DeployEvent.LAUNCH = \u53d1\u5c04 (\u52a0 NN \u79d2) +RecoveryDevice.DeployEvent.EJECTION = \u672c\u7ea7\u7b2c\u4e00\u6b21\u5f39\u5c04 +RecoveryDevice.DeployEvent.APOGEE = \u6700\u9ad8\u70b9 +RecoveryDevice.DeployEvent.ALTITUDE = \u6307\u5b9a\u4e0b\u964d\u9ad8\u5ea6 +RecoveryDevice.DeployEvent.CURRENT_STAGE_SEPARATION = \u5f53\u524d\u7ea7\u95f4\u5206\u79bb +RecoveryDevice.DeployEvent.LOWER_STAGE_SEPARATION = \u6b21\u7ea7\u7ea7\u95f4\u5206\u79bb +RecoveryDevice.DeployEvent.NEVER = \u4ece\u4e0d + +RecoveryDevice.DeployEvent.short.LAUNCH = \u53d1\u5c04 +RecoveryDevice.DeployEvent.short.EJECTION = \u5f39\u5c04 +RecoveryDevice.DeployEvent.short.APOGEE = \u6700\u9ad8\u70b9 +RecoveryDevice.DeployEvent.short.ALTITUDE = \u9ad8\u5ea6 +RecoveryDevice.DeployEvent.short.CURRENT_STAGE_SEPARATION = \u5f53\u524d\u7ea7\u95f4\u5206\u79bb +RecoveryDevice.DeployEvent.short.LOWER_STAGE_SEPARATION = \u6b21\u7ea7\u7ea7\u95f4\u5206\u79bb +RecoveryDevice.DeployEvent.short.NEVER = \u4ece\u4e0d + + +! FlightEvent +FlightEvent.Type.LAUNCH = \u53d1\u5c04 +FlightEvent.Type.IGNITION = \u53d1\u52a8\u673a\u70b9\u706b +FlightEvent.Type.LIFTOFF = \u8d77\u98de +FlightEvent.Type.LAUNCHROD = \u79bb\u67b6 +FlightEvent.Type.BURNOUT = \u53d1\u52a8\u673a\u70e7\u5c3d +FlightEvent.Type.EJECTION_CHARGE = \u5f39\u5c04 +FlightEvent.Type.STAGE_SEPARATION = \u7ea7\u95f4\u5206\u79bb +FlightEvent.Type.APOGEE = \u6700\u9ad8\u70b9 +FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT = \u56de\u6536\u88c5\u7f6e\u542f\u52a8 +FlightEvent.Type.GROUND_HIT = \u7740\u5730 +FlightEvent.Type.SIMULATION_END = \u4eff\u771f\u7ed3\u675f +FlightEvent.Type.ALTITUDE = \u9ad8\u5ea6\u53d8\u5316 +FlightEvent.Type.TUMBLE = \u7ffb\u6eda +FlightEvent.Type.EXCEPTION = \u5f02\u5e38 + +! ThrustCurveMotorColumns +TCurveMotorCol.MANUFACTURER = \u5236\u9020\u5546 +TCurveMotorCol.DESIGNATION = \u540d\u79f0 +TCurveMotorCol.TYPE = \u7c7b\u578b +TCurveMotorCol.DIAMETER = \u76f4\u5f84 +TCurveMotorCol.LENGTH = \u957f\u5ea6 +TCurveMotorCol.TOTAL_IMPULSE = \u603b\u51b2 + +TCurveMotor.ttip.diameter = \u76f4\u5f84: +TCurveMotor.ttip.length = \u957f\u5ea6: +TCurveMotor.ttip.maxThrust = \u6700\u5927\u63a8\u529b: +TCurveMotor.ttip.avgThrust = \u5e73\u5747\u63a8\u529b: +TCurveMotor.ttip.burnTime = \u71c3\u70e7\u65f6\u95f4: +TCurveMotor.ttip.totalImpulse = \u603b\u51b2\u529b: +TCurveMotor.ttip.launchMass = \u53d1\u5c04\u8d28\u91cf: +TCurveMotor.ttip.emptyMass = \u71c3\u5c3d\u8d28\u91cf: + +! RocketInfo +RocketInfo.lengthLine.Length = \u957F\u5EA6 +RocketInfo.lengthLine.maxdiameter = , \u6700\u5927\u76F4\u5F84 +RocketInfo.massWithMotors = \u542B\u53D1\u52A8\u673A\u7684\u603B\u8D28\u91CF +RocketInfo.massWithoutMotors = \u4E0D\u542B\u53D1\u52A8\u673A\u7684\u51C0\u8D28\u91CF +RocketInfo.stabText = \u7A33\u5B9A\u6027: +RocketInfo.velocityValue = N/A + +RocketPanel.FigTypeAct.BackView = \u540E\u89C6\u56FE +RocketPanel.FigTypeAct.Figure3D = \u4E09\u7EF4\u56FE +RocketPanel.FigTypeAct.Finished = \u4E09\u7EF4\u7CBE\u7EC6\u56FE +! RocketPanel +RocketPanel.FigTypeAct.SideView = \u4FA7\u89C6\u56FE +RocketPanel.FigTypeAct.Unfinished = \u4E09\u7EF4\u8349\u56FE +RocketPanel.lbl.Flightcfg = \u98DE\u884C\u914D\u7F6E: +RocketPanel.lbl.ViewType = \u89C6\u56FE\u7C7B\u578B: +RocketPanel.lbl.infoMessage = \u5355\u51FB\u9009\u62E9    Shift+\u5355\u51FB\u9009\u62E9\u5176\u4ED6    \u53CC\u51FB\u7F16\u8F91    \u5355\u51FB+\u62D6\u52A8\u79FB\u52A8\u7EC4\u4EF6 + +ScaleDialog.button.scale = \u7F29\u653E +ScaleDialog.checkbox.scaleMass = \u66F4\u65B0\u8D28\u91CF\u503C +ScaleDialog.checkbox.scaleMass.ttip = \u6839\u636E\u539F\u59CB\u7F29\u653E\u503C, \u7ACB\u65B9\u5173\u7CFB\u7F29\u653E\u7EC4\u4EF6\u8D28\u91CF +ScaleDialog.lbl.scale = \u7F29\u653E: +ScaleDialog.lbl.scale.ttip = \u9009\u62E9\u7F29\u653E\u6574\u4E2A\u8BBE\u8BA1\u56FE\u6216\u4EC5\u7F29\u653E\u9009\u4E2D\u7EC4\u4EF6 +! The scaleFrom/scaleTo pair creates a phrase "Scale from [...] to [...]" +ScaleDialog.lbl.scaleFrom = \u7F29\u653E\u81EA +ScaleDialog.lbl.scaleFromTo.ttip = \u6839\u636E\u539F\u59CB\u5927\u5C0F\u548C\u76EE\u6807\u5927\u5C0F\u786E\u5B9A\u7F29\u653E\u6BD4\u4F8B. + +! Scale dialog +ScaleDialog.lbl.scaleRocket = \u6574\u4e2a\u706b\u7bad +ScaleDialog.lbl.scaleSubselection = \u9009\u4e2d\u7ec4\u4ef6\u53ca\u6240\u6709\u5b50\u7ec4\u4ef6 +ScaleDialog.lbl.scaleSelection = \u4ec5\u9009\u4e2d\u7ec4\u4ef6 +ScaleDialog.title = \u7f29\u653e +ScaleDialog.lbl.scale = \u7f29\u653e: +ScaleDialog.lbl.scale.ttip = \u9009\u62e9\u7f29\u653e\u6574\u4e2a\u8bbe\u8ba1\u56fe\u6216\u4ec5\u7f29\u653e\u9009\u4e2d\u7ec4\u4ef6 +ScaleDialog.lbl.scaling = \u7f29\u653e\u6bd4\u4f8b: +ScaleDialog.lbl.scaling.ttip = \u5927\u4e8e100%\u8868\u793a\u653e\u5927, \u5c0f\u4e8e100%\u8868\u793a\u7f29\u5c0f. +! The scaleFrom/scaleTo pair creates a phrase "Scale from [...] to [...]" +ScaleDialog.lbl.scaleFrom = \u7f29\u653e\u81ea +ScaleDialog.lbl.scaleTo = \u5230 +ScaleDialog.lbl.scaleFromTo.ttip = \u6839\u636e\u539f\u59cb\u5927\u5c0f\u548c\u76ee\u6807\u5927\u5c0f\u786e\u5b9a\u7f29\u653e\u6bd4\u4f8b. +ScaleDialog.checkbox.scaleMass = \u66f4\u65b0\u8d28\u91cf\u503c +ScaleDialog.checkbox.scaleMass.ttip = \u6839\u636e\u539f\u59cb\u7f29\u653e\u503c, \u7acb\u65b9\u5173\u7cfb\u7f29\u653e\u7ec4\u4ef6\u8d28\u91cf +ScaleDialog.button.scale = \u7f29\u653e +ScaleDialog.undo.scaleRocket = \u7f29\u653e\u706b\u7bad +ScaleDialog.undo.scaleComponent = \u7f29\u653e\u5355\u4e2a\u7ec4\u4ef6 +ScaleDialog.undo.scaleComponents = \u7f29\u653e\u591a\u4e2a\u7ec4\u4ef6 + +!icons +Icons.Undo = \u64a4\u9500 +Icons.Redo = \u91cd\u505a + +OpenRocketPrintable.Partsdetail = \u90e8\u4ef6\u4fe1\u606f +OpenRocketPrintable.Fintemplates = \u5c3e\u7ffc\u6a21\u677f +OpenRocketPrintable.Transitiontemplates = \u7ea7\u95f4\u6bb5\u6a21\u677f +OpenRocketPrintable.Noseconetemplates = \u5934\u9525\u6a21\u677f +OpenRocketPrintable.Finmarkingguide = \u5c3e\u7ffc\u5236\u4f5c\u5411\u5bfc +OpenRocketPrintable.DesignReport = \u8bbe\u8ba1\u62a5\u544a +OpenRocketPrintable.Centeringringtemplates = \u4e2d\u5fc3\u73af\u6a21\u677f + +OpenRocketDocument.Redo = \u64a4\u9500 +OpenRocketDocument.Undo = \u91cd\u505a + +!EllipticalFinSet +EllipticalFinSet.Ellipticalfinset = \u692d\u5706\u7a33\u5b9a\u7ffc + +! Optimization + +! Modifiers + +optimization.modifier.nosecone.length = \u957f\u5ea6 +optimization.modifier.nosecone.length.desc = \u4f18\u5316\u5934\u9525\u957f\u5ea6. +optimization.modifier.nosecone.diameter = \u76f4\u5f84 +optimization.modifier.nosecone.diameter.desc = \u4f18\u5316\u5934\u9525\u76f4\u5f84. +optimization.modifier.nosecone.thickness = \u539a\u5ea6 +optimization.modifier.nosecone.thickness.desc = \u4f18\u5316\u5934\u9525\u58c1\u539a\u5ea6. +optimization.modifier.nosecone.shapeparameter = \u5916\u5f62\u53c2\u6570 +optimization.modifier.nosecone.shapeparameter.desc = \u4f18\u5316\u5934\u9525\u5916\u5f62\u53c2\u6570. + +optimization.modifier.transition.length = \u957f\u5ea6 +optimization.modifier.transition.length.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u957f\u5ea6. +optimization.modifier.transition.forediameter = \u524d\u76f4\u5f84 +optimization.modifier.transition.forediameter.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u524d\u76f4\u5f84. +optimization.modifier.transition.aftdiameter = \u540e\u76f4\u5f84 +optimization.modifier.transition.aftdiameter.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u540e\u76f4\u5f84. +optimization.modifier.transition.thickness = \u539a\u5ea6 +optimization.modifier.transition.thickness.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u58c1\u539a\u5ea6. +optimization.modifier.transition.shapeparameter = \u5916\u5f62\u53c2\u6570 +optimization.modifier.transition.shapeparameter.desc = \u4f18\u5316\u7ea7\u95f4\u6bb5\u5916\u5f62\u53c2\u6570. + +optimization.modifier.bodytube.length = \u957f\u5ea6 +optimization.modifier.bodytube.length.desc = \u4f18\u5316\u7bad\u4f53\u957f\u5ea6. +optimization.modifier.bodytube.outerDiameter = \u5916\u76f4\u5f84 +optimization.modifier.bodytube.outerDiameter.desc = \u4f18\u5316\u7bad\u7b52\u5916\u76f4\u5f84, \u540c\u65f6\u4fdd\u6301\u58c1\u539a\u5ea6\u4e0d\u53d8. +optimization.modifier.bodytube.thickness = \u539a\u5ea6 +optimization.modifier.bodytube.thickness.desc = \u4f18\u5316\u7bad\u7b52\u58c1\u539a\u5ea6. + +optimization.modifier.trapezoidfinset.rootChord = \u7ffc\u6839\u5f26 +optimization.modifier.trapezoidfinset.rootChord.desc = \u4f18\u5316\u7ffc\u6839\u5f26\u957f\u5ea6 (\u7a33\u5b9a\u7ffc\u4e0e\u7bad\u4f53\u76f8\u63a5\u7684\u8fb9\u7684\u957f\u5ea6). +optimization.modifier.trapezoidfinset.tipChord = \u7ffc\u68a2\u5f26 +optimization.modifier.trapezoidfinset.tipChord.desc = \u4f18\u5316\u7ffc\u68a2\u5f26\u957f\u5ea6 (\u7a33\u5b9a\u7ffc\u5916\u7f18\u957f\u5ea6). +optimization.modifier.trapezoidfinset.sweep = \u63a0\u7ffc +optimization.modifier.trapezoidfinset.sweep.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u63a0\u7ffc\u957f\u5ea6 (\u63a0\u7ffc\u524d\u7f18\u5411\u540e\u4f38\u5c55\u7684\u957f\u5ea6). +optimization.modifier.trapezoidfinset.height = \u9ad8\u5ea6 +optimization.modifier.trapezoidfinset.height.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u9ad8\u5ea6 (\u534a\u7ffc\u5c55). + +optimization.modifier.ellipticalfinset.length = \u7ffc\u6839\u5f26 +optimization.modifier.ellipticalfinset.length.desc = \u4f18\u5316\u7ffc\u6839\u5f26\u957f\u5ea6. +optimization.modifier.ellipticalfinset.height = \u9ad8\u5ea6 +optimization.modifier.ellipticalfinset.height.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u9ad8\u5ea6 (\u534a\u7ffc\u5c55). + +optimization.modifier.finset.cant = \u9762\u89d2\u89d2\u5ea6 +optimization.modifier.finset.cant.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u9762\u89d2\u89d2\u5ea6. +optimization.modifier.finset.position = \u4f4d\u7f6e +optimization.modifier.finset.position.desc = \u4f18\u5316\u7a33\u5b9a\u7ffc\u5b89\u88c5\u4e8e\u7bad\u4f53\u7684\u4f4d\u7f6e. + +optimization.modifier.launchlug.length = \u957f\u5ea6 +optimization.modifier.launchlug.length.desc = \u4f18\u5316\u53d1\u5c04\u5bfc\u5411\u7b52\u957f\u5ea6. +optimization.modifier.launchlug.outerDiameter = \u5916\u76f4\u5f84 +optimization.modifier.launchlug.outerDiameter.desc = \u4f18\u5316\u53d1\u5c04\u5bfc\u5411\u7b52\u7684\u5916\u76f4\u5f84. +optimization.modifier.launchlug.thickness = \u539a\u5ea6 +optimization.modifier.launchlug.thickness.desc = \u4f18\u5316\u5bfc\u5411\u7b52\u539a\u5ea6\u4f46\u662f\u4fdd\u6301\u5916\u76f4\u5f84. +optimization.modifier.launchlug.position = \u4f4d\u7f6e +optimization.modifier.launchlug.position.desc = \u4f18\u5316\u5bfc\u5411\u7b52\u5728\u7bad\u4f53\u4e0a\u7684\u4f4d\u7f6e. + + +optimization.modifier.internalcomponent.position = \u4f4d\u7f6e +optimization.modifier.internalcomponent.position.desc = \u4f18\u5316\u7ec4\u4ef6\u76f8\u5bf9\u4e8e\u7236\u7ec4\u4ef6\u7684\u4f4d\u7f6e. + +optimization.modifier.masscomponent.mass = \u8d28\u91cf +optimization.modifier.masscomponent.mass.desc = \u4f18\u5316\u8d28\u91cf\u7ec4\u4ef6. + +optimization.modifier.parachute.diameter = \u76f4\u5f84 +optimization.modifier.parachute.diameter.desc = \u4f18\u5316\u964d\u843d\u4f1e\u4f1e\u8863\u76f4\u5f84. +optimization.modifier.parachute.coefficient = \u963b\u529b\u7cfb\u6570 +optimization.modifier.parachute.coefficient.desc = \u4f18\u5316\u964d\u843d\u4f1e\u963b\u529b\u7cfb\u6570. \u964d\u843d\u4f1e\u963b\u529b\u7cfb\u6570\u4e00\u822c\u4e3a0.8. + +optimization.modifier.streamer.length = \u957f\u5ea6 +optimization.modifier.streamer.length.desc = \u4f18\u5316\u98d8\u5e26\u957f\u5ea6. +optimization.modifier.streamer.width = \u5bbd\u5ea6 +optimization.modifier.streamer.width.desc = \u4f18\u5316\u98d8\u5e26\u5bbd\u5ea6. +optimization.modifier.streamer.aspectRatio = \u957f\u5bbd\u6bd4 +optimization.modifier.streamer.aspectRatio.desc = \u4f18\u5316\u98d8\u5e26\u957f\u5bbd\u6bd4 (\u957f\u5ea6/\u5bbd\u5ea6). \u8be5\u6570\u503c\u4e0d\u80fd\u540c\u65f6\u5e94\u7528\u5728\u957f\u5ea6\u6216\u8005\u5bbd\u5ea6\u4e0a. +optimization.modifier.streamer.coefficient = \u963b\u529b\u7cfb\u6570 +optimization.modifier.streamer.coefficient.desc = \u4f18\u5316\u98d8\u5e26\u963b\u529b\u7cfb\u6570. + +optimization.modifier.recoverydevice.deployDelay = \u6fc0\u53d1\u5ef6\u65f6 +optimization.modifier.recoverydevice.deployDelay.desc = \u4f18\u5316\u56de\u6536\u8bbe\u5907\u6fc0\u53d1\u5ef6\u65f6. +optimization.modifier.recoverydevice.deployAltitude = \u6fc0\u53d1\u9ad8\u5ea6 +optimization.modifier.recoverydevice.deployAltitude.desc = \u4f18\u5316\u56de\u6536\u8bbe\u5907\u6fc0\u53d1\u9ad8\u5ea6. + +optimization.modifier.rocketcomponent.overrideMass = \u8986\u5199\u8d28\u91cf +optimization.modifier.rocketcomponent.overrideMass.desc = \u4f18\u5316\u7ec4\u4ef6\u8986\u5199\u8d28\u91cf. +optimization.modifier.rocketcomponent.overrideCG = \u8986\u5199\u91cd\u5fc3 +optimization.modifier.rocketcomponent.overrideCG.desc = \u4f18\u5316\u7ec4\u4ef6\u8986\u5199\u91cd\u5fc3. + +optimization.modifier.motormount.overhang = \u53d1\u52a8\u673a\u7a81\u51fa +optimization.modifier.motormount.overhang.desc = \u4f18\u5316\u53d1\u52a8\u673a\u7a81\u51fa. +optimization.modifier.motormount.delay = \u53d1\u52a8\u673a\u70b9\u706b\u5ef6\u65f6 +optimization.modifier.motormount.delay.desc = \u4f18\u5316\u53d1\u52a8\u673a\u70b9\u706b\u5ef6\u65f6. + + + + +! General rocket design optimization dialog + +GeneralOptimizationDialog.title = \u706b\u7bad\u4f18\u5316 +GeneralOptimizationDialog.goal.maximize = \u6700\u5927\u503c +GeneralOptimizationDialog.goal.minimize = \u6700\u5c0f\u503c +GeneralOptimizationDialog.goal.seek = \u76ee\u6807\u503c +GeneralOptimizationDialog.btn.start = \u5f00\u59cb\u53c2\u6570\u4f18\u5316 +GeneralOptimizationDialog.btn.stop = \u505c\u6b62\u53c2\u6570\u4f18\u5316 +GeneralOptimizationDialog.lbl.paramsToOptimize = \u4f18\u5316\u53c2\u6570: +GeneralOptimizationDialog.btn.add = \u6dfb\u52a0 +GeneralOptimizationDialog.btn.add.ttip = \u6dfb\u52a0\u9009\u62e9\u53c2\u6570\u5230\u4f18\u5316\u5217\u8868 +GeneralOptimizationDialog.btn.remove = \u79fb\u9664 +GeneralOptimizationDialog.btn.remove.ttip = \u79fb\u9664\u4f18\u5316\u5217\u8868\u4e2d\u7684\u53c2\u6570 +GeneralOptimizationDialog.btn.removeAll = \u79fb\u9664\u6240\u6709 +GeneralOptimizationDialog.btn.removeAll.ttip = \u79fb\u9664\u4f18\u5316\u5217\u8868\u4e2d\u7684\u6240\u6709\u53c2\u6570 +GeneralOptimizationDialog.lbl.availableParams = \u53ef\u7528\u53c2\u6570: +GeneralOptimizationDialog.lbl.optimizationOpts = \u4f18\u5316\u9009\u9879 +GeneralOptimizationDialog.lbl.optimizeSim = \u4f18\u5316\u4eff\u771f: +GeneralOptimizationDialog.lbl.optimizeSim.ttip = \u9009\u62e9\u9700\u8981\u4f18\u5316\u7684\u4eff\u771f +GeneralOptimizationDialog.lbl.optimizeValue = \u4f18\u5316\u6307\u6807: +GeneralOptimizationDialog.lbl.optimizeValue.ttip = \u9009\u62e9\u9700\u8981\u4f18\u5316\u7684\u6307\u6807 +GeneralOptimizationDialog.lbl.optimizeGoal = \u4f18\u5316\u76ee\u6807: +GeneralOptimizationDialog.lbl.optimizeGoal.ttip = \u9009\u62e9\u9700\u8981\u4f18\u5316\u7684\u76ee\u6807 +GeneralOptimizationDialog.lbl.optimizeGoalValue.ttip = \u786e\u5b9a\u76ee\u6807\u503c +GeneralOptimizationDialog.lbl.requireStability = \u7a33\u5b9a\u6027\u9700\u6c42 +GeneralOptimizationDialog.lbl.requireMinStability = \u6700\u5c0f\u7a33\u5b9a\u6027: +GeneralOptimizationDialog.lbl.requireMinStability.ttip = \u9700\u8981\u5b9a\u4e49\u8bbe\u8ba1\u7684\u6700\u5c0f\u9759\u7a33\u5b9a\u6027\u8fb9\u754c +GeneralOptimizationDialog.lbl.requireMaxStability = \u6700\u5927\u7a33\u5b9a\u6027: +GeneralOptimizationDialog.lbl.requireMaxStability.ttip = \u9700\u8981\u5b9a\u4e49\u8bbe\u8ba1\u7684\u6700\u5927\u9759\u7a33\u5b9a\u6027\u8fb9\u754c +GeneralOptimizationDialog.status.bestValue = \u6700\u4f73\u503c: +GeneralOptimizationDialog.status.bestValue.ttip = \u76ee\u524d\u5f97\u5230\u7684\u6700\u4f73\u4f18\u5316\u503c. +GeneralOptimizationDialog.status.stepCount = \u4f18\u5316\u6b65\u6570: +GeneralOptimizationDialog.status.stepCount.ttip = \u5df2\u6267\u884c\u7684\u4f18\u5316\u6b65\u6570. +GeneralOptimizationDialog.status.evalCount = \u8bc4\u4f30\u6b21\u6570: +GeneralOptimizationDialog.status.evalCount.ttip = \u5df2\u6267\u884c\u7684\u8bc4\u4f30\u6b21\u6570. +GeneralOptimizationDialog.status.stepSize = \u6b65\u957f\u5927\u5c0f: +GeneralOptimizationDialog.status.stepSize.ttip = \u76ee\u524d\u4f18\u5316\u6b65\u957f\u5927\u5c0f (\u76f8\u5bf9\u4e8e\u4f18\u5316\u53c2\u6570\u8303\u56f4) +GeneralOptimizationDialog.btn.plotPath = \u7ed8\u5236\u4f18\u5316\u8def\u5f84 +GeneralOptimizationDialog.btn.plotPath.ttip = \u7ed8\u5236\u4f18\u5316\u8def\u5f84 (\u4ec5\u4f7f\u75281\u7ef4\u548c2\u7ef4\u4f18\u5316) +GeneralOptimizationDialog.btn.save = \u4fdd\u5b58\u4f18\u5316\u8def\u5f84 +GeneralOptimizationDialog.btn.save.ttip = \u4fdd\u5b58\u6a21\u62df\u7684\u51fd\u6570\u8ba1\u7b97\u503c\u5230 CSV \u6587\u4ef6. +GeneralOptimizationDialog.btn.apply = \u5e94\u7528\u4f18\u5316 +GeneralOptimizationDialog.btn.apply.ttip = \u5e94\u7528\u4f18\u5316\u7ed3\u679c\u5230\u706b\u7bad\u8bbe\u8ba1\u4e2d +GeneralOptimizationDialog.btn.reset = \u91cd\u7f6e +GeneralOptimizationDialog.btn.reset.ttip = \u91cd\u7f6e\u706b\u7bad\u8bbe\u8ba1\u4e3a\u5f53\u524d\u706b\u7bad\u8bbe\u8ba1 +GeneralOptimizationDialog.btn.close = \u5173\u95ed +GeneralOptimizationDialog.btn.close.ttip = \u5173\u95ed\u7a97\u53e3\u4e0d\u6539\u53d8\u706b\u7bad\u8bbe\u8ba1 +GeneralOptimizationDialog.error.selectParams.text = \u8bf7\u9996\u5148\u9009\u62e9\u53ef\u7528\u4f18\u5316\u53c2\u6570. +GeneralOptimizationDialog.error.selectParams.title = \u786e\u5b9a\u4f18\u5316\u53c2\u6570 +GeneralOptimizationDialog.error.optimizationFailure.text = \u65e0\u6cd5\u8fd0\u884c\u4f18\u5316: +GeneralOptimizationDialog.error.optimizationFailure.title = \u4f18\u5316\u5931\u8d25 +GeneralOptimizationDialog.undoText = \u5e94\u7528\u4f18\u5316 +GeneralOptimizationDialog.basicSimulationName = \u57fa\u672c\u4eff\u771f +GeneralOptimizationDialog.noSimulationName = \u6ca1\u6709\u4eff\u771f +GeneralOptimizationDialog.table.col.parameter = \u53c2\u6570 +GeneralOptimizationDialog.table.col.current = \u76ee\u524d\u503c +GeneralOptimizationDialog.table.col.min = \u6700\u5c0f\u503c +GeneralOptimizationDialog.table.col.max = \u6700\u5927\u503c +GeneralOptimizationDialog.export.header = \u5305\u62ec\u6807\u9898\u884c +GeneralOptimizationDialog.export.header.ttip = \u6807\u9898\u884c\u8bb0\u5f55\u4e86\u6570\u636e\u57df\u63cf\u8ff0. +GeneralOptimizationDialog.export.stability = \u7a33\u5b9a\u6027 + + +! Dialog for plotting optimization results +OptimizationPlotDialog.title = \u4f18\u5316\u7ed3\u679c +OptimizationPlotDialog.lbl.zoomInstructions = \u70b9\u4e2d\u540c\u65f6\u5411\u53f3\u62d6\u52a8\u653e\u5927, \u5411\u5de6\u62d6\u52a8\u7f29\u5c0f +OptimizationPlotDialog.plot1d.title = \u4f18\u5316\u7ed3\u679c +OptimizationPlotDialog.plot1d.series = \u4f18\u5316\u7ed3\u679c +OptimizationPlotDialog.plot2d.title = \u4f18\u5316\u8def\u5f84 +OptimizationPlotDialog.plot2d.path = \u4f18\u5316\u8def\u5f84 +OptimizationPlotDialog.plot2d.evals = \u76ee\u6807\u51fd\u6570\u8ba1\u7b97 +OptimizationPlotDialog.plot.ttip.stability = \u7a33\u5b9a\u6027: +OptimizationPlotDialog.plot.label.optimum = \u6700\u4f18\u503c + +! Optimization parameters +MaximumAltitudeParameter.name = \u6700\u9ad8\u70b9\u9ad8\u5ea6 +MaximumVelocityParameter.name = \u6700\u5927\u901f\u5ea6 +MaximumAccelerationParameter.name = \u6700\u5927\u52a0\u901f\u5ea6 +StabilityParameter.name = \u7a33\u5b9a\u6027 +GroundHitVelocityParameter.name = \u7740\u5730\u901f\u5ea6 +LandingDistanceParameter.name = \u843d\u5730\u8ddd\u79bb +TotalFlightTimeParameter.name = \u603b\u98de\u884c\u65f6\u95f4 +DeploymentVelocityParameter.name = \u964d\u843d\u4f1e\u91ca\u653e\u65f6\u901f\u5ea6 + + +! Compass directions drawn on a compass rose. +CompassRose.lbl.north = N +CompassRose.lbl.east = E +CompassRose.lbl.south = S +CompassRose.lbl.west = W + +! Compass directions with subdirections. These might not be localized even if the directions on the compass rose are. +CompassSelectionButton.lbl.N = N +CompassSelectionButton.lbl.NE = NE +CompassSelectionButton.lbl.E = E +CompassSelectionButton.lbl.SE = SE +CompassSelectionButton.lbl.S = S +CompassSelectionButton.lbl.SW = SW +CompassSelectionButton.lbl.W = W +CompassSelectionButton.lbl.NW = NW + + +SlideShowDialog.btn.next = \u4e0b\u4e00\u9875 +SlideShowDialog.btn.prev = \u4e0a\u4e00\u9875 + +SlideShowLinkListener.error.title = \u6ca1\u6709\u627e\u5230\u76f8\u5173\u6559\u7a0b +SlideShowLinkListener.error.msg = \u5f88\u9057\u61be, \u6240\u9009\u7684\u6559\u7a0b\u8fd8\u672a\u88ab\u64b0\u5199. + +GuidedTourSelectionDialog.title = \u6307\u5bfc\u6559\u7a0b +GuidedTourSelectionDialog.lbl.selectTour = \u9009\u62e9\u6307\u5bfc\u6559\u7a0b: +GuidedTourSelectionDialog.lbl.description = \u6559\u7a0b\u8bf4\u660e: +GuidedTourSelectionDialog.lbl.length = \u5e7b\u706f\u7247\u9875\u6570: +GuidedTourSelectionDialog.btn.start = \u5f00\u59cb\u6559\u7a0b! + + +! Custom Fin BMP Importer +CustomFinImport.button.label = \u5bfc\u5165\u56fe\u7247\u6587\u4ef6 +CustomFinImport.badFinImage = \u65e0\u6548\u5c3e\u7ffc\u56fe\u7247. \u8bf7\u786e\u8ba4\u7a33\u5b9a\u7ffc\u533a\u57df\u4e3a\u6df1\u8272\u5e76\u4e14\u548c\u56fe\u7247\u5e95\u8fb9\u63a5\u58e4. +CustomFinImport.errorLoadingFile = \u6587\u4ef6\u8bfb\u53d6\u9519\u8bef: +CustomFinImport.errorParsingFile = \u89e3\u6790\u5c3e\u7ffc\u56fe\u7247\u662f\u53d1\u751f\u9519\u8bef: +CustomFinImport.undo = \u5bfc\u5165\u66f2\u9762\u7a33\u5b9a\u7ffc\u5f62\u72b6 +CustomFinImport.error.title = \u8bfb\u53d6\u7ffc\u6570\u636e\u51fa\u9519 +CustomFinImport.error.badimage = \u65e0\u6cd5\u4ece\u56fe\u50cf\u63a8\u6d4b\u7a33\u5b9a\u7ffc\u5f62\u72b6. +CustomFinImport.description = \u56fe\u50cf\u5c06\u4f1a\u88ab\u8f6c\u6362\u4e3a\u9ed1\u767d\u56fe\u50cf(\u7a33\u5b9a\u7ffc\u4e3a\u9ed1\u8272\u533a\u57df), \u8bf7\u4fdd\u8bc1\u6df1\u8272\u533a\u57df\u4e3a\u7a33\u5b9a\u7ffc, \u6d45\u8272\u533a\u57df\u4e3a\u80cc\u666f. \u7a33\u5b9a\u7ffc\u5fc5\u987b\u548c\u56fe\u7247\u5e95\u8fb9\u63a5\u58e4\uff0c\u63a5\u89e6\u533a\u57df\u5373\u662f\u7a33\u5b9a\u7ffc\u4e0e\u7bad\u4f53\u7684\u8fde\u63a5\u70b9. + + +PresetModel.lbl.select = \u9009\u62e9\u9884\u8bbe +PresetModel.lbl.database = \u4ece\u6570\u636e\u5e93... + +DecalModel.lbl.select = <\u65e0> +DecalModel.lbl.choose = \u4ece\u6587\u4ef6... + +! Export Decal Dialog +ExportDecalDialog.title = \u5bfc\u51fa\u8d34\u82b1 +ExportDecalDialog.decalList.lbl = \u8d34\u82b1 +ExportDecalDialog.exception = \u65e0\u6cd5\u4fdd\u5b58\u8d34\u82b1\u5230\u6587\u4ef6 ''{0}'' + +! Component Preset Chooser Dialog +ComponentPresetChooserDialog.title = \u9009\u62e9\u7ec4\u4ef6\u9884\u8bbe +ComponentPresetChooserDialog.filter.label = \u6587\u672c\u8fc7\u6ee4: +ComponentPresetChooserDialog.checkbox.filterAftDiameter = \u5339\u914d\u540e\u76f4\u5f84 +ComponentPresetChooserDialog.checkbox.filterForeDiameter = \u5339\u914d\u524d\u76f4\u5f84 +ComponentPresetChooserDialog.menu.sortAsc = \u5347\u5e8f +ComponentPresetChooserDialog.menu.sortDesc = \u964d\u5e8f +ComponentPresetChooserDialog.menu.units = \u5355\u4f4d +ComponentPresetChooserDialog.checkbox.showAllCompatible = \u663e\u793a\u6240\u6709\u517c\u5bb9\u7ec4\u4ef6 +ComponentPresetChooserDialog.lbl.favorites = \u6dfb\u52a0\u5230\u9884\u8bbe\u4e0b\u62c9\u6846 +table.column.Favorite = \u6536\u85cf +table.column.Manufacturer = \u5236\u9020\u5546 +table.column.PartNo = \u578b\u53f7 +table.column.Description = \u7b80\u4ecb +table.column.Type = \u7c7b\u578b +table.column.Length = \u957f +table.column.Width = \u5bbd +table.column.InnerDiameter = \u5185\u76f4\u5f84 +table.column.OuterDiameter = \u5916\u76f4\u5f84 +table.column.AftOuterDiameter = \u524d\u90e8\u5916\u76f4\u5f84 +table.column.AftShoulderLength = \u524d\u90e8\u8fde\u63a5\u5668\u957f\u5ea6 +table.column.AftShoulderDiameter = \u524d\u90e8\u8fde\u63a5\u5668\u76f4\u5f84 +table.column.ForeShoulderLength = \u540e\u90e8\u8fde\u63a5\u5668\u957f\u5ea6 +table.column.ForeShoulderDiameter = \u540e\u90e8\u8fde\u63a5\u5668\u76f4\u5f84 +table.column.ForeOuterDiameter = \u540e\u90e8\u5916\u76f4\u5f84 +table.column.Shape = \u5f62\u72b6 +table.column.Material = \u6750\u6599 +table.column.Finish = \u8868\u9762\u5904\u7406 +table.column.Thickness = \u539a\u5ea6 +table.column.Filled = \u5b9e\u5fc3 +table.column.Mass = \u8d28\u91cf +table.column.Diameter = \u76f4\u5f84 +table.column.Sides = \u8fb9\u957f +table.column.LineCount = \u7ef3\u7d22\u6570\u91cf +table.column.LineLength = \u7ef3\u7d22\u957f\u5ea6 +table.column.LineMaterial = \u7ef3\u7d22\u6750\u6599 + +! Edit Decal Dialog +EditDecalDialog.title = \u7f16\u8f91\u8d34\u82b1 +EditDecalDialog.lbl.prompt = \u8be2\u95ee\u7528\u6237 +EditDecalDialog.lbl.select = \u9009\u62e9\u7f16\u8f91\u5668 +EditDecalDialog.lbl.system = \u4f7f\u7528\u9ed8\u8ba4\u7f16\u8f91\u5668 +EditDecalDialog.lbl.cmdline = \u547d\u4ee4\u884c +EditDecalDialog.lbl.cmdline.help = \u6587\u4ef6\u540d\u5c06\u88ab\u8f6c\u6362\u4e3a ''%%'' +EditDecalDialog.lbl.always = \u603b\u4f7f\u7528\u8fd9\u4e9b\u8bbe\u7f6e +EditDecalDialog.btn.chooser = \u9009\u62e9\u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f +EditDecalHelper.createFileException = \u65e0\u6cd5\u521b\u5efa\u4e34\u65f6\u6587\u4ef6 {0} +EditDecalHelper.launchSystemEditorException = \u65e0\u6cd5\u542f\u52a8\u7cfb\u7edf\u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f +EditDecalHelper.launchCustomEditorException = \u65e0\u6cd5\u6839\u636e\u53c2\u6570 ''{0}'' \u6765\u542f\u52a8\u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f +EditDecalHelper.editPreferencesHelp = \u56fe\u7247\u7f16\u8f91\u7a0b\u5e8f\u53ef\u4ee5\u5728\u9996\u9009\u9879\u4e2d\u4fee\u6539. + +MotorConfigurationPanel.lbl.motorMounts = \u53d1\u52a8\u673a\u5ea7: +MotorConfigurationPanel.lbl.motorConfiguration = \u53d1\u52a8\u673a\u914d\u7f6e: +MotorConfigurationPanel.btn.removeMotor = \u79fb\u9664\u53d1\u52a8\u673a +MotorConfigurationPanel.btn.selectMotor = \u9009\u62e9\u53d1\u52a8\u673a +MotorConfigurationPanel.btn.selectIgnition = \u9009\u62e9\u70b9\u706b +MotorConfigurationPanel.btn.resetIgnition = \u91cd\u7f6e\u70b9\u706b +MotorConfigurationPanel.lbl.nomotors = \u65e0\u53d1\u52a8\u673a\u5ea7.\u8bf7\u5148\u5728\u5de6\u4fa7\u9009\u62e9\u7bad\u4f53\u4f5c\u4e3a\u53d1\u52a8\u673a\u5ea7. + +MotorConfigurationTableModel.table.ignition.default = \u9ed8\u8ba4 ({0}) +RecoveryConfigurationPanel.table.deployment.default = \u9ed8\u8ba4 ({0}) +SeparationConfigurationPanel.table.separation.default = \u9ed8\u8ba4 ({0}) + +IgnitionSelectionDialog.opt.title = \u53d7\u5230\u5f71\u54cd\u7684\u98de\u884c\u914d\u7f6e: +IgnitionSelectionDialog.opt.default = \u6839\u636e\u9ed8\u8ba4\u70b9\u706b\u4e8b\u4ef6\u66f4\u65b0\u6240\u6709\u914d\u7f6e +IgnitionSelectionDialog.opt.override = \u4ec5\u66f4\u65b0 {0} \u98de\u884c\u914d\u7f6e + +DeploymentSelectionDialog.opt.title = \u53d7\u5230\u5f71\u54cd\u7684\u98de\u884c\u914d\u7f6e: +DeploymentSelectionDialog.opt.default = \u6839\u636e\u9ed8\u8ba4\u91ca\u653e\u4e8b\u4ef6\u66f4\u65b0\u6240\u6709\u914d\u7f6e +DeploymentSelectionDialog.opt.override = \u4ec5\u66f4\u65b0 {0} \u98de\u884c\u914d\u7f6e + +SeparationSelectionDialog.opt.title = \u53d7\u5230\u5f71\u54cd\u7684\u98de\u884c\u914d\u7f6e: +SeparationSelectionDialog.opt.default = \u6839\u636e\u9ed8\u8ba4\u5206\u79bb\u4e8b\u4ef6\u66f4\u65b0\u6240\u6709\u914d\u7f6e +SeparationSelectionDialog.opt.override = \u4ec5\u66f4\u65b0 {0} \u98de\u884c\u914d\u7f6e + +MotorConfigurationPanel.description = \u9009\u62e9\u53d1\u52a8\u673a\u4ee5\u53ca\u70b9\u706b\u4e8b\u4ef6\u5e94\u7528\u4e0e\u5f53\u524d\u914d\u7f6e.
\u53d1\u52a8\u673a\u5ea7: \u9009\u62e9\u4f5c\u4e3a\u53d1\u52a8\u673a\u5ea7\u7684\u7ec4\u4ef6.
\u53d1\u52a8\u673a\u914d\u7f6e: \u4e3a\u6bcf\u4e00\u4e2a\u53d1\u52a8\u673a\u5ea7\u9009\u62e9\u53d1\u52a8\u673a\u53ca\u70b9\u706b\u4e8b\u4ef6. + +MotorDescriptionSubstitutor.description = \u914d\u7f6e\u9009\u9879\u4e2d\u7684\u53d1\u52a8\u673a + + +!Photo Panel +PhotoFrame.title = \u7167\u76f8\u9986 +PhotoFrame.desc = \u521b\u5efa\u706b\u7bad\u5199\u5b9e3D\u56fe +PhotoFrame.menu.file.save = \u4fdd\u5b58\u56fe\u50cf... +PhotoFrame.fileFilter.png = PNG\u56fe\u50cf +PhotoFrame.menu.edit.copy = \u590d\u5236\u56fe\u7247 +PhotoFrame.menu.edit.copy.desc = \u590d\u5236\u56fe\u7247\u5230\u526a\u8d34\u677f +PhotoFrame.menu.edit.settings = \u56fe\u50cf\u8bbe\u7f6e +PhotoFrame.menu.window = \u7a97\u53e3 +PhotoFrame.menu.window.size = \u5927\u5c0f +PhotoFrame.menu.window.size.portrait = {0} \u76f8\u7247 + +!Photo Settings +PhotoSettingsConfig.title = \u8bbe\u7f6e +PhotoSettingsConfig.colorChooser.title = \u9009\u8272\u677f + +PhotoSettingsConfig.tab.orientation = \u65b9\u5411 +PhotoSettingsConfig.lbl.rocket = \u706b\u7bad +PhotoSettingsConfig.lbl.pitch = \u503e\u89d2 +PhotoSettingsConfig.lbl.yaw = \u65cb\u89d2 +PhotoSettingsConfig.lbl.roll = \u65cb\u8f6c +PhotoSettingsConfig.lbl.advance = \u9ad8\u7ea7 +PhotoSettingsConfig.lbl.camera = \u76f8\u673a +PhotoSettingsConfig.lbl.vAz = \u89c6\u65b9\u4f4d\u89d2 +PhotoSettingsConfig.lbl.vAlt = \u89c6\u9ad8\u5ea6 +PhotoSettingsConfig.lbl.vDist = \u89c6\u8ddd +PhotoSettingsConfig.lbl.fov = \u89c6\u573a + +PhotoSettingsConfig.tab.environment = \u73af\u5883 +PhotoSettingsConfig.lbl.light = \u5149\u7167 +PhotoSettingsConfig.lbl.sun = \u9633\u5149 +PhotoSettingsConfig.lbl.amb = \u73af\u5883 +PhotoSettingsConfig.lbl.lightAz = \u5149\u7167\u65b9\u4f4d +PhotoSettingsConfig.lbl.lightAlt = \u5149\u7167\u9ad8\u5ea6 +PhotoSettingsConfig.lbl.sky = \u5929\u7a7a +PhotoSettingsConfig.lbl.skyColor = \u5929\u7a7a\u989c\u8272 +PhotoSettingsConfig.lbl.skyImage = \u5929\u7a7a\u56fe\u7247 +PhotoSettingsConfig.lbl.skyCredit = \u56fe\u7247\u6ce8\u89e3 + +PhotoSettingsConfig.tab.effects = \u7279\u6548 +PhotoSettingsConfig.lbl.smokeFlame = \u7130\u70df +PhotoSettingsConfig.lbl.smoke = \u70df\u96fe +PhotoSettingsConfig.lbl.smokeOpacity = \u70df\u900f\u660e\u5ea6 +PhotoSettingsConfig.lbl.flame = \u706b\u7130 +PhotoSettingsConfig.lbl.flameAspect = \u706b\u7130\u5916\u89c2\u89d2\u5ea6 +PhotoSettingsConfig.lbl.sparks = \u706b\u661f +PhotoSettingsConfig.lbl.sparkConcentration = \u706b\u661f\u6d53\u5ea6 +PhotoSettingsConfig.lbl.sparkWeight = \u706b\u661f\u91cd\u91cf +PhotoSettingsConfig.lbl.exhaustScale = \u5c3e\u6c14\u5927\u5c0f +PhotoSettingsConfig.lbl.effects = \u6548\u679c +PhotoSettingsConfig.lbl.speed = \u901f\u5ea6 diff --git a/core/resources/pix/componenticons/boosters-large.png b/core/resources/pix/componenticons/boosters-large.png new file mode 100644 index 0000000000..ece2d65e43 Binary files /dev/null and b/core/resources/pix/componenticons/boosters-large.png differ diff --git a/core/resources/pix/componenticons/boosters-small.png b/core/resources/pix/componenticons/boosters-small.png new file mode 100644 index 0000000000..2058829012 Binary files /dev/null and b/core/resources/pix/componenticons/boosters-small.png differ diff --git a/core/resources/pix/componenticons/fueltank-large.png b/core/resources/pix/componenticons/fueltank-large.png new file mode 100644 index 0000000000..2c34022467 Binary files /dev/null and b/core/resources/pix/componenticons/fueltank-large.png differ diff --git a/core/resources/pix/componenticons/pods-large.png b/core/resources/pix/componenticons/pods-large.png new file mode 100644 index 0000000000..0d95a5ca4c Binary files /dev/null and b/core/resources/pix/componenticons/pods-large.png differ diff --git a/core/resources/pix/componenticons/pods-small.png b/core/resources/pix/componenticons/pods-small.png new file mode 100644 index 0000000000..a104e75cb2 Binary files /dev/null and b/core/resources/pix/componenticons/pods-small.png differ diff --git a/core/resources/pix/componenticons/railbutton-large.png b/core/resources/pix/componenticons/railbutton-large.png new file mode 100644 index 0000000000..bbcf7df777 Binary files /dev/null and b/core/resources/pix/componenticons/railbutton-large.png differ diff --git a/core/resources/pix/componenticons/railbutton-small.png b/core/resources/pix/componenticons/railbutton-small.png new file mode 100644 index 0000000000..49430f63b8 Binary files /dev/null and b/core/resources/pix/componenticons/railbutton-small.png differ diff --git a/core/resources/pix/componenticons/stage-large.png b/core/resources/pix/componenticons/stage-large.png new file mode 100644 index 0000000000..d5f672abf5 Binary files /dev/null and b/core/resources/pix/componenticons/stage-large.png differ diff --git a/core/resources/pix/componenticons/stage-small.png b/core/resources/pix/componenticons/stage-small.png new file mode 100644 index 0000000000..b2d5dbe09f Binary files /dev/null and b/core/resources/pix/componenticons/stage-small.png differ diff --git a/core/resources/pix/componenticons/tubefin-large.png b/core/resources/pix/componenticons/tubefin-large.png index f16027fb60..b85dd843a5 100644 Binary files a/core/resources/pix/componenticons/tubefin-large.png and b/core/resources/pix/componenticons/tubefin-large.png differ diff --git a/core/resources/pix/splashscreen.png b/core/resources/pix/splashscreen.png index ab90ebda72..680d3f4f15 100644 Binary files a/core/resources/pix/splashscreen.png and b/core/resources/pix/splashscreen.png differ diff --git a/core/src/META-INF/MANIFEST.MF b/core/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..e9cec32610 --- /dev/null +++ b/core/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: net.sf.openrocket.startup.SwingStartup + diff --git a/core/src/de/congrace/exp4j/Example.java b/core/src/de/congrace/exp4j/Example.java index 0d70b0b091..44d64fb2a9 100644 --- a/core/src/de/congrace/exp4j/Example.java +++ b/core/src/de/congrace/exp4j/Example.java @@ -22,7 +22,8 @@ public static void main(String[] args) throws UnknownFunctionException, Unparsab // A function which calculates the mean of an array and scales it CustomFunction meanFn = new CustomFunction("mean",2) { - public Variable applyFunction(List vars) { + @Override + public Variable applyFunction(List vars) { double[] vals; double scale; diff --git a/core/src/de/congrace/exp4j/PostfixExpression.java b/core/src/de/congrace/exp4j/PostfixExpression.java index 0bbcc1426b..ceb0784c0a 100644 --- a/core/src/de/congrace/exp4j/PostfixExpression.java +++ b/core/src/de/congrace/exp4j/PostfixExpression.java @@ -100,6 +100,7 @@ private PostfixExpression(String expression, String[] variableStrings, Set stack = new Stack(); @@ -110,6 +111,7 @@ public Variable calculate() throws IllegalArgumentException { } + @Override public void setVariable(Variable value) { variables.add(value); } diff --git a/core/src/de/congrace/exp4j/Variable.java b/core/src/de/congrace/exp4j/Variable.java index 0030e70b9d..378b2bdce2 100644 --- a/core/src/de/congrace/exp4j/Variable.java +++ b/core/src/de/congrace/exp4j/Variable.java @@ -91,6 +91,7 @@ public double getStart(){ return start; } + @Override public String toString(){ if ( arrayValue.length > 1 ){ String out = name + " is Array (length " + new Integer(arrayValue.length).toString() + ") : {"; diff --git a/core/src/de/congrace/exp4j/VariableSet.java b/core/src/de/congrace/exp4j/VariableSet.java index f567006fe2..674c51a622 100644 --- a/core/src/de/congrace/exp4j/VariableSet.java +++ b/core/src/de/congrace/exp4j/VariableSet.java @@ -4,11 +4,7 @@ public class VariableSet extends HashSet { - /** - * - */ - private static final long serialVersionUID = -4212803364398351279L; - + @Override public boolean add(Variable v){ Variable previous = getVariableNamed(v.getName()); if ( previous != null ){ diff --git a/core/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java b/core/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java index e8090f9f44..1fb739407f 100644 --- a/core/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/AbstractAerodynamicCalculator.java @@ -2,13 +2,10 @@ import java.util.Map; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * An abstract aerodynamic calculator implementation, that offers basic implementation @@ -18,7 +15,6 @@ */ public abstract class AbstractAerodynamicCalculator implements AerodynamicCalculator { - private static final Logger log = LoggerFactory.getLogger(AbstractAerodynamicCalculator.class); /** Number of divisions used when calculating worst CP. */ public static final int DIVISIONS = 360; @@ -39,15 +35,15 @@ public abstract class AbstractAerodynamicCalculator implements AerodynamicCalcul //////////////// Aerodynamic calculators //////////////// @Override - public abstract Coordinate getCP(Configuration configuration, FlightConditions conditions, + public abstract Coordinate getCP(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); @Override - public abstract Map getForceAnalysis(Configuration configuration, FlightConditions conditions, + public abstract Map getForceAnalysis(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); @Override - public abstract AerodynamicForces getAerodynamicForces(Configuration configuration, + public abstract AerodynamicForces getAerodynamicForces(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); @@ -56,7 +52,7 @@ public abstract AerodynamicForces getAerodynamicForces(Configuration configurati * The worst theta angle is stored in conditions. */ @Override - public Coordinate getWorstCP(Configuration configuration, FlightConditions conditions, + public Coordinate getWorstCP(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings) { FlightConditions cond = conditions.clone(); Coordinate worst = new Coordinate(Double.MAX_VALUE); @@ -90,12 +86,15 @@ public Coordinate getWorstCP(Configuration configuration, FlightConditions condi * * @param configuration the configuration of the current call */ - protected final void checkCache(Configuration configuration) { + protected final void checkCache(FlightConfiguration configuration) { if (rocketAeroModID != configuration.getRocket().getAerodynamicModID() || rocketTreeModID != configuration.getRocket().getTreeModID()) { + // // vvvv DEVEL vvvv + // log.error("Voiding the aerodynamic cache because modIDs changed...", new BugException(" unsure why modID has changed...")); + // // ^^^^ DEVEL ^^^^ + rocketAeroModID = configuration.getRocket().getAerodynamicModID(); rocketTreeModID = configuration.getRocket().getTreeModID(); - log.debug("Voiding the aerodynamic cache"); voidAerodynamicCache(); } } diff --git a/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java b/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java index 0ce3efc59f..d51448699d 100644 --- a/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/AerodynamicCalculator.java @@ -2,7 +2,8 @@ import java.util.Map; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Monitorable; @@ -22,7 +23,7 @@ public interface AerodynamicCalculator extends Monitorable { * @param warnings the set in which to place warnings, or null * @return the CP position in absolute coordinates */ - public Coordinate getCP(Configuration configuration, FlightConditions conditions, WarningSet warnings); + public Coordinate getCP(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); /** * Calculate the aerodynamic forces acting upon the rocket. @@ -32,7 +33,7 @@ public interface AerodynamicCalculator extends Monitorable { * @param warnings the set in which to place warnings, or null. * @return the aerodynamic forces acting upon the rocket. */ - public AerodynamicForces getAerodynamicForces(Configuration configuration, + public AerodynamicForces getAerodynamicForces(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); /** @@ -45,7 +46,7 @@ public AerodynamicForces getAerodynamicForces(Configuration configuration, * exerts. The map contains an value for the base rocket, which is the total * aerodynamic forces. */ - public Map getForceAnalysis(Configuration configuration, + public Map getForceAnalysis(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); /** @@ -57,7 +58,7 @@ public Map getForceAnalysis(Configuration co * @param warnings the set in which to place warnings, or null. * @return the worst (foremost) CP position for any lateral wind angle. */ - public Coordinate getWorstCP(Configuration configuration, FlightConditions conditions, + public Coordinate getWorstCP(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings); /** @@ -66,5 +67,6 @@ public Coordinate getWorstCP(Configuration configuration, FlightConditions condi * @return a new, independent instance of this aerodynamic calculator type */ public AerodynamicCalculator newInstance(); - + + public boolean isContinuous( final Rocket rkt); } diff --git a/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java b/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java index 6bd6d15adf..904098a9d9 100644 --- a/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java +++ b/core/src/net/sf/openrocket/aerodynamics/AerodynamicForces.java @@ -14,7 +14,7 @@ public class AerodynamicForces implements Cloneable, Monitorable { */ private RocketComponent component = null; - + /** CP and CNa. */ private Coordinate cp = null; @@ -25,11 +25,11 @@ public class AerodynamicForces implements Cloneable, Monitorable { * compute CNa directly. */ private double CNa = Double.NaN; - + /** Normal force coefficient. */ private double CN = Double.NaN; - + /** Pitching moment coefficient, relative to the coordinate origin. */ private double Cm = Double.NaN; @@ -48,7 +48,7 @@ public class AerodynamicForces implements Cloneable, Monitorable { /** Roll moment forcing coefficient */ private double CrollForce = Double.NaN; - + /** Axial drag coefficient, CA */ private double Caxial = Double.NaN; @@ -70,21 +70,16 @@ public class AerodynamicForces implements Cloneable, Monitorable { private double yawDampingMoment = Double.NaN; private int modID = 0; + + private boolean axisymmetric = true; - /** - * creates an empty bean of AerodynamicForces with NaN values - */ - public AerodynamicForces() { - //all done in members declarations + + public boolean isAxisymmetric(){ + return this.axisymmetric; } - /** - * initializes an AerodynamicForces already at zero - * @param zero flag to iniatilize value to zero or not - */ - public AerodynamicForces(boolean zero) { - if (zero) - this.zero(); + public void setAxisymmetric( final boolean isSym ){ + this.axisymmetric = isSym; } /** @@ -96,7 +91,7 @@ public void setComponent(RocketComponent component) { this.component = component; modID++; } - + /** * * @return the actual component linked with this @@ -104,151 +99,167 @@ public void setComponent(RocketComponent component) { public RocketComponent getComponent() { return component; } - + public void setCP(Coordinate cp) { this.cp = cp; modID++; } - + public Coordinate getCP() { return cp; } - + public void setCNa(double cNa) { CNa = cNa; modID++; } - + public double getCNa() { return CNa; } - + public void setCN(double cN) { CN = cN; modID++; } - + public double getCN() { return CN; } - + public void setCm(double cm) { Cm = cm; modID++; } - + public double getCm() { return Cm; } - + public void setCside(double cside) { Cside = cside; modID++; } - + public double getCside() { return Cside; } - + public void setCyaw(double cyaw) { Cyaw = cyaw; modID++; } - + public double getCyaw() { return Cyaw; } - + public void setCroll(double croll) { Croll = croll; modID++; } - + public double getCroll() { return Croll; } - + public void setCrollDamp(double crollDamp) { CrollDamp = crollDamp; modID++; } - + public double getCrollDamp() { return CrollDamp; } - + public void setCrollForce(double crollForce) { CrollForce = crollForce; modID++; } - + public double getCrollForce() { return CrollForce; } - + public void setCaxial(double caxial) { Caxial = caxial; modID++; } - + public double getCaxial() { return Caxial; } - + public void setCD(double cD) { CD = cD; modID++; } - + public double getCD() { + if(component == null) return CD; + if(component.isCDOverridden()) { + return component.getOverrideCD(); + } return CD; } - + public void setPressureCD(double pressureCD) { this.pressureCD = pressureCD; modID++; } - + public double getPressureCD() { + if(component == null) return pressureCD; + if(component.isCDOverridden()) { + return 0; + } return pressureCD; } - + public void setBaseCD(double baseCD) { this.baseCD = baseCD; modID++; } - + public double getBaseCD() { + if(component == null) return baseCD; + if(component.isCDOverridden()) { + return component.getOverrideCD(); + } return baseCD; } - + public void setFrictionCD(double frictionCD) { this.frictionCD = frictionCD; modID++; } - + public double getFrictionCD() { + if(component == null) return frictionCD; + if(component.isCDOverridden()) { + return 0; + } return frictionCD; } - + public void setPitchDampingMoment(double pitchDampingMoment) { this.pitchDampingMoment = pitchDampingMoment; modID++; } - + public double getPitchDampingMoment() { return pitchDampingMoment; } - + public void setYawDampingMoment(double yawDampingMoment) { this.yawDampingMoment = yawDampingMoment; modID++; } - + public double getYawDampingMoment() { return yawDampingMoment; } - + /** @@ -256,7 +267,7 @@ public double getYawDampingMoment() { */ public void reset() { setComponent(null); - + setCP(null); setCNa(Double.NaN); setCN(Double.NaN); @@ -275,9 +286,10 @@ public void reset() { /** * Zero all values to 0 / Coordinate.NUL. Component is left as it was. */ - public void zero() { + public AerodynamicForces zero() { // component untouched - + + setAxisymmetric(true); setCP(Coordinate.NUL); setCNa(0); setCN(0); @@ -291,13 +303,15 @@ public void zero() { setCD(0); setPitchDampingMoment(0); setYawDampingMoment(0); + + return this; } - + @Override public AerodynamicForces clone() { try { - return (AerodynamicForces) super.clone(); + return (AerodynamicForces)super.clone(); } catch (CloneNotSupportedException e) { throw new BugException("CloneNotSupportedException?!?"); } @@ -332,13 +346,13 @@ public boolean equals(Object obj) { @Override public int hashCode() { - return (int) (1000 * (this.getCD() + this.getCaxial() + this.getCNa())) + this.getCP().hashCode(); + return (int) (1000*(this.getCD()+this.getCaxial()+this.getCNa())) + this.getCP().hashCode(); } @Override public String toString() { - String text = "AerodynamicForces["; + String text="AerodynamicForces["; if (getComponent() != null) text += "component:" + getComponent() + ","; @@ -364,16 +378,54 @@ public String toString() { if (!Double.isNaN(getCD())) text += "CD:" + getCD() + ","; - - if (text.charAt(text.length() - 1) == ',') - text = text.substring(0, text.length() - 1); + + if (text.charAt(text.length()-1) == ',') + text = text.substring(0, text.length()-1); text += "]"; return text; } - + @Override public int getModID() { return modID; } + + public AerodynamicForces merge(AerodynamicForces other) { + + this.cp = cp.average(other.getCP()); + this.CNa = CNa + other.getCNa(); + this.CN = CN + other.getCN(); + this.Cm = Cm + other.getCm(); + this.Cside = Cside + other.getCside(); + this.Cyaw = Cyaw + other.getCyaw(); + this.Croll = Croll + other.getCroll(); + this.CrollDamp = CrollDamp + other.getCrollDamp(); + this.CrollForce = CrollForce + other.getCrollForce(); + + modID++; + + return this; + } + + public AerodynamicForces multiplex(final int instanceCount) { + + this.cp = cp.setWeight(cp.weight*instanceCount); + if(1 < instanceCount) { + this.cp = cp.setY(0f).setZ(0f); + } + this.CNa = CNa*instanceCount; + this.CN = CN*instanceCount; + this.Cm = Cm*instanceCount; + this.Cside = Cside*instanceCount; + this.Cyaw = Cyaw*instanceCount; + this.Croll = Croll*instanceCount; + this.CrollDamp = CrollDamp*instanceCount; + this.CrollForce = CrollForce*instanceCount; + + modID++; + + return this; + } + } diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index 40ccee30e1..675ffde0f3 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -6,14 +6,18 @@ import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.Map; +import java.util.Queue; import net.sf.openrocket.aerodynamics.barrowman.FinSetCalc; import net.sf.openrocket.aerodynamics.barrowman.RocketComponentCalc; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.ComponentAssembly; import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.util.Coordinate; @@ -37,8 +41,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { private double cacheDiameter = -1; private double cacheLength = -1; - - + public BarrowmanCalculator() { @@ -55,85 +58,73 @@ public BarrowmanCalculator newInstance() { * Calculate the CP according to the extended Barrowman method. */ @Override - public Coordinate getCP(Configuration configuration, FlightConditions conditions, + public Coordinate getCP(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings) { checkCache(configuration); AerodynamicForces forces = calculateNonAxialForces(configuration, conditions, null, warnings); return forces.getCP(); } + + @Override - public Map getForceAnalysis(Configuration configuration, + public Map getForceAnalysis(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings) { checkCache(configuration); - Map map = getComponentsMap(configuration); + AerodynamicForces f; + Map map = + new LinkedHashMap(); + + // Add all components to the map + for (RocketComponent component : configuration.getActiveComponents()) { + + // Skip non-aerodynamic components + if (!component.isAerodynamic()) + continue; + + f = new AerodynamicForces(); + f.setComponent(component); + + map.put(component, f); + } + // Calculate non-axial force data AerodynamicForces total = calculateNonAxialForces(configuration, conditions, map, warnings); - calculateFrictionData(total, configuration, conditions, warnings); - total.setComponent(configuration.getRocket()); + // Calculate friction data + total.setFrictionCD(calculateFrictionDrag(configuration, conditions, map, warnings)); + total.setPressureCD(calculatePressureDrag(configuration, conditions, map, warnings)); + total.setBaseCD(calculateBaseDrag(configuration, conditions, map, warnings)); + total.setComponent(configuration.getRocket()); map.put(total.getComponent(), total); - checkCDAndApplyFriction(map, conditions); - return map; - } - - /** - * get a map of rocket components with their own Aerodynamic forces bean - * TODO: LOW: maybe transfer the function to Configuration class? - * @param configuration The rocket configuration - * @return the map of rocket configuration with it's - * correspondent aerodynamic forces bean - */ - private Map getComponentsMap(Configuration configuration) { - Map map = new LinkedHashMap(); - // Add all components to the map - for (RocketComponent c : configuration) { - AerodynamicForces f = new AerodynamicForces(); - f.setComponent(c); - map.put(c, f); + + + for (RocketComponent c : map.keySet()) { + f = map.get(c); + if (Double.isNaN(f.getBaseCD()) && Double.isNaN(f.getPressureCD()) && + Double.isNaN(f.getFrictionCD())) + continue; + if (Double.isNaN(f.getBaseCD())) + f.setBaseCD(0); + if (Double.isNaN(f.getPressureCD())) + f.setPressureCD(0); + if (Double.isNaN(f.getFrictionCD())) + f.setFrictionCD(0); + f.setCD(f.getBaseCD() + f.getPressureCD() + f.getFrictionCD()); + f.setCaxial(calculateAxialDrag(conditions, f.getCD())); } + return map; } - /** - * check an analysis to fix possible invalid CDs and apply the actual friction - * - * @param forceAnalysis - * @param conditions - */ - private void checkCDAndApplyFriction(Map forceAnalysis, FlightConditions conditions) { - for (RocketComponent c : forceAnalysis.keySet()) { - checkCDConsistency(forceAnalysis.get(c)); - applyFriction(forceAnalysis.get(c), conditions); - } - } - - /** - * fixes possibles NaN in previous calculation of CDs - * - * @param f - * @param conditions - */ - private void checkCDConsistency(AerodynamicForces f) { - if (Double.isNaN(f.getBaseCD()) && Double.isNaN(f.getPressureCD()) && - Double.isNaN(f.getFrictionCD())) - return; - if (Double.isNaN(f.getBaseCD())) - f.setBaseCD(0); - if (Double.isNaN(f.getPressureCD())) - f.setPressureCD(0); - if (Double.isNaN(f.getFrictionCD())) - f.setFrictionCD(0); - } - @Override - public AerodynamicForces getAerodynamicForces(Configuration configuration, + public AerodynamicForces getAerodynamicForces(FlightConfiguration configuration, FlightConditions conditions, WarningSet warnings) { checkCache(configuration); @@ -144,145 +135,154 @@ public AerodynamicForces getAerodynamicForces(Configuration configuration, AerodynamicForces total = calculateNonAxialForces(configuration, conditions, null, warnings); // Calculate friction data - calculateFrictionData(total, configuration, conditions, warnings); - applyFriction(total, conditions); + total.setFrictionCD(calculateFrictionDrag(configuration, conditions, null, warnings)); + total.setPressureCD(calculatePressureDrag(configuration, conditions, null, warnings)); + total.setBaseCD(calculateBaseDrag(configuration, conditions, null, warnings)); + + total.setCD(total.getFrictionCD() + total.getPressureCD() + total.getBaseCD()); + + total.setCaxial(calculateAxialDrag(conditions, total.getCD())); // Calculate pitch and yaw damping moments calculateDampingMoments(configuration, conditions, total); - applyDampingMoments(total); - return total; - } - - /** - * Applies the actual influence of friction in an AerodynamicForces set - * - * @param force the Aerodynamic forces to be applied with friction - * @param conditions the flight conditions in consideration - */ - private void applyFriction(AerodynamicForces force, FlightConditions conditions) { - force.setCD(force.getFrictionCD() + force.getPressureCD() + force.getBaseCD()); - force.setCaxial(calculateAxialDrag(conditions, force.getCD())); - } - - /** - * does the actual action of damping into an AerodynamicForces set - * - * @param total the AerodynamicForces object to be applied with the damping - */ - private void applyDampingMoments(AerodynamicForces total) { total.setCm(total.getCm() - total.getPitchDampingMoment()); total.setCyaw(total.getCyaw() - total.getYawDampingMoment()); + + + return total; } - /** - * Will calculate all basic CD from an AerodynamicForces set - * @param total The AerodynamicForces that will be calculated - * @param configuration the Rocket configutarion - * @param conditions Flight conditions in the simulation - * @param warnings Warning set to handle special events - */ - private void calculateFrictionData(AerodynamicForces total, Configuration configuration, FlightConditions conditions, WarningSet warnings) { - total.setFrictionCD(calculateFrictionDrag(configuration, conditions, null, warnings)); - total.setPressureCD(calculatePressureDrag(configuration, conditions, null, warnings)); - total.setBaseCD(calculateBaseDrag(configuration, conditions, null, warnings)); - } - - - + /** * Perform the actual CP calculation. */ - private AerodynamicForces calculateNonAxialForces(Configuration configuration, FlightConditions conditions, - Map map, WarningSet warnings) { + private AerodynamicForces calculateNonAxialForces(FlightConfiguration configuration, FlightConditions conditions, + Map calculators, WarningSet warnings) { checkCache(configuration); - AerodynamicForces total = new AerodynamicForces(true); - - double radius = 0; // aft radius of previous component - double componentX = 0; // aft coordinate of previous component - AerodynamicForces forces = new AerodynamicForces(); - if (warnings == null) warnings = ignoreWarningSet; if (conditions.getAOA() > 17.5 * Math.PI / 180) warnings.add(new Warning.LargeAOA(conditions.getAOA())); + if (calcMap == null) + buildCalcMap(configuration); - checkCalcMap(configuration); - for (RocketComponent component : configuration) { + if( ! isContinuous( configuration.getRocket() ) ){ + warnings.add( Warning.DIAMETER_DISCONTINUITY); + } + + AerodynamicForces total = calculateAssemblyNonAxialForces(configuration.getRocket(), configuration, conditions, calculators, warnings, ""); + + return total; + } + + private AerodynamicForces calculateAssemblyNonAxialForces( final RocketComponent component, + FlightConfiguration configuration, FlightConditions conditions, + Map calculators, WarningSet warnings, + String indent) { + + final AerodynamicForces assemblyForces= new AerodynamicForces().zero(); + +// System.err.println(String.format("%s@@ %s <%s>", indent, component.getName(), component.getClass().getSimpleName())); + + // ==== calculate child forces ==== + for (RocketComponent child: component.getChildren()) { + AerodynamicForces childForces = calculateAssemblyNonAxialForces( child, configuration, conditions, calculators, warnings, indent+" "); + assemblyForces.merge(childForces); + } + + // calculate *this* component's forces + RocketComponentCalc calcObj = calcMap.get(component); + if(null != calcObj) { + AerodynamicForces componentForces = new AerodynamicForces().zero(); + calcObj.calculateNonaxialForces(conditions, componentForces, warnings); - // Skip non-aerodynamic components - if (!component.isAerodynamic()) - continue; + Coordinate cp_comp = componentForces.getCP(); - // Check for discontinuities - if (component instanceof SymmetricComponent) { - SymmetricComponent sym = (SymmetricComponent) component; - // TODO:LOW: Ignores other cluster components (not clusterable) - double x = component.toAbsolute(Coordinate.NUL)[0].x; + Coordinate cp_weighted = cp_comp.setWeight(cp_comp.weight); + Coordinate cp_absolute = component.toAbsolute(cp_weighted)[0]; + if(1 < component.getInstanceCount()) { + cp_absolute = cp_absolute.setY(0.).setZ(0.); + } + + componentForces.setCP(cp_absolute); + double CN_instanced = componentForces.getCN(); + componentForces.setCm(CN_instanced * componentForces.getCP().x / conditions.getRefLength()); + +// if( 0.0001 < Math.abs(componentForces.getCNa())){ +// final Coordinate cp = assemblyForces.getCP(); +// System.err.println(String.format("%s....Component.CNa: %g @ CP: { %f, %f, %f}", indent, componentForces.getCNa(), cp.x, cp.y, cp.z)); +// } + + assemblyForces.merge(componentForces); + } + +// if( 0.0001 < Math.abs(0 - assemblyForces.getCNa())){ +// final Coordinate cp = assemblyForces.getCP(); +// System.err.println(String.format("%s....Assembly.CNa: %g @ CP: { %f, %f, %f}", indent, assemblyForces.getCNa(), cp.x, cp.y, cp.z)); +// } + + if( component.allowsChildren() && (component.getInstanceCount() > 1)) { + return assemblyForces.multiplex(component.getInstanceCount()); + }else { + return assemblyForces; + } + } + + + @Override + public boolean isContinuous( final Rocket rkt){ + return testIsContinuous( rkt); + } + + private boolean testIsContinuous( final RocketComponent treeRoot ){ + Queue queue = new LinkedList(); + queue.addAll(treeRoot.getChildren()); + + boolean isContinuous = true; + SymmetricComponent prevComp = null; + while((isContinuous)&&( null != queue.peek())){ + RocketComponent comp = queue.poll(); + if( comp instanceof SymmetricComponent ){ + queue.addAll( comp.getChildren()); - // Check for lengthwise discontinuity - if (x > componentX + 0.0001) { - if (!MathUtil.equals(radius, 0)) { - warnings.add(Warning.DISCONTINUITY); - radius = 0; - } + SymmetricComponent sym = (SymmetricComponent) comp; + if( null == prevComp){ + prevComp = sym; + continue; } - componentX = component.toAbsolute(new Coordinate(component.getLength()))[0].x; // Check for radius discontinuity - if (!MathUtil.equals(sym.getForeRadius(), radius)) { - warnings.add(Warning.DISCONTINUITY); - // TODO: MEDIUM: Apply correction to values to cp and to map + if ( !MathUtil.equals(sym.getForeRadius(), prevComp.getAftRadius())) { + isContinuous = false; } - radius = sym.getAftRadius(); - } - - // Call calculation method - forces.zero(); - calcMap.get(component).calculateNonaxialForces(conditions, forces, warnings); - forces.setCP(component.toAbsolute(forces.getCP())[0]); - forces.setCm(forces.getCN() * forces.getCP().x / conditions.getRefLength()); - - //TODO: LOW: Why is it here? was this the todo from above? Vicilu - if (map != null) { - AerodynamicForces f = map.get(component); - f.setCP(forces.getCP()); - f.setCNa(forces.getCNa()); - f.setCN(forces.getCN()); - f.setCm(forces.getCm()); - f.setCside(forces.getCside()); - f.setCyaw(forces.getCyaw()); - f.setCroll(forces.getCroll()); - f.setCrollDamp(forces.getCrollDamp()); - f.setCrollForce(forces.getCrollForce()); - map.put(component, f); + // double x = component.toAbsolute(Coordinate.NUL)[0].x; + // // Check for lengthwise discontinuity + // if (x > componentX + 0.0001) { + // if (!MathUtil.equals(radius, 0)) { + // warnings.add(Warning.DISCONTINUITY); + // radius = 0; + //} + //componentX = component.toAbsolute(new Coordinate(component.getLength()))[0].x; + + prevComp = sym; + }else if( comp instanceof ComponentAssembly ){ + isContinuous &= testIsContinuous( comp ); } - total.setCP(total.getCP().average(forces.getCP())); - total.setCNa(total.getCNa() + forces.getCNa()); - total.setCN(total.getCN() + forces.getCN()); - total.setCm(total.getCm() + forces.getCm()); - total.setCside(total.getCside() + forces.getCside()); - total.setCyaw(total.getCyaw() + forces.getCyaw()); - total.setCroll(total.getCroll() + forces.getCroll()); - total.setCrollDamp(total.getCrollDamp() + forces.getCrollDamp()); - total.setCrollForce(total.getCrollForce() + forces.getCrollForce()); } - - return total; + return isContinuous; } - - + //////////////// DRAG CALCULATIONS //////////////// - //TODO: LOW: clarify what map is doing here, or use it /** * Calculation of drag coefficient due to air friction * @@ -292,7 +292,7 @@ private AerodynamicForces calculateNonAxialForces(Configuration configuration, F * @param set Set to handle * @return */ - private double calculateFrictionDrag(Configuration configuration, FlightConditions conditions, + private double calculateFrictionDrag(FlightConfiguration configuration, FlightConditions conditions, Map map, WarningSet set) { double c1 = 1.0, c2 = 1.0; @@ -300,7 +300,8 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio double Re; double Cf; - checkCalcMap(configuration); + if (calcMap == null) + buildCalcMap(configuration); Re = conditions.getVelocity() * configuration.getLength() / conditions.getAtmosphericConditions().getKinematicViscosity(); @@ -411,7 +412,7 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio double[] roughnessLimited = new double[Finish.values().length]; Arrays.fill(roughnessLimited, Double.NaN); - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { // Consider only SymmetricComponents and FinSets: if (!(c instanceof SymmetricComponent) && @@ -421,8 +422,9 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio // Calculate the roughness-limited friction coefficient Finish finish = ((ExternalComponent) c).getFinish(); if (Double.isNaN(roughnessLimited[finish.ordinal()])) { - roughnessLimited[finish.ordinal()] = 0.032 * Math.pow(finish.getRoughnessSize() / configuration.getLength(), 0.2) * - roughnessCorrection; + roughnessLimited[finish.ordinal()] = + 0.032 * Math.pow(finish.getRoughnessSize() / configuration.getLength(), 0.2) * + roughnessCorrection; } /* @@ -446,6 +448,10 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio } + //Handle Overriden CD for Whole Rocket + if(c.isCDOverridden()) { + continue; + } // Calculate the friction drag: @@ -471,7 +477,7 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio FinSet f = (FinSet) c; double mac = ((FinSetCalc) calcMap.get(c)).getMACLength(); double cd = componentCf * (1 + 2 * f.getThickness() / mac) * - 2 * f.getFinCount() * f.getFinArea(); + 2 * f.getFinCount() * f.getPlanformArea(); finFriction += cd; if (map != null) { @@ -479,6 +485,8 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio } } + + } // fB may be POSITIVE_INFINITY, but that's ok for us @@ -493,20 +501,13 @@ private double calculateFrictionDrag(Configuration configuration, FlightConditio } } } + + return (finFriction + correction * bodyFriction) / conditions.getRefArea(); } - /** - * method to avoid repetition, create the calcMap if null - * @param configuration the rocket configuration - */ - private void checkCalcMap(Configuration configuration) { - if (calcMap == null) - buildCalcMap(configuration); - } - //TODO: LOW: clarify what map is doing here, or use it /** * Calculation of drag coefficient due to pressure * @@ -516,19 +517,20 @@ private void checkCalcMap(Configuration configuration) { * @param set Set to handle * @return */ - private double calculatePressureDrag(Configuration configuration, FlightConditions conditions, + private double calculatePressureDrag(FlightConfiguration configuration, FlightConditions conditions, Map map, WarningSet warnings) { double stagnation, base, total; double radius = 0; - checkCalcMap(configuration); + if (calcMap == null) + buildCalcMap(configuration); stagnation = calculateStagnationCD(conditions.getMach()); base = calculateBaseCD(conditions.getMach()); total = 0; - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (!c.isAerodynamic()) continue; @@ -541,7 +543,9 @@ private double calculatePressureDrag(Configuration configuration, FlightConditio map.get(c).setPressureCD(cd); } - + if(c.isCDOverridden()) continue; + + // Stagnation drag if (c instanceof SymmetricComponent) { SymmetricComponent s = (SymmetricComponent) c; @@ -562,7 +566,7 @@ private double calculatePressureDrag(Configuration configuration, FlightConditio return total; } - //TODO: LOW: clarify what map is doing here, or use it + /** * Calculation of drag coefficient due to base * @@ -572,23 +576,29 @@ private double calculatePressureDrag(Configuration configuration, FlightConditio * @param set Set to handle * @return */ - private double calculateBaseDrag(Configuration configuration, FlightConditions conditions, + private double calculateBaseDrag(FlightConfiguration configuration, FlightConditions conditions, Map map, WarningSet warnings) { double base, total; double radius = 0; RocketComponent prevComponent = null; - checkCalcMap(configuration); + if (calcMap == null) + buildCalcMap(configuration); base = calculateBaseCD(conditions.getMach()); total = 0; - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (!(c instanceof SymmetricComponent)) continue; SymmetricComponent s = (SymmetricComponent) c; + + if(c.isCDOverridden()) { + total += c.getOverrideCD(); + continue; + } if (radius > s.getForeRadius()) { double area = Math.PI * (pow2(radius) - pow2(s.getForeRadius())); @@ -616,6 +626,7 @@ private double calculateBaseDrag(Configuration configuration, FlightConditions c } + /** * gets CD by the speed * @param m Mach number for calculation @@ -631,6 +642,7 @@ public static double calculateStagnationCD(double m) { return 0.85 * pressure; } + /** * Calculates base CD * @param m Mach number for calculation @@ -651,13 +663,15 @@ public static double calculateBaseCD(double m) { PolyInterpolator interpolator; interpolator = new PolyInterpolator( new double[] { 0, 17 * Math.PI / 180 }, - new double[] { 0, 17 * Math.PI / 180 }); + new double[] { 0, 17 * Math.PI / 180 } + ); axialDragPoly1 = interpolator.interpolator(1, 1.3, 0, 0); interpolator = new PolyInterpolator( new double[] { 17 * Math.PI / 180, Math.PI / 2 }, new double[] { 17 * Math.PI / 180, Math.PI / 2 }, - new double[] { Math.PI / 2 }); + new double[] { Math.PI / 2 } + ); axialDragPoly2 = interpolator.interpolator(1.3, 0, 0, 0, 0); } @@ -690,41 +704,46 @@ private double calculateAxialDrag(FlightConditions conditions, double cd) { return -mul * cd; } + /** * get damping moments from a rocket in a flight * @param configuration Rocket configuration * @param conditions flight conditions in consideration * @param total acting aerodynamic forces */ - private void calculateDampingMoments(Configuration configuration, FlightConditions conditions, + private void calculateDampingMoments(FlightConfiguration configuration, FlightConditions conditions, AerodynamicForces total) { // Calculate pitch and yaw damping moments double mul = getDampingMultiplier(configuration, conditions, - conditions.getPitchCenter().x); - double pitch = conditions.getPitchRate(); - double yaw = conditions.getYawRate(); - double vel = conditions.getVelocity(); - - vel = MathUtil.max(vel, 1); + conditions.getPitchCenter().x); + double pitchRate = conditions.getPitchRate(); + double yawRate = conditions.getYawRate(); + double velocity = conditions.getVelocity(); mul *= 3; // TODO: Higher damping yields much more realistic apogee turn - total.setPitchDampingMoment(mul * MathUtil.sign(pitch) * pow2(pitch / vel)); - total.setYawDampingMoment(mul * MathUtil.sign(yaw) * pow2(yaw / vel)); + // find magnitude of damping moments, and clamp so they can't + // exceed magnitude of pitch and yaw moments + double pitchDampingMomentMagnitude = MathUtil.min(mul * pow2(pitchRate / velocity), total.getCm()); + double yawDampingMomentMagnitude = MathUtil.min(mul * pow2(yawRate / velocity), total.getCyaw()); + + // multiply by sign of pitch and yaw rates + total.setPitchDampingMoment(MathUtil.sign(pitchRate) * pitchDampingMomentMagnitude); + total.setYawDampingMoment(MathUtil.sign(yawRate) * yawDampingMomentMagnitude); } // TODO: MEDIUM: Are the rotation etc. being added correctly? sin/cos theta? - private double getDampingMultiplier(Configuration configuration, FlightConditions conditions, + private double getDampingMultiplier(FlightConfiguration configuration, FlightConditions conditions, double cgx) { if (cacheDiameter < 0) { double area = 0; cacheLength = 0; cacheDiameter = 0; - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (c instanceof SymmetricComponent) { SymmetricComponent s = (SymmetricComponent) c; area += s.getComponentPlanformArea(); @@ -743,14 +762,13 @@ private double getDampingMultiplier(Configuration configuration, FlightCondition // Fins // TODO: LOW: This could be optimized a lot... - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (c instanceof FinSet) { FinSet f = (FinSet) c; - mul += 0.6 * Math.min(f.getFinCount(), 4) * f.getFinArea() * + mul += 0.6 * Math.min(f.getFinCount(), 4) * f.getPlanformArea() * MathUtil.pow3(Math.abs(f.toAbsolute(new Coordinate( ((FinSetCalc) calcMap.get(f)).getMidchordPos()))[0].x - - cgx)) - / + - cgx)) / (conditions.getRefArea() * conditions.getRefLength()); } } @@ -761,6 +779,7 @@ private double getDampingMultiplier(Configuration configuration, FlightCondition //////// The calculator map + @Override protected void voidAerodynamicCache() { super.voidAerodynamicCache(); @@ -770,33 +789,28 @@ protected void voidAerodynamicCache() { cacheLength = -1; } - /** - * caches the map for aerodynamics calculations - * @param configuration the rocket configuration - */ - private void buildCalcMap(Configuration configuration) { + + private void buildCalcMap(FlightConfiguration configuration) { Iterator iterator; calcMap = new HashMap(); - - iterator = configuration.getRocket().iterator(); - while (iterator.hasNext()) { - RocketComponent c = iterator.next(); - - if (!c.isAerodynamic()) + + for (RocketComponent comp: configuration.getActiveComponents()) { + if (!comp.isAerodynamic()) continue; - calcMap.put(c, (RocketComponentCalc) Reflection.construct(BARROWMAN_PACKAGE, - c, BARROWMAN_SUFFIX, c)); + RocketComponentCalc calcObj = (RocketComponentCalc) Reflection.construct(BARROWMAN_PACKAGE, comp, BARROWMAN_SUFFIX, comp); + //String isNull = (null==calcObj?"null":"valid"); + //System.err.println(" >> At component: "+c.getName() +"=="+c.getID()+". CalcObj is "+isNull); + + calcMap.put(comp, calcObj ); } } - @Override public int getModID() { // Only cached data is stored, return constant mod ID return 0; } - } diff --git a/core/src/net/sf/openrocket/aerodynamics/FlightConditions.java b/core/src/net/sf/openrocket/aerodynamics/FlightConditions.java index 7fb59e2537..b018626a18 100644 --- a/core/src/net/sf/openrocket/aerodynamics/FlightConditions.java +++ b/core/src/net/sf/openrocket/aerodynamics/FlightConditions.java @@ -6,7 +6,7 @@ import java.util.List; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.Coordinate; @@ -87,7 +87,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable { * * @param config the configuration of which the reference length is taken. */ - public FlightConditions(Configuration config) { + public FlightConditions(FlightConfiguration config) { if (config != null) setRefLength(config.getReferenceLength()); this.modID = UniqueID.next(); @@ -98,7 +98,7 @@ public FlightConditions(Configuration config) { * Set the reference length from the given configuration. * @param config the configuration from which to get the reference length. */ - public void setReference(Configuration config) { + public void setReference(FlightConfiguration config) { setRefLength(config.getReferenceLength()); } diff --git a/core/src/net/sf/openrocket/aerodynamics/Warning.java b/core/src/net/sf/openrocket/aerodynamics/Warning.java index e22f8c1e16..7f93654fa7 100644 --- a/core/src/net/sf/openrocket/aerodynamics/Warning.java +++ b/core/src/net/sf/openrocket/aerodynamics/Warning.java @@ -322,7 +322,7 @@ public boolean replaceBy(Warning other) { /** A Warning that the body diameter is discontinuous. */ ////Discontinuity in rocket body diameter. - public static final Warning DISCONTINUITY = new Other(trans.get("Warning.DISCONTINUITY")); + public static final Warning DIAMETER_DISCONTINUITY = new Other(trans.get("Warning.DISCONTINUITY")); /** A Warning that the fins are thick compared to the rocket body. */ ////Thick fins may not be modeled accurately. diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java index 8b968deff1..e56f26df66 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java @@ -5,9 +5,6 @@ import java.util.Arrays; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; import net.sf.openrocket.aerodynamics.Warning; @@ -23,9 +20,6 @@ public class FinSetCalc extends RocketComponentCalc { - /** logger for debugging*/ - private final static Logger logger = LoggerFactory.getLogger(FinSetCalc.class); - /** considers the stall angle as 20 degrees*/ private static final double STALL_ANGLE = (20 * Math.PI / 180); @@ -68,23 +62,26 @@ public class FinSetCalc extends RocketComponentCalc { public FinSetCalc(FinSet component) { super(component); - thickness = component.getThickness(); - bodyRadius = component.getBodyRadius(); - finCount = component.getFinCount(); - baseRotation = component.getBaseRotation(); - cantAngle = component.getCantAngle(); - span = component.getSpan(); - finArea = component.getFinArea(); - crossSection = component.getCrossSection(); + FinSet fin = (FinSet) component; + + thickness = fin.getThickness(); + bodyRadius = fin.getFinFront().y; + finCount = fin.getFinCount(); + + baseRotation = fin.getBaseRotation(); + cantAngle = fin.getCantAngle(); + span = fin.getSpan(); + finArea = fin.getPlanformArea(); + crossSection = fin.getCrossSection(); - calculateFinGeometry(component); + calculateFinGeometry(fin); calculatePoly(); calculateInterferenceFinCount(component); } /* - * Calculates the non-axial forces produced by the fins (normal and side forces, - * pitch, yaw and roll moments, CP position, CNa). + * Calculates the non-axial forces produced by each set of fins. + * (normal and side forces, pitch, yaw and roll moments, CP position, CNa). */ @Override public void calculateNonaxialForces(FlightConditions conditions, @@ -113,9 +110,7 @@ public void calculateNonaxialForces(FlightConditions conditions, // One fin without interference (both sub- and supersonic): double cna1 = calculateFinCNa1(conditions); - - // logger.debug("Component cna1 = {}", cna1); - + // Multiple fins with fin-fin interference double cna; double theta = conditions.getTheta(); @@ -168,56 +163,7 @@ public void calculateNonaxialForces(FlightConditions conditions, warnings.add(Warning.PARALLEL_FINS); break; } - - /* - * Used in 0.9.5 and earlier. Takes into account rotation angle for three - * and four fins, does not take into account interference from other fin sets. - * - switch (fins) { - case 1: - case 2: - // from geometry - double mul = 0; - for (int i=0; i < fins; i++) { - mul += MathUtil.pow2(Math.sin(theta - angle)); - angle += 2 * Math.PI / fins; - } - cna = cna1*mul; - break; - - case 3: - // multiplier 1.5, sinusoidal reduction of 15% - cna = cna1 * 1.5 * (1 - 0.15*pow2(Math.cos(1.5 * (theta-angle)))); - break; - - case 4: - // multiplier 2.0, sinusoidal reduction of 6% - cna = cna1 * 2.0 * (1 - 0.06*pow2(Math.sin(2 * (theta-angle)))); - break; - - case 5: - cna = 2.37 * cna1; - break; - - case 6: - cna = 2.74 * cna1; - break; - - case 7: - cna = 2.99 * cna1; - break; - - case 8: - cna = 3.24 * cna1; - break; - - default: - // Assume N/2 * 3/4 efficiency for more fins - cna = cna1 * fins * 3.0/8.0; - break; - } - */ - + // Body-fin interference effect double r = bodyRadius; double tau = r / (span + r); @@ -303,7 +249,7 @@ public double getMidchordPos() { protected void calculateFinGeometry(FinSet component) { span = component.getSpan(); - finArea = component.getFinArea(); + finArea = component.getPlanformArea(); ar = 2 * pow2(span) / finArea; Coordinate[] points = component.getFinPoints(); @@ -396,7 +342,7 @@ protected void calculateFinGeometry(FinSet component) { cosGammaLead = 0; rollSum = 0; double area = 0; - double radius = component.getBodyRadius(); + double radius = component.getFinFront().y; final double dy = span / (DIVISIONS - 1); for (int i = 0; i < DIVISIONS; i++) { @@ -404,7 +350,7 @@ protected void calculateFinGeometry(FinSet component) { double y = i * dy; macLength += length * length; - logger.debug("macLength = {}, length = {}, i = {}", macLength, length, i); + //logger.debug("macLength = {}, length = {}, i = {}", macLength, length, i); macSpan += y * length; macLead += chordLead[i] * length; area += length; @@ -420,7 +366,7 @@ protected void calculateFinGeometry(FinSet component) { } macLength *= dy; - logger.debug("macLength = {}", macLength); + //logger.debug("macLength = {}", macLength); macSpan *= dy; macLead *= dy; area *= dy; diff --git a/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java b/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java index 458cbe1973..1bfcfa2ee4 100644 --- a/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java +++ b/core/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java @@ -113,7 +113,7 @@ public void calculateNonaxialForces(FlightConditions conditions, final double A1 = Math.PI * pow2(r1); cnaCache = 2 * (A1 - A0); - // System.out.println("cnaCache = " + cnaCache); + //System.out.println("cnaCache = " + cnaCache); cpCache = (length * A1 - fullVolume) / (A1 - A0); } } diff --git a/core/src/net/sf/openrocket/appearance/Appearance.java b/core/src/net/sf/openrocket/appearance/Appearance.java index 6d02c0b223..c52273f8d3 100644 --- a/core/src/net/sf/openrocket/appearance/Appearance.java +++ b/core/src/net/sf/openrocket/appearance/Appearance.java @@ -36,9 +36,7 @@ public Appearance(final Color paint, final double shine, final Decal texture) { * @param shine shine of the appearance, will be clamped between 0 and 1 */ public Appearance(final Color paint, final double shine) { - this.paint = paint; - this.shine = MathUtil.clamp(shine, 0, 1); - this.texture = null; + this(paint,shine,null); } /** diff --git a/core/src/net/sf/openrocket/appearance/Decal.java b/core/src/net/sf/openrocket/appearance/Decal.java index 5e54611880..412cdcd3d5 100644 --- a/core/src/net/sf/openrocket/appearance/Decal.java +++ b/core/src/net/sf/openrocket/appearance/Decal.java @@ -4,12 +4,17 @@ import net.sf.openrocket.util.Coordinate; /** - * A texture that can be applied by an Appearance. This class is immutable. + * A texture that can be applied by an Appearance. an object of this class is immutable. * * @author Bill Kuker */ public class Decal { + /** + * enum to flag what happens on edge in a decal + * + * + */ public static enum EdgeMode { REPEAT("TextureWrap.Repeat"), MIRROR("TextureWrap.Mirror"), CLAMP("TextureWrap.Clamp"), STICKER("TextureWrap.Sticker"); private final String transName; @@ -29,6 +34,16 @@ public String toString() { private final DecalImage image; private final EdgeMode mode; + /** + * Builds a new decal with the given itens + * + * @param offset The offset of the decal, in coordinate obejct format + * @param center The position of the center of the decal, in coordinate object format + * @param scale The scale of the decal, in coordinate obejct format + * @param rotation Rotation of the decal, in radians + * @param image The image itself + * @param mode The description of Edge behaviour + */ public Decal(final Coordinate offset, final Coordinate center, final Coordinate scale, final double rotation, final DecalImage image, final EdgeMode mode) { this.offset = offset; @@ -39,26 +54,56 @@ public Decal(final Coordinate offset, final Coordinate center, final Coordinate this.mode = mode; } + /** + * returns the offset, in coordinates object format + * + * @return offset coordinates of the decal + */ public Coordinate getOffset() { return offset; } + /** + * return the center, in coordinates object format + * + * @return The center coordinates of the decal + */ public Coordinate getCenter() { return center; } + /** + * return the scaling of the decal, in coordinate format + * + * @return the scale coordinates of the decal + */ public Coordinate getScale() { return scale; } + /** + * returns the rotation of the decal, in radians + * + * @return the rotation of the decal, in radians + */ public double getRotation() { return rotation; } + /** + * return the edge behaviour of the decal + * + * @return the edge behaviour of the decal + */ public EdgeMode getEdgeMode() { return mode; } + /** + * returns the image of the decal itself + * + * @return the image of the decal itself + */ public DecalImage getImage() { return image; } diff --git a/core/src/net/sf/openrocket/appearance/DecalImage.java b/core/src/net/sf/openrocket/appearance/DecalImage.java index 544eda8b3e..77a74010f1 100644 --- a/core/src/net/sf/openrocket/appearance/DecalImage.java +++ b/core/src/net/sf/openrocket/appearance/DecalImage.java @@ -7,13 +7,37 @@ import net.sf.openrocket.util.ChangeSource; +/** + * Interface to handle image files for declas + * + */ public interface DecalImage extends ChangeSource, Comparable { + /** + * returns the name of the file path of the image + * @return name of file path + */ public String getName(); + /** + * gets the Stream of bytes representing the image itself + * + * @return the Stream of bytes representing the image + * @throws FileNotFoundException + * @throws IOException + */ public InputStream getBytes() throws FileNotFoundException, IOException; + /** + * exports an image into the File + * @param file The File handler object + * @throws IOException + */ public void exportImage(File file) throws IOException; + /** + * wake up call to listeners + * @param source The source of the wake up call + */ public void fireChangeEvent(Object source); } diff --git a/core/src/net/sf/openrocket/appearance/defaults/DefaultAppearance.java b/core/src/net/sf/openrocket/appearance/defaults/DefaultAppearance.java index 82c36c0dd6..bd57cc94ae 100644 --- a/core/src/net/sf/openrocket/appearance/defaults/DefaultAppearance.java +++ b/core/src/net/sf/openrocket/appearance/defaults/DefaultAppearance.java @@ -15,6 +15,7 @@ import net.sf.openrocket.rocketcomponent.MassObject; import net.sf.openrocket.rocketcomponent.Parachute; import net.sf.openrocket.rocketcomponent.RadiusRingComponent; +import net.sf.openrocket.rocketcomponent.RailButton; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.rocketcomponent.TubeCoupler; @@ -22,8 +23,22 @@ import net.sf.openrocket.util.Color; import net.sf.openrocket.util.Coordinate; +/** + * + * Class defining the default images of the application + * + */ public class DefaultAppearance { + /** + * returns a simple appearance with the image in the path with + * default color + * no shining + * no offset, origin center and scale 1 + * + * @param resource the path file to the resource + * @return + */ private static Appearance simple(String resource) { return new Appearance( new Color(1, 1, 1), @@ -36,6 +51,14 @@ private static Appearance simple(String resource) { new ResourceDecalImage(resource), EdgeMode.REPEAT)); }; + /** + * returns the image with custom color and shine + * + * @param base base color for the image + * @param shine the custom shine property + * @param resource the file path to the image + * @return The appearance with custom color and shine. + */ private static Appearance simpleAlpha(Color base, float shine, String resource) { return new Appearance( base, @@ -68,6 +91,12 @@ private static Appearance simpleAlpha(Color base, float shine, String resource) private static HashMap plastics = new HashMap(); + /** + * gets the appearance correspondent to the plastic with the given color + * also caches the plastics + * @param c the color of the plastics + * @return The plastic appearance with the given color + */ private static Appearance getPlastic(Color c) { if (!plastics.containsKey(c)) { plastics.put(c, new Appearance(c, .3)); @@ -75,6 +104,12 @@ private static Appearance getPlastic(Color c) { return plastics.get(c); } + /** + * gets the default based on the type of the rocket component + * + * @param c the rocket component + * @return the default appearance for that type of rocket component + */ public static Appearance getDefaultAppearance(RocketComponent c) { if (c instanceof BodyTube) return ESTES_BT; @@ -94,10 +129,17 @@ public static Appearance getDefaultAppearance(RocketComponent c) { return HARDBOARD; if (c instanceof MassObject) return WADDING; - + if ( c instanceof RailButton ) + return getPlastic(new Color(255, 255, 220)); return Appearance.MISSING; } + /** + * gets the default motor texture based on the manufacturer + * returns reusable motor texture as default + * @param m The motor object + * @return The default appearance for the motor + */ public static Appearance getDefaultAppearance(Motor m) { if (m instanceof ThrustCurveMotor) { ThrustCurveMotor tcm = (ThrustCurveMotor) m; diff --git a/core/src/net/sf/openrocket/appearance/defaults/ResourceDecalImage.java b/core/src/net/sf/openrocket/appearance/defaults/ResourceDecalImage.java index 65ae085063..6c70470ce3 100644 --- a/core/src/net/sf/openrocket/appearance/defaults/ResourceDecalImage.java +++ b/core/src/net/sf/openrocket/appearance/defaults/ResourceDecalImage.java @@ -8,12 +8,21 @@ import net.sf.openrocket.appearance.DecalImage; import net.sf.openrocket.util.StateChangeListener; - -class ResourceDecalImage implements DecalImage { +/** + * + * Default implementation class of DecalImage + * + */ +public class ResourceDecalImage implements DecalImage { + /** File path to the image*/ final String resource; - ResourceDecalImage(final String resource) { + /** + * main constructor, stores the file path given + * @param resource + */ + public ResourceDecalImage(final String resource) { this.resource = resource; } diff --git a/core/src/net/sf/openrocket/communication/UpdateInfo.java b/core/src/net/sf/openrocket/communication/UpdateInfo.java index 78458b8121..f4d296e75c 100644 --- a/core/src/net/sf/openrocket/communication/UpdateInfo.java +++ b/core/src/net/sf/openrocket/communication/UpdateInfo.java @@ -6,18 +6,30 @@ import net.sf.openrocket.util.BuildProperties; import net.sf.openrocket.util.ComparablePair; + /** + * + * class that stores the update information of the application + * + */ public class UpdateInfo { private final String latestVersion; private final ArrayList> updates; - + /** + * loads the default information + */ public UpdateInfo() { this.latestVersion = BuildProperties.getVersion(); this.updates = new ArrayList>(); } + /** + * loads a custom update information into the cache + * @param version String with the version + * @param updates The list of updates contained in the version + */ public UpdateInfo(String version, List> updates) { this.latestVersion = version; this.updates = new ArrayList>(updates); diff --git a/core/src/net/sf/openrocket/communication/UpdateInfoRetriever.java b/core/src/net/sf/openrocket/communication/UpdateInfoRetriever.java index 16d51456b9..654ac0a933 100644 --- a/core/src/net/sf/openrocket/communication/UpdateInfoRetriever.java +++ b/core/src/net/sf/openrocket/communication/UpdateInfoRetriever.java @@ -41,10 +41,11 @@ public void start() { * Check whether the update info fetching is still in progress. * * @return true if the communication is still in progress. + * @throws IllegalStateException if {@link #startFetchUpdateInfo()} has not been called */ public boolean isRunning() { if (fetcher == null) { - throw new IllegalStateException("startFetchUpdateInfo() has not been called"); + throw new IllegalStateException("startFetchUpdateInfo() has not been called"); } return fetcher.isAlive(); } @@ -81,43 +82,76 @@ public UpdateInfo getUpdateInfo() { */ /* package-private */ static UpdateInfo parseUpdateInput(Reader r) throws IOException { - BufferedReader reader; - if (r instanceof BufferedReader) { - reader = (BufferedReader) r; - } else { - reader = new BufferedReader(r); - } - - + BufferedReader reader = convertToBufferedReader(r); String version = null; + ArrayList> updates = new ArrayList>(); String str = reader.readLine(); while (str != null) { - if (str.matches("^Version: *[0-9]+\\.[0-9]+\\.[0-9]+[a-zA-Z0-9.-]* *$")) { + if (isHeader(str)) { version = str.substring(8).trim(); - } else if (str.matches("^[0-9]+:\\p{Print}+$")) { - int index = str.indexOf(':'); - int value = Integer.parseInt(str.substring(0, index)); - String desc = str.substring(index + 1).trim(); - if (!desc.equals("")) { - updates.add(new ComparablePair(value, desc)); - } + } else if (isUpdateToken(str)) { + ComparablePair update = parseUpdateToken(str); + if(update != null) + updates.add(update); } - // Ignore anything else str = reader.readLine(); } - if (version != null) { - return new UpdateInfo(version, updates); - } else { + if (version == null) return null; - } + return new UpdateInfo(version, updates); } + /** + * parses a line of a connection content into the information of an update + * @param str the line of the connection + * @return the update information + */ + private static ComparablePair parseUpdateToken(String str){ + int index = str.indexOf(':'); + int value = Integer.parseInt(str.substring(0, index)); + String desc = str.substring(index + 1).trim(); + + if (desc.equals("")) + return null; + return new ComparablePair(value, desc); + } + + /** + * checks if a string contains and update information + * @param str the string itself + * @return true for when the string has an update + * false otherwise + */ + private static boolean isUpdateToken(String str) { + return str.matches("^[0-9]+:\\p{Print}+$"); + } + + /** + * check if the string is formated as an update list header + * @param str the string to be checked + * @return true if str is a header, false otherwise + */ + private static boolean isHeader(String str) { + return str.matches("^Version: *[0-9]+\\.[0-9]+\\.[0-9]+[a-zA-Z0-9.-]* *$"); + } - + /** + * convert, if not yet converted, a Reader into a buffered reader + * @param r the Reader object + * @return the Reader as a BufferedReader Object + */ + private static BufferedReader convertToBufferedReader(Reader r) { + if (r instanceof BufferedReader) + return (BufferedReader) r; + return new BufferedReader(r); + } + + + /** * An asynchronous task that fetches and parses the update info. * @@ -137,11 +171,193 @@ public void run() { } } - + /** + * Establishes a connection with data of previous updates + * @throws IOException + */ private void doConnection() throws IOException { - String url = Communicator.UPDATE_INFO_URL + "?" + Communicator.VERSION_PARAM + "=" - + Communicator.encode(BuildProperties.getVersion()); + HttpURLConnection connection = getConnection(getUrl()); + InputStream is = null; + + try { + connection.connect(); + if(!checkConnection(connection)) + return; + if(!checkContentType(connection)) + return; + is = new LimitedInputStream(connection.getInputStream(), Communicator.MAX_INPUT_BYTES); + parseUpdateInput(buildBufferedReader(connection,is)); + } finally { + try { + if (is != null) + is.close(); + connection.disconnect(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * Parses the data received in a buffered reader + * @param reader The reader object + * @throws IOException If anything bad happens + */ + private void parseUpdateInput(BufferedReader reader) throws IOException{ + String version = null; + ArrayList> updates = + new ArrayList>(); + String line = reader.readLine(); + while (line != null) { + if (isHeader(line)) { + version = parseHeader(line); + } else if (isUpdateInfo(line)) { + updates.add(parseUpdateInfo(line)); + } + line = reader.readLine(); + } + + if (isInvalidVersion(version)) { + log.warn("Invalid version received, ignoring."); + return; + } + + info = new UpdateInfo(version, updates); + log.info("Found update: " + info); + } + + /** + * parses a line into it's version name + * @param line the string of the header + * @return the version in it's right format + */ + private String parseHeader(String line) { + return line.substring(8).trim(); + } + + /** + * parses a line into it's correspondent update information + * @param line the line to be parsed + * @return update information from the line + */ + private ComparablePair parseUpdateInfo(String line){ + String[] split = line.split(":", 2); + int n = Integer.parseInt(split[0]); + return new ComparablePair(n, split[1].trim()); + } + + /** + * checks if a line contains an update information + * @param line the line to be checked + * @return true if the line caontain an update information + * false otherwise + */ + private boolean isUpdateInfo(String line) { + return line.matches("^[0-9]{1,9}:\\P{Cntrl}{1,300}$"); + } + + /** + * checks if a line is a header of an update list + * @param line the line to be checked + * @return true if line is a header, false otherwise + */ + private boolean isHeader(String line) { + return line.matches("^Version:[a-zA-Z0-9._ -]{1,30}$"); + } + + /** + * checks if a String is a valid version + * @param version the String to be checked + * @return true if it's valid, false otherwise + */ + private boolean isInvalidVersion(String version) { + return version == null || version.length() == 0 || + version.equalsIgnoreCase(BuildProperties.getVersion()); + } + + /** + * builds a buffered reader from an open connection and a stream + * @param connection The connection + * @param is The input stream + * @return The Buffered reader created + * @throws IOException + */ + private BufferedReader buildBufferedReader(HttpURLConnection connection, InputStream is) throws IOException { + String encoding = connection.getContentEncoding(); + if (encoding == null || encoding.equals("")) + encoding = "UTF-8"; + return new BufferedReader(new InputStreamReader(is, encoding)); + } + + /** + * check if the content of a connection is valid + * @param connection the connection to be checked + * @return true if the content is valid, false otherwise + */ + private boolean checkContentType(HttpURLConnection connection) { + String contentType = connection.getContentType(); + if (contentType == null || + contentType.toLowerCase(Locale.ENGLISH).indexOf(Communicator.UPDATE_INFO_CONTENT_TYPE) < 0) { + // Unknown response type + log.warn("Unknown Content-type received:" + contentType); + return false; + } + return true; + } + + /** + * check if a connection is responsive and valid + * @param connection the connection to be checked + * @return true if connection is ok, false otherwise + * @throws IOException + */ + private boolean checkConnection(HttpURLConnection connection) throws IOException{ + log.debug("Update response code: " + connection.getResponseCode()); + + if (noUpdatesAvailable(connection)) { + log.info("No updates available"); + info = new UpdateInfo(); + return false; + } + + if (!updateAvailable(connection)) { + // Error communicating with server + log.warn("Unknown server response code: " + connection.getResponseCode()); + return false; + } + return true; + } + + /** + * checks if a connection sent an update available flag + * @param connection the connection to be checked + * @return true if the response was an update available flag + * false otherwise + * @throws IOException if anything goes wrong + */ + private boolean updateAvailable(HttpURLConnection connection) throws IOException { + return connection.getResponseCode() == Communicator.UPDATE_INFO_UPDATE_AVAILABLE; + } + + /** + * checks if a connection sent an update unavailable flag + * @param connection the connection to be checked + * @return true if the response was an no update available flag + * false otherwise + * @throws IOException if anything goes wrong + */ + private boolean noUpdatesAvailable(HttpURLConnection connection) throws IOException { + return connection.getResponseCode() == Communicator.UPDATE_INFO_NO_UPDATE_CODE; + } + + /** + * Builds a connection with the given url + * @param url the url + * @return connection base on the url + * @throws IOException + */ + private HttpURLConnection getConnection(String url) throws IOException{ HttpURLConnection connection = Communicator.connectionSource.getConnection(url); connection.setConnectTimeout(Communicator.CONNECTION_TIMEOUT); @@ -165,80 +381,16 @@ private void doConnection() throws IOException { connection.setRequestProperty("X-OpenRocket-Locale", Communicator.encode(Locale.getDefault().toString())); connection.setRequestProperty("X-OpenRocket-CPUs", "" + Runtime.getRuntime().availableProcessors()); - - InputStream is = null; - try { - connection.connect(); - - log.debug("Update response code: " + connection.getResponseCode()); - - if (connection.getResponseCode() == Communicator.UPDATE_INFO_NO_UPDATE_CODE) { - // No updates are available - log.info("No updates available"); - info = new UpdateInfo(); - return; - } - - if (connection.getResponseCode() != Communicator.UPDATE_INFO_UPDATE_AVAILABLE) { - // Error communicating with server - log.warn("Unknown server response code: " + connection.getResponseCode()); - return; - } - - String contentType = connection.getContentType(); - if (contentType == null || - contentType.toLowerCase(Locale.ENGLISH).indexOf(Communicator.UPDATE_INFO_CONTENT_TYPE) < 0) { - // Unknown response type - log.warn("Unknown Content-type received:" + contentType); - return; - } - - // Update is available, parse input - is = connection.getInputStream(); - is = new LimitedInputStream(is, Communicator.MAX_INPUT_BYTES); - String encoding = connection.getContentEncoding(); - if (encoding == null || encoding.equals("")) - encoding = "UTF-8"; - BufferedReader reader = new BufferedReader(new InputStreamReader(is, encoding)); - - String version = null; - ArrayList> updates = - new ArrayList>(); - - String line = reader.readLine(); - while (line != null) { - - if (line.matches("^Version:[a-zA-Z0-9._ -]{1,30}$")) { - version = line.substring(8).trim(); - } else if (line.matches("^[0-9]{1,9}:\\P{Cntrl}{1,300}$")) { - String[] split = line.split(":", 2); - int n = Integer.parseInt(split[0]); - updates.add(new ComparablePair(n, split[1].trim())); - } - // Ignore line otherwise - line = reader.readLine(); - } - - // Check version input - if (version == null || version.length() == 0 || - version.equalsIgnoreCase(BuildProperties.getVersion())) { - // Invalid response - log.warn("Invalid version received, ignoring."); - return; - } - - - info = new UpdateInfo(version, updates); - log.info("Found update: " + info); - } finally { - try { - if (is != null) - is.close(); - connection.disconnect(); - } catch (Exception e) { - e.printStackTrace(); - } - } + return connection; + } + + /** + * builds the default url for fetching updates + * @return the string with an url for fethcing updates + */ + private String getUrl() { + return Communicator.UPDATE_INFO_URL + "?" + Communicator.VERSION_PARAM + "=" + + Communicator.encode(BuildProperties.getVersion()); } } } diff --git a/core/src/net/sf/openrocket/database/AsynchronousDatabaseLoader.java b/core/src/net/sf/openrocket/database/AsynchronousDatabaseLoader.java index 71bda47575..a8aed6f5ce 100644 --- a/core/src/net/sf/openrocket/database/AsynchronousDatabaseLoader.java +++ b/core/src/net/sf/openrocket/database/AsynchronousDatabaseLoader.java @@ -43,7 +43,7 @@ public void startLoading() { /** - * Return whether loading the database has ended. + * @return whether loading the database has ended. */ public boolean isLoaded() { return endedLoading; @@ -86,10 +86,27 @@ public void blockUntilLoaded() { } } - + /** + * + */ private void doLoad() { // Pause for indicated startup time + pauseForStartupTime(); + + loadDatabase(); + + synchronized (this) { + endedLoading = true; + this.notifyAll(); + } + } + + + /** + * waits the startup time before loading the database + */ + private void pauseForStartupTime() { long startLoading = System.currentTimeMillis() + startupDelay; while (!inUse && System.currentTimeMillis() < startLoading) { synchronized (this) { @@ -99,16 +116,11 @@ private void doLoad() { } } } - - loadDatabase(); - - synchronized (this) { - endedLoading = true; - this.notifyAll(); - } } - + /** + * method that actually load the database + */ protected abstract void loadDatabase(); diff --git a/core/src/net/sf/openrocket/database/ComponentPresetDao.java b/core/src/net/sf/openrocket/database/ComponentPresetDao.java index a27a7f5d42..aaa66bf1db 100644 --- a/core/src/net/sf/openrocket/database/ComponentPresetDao.java +++ b/core/src/net/sf/openrocket/database/ComponentPresetDao.java @@ -6,10 +6,23 @@ public interface ComponentPresetDao { + /** + * return a list all components + * @return list of all components + */ public List listAll(); + /** + * insert a component preset into a database + * @param preset the component to be inserted into the database + */ public void insert( ComponentPreset preset ); + /** + * return all components preset matching the given type + * @param type the searched type + * @return the list of components matching the type + */ public List listForType( ComponentPreset.Type type ); /** @@ -21,13 +34,35 @@ public interface ComponentPresetDao { * @return */ public List listForType( ComponentPreset.Type type, boolean favorite ); - + + /** + * Returns a list of components presets of multiple types + * @param type the types to be searched for + * @return + */ public List listForTypes( ComponentPreset.Type ... type ); + /** + * Returns a list of components preset of each type in the list + * @param types the list of types to be searched for + * @return + */ public List listForTypes( List types ); + /** + * set or reset a component preset as favorite + * @param preset the preset to be set as favorite + * @param type the type of the preset + * @param favorite true to set, false to reset as favorite + */ public void setFavorite( ComponentPreset preset, ComponentPreset.Type type, boolean favorite ); + /** + * returns a list of components preset based on manufacturer and part number + * @param manufacturer the manufacturer to be searched for + * @param partNo the part number of the component + * @return the resulting list of the search + */ public List find( String manufacturer, String partNo ); } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/database/Database.java b/core/src/net/sf/openrocket/database/Database.java index 3f16e818a8..df513ea21b 100644 --- a/core/src/net/sf/openrocket/database/Database.java +++ b/core/src/net/sf/openrocket/database/Database.java @@ -19,6 +19,7 @@ */ public class Database> extends AbstractSet { + /** the list that contains the data from the database itself*/ protected final List list = new ArrayList(); private final ArrayList> listeners = new ArrayList>(); @@ -33,6 +34,10 @@ public int size() { return list.size(); } + /** + * {@inheritDoc} + * fires add event + */ @Override public boolean add(T element) { int index; @@ -71,17 +76,27 @@ public int indexOf(T m) { return list.indexOf(m); } - + /** + * adds a listener for database changes + * @param listener the listener + */ public void addDatabaseListener(DatabaseListener listener) { listeners.add(listener); } + /** + * removes a listener from the list os listeners + * @param listener + */ public void removeChangeListener(DatabaseListener listener) { listeners.remove(listener); } - + /** + * wake up call for database listeners for when elements are added + * @param element the element added + */ @SuppressWarnings("unchecked") protected void fireAddEvent(T element) { Object[] array = listeners.toArray(); @@ -90,6 +105,10 @@ protected void fireAddEvent(T element) { } } + /** + * wake up call for database listeners when elements are removed + * @param element the removed element + */ @SuppressWarnings("unchecked") protected void fireRemoveEvent(T element) { Object[] array = listeners.toArray(); @@ -98,10 +117,6 @@ protected void fireRemoveEvent(T element) { } } - - - - /** * Iterator class implementation that fires changes if remove() is called. */ @@ -120,6 +135,10 @@ public T next() { return current; } + /** + * {@inheritDoc} + * fires remove event + */ @Override public void remove() { iterator.remove(); diff --git a/core/src/net/sf/openrocket/database/DatabaseListener.java b/core/src/net/sf/openrocket/database/DatabaseListener.java index a24b2ddebe..54438f1636 100644 --- a/core/src/net/sf/openrocket/database/DatabaseListener.java +++ b/core/src/net/sf/openrocket/database/DatabaseListener.java @@ -1,9 +1,24 @@ package net.sf.openrocket.database; +/** + * interface defining listeners for database + * + * @param type stored in the database + */ public interface DatabaseListener> { + /** + * action for when elements are added + * @param element the element added + * @param source the database of which the element was added + */ public void elementAdded(T element, Database source); + /** + * action for when elements are removed + * @param element the removed element + * @param source the database on which the element was removed + */ public void elementRemoved(T element, Database source); } diff --git a/core/src/net/sf/openrocket/database/Databases.java b/core/src/net/sf/openrocket/database/Databases.java index ffe3628ebe..d28e92ac0b 100644 --- a/core/src/net/sf/openrocket/database/Databases.java +++ b/core/src/net/sf/openrocket/database/Databases.java @@ -117,7 +117,13 @@ public class Databases { BULK_MATERIAL.addDatabaseListener(listener); } - + /** + * builds a new material based on the parameters given + * @param type The type of material + * @param baseName the name of material + * @param density density + * @return a new onejct withe the material data + */ private static Material newMaterial(Type type, String baseName, double density) { String name = trans.get("material", baseName); return Material.newMaterial(type, name, density, false); @@ -145,21 +151,7 @@ public static void fakeMethod() { * @return the material, or null if not found. */ public static Material findMaterial(Material.Type type, String baseName) { - Database db; - switch (type) { - case BULK: - db = BULK_MATERIAL; - break; - case SURFACE: - db = SURFACE_MATERIAL; - break; - case LINE: - db = LINE_MATERIAL; - break; - default: - throw new IllegalArgumentException("Illegal material type: " + type); - } - + Database db = getDatabase(type); String name = trans.get("material", baseName); for (Material m : db) { @@ -170,6 +162,24 @@ public static Material findMaterial(Material.Type type, String baseName) { return null; } + /** + * gets the specific database with the given type + * @param type the desired type + * @return the database of the type given + */ + private static Database getDatabase(Material.Type type){ + switch (type) { + case BULK: + return BULK_MATERIAL; + case SURFACE: + return SURFACE_MATERIAL; + case LINE: + return LINE_MATERIAL; + default: + throw new IllegalArgumentException("Illegal material type: " + type); + } + } + /** * Find a material from the database or return a new user defined material if the specified @@ -184,21 +194,7 @@ public static Material findMaterial(Material.Type type, String baseName) { * @return the material object from the database or a new material. */ public static Material findMaterial(Material.Type type, String baseName, double density) { - Database db; - switch (type) { - case BULK: - db = BULK_MATERIAL; - break; - case SURFACE: - db = SURFACE_MATERIAL; - break; - case LINE: - db = LINE_MATERIAL; - break; - default: - throw new IllegalArgumentException("Illegal material type: " + type); - } - + Database db = getDatabase(type); String name = trans.get("material", baseName); for (Material m : db) { diff --git a/core/src/net/sf/openrocket/database/motor/MotorDatabase.java b/core/src/net/sf/openrocket/database/motor/MotorDatabase.java index 07758ce05f..2310271042 100644 --- a/core/src/net/sf/openrocket/database/motor/MotorDatabase.java +++ b/core/src/net/sf/openrocket/database/motor/MotorDatabase.java @@ -20,5 +20,7 @@ public interface MotorDatabase { public List findMotors(Motor.Type type, String manufacturer, String designation, double diameter, double length); + + public Motor findMotor(String digest); } diff --git a/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSet.java b/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSet.java index c15452ae36..9abed3a19e 100644 --- a/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSet.java +++ b/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSet.java @@ -22,17 +22,18 @@ public class ThrustCurveMotorSet implements Comparable { // Comparators: private static final Collator COLLATOR = Collator.getInstance(Locale.US); + static { COLLATOR.setStrength(Collator.PRIMARY); } + private static final DesignationComparator DESIGNATION_COMPARATOR = new DesignationComparator(); private static final ThrustCurveMotorComparator comparator = new ThrustCurveMotorComparator(); private final ArrayList motors = new ArrayList(); - private final Map digestMap = - new IdentityHashMap(); + private final Map digestMap = new IdentityHashMap(); private final List delays = new ArrayList(); @@ -43,48 +44,96 @@ public class ThrustCurveMotorSet implements Comparable { private double length = -1; private long totalImpulse = 0; private Motor.Type type = Motor.Type.UNKNOWN; + private String caseInfo = null; + private boolean available = true; - - + /** + * adds a motor into the set, + * uses digest and designation to determinate if a motor is present or not + * @param motor the motor to be added + */ public void addMotor(ThrustCurveMotor motor) { - // Check for first insertion - if (motors.isEmpty()) { - manufacturer = motor.getManufacturer(); - designation = motor.getDesignation(); - simplifiedDesignation = simplifyDesignation(designation); - diameter = motor.getDiameter(); - length = motor.getLength(); - totalImpulse = Math.round((motor.getTotalImpulseEstimate())); - } - - // Verify that the motor can be added - if (!matches(motor)) { - throw new IllegalArgumentException("Motor does not match the set:" + - " manufacturer=" + manufacturer + - " designation=" + designation + - " diameter=" + diameter + - " length=" + length + - " set_size=" + motors.size() + - " motor=" + motor); - } + checkFirstInsertion(motor); + verifyMotor(motor); + updateType(motor); + checkChangeSimplifiedDesignation(motor); + addStandardDelays(motor); + if(!checkMotorOverwrite(motor)){ + motors.add(motor); + digestMap.put(motor, motor.getDigest()); + Collections.sort(motors, comparator); + } - // Update the type if now known - if (type == Motor.Type.UNKNOWN) { - type = motor.getMotorType(); - // Add "Plugged" option if hybrid - if (type == Motor.Type.HYBRID) { - if (!delays.contains(Motor.PLUGGED)) { - delays.add(Motor.PLUGGED); + } + + /** + * checks whether a motor is present, overwriting it if + * @param motor the motor to be checked + * @return if there was an overwrite or not, returns true if all is equals + */ + private boolean checkMotorOverwrite(ThrustCurveMotor motor) { + final String digest = motor.getDigest(); + for (int index = 0; index < motors.size(); index++) { + Motor m = motors.get(index); + + if (isMotorPresent(motor, digest, m)) { + + // Match found, check which one to keep (or both) based on comment + String newCmt = getFormattedDescription(motor); + String oldCmt = getFormattedDescription(m); + if (isNewDescriptionIrrelevant(newCmt, oldCmt)) { + return true; + } else if (oldCmt.length() == 0) { + motors.set(index, motor); + digestMap.put(motor, digest); + return true; } + // else continue search and add both + } } - - // Change the simplified designation if necessary - if (!designation.equalsIgnoreCase(motor.getDesignation().trim())) { - designation = simplifiedDesignation; - } - + return false; + } + + /** + * checks if a motor is in the maps + * @param motor the motor to be checked + * @param digest the digest of the motor + * @param m the current motor being checked with + * @return wheter the motor is or no + */ + private boolean isMotorPresent(ThrustCurveMotor motor, final String digest, Motor m) { + return digest.equals(digestMap.get(m)) && + motor.getDesignation().equals(m.getDesignation()); + } + + /** + * get a description from the motor + * @param motor the motor + * @return the description of the motor + */ + private String getFormattedDescription(Motor motor) { + return motor.getDescription().replaceAll("\\s+", " ").trim(); + } + + + /** + * checks if the new commit message is empty or equals to the old commit + * @param newCmt the new commit message + * @param oldCmt the old commit message + * @return whether the new commit is empty or equals to the old commit + */ + private boolean isNewDescriptionIrrelevant(String newCmt, String oldCmt) { + return newCmt.length() == 0 || newCmt.equals(oldCmt); + } + + + /** + * adds the standard delay if aplicable + * @param motor the motor to be considered + */ + private void addStandardDelays(ThrustCurveMotor motor) { // Add the standard delays for (double d : motor.getStandardDelays()) { d = Math.rint(d); @@ -93,55 +142,98 @@ public void addMotor(ThrustCurveMotor motor) { } } Collections.sort(delays); + } + + + /** + * checks if simplified designation should be changed with the given motor + * @param motor the motor to be checked with + */ + private void checkChangeSimplifiedDesignation(ThrustCurveMotor motor) { + // Change the simplified designation if necessary + if (!designation.equalsIgnoreCase(motor.getDesignation().trim())) { + designation = simplifiedDesignation; + } - - // Check whether to add as new motor or overwrite existing - final String digest = motor.getDigest(); - for (int index = 0; index < motors.size(); index++) { - Motor m = motors.get(index); - - if (digest.equals(digestMap.get(m)) && - motor.getDesignation().equals(m.getDesignation())) { - - // Match found, check which one to keep (or both) based on comment - String newCmt = motor.getDescription().replaceAll("\\s+", " ").trim(); - String oldCmt = m.getDescription().replaceAll("\\s+", " ").trim(); - - if (newCmt.length() == 0 || newCmt.equals(oldCmt)) { - // Do not replace and do not add - return; - } else if (oldCmt.length() == 0) { - // Replace existing motor - motors.set(index, motor); - digestMap.put(motor, digest); - return; + if (caseInfo == null) { + caseInfo = motor.getCaseInfo(); + } + } + + + /** + * checks if the cached type should be changed with the given motor + * if it's hybrid, delays will be added + * @param motor the motor to be checked with + */ + private void updateType(ThrustCurveMotor motor) { + // Update the type if now known + if (type == Motor.Type.UNKNOWN) { + type = motor.getMotorType(); + // Add "Plugged" option if hybrid + if (type == Motor.Type.HYBRID) { + if (!delays.contains(Motor.PLUGGED_DELAY)) { + delays.add(Motor.PLUGGED_DELAY); } - // else continue search and add both - } } - - // Motor not present, add it - motors.add(motor); - digestMap.put(motor, digest); - Collections.sort(motors, comparator); - + } + + + /** + * verifies if a motor is valid for this set + * @param motor the motor to be checked + */ + private void verifyMotor(ThrustCurveMotor motor) { + if (!matches(motor)) { + throw new IllegalArgumentException("Motor does not match the set:" + + " manufacturer=" + manufacturer + + " designation=" + designation + + " diameter=" + diameter + + " length=" + length + + " set_size=" + motors.size() + + " motor=" + motor); + } + } + + + /** + * checks if the given motor is the first one + * the ifrst motor inserted is what will difine the rest of the motors in the set + * @param motor the motor to be checked + */ + private void checkFirstInsertion(ThrustCurveMotor motor) { + if (motors.isEmpty()) { + manufacturer = motor.getManufacturer(); + designation = motor.getDesignation(); + simplifiedDesignation = simplifyDesignation(designation); + diameter = motor.getDiameter(); + length = motor.getLength(); + totalImpulse = Math.round((motor.getTotalImpulseEstimate())); + caseInfo = motor.getCaseInfo(); + available = motor.isAvailable(); + } } - + /** + * Checks if a motor can be added with the set + * A set contains motors of same manufacturer, diameter, length and type + * @param m the motor to be checked with + * @return if the motor passed the test or not + */ public boolean matches(ThrustCurveMotor m) { if (motors.isEmpty()) return true; - + if (manufacturer != m.getManufacturer()) return false; - + if (!MathUtil.equals(diameter, m.getDiameter())) return false; - + if (!MathUtil.equals(length, m.getLength())) return false; - + if ((type != Type.UNKNOWN) && (m.getMotorType() != Type.UNKNOWN) && (type != m.getMotorType())) { return false; @@ -150,15 +242,25 @@ public boolean matches(ThrustCurveMotor m) { if (!simplifiedDesignation.equalsIgnoreCase(simplifyDesignation(m.getDesignation()))) return false; + if (caseInfo != null && !caseInfo.equalsIgnoreCase(m.getCaseInfo())) + return false; + return true; } - + /** + * returns a new list with the stored motors + * @return list + */ public List getMotors() { return motors.clone(); } + /** + * + * @return number of motor in the set + */ public int getMotorCount() { return motors.size(); } @@ -228,6 +330,22 @@ public long getTotalImpuse() { return totalImpulse; } + /** + * returns the case info of the motor + * @return the motor's case information + */ + public String getCaseInfo() { + return caseInfo; + } + + /** + * checks if the motor is available for other calculations + * @return if the motor is available + */ + public boolean isAvailable() { + return available; + } + @Override public String toString() { @@ -235,9 +353,6 @@ public String toString() { ", type=" + type + ", count=" + motors.size() + "]"; } - - - private static final Pattern SIMPLIFY_PATTERN = Pattern.compile("^[0-9]*[ -]*([A-Z][0-9]+).*"); /** @@ -256,8 +371,7 @@ public static String simplifyDesignation(String str) { return str.replaceAll("\\s", ""); } } - - + /** * Comparator for deciding in which order to display matching motors. */ @@ -271,8 +385,8 @@ public int compare(ThrustCurveMotor o1, ThrustCurveMotor o2) { } // 2. Number of data points (more is better) - if (o1.getTimePoints().length != o2.getTimePoints().length) { - return o2.getTimePoints().length - o1.getTimePoints().length; + if (o1.getSampleSize() != o2.getSampleSize()) { + return o2.getSampleSize() - o1.getSampleSize(); } // 3. Comment length (longer is better) @@ -292,21 +406,21 @@ public int compareTo(ThrustCurveMotorSet other) { other.manufacturer.getDisplayName()); if (value != 0) return value; - + // 2. Designation value = DESIGNATION_COMPARATOR.compare(this.designation, other.designation); if (value != 0) return value; - + // 3. Diameter value = (int) ((this.diameter - other.diameter) * 1000000); if (value != 0) return value; - + // 4. Length value = (int) ((this.length - other.length) * 1000000); return value; } -} +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSetDatabase.java b/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSetDatabase.java index 674522072b..5c3d4b7a45 100644 --- a/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSetDatabase.java +++ b/core/src/net/sf/openrocket/database/motor/ThrustCurveMotorSetDatabase.java @@ -17,6 +17,22 @@ public class ThrustCurveMotorSetDatabase implements MotorDatabase { private final List motorSets = new ArrayList(); + @Override + public ThrustCurveMotor findMotor(String digest) { + if (digest == null) { + return null; + } + for (ThrustCurveMotorSet set : motorSets) { + for (ThrustCurveMotor m : set.getMotors()) { + if (digest.equals(m.getDigest())) { + return m; + } + } + } + + return null; + + } @Override public List findMotors(Motor.Type type, String manufacturer, String designation, @@ -32,11 +48,11 @@ else if (manufacturer != null && !m.getManufacturer().matches(manufacturer)) match = false; else if (designation != null && !designation.equalsIgnoreCase(m.getDesignation())) match = false; - else if (!Double.isNaN(diameter) && (Math.abs(diameter - m.getDiameter()) > 0.0015)) + else if (!Double.isNaN(diameter) && (Math.abs(diameter - m.getDiameter()) > 0.005)) match = false; - else if (!Double.isNaN(length) && (Math.abs(length - m.getLength()) > 0.0015)) + else if (!Double.isNaN(length) && (Math.abs(length - m.getLength()) > 0.005)) match = false; - + if (match) results.add(m); } diff --git a/core/src/net/sf/openrocket/document/Attachment.java b/core/src/net/sf/openrocket/document/Attachment.java index 6ac9274959..a46d6300fe 100644 --- a/core/src/net/sf/openrocket/document/Attachment.java +++ b/core/src/net/sf/openrocket/document/Attachment.java @@ -7,21 +7,44 @@ import net.sf.openrocket.util.AbstractChangeSource; import net.sf.openrocket.util.ChangeSource; +/** + * + * Class handler of documents attachments + * + */ public abstract class Attachment extends AbstractChangeSource implements Comparable, ChangeSource { private final String name; + /** + * default constructor + * @param name the attachment name + */ public Attachment(String name) { super(); this.name = name; } + /** + * returns the name of attachment + * @return name of attachment + */ public String getName() { return name; } + /** + * returns the stream of bytes representing the attachment + * @return the stream of bytes representing the attachment + * @throws FileNotFoundException + * @throws IOException + */ public abstract InputStream getBytes() throws FileNotFoundException, IOException; + /** + * {@inheritDoc} + * considers only the name to equals + */ @Override public int compareTo(Attachment o) { return this.name.compareTo(o.name); diff --git a/core/src/net/sf/openrocket/document/DecalRegistry.java b/core/src/net/sf/openrocket/document/DecalRegistry.java index 5cc2a94182..591676cdf4 100644 --- a/core/src/net/sf/openrocket/document/DecalRegistry.java +++ b/core/src/net/sf/openrocket/document/DecalRegistry.java @@ -25,17 +25,28 @@ import net.sf.openrocket.util.FileUtils; import net.sf.openrocket.util.StateChangeListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +/** + * + * Class that handles decal usage registration + * + */ public class DecalRegistry { - private static Logger log = LoggerFactory.getLogger(DecalRegistry.class); + /** + * default constructor, does nothing + */ DecalRegistry() { } + /** the decal usage map*/ private Map registeredDecals = new HashMap(); + /** + * returns a new decal with the same image but with unique names + * supports only classes and subclasses of DecalImageImpl + * @param original the decal to be made unique + * @return + */ public DecalImage makeUniqueImage(DecalImage original) { if (!(original instanceof DecalImageImpl)) { @@ -61,6 +72,11 @@ public DecalImage makeUniqueImage(DecalImage original) { } + /** + * get the image from an attachment + * @param attachment + * @return + */ public DecalImage getDecalImage(Attachment attachment) { String decalName = attachment.getName(); DecalImageImpl d; @@ -116,6 +132,7 @@ private DecalImageImpl(Attachment delegate) { this.delegate = delegate; } + @Override public String getName() { return name != null ? name : delegate.getName(); } @@ -133,6 +150,7 @@ public void fireChangeEvent(Object source) { * @throws FileNotFoundException * @throws IOException */ + @Override public InputStream getBytes() throws FileNotFoundException, IOException { // First check if the decal is located on the file system File exportedFile = getFileSystemLocation(); @@ -168,6 +186,10 @@ public void exportImage(File file) throws IOException { } } + /** + * + * @return + */ File getFileSystemLocation() { return fileSystemLocation; } @@ -207,6 +229,11 @@ public void removeChangeListener(StateChangeListener listener) { } + /** + * sercha + * @param file + * @return + */ private DecalImageImpl findDecalForFile(File file) { for (DecalImageImpl d : registeredDecals.values()) { @@ -242,28 +269,25 @@ private DecalImageImpl findDecalForFile(File file) { private static final int NUMBER_INDEX = 3; private static final int EXTENSION_INDEX = 4; + /** + * Makes a unique name for saving decal files in case the name already exists + * @param name the name of the decal + * @return the name formated and unique + */ private String makeUniqueName(String name) { - String newName = name; - if (!newName.startsWith("decals/")) { - newName = "decals/" + name; - } - String basename = ""; - String extension = ""; - Matcher nameMatcher = fileNamePattern.matcher(newName); - if (nameMatcher.matches()) { - basename = nameMatcher.group(BASE_NAME_INDEX); - extension = nameMatcher.group(EXTENSION_INDEX); - } + String newName = checkPathConsistency(name); + String basename = getGroup(BASE_NAME_INDEX,fileNamePattern.matcher(newName)); + String extension = getGroup(EXTENSION_INDEX,fileNamePattern.matcher(newName)); Set counts = new TreeSet(); boolean needsRewrite = false; - + for (DecalImageImpl d : registeredDecals.values()) { Matcher m = fileNamePattern.matcher(d.getName()); if (m.matches()) { - if (basename.equals(m.group(BASE_NAME_INDEX)) && extension.equals(m.group(EXTENSION_INDEX))) { + if (isofSameBaseAndExtension(m, basename, extension)) { String intString = m.group(NUMBER_INDEX); if (intString != null) { Integer i = Integer.parseInt(intString); @@ -280,13 +304,54 @@ private String makeUniqueName(String name) { return newName; } - // find a missing integer; + return MessageFormat.format("{0} ({1}).{2}", basename, findMissingInteger(counts),extension); + } + + /** + * Searches the count for a new Integer + * @param counts the count set + * @return a unique integer in the count + */ + private Integer findMissingInteger(Set counts) { Integer newIndex = 1; while (counts.contains(newIndex)) { newIndex++; } - - return MessageFormat.format("{0} ({1}).{2}", basename, newIndex, extension); + return newIndex; + } + + /** + * Tests if a matcher has the same basename and extension + * @param m the matcher being tested + * @param basename the basename + * @param extension the extension + * @return + */ + private boolean isofSameBaseAndExtension(Matcher m, String basename, String extension) { + return basename.equals(m.group(BASE_NAME_INDEX)) && extension.equals(m.group(EXTENSION_INDEX)); + } + + /** + * gets the String group from a matcher + * @param index the index of the group to + * @param matcher the matcher for the search + * @return the String according with the group, empty if there's no match + */ + private String getGroup(int index, Matcher matcher) { + if (matcher.matches()) + return matcher.group(index); + return ""; + } + + /** + * checks if the name starts with "decals/" + * @param name the name being checked + * @return the name complete with the starting folder + */ + private String checkPathConsistency(String name){ + if (name.startsWith("decals/")) + return name; + return "decals/" + name; } } diff --git a/core/src/net/sf/openrocket/document/OpenRocketDocument.java b/core/src/net/sf/openrocket/document/OpenRocketDocument.java index aec3d03330..8efe1460e7 100644 --- a/core/src/net/sf/openrocket/document/OpenRocketDocument.java +++ b/core/src/net/sf/openrocket/document/OpenRocketDocument.java @@ -9,6 +9,9 @@ import java.util.List; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.appearance.Appearance; import net.sf.openrocket.appearance.Decal; import net.sf.openrocket.appearance.DecalImage; @@ -18,7 +21,8 @@ import net.sf.openrocket.logging.Markers; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.simulation.FlightDataType; @@ -27,9 +31,6 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.ArrayList; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * Class describing an entire OpenRocket document, including a rocket and * simulations. The document contains: @@ -61,7 +62,6 @@ public class OpenRocketDocument implements ComponentChangeListener { private static boolean undoErrorReported = false; private final Rocket rocket; - private final Configuration configuration; private final ArrayList simulations = new ArrayList(); private ArrayList customExpressions = new ArrayList(); @@ -102,36 +102,56 @@ public class OpenRocketDocument implements ComponentChangeListener { private final List listeners = new ArrayList(); + /** + * main constructor, enable events in the rocket + * and initializes the document + * @param rocket the rocket to be used in the document + */ OpenRocketDocument(Rocket rocket) { - this.configuration = rocket.getDefaultConfiguration(); this.rocket = rocket; + rocket.enableEvents(); init(); } + /** + * initializes the document, clearing the undo cache and + * setting itself as a listener for changes in the rocket + */ private void init() { clearUndo(); - rocket.addComponentChangeListener(this); } + /** + * adds a customExpression into the list + * @param expression the expression to be added + */ public void addCustomExpression(CustomExpression expression) { if (customExpressions.contains(expression)) { log.info(Markers.USER_MARKER, "Could not add custom expression " + expression.getName() + " to document as document alerady has a matching expression."); - } else { - customExpressions.add(expression); - } + } + customExpressions.add(expression); } + /** + * remves + * @param expression + */ public void removeCustomExpression(CustomExpression expression) { customExpressions.remove(expression); } + //TODO:LOW:this leaves the object custom expression exposed, is it supposed to be like that? + /** + * + * @return + */ public List getCustomExpressions() { return customExpressions; } - /* - * Returns a set of all the flight data types defined or available in any way in the rocket document + /** + * @returns a set of all the flight data types defined or available in any way in the rocket document */ public Set getFlightDataTypes() { Set allTypes = new LinkedHashSet(); @@ -158,28 +178,50 @@ public Set getFlightDataTypes() { return allTypes; } - + /** + * gets the rocket in the document + * @return the rocket in the document + */ public Rocket getRocket() { return rocket; } - - public Configuration getDefaultConfiguration() { - return configuration; + /** + * returns the selected configuration from the rocket + * @return selected configuration from the rocket + */ + public FlightConfiguration getSelectedConfiguration() { + return rocket.getSelectedConfiguration(); } + /** + * returns the File handler object for the document + * @return the File handler object for the document + */ public File getFile() { return file; } + /** + * set the file handler object for the document + * @param file the new file handler object + */ public void setFile(File file) { this.file = file; } + /** + * returns if the current rocket is saved + * @return if the current rocket is saved + */ public boolean isSaved() { return rocket.getModID() == savedID; } + /** + * sets the current rocket as saved, and none if false is given + * @param saved if the current rocket or none will be set to save + */ public void setSaved(boolean saved) { if (saved == false) this.savedID = -1; @@ -197,33 +239,57 @@ public StorageOptions getDefaultStorageOptions() { } + /** + * returns the decal list used in the document + * @return the decal list registered in the document + */ public Collection getDecalList() { return decalRegistry.getDecalList(); } + /** + * returns the number of times the given decal was used + * @param img the decal to be counted + * @return the number of times + */ public int countDecalUsage(DecalImage img) { int count = 0; Iterator it = rocket.iterator(); while (it.hasNext()) { - RocketComponent comp = it.next(); - Appearance a = comp.getAppearance(); - if (a == null) { - continue; - } - Decal d = a.getTexture(); - if (d == null) { - continue; - } - if (img.equals(d.getImage())) { + if(hasDecal(it.next(),img)) count++; - } } return count; } + //TODO: LOW: move this method to rocketComponent, Appearance and decal + //I see 3 layers of object accessed, seems unsafe + /** + * checks if a rocket component has the given decalImage + * @param comp the RocketComponent to be searched + * @param img the DecalImage to be checked + * @return if the comp has img + */ + private boolean hasDecal(RocketComponent comp, DecalImage img){ + Appearance a = comp.getAppearance(); + if(a == null) + return false; + Decal d = a.getTexture(); + if(d == null) + return false; + if(img.equals(d.getImage())) + return true; + return false; + } + + /** + * gets a unique identification for the given decal + * @param img the decal to be made unique + * @return the new unique decal + */ public DecalImage makeUniqueDecal(DecalImage img) { if (countDecalUsage(img) <= 1) { return img; @@ -231,58 +297,118 @@ public DecalImage makeUniqueDecal(DecalImage img) { return decalRegistry.makeUniqueImage(img); } + /** + * gets the decal image from an attachment + * @param a the attachment + * @return the image from the attachment + */ public DecalImage getDecalImage(Attachment a) { return decalRegistry.getDecalImage(a); } + /** + * gets a list of simulations in the document + * @return the simulations in the document + */ public List getSimulations() { return simulations.clone(); } + /** + * gets the number of simulations in the document + * @return the number of simulations in the document + */ public int getSimulationCount() { return simulations.size(); } + /** + * the the Nth simulation from the document + * @param n simulation index + * @return the Nth simulation from the document, null if there's none + */ public Simulation getSimulation(int n) { return simulations.get(n); } + /** + * gets the index of the given simulation + * @param simulation the simulation being searched + * @return the index of the simulation in the document + */ public int getSimulationIndex(Simulation simulation) { return simulations.indexOf(simulation); } + /** + * adds simulation into the document + * fires document change event + * @param simulation the simulation to be added + */ public void addSimulation(Simulation simulation) { simulations.add(simulation); + FlightConfigurationId simId = simulation.getId(); + if( !rocket.containsFlightConfigurationID( simId )){ + rocket.createFlightConfiguration(simId); + } fireDocumentChangeEvent(new SimulationChangeEvent(simulation)); } + /** + * adds the simulation to the Nth index, overwriting if there is already one + * fires change document event + * @param simulation the simulation to be added + * @param n the index to be added + */ public void addSimulation(Simulation simulation, int n) { simulations.add(n, simulation); fireDocumentChangeEvent(new SimulationChangeEvent(simulation)); } + /** + * removes the specific simulation from the list + * @param simulation the simulation to be removed + */ public void removeSimulation(Simulation simulation) { simulations.remove(simulation); fireDocumentChangeEvent(new SimulationChangeEvent(simulation)); } + /** + * removes the Nth simulation from the document + * fires document change event + * @param n the Nth simulation + * @return the removed simulation + */ public Simulation removeSimulation(int n) { Simulation simulation = simulations.remove(n); fireDocumentChangeEvent(new SimulationChangeEvent(simulation)); return simulation; } - public void removeFlightConfigurationAndSimulations(String configId) { + /** + * removes the flight configuration and simulation with the specific id + * @param configId + */ + public void removeFlightConfigurationAndSimulations(FlightConfigurationId configId) { if (configId == null) { return; } + removeSimulations(configId); + rocket.removeFlightConfiguration(configId); + } + + /** + * removes all simulations with the specific configId + * @param configId the Flight Configuration Id that dictates which simulations shoul be removed + */ + private void removeSimulations(FlightConfigurationId configId) { for (Simulation s : getSimulations()) { // Assumes modifiable collection - which it is - if (configId.equals(s.getConfiguration().getFlightConfigurationID())) { + if (configId.equals(s.getId())) { removeSimulation(s); } } - rocket.removeFlightConfigurationID(configId); } @@ -327,42 +453,22 @@ public String getNextSimulationName() { */ public void addUndoPosition(String description) { - if (storedDescription != null) { - logUndoError("addUndoPosition called while storedDescription=" + storedDescription + - " description=" + description); - } + checkDescription(description); // Check whether modifications have been done since last call - if (isCleanState()) { - // No modifications - log.info("Adding undo position '" + description + "' to " + this + ", document was in clean state"); - nextDescription = description; + if(isCheckNoModification(description)) return; - } - log.info("Adding undo position '" + description + "' to " + this + ", document is in unclean state"); + checkUndoPositionConsistency(); + addStateToUndoHistory(description); - /* - * Modifications have been made to the rocket. We should be at the end of the - * undo history, but check for consistency and try to recover. - */ - if (undoPosition != undoHistory.size() - 1) { - logUndoError("undo position inconsistency"); - } - while (undoPosition < undoHistory.size() - 1) { - undoHistory.removeLast(); - undoDescription.removeLast(); - } - - - // Add the current state to the undo history - undoHistory.add(rocket.copyWithOriginalID()); - undoDescription.add(null); - nextDescription = description; - undoPosition++; - - - // Maintain maximum undo size + maintainMaximumUndoSize(); + } + + /** + * + */ + private void maintainMaximumUndoSize() { if (undoHistory.size() > UNDO_LEVELS + UNDO_MARGIN && undoPosition > UNDO_MARGIN) { for (int i = 0; i < UNDO_MARGIN; i++) { undoHistory.removeFirst(); @@ -371,6 +477,57 @@ public void addUndoPosition(String description) { } } } + + /** + * @param description + */ + private void addStateToUndoHistory(String description) { + // Add the current state to the undo history + undoHistory.add(rocket.copyWithOriginalID()); + undoDescription.add(null); + nextDescription = description; + undoPosition++; + } + + /** + * checks if there was or not modification, and logs + * + * @param description the description to be used in the log + * @return if there was or not modification + */ + private boolean isCheckNoModification(String description){ + if (isCleanState()) { + // No modifications + log.info("Adding undo position '" + description + "' to " + this + ", document was in clean state"); + nextDescription = description; + return true; + } + return false; + } + + /** + * checks if the document already has a stored undo description + * logs if it has + * + * @param description undo description to be logged + */ + private void checkDescription(String description) { + if (storedDescription != null) { + logUndoError("addUndoPosition called while storedDescription=" + storedDescription + + " description=" + description); + } + } + + /** + * If modifications have been made to the rocket. We should be at the end of the + * undo history, but check for consistency and try to recover. + */ + private void checkUndoPositionConsistency() { + if (undoPosition != undoHistory.size() - 1) { + logUndoError("undo position inconsistency"); + } + removeRedoInfo(); + } /** @@ -411,7 +568,7 @@ public void stopUndo() { * Clear the undo history. */ public void clearUndo() { - log.info("Clearing undo history of " + this); + //log.info("Clearing undo history of " + this); undoHistory.clear(); undoDescription.clear(); @@ -432,18 +589,29 @@ public void componentChanged(ComponentChangeEvent e) { " undoPosition=" + undoPosition + " undoHistory.size=" + undoHistory.size() + " isClean=" + isCleanState()); } - // Remove any redo information if available - while (undoPosition < undoHistory.size() - 1) { - undoHistory.removeLast(); - undoDescription.removeLast(); - } - - // Set the latest description - undoDescription.set(undoPosition, nextDescription); + removeRedoInfo(); + setLatestDescription(); } fireUndoRedoChangeEvent(); } + + /** + * Sets the latest description + */ + private void setLatestDescription() { + undoDescription.set(undoPosition, nextDescription); + } + + /** + * Removes any redo information if available + */ + private void removeRedoInfo() { + while (undoPosition < undoHistory.size() - 1) { + undoHistory.removeLast(); + undoDescription.removeLast(); + } + } /** @@ -587,7 +755,7 @@ private void logUndoError(String error) { public OpenRocketDocument copy() { Rocket rocketCopy = rocket.copyWithOriginalID(); OpenRocketDocument documentCopy = OpenRocketDocumentFactory.createDocumentFromRocket(rocketCopy); - documentCopy.getDefaultConfiguration().setFlightConfigurationID(configuration.getFlightConfigurationID()); + for (Simulation s : simulations) { documentCopy.addSimulation(s.duplicateSimulation(rocketCopy)); } @@ -606,6 +774,7 @@ public void removeUndoRedoListener(UndoRedoListener listener) { undoRedoListeners.remove(listener); } + private void fireUndoRedoChangeEvent() { UndoRedoListener[] array = undoRedoListeners.toArray(new UndoRedoListener[0]); for (UndoRedoListener l : array) { @@ -629,6 +798,17 @@ protected void fireDocumentChangeEvent(DocumentChangeEvent event) { } } + public String toSimulationDetail(){ + StringBuilder str = new StringBuilder(); + str.append(">> Dumping simulation list:\n"); + int simNum = 0; + for( Simulation s : this.simulations ){ + str.append(String.format(" [%d] %s (%s) \n", simNum, s.getName(), s.getId().toShortKey() )); + simNum++; + } + + return str.toString(); + } diff --git a/core/src/net/sf/openrocket/document/OpenRocketDocumentFactory.java b/core/src/net/sf/openrocket/document/OpenRocketDocumentFactory.java index e649a06d02..eefef3e8e0 100644 --- a/core/src/net/sf/openrocket/document/OpenRocketDocumentFactory.java +++ b/core/src/net/sf/openrocket/document/OpenRocketDocumentFactory.java @@ -2,7 +2,7 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.startup.Application; public class OpenRocketDocumentFactory { @@ -11,7 +11,7 @@ public class OpenRocketDocumentFactory { public static OpenRocketDocument createNewRocket() { Rocket rocket = new Rocket(); - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); //// Sustainer stage.setName(trans.get("BasicFrame.StageName.Sustainer")); rocket.addChild(stage); diff --git a/core/src/net/sf/openrocket/document/Simulation.java b/core/src/net/sf/openrocket/document/Simulation.java index 5a8b8ed23c..30b4d02c75 100644 --- a/core/src/net/sf/openrocket/document/Simulation.java +++ b/core/src/net/sf/openrocket/document/Simulation.java @@ -2,23 +2,19 @@ import java.util.EventListener; import java.util.EventObject; -import java.util.Iterator; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.aerodynamics.AerodynamicCalculator; import net.sf.openrocket.aerodynamics.BarrowmanCalculator; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.formatting.RocketDescriptor; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; -import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.simulation.BasicEventSimulationEngine; import net.sf.openrocket.simulation.DefaultSimulationOptionFactory; import net.sf.openrocket.simulation.FlightData; @@ -37,9 +33,6 @@ import net.sf.openrocket.util.SafetyMutex; import net.sf.openrocket.util.StateChangeListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * A class defining a simulation, its conditions and simulated data. *

@@ -77,6 +70,7 @@ public static enum Status { private SafetyMutex mutex = SafetyMutex.newInstance(); private final Rocket rocket; + FlightConfigurationId configId = FlightConfigurationId.ERROR_FCID; private String name = ""; @@ -84,7 +78,7 @@ public static enum Status { /** The conditions to use */ // TODO: HIGH: Change to use actual conditions class?? - private SimulationOptions options; + private SimulationOptions options = new SimulationOptions(); private ArrayList simulationExtensions = new ArrayList(); @@ -93,7 +87,7 @@ public static enum Status { private Class simulationStepperClass = RK4SimulationStepper.class; private Class aerodynamicCalculatorClass = BarrowmanCalculator.class; @SuppressWarnings("unused") - private Class massCalculatorClass = BasicMassCalculator.class; + private Class massCalculatorClass = MassCalculator.class; /** Listeners for this object */ private List listeners = new ArrayList(); @@ -101,7 +95,7 @@ public static enum Status { /** The conditions actually used in the previous simulation, or null */ private SimulationOptions simulatedConditions = null; - private String simulatedConfiguration = null; + private String simulatedConfigurationDescription = null; private FlightData simulatedData = null; private int simulatedRocketID = -1; @@ -116,12 +110,12 @@ public Simulation(Rocket rocket) { this.rocket = rocket; this.status = Status.NOT_SIMULATED; - options = new SimulationOptions(rocket); - DefaultSimulationOptionFactory f = Application.getInjector().getInstance(DefaultSimulationOptionFactory.class); options.copyConditionsFrom(f.getDefault()); - options.setMotorConfigurationID(rocket.getDefaultConfiguration().getFlightConfigurationID()); + FlightConfigurationId fcid = rocket.getSelectedConfiguration().getFlightConfigurationID(); + setFlightConfigurationId(fcid); + options.addChangeListener(new ConditionListener()); } @@ -139,7 +133,7 @@ public Simulation(Rocket rocket, Status status, String name, SimulationOptions o throw new IllegalArgumentException("options cannot be null"); this.rocket = rocket; - + if (status == Status.UPTODATE) { this.status = Status.LOADED; } else if (data == null) { @@ -151,6 +145,9 @@ public Simulation(Rocket rocket, Status status, String name, SimulationOptions o this.name = name; this.options = options; + + this.setFlightConfigurationId( rocket.getSelectedConfiguration().getFlightConfigurationID()); + options.addChangeListener(new ConditionListener()); if (extensions != null) { @@ -177,22 +174,66 @@ public Rocket getRocket() { mutex.verify(); return rocket; } - + + public FlightConfigurationId getFlightConfigurationId(){ + return this.configId; + } + public FlightConfigurationId getId(){ + return this.getFlightConfigurationId(); + } /** - * Return a newly created Configuration for this simulation. The configuration - * has the motor ID set and all stages active. - * - * @return a newly created Configuration of the launch conditions. + * Set the motor configuration ID. If this id does not yet exist, it will be created. + * + * @param id the configuration to set. */ - public Configuration getConfiguration() { - mutex.verify(); - Configuration c = new Configuration(rocket); - c.setFlightConfigurationID(options.getMotorConfigurationID()); - c.setAllStages(); - return c; + public void setFlightConfigurationId(FlightConfigurationId fcid) { + if ( null == fcid ){ + throw new NullPointerException("Attempted to set a null Config id in simulation options. Not allowed!"); + }else if ( fcid.hasError() ){ + throw new IllegalArgumentException("Attempted to set the configuration to an error id. Not Allowed!"); + }else if (!rocket.containsFlightConfigurationID(fcid)){ + rocket.createFlightConfiguration(fcid); + } + + if( fcid.equals(this.configId)){ + return; + } + + this.configId = fcid; + fireChangeEvent(); } + +// /** +// * Return a newly created Configuration for this simulation. The configuration +// * has the motor ID set and all stages active. +// * +// * @return a newly created Configuration of the launch conditions. +// */ +// public FlightConfiguration getConfiguration() { +// mutex.verify(); +// FlightConfiguration c = rocket.getDefaultConfiguration().clone(); +// c.setFlightConfigurationID(options.getConfigID()); +// c.setAllStages(); +// return c; +// } +// +// +// /** +// * Return a newly created Configuration for this simulation. The configuration +// * has the motor ID set and all stages active. +// * +// * @return a newly created Configuration of the launch conditions. +// */ +// public FlightConfiguration setConfiguration( final FlightConfiguration fc ) { +// mutex.verify(); +// //FlightConfiguration c = rocket.getDefaultConfiguration().clone(); +// //c.setFlightConfigurationID(options.getConfigID()); +// //c.setAllStages(); +// //return c; +// } + /** * Returns the simulation options attached to this simulation. The options * may be modified freely, and the status of the simulation will change to reflect @@ -266,29 +307,20 @@ public Status getStatus() { status = Status.OUTDATED; } } - - - //Make sure this simulation has motors. - Configuration c = new Configuration(this.getRocket()); - MotorInstanceConfiguration motors = new MotorInstanceConfiguration(); - c.setFlightConfigurationID(options.getMotorConfigurationID()); - final String flightConfigId = c.getFlightConfigurationID(); - - Iterator iterator = c.motorIterator(); - boolean no_motors = true; - - while (iterator.hasNext()) { - MotorMount mount = iterator.next(); - RocketComponent component = (RocketComponent) mount; - MotorConfiguration motorConfig = mount.getMotorConfiguration().get(flightConfigId); - IgnitionConfiguration ignitionConfig = mount.getIgnitionConfiguration().get(flightConfigId); - Motor motor = motorConfig.getMotor(); - if (motor != null) - no_motors = false; + + // if the id hasn't been set yet, skip. + if ( getId().hasError() ){ + log.warn(" simulationOptions lacks a valid id. Skipping."); + status = Status.CANT_RUN; + return status; } - if (no_motors) + FlightConfiguration config = rocket.getFlightConfiguration( this.getId()).clone(); + + //Make sure this simulation has motors. + if ( ! config.hasMotors() ){ status = Status.CANT_RUN; + } return status; } @@ -339,14 +371,11 @@ public void simulate(SimulationListener... additionalListeners) // Set simulated info after simulation, will not be set in case of exception simulatedConditions = options.clone(); - final Configuration configuration = getConfiguration(); - - simulatedConfiguration = descriptor.format(configuration.getRocket(), configuration.getFlightConfigurationID()); + simulatedConfigurationDescription = descriptor.format( this.rocket, getId()); simulatedRocketID = rocket.getFunctionalModID(); status = Status.UPTODATE; fireChangeEvent(); - configuration.release(); } finally { mutex.unlock("simulate"); } @@ -389,7 +418,7 @@ public WarningSet getSimulatedWarnings() { */ public String getSimulatedConfigurationDescription() { mutex.verify(); - return simulatedConfiguration; + return simulatedConfigurationDescription; } /** @@ -441,7 +470,7 @@ public Simulation copy() { } copy.listeners = new ArrayList(); copy.simulatedConditions = null; - copy.simulatedConfiguration = null; + copy.simulatedConfigurationDescription = null; copy.simulatedData = null; copy.simulatedRocketID = -1; @@ -469,7 +498,7 @@ public Simulation duplicateSimulation(Rocket newRocket) { copy.name = this.name; copy.options.copyFrom(this.options); - copy.simulatedConfiguration = this.simulatedConfiguration; + copy.simulatedConfigurationDescription = this.simulatedConfigurationDescription; for (SimulationExtension c : this.simulationExtensions) { copy.simulationExtensions.add(c.clone()); } @@ -522,4 +551,5 @@ public void stateChanged(EventObject e) { } } } + } diff --git a/core/src/net/sf/openrocket/document/attachments/FileSystemAttachment.java b/core/src/net/sf/openrocket/document/attachments/FileSystemAttachment.java index 28d737e440..763aa92e2f 100644 --- a/core/src/net/sf/openrocket/document/attachments/FileSystemAttachment.java +++ b/core/src/net/sf/openrocket/document/attachments/FileSystemAttachment.java @@ -8,19 +8,38 @@ import net.sf.openrocket.document.Attachment; +/** + * + * defines a file system attachment + * stores the attachment location + */ public class FileSystemAttachment extends Attachment { - + /** the file location*/ private final File location; + /** + * main constructor, + * + * @param name name of attachment + * @param location File location of attachment + */ public FileSystemAttachment(String name, File location) { super(name); this.location = location; } + /** + * + * @return the File object with the attachment location + */ public File getLocation() { return location; } + /** + * {@inheritDoc} + * creates the stream based on the location passed while building + */ @Override public InputStream getBytes() throws FileNotFoundException, IOException { return new FileInputStream(location); diff --git a/core/src/net/sf/openrocket/file/DatabaseMotorFinder.java b/core/src/net/sf/openrocket/file/DatabaseMotorFinder.java index 0232bbd1b1..a92e9f8e1b 100644 --- a/core/src/net/sf/openrocket/file/DatabaseMotorFinder.java +++ b/core/src/net/sf/openrocket/file/DatabaseMotorFinder.java @@ -1,5 +1,6 @@ package net.sf.openrocket.file; +import java.util.Collections; import java.util.List; import net.sf.openrocket.aerodynamics.Warning; @@ -45,12 +46,21 @@ public Motor findMotor(Type type, String manufacturer, String designation, doubl return null; } - List motors = Application.getMotorSetDatabase().findMotors(type, manufacturer, designation, diameter, length); + List motors; + + { + Motor m = Application.getMotorSetDatabase().findMotor(digest); + if (m != null) { + motors = Collections. singletonList(m); + } else { + motors = Application.getMotorSetDatabase().findMotors(type, manufacturer, designation, diameter, length); + } + } // No motors if (motors.size() == 0) { return handleMissingMotor(type, manufacturer, designation, diameter, length, digest, warnings); - } + } // One motor if (motors.size() == 1) { diff --git a/core/src/net/sf/openrocket/file/GeneralRocketLoader.java b/core/src/net/sf/openrocket/file/GeneralRocketLoader.java index 49f70c2ccc..f4e094328e 100644 --- a/core/src/net/sf/openrocket/file/GeneralRocketLoader.java +++ b/core/src/net/sf/openrocket/file/GeneralRocketLoader.java @@ -92,6 +92,7 @@ public final OpenRocketDocument load() throws RocketLoadException { public final OpenRocketDocument load(InputStream source) throws RocketLoadException { try { loadStep1(source); + doc.getRocket().enableEvents(); return doc; } catch (Exception e) { throw new RocketLoadException("Exception loading stream: " + e.getMessage(), e); @@ -146,7 +147,6 @@ private void loadStep1(InputStream source) throws IOException, RocketLoadExcepti // Check for ZIP (for future compatibility) if (buffer[0] == ZIP_SIGNATURE[0] && buffer[1] == ZIP_SIGNATURE[1]) { - OpenRocketDocument doc; isContainer = true; setAttachmentFactory(); // Search for entry with name *.ork @@ -158,11 +158,11 @@ private void loadStep1(InputStream source) throws IOException, RocketLoadExcepti } if (entry.getName().matches(".*\\.[oO][rR][kK]$")) { loadRocket(in); - return; } else if (entry.getName().matches(".*\\.[rR][kK][tT]$")) { loadRocket(in); - return; } + in.close(); + return; } } diff --git a/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java b/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java index f1a28a8664..e80a1e2fd1 100644 --- a/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java +++ b/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java @@ -35,6 +35,7 @@ public class DirectoryIterator extends FileIterator { * * @param directory the directory to read. * @param filter the filter for selecting files. + * @param recursive true for recursive search * @throws IOException if the directory cannot be read. */ public DirectoryIterator(File directory, FileFilter filter, boolean recursive) diff --git a/core/src/net/sf/openrocket/file/motor/AbstractMotorLoader.java b/core/src/net/sf/openrocket/file/motor/AbstractMotorLoader.java index 842ce41fdd..478e9447a4 100644 --- a/core/src/net/sf/openrocket/file/motor/AbstractMotorLoader.java +++ b/core/src/net/sf/openrocket/file/motor/AbstractMotorLoader.java @@ -9,7 +9,7 @@ import java.util.Collections; import java.util.List; -import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.util.ArrayUtils; import net.sf.openrocket.util.MathUtil; @@ -23,7 +23,7 @@ public abstract class AbstractMotorLoader implements MotorLoader { * returned by {@link #getDefaultCharset()}. */ @Override - public List load(InputStream stream, String filename) throws IOException { + public List load(InputStream stream, String filename) throws IOException { return load(new InputStreamReader(stream, getDefaultCharset()), filename); } @@ -37,7 +37,7 @@ public List load(InputStream stream, String filename) throws IOException * @return a list of motors contained in the file. * @throws IOException if an I/O exception occurs of the file format is invalid. */ - protected abstract List load(Reader reader, String filename) throws IOException; + protected abstract List load(Reader reader, String filename) throws IOException; /** diff --git a/core/src/net/sf/openrocket/file/motor/GeneralMotorLoader.java b/core/src/net/sf/openrocket/file/motor/GeneralMotorLoader.java index 937c67903b..974a4afbd1 100644 --- a/core/src/net/sf/openrocket/file/motor/GeneralMotorLoader.java +++ b/core/src/net/sf/openrocket/file/motor/GeneralMotorLoader.java @@ -5,7 +5,7 @@ import java.util.List; import net.sf.openrocket.file.UnknownFileTypeException; -import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.ThrustCurveMotor; /** * A motor loader class that detects the file type based on the file name extension. @@ -32,7 +32,7 @@ public GeneralMotorLoader() { * @throws UnknownFileTypeException if the file format is not supported */ @Override - public List load(InputStream stream, String filename) throws IOException { + public List load(InputStream stream, String filename) throws IOException { return selectLoader(filename).load(stream, filename); } diff --git a/core/src/net/sf/openrocket/file/motor/MotorLoader.java b/core/src/net/sf/openrocket/file/motor/MotorLoader.java index 46b3fb16a6..d945cf06d5 100644 --- a/core/src/net/sf/openrocket/file/motor/MotorLoader.java +++ b/core/src/net/sf/openrocket/file/motor/MotorLoader.java @@ -5,10 +5,10 @@ import java.util.List; import net.sf.openrocket.file.Loader; -import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.ThrustCurveMotor; -public interface MotorLoader extends Loader { +public interface MotorLoader extends Loader { /** * Load motors from the specified InputStream. @@ -20,6 +20,6 @@ public interface MotorLoader extends Loader { * @throws IOException if an I/O exception occurs of the file format is invalid. */ @Override - public List load(InputStream stream, String filename) throws IOException; + public List load(InputStream stream, String filename) throws IOException; } diff --git a/core/src/net/sf/openrocket/file/motor/RASPMotorLoader.java b/core/src/net/sf/openrocket/file/motor/RASPMotorLoader.java index 637aefae1b..26c102f71b 100644 --- a/core/src/net/sf/openrocket/file/motor/RASPMotorLoader.java +++ b/core/src/net/sf/openrocket/file/motor/RASPMotorLoader.java @@ -42,8 +42,8 @@ protected Charset getDefaultCharset() { * @throws IOException if an I/O error occurs or if the file format is illegal. */ @Override - public List load(Reader reader, String filename) throws IOException { - List motors = new ArrayList(); + public List load(Reader reader, String filename) throws IOException { + List motors = new ArrayList<>(); BufferedReader in = new BufferedReader(reader); String manufacturer = ""; @@ -108,7 +108,7 @@ public List load(Reader reader, String filename) throws IOException { for (int i = 0; i < buf.length; i++) { if (buf[i].equalsIgnoreCase("P") || buf[i].equalsIgnoreCase("plugged")) { - delays.add(Motor.PLUGGED); + delays.add(Motor.PLUGGED_DELAY); } else if (buf[i].matches("[0-9]+")) { // Many RASP files have "100" as an only delay double d = Double.parseDouble(buf[i]); @@ -170,7 +170,7 @@ public List load(Reader reader, String filename) throws IOException { * Create a motor from RASP file data. * @throws IOException if the data is illegal for a thrust curve */ - private static Motor createRASPMotor(String manufacturer, String designation, + private static ThrustCurveMotor.Builder createRASPMotor(String manufacturer, String designation, String comment, double length, double diameter, double[] delays, double propW, double totalW, List time, List thrust) throws IOException { @@ -201,8 +201,19 @@ private static Motor createRASPMotor(String manufacturer, String designation, try { Manufacturer m = Manufacturer.getManufacturer(manufacturer); - return new ThrustCurveMotor(m, designation, comment, m.getMotorType(), - delays, diameter, length, timeArray, thrustArray, cgArray, digest); + ThrustCurveMotor.Builder builder = new ThrustCurveMotor.Builder(); + builder.setManufacturer(m) + .setDesignation(designation) + .setDescription(comment) + .setMotorType(m.getMotorType()) + .setStandardDelays(delays) + .setDiameter(diameter) + .setLength(length) + .setTimePoints(timeArray) + .setThrustPoints(thrustArray) + .setCGPoints(cgArray) + .setDigest(digest); + return builder; } catch (IllegalArgumentException e) { diff --git a/core/src/net/sf/openrocket/file/motor/RockSimMotorLoader.java b/core/src/net/sf/openrocket/file/motor/RockSimMotorLoader.java index 838e2d8fa6..b1fee26864 100644 --- a/core/src/net/sf/openrocket/file/motor/RockSimMotorLoader.java +++ b/core/src/net/sf/openrocket/file/motor/RockSimMotorLoader.java @@ -7,6 +7,11 @@ import java.util.HashMap; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; @@ -18,13 +23,9 @@ import net.sf.openrocket.motor.MotorDigest; import net.sf.openrocket.motor.MotorDigest.DataType; import net.sf.openrocket.motor.ThrustCurveMotor; +import net.sf.openrocket.motor.ThrustCurveMotor.Builder; import net.sf.openrocket.util.Coordinate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - public class RockSimMotorLoader extends AbstractMotorLoader { private static final Logger log = LoggerFactory.getLogger(RockSimMotorLoader.class); @@ -60,7 +61,7 @@ protected Charset getDefaultCharset() { * @throws IOException if an I/O error occurs or if the file format is invalid. */ @Override - public List load(Reader reader, String filename) throws IOException { + public List load(Reader reader, String filename) throws IOException { InputSource source = new InputSource(reader); RSEHandler handler = new RSEHandler(); WarningSet warnings = new WarningSet(); @@ -79,11 +80,11 @@ public List load(Reader reader, String filename) throws IOException { * Initial handler for the RockSim engine files. */ private static class RSEHandler extends AbstractElementHandler { - private final List motors = new ArrayList(); + private final List motors = new ArrayList<>(); private RSEMotorHandler motorHandler; - public List getMotors() { + public List getMotors() { return motors; } @@ -115,7 +116,7 @@ public void closeElement(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { if (element.equals("engine")) { - Motor motor = motorHandler.getMotor(); + ThrustCurveMotor.Builder motor = motorHandler.getMotor(); motors.add(motor); } } @@ -173,12 +174,12 @@ public RSEMotorHandler(HashMap attributes) throws SAXException { double d = Double.parseDouble(delay); if (d >= DELAY_LIMIT) - d = Motor.PLUGGED; + d = Motor.PLUGGED_DELAY; delayList.add(d); } catch (NumberFormatException e) { if (str.equalsIgnoreCase("P") || str.equalsIgnoreCase("plugged")) { - delayList.add(Motor.PLUGGED); + delayList.add(Motor.PLUGGED_DELAY); } } } @@ -320,7 +321,7 @@ public void closeElement(String element, HashMap attributes, } } - public Motor getMotor() throws SAXException { + public Builder getMotor() throws SAXException { if (time == null || time.size() == 0) throw new SAXException("Illegal motor data"); @@ -380,8 +381,18 @@ public Motor getMotor() throws SAXException { } } - return new ThrustCurveMotor(m, designation, description, t, - delays, diameter, length, timeArray, thrustArray, cgArray, digest); + return new ThrustCurveMotor.Builder() + .setManufacturer(m) + .setDesignation(designation) + .setDescription(description) + .setMotorType(t) + .setStandardDelays(delays) + .setDiameter(diameter) + .setLength(length) + .setTimePoints(timeArray) + .setThrustPoints(thrustArray) + .setCGPoints(cgArray) + .setDigest(digest); } catch (IllegalArgumentException e) { throw new SAXException("Illegal motor data", e); } diff --git a/core/src/net/sf/openrocket/file/motor/ZipFileMotorLoader.java b/core/src/net/sf/openrocket/file/motor/ZipFileMotorLoader.java index 193014588c..176da2dc61 100644 --- a/core/src/net/sf/openrocket/file/motor/ZipFileMotorLoader.java +++ b/core/src/net/sf/openrocket/file/motor/ZipFileMotorLoader.java @@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory; import net.sf.openrocket.file.UnknownFileTypeException; -import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.util.UncloseableInputStream; /** @@ -44,8 +44,8 @@ public ZipFileMotorLoader(MotorLoader loader) { @Override - public List load(InputStream stream, String filename) throws IOException { - List motors = new ArrayList(); + public List load(InputStream stream, String filename) throws IOException { + List motors = new ArrayList<>(); ZipInputStream is = new ZipInputStream(stream); @@ -71,7 +71,7 @@ public List load(InputStream stream, String filename) throws IOException } try { - List m = loader.load(uncloseable, entry.getName()); + List m = loader.load(uncloseable, entry.getName()); motors.addAll(m); log.info("Loaded " + m.size() + " motors from ZIP entry " + entry.getName()); } catch (UnknownFileTypeException e) { diff --git a/core/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java b/core/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java index c22099caa1..ce929e85fd 100644 --- a/core/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java @@ -10,21 +10,16 @@ import java.util.List; import java.util.Locale; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.document.StorageOptions; import net.sf.openrocket.file.RocketSaver; -import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; -import net.sf.openrocket.rocketcomponent.FinSet; -import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; -import net.sf.openrocket.rocketcomponent.MotorMount; -import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; -import net.sf.openrocket.rocketcomponent.TubeCoupler; -import net.sf.openrocket.rocketcomponent.TubeFinSet; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.simulation.FlightDataType; @@ -35,13 +30,9 @@ import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BuildProperties; import net.sf.openrocket.util.Config; -import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Reflection; import net.sf.openrocket.util.TextUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class OpenRocketSaver extends RocketSaver { private static final Logger log = LoggerFactory.getLogger(OpenRocketSaver.class); @@ -222,180 +213,65 @@ private int calculateNecessaryFileVersion(OpenRocketDocument document, StorageOp /* * NOTE: Remember to update the supported versions in DocumentConfig as well! * - * File version 1.7 is required for: - * - simulation extensions - * - saving tube fins. - * - * File version 1.6 is required for: - * - saving files using appearances and textures, flight configurations. - * - * File version 1.5 is requires for: - * - saving designs using ComponentPrests - * - recovery device deployment on lower stage separation - * - custom expressions + * File version 1.8 is required for: + * - new-style positioning + * - external/parallel booster stages + * - external pods + * - Rail Buttons * - * File version 1.4 is required for: - * - saving simulation data - * - saving motor data - * - * File version 1.1 is required for: - * - fin tabs - * - components attached to tube coupler - * - * Otherwise use version 1.0. + * Otherwise use version 1.8. */ ///////////////// - // Version 1.7 // - ///////////////// - for (Simulation sim : document.getSimulations()) { - if (!sim.getSimulationExtensions().isEmpty()) { - return FILE_VERSION_DIVISOR + 7; - } - } - - // Search the rocket for any TubeFinSet objects (version 1.7) - for (RocketComponent c : document.getRocket()) { - if (c instanceof TubeFinSet) { - return FILE_VERSION_DIVISOR + 7; - } - } - - - ///////////////// - // Version 1.6 // - ///////////////// - - // Search the rocket for any Appearances or non-motor flight configurations (version 1.6) - for (RocketComponent c : document.getRocket()) { - if (c.getAppearance() != null) { - return FILE_VERSION_DIVISOR + 6; - } - if (c instanceof FlightConfigurableComponent) { - if (c instanceof MotorMount) { - MotorMount mmt = (MotorMount) c; - if (mmt.getIgnitionConfiguration().size() > 0) { - return FILE_VERSION_DIVISOR + 6; - } - } - if (c instanceof RecoveryDevice) { - RecoveryDevice recovery = (RecoveryDevice) c; - if (recovery.getDeploymentConfiguration().size() > 0) { - return FILE_VERSION_DIVISOR + 6; - } - } - if (c instanceof Stage) { - Stage stage = (Stage) c; - if (stage.getStageSeparationConfiguration().size() > 0) { - return FILE_VERSION_DIVISOR + 6; - } - } - } - } - - ///////////////// - // Version 1.5 // - ///////////////// - - // Search the rocket for any ComponentPresets (version 1.5) - for (RocketComponent c : document.getRocket()) { - if (c.getPresetComponent() != null) { - return FILE_VERSION_DIVISOR + 5; - } - } - - // Search for recovery device deployment type LOWER_STAGE_SEPARATION (version 1.5) - for (RocketComponent c : document.getRocket()) { - if (c instanceof RecoveryDevice) { - if (((RecoveryDevice) c).getDeploymentConfiguration().getDefault().getDeployEvent() == DeployEvent.LOWER_STAGE_SEPARATION) { - return FILE_VERSION_DIVISOR + 5; - } - } - } - - // Check for custom expressions (version 1.5) - if (!document.getCustomExpressions().isEmpty()) { - return FILE_VERSION_DIVISOR + 5; - } - - ///////////////// - // Version 1.4 // + // Version 1.8 // ///////////////// + // for any new-style positioning: 'axialoffset', 'angleoffset', 'radiusoffset' tags + // these tags are used for any RocketComponent child classes positioning... so... ALL the classes. + return FILE_VERSION_DIVISOR + 8; - // Check if design has simulations defined (version 1.4) - if (document.getSimulationCount() > 0) { - return FILE_VERSION_DIVISOR + 4; - } - - // Check for motor definitions (version 1.4) - for (RocketComponent c : document.getRocket()) { - if (!(c instanceof MotorMount)) - continue; + } + + + /** + * Finds a getElements method somewhere in the *saver class hiearchy corresponding to the given component. + */ + private static Reflection.Method findGetElementsMethod(RocketComponent component) { + String currentclassname; + Class currentclass; + String saverclassname; + Class saverClass; + + Reflection.Method mtr = null; // method-to-return + + currentclass = component.getClass(); + while ((currentclass != null) && (currentclass != Object.class)) { + currentclassname = currentclass.getSimpleName(); + saverclassname = METHOD_PACKAGE + "." + currentclassname + METHOD_SUFFIX; - MotorMount mount = (MotorMount) c; - for (String id : document.getRocket().getFlightConfigurationIDs()) { - if (mount.getMotor(id) != null) { - return FILE_VERSION_DIVISOR + 4; - } - } - } - - ///////////////// - // Version 1.3 // - ///////////////// - - // no version 1.3 file type exists - - ///////////////// - // Version 1.2 // - ///////////////// - - // no version 1.2 file type exists - - ///////////////// - // Version 1.1 // - ///////////////// - - // Check for fin tabs or tube coupler children (version 1.1) - for (RocketComponent c : document.getRocket()) { - // Check for fin tabs - if (c instanceof FinSet) { - FinSet fin = (FinSet) c; - if (!MathUtil.equals(fin.getTabHeight(), 0) && - !MathUtil.equals(fin.getTabLength(), 0)) { - return FILE_VERSION_DIVISOR + 1; - } + try { + saverClass = Class.forName(saverclassname); + + // if class exists + java.lang.reflect.Method m = saverClass.getMethod("getElements", RocketComponent.class); + mtr = new Reflection.Method(m); + + return mtr; + } catch (Exception ignore) { } - // Check for components attached to tube coupler - if (c instanceof TubeCoupler) { - if (c.getChildCount() > 0) { - return FILE_VERSION_DIVISOR + 1; - } - } + currentclass = currentclass.getSuperclass(); } - ///////////////// - // Version 1.0 // - ///////////////// - - // Default (version 1.0) - return FILE_VERSION_DIVISOR + 0; + // if( null == mtr ){ + throw new BugException("Unable to find saving class for component " + + METHOD_PACKAGE + "." + component.getClass().getSimpleName() + " ... " + METHOD_SUFFIX); } - - @SuppressWarnings("unchecked") private void saveComponent(RocketComponent component) throws IOException { - log.debug("Saving component " + component.getComponentName()); - Reflection.Method m = Reflection.findMethod(METHOD_PACKAGE, component, METHOD_SUFFIX, - "getElements", RocketComponent.class); - if (m == null) { - throw new BugException("Unable to find saving class for component " + - component.getComponentName()); - } + Reflection.Method m = findGetElementsMethod(component); // Get the strings to save List list = (List) m.invokeStatic(component); @@ -454,7 +330,7 @@ private void saveSimulation(Simulation simulation, double timeSkip) throws IOExc writeln(""); indent++; - writeElement("configid", cond.getMotorConfigurationID()); + writeElement("configid", simulation.getId().key); writeElement("launchrodlength", cond.getLaunchRodLength()); writeElement("launchrodangle", cond.getLaunchRodAngle() * 180.0 / Math.PI); writeElement("launchroddirection", cond.getLaunchRodDirection() * 360.0 / (2.0 * Math.PI)); diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/AnglePositionSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/AnglePositionSetter.java new file mode 100644 index 0000000000..06b6d97d2f --- /dev/null +++ b/core/src/net/sf/openrocket/file/openrocket/importt/AnglePositionSetter.java @@ -0,0 +1,38 @@ +package net.sf.openrocket.file.openrocket.importt; + +import java.util.HashMap; + +import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.AnglePositionable; + +class AnglePositionSetter implements Setter { + + @Override + public void set(RocketComponent c, String value, HashMap attributes, + WarningSet warnings) { + + AngleMethod method = (AngleMethod) DocumentConfig.findEnum(attributes.get("method"), AngleMethod.class); + if (null==method) { + method=AngleMethod.RELATIVE; + } + + double pos; + try { + pos = Double.parseDouble(value) * Math.PI / 180.0 ; + } catch (NumberFormatException e) { + warnings.add(String.format("Warning: invalid value radius position. value=%s class: %s", value, c.getClass().getCanonicalName() )); + return; + } + + if ( AnglePositionable.class.isAssignableFrom( c.getClass() ) ) { + AnglePositionable apc = (AnglePositionable)c; + apc.setAngleMethod(method); + apc.setAngleOffset(pos); + } else { + warnings.add(String.format("Warning: %s is not valid for class: %s", this.getClass().getCanonicalName(), c.getClass().getCanonicalName())); + } + + } +} diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/AppearanceHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/AppearanceHandler.java index 11b52f2ba5..b59cea9cdd 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/AppearanceHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/AppearanceHandler.java @@ -51,7 +51,14 @@ public void closeElement(String element, HashMap attributes, Str int red = Integer.parseInt(attributes.get("red")); int green = Integer.parseInt(attributes.get("green")); int blue = Integer.parseInt(attributes.get("blue")); - builder.setPaint(new Color(red, green, blue)); + int alpha = 255;//set default + // add a test if "alpha" was added to the XML / backwards compatibility + String a = attributes.get("alpha"); + if (a != null){ + // "alpha" string was present so load the value + alpha = Integer.parseInt(a); + } + builder.setPaint(new Color(red, green, blue, alpha)); return; } if ("shine".equals(element)) { @@ -96,4 +103,4 @@ public void endHandler(String element, HashMap attributes, super.endHandler(element, attributes, content, warnings); } -} \ No newline at end of file +} diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/AxialPositionSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/AxialPositionSetter.java new file mode 100644 index 0000000000..2fe5084a99 --- /dev/null +++ b/core/src/net/sf/openrocket/file/openrocket/importt/AxialPositionSetter.java @@ -0,0 +1,45 @@ +package net.sf.openrocket.file.openrocket.importt; + +import java.util.HashMap; + +import net.sf.openrocket.aerodynamics.Warning; +import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; +class AxialPositionSetter implements Setter { + + @Override + public void set(RocketComponent c, String value, HashMap attributes, + WarningSet warnings) { + + // first check preferred attribute name: + AxialMethod type = (AxialMethod) DocumentConfig.findEnum(attributes.get("method"), AxialMethod.class); + // fall-back to old name + if (null == type) { + type = (AxialMethod) DocumentConfig.findEnum(attributes.get("type"), AxialMethod.class); + } + + if (type == null) { + warnings.add(Warning.FILE_INVALID_PARAMETER); + return; + } + + double pos; + try { + pos = Double.parseDouble(value); + } catch (NumberFormatException e) { + warnings.add(String.format("Warning: invalid value radius position. value=%s class: %s", value, c.getClass().getCanonicalName() )); + return; + } + + if ( AxialPositionable.class.isAssignableFrom( c.getClass() ) ) { + AxialPositionable apc = (AxialPositionable)c; + apc.setAxialMethod(type); + apc.setAxialOffset(pos); + } else { + warnings.add(String.format("Warning: %s is not valid for class: %s", this.getClass().getCanonicalName(), c.getClass().getCanonicalName())); + } + + } +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java index 01e2bb3c79..7bc42fe546 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/ComponentParameterHandler.java @@ -13,7 +13,7 @@ import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; /** * A handler that populates the parameters of a previously constructed rocket component. @@ -61,6 +61,13 @@ public ElementHandler openElement(String element, HashMap attrib } return new MotorConfigurationHandler((Rocket) component, context); } + if (element.equals("flightconfiguration")) { + if (!(component instanceof Rocket)) { + warnings.add(Warning.fromString("Illegal component defined for flight configuration.")); + return null; + } + return new MotorConfigurationHandler((Rocket) component, context); + } if ( element.equals("deploymentconfiguration")) { if ( !(component instanceof RecoveryDevice) ) { warnings.add(Warning.fromString("Illegal component defined as recovery device.")); @@ -69,11 +76,11 @@ public ElementHandler openElement(String element, HashMap attrib return new DeploymentConfigurationHandler( (RecoveryDevice) component, context ); } if ( element.equals("separationconfiguration")) { - if ( !(component instanceof Stage) ) { + if ( !(component instanceof AxialStage) ) { warnings.add(Warning.fromString("Illegal component defined as stage.")); return null; } - return new StageSeparationConfigurationHandler( (Stage) component, context ); + return new StageSeparationConfigurationHandler( (AxialStage) component, context ); } return PlainTextHandler.INSTANCE; diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DeploymentConfigurationHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/DeploymentConfigurationHandler.java index e40992bbbe..77b1573699 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DeploymentConfigurationHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DeploymentConfigurationHandler.java @@ -2,6 +2,8 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; @@ -10,10 +12,9 @@ import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.RecoveryDevice; -import org.xml.sax.SAXException; - class DeploymentConfigurationHandler extends AbstractElementHandler { private final RecoveryDevice recoveryDevice; @@ -72,9 +73,9 @@ public void closeElement(String element, HashMap attributes, Str @Override public void endHandler(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { - String configId = attributes.get("configid"); - DeploymentConfiguration def = recoveryDevice.getDeploymentConfiguration().getDefault(); - recoveryDevice.getDeploymentConfiguration().set(configId, getConfiguration(def)); + FlightConfigurationId configId = new FlightConfigurationId(attributes.get("configid")); + DeploymentConfiguration def = recoveryDevice.getDeploymentConfigurations().getDefault(); + recoveryDevice.getDeploymentConfigurations().set(configId, getConfiguration(def)); } } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java index 129f17bfeb..8393737f62 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DocumentConfig.java @@ -6,41 +6,9 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset; -import net.sf.openrocket.rocketcomponent.BodyComponent; -import net.sf.openrocket.rocketcomponent.BodyTube; -import net.sf.openrocket.rocketcomponent.Bulkhead; -import net.sf.openrocket.rocketcomponent.CenteringRing; -import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; +import net.sf.openrocket.rocketcomponent.*; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; -import net.sf.openrocket.rocketcomponent.EllipticalFinSet; -import net.sf.openrocket.rocketcomponent.EngineBlock; -import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; -import net.sf.openrocket.rocketcomponent.FinSet; -import net.sf.openrocket.rocketcomponent.FreeformFinSet; -import net.sf.openrocket.rocketcomponent.InnerTube; -import net.sf.openrocket.rocketcomponent.LaunchLug; -import net.sf.openrocket.rocketcomponent.MassComponent; -import net.sf.openrocket.rocketcomponent.MassObject; -import net.sf.openrocket.rocketcomponent.NoseCone; -import net.sf.openrocket.rocketcomponent.Parachute; -import net.sf.openrocket.rocketcomponent.RadiusRingComponent; -import net.sf.openrocket.rocketcomponent.RecoveryDevice; -import net.sf.openrocket.rocketcomponent.ReferenceType; -import net.sf.openrocket.rocketcomponent.RingComponent; -import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.ShockCord; -import net.sf.openrocket.rocketcomponent.Stage; -import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; -import net.sf.openrocket.rocketcomponent.Streamer; -import net.sf.openrocket.rocketcomponent.StructuralComponent; -import net.sf.openrocket.rocketcomponent.SymmetricComponent; -import net.sf.openrocket.rocketcomponent.ThicknessRingComponent; -import net.sf.openrocket.rocketcomponent.Transition; -import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; -import net.sf.openrocket.rocketcomponent.TubeCoupler; -import net.sf.openrocket.rocketcomponent.TubeFinSet; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Color; import net.sf.openrocket.util.LineStyle; @@ -49,7 +17,7 @@ class DocumentConfig { /* Remember to update OpenRocketSaver as well! */ - public static final String[] SUPPORTED_VERSIONS = { "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7" }; + public static final String[] SUPPORTED_VERSIONS = { "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8" }; /** * Divisor used in converting an integer version to the point-represented version. @@ -72,6 +40,7 @@ class DocumentConfig { constructors.put("freeformfinset", FreeformFinSet.class.getConstructor(new Class[0])); constructors.put("tubefinset", TubeFinSet.class.getConstructor(new Class[0])); constructors.put("launchlug", LaunchLug.class.getConstructor(new Class[0])); + constructors.put("railbutton", RailButton.class.getConstructor(new Class[0])); // Internal components constructors.put("engineblock", EngineBlock.class.getConstructor(new Class[0])); @@ -84,9 +53,13 @@ class DocumentConfig { constructors.put("shockcord", ShockCord.class.getConstructor(new Class[0])); constructors.put("parachute", Parachute.class.getConstructor(new Class[0])); constructors.put("streamer", Streamer.class.getConstructor(new Class[0])); + constructors.put("fueltank", FuelTank.class.getConstructor(new Class[0])); // Other - constructors.put("stage", Stage.class.getConstructor(new Class[0])); + constructors.put("stage", AxialStage.class.getConstructor(new Class[0])); + constructors.put("boosterset", ParallelStage.class.getConstructor(new Class[0])); + constructors.put("parallelstage", ParallelStage.class.getConstructor(new Class[0])); + constructors.put("podset", PodSet.class.getConstructor(new Class[0])); } catch (NoSuchMethodException e) { throw new BugException( @@ -111,13 +84,17 @@ class DocumentConfig { setters.put("RocketComponent:linestyle", new EnumSetter( Reflection.findMethod(RocketComponent.class, "setLineStyle", LineStyle.class), LineStyle.class)); - setters.put("RocketComponent:position", new PositionSetter()); + setters.put("RocketComponent:position", new AxialPositionSetter() ); + setters.put("RocketComponent:axialoffset", new AxialPositionSetter() ); setters.put("RocketComponent:overridemass", new OverrideSetter( Reflection.findMethod(RocketComponent.class, "setOverrideMass", double.class), Reflection.findMethod(RocketComponent.class, "setMassOverridden", boolean.class))); setters.put("RocketComponent:overridecg", new OverrideSetter( Reflection.findMethod(RocketComponent.class, "setOverrideCGX", double.class), Reflection.findMethod(RocketComponent.class, "setCGOverridden", boolean.class))); + setters.put("RocketComponent:overridecd", new OverrideSetter( + Reflection.findMethod(RocketComponent.class, "setOverrideCD", double.class), + Reflection.findMethod(RocketComponent.class, "setCDOverridden", boolean.class))); setters.put("RocketComponent:overridesubcomponents", new BooleanSetter( Reflection.findMethod(RocketComponent.class, "setOverrideSubcomponents", boolean.class))); setters.put("RocketComponent:comment", new StringSetter( @@ -125,6 +102,7 @@ class DocumentConfig { setters.put("RocketComponent:preset", new ComponentPresetSetter( Reflection.findMethod(RocketComponent.class, "loadPreset", ComponentPreset.class))); + // ExternalComponent setters.put("ExternalComponent:finish", new EnumSetter( Reflection.findMethod(ExternalComponent.class, "setFinish", Finish.class), @@ -136,19 +114,51 @@ class DocumentConfig { // BodyComponent setters.put("BodyComponent:length", new DoubleSetter( Reflection.findMethod(BodyComponent.class, "setLength", double.class))); - - // SymmetricComponent - setters.put("SymmetricComponent:thickness", new DoubleSetter( - Reflection.findMethod(SymmetricComponent.class, "setThickness", double.class), - "filled", - Reflection.findMethod(SymmetricComponent.class, "setFilled", boolean.class))); - + // BodyTube setters.put("BodyTube:radius", new DoubleSetter( Reflection.findMethod(BodyTube.class, "setOuterRadius", double.class), "auto", Reflection.findMethod(BodyTube.class, "setOuterRadiusAutomatic", boolean.class))); + + // Parallel Stage + setters.put("ParallelStage:instancecount", new IntSetter( + Reflection.findMethod(ParallelStage.class, "setInstanceCount",int.class))); + setters.put("ParallelStage:angleoffset", new AnglePositionSetter()); + setters.put("ParallelStage:radiusoffset", new RadiusPositionSetter()); + + // SymmetricComponent + setters.put("SymmetricComponent:thickness", new DoubleSetter( + Reflection.findMethod(SymmetricComponent.class, "setThickness", double.class), + "filled", + Reflection.findMethod(SymmetricComponent.class, "setFilled", boolean.class))); + // LaunchLug + setters.put("LaunchLug:instancecount", new IntSetter( + Reflection.findMethod( LaunchLug.class, "setInstanceCount",int.class))); + setters.put("LaunchLug:instanceseparation", new DoubleSetter( + Reflection.findMethod( LaunchLug.class, "setInstanceSeparation", double.class))); + setters.put("LaunchLug:radialdirection", new DoubleSetter( + Reflection.findMethod( LaunchLug.class, "setAngleOffset", double.class), Math.PI / 180.0)); + setters.put("LaunchLug:angleoffset", new AnglePositionSetter() ); + setters.put("LaunchLug:radius", new DoubleSetter( + Reflection.findMethod(LaunchLug.class, "setOuterRadius", double.class))); + setters.put("LaunchLug:length", new DoubleSetter( + Reflection.findMethod(LaunchLug.class, "setLength", double.class))); + setters.put("LaunchLug:thickness", new DoubleSetter( + Reflection.findMethod(LaunchLug.class, "setThickness", double.class))); + + // RailButton + setters.put("RailButton:instancecount", new IntSetter( + Reflection.findMethod( RailButton.class, "setInstanceCount",int.class))); + setters.put("RailButton:instanceseparation", new DoubleSetter( + Reflection.findMethod( RailButton.class, "setInstanceSeparation", double.class))); + setters.put("RailButton:angleoffset", new AnglePositionSetter() ); + setters.put("RailButton:height", new DoubleSetter( + Reflection.findMethod( RailButton.class, "setTotalHeight", double.class))); + setters.put("RailButton:outerdiameter", new DoubleSetter( + Reflection.findMethod( RailButton.class, "setOuterDiameter", double.class))); + // Transition setters.put("Transition:shape", new EnumSetter( Reflection.findMethod(Transition.class, "setType", Transition.Shape.class), @@ -195,8 +205,12 @@ class DocumentConfig { // FinSet setters.put("FinSet:fincount", new IntSetter( Reflection.findMethod(FinSet.class, "setFinCount", int.class))); + setters.put("FinSet:instancecount", new IntSetter( + Reflection.findMethod(FinSet.class, "setInstanceCount", int.class))); setters.put("FinSet:rotation", new DoubleSetter( Reflection.findMethod(FinSet.class, "setBaseRotation", double.class), Math.PI / 180.0)); + setters.put("FinSet:angleoffset", new AnglePositionSetter() ); + setters.put("FinSet:radiusoffset", new RadiusPositionSetter() ); setters.put("FinSet:thickness", new DoubleSetter( Reflection.findMethod(FinSet.class, "setThickness", double.class))); setters.put("FinSet:crosssection", new EnumSetter( @@ -214,6 +228,7 @@ class DocumentConfig { setters.put("FinSet:filletmaterial", new MaterialSetter( Reflection.findMethod(FinSet.class, "setFilletMaterial", Material.class), Material.Type.BULK)); + // TrapezoidFinSet setters.put("TrapezoidFinSet:rootchord", new DoubleSetter( Reflection.findMethod(TrapezoidFinSet.class, "setRootChord", double.class))); @@ -246,17 +261,6 @@ class DocumentConfig { "auto", Reflection.findMethod(TubeFinSet.class, "setOuterRadiusAutomatic", boolean.class))); - // LaunchLug - setters.put("LaunchLug:radius", new DoubleSetter( - Reflection.findMethod(LaunchLug.class, "setOuterRadius", double.class))); - setters.put("LaunchLug:length", new DoubleSetter( - Reflection.findMethod(LaunchLug.class, "setLength", double.class))); - setters.put("LaunchLug:thickness", new DoubleSetter( - Reflection.findMethod(LaunchLug.class, "setThickness", double.class))); - setters.put("LaunchLug:radialdirection", new DoubleSetter( - Reflection.findMethod(LaunchLug.class, "setRadialDirection", double.class), - Math.PI / 180.0)); - // InternalComponent - nothing // StructuralComponent @@ -300,6 +304,10 @@ class DocumentConfig { Math.PI / 180.0)); // RadiusRingComponent + setters.put("RadiusRingComponent:instancecount", new IntSetter( + Reflection.findMethod( RadiusRingComponent.class, "setInstanceCount",int.class))); + setters.put("RadiusRingComponent:instanceseparation", new DoubleSetter( + Reflection.findMethod( RadiusRingComponent.class, "setInstanceSeparation", double.class))); // Bulkhead setters.put("RadiusRingComponent:innerradius", new DoubleSetter( @@ -319,7 +327,6 @@ class DocumentConfig { "auto", Reflection.findMethod(CenteringRing.class, "setOuterRadiusAutomatic", boolean.class))); - // MassObject setters.put("MassObject:packedlength", new DoubleSetter( Reflection.findMethod(MassObject.class, "setLength", double.class))); @@ -342,6 +349,17 @@ class DocumentConfig { /* setters.put("Transition:shape", new EnumSetter( Reflection.findMethod(Transition.class, "setType", Transition.Shape.class), Transition.Shape.class));*/ + + // FuelTank + setters.put("FuelTank:packedmass", new DoubleSetter( + Reflection.findMethod(FuelTank.class, "setComponentMass", double.class))); + setters.put("FuelTank:packedfuelqty", new DoubleSetter( + Reflection.findMethod(FuelTank.class, "setFuelQty", double.class))); + setters.put("FuelTank:packedburnrate", new DoubleSetter( + Reflection.findMethod(FuelTank.class, "setBurnRate", double.class))); + setters.put("FuelTank:packedfueltype", new EnumSetter( + Reflection.findMethod(FuelTank.class, "setFuelType", FuelTank.FuelType.class), + FuelTank.FuelType.class)); // ShockCord setters.put("ShockCord:cordlength", new DoubleSetter( @@ -356,14 +374,14 @@ class DocumentConfig { "auto", Reflection.findMethod(RecoveryDevice.class, "setCDAutomatic", boolean.class))); setters.put("RecoveryDevice:deployevent", new EnumSetter( - Reflection.findMethod(RecoveryDevice.class, "getDeploymentConfiguration"), + Reflection.findMethod(RecoveryDevice.class, "getDeploymentConfigurations"), Reflection.findMethod(DeploymentConfiguration.class, "setDeployEvent", DeployEvent.class), DeployEvent.class)); setters.put("RecoveryDevice:deployaltitude", new DoubleSetter( - Reflection.findMethod(RecoveryDevice.class, "getDeploymentConfiguration"), + Reflection.findMethod(RecoveryDevice.class, "getDeploymentConfigurations"), Reflection.findMethod(DeploymentConfiguration.class, "setDeployAltitude", double.class))); setters.put("RecoveryDevice:deploydelay", new DoubleSetter( - Reflection.findMethod(RecoveryDevice.class, "getDeploymentConfiguration"), + Reflection.findMethod(RecoveryDevice.class, "getDeploymentConfigurations"), Reflection.findMethod(DeploymentConfiguration.class, "setDeployDelay", double.class))); setters.put("RecoveryDevice:material", new MaterialSetter( Reflection.findMethod(RecoveryDevice.class, "setMaterial", Material.class), @@ -380,6 +398,12 @@ class DocumentConfig { Reflection.findMethod(Parachute.class, "setLineMaterial", Material.class), Material.Type.LINE)); + // PodSet + setters.put("PodSet:instancecount", new IntSetter( + Reflection.findMethod(PodSet.class, "setInstanceCount",int.class))); + setters.put("PodSet:radiusoffset", new RadiusPositionSetter() ); + setters.put("PodSet:angleoffset", new AnglePositionSetter() ); + // Streamer setters.put("Streamer:striplength", new DoubleSetter( Reflection.findMethod(Streamer.class, "setStripLength", double.class))); @@ -398,14 +422,15 @@ class DocumentConfig { setters.put("Rocket:revision", new StringSetter( Reflection.findMethod(Rocket.class, "setRevision", String.class))); - // Stage - setters.put("Stage:separationevent", new EnumSetter( - Reflection.findMethod(Stage.class, "getStageSeparationConfiguration"), + // Axial Stage + setters.put("AxialStage:separationevent", new EnumSetter( + Reflection.findMethod(AxialStage.class, "getSeparationConfigurations"), Reflection.findMethod(StageSeparationConfiguration.class, "setSeparationEvent", StageSeparationConfiguration.SeparationEvent.class), StageSeparationConfiguration.SeparationEvent.class)); - setters.put("Stage:separationdelay", new DoubleSetter( - Reflection.findMethod(Stage.class, "getStageSeparationConfiguration"), + setters.put("AxialStage:separationdelay", new DoubleSetter( + Reflection.findMethod(AxialStage.class, "getSeparationConfigurations"), Reflection.findMethod(StageSeparationConfiguration.class, "setSeparationDelay", double.class))); + } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/DoubleSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/DoubleSetter.java index 9fdd3e9f36..5d553b57b5 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/DoubleSetter.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/DoubleSetter.java @@ -4,7 +4,7 @@ import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; -import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameterSet; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Reflection; import net.sf.openrocket.util.Reflection.Method; @@ -94,7 +94,7 @@ public void set(RocketComponent c, String s, HashMap attributes, if (configGetter == null) { setMethod.invoke(c, d * multiplier); } else { - FlightConfiguration config = (FlightConfiguration) configGetter.invoke(c); + FlightConfigurableParameterSet config = (FlightConfigurableParameterSet) configGetter.invoke(c); Object obj = config.getDefault(); setMethod.invoke(obj, d * multiplier); } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/EnumSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/EnumSetter.java index 55ceaac347..3156c1dd2d 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/EnumSetter.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/EnumSetter.java @@ -4,7 +4,7 @@ import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; -import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameterSet; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Reflection; import net.sf.openrocket.util.Reflection.Method; @@ -38,7 +38,7 @@ public void set(RocketComponent c, String name, HashMap attribut if (configurationGetter == null) { setter.invoke(c, setEnum); } else { - FlightConfiguration config = (FlightConfiguration) configurationGetter.invoke(c); + FlightConfigurableParameterSet config = (FlightConfigurableParameterSet) configurationGetter.invoke(c); Object obj = config.getDefault(); setter.invoke(obj, setEnum); } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/FinSetPointHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/FinSetPointHandler.java index 9d99412708..50dd7f10d3 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/FinSetPointHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/FinSetPointHandler.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; @@ -10,11 +12,8 @@ import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.rocketcomponent.FreeformFinSet; -import net.sf.openrocket.rocketcomponent.IllegalFinPointException; import net.sf.openrocket.util.Coordinate; -import org.xml.sax.SAXException; - /** * A handler that reads the specifications within the freeformfinset's * elements. @@ -62,10 +61,7 @@ public void closeElement(String element, HashMap attributes, @Override public void endHandler(String element, HashMap attributes, String content, WarningSet warnings) { - try { - finset.setPoints(coordinates.toArray(new Coordinate[0])); - } catch (IllegalFinPointException e) { - warnings.add(Warning.fromString("Freeform fin set point definitions illegal, ignoring.")); - } + finset.setPoints(coordinates.toArray(new Coordinate[0])); + } } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/FinTabPositionSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/FinTabPositionSetter.java index f6e046d190..b0e3fda77b 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/FinTabPositionSetter.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/FinTabPositionSetter.java @@ -5,13 +5,13 @@ import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.FinSet.TabRelativePosition; +import net.sf.openrocket.rocketcomponent.position.*; import net.sf.openrocket.util.Reflection; class FinTabPositionSetter extends DoubleSetter { public FinTabPositionSetter() { - super(Reflection.findMethod(FinSet.class, "setTabShift", double.class)); + super(Reflection.findMethod(FinSet.class, "setTabOffset", double.class)); } @Override @@ -23,23 +23,30 @@ public void set(RocketComponent c, String s, HashMap attributes, } String relative = attributes.get("relativeto"); - FinSet.TabRelativePosition position = - (TabRelativePosition) DocumentConfig.findEnum(relative, - FinSet.TabRelativePosition.class); - if (position != null) { + if (relative == null) { + warnings.add("Required attribute 'relativeto' not found for fin tab position."); + } else { + // translate from old enum names to current enum names + if( relative.contains("front")){ + relative = "top"; + }else if( relative.contains("center")){ + relative = "middle"; + }else if( relative.contains("end")){ + relative = "bottom"; + } - ((FinSet) c).setTabRelativePosition(position); + AxialMethod position = (AxialMethod) DocumentConfig.findEnum(relative, AxialMethod.class); - } else { - if (relative == null) { - warnings.add("Required attribute 'relativeto' not found for fin tab position."); - } else { + if( null == position ){ warnings.add("Illegal attribute value '" + relative + "' encountered."); + }else{ + ((FinSet) c).setTabOffsetMethod(position); + super.set(c, s, attributes, warnings); } + } - super.set(c, s, attributes, warnings); } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/IgnitionConfigurationHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/IgnitionConfigurationHandler.java index ee02dbc079..10d5c6b1aa 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/IgnitionConfigurationHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/IgnitionConfigurationHandler.java @@ -1,7 +1,8 @@ package net.sf.openrocket.file.openrocket.importt; import java.util.HashMap; -import java.util.Locale; + +import org.xml.sax.SAXException; import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; @@ -9,41 +10,25 @@ import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration.IgnitionEvent; - -import org.xml.sax.SAXException; +import net.sf.openrocket.motor.IgnitionEvent; class IgnitionConfigurationHandler extends AbstractElementHandler { - private Double ignitionDelay = null; - private IgnitionEvent ignitionEvent = null; + // TODO: this is pretty hacky and should be fixed eventually + public Double ignitionDelay = null; + public IgnitionEvent ignitionEvent = null; public IgnitionConfigurationHandler(DocumentLoadingContext context) { } - @Override public ElementHandler openElement(String element, HashMap attributes, WarningSet warnings) { return PlainTextHandler.INSTANCE; } - - public IgnitionConfiguration getConfiguration(IgnitionConfiguration def) { - IgnitionConfiguration config = def.clone(); - if (ignitionEvent != null) { - config.setIgnitionEvent(ignitionEvent); - } - if (ignitionDelay != null) { - config.setIgnitionDelay(ignitionDelay); - } - return config; - } - - @Override public void closeElement(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { @@ -51,10 +36,10 @@ public void closeElement(String element, HashMap attributes, content = content.trim(); if (element.equals("ignitionevent")) { - - for (IgnitionEvent e : IgnitionEvent.values()) { - if (e.name().toLowerCase(Locale.ENGLISH).replaceAll("_", "").equals(content)) { - ignitionEvent = e; + + for (IgnitionEvent ie : IgnitionEvent.values()) { + if (ie.equals(content)) { + ignitionEvent = ie; break; } } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/MotorConfigurationHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/MotorConfigurationHandler.java index 43d08626d5..5aaa42cc33 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/MotorConfigurationHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/MotorConfigurationHandler.java @@ -2,16 +2,18 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; -import org.xml.sax.SAXException; - class MotorConfigurationHandler extends AbstractElementHandler { @SuppressWarnings("unused") private final DocumentLoadingContext context; @@ -47,23 +49,20 @@ public void closeElement(String element, HashMap attributes, public void endHandler(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { - String configid = attributes.remove("configid"); - if (configid == null || configid.equals("")) { + FlightConfigurationId fcid = new FlightConfigurationId(attributes.remove("configid")); + if (!fcid.isValid()) { warnings.add(Warning.FILE_INVALID_PARAMETER); return; } - if (!rocket.addMotorConfigurationID(configid)) { - warnings.add("Duplicate motor configuration ID used."); - return; - } + rocket.createFlightConfiguration(fcid); if (name != null && name.trim().length() > 0) { - rocket.setFlightConfigurationName(configid, name); + rocket.getFlightConfiguration(fcid).setName(name); } if ("true".equals(attributes.remove("default"))) { - rocket.getDefaultConfiguration().setFlightConfigurationID(configid); + rocket.setSelectedConfiguration( fcid); } super.closeElement(element, attributes, content, warnings); diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/MotorHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/MotorHandler.java index dccd1fb894..e11247c3eb 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/MotorHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/MotorHandler.java @@ -51,7 +51,7 @@ public Motor getMotor(WarningSet warnings) { public double getDelay(WarningSet warnings) { if (Double.isNaN(delay)) { warnings.add(Warning.fromString("Motor delay not specified, assuming no ejection charge.")); - return Motor.PLUGGED; + return Motor.PLUGGED_DELAY; } return delay; } @@ -124,7 +124,7 @@ public void closeElement(String element, HashMap attributes, // Delay delay = Double.NaN; if (content.equals("none")) { - delay = Motor.PLUGGED; + delay = Motor.PLUGGED_DELAY; } else { try { delay = Double.parseDouble(content.trim()); diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/MotorMountHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/MotorMountHandler.java index e723edab11..93b51fd085 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/MotorMountHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/MotorMountHandler.java @@ -1,7 +1,8 @@ package net.sf.openrocket.file.openrocket.importt; import java.util.HashMap; -import java.util.Locale; + +import org.xml.sax.SAXException; import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; @@ -9,11 +10,13 @@ import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; +import net.sf.openrocket.motor.IgnitionEvent; +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; - -import org.xml.sax.SAXException; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; class MotorMountHandler extends AbstractElementHandler { private final DocumentLoadingContext context; @@ -37,7 +40,7 @@ public ElementHandler openElement(String element, HashMap attrib } if (element.equals("ignitionconfiguration")) { - ignitionConfigHandler = new IgnitionConfigurationHandler(context); + ignitionConfigHandler = new IgnitionConfigurationHandler( context); return ignitionConfigHandler; } @@ -56,39 +59,47 @@ public ElementHandler openElement(String element, HashMap attrib @Override public void closeElement(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { + + // DEBUG ONLY + // System.err.println("closing MotorMount element: "+ element); if (element.equals("motor")) { - String id = attributes.get("configid"); - if (id == null || id.equals("")) { + FlightConfigurationId fcid = new FlightConfigurationId(attributes.get("configid")); + if (!fcid.isValid()) { warnings.add(Warning.fromString("Illegal motor specification, ignoring.")); return; } + Motor motor = motorHandler.getMotor(warnings); + MotorConfiguration motorConfig = new MotorConfiguration( mount, fcid, mount.getDefaultMotorConfig()); + motorConfig.setMotor(motor); + motorConfig.setEjectionDelay(motorHandler.getDelay(warnings)); - MotorConfiguration config = new MotorConfiguration(); - config.setMotor(motorHandler.getMotor(warnings)); - config.setEjectionDelay(motorHandler.getDelay(warnings)); - mount.getMotorConfiguration().set(id, config); - + mount.setMotorConfig( motorConfig, fcid); + + Rocket rkt = ((RocketComponent)mount).getRocket(); + rkt.createFlightConfiguration(fcid); + rkt.getFlightConfiguration(fcid).addMotor(motorConfig); return; } if (element.equals("ignitionconfiguration")) { - String id = attributes.get("configid"); - if (id == null || id.equals("")) { + FlightConfigurationId fcid = new FlightConfigurationId(attributes.get("configid")); + if ( ! fcid.isValid()){ warnings.add(Warning.fromString("Illegal motor specification, ignoring.")); return; } - IgnitionConfiguration def = mount.getIgnitionConfiguration().getDefault(); - mount.getIgnitionConfiguration().set(id, ignitionConfigHandler.getConfiguration(def)); + MotorConfiguration inst = mount.getMotorConfig(fcid); + inst.setIgnitionDelay(ignitionConfigHandler.ignitionDelay); + inst.setIgnitionEvent(ignitionConfigHandler.ignitionEvent); return; } if (element.equals("ignitionevent")) { - IgnitionConfiguration.IgnitionEvent event = null; - for (IgnitionConfiguration.IgnitionEvent e : IgnitionConfiguration.IgnitionEvent.values()) { - if (e.name().toLowerCase(Locale.ENGLISH).replaceAll("_", "").equals(content)) { - event = e; + IgnitionEvent event = null; + for (IgnitionEvent ie : IgnitionEvent.values()) { + if (ie.equals(content)) { + event = ie; break; } } @@ -96,7 +107,9 @@ public void closeElement(String element, HashMap attributes, warnings.add(Warning.fromString("Unknown ignition event type '" + content + "', ignoring.")); return; } - mount.getIgnitionConfiguration().getDefault().setIgnitionEvent(event); + + mount.getDefaultMotorConfig().setIgnitionEvent(event); + return; } @@ -108,7 +121,8 @@ public void closeElement(String element, HashMap attributes, warnings.add(Warning.fromString("Illegal ignition delay specified, ignoring.")); return; } - mount.getIgnitionConfiguration().getDefault().setIgnitionDelay(d); + + mount.getDefaultMotorConfig().setIgnitionDelay(d); return; } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketHandler.java index ccc6329c90..a7a2839c60 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketHandler.java @@ -4,6 +4,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.document.OpenRocketDocument; @@ -11,8 +15,6 @@ import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; -import org.xml.sax.SAXException; - /** * The starting point of the handlers. Accepts a single element and hands * the contents to be read by a OpenRocketContentsHandler. @@ -21,6 +23,8 @@ class OpenRocketHandler extends AbstractElementHandler { private final DocumentLoadingContext context; private OpenRocketContentHandler handler = null; + private static final Logger log = LoggerFactory.getLogger(OpenRocketHandler.class); + public OpenRocketHandler(DocumentLoadingContext context) { this.context = context; } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java b/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java index 8bfba9ae7f..7662c80ade 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/OpenRocketLoader.java @@ -53,7 +53,7 @@ public void loadFromStream(DocumentLoadingContext context, InputStream source) t throw new RocketLoadException("Malformed XML in input.", e); } - doc.getDefaultConfiguration().setAllStages(); + doc.getSelectedConfiguration().setAllStages(); // Deduce suitable time skip double timeSkip = StorageOptions.SIMULATION_DATA_NONE; diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/PositionSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/PositionSetter.java deleted file mode 100644 index ad29d1e35f..0000000000 --- a/core/src/net/sf/openrocket/file/openrocket/importt/PositionSetter.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.sf.openrocket.file.openrocket.importt; - -import java.util.HashMap; - -import net.sf.openrocket.aerodynamics.Warning; -import net.sf.openrocket.aerodynamics.WarningSet; -import net.sf.openrocket.rocketcomponent.FinSet; -import net.sf.openrocket.rocketcomponent.InternalComponent; -import net.sf.openrocket.rocketcomponent.LaunchLug; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.RocketComponent.Position; -import net.sf.openrocket.rocketcomponent.TubeFinSet; - -class PositionSetter implements Setter { - - @Override - public void set(RocketComponent c, String value, HashMap attributes, - WarningSet warnings) { - - RocketComponent.Position type = (Position) DocumentConfig.findEnum(attributes.get("type"), - RocketComponent.Position.class); - if (type == null) { - warnings.add(Warning.FILE_INVALID_PARAMETER); - return; - } - - double pos; - try { - pos = Double.parseDouble(value); - } catch (NumberFormatException e) { - warnings.add(Warning.FILE_INVALID_PARAMETER); - return; - } - - if (c instanceof FinSet) { - ((FinSet) c).setRelativePosition(type); - c.setPositionValue(pos); - } else if (c instanceof LaunchLug) { - ((LaunchLug) c).setRelativePosition(type); - c.setPositionValue(pos); - } else if (c instanceof InternalComponent) { - ((InternalComponent) c).setRelativePosition(type); - c.setPositionValue(pos); - } else if (c instanceof TubeFinSet) { - ((TubeFinSet) c).setRelativePosition(type); - c.setPositionValue(pos); - } else { - warnings.add(Warning.FILE_INVALID_PARAMETER); - } - - } -} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/RadiusPositionSetter.java b/core/src/net/sf/openrocket/file/openrocket/importt/RadiusPositionSetter.java new file mode 100644 index 0000000000..bd4f364042 --- /dev/null +++ b/core/src/net/sf/openrocket/file/openrocket/importt/RadiusPositionSetter.java @@ -0,0 +1,39 @@ +package net.sf.openrocket.file.openrocket.importt; + +import java.util.HashMap; + +import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusPositionable; + +class RadiusPositionSetter implements Setter { + + @Override + public void set(RocketComponent c, String value, HashMap attributes, + WarningSet warnings) { + + RadiusMethod method = (RadiusMethod) DocumentConfig.findEnum(attributes.get("method"), RadiusMethod.class); + if (method == null) { + method = RadiusMethod.SURFACE; + } + + + double offset; + try { + offset = Double.parseDouble(value); + } catch (NumberFormatException e) { + warnings.add(String.format("Warning: invalid value radius position. value=%s class: %s", value, c.getClass().getCanonicalName() )); + return; + } + + if ( RadiusPositionable.class.isAssignableFrom( c.getClass() ) ) { + RadiusPositionable rp = (RadiusPositionable)c; + rp.setRadiusMethod(method); + rp.setRadiusOffset(offset); + } else { + warnings.add("Warning: radiusPositionable is not valid for this class: "+c.getClass().getCanonicalName()); + } + + } +} diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java index 2094b0320d..27b72c8db5 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/SimulationConditionsHandler.java @@ -7,24 +7,26 @@ import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.util.GeodeticComputationStrategy; class SimulationConditionsHandler extends AbstractElementHandler { private final DocumentLoadingContext context; - private SimulationOptions conditions; + public FlightConfigurationId idToSet = FlightConfigurationId.ERROR_FCID; + private SimulationOptions options; private AtmosphereHandler atmosphereHandler; public SimulationConditionsHandler(Rocket rocket, DocumentLoadingContext context) { this.context = context; - conditions = new SimulationOptions(rocket); + options = new SimulationOptions(); // Set up default loading settings (which may differ from the new defaults) - conditions.setGeodeticComputation(GeodeticComputationStrategy.FLAT); + options.setGeodeticComputation(GeodeticComputationStrategy.FLAT); } public SimulationOptions getConditions() { - return conditions; + return options; } @Override @@ -49,74 +51,70 @@ public void closeElement(String element, HashMap attributes, if (element.equals("configid")) { - if (content.equals("")) { - conditions.setMotorConfigurationID(null); - } else { - conditions.setMotorConfigurationID(content); - } + this.idToSet= new FlightConfigurationId(content); } else if (element.equals("launchrodlength")) { if (Double.isNaN(d)) { warnings.add("Illegal launch rod length defined, ignoring."); } else { - conditions.setLaunchRodLength(d); + options.setLaunchRodLength(d); } } else if (element.equals("launchrodangle")) { if (Double.isNaN(d)) { warnings.add("Illegal launch rod angle defined, ignoring."); } else { - conditions.setLaunchRodAngle(d * Math.PI / 180); + options.setLaunchRodAngle(d * Math.PI / 180); } } else if (element.equals("launchroddirection")) { if (Double.isNaN(d)) { warnings.add("Illegal launch rod direction defined, ignoring."); } else { - conditions.setLaunchRodDirection(d * 2.0 * Math.PI / 360); + options.setLaunchRodDirection(d * 2.0 * Math.PI / 360); } } else if (element.equals("windaverage")) { if (Double.isNaN(d)) { warnings.add("Illegal average windspeed defined, ignoring."); } else { - conditions.setWindSpeedAverage(d); + options.setWindSpeedAverage(d); } } else if (element.equals("windturbulence")) { if (Double.isNaN(d)) { warnings.add("Illegal wind turbulence intensity defined, ignoring."); } else { - conditions.setWindTurbulenceIntensity(d); + options.setWindTurbulenceIntensity(d); } } else if (element.equals("launchaltitude")) { if (Double.isNaN(d)) { warnings.add("Illegal launch altitude defined, ignoring."); } else { - conditions.setLaunchAltitude(d); + options.setLaunchAltitude(d); } } else if (element.equals("launchlatitude")) { if (Double.isNaN(d)) { warnings.add("Illegal launch latitude defined, ignoring."); } else { - conditions.setLaunchLatitude(d); + options.setLaunchLatitude(d); } } else if (element.equals("launchlongitude")) { if (Double.isNaN(d)) { warnings.add("Illegal launch longitude."); } else { - conditions.setLaunchLongitude(d); + options.setLaunchLongitude(d); } } else if (element.equals("geodeticmethod")) { GeodeticComputationStrategy gcs = (GeodeticComputationStrategy) DocumentConfig.findEnum(content, GeodeticComputationStrategy.class); if (gcs != null) { - conditions.setGeodeticComputation(gcs); + options.setGeodeticComputation(gcs); } else { warnings.add("Unknown geodetic computation method '" + content + "'"); } } else if (element.equals("atmosphere")) { - atmosphereHandler.storeSettings(conditions, warnings); + atmosphereHandler.storeSettings(options, warnings); } else if (element.equals("timestep")) { if (Double.isNaN(d) || d <= 0) { warnings.add("Illegal time step defined, ignoring."); } else { - conditions.setTimeStep(d); + options.setTimeStep(d); } } } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/SingleSimulationHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/SingleSimulationHandler.java index a1d402ffb6..7834c285e8 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/SingleSimulationHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/SingleSimulationHandler.java @@ -13,6 +13,7 @@ import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.simulation.extension.SimulationExtension; @@ -115,12 +116,14 @@ public void endHandler(String element, HashMap attributes, status = Simulation.Status.OUTDATED; } - SimulationOptions conditions; + SimulationOptions options; + FlightConfigurationId idToSet= FlightConfigurationId.ERROR_FCID; if (conditionHandler != null) { - conditions = conditionHandler.getConditions(); + options = conditionHandler.getConditions(); + idToSet = conditionHandler.idToSet; } else { warnings.add("Simulation conditions not defined, using defaults."); - conditions = new SimulationOptions(doc.getRocket()); + options = new SimulationOptions(); } if (name == null) @@ -133,7 +136,8 @@ public void endHandler(String element, HashMap attributes, data = dataHandler.getFlightData(); Simulation simulation = new Simulation(doc.getRocket(), status, name, - conditions, extensions, data); + options, extensions, data); + simulation.setFlightConfigurationId( idToSet ); doc.addSimulation(simulation); } diff --git a/core/src/net/sf/openrocket/file/openrocket/importt/StageSeparationConfigurationHandler.java b/core/src/net/sf/openrocket/file/openrocket/importt/StageSeparationConfigurationHandler.java index a349c91df8..f17753b397 100644 --- a/core/src/net/sf/openrocket/file/openrocket/importt/StageSeparationConfigurationHandler.java +++ b/core/src/net/sf/openrocket/file/openrocket/importt/StageSeparationConfigurationHandler.java @@ -2,25 +2,26 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.simplesax.AbstractElementHandler; import net.sf.openrocket.file.simplesax.ElementHandler; import net.sf.openrocket.file.simplesax.PlainTextHandler; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration.SeparationEvent; -import org.xml.sax.SAXException; - class StageSeparationConfigurationHandler extends AbstractElementHandler { - private final Stage stage; + private final AxialStage stage; private SeparationEvent event = null; private double delay = Double.NaN; - public StageSeparationConfigurationHandler(Stage stage, DocumentLoadingContext context) { + public StageSeparationConfigurationHandler(AxialStage stage, DocumentLoadingContext context) { this.stage = stage; } @@ -66,9 +67,11 @@ public void closeElement(String element, HashMap attributes, Str @Override public void endHandler(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { - String configId = attributes.get("configid"); - StageSeparationConfiguration def = stage.getStageSeparationConfiguration().getDefault(); - stage.getStageSeparationConfiguration().set(configId, getConfiguration(def)); + FlightConfigurationId fcid = new FlightConfigurationId(attributes.get("configid")); + StageSeparationConfiguration sepConfig = stage.getSeparationConfigurations().get(fcid); + + // copy and update to the file-read values + stage.getSeparationConfigurations().set(fcid, getConfiguration(sepConfig)); } } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/AxialStageSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/AxialStageSaver.java new file mode 100644 index 0000000000..a81cc9ac8a --- /dev/null +++ b/core/src/net/sf/openrocket/file/openrocket/savers/AxialStageSaver.java @@ -0,0 +1,75 @@ +package net.sf.openrocket.file.openrocket.savers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; + +public class AxialStageSaver extends ComponentAssemblySaver { + + private static final AxialStageSaver instance = new AxialStageSaver(); + + public static ArrayList getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { + ArrayList list = new ArrayList(); + + if (c.isAfter()) { + // yes, this test is redundant. I'm merely paranoid, and attempting to future-proof it + if (c.getClass().equals(AxialStage.class)) { + // kept as simply 'stage' for backward compatability + list.add(""); + instance.addParams(c, list); + list.add(""); + } + } else { + if (c instanceof ParallelStage) { + list.add(""); + instance.addParams(c, list); + list.add(""); + } + } + + return list; + } + + @Override + protected void addParams(RocketComponent c, List elements) { + super.addParams(c, elements); + AxialStage stage = (AxialStage) c; + + if (stage.getStageNumber() > 0) { + // NOTE: Default config must be BEFORE overridden config for proper backward compatibility later on + elements.addAll(addSeparationConfigParams(stage.getSeparationConfigurations().getDefault(), false)); + + // Note - getFlightConfigurationIDs returns at least one element. The first element + for (FlightConfigurationId fcid: stage.getSeparationConfigurations().getIds() ){ + if (fcid == null) { + continue; + } + StageSeparationConfiguration curSepCfg = stage.getSeparationConfigurations().get(fcid); + +// if( stage.getSeparationConfigurations().isDefault( curSepCfg )){ +// continue; +// } + + elements.add(""); + elements.addAll(addSeparationConfigParams(curSepCfg, true)); + elements.add(""); + } + } + } + + private List addSeparationConfigParams(StageSeparationConfiguration config, boolean indent) { + List elements = new ArrayList(2); + elements.add((indent ? " " : "") + "" + + config.getSeparationEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + + ""); + elements.add((indent ? " " : "") + "" + config.getSeparationDelay() + ""); + return elements; + + } +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java index 9e9d609d68..db5a1fcd2d 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/ComponentAssemblySaver.java @@ -1,7 +1,31 @@ package net.sf.openrocket.file.openrocket.savers; -public class ComponentAssemblySaver extends RocketComponentSaver { +import java.util.ArrayList; + +import net.sf.openrocket.rocketcomponent.PodSet; - // No-op +public class ComponentAssemblySaver extends RocketComponentSaver { + + + private static final ComponentAssemblySaver instance = new ComponentAssemblySaver(); + + public static ArrayList getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { + ArrayList list = new ArrayList(); + + if (!c.isAfter()) { + if (c instanceof PodSet) { + list.add(""); + instance.addParams(c, list); + list.add(""); + } +// else if (c instanceof ParallelStage) { +// list.add(""); +// instance.addParams(c, list); +// list.add(""); +// } + } + + return list; + } -} +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java index 30e321f404..c7d5ded184 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/FinSetSaver.java @@ -12,8 +12,11 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li super.addParams(c, elements); net.sf.openrocket.rocketcomponent.FinSet fins = (net.sf.openrocket.rocketcomponent.FinSet) c; - elements.add("" + fins.getFinCount() + ""); - elements.add("" + (fins.getBaseRotation() * 180.0 / Math.PI) + ""); + + // // this information is already saved as 'RingInstanceable' in RocktComponent + // elements.add("" + fins.getFinCount() + ""); + // elements.add("" + (fins.getBaseRotation() * 180.0 / Math.PI) + ""); + elements.add("" + fins.getThickness() + ""); elements.add("" + fins.getCrossSection().name().toLowerCase(Locale.ENGLISH) + ""); @@ -26,8 +29,8 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li elements.add("" + fins.getTabHeight() + ""); elements.add("" + fins.getTabLength() + ""); elements.add("" + - fins.getTabShift() + ""); + fins.getTabOffsetMethod().name().toLowerCase(Locale.ENGLISH) + "\">" + + fins.getTabOffset() + ""); } diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/FuelTankSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/FuelTankSaver.java new file mode 100644 index 0000000000..9e6601706f --- /dev/null +++ b/core/src/net/sf/openrocket/file/openrocket/savers/FuelTankSaver.java @@ -0,0 +1,40 @@ +package net.sf.openrocket.file.openrocket.savers; + +import java.util.List; +import java.util.ArrayList; +import java.util.Locale; + +import net.sf.openrocket.rocketcomponent.FuelTank; + +public class FuelTankSaver extends MassObjectSaver { + + @Override + protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, + List elements) { + super.addParams(c, elements); + + FuelTank fuel = (FuelTank) c; + + elements.add("" + fuel.getMass() + ""); + elements.add("" + fuel.getFuelQty() + ""); + //elements.add("" + fuel.getInitialFuelQty() + ""); + elements.add("" + fuel.getBurnRate() + ""); + elements.add("" + fuel.getFuelType().name().toLowerCase(Locale.ENGLISH) + ""); + + + } + + private static final FuelTankSaver instance = new FuelTankSaver(); + + public static List getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { + List list = new ArrayList(); + + list.add(""); + instance.addParams(c, list); + list.add(""); + + return list; + } + +} + diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/LaunchLugSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/LaunchLugSaver.java index 1598bc412e..62936b2314 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/LaunchLugSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/LaunchLugSaver.java @@ -1,10 +1,10 @@ package net.sf.openrocket.file.openrocket.savers; -import net.sf.openrocket.rocketcomponent.LaunchLug; - import java.util.ArrayList; import java.util.List; +import net.sf.openrocket.rocketcomponent.LaunchLug; + public class LaunchLugSaver extends ExternalComponentSaver { @@ -28,7 +28,7 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li elements.add("" + lug.getOuterRadius() + ""); elements.add("" + lug.getLength() + ""); elements.add("" + lug.getThickness() + ""); - elements.add("" + (lug.getRadialDirection()*180.0/Math.PI) + ""); + elements.add("" + (lug.getAngularOffset()*180.0/Math.PI)+ ""); } diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RailButtonSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RailButtonSaver.java new file mode 100644 index 0000000000..74a9c06389 --- /dev/null +++ b/core/src/net/sf/openrocket/file/openrocket/savers/RailButtonSaver.java @@ -0,0 +1,34 @@ +package net.sf.openrocket.file.openrocket.savers; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.openrocket.rocketcomponent.RailButton; + + +public class RailButtonSaver extends ExternalComponentSaver { + + private static final RailButtonSaver instance = new RailButtonSaver(); + + public static List getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { + List list = new ArrayList(); + + list.add(""); + instance.addParams(c, list); + list.add(""); + + return list; + } + + @Override + protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List elements) { + super.addParams(c, elements); + RailButton rb = (RailButton) c; + + emitDouble( elements, "outerdiameter", rb.getOuterDiameter()); + emitDouble( elements, "height", rb.getTotalHeight()); + + } + + +} diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RecoveryDeviceSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RecoveryDeviceSaver.java index e4f06442d4..28a8f4d34d 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/RecoveryDeviceSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/RecoveryDeviceSaver.java @@ -5,8 +5,9 @@ import java.util.Locale; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameterSet; import net.sf.openrocket.rocketcomponent.RecoveryDevice; -import net.sf.openrocket.rocketcomponent.Rocket; public class RecoveryDeviceSaver extends MassObjectSaver { @@ -24,31 +25,24 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li elements.add(materialParam(dev.getMaterial())); // NOTE: Default config must be BEFORE overridden config for proper backward compatibility later on - DeploymentConfiguration defaultConfig = dev.getDeploymentConfiguration().getDefault(); - elements.addAll(deploymentConfiguration(defaultConfig, false)); + FlightConfigurableParameterSet configSet = dev.getDeploymentConfigurations(); + DeploymentConfiguration defaultConfig = configSet.getDefault(); + elements.addAll(addDeploymentConfigurationParams(defaultConfig, false)); - Rocket rocket = c.getRocket(); - // Note - getFlightConfigurationIDs returns at least one element. The first element - // is null and means "default". - String[] configs = rocket.getFlightConfigurationIDs(); - if (configs.length > 1) { - - for (String id : configs) { - if (id == null) { - continue; - } - if (dev.getDeploymentConfiguration().isDefault(id)) { - continue; - } - DeploymentConfiguration config = dev.getDeploymentConfiguration().get(id); - elements.add(""); - elements.addAll(deploymentConfiguration(config, true)); + for (FlightConfigurationId fcid : configSet.getIds()) { + if (dev.getDeploymentConfigurations().isDefault(fcid)) { + continue; + }else{ + // only print configurations which override the default. + DeploymentConfiguration deployConfig = dev.getDeploymentConfigurations().get(fcid); + elements.add(""); + elements.addAll(addDeploymentConfigurationParams(deployConfig, true)); elements.add(""); } } } - private List deploymentConfiguration(DeploymentConfiguration config, boolean indent) { + private List addDeploymentConfigurationParams(DeploymentConfiguration config, boolean indent) { List elements = new ArrayList(3); elements.add((indent ? " " : "") + "" + config.getDeployEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + ""); elements.add((indent ? " " : "") + "" + config.getDeployAltitude() + ""); diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java index 3efe9f228f..32d8539b06 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/RocketComponentSaver.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.Map; import net.sf.openrocket.appearance.Appearance; import net.sf.openrocket.appearance.Decal; @@ -11,14 +12,20 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.rocketcomponent.Clusterable; import net.sf.openrocket.rocketcomponent.ComponentAssembly; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.Instanceable; +import net.sf.openrocket.rocketcomponent.LineInstanceable; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AnglePositionable; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusPositionable; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Color; @@ -78,15 +85,43 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li } } + if ( c instanceof Instanceable) { + int instanceCount = c.getInstanceCount(); + + if( c instanceof Clusterable ){ + ; // no-op. Instance counts are set via named cluster configurations + }else if( 1 < instanceCount ) { + emitInteger( elements, "instancecount", c.getInstanceCount() ); + } + + if( c instanceof LineInstanceable ){ + LineInstanceable line = (LineInstanceable)c; + emitDouble( elements, "instanceseparation", line.getInstanceSeparation()); + } + if( c instanceof RadiusPositionable ){ + final RadiusPositionable radPos = (RadiusPositionable)c; + // The type names are currently equivalent to the enum names except for case. + final String radiusMethod = radPos.getRadiusMethod().name().toLowerCase(Locale.ENGLISH); + final double radiusOffset = radPos.getRadiusOffset(); + elements.add("" + radiusOffset + ""); + } + if( c instanceof AnglePositionable ) { + final AnglePositionable anglePos= (AnglePositionable)c; + // The type names are currently equivalent to the enum names except for case. + final String angleMethod = anglePos.getAngleMethod().name().toLowerCase(Locale.ENGLISH); + final double angleOffset = anglePos.getAngleOffset()*180.0/Math.PI ; + elements.add("" + angleOffset + ""); + + } + } // Save position unless "AFTER" - if (c.getRelativePosition() != RocketComponent.Position.AFTER) { + if (c.getAxialMethod() != AxialMethod.AFTER) { // The type names are currently equivalent to the enum names except for case. - String type = c.getRelativePosition().name().toLowerCase(Locale.ENGLISH); - elements.add("" + c.getPositionValue() + ""); + String axialMethod = c.getAxialMethod().name().toLowerCase(Locale.ENGLISH); + elements.add("" + c.getAxialOffset() + ""); } - // Overrides boolean overridden = false; if (c.isMassOverridden()) { @@ -97,6 +132,10 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li elements.add("" + c.getOverrideCGX() + ""); overridden = true; } + if (c.isCDOverridden()) { + elements.add("" + c.getOverrideCD() + ""); + overridden = true; + } if (overridden) { elements.add("" + c.getOverrideSubcomponents() + ""); @@ -144,26 +183,34 @@ protected final String materialParam(String tag, Material mat) { protected final List motorMountParams(MotorMount mount) { if (!mount.isMotorMount()) return Collections.emptyList(); - String[] motorConfigIDs = ((RocketComponent) mount).getRocket().getFlightConfigurationIDs(); + + Rocket rkt = ((RocketComponent) mount).getRocket(); + //FlightConfigurationID[] motorConfigIDs = ((RocketComponent) mount).getRocket().getFlightConfigurationIDs(); + //ParameterSet configs = ((RocketComponent) mount).getRocket().getConfigurationSet(); + List elements = new ArrayList(); + MotorConfiguration defaultInstance = mount.getDefaultMotorConfig(); + elements.add(""); // NOTE: Default config must be BEFORE overridden config for proper backward compatibility later on elements.add(" " - + mount.getIgnitionConfiguration().getDefault().getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + + defaultInstance.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + ""); - elements.add(" " + mount.getIgnitionConfiguration().getDefault().getIgnitionDelay() + ""); + elements.add(" " + defaultInstance.getIgnitionDelay() + ""); elements.add(" " + mount.getMotorOverhang() + ""); - for (String id : motorConfigIDs) { - MotorConfiguration motorConfig = mount.getMotorConfiguration().get(id); - Motor motor = motorConfig.getMotor(); + for( FlightConfigurationId fcid : rkt.getIds()){ + + MotorConfiguration motorInstance = mount.getMotorConfig(fcid); // Nothing is stored if no motor loaded - if (motor == null) + if( motorInstance.isEmpty()){ continue; + } + Motor motor = motorInstance.getMotor(); - elements.add(" "); + elements.add(" "); if (motor.getMotorType() != Motor.Type.UNKNOWN) { elements.add(" " + motor.getMotorType().name().toLowerCase(Locale.ENGLISH) + ""); } @@ -178,19 +225,19 @@ protected final List motorMountParams(MotorMount mount) { elements.add(" " + motor.getLength() + ""); // Motor delay - if (motorConfig.getEjectionDelay() == Motor.PLUGGED) { + if (motorInstance.getEjectionDelay() == Motor.PLUGGED_DELAY) { elements.add(" none"); } else { - elements.add(" " + motorConfig.getEjectionDelay() + ""); + elements.add(" " + motorInstance.getEjectionDelay() + ""); } elements.add(" "); - if (!mount.getIgnitionConfiguration().isDefault(id)) { - IgnitionConfiguration ignition = mount.getIgnitionConfiguration().get(id); - elements.add(" "); - elements.add(" " + ignition.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + ""); - elements.add(" " + ignition.getIgnitionDelay() + ""); + // i.e. if this has overridden parameters.... + if( ! motorInstance.equals( defaultInstance)){ + elements.add(" "); + elements.add(" " + motorInstance.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") + ""); + elements.add(" " + motorInstance.getIgnitionDelay() + ""); elements.add(" "); } @@ -204,9 +251,37 @@ protected final List motorMountParams(MotorMount mount) { private final static void emitColor(String elementName, List elements, Color color) { if (color != null) { elements.add("<" + elementName + " red=\"" + color.getRed() + "\" green=\"" + color.getGreen() - + "\" blue=\"" + color.getBlue() + "\"/>"); + + "\" blue=\"" + color.getBlue() + "\" alpha=\"" + color.getAlpha() + "\"/>"); } } + protected static void emitDouble( final List elements, final String enclosingTag, final double value){ + appendElement( elements, enclosingTag, enclosingTag, Double.toString( value )); + } + + protected static void emitInteger( final List elements, final String enclosingTag, final int value){ + appendElement( elements, enclosingTag, enclosingTag, Integer.toString( value ) ); + } + + protected static void emitString( final List elements, final String enclosingTag, final String value){ + appendElement( elements, enclosingTag, enclosingTag, value ); + } + + protected static String generateOpenTag( final Map attrs, final String enclosingTag ){ + StringBuffer buf = new StringBuffer(); + if( null == attrs ) { + return enclosingTag; + } + + for (Map.Entry entry : attrs.entrySet()) { + buf.append(String.format(" %s=\"%s\"", entry.getKey(), entry.getValue() )); + } + return buf.toString(); + } + + protected static void appendElement( final List elements, final String openTag, final String closeTag, final String elementValue ){ + elements.add("<"+openTag+">" + elementValue + ""); + } + } diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/RocketSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/RocketSaver.java index 59af2484b5..d2630b6c7c 100644 --- a/core/src/net/sf/openrocket/file/openrocket/savers/RocketSaver.java +++ b/core/src/net/sf/openrocket/file/openrocket/savers/RocketSaver.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Locale; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.ReferenceType; import net.sf.openrocket.rocketcomponent.Rocket; @@ -39,23 +41,26 @@ protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, Li } - // Motor configurations - String defId = rocket.getDefaultConfiguration().getFlightConfigurationID(); - for (String id : rocket.getFlightConfigurationIDs()) { - if (id == null) + // Flight configurations + for (FlightConfigurationId fcid : rocket.getIds()) { + FlightConfiguration flightConfig = rocket.getFlightConfiguration(fcid); + if (fcid == null) continue; - String str = ""; + } else { + str += "/>"; } + elements.add(str); } diff --git a/core/src/net/sf/openrocket/file/openrocket/savers/StageSaver.java b/core/src/net/sf/openrocket/file/openrocket/savers/StageSaver.java deleted file mode 100644 index fb875379f8..0000000000 --- a/core/src/net/sf/openrocket/file/openrocket/savers/StageSaver.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.sf.openrocket.file.openrocket.savers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; -import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; - -public class StageSaver extends ComponentAssemblySaver { - - private static final StageSaver instance = new StageSaver(); - - public static ArrayList getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) { - ArrayList list = new ArrayList(); - - list.add(""); - instance.addParams(c, list); - list.add(""); - - return list; - } - - @Override - protected void addParams(RocketComponent c, List elements) { - super.addParams(c, elements); - Stage stage = (Stage) c; - - if (stage.getStageNumber() > 0) { - // NOTE: Default config must be BEFORE overridden config for proper backward compatibility later on - elements.addAll(separationConfig(stage.getStageSeparationConfiguration().getDefault(), false)); - - Rocket rocket = stage.getRocket(); - // Note - getFlightConfigurationIDs returns at least one element. The first element - // is null and means "default". - String[] configs = rocket.getFlightConfigurationIDs(); - if (configs.length > 1) { - - for (String id : configs) { - if (id == null) { - continue; - } - if (stage.getStageSeparationConfiguration().isDefault(id)) { - continue; - } - StageSeparationConfiguration config = stage.getStageSeparationConfiguration().get(id); - elements.add(""); - elements.addAll(separationConfig(config, true)); - elements.add(""); - } - } - } - } - - private List separationConfig(StageSeparationConfiguration config, boolean indent) { - List elements = new ArrayList(2); - elements.add((indent ? " " : "") + "" - + config.getSeparationEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "") - + ""); - elements.add((indent ? " " : "") + "" + config.getSeparationDelay() + ""); - return elements; - - } -} diff --git a/core/src/net/sf/openrocket/file/rocksim/RocksimLocationMode.java b/core/src/net/sf/openrocket/file/rocksim/RocksimLocationMode.java index e16c97e1b8..10b2818b2b 100644 --- a/core/src/net/sf/openrocket/file/rocksim/RocksimLocationMode.java +++ b/core/src/net/sf/openrocket/file/rocksim/RocksimLocationMode.java @@ -3,21 +3,21 @@ */ package net.sf.openrocket.file.rocksim; -import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; /** * Models the relative position of parts on a rocket. Maps from Rocksim's notion to OpenRocket's. */ public enum RocksimLocationMode { - FRONT_OF_OWNING_PART (0, RocketComponent.Position.TOP), - FROM_TIP_OF_NOSE (1, RocketComponent.Position.ABSOLUTE), - BACK_OF_OWNING_PART (2, RocketComponent.Position.BOTTOM); + FRONT_OF_OWNING_PART (0, AxialMethod.TOP), + FROM_TIP_OF_NOSE (1, AxialMethod.ABSOLUTE), + BACK_OF_OWNING_PART (2, AxialMethod.BOTTOM); /** The value Rocksim uses internally (and in the XML file). */ private final int ordinal; /** The OpenRocket position equivalent. */ - private final RocketComponent.Position position; + private final AxialMethod position; /** * Constructor. @@ -25,7 +25,7 @@ public enum RocksimLocationMode { * @param idx the rocksim enum value * @param theOpenRocketPosition the corresponding OpenRocket position */ - RocksimLocationMode(int idx, RocketComponent.Position theOpenRocketPosition) { + RocksimLocationMode(int idx, AxialMethod theOpenRocketPosition) { ordinal = idx; position = theOpenRocketPosition; } @@ -35,7 +35,7 @@ public enum RocksimLocationMode { * * @return the position instance */ - public RocketComponent.Position asOpenRocket() { + public AxialMethod asOpenRocket() { return position; } @@ -56,14 +56,14 @@ public static RocksimLocationMode fromCode(int rocksimCode) { return FRONT_OF_OWNING_PART; } - public static int toCode(RocketComponent.Position position) { - if (RocketComponent.Position.TOP.equals(position)) { + public static int toCode(AxialMethod position) { + if (AxialMethod.TOP.equals(position)) { return 0; } - if (RocketComponent.Position.ABSOLUTE.equals(position)) { + if (AxialMethod.ABSOLUTE.equals(position)) { return 1; } - if (RocketComponent.Position.BOTTOM.equals(position)) { + if (AxialMethod.BOTTOM.equals(position)) { return 2; } return 0; diff --git a/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java index fe6fc89910..45f7e89899 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/BasePartDTO.java @@ -1,5 +1,10 @@ package net.sf.openrocket.file.rocksim.export; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.rocksim.RocksimDensityType; import net.sf.openrocket.file.rocksim.RocksimFinishCode; @@ -11,11 +16,7 @@ import net.sf.openrocket.rocketcomponent.RingComponent; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.StructuralComponent; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; /** * The base class for all OpenRocket to Rocksim conversions. @@ -88,22 +89,22 @@ protected BasePartDTO(RocketComponent ec) { setUseKnownCG(ec.isCGOverridden() || ec.isMassOverridden() ? 1 : 0); setName(ec.getName()); - setXb(ec.getPositionValue() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); + setXb(ec.getAxialOffset() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); //When the relative position is BOTTOM, the position location of the bottom edge of the component is + //to the right of the bottom of the parent, and - to the left. //But in Rocksim, it's + to the left and - to the right - if (ec.getRelativePosition().equals(RocketComponent.Position.BOTTOM)) { - setXb((-1 * ec.getPositionValue()) * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); + if (ec.getAxialMethod().equals(AxialMethod.BOTTOM)) { + setXb((-1 * ec.getAxialOffset()) * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); } - else if (ec.getRelativePosition().equals(RocketComponent.Position.MIDDLE)) { + else if (ec.getAxialMethod().equals(AxialMethod.MIDDLE)) { //Mapped to TOP, so adjust accordingly - setXb((ec.getPositionValue() + (ec.getParent().getLength() - ec.getLength()) /2)* RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); + setXb((ec.getAxialOffset() + (ec.getParent().getLength() - ec.getLength()) /2)* RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); } if (ec instanceof ExternalComponent) { ExternalComponent comp = (ExternalComponent) ec; - setLocationMode(RocksimLocationMode.toCode(comp.getRelativePosition())); + setLocationMode(RocksimLocationMode.toCode(comp.getAxialMethod())); setDensity(comp.getMaterial().getDensity() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_BULK_DENSITY); setDensityType(RocksimDensityType.toCode(comp.getMaterial().getType())); @@ -118,7 +119,7 @@ else if (ec.getRelativePosition().equals(RocketComponent.Position.MIDDLE)) { else if (ec instanceof StructuralComponent) { StructuralComponent comp = (StructuralComponent) ec; - setLocationMode(RocksimLocationMode.toCode(comp.getRelativePosition())); + setLocationMode(RocksimLocationMode.toCode(comp.getAxialMethod())); setDensity(comp.getMaterial().getDensity() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_BULK_DENSITY); setDensityType(RocksimDensityType.toCode(comp.getMaterial().getType())); String compMaterial = comp.getMaterial().getName(); @@ -130,7 +131,7 @@ else if (ec instanceof StructuralComponent) { else if (ec instanceof RecoveryDevice) { RecoveryDevice comp = (RecoveryDevice) ec; - setLocationMode(RocksimLocationMode.toCode(comp.getRelativePosition())); + setLocationMode(RocksimLocationMode.toCode(comp.getAxialMethod())); setDensity(comp.getMaterial().getDensity() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_SURFACE_DENSITY); setDensityType(RocksimDensityType.toCode(comp.getMaterial().getType())); String compMaterial = comp.getMaterial().getName(); diff --git a/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java index 18c56f70eb..507f594325 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/BodyTubeDTO.java @@ -58,7 +58,7 @@ public class BodyTubeDTO extends BasePartDTO implements AttachableParts { @XmlElementRef(name = RocksimCommonConstants.STREAMER, type = StreamerDTO.class), @XmlElementRef(name = RocksimCommonConstants.PARACHUTE, type = ParachuteDTO.class), @XmlElementRef(name = RocksimCommonConstants.MASS_OBJECT, type = MassObjectDTO.class)}) - List attachedParts = new ArrayList(); + List attachedParts = new ArrayList(); /** * Constructor. @@ -96,7 +96,7 @@ protected BodyTubeDTO(BodyTube theORBodyTube) { final InnerTube innerTube = (InnerTube) rocketComponents; final InnerBodyTubeDTO innerBodyTubeDTO = new InnerBodyTubeDTO(innerTube, this); //Only add the inner tube if it is NOT a cluster. - if (innerTube.getClusterCount() == 1) { + if (innerTube.getInstanceCount() == 1) { attachedParts.add(innerBodyTubeDTO); } } else if (rocketComponents instanceof BodyTube) { diff --git a/core/src/net/sf/openrocket/file/rocksim/export/FinSetDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/FinSetDTO.java index 0879c3b78a..2f81c8ae70 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/FinSetDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/FinSetDTO.java @@ -64,7 +64,7 @@ public FinSetDTO(FinSet theORFinSet) { setCantAngle(theORFinSet.getCantAngle()); setTabDepth(theORFinSet.getTabHeight() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); setTabLength(theORFinSet.getTabLength() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); - setTabOffset(theORFinSet.getTabShift() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); + setTabOffset(theORFinSet.getTabOffset() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); setThickness(theORFinSet.getThickness() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH); setRadialAngle(theORFinSet.getBaseRotation()); diff --git a/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java index cf995a54dd..9c23081e63 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/InnerBodyTubeDTO.java @@ -62,7 +62,7 @@ public InnerBodyTubeDTO(InnerTube bt, AttachableParts parent) { //Only if the inner tube is NOT a cluster, then create the corresponding Rocksim DTO and add it //to the list of attached parts. If it is a cluster, then it is handled specially outside of this //loop. - if (innerTube.getClusterCount() == 1) { + if (innerTube.getInstanceCount() == 1) { attachedParts.add(new InnerBodyTubeDTO(innerTube, this)); } } else if (rocketComponents instanceof BodyTube) { @@ -104,8 +104,13 @@ public InnerBodyTubeDTO(InnerTube bt, AttachableParts parent) { */ private void handleCluster(InnerTube it, AttachableParts p) { - Coordinate[] coords = { Coordinate.NUL }; - coords = it.shiftCoordinates(coords); + // old version - Oct, 19 2015 + //Coordinate[] coords = { Coordinate.NUL }; + //coords = it.shiftCoordinates(coords); + + // new version + Coordinate[] coords = it.getLocations(); + for (int x = 0; x < coords.length; x++) { InnerTube partialClone = InnerTube.makeIndividualClusterComponent(coords[x], it.getName() + " #" + (x + 1), it); p.addAttachedPart(new InnerBodyTubeDTO(partialClone, p)); diff --git a/core/src/net/sf/openrocket/file/rocksim/export/LaunchLugDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/LaunchLugDTO.java index 4c287202be..dce7c255f7 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/LaunchLugDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/LaunchLugDTO.java @@ -1,13 +1,13 @@ package net.sf.openrocket.file.rocksim.export; -import net.sf.openrocket.file.rocksim.RocksimCommonConstants; -import net.sf.openrocket.rocketcomponent.LaunchLug; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import net.sf.openrocket.file.rocksim.RocksimCommonConstants; +import net.sf.openrocket.rocketcomponent.LaunchLug; + /** * This class models an XML element for a Rocksim LaunchLug. */ @@ -35,7 +35,7 @@ public LaunchLugDTO(LaunchLug theORLaunchLug) { super(theORLaunchLug); setId(theORLaunchLug.getInnerRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS); setOd(theORLaunchLug.getOuterRadius() * RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_RADIUS); - setRadialAngle(theORLaunchLug.getRadialDirection()); + setRadialAngle(theORLaunchLug.getAngularOffset()); } public double getOd() { diff --git a/core/src/net/sf/openrocket/file/rocksim/export/RocksimSaver.java b/core/src/net/sf/openrocket/file/rocksim/export/RocksimSaver.java index 60dfec83f0..175d7c246a 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/RocksimSaver.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/RocksimSaver.java @@ -9,18 +9,18 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.StorageOptions; import net.sf.openrocket.file.RocketSaver; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.masscalc.RigidBody; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.Stage; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This class is responsible for converting an OpenRocket design to a Rocksim design. @@ -93,12 +93,10 @@ private RocksimDesignDTO toRocksimDesignDTO(Rocket rocket) { private RocketDesignDTO toRocketDesignDTO(Rocket rocket) { RocketDesignDTO result = new RocketDesignDTO(); - MassCalculator massCalc = new BasicMassCalculator(); - - final Configuration configuration = new Configuration(rocket); - final double cg = massCalc.getCG(configuration, MassCalculator.MassCalcType.NO_MOTORS).x * - RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH; - configuration.release(); + final FlightConfiguration configuration = rocket.getEmptyConfiguration(); + final RigidBody spentData = MassCalculator.calculateStructure( configuration); + final double cg = spentData.cm.x *RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH; + int stageCount = rocket.getStageCount(); if (stageCount == 3) { result.setStage321CG(cg); @@ -125,7 +123,7 @@ private RocketDesignDTO toRocketDesignDTO(Rocket rocket) { return result; } - private StageDTO toStageDTO(Stage stage, RocketDesignDTO designDTO, int stageNumber) { + private StageDTO toStageDTO(AxialStage stage, RocketDesignDTO designDTO, int stageNumber) { return new StageDTO(stage, designDTO, stageNumber); } diff --git a/core/src/net/sf/openrocket/file/rocksim/export/StageDTO.java b/core/src/net/sf/openrocket/file/rocksim/export/StageDTO.java index e0303e7fc5..e6afdd3559 100644 --- a/core/src/net/sf/openrocket/file/rocksim/export/StageDTO.java +++ b/core/src/net/sf/openrocket/file/rocksim/export/StageDTO.java @@ -4,7 +4,7 @@ import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.util.ArrayList; @@ -40,7 +40,7 @@ public StageDTO() { * @param design the encompassing container DTO * @param stageNumber the stage number (3 is always at the top, even if it's the only one) */ - public StageDTO(Stage theORStage, RocketDesignDTO design, int stageNumber) { + public StageDTO(AxialStage theORStage, RocketDesignDTO design, int stageNumber) { if (stageNumber == 3) { if (theORStage.isMassOverridden()) { diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java index 5bf50a5139..eec02a8ecb 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/BaseHandler.java @@ -300,7 +300,7 @@ private static void setMaterial(RocketComponent component, Material material) { * * @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) { Method method = null; try { method = component.getClass().getMethod(name, args); diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/BodyTubeHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/BodyTubeHandler.java index 9d2eb38991..80874d249f 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/BodyTubeHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/BodyTubeHandler.java @@ -5,6 +5,8 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; @@ -15,8 +17,6 @@ import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.RocketComponent; -import org.xml.sax.SAXException; - /** * A SAX handler for Rocksim Body Tubes. */ @@ -100,6 +100,7 @@ public BodyTube getComponent() { * * @return BULK */ + @Override public Material.Type getMaterialType() { return Material.Type.BULK; } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java index 04ead9a452..f2f9d7f648 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/FinSetHandler.java @@ -8,6 +8,8 @@ import java.util.HashMap; import java.util.List; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; @@ -21,13 +23,11 @@ import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.FreeformFinSet; -import net.sf.openrocket.rocketcomponent.IllegalFinPointException; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.util.Coordinate; -import org.xml.sax.SAXException; - /** * A SAX handler for Rocksim fin sets. Because the type of fin may not be known first (in Rocksim file format, the fin * shape type is in the middle of the XML structure), and because we're using SAX not DOM, all of the fin @@ -55,7 +55,7 @@ class FinSetHandler extends AbstractElementHandler { /** * The OpenRocket Position which gives the absolute/relative positioning for location. */ - private RocketComponent.Position position; + private AxialMethod axialMethod; /** * The number of fins in this fin set. */ @@ -68,10 +68,13 @@ class FinSetHandler extends AbstractElementHandler { * The length of the tip chord. */ private double tipChord = 0.0d; + /** * The length of the mid-chord (aka height). */ + @SuppressWarnings("unused") // stored from file, but not used. private double midChordLen = 0.0d; + /** * The distance of the leading edge from root to top. */ @@ -180,7 +183,7 @@ public void closeElement(String element, HashMap attributes, Str location = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH; } if (RocksimCommonConstants.LOCATION_MODE.equals(element)) { - position = RocksimLocationMode.fromCode(Integer.parseInt(content)).asOpenRocket(); + axialMethod = RocksimLocationMode.fromCode(Integer.parseInt(content)).asOpenRocket(); } if (RocksimCommonConstants.FIN_COUNT.equals(element)) { finCount = Integer.parseInt(content); @@ -300,11 +303,8 @@ else if (shapeCode == 1) { else if (shapeCode == 2) { result = new FreeformFinSet(); - try { - ((FreeformFinSet) result).setPoints(toCoordinates(pointList, warnings)); - } catch (IllegalFinPointException e) { - warnings.add("Illegal fin point set. " + e.getMessage() + " Ignoring."); - } + ((FreeformFinSet) result).setPoints(toCoordinates(pointList, warnings)); + } else { return null; @@ -314,14 +314,15 @@ else if (shapeCode == 2) { result.setFinCount(finCount); result.setFinish(finish); //All TTW tabs in Rocksim are relative to the front of the fin. - result.setTabRelativePosition(FinSet.TabRelativePosition.FRONT); + result.setTabOffsetMethod( AxialMethod.TOP); result.setTabHeight(tabDepth); result.setTabLength(tabLength); - result.setTabShift(taboffset); + result.setTabOffset(taboffset); result.setBaseRotation(radialAngle); result.setCrossSection(convertTipShapeCode(tipShapeCode)); - result.setRelativePosition(position); - PositionDependentHandler.setLocation(result, position, location); + result.setAxialMethod(axialMethod); + result.setAxialOffset(location); + return result; } @@ -329,16 +330,16 @@ else if (shapeCode == 2) { /** * Convert a Rocksim string that represents fin plan points into an array of OpenRocket coordinates. * - * @param pointList a comma and pipe delimited string of X,Y coordinates from Rocksim. This is of the format: + * @param newPointList a comma and pipe delimited string of X,Y coordinates from Rocksim. This is of the format: *

x0,y0|x1,y1|x2,y2|... 
* @param warnings the warning set to convey incompatibilities to the user * * @return an array of OpenRocket Coordinates */ - private Coordinate[] toCoordinates(String pointList, WarningSet warnings) { + private Coordinate[] toCoordinates(String newPointList, WarningSet warnings) { List result = new ArrayList(); - if (pointList != null && pointList.length() > 0) { - String[] points = pointList.split("\\Q|\\E"); + if (newPointList != null && newPointList.length() > 0) { + String[] points = newPointList.split("\\Q|\\E"); for (String point : points) { String[] aPoint = point.split(","); try { diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandler.java index d6e0f2e98d..23b5d69bbe 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandler.java @@ -5,6 +5,8 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; @@ -14,8 +16,6 @@ import net.sf.openrocket.rocketcomponent.InnerTube; import net.sf.openrocket.rocketcomponent.RocketComponent; -import org.xml.sax.SAXException; - /** * A SAX handler for Rocksim inside tubes. */ @@ -98,17 +98,6 @@ public InnerTube getComponent() { return bodyTube; } - /** - * Set the relative position onto the component. This cannot be done directly because setRelativePosition is not - * public in all components. - * - * @param position the OpenRocket position - */ - @Override - public void setRelativePosition(RocketComponent.Position position) { - bodyTube.setRelativePosition(position); - } - /** * Get the required type of material for this component. * diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/LaunchLugHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/LaunchLugHandler.java index 1573d69d8d..9e6c0c5143 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/LaunchLugHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/LaunchLugHandler.java @@ -5,6 +5,8 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; @@ -15,8 +17,6 @@ import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.RocketComponent; -import org.xml.sax.SAXException; - /** * The SAX handler for Rocksim Launch Lugs. */ @@ -70,7 +70,7 @@ public void closeElement(String element, HashMap attributes, Str setMaterialName(content); } if (RocksimCommonConstants.RADIAL_ANGLE.equals(element)) { - lug.setRadialDirection(Double.parseDouble(content)); + lug.setAngularOffset(Double.parseDouble(content)); } if (RocksimCommonConstants.FINISH_CODE.equals(element)) { lug.setFinish(RocksimFinishCode.fromCode(Integer.parseInt(content)).asOpenRocket()); @@ -90,17 +90,6 @@ public LaunchLug getComponent() { return lug; } - /** - * Set the relative position onto the component. This cannot be done directly because setRelativePosition is not - * public in all components. - * - * @param position the OpenRocket position - */ - @Override - public void setRelativePosition(RocketComponent.Position position) { - lug.setRelativePosition(position); - } - /** * Get the required type of material for this component. * diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/MassObjectHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/MassObjectHandler.java index 33890dce3f..0668e81c60 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/MassObjectHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/MassObjectHandler.java @@ -183,16 +183,6 @@ public MassObject getComponent() { return current; } - /** - * Set the relative position onto the component. This cannot be done directly because setRelativePosition is not - * public in all components. - * - * @param position the OpenRocket position - */ - public void setRelativePosition(RocketComponent.Position position) { - current.setRelativePosition(position); - } - /** * Get the required type of material for this component. Does not apply to MassComponents, but does apply to Shock * Cords. diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/NoseConeHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/NoseConeHandler.java index a43e1c66a8..23cc2f6e40 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/NoseConeHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/NoseConeHandler.java @@ -127,8 +127,7 @@ public void endHandler(String element, HashMap attributes, Strin if (noseCone.isFilled()) { noseCone.setAftShoulderThickness(noseCone.getAftShoulderRadius()); - } - else { + } else { noseCone.setThickness(thickness); noseCone.setAftShoulderThickness(thickness); } @@ -149,6 +148,7 @@ public NoseCone getComponent() { * * @return BULK */ + @Override public Material.Type getMaterialType() { return Material.Type.BULK; } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/ParachuteHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/ParachuteHandler.java index eb2ec4564b..409e028145 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/ParachuteHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/ParachuteHandler.java @@ -117,6 +117,7 @@ else if (parent instanceof InnerTube) { * * @return a component */ + @Override public Parachute getComponent() { return chute; } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/PositionDependentHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/PositionDependentHandler.java index 2cf4a61304..560e79a67b 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/PositionDependentHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/PositionDependentHandler.java @@ -10,22 +10,23 @@ import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.rocksim.RocksimLocationMode; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import org.xml.sax.SAXException; /** - * An abstract base class that handles position dependencies for all lower level components that - * are position aware. + * An abstract base class that handles axialMethod dependencies for all lower level components that + * are axialMethod aware. * - * @param the specific position dependent RocketComponent subtype for which the concrete handler can create + * @param the specific axialMethod dependent RocketComponent subtype for which the concrete handler can create */ public abstract class PositionDependentHandler extends BaseHandler { - /** Temporary position value. */ + /** Temporary axialMethod value. */ private Double positionValue = 0d; - /** Temporary position. */ - private RocketComponent.Position position = RocketComponent.Position.TOP; + /** Temporary axialMethod. */ + private AxialMethod axialMethod = AxialMethod.TOP; public PositionDependentHandler(DocumentLoadingContext context) { super(context); @@ -42,15 +43,15 @@ public void closeElement(String element, HashMap attributes, Str positionValue = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH; } if (RocksimCommonConstants.LOCATION_MODE.equals(element)) { - position = RocksimLocationMode.fromCode(Integer.parseInt( + axialMethod = RocksimLocationMode.fromCode(Integer.parseInt( content)).asOpenRocket(); } } /** - * This method sets the position information onto the component. Rocksim splits the location/position + * This method sets the axialMethod information onto the component. Rocksim splits the location/axialMethod * information into two disparate data elements. Both pieces of data are necessary to map into OpenRocket's - * position model. + * axialMethod model. * * @param element the element name * @param attributes the attributes @@ -62,31 +63,18 @@ public void closeElement(String element, HashMap attributes, Str public void endHandler(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { super.endHandler(element, attributes, content, warnings); - setRelativePosition(position); - setLocation(getComponent(), position, positionValue); + setLocation(); } - - /** - * Set the relative position onto the component. This cannot be done directly because setRelativePosition is not - * public in all components. - * - * @param position the OpenRocket position - */ - protected abstract void setRelativePosition(RocketComponent.Position position); - + /** - * Set the position of a component. - * - * @param component the component - * @param position the relative position - * @param location the actual position value + * Set the axialMethod of a component. */ - public static void setLocation(RocketComponent component, RocketComponent.Position position, double location) { - if (position.equals(RocketComponent.Position.BOTTOM)) { - component.setPositionValue(-1d * location); - } - else { - component.setPositionValue(location); + protected void setLocation() { + getComponent().setAxialMethod(axialMethod); + if (axialMethod.equals(AxialMethod.BOTTOM)) { + getComponent().setAxialOffset(-1d * positionValue); + } else { + getComponent().setAxialOffset(positionValue); } } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/RecoveryDeviceHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/RecoveryDeviceHandler.java index b175cc4c78..9a677591fa 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/RecoveryDeviceHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/RecoveryDeviceHandler.java @@ -11,7 +11,6 @@ import net.sf.openrocket.file.rocksim.RocksimDensityType; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.RecoveryDevice; -import net.sf.openrocket.rocketcomponent.RocketComponent; import org.xml.sax.SAXException; @@ -66,6 +65,7 @@ public void closeElement(String element, HashMap attributes, Str * @param rawDensity the density as specified in the Rocksim design file * @return a value in OpenRocket SURFACE density units */ + @Override protected double computeDensity(RocksimDensityType type, double rawDensity) { double result; @@ -94,18 +94,7 @@ protected double computeDensity(RocksimDensityType type, double rawDensity) { } return result; } - - /** - * Set the relative position onto the component. This cannot be done directly because setRelativePosition is not - * public in all components. - * - * @param position the OpenRocket position - */ - @Override - public void setRelativePosition(RocketComponent.Position position) { - getComponent().setRelativePosition(position); - } - + /** * Get the required type of material for this component. This is the OpenRocket type, which does NOT always * correspond to Rocksim. Some streamer material is defined as BULK in the Rocksim file. In those cases diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/RingHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/RingHandler.java index 51d43789e6..96bcd1bdfb 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/RingHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/RingHandler.java @@ -5,6 +5,8 @@ import java.util.HashMap; +import org.xml.sax.SAXException; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; @@ -18,8 +20,6 @@ import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.TubeCoupler; -import org.xml.sax.SAXException; - /** * A SAX handler for centering rings, tube couplers, and bulkheads. */ @@ -173,23 +173,12 @@ private void copyValues(RingComponent result) { result.setLength(ring.getLength()); result.setName(ring.getName()); setOverride(result, ring.isOverrideSubcomponentsEnabled(), ring.getOverrideMass(), ring.getOverrideCGX()); - result.setRelativePosition(ring.getRelativePosition()); - result.setPositionValue(ring.getPositionValue()); + result.setAxialMethod(ring.getAxialMethod()); + result.setAxialOffset(ring.getAxialOffset()); result.setMaterial(ring.getMaterial()); result.setThickness(result.getThickness()); } - /** - * Set the relative position onto the component. This cannot be done directly because setRelativePosition is not - * public in all components. - * - * @param position the OpenRocket position - */ - @Override - public void setRelativePosition(RocketComponent.Position position) { - ring.setRelativePosition(position); - } - @Override public void endHandler(String element, HashMap attributes, String content, WarningSet warnings) throws SAXException { super.endHandler(element, attributes, content, warnings); diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java index 0178df8dcb..5c14afdd45 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/RocksimHandler.java @@ -16,7 +16,7 @@ import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import org.xml.sax.SAXException; @@ -205,7 +205,7 @@ public ElementHandler openElement(String element, HashMap attrib * rocket defines stage '2' as the initial booster with stage '3' sitting atop it. And so on. */ if ("Stage3Parts".equals(element)) { - final Stage stage = new Stage(); + final AxialStage stage = new AxialStage(); if (stage3Mass > 0.0d) { stage.setMassOverridden(true); stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override @@ -221,7 +221,7 @@ public ElementHandler openElement(String element, HashMap attrib } if ("Stage2Parts".equals(element)) { if (stageCount >= 2) { - final Stage stage = new Stage(); + final AxialStage stage = new AxialStage(); if (stage2Mass > 0.0d) { stage.setMassOverridden(true); stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override @@ -238,7 +238,7 @@ public ElementHandler openElement(String element, HashMap attrib } if ("Stage1Parts".equals(element)) { if (stageCount == 3) { - final Stage stage = new Stage(); + final AxialStage stage = new AxialStage(); if (stage1Mass > 0.0d) { stage.setMassOverridden(true); stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/TransitionHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/TransitionHandler.java index e02353e7f0..7d2a7cb4d5 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/TransitionHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/TransitionHandler.java @@ -153,6 +153,7 @@ public Transition getComponent() { * * @return BULK */ + @Override public Material.Type getMaterialType() { return Material.Type.BULK; } diff --git a/core/src/net/sf/openrocket/file/rocksim/importt/TubeFinSetHandler.java b/core/src/net/sf/openrocket/file/rocksim/importt/TubeFinSetHandler.java index 64c8de1b3b..6266835ace 100644 --- a/core/src/net/sf/openrocket/file/rocksim/importt/TubeFinSetHandler.java +++ b/core/src/net/sf/openrocket/file/rocksim/importt/TubeFinSetHandler.java @@ -9,6 +9,7 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.TubeFinSet; + import org.xml.sax.SAXException; import java.util.HashMap; @@ -32,25 +33,14 @@ public class TubeFinSetHandler extends PositionDependentHandler { * @throws IllegalArgumentException thrown if c is null */ public TubeFinSetHandler(DocumentLoadingContext context, RocketComponent c, WarningSet warnings) throws IllegalArgumentException { - super(context); - if (c == null) { - throw new IllegalArgumentException("The parent component of a tube fin may not be null."); - } - tubeFin = new TubeFinSet(); - if (isCompatible(c, TubeFinSet.class, warnings)) { - c.addChild(tubeFin); - } - } - - - /** - * Set the relative position onto the component. - * - * @param position the OpenRocket position - */ - @Override - protected void setRelativePosition(final RocketComponent.Position position) { - tubeFin.setRelativePosition(position); + super(context); + if (c == null) { + throw new IllegalArgumentException("The parent component of a tube fin may not be null."); + } + tubeFin = new TubeFinSet(); + if (isCompatible(c, TubeFinSet.class, warnings)) { + c.addChild(tubeFin); + } } /** diff --git a/core/src/net/sf/openrocket/file/simplesax/DelegatorHandler.java b/core/src/net/sf/openrocket/file/simplesax/DelegatorHandler.java index 169a4d7072..6023f43ee2 100644 --- a/core/src/net/sf/openrocket/file/simplesax/DelegatorHandler.java +++ b/core/src/net/sf/openrocket/file/simplesax/DelegatorHandler.java @@ -1,15 +1,15 @@ package net.sf.openrocket.file.simplesax; +import java.util.ArrayDeque; +import java.util.Deque; import java.util.HashMap; -import net.sf.openrocket.aerodynamics.Warning; -import net.sf.openrocket.aerodynamics.WarningSet; -import net.sf.openrocket.util.SimpleStack; - import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +import net.sf.openrocket.aerodynamics.WarningSet; + /** * The actual SAX handler class. Contains the necessary methods for parsing the SAX source. * Delegates the actual content parsing to {@link ElementHandler} objects. @@ -17,10 +17,9 @@ class DelegatorHandler extends DefaultHandler { private final WarningSet warnings; - private final SimpleStack handlerStack = new SimpleStack(); - private final SimpleStack elementData = new SimpleStack(); - private final SimpleStack> elementAttributes = new SimpleStack>(); - + private final Deque handlerStack = new ArrayDeque(); + private final Deque elementData = new ArrayDeque(); + private final Deque> elementAttributes = new ArrayDeque>(); // Ignore all elements as long as ignore > 0 private int ignore = 0; @@ -45,14 +44,6 @@ public void startElement(String uri, String localName, String name, return; } - // Check for unknown namespace - if (!uri.equals("")) { - warnings.add(Warning.fromString("Unknown namespace element '" + uri - + "' encountered, ignoring.")); - ignore++; - return; - } - // Add layer to data stacks elementData.push(new StringBuilder()); elementAttributes.push(copyAttributes(attributes)); diff --git a/core/src/net/sf/openrocket/formatting/MotorDescriptionSubstitutor.java b/core/src/net/sf/openrocket/formatting/MotorDescriptionSubstitutor.java index 9963594c07..f02f82540f 100644 --- a/core/src/net/sf/openrocket/formatting/MotorDescriptionSubstitutor.java +++ b/core/src/net/sf/openrocket/formatting/MotorDescriptionSubstitutor.java @@ -6,18 +6,20 @@ import java.util.List; import java.util.Map; +import com.google.inject.Inject; + import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.plugin.Plugin; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.Chars; -import com.google.inject.Inject; - @Plugin public class MotorDescriptionSubstitutor implements RocketSubstitutor { public static final String SUBSTITUTION = "{motors}"; @@ -31,7 +33,7 @@ public boolean containsSubstitution(String str) { } @Override - public String substitute(String str, Rocket rocket, String configId) { + public String substitute(String str, Rocket rocket, FlightConfigurationId configId) { String description = getMotorConfigurationDescription(rocket, configId); return str.replace(SUBSTITUTION, description); } @@ -45,7 +47,7 @@ public Map getDescriptions() { - public String getMotorConfigurationDescription(Rocket rocket, String id) { + public String getMotorConfigurationDescription(Rocket rocket, FlightConfigurationId fcid) { String name; int motorCount = 0; @@ -59,7 +61,7 @@ public String getMotorConfigurationDescription(Rocket rocket, String id) { while (iterator.hasNext()) { RocketComponent c = iterator.next(); - if (c instanceof Stage) { + if (c instanceof AxialStage) { currentList = new ArrayList(); list.add(currentList); @@ -67,10 +69,11 @@ public String getMotorConfigurationDescription(Rocket rocket, String id) { } else if (c instanceof MotorMount) { MotorMount mount = (MotorMount) c; - Motor motor = mount.getMotor(id); + MotorConfiguration inst = mount.getMotorConfig(fcid); + Motor motor = inst.getMotor(); if (mount.isMotorMount() && motor != null) { - String designation = motor.getDesignation(mount.getMotorDelay(id)); + String designation = motor.getDesignation(inst.getEjectionDelay()); for (int i = 0; i < mount.getMotorCount(); i++) { currentList.add(designation); diff --git a/core/src/net/sf/openrocket/formatting/RocketDescriptor.java b/core/src/net/sf/openrocket/formatting/RocketDescriptor.java index dba2ba00d4..73941e1110 100644 --- a/core/src/net/sf/openrocket/formatting/RocketDescriptor.java +++ b/core/src/net/sf/openrocket/formatting/RocketDescriptor.java @@ -1,5 +1,6 @@ package net.sf.openrocket.formatting; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; /** @@ -13,13 +14,13 @@ public interface RocketDescriptor { * of the rocket. This uses the default flight configuration name * as the basis. */ - public String format(Rocket rocket, String configId); + public String format(Rocket rocket, FlightConfigurationId configId); /** * Return a string describing a particular flight configuration * of the rocket. This uses a custom-provided name as the basis. */ - public String format(String name, Rocket rocket, String configId); + public String format(String name, Rocket rocket, FlightConfigurationId configId); } diff --git a/core/src/net/sf/openrocket/formatting/RocketDescriptorImpl.java b/core/src/net/sf/openrocket/formatting/RocketDescriptorImpl.java index 62df68e64f..a33ba1fbff 100644 --- a/core/src/net/sf/openrocket/formatting/RocketDescriptorImpl.java +++ b/core/src/net/sf/openrocket/formatting/RocketDescriptorImpl.java @@ -2,23 +2,24 @@ import java.util.Set; -import net.sf.openrocket.rocketcomponent.Rocket; - import com.google.inject.Inject; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.Rocket; + public class RocketDescriptorImpl implements RocketDescriptor { @Inject private Set substitutors; @Override - public String format(Rocket rocket, String configId) { - String name = rocket.getFlightConfigurationName(configId); + public String format(final Rocket rocket, final FlightConfigurationId configId) { + String name = rocket.getFlightConfiguration(configId).getName(); return format(name, rocket, configId); } @Override - public String format(String name, Rocket rocket, String configId) { + public String format(String name, final Rocket rocket, final FlightConfigurationId configId) { for (RocketSubstitutor s : substitutors) { while (s.containsSubstitution(name)) { name = s.substitute(name, rocket, configId); diff --git a/core/src/net/sf/openrocket/formatting/RocketSubstitutor.java b/core/src/net/sf/openrocket/formatting/RocketSubstitutor.java index 006c33b34b..ca8776c2b2 100644 --- a/core/src/net/sf/openrocket/formatting/RocketSubstitutor.java +++ b/core/src/net/sf/openrocket/formatting/RocketSubstitutor.java @@ -3,6 +3,7 @@ import java.util.Map; import net.sf.openrocket.plugin.Plugin; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; /** @@ -13,7 +14,7 @@ public interface RocketSubstitutor { public boolean containsSubstitution(String str); - public String substitute(String str, Rocket rocket, String configId); + public String substitute(String str, Rocket rocket, FlightConfigurationId configId); public Map getDescriptions(); diff --git a/core/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java b/core/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java deleted file mode 100644 index b7eef06d92..0000000000 --- a/core/src/net/sf/openrocket/masscalc/AbstractMassCalculator.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.sf.openrocket.masscalc; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import net.sf.openrocket.rocketcomponent.Configuration; - -/** - * Abstract base for mass calculators. Provides functionality for cacheing mass data. - * - * @author Sampo Niskanen - */ -public abstract class AbstractMassCalculator implements MassCalculator { - private static final Logger log = LoggerFactory.getLogger(AbstractMassCalculator.class); - - private int rocketMassModID = -1; - private int rocketTreeModID = -1; - - - /** - * Check the current cache consistency. This method must be called by all - * methods that may use any cached data before any other operations are - * performed. If the rocket has changed since the previous call to - * checkCache(), then {@link #voidMassCache()} is called. - *

- * This method performs the checking based on the rocket's modification IDs, - * so that these method may be called from listeners of the rocket itself. - * - * @param configuration the configuration of the current call - */ - protected final void checkCache(Configuration configuration) { - if (rocketMassModID != configuration.getRocket().getMassModID() || - rocketTreeModID != configuration.getRocket().getTreeModID()) { - rocketMassModID = configuration.getRocket().getMassModID(); - rocketTreeModID = configuration.getRocket().getTreeModID(); - log.debug("Voiding the mass cache"); - voidMassCache(); - } - } - - - - /** - * Void cached mass data. This method is called whenever a change occurs in - * the rocket structure that affects the mass of the rocket and when a new - * Rocket is used. This method must be overridden to void any cached data - * necessary. The method must call super.voidMassCache() during - * its execution. - */ - protected void voidMassCache() { - // No-op - } - -} diff --git a/core/src/net/sf/openrocket/masscalc/BasicMassCalculator.java b/core/src/net/sf/openrocket/masscalc/BasicMassCalculator.java deleted file mode 100644 index 90c7b3e3f5..0000000000 --- a/core/src/net/sf/openrocket/masscalc/BasicMassCalculator.java +++ /dev/null @@ -1,371 +0,0 @@ -package net.sf.openrocket.masscalc; - -import static net.sf.openrocket.util.MathUtil.pow2; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.rocketcomponent.MotorMount; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.MathUtil; - -public class BasicMassCalculator extends AbstractMassCalculator { - - private static final double MIN_MASS = 0.001 * MathUtil.EPSILON; - - - /* - * Cached data. All CG data is in absolute coordinates. All moments of inertia - * are relative to their respective CG. - */ - private Coordinate[] cgCache = null; - private double longitudinalInertiaCache[] = null; - private double rotationalInertiaCache[] = null; - - - - ////////////////// Mass property calculations /////////////////// - - - /** - * Return the CG of the rocket with the specified motor status (no motors, - * ignition, burnout). - */ - @Override - public Coordinate getCG(Configuration configuration, MassCalcType type) { - checkCache(configuration); - calculateStageCache(configuration); - - Coordinate totalCG = null; - - // Stage contribution - for (int stage : configuration.getActiveStages()) { - totalCG = cgCache[stage].average(totalCG); - } - - if (totalCG == null) - totalCG = Coordinate.NUL; - - // Add motor CGs - String motorId = configuration.getFlightConfigurationID(); - if (type != MassCalcType.NO_MOTORS && motorId != null) { - Iterator iterator = configuration.motorIterator(); - while (iterator.hasNext()) { - MotorMount mount = iterator.next(); - RocketComponent comp = (RocketComponent) mount; - Motor motor = mount.getMotor(motorId); - if (motor == null) - continue; - - Coordinate motorCG = type.getCG(motor).add(mount.getMotorPosition(motorId)); - Coordinate[] cgs = comp.toAbsolute(motorCG); - for (Coordinate cg : cgs) { - totalCG = totalCG.average(cg); - } - } - } - - return totalCG; - } - - - - - /** - * Return the CG of the rocket with the provided motor configuration. - */ - @Override - public Coordinate getCG(Configuration configuration, MotorInstanceConfiguration motors) { - checkCache(configuration); - calculateStageCache(configuration); - - Coordinate totalCG = getCG(configuration, MassCalcType.NO_MOTORS); - - // Add motor CGs - if (motors != null) { - for (MotorId id : motors.getMotorIDs()) { - int stage = ((RocketComponent) motors.getMotorMount(id)).getStageNumber(); - if (configuration.isStageActive(stage)) { - - MotorInstance motor = motors.getMotorInstance(id); - Coordinate position = motors.getMotorPosition(id); - Coordinate cg = motor.getCG().add(position); - totalCG = totalCG.average(cg); - - } - } - } - return totalCG; - } - - /** - * Return the longitudinal inertia of the rocket with the specified motor instance - * configuration. - * - * @param configuration the current motor instance configuration - * @return the longitudinal inertia of the rocket - */ - @Override - public double getLongitudinalInertia(Configuration configuration, MotorInstanceConfiguration motors) { - checkCache(configuration); - calculateStageCache(configuration); - - final Coordinate totalCG = getCG(configuration, motors); - double totalInertia = 0; - - // Stages - for (int stage : configuration.getActiveStages()) { - Coordinate stageCG = cgCache[stage]; - - totalInertia += (longitudinalInertiaCache[stage] + - stageCG.weight * MathUtil.pow2(stageCG.x - totalCG.x)); - } - - - // Motors - if (motors != null) { - for (MotorId id : motors.getMotorIDs()) { - int stage = ((RocketComponent) motors.getMotorMount(id)).getStageNumber(); - if (configuration.isStageActive(stage)) { - MotorInstance motor = motors.getMotorInstance(id); - Coordinate position = motors.getMotorPosition(id); - Coordinate cg = motor.getCG().add(position); - - double inertia = motor.getLongitudinalInertia(); - totalInertia += inertia + cg.weight * MathUtil.pow2(cg.x - totalCG.x); - } - } - } - - return totalInertia; - } - - - - /** - * Return the rotational inertia of the rocket with the specified motor instance - * configuration. - * - * @param configuration the current motor instance configuration - * @return the rotational inertia of the rocket - */ - @Override - public double getRotationalInertia(Configuration configuration, MotorInstanceConfiguration motors) { - checkCache(configuration); - calculateStageCache(configuration); - - final Coordinate totalCG = getCG(configuration, motors); - double totalInertia = 0; - - // Stages - for (int stage : configuration.getActiveStages()) { - Coordinate stageCG = cgCache[stage]; - - totalInertia += (rotationalInertiaCache[stage] + - stageCG.weight * (MathUtil.pow2(stageCG.y - totalCG.y) + - MathUtil.pow2(stageCG.z - totalCG.z))); - } - - - // Motors - if (motors != null) { - for (MotorId id : motors.getMotorIDs()) { - int stage = ((RocketComponent) motors.getMotorMount(id)).getStageNumber(); - if (configuration.isStageActive(stage)) { - MotorInstance motor = motors.getMotorInstance(id); - Coordinate position = motors.getMotorPosition(id); - Coordinate cg = motor.getCG().add(position); - - double inertia = motor.getRotationalInertia(); - totalInertia += inertia + cg.weight * (MathUtil.pow2(cg.y - totalCG.y) + - MathUtil.pow2(cg.z - totalCG.z)); - } - } - } - - return totalInertia; - } - - /** - * Return the total mass of the motors - * - * @param configuration the current motor instance configuration - * @return the total mass of all motors - */ - @Override - public double getPropellantMass(Configuration configuration, MotorInstanceConfiguration motors){ - double mass = 0; - - // add up the masses of all motors in the rocket - if (motors != null) { - for (MotorId id : motors.getMotorIDs()) { - MotorInstance motor = motors.getMotorInstance(id); - mass = mass + motor.getCG().weight - motor.getParentMotor().getEmptyCG().weight; - } - } - return mass; - } - - @Override - public Map getCGAnalysis(Configuration configuration, MassCalcType type) { - checkCache(configuration); - calculateStageCache(configuration); - - Map map = new HashMap(); - - for (RocketComponent c : configuration) { - Coordinate[] cgs = c.toAbsolute(c.getCG()); - Coordinate totalCG = Coordinate.NUL; - for (Coordinate cg : cgs) { - totalCG = totalCG.average(cg); - } - map.put(c, totalCG); - } - - map.put(configuration.getRocket(), getCG(configuration, type)); - - return map; - } - - //////// Cache computations //////// - - private void calculateStageCache(Configuration config) { - if (cgCache == null) { - - int stages = config.getRocket().getStageCount(); - - cgCache = new Coordinate[stages]; - longitudinalInertiaCache = new double[stages]; - rotationalInertiaCache = new double[stages]; - - for (int i = 0; i < stages; i++) { - RocketComponent stage = config.getRocket().getChild(i); - MassData data = calculateAssemblyMassData(stage); - cgCache[i] = stage.toAbsolute(data.cg)[0]; - longitudinalInertiaCache[i] = data.longitudinalInertia; - rotationalInertiaCache[i] = data.rotationalInetria; - } - - } - } - - - - /** - * Returns the mass and inertia data for this component and all subcomponents. - * The inertia is returned relative to the CG, and the CG is in the coordinates - * of the specified component, not global coordinates. - */ - private MassData calculateAssemblyMassData(RocketComponent parent) { - MassData parentData = new MassData(); - - // Calculate data for this component - parentData.cg = parent.getComponentCG(); - if (parentData.cg.weight < MIN_MASS) - parentData.cg = parentData.cg.setWeight(MIN_MASS); - - - // Override only this component's data - if (!parent.getOverrideSubcomponents()) { - if (parent.isMassOverridden()) - parentData.cg = parentData.cg.setWeight(MathUtil.max(parent.getOverrideMass(), MIN_MASS)); - if (parent.isCGOverridden()) - parentData.cg = parentData.cg.setXYZ(parent.getOverrideCG()); - } - - parentData.longitudinalInertia = parent.getLongitudinalUnitInertia() * parentData.cg.weight; - parentData.rotationalInetria = parent.getRotationalUnitInertia() * parentData.cg.weight; - - - // Combine data for subcomponents - for (RocketComponent sibling : parent.getChildren()) { - Coordinate combinedCG; - double dx2, dr2; - - // Compute data of sibling - MassData siblingData = calculateAssemblyMassData(sibling); - Coordinate[] siblingCGs = sibling.toRelative(siblingData.cg, parent); - - for (Coordinate siblingCG : siblingCGs) { - - // Compute CG of this + sibling - combinedCG = parentData.cg.average(siblingCG); - - // Add effect of this CG change to parent inertia - dx2 = pow2(parentData.cg.x - combinedCG.x); - parentData.longitudinalInertia += parentData.cg.weight * dx2; - - dr2 = pow2(parentData.cg.y - combinedCG.y) + pow2(parentData.cg.z - combinedCG.z); - parentData.rotationalInetria += parentData.cg.weight * dr2; - - - // Add inertia of sibling - parentData.longitudinalInertia += siblingData.longitudinalInertia; - parentData.rotationalInetria += siblingData.rotationalInetria; - - // Add effect of sibling CG change - dx2 = pow2(siblingData.cg.x - combinedCG.x); - parentData.longitudinalInertia += siblingData.cg.weight * dx2; - - dr2 = pow2(siblingData.cg.y - combinedCG.y) + pow2(siblingData.cg.z - combinedCG.z); - parentData.rotationalInetria += siblingData.cg.weight * dr2; - - // Set combined CG - parentData.cg = combinedCG; - } - } - - // Override total data - if (parent.getOverrideSubcomponents()) { - if (parent.isMassOverridden()) { - double oldMass = parentData.cg.weight; - double newMass = MathUtil.max(parent.getOverrideMass(), MIN_MASS); - parentData.longitudinalInertia = parentData.longitudinalInertia * newMass / oldMass; - parentData.rotationalInetria = parentData.rotationalInetria * newMass / oldMass; - parentData.cg = parentData.cg.setWeight(newMass); - } - if (parent.isCGOverridden()) { - double oldx = parentData.cg.x; - double newx = parent.getOverrideCGX(); - parentData.longitudinalInertia += parentData.cg.weight * pow2(oldx - newx); - parentData.cg = parentData.cg.setX(newx); - } - } - - return parentData; - } - - - private static class MassData { - public Coordinate cg = Coordinate.NUL; - public double longitudinalInertia = 0; - public double rotationalInetria = 0; - } - - - @Override - protected void voidMassCache() { - super.voidMassCache(); - this.cgCache = null; - this.longitudinalInertiaCache = null; - this.rotationalInertiaCache = null; - } - - - - - @Override - public int getModID() { - return 0; - } - - - -} diff --git a/core/src/net/sf/openrocket/masscalc/MassCalculation.java b/core/src/net/sf/openrocket/masscalc/MassCalculation.java new file mode 100644 index 0000000000..9ecbacdc8c --- /dev/null +++ b/core/src/net/sf/openrocket/masscalc/MassCalculation.java @@ -0,0 +1,363 @@ +package net.sf.openrocket.masscalc; + +import java.util.ArrayList; + +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Transformation; + +/** + * + * @author teyrana (aka Daniel Williams) + * + */ +public class MassCalculation { + + /** + * NOTE: Multiple enums may map to the same settings. This allows a caller to use the + * enum which best matches their use case. + */ + public enum Type { + // no motor data, even if the configuration contains active engines + STRUCTURE( true, false, false ), + + // n.b. 'motor-mass' calculations are to be preferred over 'propellant-mass' calculations because they are computationally simpler: + // not only are they faster, but *slightly* more accurate because of fewer calculation rounding errors + MOTOR( false, true, true ), + + BURNOUT( true, true, false ), + + LAUNCH( true, true, true ); + + public final boolean includesStructure; + public final boolean includesMotorCasing; + public final boolean includesPropellant; + + Type( double simulationTime ) { + includesStructure = false; + includesMotorCasing = true; + includesPropellant = true; + } + + Type( boolean include_structure, boolean include_casing, boolean include_prop) { + this.includesStructure = include_structure; + this.includesMotorCasing = include_casing; + this.includesPropellant = include_prop; + } + } + + // =========== Instance Functions ======================== + + public void merge( final MassCalculation other ) { + if( 0 < other.getMass()) { + // Adjust Center-of-mass + this.addMass( other.getCM() ); + this.bodies.addAll( other.bodies ); + } + } + + public void addInertia( final RigidBody data ) { + this.bodies.add( data ); + } + + public void addMass( final Coordinate pointMass ) { + if( 0 == this.centerOfMass.weight ){ + this.centerOfMass = pointMass; + }else { + this.centerOfMass = this.centerOfMass.average( pointMass); + } + } + + public MassCalculation copy( final RocketComponent _root, final Transformation _transform ){ + return new MassCalculation( this.type, this.config, this.simulationTime, _root, _transform ); + } + + public Coordinate getCM() { + return this.centerOfMass; + } + + public double getMass() { + return this.centerOfMass.weight; + } + + public double getLongitudinalInertia() { + return this.inertia.Iyy; + } + + public double getRotationalInertia() { + return this.inertia.Ixx; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + + MassCalculation other = (MassCalculation) obj; + return ((this.centerOfMass.equals(other.centerOfMass)) + && (this.config.equals( other.config)) + && (this.simulationTime == other.simulationTime) + && (this.type == other.type) ); + } + + @Override + public int hashCode() { + return (int) (this.centerOfMass.hashCode()); + } + + public MassCalculation( final Type _type, final FlightConfiguration _config, final double _time, final RocketComponent _root, final Transformation _transform) { + type = _type; + config = _config; + simulationTime = _time; + root = _root; + transform = _transform; + + reset(); + } + + public void setCM( final Coordinate newCM ) { + this.centerOfMass = newCM; + } + + public void reset(){ + centerOfMass = Coordinate.ZERO; + inertia = RigidBody.EMPTY; + bodies.clear(); + } + + public int size() { + return this.bodies.size(); + } + + public String toCMDebug(){ + return String.format("cm= %.6fg@[%.6f,%.6f,%.6f]", centerOfMass.weight, centerOfMass.x, centerOfMass.y, centerOfMass.z); + } + +// public String toMOIDebug(){ +// return String.format("I_cm=[ %.8f, %.8f, %.8f ]", inertia.getIxx(), inertia.getIyy(), inertia.getIzz() )); +// } + + @Override + public String toString() { + return this.toCMDebug(); + } + + + // =========== Instance Member Variables ======================== + + private static final double MIN_MASS = MathUtil.EPSILON; + + // === package-private === + final FlightConfiguration config; + final double simulationTime; + final RocketComponent root; + final Transformation transform; + final Type type; + + // center-of-mass only. + Coordinate centerOfMass = Coordinate.ZERO; + + // center-of-mass AND moment-of-inertia data. + RigidBody inertia = RigidBody.EMPTY; + + // center-of-mass AND moment-of-inertia data. + final ArrayList bodies = new ArrayList(); + + String prefix = ""; + + // =========== Private Instance Functions ======================== + + private MassCalculation calculateMountData(){ + if( ! config.isComponentActive(this.root)) { + return this; + } + + final MotorMount mount = (MotorMount)root; + MotorConfiguration motorConfig = mount.getMotorConfig( config.getId() ); + final Motor motor = motorConfig.getMotor(); + if( motorConfig.isEmpty() ){ + return this; + } + + + final double mountXPosition = root.getPosition().x; + + final int instanceCount = root.getInstanceCount(); + + final double motorXPosition = motorConfig.getX(); // location of motor from mount + final Coordinate[] offsets = root.getInstanceOffsets(); + + double eachMass; + double eachCMx; // CoM from beginning of motor + + if ( this.type.includesMotorCasing && this.type.includesPropellant ){ + eachMass = motor.getTotalMass( simulationTime ); + eachCMx = motor.getCMx( simulationTime); + }else if( this.type.includesMotorCasing ) { + eachMass = motor.getTotalMass( Motor.PSEUDO_TIME_BURNOUT ); + eachCMx = motor.getCMx( Motor.PSEUDO_TIME_BURNOUT ); + } else { + final double eachMotorMass = motor.getTotalMass( simulationTime ); + final double eachMotorCMx = motor.getCMx( simulationTime); // CoM from beginning of motor + final double eachCasingMass = motor.getBurnoutMass(); + final double eachCasingCMx = motor.getBurnoutCGx(); + + eachMass = eachMotorMass - eachCasingMass; + eachCMx = (eachMotorCMx*eachMotorMass - eachCasingCMx*eachCasingMass)/eachMass; + } + +// System.err.println(String.format("%-40s|Motor: %s.... Mass @%f = %.6f", prefix, motorConfig.toDescription(), simulationTime, eachMass )); + + + // coordinates in rocket frame; Ir, It about CoM. + final Coordinate clusterLocalCM = new Coordinate( mountXPosition + motorXPosition + eachCMx, 0, 0, eachMass*instanceCount); + + double clusterBaseIr = motorConfig.getUnitRotationalInertia()*instanceCount*eachMass; + + double clusterIt = motorConfig.getUnitLongitudinalInertia()*instanceCount*eachMass; + + // if more than 1 moter => motors are not an the centerline => adjust via parallel-axis theorem + double clusterIr = clusterBaseIr; + if( 1 < instanceCount ){ + for( Coordinate coord : offsets ){ + double distance = Math.hypot( coord.y, coord.z); + clusterIr += eachMass*Math.pow( distance, 2); + } + } + + final Coordinate clusterCM = transform.transform( clusterLocalCM ); + addMass( clusterCM ); + + RigidBody clusterMOI = new RigidBody( clusterCM, clusterIr, clusterIt, clusterIt ); + addInertia( clusterMOI ); + + return this; + } + + /** + * Returns the mass and inertia data for this component and all subcomponents. + * The inertia is returned relative to the CG, and the CG is in the coordinates + * of the specified component, not global coordinates. + * + */ + /* package-scope */ MassCalculation calculateAssembly(){ + final RocketComponent component = this.root; + final Transformation parentTransform = this.transform; + + final int instanceCount = component.getInstanceCount(); + Coordinate[] instanceLocations = component.getInstanceLocations(); + +// // vvv DEBUG +// if( this.config.isComponentActive(component) ){ +// System.err.println(String.format( "%s[%s]....", prefix, component.getName())); +// } + + if( this.type.includesStructure && this.config.isComponentActive(component) ){ + Coordinate compCM = component.getCG(); + double compIx = component.getRotationalUnitInertia() * compCM.weight; + double compIt = component.getLongitudinalUnitInertia() * compCM.weight; + + if (!component.getOverrideSubcomponents()) { + if (component.isMassOverridden()) + compCM = compCM.setWeight(MathUtil.max(component.getOverrideMass(), MIN_MASS)); + if (component.isCGOverridden()) + compCM = compCM.setXYZ(component.getOverrideCG()); + } + + // mass data for *this component only* in the rocket-frame + compCM = parentTransform.transform( compCM.add(component.getPosition()) ); + this.addMass( compCM ); + + RigidBody componentInertia = new RigidBody( compCM, compIx, compIt, compIt ); + this.addInertia( componentInertia ); + +// if( 0 < compCM.weight ) { // vvv DEBUG +// System.err.println(String.format( "%s....componentData: %s", prefix, compCM.toPreciseString() )); +// } + } + + if( component.isMotorMount() && ( this.type.includesMotorCasing || this.type.includesPropellant )) { + MassCalculation propellant = this.copy(component, parentTransform); + + propellant.calculateMountData(); + + this.merge( propellant ); + +// if( 0 < propellant.getMass() ) { +// System.err.println(String.format( "%s........++ propellantData: %s", prefix, propellant.toCMDebug())); +// } + } + + // iterate over the aggregated instances for the whole tree. + MassCalculation children = this.copy(component, parentTransform ); + for( int instanceNumber = 0; instanceNumber < instanceCount; ++instanceNumber) { + Coordinate currentLocation = instanceLocations[instanceNumber]; + Transformation currentTransform = parentTransform.applyTransformation( Transformation.getTranslationTransform( currentLocation )); + + for (RocketComponent child : component.getChildren()) { + // child data, relative to rocket reference frame + MassCalculation eachChild = copy( child, currentTransform); + + eachChild.prefix = prefix + "...."; + eachChild.calculateAssembly(); + + // accumulate children's data + children.merge( eachChild ); + } + } + + if( 0 < children.getMass() ) { + this.merge( children ); + //System.err.println(String.format( "%s....assembly mass (incl/children): %s", prefix, this.toCMDebug())); + } + + // Override total data + if (component.getOverrideSubcomponents()) { + if (component.isMassOverridden()) { + double newMass = MathUtil.max(component.getOverrideMass(), MIN_MASS); + Coordinate newCM = this.getCM().setWeight( newMass ); + this.setCM( newCM ); + } + if (component.isCGOverridden()) { + Coordinate newCM = this.getCM().setX( component.getOverrideCGX() ); + this.setCM( newCM ); + } + } + + // vvv DEBUG + //if( this.config.isComponentActive(component) && 0 < this.getMass() ) { + //System.err.println(String.format( "%s....<< return assemblyData: %s (tree @%s)", prefix, this.toCMDebug(), component.getName() )); + // System.err.println(String.format( "%s Ixx = %.8f Iyy = %.8f", prefix, getIxx(), getIyy() )); + //} + // ^^^ DEBUG + + return this; + } + + /** + * MOI Calculation needs to be a two-step process: + * (1) calculate overall Center-of-Mass (CM) first (down inline with data-gathering) + * (2) Move MOIs to CM via parallel axis theorem (this method) + * + * @return freshly calculated Moment-of-Inertia matrix + */ + /* package-scope */ RigidBody calculateMomentOfInertia() { + double Ir=0, It=0; + for( final RigidBody eachLocal : this.bodies ){ + final RigidBody eachGlobal = eachLocal.rebase( this.centerOfMass ); + + Ir += eachGlobal.Ixx; + It += eachGlobal.Iyy; + } + + return new RigidBody( centerOfMass, Ir, It, It ); + } + + +} + diff --git a/core/src/net/sf/openrocket/masscalc/MassCalculator.java b/core/src/net/sf/openrocket/masscalc/MassCalculator.java index 5e657f7ab6..404c98f30c 100644 --- a/core/src/net/sf/openrocket/masscalc/MassCalculator.java +++ b/core/src/net/sf/openrocket/masscalc/MassCalculator.java @@ -1,83 +1,110 @@ package net.sf.openrocket.masscalc; +import java.util.HashMap; import java.util.Map; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Monitorable; +import net.sf.openrocket.util.Transformation; -public interface MassCalculator extends Monitorable { +public class MassCalculator implements Monitorable { - public static enum MassCalcType { - NO_MOTORS { - @Override - public Coordinate getCG(Motor motor) { - return Coordinate.NUL; - } - }, - LAUNCH_MASS { - @Override - public Coordinate getCG(Motor motor) { - return motor.getLaunchCG(); - } - }, - BURNOUT_MASS { - @Override - public Coordinate getCG(Motor motor) { - return motor.getEmptyCG(); - } - }; - - public abstract Coordinate getCG(Motor motor); + public static final double MIN_MASS = MathUtil.EPSILON; + + /* + * Cached data. All CG data is in absolute coordinates. All moments of inertia + * are relative to their respective CG. + */ + // private HashMap< Integer, MassData> stageMassCache = new HashMap(); + // private MassData rocketSpentMassCache; + // private MassData propellantMassCache; + + private int modId = 0; + + ////////////////// Constructors /////////////////// + public MassCalculator() { } - /** - * Compute the CG of the provided configuration. - * - * @param configuration the rocket configuration - * @param type the state of the motors (none, launch mass, burnout mass) - * @return the CG of the configuration - */ - public Coordinate getCG(Configuration configuration, MassCalcType type); + ////////////////// Public Accessors /////////////////// + /** - * Compute the CG of the provided configuration with specified motors. - * - * @param configuration the rocket configuration - * @param motors the motor configuration - * @return the CG of the configuration + * Calculates mass data of the rocket's burnout mass + * - includes structure + * - includes motors + * - for Black Powder & Composite motors, this generally *excludes* propellant + * + * @param config the rocket configuration to calculate for + * @return the MassData struct of the motors at burnout */ - public Coordinate getCG(Configuration configuration, MotorInstanceConfiguration motors); + public static RigidBody calculateStructure( final FlightConfiguration config) { + return calculate( MassCalculation.Type.STRUCTURE, config, Motor.PSEUDO_TIME_EMPTY ); + } /** - * Compute the longitudinal inertia of the provided configuration with specified motors. - * - * @param configuration the rocket configuration - * @param motors the motor configuration - * @return the longitudinal inertia of the configuration + * Calculates mass data of the rocket's burnout mass + * - includes structure + * - includes motors + * - for Black Powder & Composite motors, this generally *excludes* propellant + * + * @param config the rocket configuration to calculate for + * @return the MassData struct of the motors at burnout */ - public double getLongitudinalInertia(Configuration configuration, MotorInstanceConfiguration motors); + public static RigidBody calculateBurnout( final FlightConfiguration config) { + return calculate( MassCalculation.Type.BURNOUT, config, Motor.PSEUDO_TIME_BURNOUT ); + } + + public static RigidBody calculateMotor( final FlightConfiguration config) { + return calculate( MassCalculation.Type.MOTOR, config, Motor.PSEUDO_TIME_LAUNCH ); + } /** - * Compute the rotational inertia of the provided configuration with specified motors. + * Compute the burnout mass properties all motors, given a configuration * - * @param configuration the rocket configuration - * @param motors the motor configuration - * @return the rotational inertia of the configuration + * Will calculate data for: MassCalcType.BURNOUT_MASS + * + * @param config the rocket configuration + * @return the MassData struct of the motors at burnout */ - public double getRotationalInertia(Configuration configuration, MotorInstanceConfiguration motors); + public static RigidBody calculateLaunch( final FlightConfiguration config ){ + return calculate( MassCalculation.Type.LAUNCH, config, Motor.PSEUDO_TIME_LAUNCH ); + } - /** - * Return the total mass of the motors + /** calculates the massdata for all propellant in the rocket given the simulation status. * - * @param motors the motor configuration - * @param configuration the current motor instance configuration - * @return the total mass of all motors + * @param status CurrentSimulation status to calculate data with + * @return combined mass data for all propellant */ - public double getPropellantMass(Configuration configuration, MotorInstanceConfiguration motors); + public static RigidBody calculateMotor( final SimulationStatus status ){ + return calculate( MassCalculation.Type.MOTOR, status ); + } + + ////////////////// Mass property Wrappers /////////////////// + // all mass calculation calls should probably call through one of these two wrappers. + + // convenience wrapper -- use this to implicitly create a plain MassCalculation object with common parameters + public static RigidBody calculate( final MassCalculation.Type _type, final SimulationStatus status ){ + final FlightConfiguration config = status.getConfiguration(); + final double time = status.getSimulationTime(); + MassCalculation calculation= new MassCalculation( _type, config, time, config.getRocket(), Transformation.IDENTITY); + + calculation.calculateAssembly(); + RigidBody result = calculation.calculateMomentOfInertia(); + return result; + } + + // convenience wrapper -- use this to implicitly create a plain MassCalculation object with common parameters + public static RigidBody calculate( final MassCalculation.Type _type, final FlightConfiguration _config, double _time ){ + MassCalculation calculation = new MassCalculation( _type, _config, _time, _config.getRocket(), Transformation.IDENTITY); + calculation.calculateAssembly(); + return calculation.calculateMomentOfInertia(); + } + /** * Compute an analysis of the per-component CG's of the provided configuration. @@ -86,11 +113,46 @@ public Coordinate getCG(Motor motor) { * The CG of the entire configuration with motors is stored in the entry with the corresponding * Rocket as the key. * + * Deprecated: + * This function is fundamentally broken, because it asks for a calculation which ignores instancing. + * This function will work with simple rockets, but will be misleading or downright wrong for others. + * + * This is a problem with using a single-typed map: + * [1] multiple instances of components are not allowed, and must be merged. + * [2] propellant / motor data does not have a corresponding RocketComponent. + * ( or mount-data collides with motor-data ) + * * @param configuration the rocket configuration - * @param type the state of the motors (none, launch mass, burnout mass) * @return a map from each rocket component to its corresponding CG. */ - public Map getCGAnalysis(Configuration configuration, MassCalcType type); - + @Deprecated + public Map getCGAnalysis(FlightConfiguration configuration) { + // revalidateCache(configuration); + + Map map = new HashMap(); + + Coordinate rocketCG = Coordinate.ZERO; + for (RocketComponent comp : configuration.getActiveComponents()) { + Coordinate[] cgs = comp.toAbsolute(comp.getCG()); + Coordinate stageCG = Coordinate.NUL; + for (Coordinate cg : cgs) { + stageCG = stageCG.average(cg); + } + map.put(comp, stageCG); + + rocketCG.average( stageCG); + } + + map.put(configuration.getRocket(), rocketCG ); + + return map; + } + + ////////////////// Mass property calculations /////////////////// + @Override + public int getModID() { + return this.modId; + } + } diff --git a/core/src/net/sf/openrocket/masscalc/RigidBody.java b/core/src/net/sf/openrocket/masscalc/RigidBody.java new file mode 100644 index 0000000000..01543c58b4 --- /dev/null +++ b/core/src/net/sf/openrocket/masscalc/RigidBody.java @@ -0,0 +1,141 @@ +package net.sf.openrocket.masscalc; + +import static net.sf.openrocket.util.MathUtil.pow2; + +import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; + +// implements a simplified, diagonal MOI +public class RigidBody { + public final Coordinate cm; + public final double Ixx; + public final double Iyy; + public final double Izz; + + public static final RigidBody EMPTY = new RigidBody( Coordinate.ZERO, 0., 0., 0.); + + public RigidBody( Coordinate _cm, double I_axial, double I_long ){ + this( _cm, I_axial, I_long, I_long ); + } + + public RigidBody( Coordinate _cm, double Ixx, double Iyy, double Izz){ + if(( 0 > Ixx)||( 0 > Iyy)||( 0 > Izz)){ + throw new BugException(" attempted to initialize an InertiaMatrix with a negative inertia value."); + } + this.cm=_cm; + this.Ixx = Ixx; + this.Iyy = Iyy; + this.Izz = Izz; + } + + public RigidBody add( RigidBody that){ + final Coordinate newCM = this.cm.average( that.cm); + + RigidBody movedThis = this.rebase( newCM ); + RigidBody movedThat = that.rebase( newCM ); + + final double newIxx = movedThis.Ixx + movedThat.Ixx; + final double newIyy = movedThis.Iyy + movedThat.Iyy; + final double newIzz = movedThis.Izz + movedThat.Izz; + + return new RigidBody( newCM, newIxx, newIyy, newIzz ); + } + + public Coordinate getCenterOfMass() { return cm; } + public Coordinate getCM() { return cm; } + public double getIyy(){ return Iyy; } + public double getIxx(){ return Ixx; } + public double getIzz(){ return Izz; } + public double getLongitudinalInertia() { return Iyy; } + public double getMass() { return this.cm.weight; } + public double getRotationalInertia() { return Ixx; } + + + public boolean isEmpty() { + if( RigidBody.EMPTY == this) { + return true; + } + return RigidBody.EMPTY.equals( this ); + } + + @Override + public int hashCode() { + return (int) (Double.doubleToLongBits(this.Ixx) ^ Double.doubleToLongBits(this.Iyy) ^ Double.doubleToLongBits(this.Ixx) ); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!(obj instanceof RigidBody)) + return false; + + RigidBody other = (RigidBody) obj; + return (MathUtil.equals(this.Ixx, other.Ixx) && MathUtil.equals(this.Iyy, other.Iyy) && + MathUtil.equals(this.Izz, other.Izz)) ; + } + + public RigidBody rebase( final Coordinate newLocation ){ + final Coordinate delta = this.cm.sub( newLocation ).setWeight(0.); + double x2 = pow2(delta.x); + double y2 = pow2(delta.y); + double z2 = pow2(delta.z); + +// final double radialDistanceSquared = (y2 + z2); +// final double axialDistanceSquared = x2; +// +// System.err.println(String.format(" - CM_new = %.8f @[ %.8f, %.8f, %.8f ]", eachGlobal.cm.weight, eachGlobal.cm.x, eachGlobal.cm.y, eachGlobal.cm.z )); +// System.err.println(String.format(" - each: base: { %.12f %.12f }", eachLocal.xx, eachLocal.xx )); +// System.err.println(String.format(" - each: carrected: { %.12f %.12f }", eachGlobal.xx, eachGlobal.yy )); + + // See: Parallel Axis Theorem in the function comments. + // I = I + m L^2; L = sqrt( y^2 + z^2); + // ergo: I = I + m (y^2 + z^2); + double newIxx = this.Ixx + cm.weight*(y2 + z2); + double newIyy = this.Iyy + cm.weight*(x2 + z2); + double newIzz = this.Izz + cm.weight*(x2 + y2); + + // MOI about the reference point + return new RigidBody( newLocation, newIxx, newIyy, newIzz); + } + + @Override + public String toString() { + return toCMString()+" // "+toMOIString(); + } + + public String toCMString() { + return String.format("CoM: %.8fg @[%.8f,%.8f,%.8f]", cm.weight, cm.x, cm.y, cm.z); + } + + public String toMOIString() { + return String.format("MOI: [ %.8f, %.8f, %.8f]", Ixx, Iyy, Izz ); + } + + /** + * This function returns a copy of this MassData translated to a new location via + * a simplified model. + * + * Assuming rotations are independent, and occur perpendicular to the principal axes, + * The above can be simplified to produce a diagonal newMOI in + * the form of the parallel axis theorem: + * [ oldMOI + m*d^2, ...] + * + * For the full version of the equations, see: + * [1] https://en.wikipedia.org/wiki/Parallel_axis_theorem#Tensor_generalization + * [2] http://www.kwon3d.com/theory/moi/triten.html + * + * + * @param delta vector position from center of mass to desired reference location + * + * @return MassData the new MassData instance + */ + public RigidBody translateInertia( final Coordinate delta ){ + final Coordinate newLocation = this.cm.add( delta ); + return rebase( newLocation ); + } + + + +} diff --git a/core/src/net/sf/openrocket/material/Material.java b/core/src/net/sf/openrocket/material/Material.java index 055fc336b6..fd311d3fe7 100644 --- a/core/src/net/sf/openrocket/material/Material.java +++ b/core/src/net/sf/openrocket/material/Material.java @@ -23,7 +23,8 @@ public abstract class Material implements Comparable { public enum Type { LINE("Databases.materials.types.Line", UnitGroup.UNITS_DENSITY_LINE), SURFACE("Databases.materials.types.Surface", UnitGroup.UNITS_DENSITY_SURFACE), - BULK("Databases.materials.types.Bulk", UnitGroup.UNITS_DENSITY_BULK); + BULK("Databases.materials.types.Bulk", UnitGroup.UNITS_DENSITY_BULK), + CUSTOM("Databases.materials.types.Custom", UnitGroup.UNITS_DENSITY_BULK); private final String name; private final UnitGroup units; @@ -85,6 +86,18 @@ public Type getType() { } } + + public static class Custom extends Material { + Custom(String name, double density, boolean userDefined) { + super(name, density, userDefined); + } + + @Override + public Type getType() { + return Type.CUSTOM; + } + } + private final String name; @@ -187,6 +200,9 @@ public static Material newMaterial(Type type, String name, double density, boole case BULK: return new Material.Bulk(name, density, userDefined); + + case CUSTOM: + return new Material.Custom(name, density, userDefined); default: throw new IllegalArgumentException("Unknown material type: " + type); diff --git a/core/src/net/sf/openrocket/motor/CaseInfo.java b/core/src/net/sf/openrocket/motor/CaseInfo.java new file mode 100644 index 0000000000..cb7718c054 --- /dev/null +++ b/core/src/net/sf/openrocket/motor/CaseInfo.java @@ -0,0 +1,94 @@ +package net.sf.openrocket.motor; + +import java.util.HashMap; +import java.util.Map; + +/** + * Enumeration of reloadable hardware which OpenRocket supports for substitution. + * + */ +public enum CaseInfo { + + RMS29_100("RMS-29/100"), RMS29_120("RMS-29/120"), RMS29_180("RMS-29/180"), RMS29_240("RMS-29/240"), RMS29_360("RMS-29/360"), + + RMS38_120("RMS-38/120"), RMS38_240("RMS-38/240"), RMS38_360("RMS-38/360"), RMS38_480("RMS-38/480"), RMS38_600("RMS-38/600"), RMS38_720("RMS-38/720"), + + RMS54_426("RMS-54/426"), RMS54_852("RMS-54/852"), RMS54_1280("RMS-54/1280"), RMS54_1706("RMS-54/1706"), RMS54_2560("RMS-54/2560"), RMS54_2800("RMS-54/2800"), + + PRO29_1("Pro29-1G"), PRO29_2("Pro29-2G"), PRO29_3("Pro29-3G"), PRO29_4("Pro29-4G"), PRO29_5("Pro29-5G"), PRO29_6("Pro29-6G"), PRO29_6XL("Pro29-6GXL"), + + PRO38_1("Pro38-1G"), PRO38_2("Pro38-2G"), PRO38_3("Pro38-4G"), PRO38_4("Pro38-4G"), PRO38_5("Pro38-5G"), PRO38_6("Pro38-6G"), PRO38_6XL("Pro38-6GXL"), + + PRO54_1("Pro54-1G"), PRO54_2("Pro54-2G"), PRO54_3("Pro54-3G"), PRO54_4("Pro54-4G"), PRO54_5("Pro54-5G"), PRO54_6("Pro54-6G"), PRO54_6XL("Pro54-6GXL"); + + private String label; + + private CaseInfo(String label) { + this.label = label; + } + + public static CaseInfo parse(String label) { + return labelMapping.get(label); + } + + @Override + public String toString() { + return label; + } + + public CaseInfo[] getCompatibleCases() { + return compatibleCases.get(this); + } + + private static Map labelMapping; + private static Map compatibleCases; + + static { + labelMapping = new HashMap<>(); + for (CaseInfo ci : CaseInfo.values()) { + labelMapping.put(ci.label, ci); + } + + compatibleCases = new HashMap<>(); + + compatibleCases.put(RMS29_100, new CaseInfo[] { RMS29_100, RMS29_120, RMS29_180 }); + compatibleCases.put(RMS29_120, new CaseInfo[] { RMS29_120, RMS29_180, RMS29_240 }); + compatibleCases.put(RMS29_180, new CaseInfo[] { RMS29_180, RMS29_240, RMS29_360 }); + compatibleCases.put(RMS29_240, new CaseInfo[] { RMS29_240, RMS29_360 }); + compatibleCases.put(RMS29_360, new CaseInfo[] { RMS29_360 }); + compatibleCases.put(RMS38_120, new CaseInfo[] { RMS38_120, RMS38_240, RMS38_360 }); + compatibleCases.put(RMS38_240, new CaseInfo[] { RMS38_240, RMS38_360, RMS38_480 }); + compatibleCases.put(RMS38_360, new CaseInfo[] { RMS38_360, RMS38_480, RMS38_600 }); + compatibleCases.put(RMS38_480, new CaseInfo[] { RMS38_480, RMS38_600, RMS38_720 }); + compatibleCases.put(RMS38_600, new CaseInfo[] { RMS38_600, RMS38_720 }); + compatibleCases.put(RMS38_720, new CaseInfo[] { RMS38_720 }); + compatibleCases.put(RMS54_426, new CaseInfo[] { RMS54_426, RMS54_852, RMS54_1280 }); + compatibleCases.put(RMS54_852, new CaseInfo[] { RMS54_852, RMS54_1280, RMS54_1706 }); + compatibleCases.put(RMS54_1280, new CaseInfo[] { RMS54_1280, RMS54_1706, RMS54_2560 }); + compatibleCases.put(RMS54_1706, new CaseInfo[] { RMS54_1706, RMS54_2560, RMS54_2800 }); + compatibleCases.put(RMS54_2560, new CaseInfo[] { RMS54_2560, RMS54_2800 }); + compatibleCases.put(RMS54_2800, new CaseInfo[] { RMS54_2800 }); + compatibleCases.put(PRO29_1, new CaseInfo[] { PRO29_1, PRO29_2, PRO29_3 }); + compatibleCases.put(PRO29_2, new CaseInfo[] { PRO29_2, PRO29_3, PRO29_4 }); + compatibleCases.put(PRO29_3, new CaseInfo[] { PRO29_3, PRO29_4, PRO29_5 }); + compatibleCases.put(PRO29_4, new CaseInfo[] { PRO29_4, PRO29_5, PRO29_6 }); + compatibleCases.put(PRO29_5, new CaseInfo[] { PRO29_5, PRO29_6, PRO29_6XL }); + compatibleCases.put(PRO29_6, new CaseInfo[] { PRO29_6, PRO29_6XL }); + compatibleCases.put(PRO29_6XL, new CaseInfo[] { PRO29_6XL }); + compatibleCases.put(PRO38_1, new CaseInfo[] { PRO38_1, PRO38_2, PRO38_3 }); + compatibleCases.put(PRO38_2, new CaseInfo[] { PRO38_2, PRO38_3, PRO38_4 }); + compatibleCases.put(PRO38_3, new CaseInfo[] { PRO38_3, PRO38_4, PRO38_5 }); + compatibleCases.put(PRO38_4, new CaseInfo[] { PRO38_4, PRO38_5, PRO38_6 }); + compatibleCases.put(PRO38_5, new CaseInfo[] { PRO38_5, PRO38_6, PRO38_6XL }); + compatibleCases.put(PRO38_6, new CaseInfo[] { PRO38_6, PRO38_6XL }); + compatibleCases.put(PRO38_6XL, new CaseInfo[] { PRO38_6XL }); + compatibleCases.put(PRO54_1, new CaseInfo[] { PRO54_1, PRO54_2, PRO54_3 }); + compatibleCases.put(PRO54_2, new CaseInfo[] { PRO54_2, PRO54_3, PRO54_4 }); + compatibleCases.put(PRO54_3, new CaseInfo[] { PRO54_3, PRO54_4, PRO54_5 }); + compatibleCases.put(PRO54_4, new CaseInfo[] { PRO54_4, PRO54_5, PRO54_6 }); + compatibleCases.put(PRO54_5, new CaseInfo[] { PRO54_5, PRO54_6, PRO54_6XL }); + compatibleCases.put(PRO54_6, new CaseInfo[] { PRO54_6, PRO54_6XL }); + compatibleCases.put(PRO54_6XL, new CaseInfo[] { PRO54_6XL }); + } + +} diff --git a/core/src/net/sf/openrocket/motor/IgnitionEvent.java b/core/src/net/sf/openrocket/motor/IgnitionEvent.java new file mode 100644 index 0000000000..f932a66611 --- /dev/null +++ b/core/src/net/sf/openrocket/motor/IgnitionEvent.java @@ -0,0 +1,94 @@ +package net.sf.openrocket.motor; + +import java.util.Locale; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.simulation.FlightEvent; +import net.sf.openrocket.startup.Application; + +public enum IgnitionEvent { + + //// Automatic (launch or ejection charge) + AUTOMATIC( "AUTOMATIC", "MotorMount.IgnitionEvent.AUTOMATIC"){ + @Override + public boolean isActivationEvent(FlightEvent testEvent, RocketComponent targetComponent) { + AxialStage targetStage = (AxialStage)targetComponent.getStage(); + + if ( targetStage.isLaunchStage() ){ + return LAUNCH.isActivationEvent(testEvent, targetComponent); + } else { + return EJECTION_CHARGE.isActivationEvent(testEvent, targetComponent); + } + } + }, + LAUNCH ( "LAUNCH", "MotorMount.IgnitionEvent.LAUNCH"){ + @Override + public boolean isActivationEvent( FlightEvent fe, RocketComponent source){ + return (fe.getType() == FlightEvent.Type.LAUNCH); + } + }, + EJECTION_CHARGE ("EJECTION_CHARGE", "MotorMount.IgnitionEvent.EJECTION_CHARGE"){ + @Override + public boolean isActivationEvent( FlightEvent testEvent, RocketComponent targetComponent){ + if (testEvent.getType() != FlightEvent.Type.EJECTION_CHARGE){ + return false; + } + + AxialStage targetStage = (AxialStage)targetComponent.getStage(); + AxialStage eventStage = (AxialStage)testEvent.getSource().getStage(); + AxialStage eventParentStage = eventStage.getUpperStage(); + return ( targetStage.equals(eventParentStage)); + } + }, + BURNOUT ("BURNOUT", "MotorMount.IgnitionEvent.BURNOUT"){ + @Override + public boolean isActivationEvent( FlightEvent testEvent, RocketComponent targetComponent){ + if (testEvent.getType() != FlightEvent.Type.BURNOUT) + return false; + + AxialStage targetStage = (AxialStage)targetComponent.getStage(); + AxialStage eventStage = (AxialStage)testEvent.getSource().getStage(); + AxialStage eventParentStage = eventStage.getUpperStage(); + return ( targetStage.equals(eventParentStage)); + } + }, + NEVER("NEVER", "MotorMount.IgnitionEvent.NEVER") + ; + + private static final Translator trans = Application.getTranslator(); + public final String name; + private final String translationKey; + protected String description=null; + + //public static final IgnitionEvent[] events = {AUTOMATIC, LAUNCH, EJECTION_CHARGE, BURNOUT, NEVER}; + + public boolean isActivationEvent( FlightEvent fe, RocketComponent source){ + // default behavior. Also for the NEVER case. + return false; + } + + private IgnitionEvent(final String _name, final String _key) { + this.name = _name; + this.translationKey = _key; + } + + public boolean equals( final String content){ + String comparator = this.name.toLowerCase(Locale.ENGLISH).replaceAll("_", ""); + return comparator.equals(content); + } + + public String getName(){ + return this.name; + } + + @Override + public String toString() { + if( null == this.description ){ + this.description = trans.get(this.translationKey); + } + return this.description; + } + +} diff --git a/core/src/net/sf/openrocket/motor/Motor.java b/core/src/net/sf/openrocket/motor/Motor.java index 744a6154eb..a6447fd75e 100644 --- a/core/src/net/sf/openrocket/motor/Motor.java +++ b/core/src/net/sf/openrocket/motor/Motor.java @@ -1,7 +1,5 @@ package net.sf.openrocket.motor; -import net.sf.openrocket.util.Coordinate; - public interface Motor { /** @@ -10,11 +8,13 @@ public interface Motor { * @author Sampo Niskanen */ public enum Type { - SINGLE("Single-use", "Single-use solid propellant motor"), - RELOAD("Reloadable", "Reloadable solid propellant motor"), + SINGLE("Single-use", "Single-use solid propellant motor"), + RELOAD("Reloadable", "Reloadable solid propellant motor"), HYBRID("Hybrid", "Hybrid rocket motor engine"), + LIQUID("Liquid","Liquid-fueled rocket motor"), UNKNOWN("Unknown", "Unknown motor type"); - + + private final String name; private final String description; @@ -46,12 +46,16 @@ public String toString() { } } + public static final double PSEUDO_TIME_EMPTY = Double.NaN; + public static final double PSEUDO_TIME_LAUNCH = 0.0; + public static final double PSEUDO_TIME_BURNOUT = Double.MAX_VALUE; + /** * Ejection charge delay value signifying a "plugged" motor with no ejection charge. * The value is that of Double.POSITIVE_INFINITY. */ - public static final double PLUGGED = Double.POSITIVE_INFINITY; + public static final double PLUGGED_DELAY = Double.POSITIVE_INFINITY; /** @@ -116,13 +120,15 @@ public String toString() { public String getDigest(); - public MotorInstance getInstance(); + public double getAverageThrust( final double startTime, final double endTime ); + public double getLaunchCGx(); - public Coordinate getLaunchCG(); + public double getBurnoutCGx(); - public Coordinate getEmptyCG(); + public double getLaunchMass(); + public double getBurnoutMass(); /** * Return an estimate of the burn time of this motor, or NaN if an estimate is unavailable. @@ -143,5 +149,42 @@ public String toString() { * Return an estimate of the total impulse of this motor, or NaN if an estimate is unavailable. */ public double getTotalImpulseEstimate(); + + + double getBurnTime(); + + + /** + * Return the thrust at a time offset from motor ignition + * + * this is probably a badly-designed way to expose the thrust, but it's not worth worrying about until + * there's a second (non-trivial) type of motor to support... + * + * @param motorTime time (in seconds) since motor ignition + * @return thrust (double, in Newtons) at given time + */ + public double getThrust( final double motorTime); + + /** + * Return the mass at a time offset from motor ignition + * + * @param motorTime time (in seconds) since motor ignition + */ + public double getTotalMass( final double motorTime); + + public double getPropellantMass( final Double motorTime); + + /** Return the mass at a given time + * + * @param motorTime time (in seconds) since motor ignition + * @return + */ + public double getCMx( final double motorTime); + + public double getUnitIxx(); + public double getUnitIyy(); + + public double getUnitIzz(); + } diff --git a/core/src/net/sf/openrocket/motor/MotorConfiguration.java b/core/src/net/sf/openrocket/motor/MotorConfiguration.java new file mode 100644 index 0000000000..4920a94211 --- /dev/null +++ b/core/src/net/sf/openrocket/motor/MotorConfiguration.java @@ -0,0 +1,261 @@ +package net.sf.openrocket.motor; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameter; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.InnerTube; +import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Inertia; + +/** + * A single motor configuration. This includes the selected motor + * and the ejection charge delay. + */ +public class MotorConfiguration implements FlightConfigurableParameter { + + private static final Translator trans = Application.getTranslator(); + + private final MotorMount mount; + private final FlightConfigurationId fcid; + private final MotorConfigurationId mid; + + private Motor motor = null; + private double ejectionDelay = 0.0; + + private boolean ignitionOveride = false; + private double ignitionDelay = 0.0; + private IgnitionEvent ignitionEvent = IgnitionEvent.AUTOMATIC; + + private int modID = 0; + + public MotorConfiguration( final MotorMount _mount, final FlightConfigurationId _fcid ) { + if (null == _mount ) { + throw new NullPointerException("Provided MotorMount was null"); + } + if (null == _fcid ) { + throw new NullPointerException("Provided FlightConfigurationId was null"); + } + + this.mount = _mount; + this.fcid = _fcid; + this.mid = new MotorConfigurationId( _mount, _fcid ); + + modID++; + } + + public MotorConfiguration( final MotorMount _mount, final FlightConfigurationId _fcid, final MotorConfiguration _source ) { + this( _mount, _fcid); + + if( null != _source){ + motor = _source.motor; + ejectionDelay = _source.ejectionDelay; + ignitionOveride = _source.ignitionOveride; + ignitionEvent = _source.getIgnitionEvent(); + ignitionDelay = _source.getIgnitionDelay(); + } + } + + public boolean hasIgnitionOverride() { + return ignitionOveride; + } + + public String toMotorDesignation(){ + if( motor == null ){ + return trans.get("empty"); + }else{ + return this.motor.getDesignation(this.getEjectionDelay()); + } + } + + public MotorConfigurationId getID() { + return this.mid; + } + + public FlightConfigurationId getFCID() { + return fcid; + } + + public MotorConfigurationId getMID() { + return mid; + } + + public void setMotor(Motor motor){ + this.motor = motor; + } + + public Motor getMotor() { + return motor; + } + + public MotorMount getMount() { + return mount; + } + + public double getEjectionDelay() { + return this.ejectionDelay; + } + + public void setEjectionDelay(double delay) { + this.ejectionDelay = delay; + } + + public Coordinate getPosition(){ + return new Coordinate( getX(), 0, 0); + } + + public double getX(){ + if( isEmpty()){ + return 0.0; + } + return mount.getLength() - motor.getLength() + mount.getMotorOverhang(); + } + + public void useDefaultIgnition() { + this.ignitionOveride = false; + } + + public double getIgnitionDelay() { + return this.ignitionDelay; + } + + public void setIgnitionDelay(final double _delay) { + this.ignitionDelay = _delay; + this.ignitionOveride = true; + } + + public IgnitionEvent getIgnitionEvent() { + return this.ignitionEvent; + } + + public void setIgnitionEvent(final IgnitionEvent _event) { + this.ignitionEvent = _event; + this.ignitionOveride = true; + } + + + public int getMotorCount() { + if( mount instanceof InnerTube ){ + InnerTube inner = (InnerTube) mount; + return inner.getClusterConfiguration().getClusterCount(); + }else{ + return 1; + } + } + + public Coordinate getOffset( ){ + RocketComponent comp = (RocketComponent) mount; + double delta_x = comp.getLength() + mount.getMotorOverhang() - this.motor.getLength(); + return new Coordinate(delta_x, 0, 0); + } + + public double getUnitLongitudinalInertia() { + if ( motor != null ) { + return Inertia.filledCylinderLongitudinal(motor.getDiameter() / 2, motor.getLength()); + } + return 0.0; + } + + public double getUnitRotationalInertia() { + if ( motor != null ) { + return Inertia.filledCylinderRotational(motor.getDiameter() / 2); + } + return 0.0; + } + + public double getPropellantMass(){ + if ( motor != null ) { + return (motor.getLaunchMass() - motor.getBurnoutMass()); + } + return 0.0; + } + + public boolean isEmpty(){ + return motor == null; + } + + public boolean hasMotor(){ + return ! this.isEmpty(); + } + + @Override + public boolean equals( Object other ){ + if( null == other ){ + return false; + }else if( other instanceof MotorConfiguration ){ + MotorConfiguration omi = (MotorConfiguration)other; + if( this.mid.equals( omi.mid)){ + return true; + } + } + return false; + } + + @Override + public int hashCode() { + return this.mid.hashCode(); + } + + /** + * Create a new instance of this motor instance. The state of the motor is + * identical to this instance and can be used independently from this one. + */ + @Override + public MotorConfiguration clone( ) { + MotorConfiguration clone = new MotorConfiguration( this.mount, this.fcid); + clone.motor = this.motor; + clone.ejectionDelay = this.ejectionDelay; + clone.ignitionOveride = this.ignitionOveride; + clone.ignitionDelay = this.ignitionDelay; + clone.ignitionEvent = this.ignitionEvent; + return clone; + } + + @Override + public MotorConfiguration copy( final FlightConfigurationId copyId){ + MotorConfiguration clone = new MotorConfiguration( this.mount, copyId); + clone.motor = this.motor; + clone.ejectionDelay = this.ejectionDelay; + clone.ignitionOveride = this.ignitionOveride; + clone.ignitionDelay = this.ignitionDelay; + clone.ignitionEvent = this.ignitionEvent; + return clone; + } + + + + public int getModID() { + return modID; + } + + @Override + public void update(){ + } + + public String toDescription(){ + return ( this.toMotorDesignation()+ + " in: "+mount.getDebugName()+ + " ign@: "+this.toIgnitionDescription() ); + } + + public String toIgnitionDescription(){ + return this.ignitionEvent.getName()+" + "+this.ignitionDelay+"s "; + } + + public String toDebugDetail( ) { + StringBuilder buf = new StringBuilder(); + + buf.append(String.format("[in: %28s][fcid %10s][mid %10s][ %8s ign@: %12s]", + mount.getDebugName(), + fcid.toShortKey(), + mid.toDebug(), + toMotorDesignation(), + toIgnitionDescription() )); + + return buf.toString(); + } + + +} diff --git a/core/src/net/sf/openrocket/motor/MotorConfigurationId.java b/core/src/net/sf/openrocket/motor/MotorConfigurationId.java new file mode 100644 index 0000000000..dc9c693628 --- /dev/null +++ b/core/src/net/sf/openrocket/motor/MotorConfigurationId.java @@ -0,0 +1,79 @@ +package net.sf.openrocket.motor; + +import java.util.UUID; + +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.MotorMount; + +/** + * An immutable identifier for a motor instance in a MotorInstanceConfiguration. + * The motor is identified by the ID of its mounting component and a + * positive motor count number. + * + * @author Sampo Niskanen + */ +public final class MotorConfigurationId { + + private final UUID key; + + private final static String ERROR_ID_TEXT = "MotorInstance Error Id".intern(); + private final static UUID ERROR_KEY = new UUID( 62274413, 56768908); + + /** + * Sole constructor. + * + * @param _mount the component ID, must not be null + * @param _fcid the key for a + */ + public MotorConfigurationId(final MotorMount _mount, final FlightConfigurationId _fcid) { + if (null == _mount ) { + throw new NullPointerException("Provided MotorMount was null"); + } + if (null == _fcid ) { + throw new NullPointerException("Provided FlightConfigurationId was null"); + } + + final long mountHash= ((long)_mount.getID().hashCode()) << 32; + final long fcidLower = _fcid.key.getMostSignificantBits(); + this.key = new UUID( mountHash, fcidLower); + } + + @Override + public boolean equals(Object other) { + if (this == other) + return true; + + if (!(other instanceof MotorConfigurationId)) + return false; + + MotorConfigurationId otherId = (MotorConfigurationId) other; + return ( this.key.equals( otherId.key)); + } + + @Override + public int hashCode() { + return key.hashCode(); + } + + public String toDebug(){ + return toShortKey(); + } + + @Override + public String toString(){ + if( this.key == MotorConfigurationId.ERROR_KEY){ + return MotorConfigurationId.ERROR_ID_TEXT; + }else{ + return key.toString(); + } + } + + public String toShortKey() { + final String keyString = key.toString(); + final int lastIndex = -1 + keyString.length(); + final int chunkLen = 4; + + // return the head + tail of the full 64-character id + return (keyString.substring(0,chunkLen)+"/"+keyString.substring(lastIndex - chunkLen,lastIndex)); + } +} diff --git a/core/src/net/sf/openrocket/motor/MotorConfigurationSet.java b/core/src/net/sf/openrocket/motor/MotorConfigurationSet.java new file mode 100644 index 0000000000..0a28467f78 --- /dev/null +++ b/core/src/net/sf/openrocket/motor/MotorConfigurationSet.java @@ -0,0 +1,69 @@ +package net.sf.openrocket.motor; + +import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameterSet; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.MotorMount; + +/** + * FlightConfigurationSet for motors. + * This is used for motors, where the default value is always no motor. + */ +public class MotorConfigurationSet extends FlightConfigurableParameterSet { + public static final int DEFAULT_MOTOR_EVENT_TYPE = ComponentChangeEvent.MOTOR_CHANGE | ComponentChangeEvent.EVENT_CHANGE; + + public MotorConfigurationSet(final MotorMount mount ) { + super( new MotorConfiguration( mount, FlightConfigurationId.DEFAULT_VALUE_FCID )); + } + + /** + * Construct a copy of an existing FlightConfigurationSet. + * + * @param configSet another flightConfiguration to copy data from. + * @param component the rocket component on which events are fired when the parameter values are changed + * @param eventType the event type that will be fired on changes + */ + public MotorConfigurationSet(FlightConfigurableParameterSet sourceSet, final MotorMount newMount) { + // creates a new empty config w/ default value + super( new MotorConfiguration( newMount, FlightConfigurationId.DEFAULT_VALUE_FCID )); + + for( MotorConfiguration sourceConfig : sourceSet ){ + FlightConfigurationId nextFCID = sourceConfig.getFCID(); + MotorConfiguration nextValue = new MotorConfiguration( newMount, nextFCID, sourceConfig); + set( nextFCID, nextValue ); + } + } + + @Override + public void setDefault( MotorConfiguration value) { + throw new UnsupportedOperationException("Cannot change default value of motor configuration"); + } + + @Override + public String toDebug(){ + StringBuilder buffer = new StringBuilder(); + final MotorMount mnt = this.getDefault().getMount(); + buffer.append(String.format(" ====== Dumping MotorConfigurationSet: %d motors in %s ======\n", + this.size(), mnt.getDebugName() )); + + for( FlightConfigurationId loopFCID : this.map.keySet()){ + MotorConfiguration curConfig = this.map.get(loopFCID); + if( this.isDefault(loopFCID)){ + buffer.append( " [DEF]"); + }else{ + buffer.append( " "); + } + + buffer.append(String.format("@%10s=[fcid//%8s][mid//%8s][ %8s ign@: %12s]\n", + loopFCID.toShortKey(), + curConfig.getFCID().toShortKey(), + curConfig.getMID().toShortKey(), + curConfig.toMotorDesignation(), + curConfig.toIgnitionDescription() )); + + } + return buffer.toString(); + } + + +} diff --git a/core/src/net/sf/openrocket/motor/MotorDigest.java b/core/src/net/sf/openrocket/motor/MotorDigest.java index 92f01d3c00..52593975e6 100644 --- a/core/src/net/sf/openrocket/motor/MotorDigest.java +++ b/core/src/net/sf/openrocket/motor/MotorDigest.java @@ -143,9 +143,9 @@ public static String digestMotor(ThrustCurveMotor m) { MotorDigest motorDigest = new MotorDigest(); motorDigest.update(DataType.TIME_ARRAY, m.getTimePoints()); - Coordinate[] cg = m.getCGPoints(); - double[] cgx = new double[cg.length]; - double[] mass = new double[cg.length]; + final Coordinate[] cg = m.getCGPoints(); + final double[] cgx = new double[cg.length]; + final double[] mass = new double[cg.length]; for (int i = 0; i < cg.length; i++) { cgx[i] = cg[i].x; mass[i] = cg[i].weight; diff --git a/core/src/net/sf/openrocket/motor/MotorId.java b/core/src/net/sf/openrocket/motor/MotorId.java deleted file mode 100644 index 126fff1c4d..0000000000 --- a/core/src/net/sf/openrocket/motor/MotorId.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.sf.openrocket.motor; - -/** - * An immutable identifier for a motor instance in a MotorInstanceConfiguration. - * The motor is identified by the ID of its mounting component and a - * positive motor count number. - * - * @author Sampo Niskanen - */ -public final class MotorId { - - private final String componentId; - private final int number; - - - /** - * Sole constructor. - * - * @param componentId the component ID, must not be null - * @param number a positive motor doun5 number - */ - public MotorId(String componentId, int number) { - super(); - - if (componentId == null) { - throw new IllegalArgumentException("Component ID was null"); - } - if (number <= 0) { - throw new IllegalArgumentException("Number must be positive, n=" + number); - } - - // Use intern so comparison can be done using == instead of equals() - this.componentId = componentId.intern(); - this.number = number; - } - - - public String getComponentId() { - return componentId; - } - - public int getNumber() { - return number; - } - - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - - if (!(o instanceof MotorId)) - return false; - - MotorId other = (MotorId)o; - // Comparison with == ok since string is intern()'ed - return this.componentId == other.componentId && this.number == other.number; - } - - - @Override - public int hashCode() { - return componentId.hashCode() + (number << 12); - } - - // TODO: toString() -} diff --git a/core/src/net/sf/openrocket/motor/MotorInstance.java b/core/src/net/sf/openrocket/motor/MotorInstance.java deleted file mode 100644 index ab474a8e94..0000000000 --- a/core/src/net/sf/openrocket/motor/MotorInstance.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.sf.openrocket.motor; - -import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.Monitorable; - -public interface MotorInstance extends Cloneable, Monitorable { - - /** - * Step the motor instance forward in time. - * - * @param time the time to step to, from motor ignition. - * @param acceleration the average acceleration during the step. - * @param cond the average atmospheric conditions during the step. - */ - public void step(double time, double acceleration, AtmosphericConditions cond); - - - /** - * Return the time to which this motor has been stepped. - * @return the current step time. - */ - public double getTime(); - - /** - * Return the average thrust during the last step. - */ - public double getThrust(); - - /** - * Return the average CG location during the last step. - */ - public Coordinate getCG(); - - /** - * Return the average longitudinal moment of inertia during the last step. - * This is the actual inertia, not the unit inertia! - */ - public double getLongitudinalInertia(); - - /** - * Return the average rotational moment of inertia during the last step. - * This is the actual inertia, not the unit inertia! - */ - public double getRotationalInertia(); - - /** - * Return whether this motor still produces thrust. If this method returns false - * the motor has burnt out, and will not produce any significant thrust anymore. - */ - public boolean isActive(); - - - /** - * Create a new instance of this motor instance. The state of the motor is - * identical to this instance and can be used independently from this one. - */ - public MotorInstance clone(); - - - public Motor getParentMotor(); - -} diff --git a/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java b/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java deleted file mode 100644 index 8c23ece43a..0000000000 --- a/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java +++ /dev/null @@ -1,166 +0,0 @@ -package net.sf.openrocket.motor; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration.IgnitionEvent; -import net.sf.openrocket.rocketcomponent.MotorMount; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.Monitorable; - -/** - * A configuration of motor instances identified by a string id. Each motor instance has - * an individual position, ingition time etc. - * - * @author Sampo Niskanen - */ -public final class MotorInstanceConfiguration implements Monitorable, Cloneable { - - private final List ids = new ArrayList(); - private final List unmodifiableIds = Collections.unmodifiableList(ids); - private final List motors = new ArrayList(); - private final List ejectionDelays = new ArrayList(); - private final List mounts = new ArrayList(); - private final List ignitionEvents = new ArrayList(); - private final List ignitionDelays = new ArrayList(); - private final List positions = new ArrayList(); - private final List ignitionTimes = new ArrayList(); - - - private int modID = 0; - - - /** - * Add a motor instance to this configuration. The motor is placed at - * the specified position and with an infinite ignition time (never ignited). - * - * @param id the ID of this motor instance. - * @param motor the motor instance. - * @param mount the motor mount containing this motor - * @param ignitionEvent the ignition event for the motor - * @param ignitionDelay the ignition delay for the motor - * @param position the position of the motor in absolute coordinates. - * @throws IllegalArgumentException if a motor with the specified ID already exists. - */ - public void addMotor(MotorId id, MotorInstance motor, double ejectionDelay, MotorMount mount, - IgnitionEvent ignitionEvent, double ignitionDelay, Coordinate position) { - if (this.ids.contains(id)) { - throw new IllegalArgumentException("MotorInstanceConfiguration already " + - "contains a motor with id " + id); - } - this.ids.add(id); - this.motors.add(motor); - this.ejectionDelays.add(ejectionDelay); - this.mounts.add(mount); - this.ignitionEvents.add(ignitionEvent); - this.ignitionDelays.add(ignitionDelay); - this.positions.add(position); - this.ignitionTimes.add(Double.POSITIVE_INFINITY); - modID++; - } - - /** - * Return a list of all motor IDs in this configuration (not only ones in active stages). - */ - public List getMotorIDs() { - return unmodifiableIds; - } - - public MotorInstance getMotorInstance(MotorId id) { - return motors.get(indexOf(id)); - } - - public double getEjectionDelay(MotorId id) { - return ejectionDelays.get(indexOf(id)); - } - - public MotorMount getMotorMount(MotorId id) { - return mounts.get(indexOf(id)); - } - - public Coordinate getMotorPosition(MotorId id) { - return positions.get(indexOf(id)); - } - - public void setMotorPosition(MotorId id, Coordinate position) { - positions.set(indexOf(id), position); - modID++; - } - - public double getMotorIgnitionTime(MotorId id) { - return ignitionTimes.get(indexOf(id)); - } - - public void setMotorIgnitionTime(MotorId id, double time) { - this.ignitionTimes.set(indexOf(id), time); - modID++; - } - - public double getMotorIgnitionDelay(MotorId id) { - return ignitionDelays.get(indexOf(id)); - } - - public IgnitionEvent getMotorIgnitionEvent(MotorId id) { - return ignitionEvents.get(indexOf(id)); - } - - - private int indexOf(MotorId id) { - int index = ids.indexOf(id); - if (index < 0) { - throw new IllegalArgumentException("MotorInstanceConfiguration does not " + - "contain a motor with id " + id); - } - return index; - } - - - - /** - * Step all of the motor instances to the specified time minus their ignition time. - * @param time the "global" time - */ - public void step(double time, double acceleration, AtmosphericConditions cond) { - for (int i = 0; i < motors.size(); i++) { - double t = time - ignitionTimes.get(i); - if (t >= 0) { - motors.get(i).step(t, acceleration, cond); - } - } - modID++; - } - - @Override - public int getModID() { - int id = modID; - for (MotorInstance motor : motors) { - id += motor.getModID(); - } - return id; - } - - /** - * Return a copy of this motor instance configuration with independent motor instances - * from this instance. - */ - @Override - public MotorInstanceConfiguration clone() { - MotorInstanceConfiguration clone = new MotorInstanceConfiguration(); - clone.ids.addAll(this.ids); - clone.mounts.addAll(this.mounts); - clone.positions.addAll(this.positions); - clone.ejectionDelays.addAll(this.ejectionDelays); - clone.ignitionTimes.addAll(this.ignitionTimes); - clone.ignitionEvents.addAll(this.ignitionEvents); - clone.ignitionDelays.addAll(this.ignitionDelays); - for (MotorInstance motor : this.motors) { - clone.motors.add(motor.clone()); - } - clone.modID = this.modID; - return clone; - } - -} diff --git a/core/src/net/sf/openrocket/motor/ThrustCurveMotor.java b/core/src/net/sf/openrocket/motor/ThrustCurveMotor.java index 888882af9c..3e851f2609 100644 --- a/core/src/net/sf/openrocket/motor/ThrustCurveMotor.java +++ b/core/src/net/sf/openrocket/motor/ThrustCurveMotor.java @@ -5,168 +5,222 @@ import java.util.Arrays; import java.util.Locale; -import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.util.ArrayUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Inertia; import net.sf.openrocket.util.MathUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - public class ThrustCurveMotor implements Motor, Comparable, Serializable { - /** - * - */ private static final long serialVersionUID = -1490333207132694479L; + @SuppressWarnings("unused") private static final Logger log = LoggerFactory.getLogger(ThrustCurveMotor.class); public static final double MAX_THRUST = 10e6; // Comparators: private static final Collator COLLATOR = Collator.getInstance(Locale.US); + static { COLLATOR.setStrength(Collator.PRIMARY); } + private static final DesignationComparator DESIGNATION_COMPARATOR = new DesignationComparator(); - private final String digest; + private String digest; - private final Manufacturer manufacturer; - private final String designation; - private final String description; - private final Motor.Type type; - private final double[] delays; - private final double diameter; - private final double length; - private final double[] time; - private final double[] thrust; - private final Coordinate[] cg; + private Manufacturer manufacturer; + private String designation; + private String description; + private Motor.Type type; + private double[] delays; + private double diameter; + private double length; + private double[] time; + private double[] thrust; + private Coordinate[] cg; + private String caseInfo; + private String propellantInfo; + + private double initialMass; private double maxThrust; - private double burnTime; + private double burnTimeEstimate; private double averageThrust; private double totalImpulse; + private boolean available = true; - /** - * Deep copy constructor. - * Constructs a new ThrustCurveMotor from an existing ThrustCurveMotor. - * @param m - */ - protected ThrustCurveMotor(ThrustCurveMotor m) { - this.digest = m.digest; - this.manufacturer = m.manufacturer; - this.designation = m.designation; - this.description = m.description; - this.type = m.type; - this.delays = ArrayUtils.copyOf(m.delays, m.delays.length); - this.diameter = m.diameter; - this.length = m.length; - this.time = ArrayUtils.copyOf(m.time, m.time.length); - this.thrust = ArrayUtils.copyOf(m.thrust, m.thrust.length); - this.cg = new Coordinate[m.cg.length]; - for (int i = 0; i < cg.length; i++) { - this.cg[i] = m.cg[i].clone(); - } - this.maxThrust = m.maxThrust; - this.burnTime = m.burnTime; - this.averageThrust = m.averageThrust; - this.totalImpulse = m.totalImpulse; - } + private double unitRotationalInertia; + private double unitLongitudinalInertia; - /** - * Sole constructor. Sets all the properties of the motor. - * - * @param manufacturer the manufacturer of the motor. - * @param designation the designation of the motor. - * @param description extra description of the motor. - * @param type the motor type - * @param delays the delays defined for this thrust curve - * @param diameter diameter of the motor. - * @param length length of the motor. - * @param time the time points for the thrust curve. - * @param thrust thrust at the time points. - * @param cg cg at the time points. - */ - public ThrustCurveMotor(Manufacturer manufacturer, String designation, String description, - Motor.Type type, double[] delays, double diameter, double length, - double[] time, double[] thrust, Coordinate[] cg, String digest) { - this.digest = digest; - // Check argument validity - if ((time.length != thrust.length) || (time.length != cg.length)) { - throw new IllegalArgumentException("Array lengths do not match, " + - "time:" + time.length + " thrust:" + thrust.length + - " cg:" + cg.length); - } - if (time.length < 2) { - throw new IllegalArgumentException("Too short thrust-curve, length=" + - time.length); - } - for (int i = 0; i < time.length - 1; i++) { - if (time[i + 1] < time[i]) { - throw new IllegalArgumentException("Time goes backwards, " + - "time[" + i + "]=" + time[i] + " " + - "time[" + (i + 1) + "]=" + time[i + 1]); - } + public static class Builder { + + ThrustCurveMotor motor = new ThrustCurveMotor(); + + public Builder setAverageThrustEstimate(double v) { + motor.averageThrust = v; + return this; } - if (!MathUtil.equals(time[0], 0)) { - throw new IllegalArgumentException("Curve starts at time " + time[0]); + + public Builder setBurnTimeEstimate(double v) { + motor.burnTimeEstimate = v; + return this; } - if (!MathUtil.equals(thrust[0], 0)) { - throw new IllegalArgumentException("Curve starts at thrust " + thrust[0]); + + public Builder setCaseInfo(String v) { + motor.caseInfo = v; + return this; } - if (!MathUtil.equals(thrust[thrust.length - 1], 0)) { - throw new IllegalArgumentException("Curve ends at thrust " + - thrust[thrust.length - 1]); + + public Builder setCGPoints(Coordinate[] cg) { + motor.cg = cg; + return this; } - for (double t : thrust) { - if (t < 0) { - throw new IllegalArgumentException("Negative thrust."); + + public Builder setDescription(String d) { + motor.description = d; + return this; + } + + public Builder setDesignation(String d) { + motor.designation = d; + return this; + } + + public Builder setDiameter(double v) { + motor.diameter = v; + return this; + } + + public Builder setDigest(String d) { + motor.digest = d; + return this; + } + + public Builder setInitialMass(double v) { + motor.initialMass = v; + return this; + } + + public Builder setLength(double v) { + motor.length = v; + return this; + } + + public Builder setManufacturer(Manufacturer m) { + motor.manufacturer = m; + return this; + } + + public Builder setMaxThrustEstimate(double v) { + motor.maxThrust = v; + return this; + } + + public Builder setMotorType(Motor.Type t) { + motor.type = t; + return this; + } + + public Builder setPropellantInfo(String v) { + motor.propellantInfo = v; + return this; + } + + public Builder setStandardDelays(double[] d) { + motor.delays = d; + return this; + } + + public Builder setThrustPoints(double[] d) { + motor.thrust = d; + return this; + } + + public Builder setTimePoints(double[] d) { + motor.time = d; + return this; + } + + public Builder setTotalThrustEstimate(double v) { + motor.totalImpulse = v; + return this; + } + + public Builder setAvailablity(boolean avail) { + motor.available = avail; + return this; + } + + public ThrustCurveMotor build() { + // Check argument validity + if ((motor.time.length != motor.thrust.length) || (motor.time.length != motor.cg.length)) { + throw new IllegalArgumentException("Array lengths do not match, " + + "time:" + motor.time.length + " thrust:" + motor.thrust.length + + " cg:" + motor.cg.length); } - if (t > MAX_THRUST || Double.isNaN(t)) { - throw new IllegalArgumentException("Invalid thrust " + t); + if (motor.time.length < 2) { + throw new IllegalArgumentException("Too short thrust-curve, length=" + motor.time.length); } - } - for (Coordinate c : cg) { - if (c.isNaN()) { - throw new IllegalArgumentException("Invalid CG " + c); + for (int i = 0; i < motor.time.length - 1; i++) { + if (motor.time[i + 1] < motor.time[i]) { + throw new IllegalArgumentException("Time goes backwards, " + + "time[" + i + "]=" + motor.time[i] + " " + + "time[" + (i + 1) + "]=" + motor.time[i + 1]); + } } - if (c.x < 0) { - throw new IllegalArgumentException("Invalid CG position " + String.format("%f", c.x) + ": CG is below the start of the motor."); + if (!MathUtil.equals(motor.time[0], 0)) { + throw new IllegalArgumentException("Curve starts at time " + motor.time[0]); } - if (c.x > length) { - throw new IllegalArgumentException("Invalid CG position: " + String.format("%f", c.x) + ": CG is above the end of the motor."); + if (!MathUtil.equals(motor.thrust[0], 0)) { + throw new IllegalArgumentException("Curve starts at thrust " + motor.thrust[0]); } - if (c.weight < 0) { - throw new IllegalArgumentException("Negative mass " + c.weight + "at time=" + time[Arrays.asList(cg).indexOf(c)]); + if (!MathUtil.equals(motor.thrust[motor.thrust.length - 1], 0)) { + throw new IllegalArgumentException("Curve ends at thrust " + + motor.thrust[motor.thrust.length - 1]); } + for (double t : motor.thrust) { + if (t < 0) { + throw new IllegalArgumentException("Negative thrust."); + } + if (t > MAX_THRUST || Double.isNaN(t)) { + throw new IllegalArgumentException("Invalid thrust " + t); + } + } + for (Coordinate c : motor.cg) { + if (c.isNaN()) { + throw new IllegalArgumentException("Invalid CG " + c); + } + if (c.x < 0) { + throw new IllegalArgumentException("Invalid CG position " + String.format("%f", c.x) + ": CG is below the start of the motor."); + } + if (c.x > motor.length) { + throw new IllegalArgumentException("Invalid CG position: " + String.format("%f", c.x) + ": CG is above the end of the motor."); + } + if (c.weight < 0) { + throw new IllegalArgumentException("Negative mass " + c.weight + "at time=" + motor.time[Arrays.asList(motor.cg).indexOf(c)]); + } + } + + if (motor.type != Motor.Type.SINGLE && motor.type != Motor.Type.RELOAD && + motor.type != Motor.Type.HYBRID && motor.type != Motor.Type.UNKNOWN) { + throw new IllegalArgumentException("Illegal motor type=" + motor.type); + } + + motor.unitRotationalInertia = Inertia.filledCylinderRotational( motor.diameter / 2); + motor.unitLongitudinalInertia = Inertia.filledCylinderLongitudinal( motor.diameter / 2, motor.length); + + motor.computeStatistics(); + + return motor; } - if (type != Motor.Type.SINGLE && type != Motor.Type.RELOAD && - type != Motor.Type.HYBRID && type != Motor.Type.UNKNOWN) { - throw new IllegalArgumentException("Illegal motor type=" + type); - } - - - this.manufacturer = manufacturer; - this.designation = designation; - this.description = description; - this.type = type; - this.delays = delays.clone(); - this.diameter = diameter; - this.length = length; - this.time = time.clone(); - this.thrust = thrust.clone(); - this.cg = cg.clone(); - - computeStatistics(); } - /** * Get the manufacturer of this motor. * @@ -185,6 +239,149 @@ public double[] getTimePoints() { return time.clone(); } + /* + * find the index to data that corresponds to the given time: + * + * Pseudo Index is two parts: + * integer : simple index into the array + * fractional part: [0,1]: weighting to interpolate between the given index and the next index. + * + * @param is time after motor ignition, in seconds + * @return a pseudo index to this motor's data. + */ + protected double getPseudoIndex( final double motorTime ){ + if(( time.length == 0 )||( 0 > motorTime )){ + return Double.NaN; + } + + final int lowerIndex = getIndex( motorTime); + final double fraction = getIndexFraction( motorTime, lowerIndex ); + return ((double)lowerIndex)+fraction; + } + + private int getIndex( final double motorTime ){ + int lowerBoundIndex=0; + int upperBoundIndex=0; + while( ( upperBoundIndex < time.length ) && ( motorTime >= time[upperBoundIndex] )){ + lowerBoundIndex = upperBoundIndex; + ++upperBoundIndex; + } + + return lowerBoundIndex; + } + + private double getIndexFraction( final double motorTime, final int index ){ + final double SNAP_DISTANCE = 0.0001; + + final int lowerBoundIndex= index; + final int upperBoundIndex= index+1; + + // we are already at the end of the time array. + if( upperBoundIndex == time.length ){ + return 0.; + } + + final double lowerBoundTime = time[lowerBoundIndex]; + final double upperBoundTime = time[upperBoundIndex]; + final double timeFraction = motorTime - lowerBoundTime; + final double indexFraction = ( timeFraction ) / ( upperBoundTime - lowerBoundTime ); + + if( SNAP_DISTANCE > indexFraction ){ + // round down to previous index + return 0.; + }else if( (1-SNAP_DISTANCE)< indexFraction ){ + // round up to next index + return 1.; + }else{ + // general case + return indexFraction; + } + } + + @Override + public double getAverageThrust( final double startTime, final double endTime ) { + + int timeIndex = 0; + + while( timeIndex < time.length-2 && startTime > time[timeIndex+1] ) { + timeIndex++; + } + + if ( timeIndex == time.length ) { + return 0.0; + } + + if ( endTime <= time[timeIndex+1] ) { + // we are completely within this time slice so the computation of the average is pretty easy: + double startThrust = MathUtil.map(startTime, time[timeIndex], time[timeIndex+1], thrust[timeIndex], thrust[timeIndex+1]); + double endThrust = MathUtil.map(endTime, time[timeIndex], time[timeIndex+1], thrust[timeIndex], thrust[timeIndex+1]); + return (startThrust + endThrust) / 2.0; + } + + double impulse = 0.0; + + // portion from startTime through time[timeIndex+1] + double startThrust = MathUtil.map(startTime, time[timeIndex], time[timeIndex+1], thrust[timeIndex], thrust[timeIndex+1]); + impulse = (time[timeIndex+1] - startTime) * (startThrust + thrust[timeIndex+1]) / 2.0; + + // Now add the whole steps; + timeIndex++; + while ( timeIndex < time.length -1 && endTime >= time[timeIndex+1] ) { + impulse += (time[timeIndex+1] - time[timeIndex]) * (thrust[timeIndex] + thrust[timeIndex+1]) / 2.0; + timeIndex++; + } + + // Now add the bit after the last time index + if ( timeIndex < time.length -1 ) { + double endThrust = MathUtil.map( endTime, time[timeIndex], time[timeIndex+1], thrust[timeIndex], thrust[timeIndex+1]); + impulse += (endTime - time[timeIndex]) * (thrust[timeIndex] + endThrust) / 2.0; + } + + return impulse / (endTime - startTime); + } + + @Override + public double getThrust( final double motorTime ){ + double pseudoIndex = getPseudoIndex( motorTime ); + + final double thrustAtTime= ThrustCurveMotor.interpolateAtIndex( thrust, pseudoIndex); + return thrustAtTime; + } + + @Override + public double getCMx( final double motorTime ){ + double pseudoIndex = getPseudoIndex( motorTime ); + return this.interpolateCenterOfMassAtIndex( pseudoIndex).x; + } + + + + public String getCaseInfo() { + return caseInfo; + } + + public CaseInfo getCaseInfoEnum() { + return CaseInfo.parse(caseInfo); + } + + public CaseInfo[] getCompatibleCases() { + CaseInfo myCase = getCaseInfoEnum(); + if (myCase == null) { + return new CaseInfo[] {}; + } + return myCase.getCompatibleCases(); + } + + public String getPropellantInfo() { + return propellantInfo; + } + + + public double getInitialMass() { + return initialMass; + } + + /** * Returns the array of thrust points for this thrust curve. * @return an array of thrust samples @@ -193,14 +390,26 @@ public double[] getThrustPoints() { return thrust.clone(); } - /** - * Returns the array of CG points for this thrust curve. - * @return an array of CG samples - */ - public Coordinate[] getCGPoints() { - return cg.clone(); + // /** + // * Returns the array of CG points for this thrust curve. + // * @return an array of CG samples + // */ + // public double[] getCGxPoints() { + // return cgx; + // } + + public Coordinate[] getCGPoints(){ + return cg; } + // /** + // * Returns the array of Mass values for this thrust curve. + // * @return an array of Masses + // */ + // public double[] getMassPoints() { + // return mass; + // } + /** * Return a list of standard delays defined for this motor. * @return a list of standard delays @@ -209,7 +418,6 @@ public double[] getStandardDelays() { return delays.clone(); } - /** * {@inheritDoc} *

@@ -221,6 +429,28 @@ public Type getMotorType() { return type; } + public double getUnitLongitudinalInertia() { + return this.unitLongitudinalInertia; + } + + public double getUnitRotationalInertia() { + return this.unitRotationalInertia; + } + + @Override + public double getUnitIxx() { + return this.unitRotationalInertia; + } + + @Override + public double getUnitIyy() { + return this.unitLongitudinalInertia; + } + + @Override + public double getUnitIzz(){ + return this.unitLongitudinalInertia; + } @Override public String getDesignation() { @@ -248,29 +478,116 @@ public double getLength() { return length; } + @Override + public double getLaunchCGx() { + return cg[0].x;//cgx[0]; + } + + @Override + public double getBurnoutCGx() { + return cg[cg.length - 1].x;// cgx[ cg.length - 1]; + } @Override - public MotorInstance getInstance() { - return new ThrustCurveMotorInstance(); + public double getLaunchMass() { + return cg[0].weight;//mass[0]; } + @Override + public double getBurnoutMass() { + return cg[cg.length-1].weight; //mass[mass.length - 1]; + } @Override - public Coordinate getLaunchCG() { - return cg[0]; + public double getBurnTime() { + return time[time.length-1]; + } + + private static double interpolateAtIndex( final double[] values, final double pseudoIndex ){ + final double SNAP_TOLERANCE = 0.0001; + + final int lowerIndex = (int)pseudoIndex; + final int upperIndex= lowerIndex+1; + + final double lowerFrac = pseudoIndex - ((double) lowerIndex); + final double upperFrac = 1-lowerFrac; + + + // if the pseudo + if( SNAP_TOLERANCE > lowerFrac ){ + // index ~= int ... therefore: + return values[ lowerIndex ]; + }else if( SNAP_TOLERANCE > upperFrac ){ + return values[ upperIndex ]; + } + + final double lowerValue = values[lowerIndex]; + final double upperValue = values[upperIndex]; + + // return simple linear inverse interpolation + return ( lowerValue*upperFrac + upperValue*lowerFrac ); + } + + + /** + * for testing. In practice, the return value should generally match the parameter value, (except for error conditions) + * + * @ignore javadoc ignore + * @param motorTime + * @return the time at requested time + */ + public double getTime( final double motorTime ){ + final double pseudoIndex = getPseudoIndex( motorTime); + final double foundTime = ThrustCurveMotor.interpolateAtIndex( this.time, pseudoIndex); + return foundTime; } @Override - public Coordinate getEmptyCG() { - return cg[cg.length - 1]; + public double getTotalMass( final double motorTime){ + final double pseudoIndex = getPseudoIndex( motorTime); + return interpolateCenterOfMassAtIndex( pseudoIndex).weight; } + public double getPropellantMass(){ + return (getLaunchMass() - getBurnoutMass()); + } + @Override + public double getPropellantMass( final Double motorTime){ + final double pseudoIndex = getPseudoIndex( motorTime); + final double totalMass = interpolateCenterOfMassAtIndex( pseudoIndex).weight; + return totalMass - this.getBurnoutMass(); + } + protected Coordinate interpolateCenterOfMassAtIndex( final double pseudoIndex ){ + final double SNAP_TOLERANCE = 0.0001; + + final double upperFrac = pseudoIndex%1; + final double lowerFrac = 1-upperFrac; + final int lowerIndex = (int)pseudoIndex; + final int upperIndex= lowerIndex+1; + + // if the pseudo index is close to an integer: + if( SNAP_TOLERANCE > (1-lowerFrac) ){ + return cg[ (int) pseudoIndex ]; + }else if( SNAP_TOLERANCE > upperFrac ){ + return cg[ (int)upperIndex ]; + } + + final Coordinate lowerValue = cg[lowerIndex].multiply(lowerFrac); + final Coordinate upperValue = cg[upperIndex].multiply(upperFrac); + + // return simple linear interpolation + return lowerValue.average( upperValue ); + } + + public int getDataSize() { + return this.time.length; + } @Override public double getBurnTimeEstimate() { - return burnTime; + return burnTimeEstimate; } @Override @@ -293,6 +610,13 @@ public String getDigest() { return digest; } + public double getCutOffTime() { + return time[time.length - 1]; + } + + public boolean isAvailable() { + return available; + } /** * Compute the general statistics of this motor. @@ -347,7 +671,7 @@ private void computeStatistics() { // Burn time - burnTime = Math.max(burnEnd - burnStart, 0); + burnTimeEstimate = Math.max(burnEnd - burnStart, 0); // Total impulse and average thrust @@ -373,8 +697,8 @@ private void computeStatistics() { } } - if (burnTime > 0) { - averageThrust /= burnTime; + if (burnTimeEstimate > 0) { + averageThrust /= burnTimeEstimate; } else { averageThrust = 0; } @@ -385,7 +709,7 @@ private void computeStatistics() { ////////// Static methods /** - * Return a String representation of a delay time. If the delay is {@link #PLUGGED}, + * Return a String representation of a delay time. If the delay is {@link #PLUGGED_DELAY}, * returns "P". * * @param delay the delay time. @@ -396,7 +720,7 @@ public static String getDelayString(double delay) { } /** - * Return a String representation of a delay time. If the delay is {@link #PLUGGED}, + * Return a String representation of a delay time. If the delay is {@link #PLUGGED_DELAY}, * plugged is returned. * * @param delay the delay time. @@ -404,7 +728,7 @@ public static String getDelayString(double delay) { * @return the String representation. */ public static String getDelayString(double delay, String plugged) { - if (delay == PLUGGED) + if (delay == PLUGGED_DELAY) return plugged; delay = Math.rint(delay * 10) / 10; if (MathUtil.equals(delay, Math.rint(delay))) @@ -412,169 +736,13 @@ public static String getDelayString(double delay, String plugged) { return "" + delay; } - - - //////// Motor instance implementation //////// - private class ThrustCurveMotorInstance implements MotorInstance { - - private int position; - - // Previous time step value - private double prevTime; - - // Average thrust during previous step - private double stepThrust; - // Instantaneous thrust at current time point - private double instThrust; - - // Average CG during previous step - private Coordinate stepCG; - // Instantaneous CG at current time point - private Coordinate instCG; - - private final double unitRotationalInertia; - private final double unitLongitudinalInertia; - private final Motor parentMotor; - - private int modID = 0; - - public ThrustCurveMotorInstance() { - log.debug("ThrustCurveMotor: Creating motor instance of " + ThrustCurveMotor.this); - position = 0; - prevTime = 0; - instThrust = 0; - stepThrust = 0; - instCG = cg[0]; - stepCG = cg[0]; - unitRotationalInertia = Inertia.filledCylinderRotational(getDiameter() / 2); - unitLongitudinalInertia = Inertia.filledCylinderLongitudinal(getDiameter() / 2, getLength()); - parentMotor = ThrustCurveMotor.this; - } - - @Override - public Motor getParentMotor() { - return parentMotor; - } - - @Override - public double getTime() { - return prevTime; - } - - @Override - public Coordinate getCG() { - return stepCG; - } - - @Override - public double getLongitudinalInertia() { - return unitLongitudinalInertia * stepCG.weight; - } - - @Override - public double getRotationalInertia() { - return unitRotationalInertia * stepCG.weight; - } - - @Override - public double getThrust() { - return stepThrust; - } - - @Override - public boolean isActive() { - return prevTime < time[time.length - 1]; - } - - @Override - public void step(double nextTime, double acceleration, AtmosphericConditions cond) { - - if (!(nextTime >= prevTime)) { - // Also catches NaN - throw new IllegalArgumentException("Stepping backwards in time, current=" + - prevTime + " new=" + nextTime); - } - if (MathUtil.equals(prevTime, nextTime)) { - return; - } - - modID++; - - if (position >= time.length - 1) { - // Thrust has ended - prevTime = nextTime; - stepThrust = 0; - instThrust = 0; - stepCG = cg[cg.length - 1]; - return; - } - - - // Compute average & instantaneous thrust - if (nextTime < time[position + 1]) { - - // Time step between time points - double nextF = MathUtil.map(nextTime, time[position], time[position + 1], - thrust[position], thrust[position + 1]); - stepThrust = (instThrust + nextF) / 2; - instThrust = nextF; - - } else { - - // Portion of previous step - stepThrust = (instThrust + thrust[position + 1]) / 2 * (time[position + 1] - prevTime); - - // Whole steps - position++; - while ((position < time.length - 1) && (nextTime >= time[position + 1])) { - stepThrust += (thrust[position] + thrust[position + 1]) / 2 * - (time[position + 1] - time[position]); - position++; - } - - // End step - if (position < time.length - 1) { - instThrust = MathUtil.map(nextTime, time[position], time[position + 1], - thrust[position], thrust[position + 1]); - stepThrust += (thrust[position] + instThrust) / 2 * - (nextTime - time[position]); - } else { - // Thrust ended during this step - instThrust = 0; - } - - stepThrust /= (nextTime - prevTime); - - } - - // Compute average and instantaneous CG (simple average between points) - Coordinate nextCG; - if (position < time.length - 1) { - nextCG = MathUtil.map(nextTime, time[position], time[position + 1], - cg[position], cg[position + 1]); - } else { - nextCG = cg[cg.length - 1]; - } - stepCG = instCG.add(nextCG).multiply(0.5); - instCG = nextCG; - - // Update time - prevTime = nextTime; - } - - @Override - public MotorInstance clone() { - try { - return (MotorInstance) super.clone(); - } catch (CloneNotSupportedException e) { - throw new BugException("CloneNotSupportedException", e); - } - } - - @Override - public int getModID() { - return modID; - } + /** + * This is the number of data points of measured thrust, CGx, mass, time. + * + * @return return the size of the data arrays + */ + public int getSampleSize(){ + return time.length; } @@ -605,6 +773,5 @@ public int compareTo(ThrustCurveMotor other) { return value; } - - + } diff --git a/core/src/net/sf/openrocket/motor/ThrustCurveMotorPlaceholder.java b/core/src/net/sf/openrocket/motor/ThrustCurveMotorPlaceholder.java index db6b112ba0..fd173d5d6d 100644 --- a/core/src/net/sf/openrocket/motor/ThrustCurveMotorPlaceholder.java +++ b/core/src/net/sf/openrocket/motor/ThrustCurveMotorPlaceholder.java @@ -1,7 +1,6 @@ package net.sf.openrocket.motor; import net.sf.openrocket.util.BugException; -import net.sf.openrocket.util.Coordinate; public class ThrustCurveMotorPlaceholder implements Motor { @@ -74,20 +73,10 @@ public double getDelay() { } @Override - public MotorInstance getInstance() { + public Motor clone() { throw new BugException("Called getInstance on PlaceholderMotor"); } - @Override - public Coordinate getLaunchCG() { - return new Coordinate(length / 2, 0, 0, launchMass); - } - - @Override - public Coordinate getEmptyCG() { - return new Coordinate(length / 2, 0, 0, emptyMass); - } - @Override public double getBurnTimeEstimate() { return Double.NaN; @@ -183,4 +172,68 @@ public String toString() { + ", designation=" + designation + "]"; } + @Override + public double getLaunchCGx() { + return length / 2; + } + + @Override + public double getBurnoutCGx() { + return length / 2; + } + + @Override + public double getLaunchMass() { + return launchMass; + } + + @Override + public double getBurnoutMass() { + return emptyMass; + } + + @Override + public double getThrust(double pseudoIndex) { + return 0; + } + + @Override + public double getAverageThrust(double startTime, double endTime) { + return 0; + } + + @Override + public double getTotalMass(final double motorTime) { + return 0; + } + + @Override + public double getPropellantMass( final Double motorTime){ + return 0.; + } + + @Override + public double getCMx(double pseudoIndex) { + return 0; + } + + @Override + public double getBurnTime() { + return 0; + } + + @Override + public double getUnitIxx() { + return 0.; + } + + @Override + public double getUnitIyy() { + return 0.; + } + + @Override + public double getUnitIzz(){ + return 0.; + } } diff --git a/core/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java b/core/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java index 631b45c905..e33f8189e9 100644 --- a/core/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java +++ b/core/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java @@ -4,11 +4,9 @@ import net.sf.openrocket.aerodynamics.BarrowmanCalculator; import net.sf.openrocket.aerodynamics.FlightConditions; import net.sf.openrocket.document.Simulation; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.startup.Application; @@ -50,8 +48,8 @@ public StabilityDomain(double minimum, boolean minAbsolute, double maximum, bool } - - + + @Override public Pair getDistanceToDomain(Simulation simulation) { Coordinate cp, cg; @@ -64,10 +62,8 @@ public Pair getDistanceToDomain(Simulation simulation) { * Caching would in any case be inefficient since the rocket changes all the time. */ AerodynamicCalculator aerodynamicCalculator = new BarrowmanCalculator(); - MassCalculator massCalculator = new BasicMassCalculator(); - - Configuration configuration = simulation.getConfiguration(); + FlightConfiguration configuration = simulation.getRocket().getSelectedConfiguration(); FlightConditions conditions = new FlightConditions(configuration); conditions.setMach(Application.getPreferences().getDefaultMach()); conditions.setAOA(0); @@ -75,7 +71,7 @@ public Pair getDistanceToDomain(Simulation simulation) { // TODO: HIGH: This re-calculates the worst theta value every time cp = aerodynamicCalculator.getWorstCP(configuration, conditions, null); - cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS); + cg = MassCalculator.calculateLaunch( configuration).getCM(); if (cp.weight > 0.000001) cpx = cp.x; @@ -87,12 +83,12 @@ public Pair getDistanceToDomain(Simulation simulation) { else cgx = Double.NaN; - + // Calculate the reference (absolute or relative) absolute = cpx - cgx; double diameter = 0; - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (c instanceof SymmetricComponent) { double d1 = ((SymmetricComponent) c).getForeRadius() * 2; double d2 = ((SymmetricComponent) c).getAftRadius() * 2; @@ -101,7 +97,7 @@ public Pair getDistanceToDomain(Simulation simulation) { } relative = absolute / diameter; - + Value desc; if (minAbsolute && maxAbsolute) { desc = new Value(absolute, UnitGroup.UNITS_LENGTH); diff --git a/core/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/FlightConfigurationModifier.java b/core/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/FlightConfigurationModifier.java index d25ed55f06..da19f9d50b 100644 --- a/core/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/FlightConfigurationModifier.java +++ b/core/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/FlightConfigurationModifier.java @@ -5,7 +5,7 @@ import net.sf.openrocket.document.Simulation; import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.rocketcomponent.FlightConfigurableParameter; -import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameterSet; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.BugException; @@ -70,8 +70,8 @@ protected E getModifiedObject(Simulation simulation) throws OptimizationExceptio + " with correct ID"); } - FlightConfiguration configs = (FlightConfiguration) configGetter.invoke(c); - return configs.get(simulation.getConfiguration().getFlightConfigurationID()); + FlightConfigurableParameterSet configs = (FlightConfigurableParameterSet) configGetter.invoke(c); + return configs.get(simulation.getRocket().getSelectedConfiguration().getFlightConfigurationID()); } } diff --git a/core/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java b/core/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java index c1fde6aaff..08b67cbd38 100644 --- a/core/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java +++ b/core/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java @@ -8,12 +8,10 @@ import net.sf.openrocket.aerodynamics.FlightConditions; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.startup.Application; @@ -31,7 +29,7 @@ public class StabilityParameter implements OptimizableParameter { private static final Logger log = LoggerFactory.getLogger(StabilityParameter.class); private static final Translator trans = Application.getTranslator(); - + private final boolean absolute; public StabilityParameter(boolean absolute) { @@ -57,17 +55,16 @@ public double computeValue(Simulation simulation) throws OptimizationException { * Caching would in any case be inefficient since the rocket changes all the time. */ AerodynamicCalculator aerodynamicCalculator = new BarrowmanCalculator(); - MassCalculator massCalculator = new BasicMassCalculator(); - - Configuration configuration = simulation.getConfiguration(); + FlightConfiguration configuration = simulation.getRocket().getSelectedConfiguration(); FlightConditions conditions = new FlightConditions(configuration); conditions.setMach(Application.getPreferences().getDefaultMach()); conditions.setAOA(0); conditions.setRollRate(0); cp = aerodynamicCalculator.getWorstCP(configuration, conditions, null); - cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS); + // worst case CM is also + cg = MassCalculator.calculateLaunch(configuration).getCM(); if (cp.weight > 0.000001) cpx = cp.x; @@ -79,13 +76,13 @@ public double computeValue(Simulation simulation) throws OptimizationException { else cgx = Double.NaN; - + // Calculate the reference (absolute or relative) stability = cpx - cgx; if (!absolute) { double diameter = 0; - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (c instanceof SymmetricComponent) { double d1 = ((SymmetricComponent) c).getForeRadius() * 2; double d2 = ((SymmetricComponent) c).getAftRadius() * 2; diff --git a/core/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java b/core/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java index d2c8f55248..ca2446b832 100644 --- a/core/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java +++ b/core/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java @@ -20,7 +20,6 @@ import net.sf.openrocket.rocketcomponent.EllipticalFinSet; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.FreeformFinSet; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; import net.sf.openrocket.rocketcomponent.InternalComponent; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.MassComponent; @@ -130,7 +129,6 @@ public Collection getModifiers(OpenRocketDocument document) // Simulation is used to calculate default min/max values Simulation simulation = new Simulation(rocket); - simulation.getConfiguration().setFlightConfigurationID(null); for (RocketComponent c : rocket) { @@ -191,20 +189,21 @@ public Collection getModifiers(OpenRocketDocument document) setDefaultMinMax(mod, simulation); modifiers.add(mod); - mod = new FlightConfigurationModifier( - trans.get("optimization.modifier.motormount.delay"), - trans.get("optimization.modifier.motormount.delay.desc"), - c, UnitGroup.UNITS_SHORT_TIME, - 1.0, - c.getClass(), - c.getID(), - "IgnitionConfiguration", - IgnitionConfiguration.class, - "IgnitionDelay"); - - mod.setMinValue(0); - mod.setMaxValue(5); - modifiers.add(mod); +// TODO: reimplement motor ignition optimization +// mod = new FlightConfigurationModifier( +// trans.get("optimization.modifier.motormount.delay"), +// trans.get("optimization.modifier.motormount.delay.desc"), +// c, UnitGroup.UNITS_SHORT_TIME, +// 1.0, +// c.getClass(), +// c.getID(), +// "IgnitionConfiguration", +// IgnitionConfiguration.class, +// "IgnitionDelay"); +// +// mod.setMinValue(0); +// mod.setMaxValue(5); +// modifiers.add(mod); } } @@ -216,7 +215,7 @@ public Collection getModifiers(OpenRocketDocument document) trans.get("optimization.modifier.internalcomponent.position"), trans.get("optimization.modifier.internalcomponent.position.desc"), c, UnitGroup.UNITS_LENGTH, - 1.0, c.getClass(), c.getID(), "PositionValue"); + 1.0, c.getClass(), c.getID(), "AxialMethod"); mod.setMinValue(0); mod.setMaxValue(parent.getLength()); modifiers.add(mod); @@ -230,7 +229,7 @@ public Collection getModifiers(OpenRocketDocument document) trans.get("optimization.modifier.finset.position"), trans.get("optimization.modifier.finset.position.desc"), c, UnitGroup.UNITS_LENGTH, - 1.0, c.getClass(), c.getID(), "PositionValue"); + 1.0, c.getClass(), c.getID(), "AxialMethod"); mod.setMinValue(0); mod.setMaxValue(parent.getLength()); modifiers.add(mod); @@ -244,7 +243,7 @@ public Collection getModifiers(OpenRocketDocument document) trans.get("optimization.modifier.launchlug.position"), trans.get("optimization.modifier.launchlug.position.desc"), c, UnitGroup.UNITS_LENGTH, - 1.0, c.getClass(), c.getID(), "PositionValue"); + 1.0, c.getClass(), c.getID(), "AxialMethod"); mod.setMinValue(0); mod.setMaxValue(parent.getLength()); modifiers.add(mod); @@ -253,8 +252,6 @@ public Collection getModifiers(OpenRocketDocument document) // Recovery device deployment altitude and delay if (c instanceof RecoveryDevice) { - RecoveryDevice device = (RecoveryDevice) c; - SimulationModifier mod = new FlightConfigurationModifier( trans.get("optimization.modifier.recoverydevice.deployDelay"), trans.get("optimization.modifier.recoverydevice.deployDelay.desc"), diff --git a/core/src/net/sf/openrocket/preset/ComponentPreset.java b/core/src/net/sf/openrocket/preset/ComponentPreset.java index 0c2921127d..80ac45135f 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPreset.java +++ b/core/src/net/sf/openrocket/preset/ComponentPreset.java @@ -116,6 +116,17 @@ public enum Type { ComponentPreset.OUTER_DIAMETER, ComponentPreset.LENGTH }), + RAIL_BUTTON(new TypedKey[] { + ComponentPreset.MANUFACTURER, + ComponentPreset.PARTNO, + ComponentPreset.DESCRIPTION, + // these are optional / secondary parameters. Probably not necessary to include. + //ComponentPreset.BASE_HEIGHT, + //ComponentPreset.FLANGE_HEIGHT, + //ComponentPreset.INNER_DIAMETER, + ComponentPreset.OUTER_DIAMETER, + ComponentPreset.HEIGHT }), + STREAMER(new TypedKey[] { ComponentPreset.MANUFACTURER, ComponentPreset.PARTNO, @@ -167,6 +178,7 @@ public TypedKey[] getDisplayedColumns() { public final static TypedKey DESCRIPTION = new TypedKey("Description", String.class); public final static TypedKey TYPE = new TypedKey("Type", Type.class); public final static TypedKey LENGTH = new TypedKey("Length", Double.class, UnitGroup.UNITS_LENGTH); + public final static TypedKey HEIGHT = new TypedKey("Height", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey WIDTH = new TypedKey("Width", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey INNER_DIAMETER = new TypedKey("InnerDiameter", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey OUTER_DIAMETER = new TypedKey("OuterDiameter", Double.class, UnitGroup.UNITS_LENGTH); diff --git a/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java b/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java new file mode 100644 index 0000000000..a5607615e8 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java @@ -0,0 +1,214 @@ +package net.sf.openrocket.rocketcomponent; + +import java.util.ArrayList; +import java.util.Collection; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Coordinate; + +public class AxialStage extends ComponentAssembly implements FlightConfigurableComponent { + + private static final Translator trans = Application.getTranslator(); + //private static final Logger log = LoggerFactory.getLogger(AxialStage.class); + + /** list of separations to be happening*/ + protected FlightConfigurableParameterSet separations; + /** number of stages */ + protected int stageNumber; + + /** + * default constructor, builds a rocket with zero stages + */ + public AxialStage(){ + this.separations = new FlightConfigurableParameterSet( new StageSeparationConfiguration()); + this.axialMethod = AxialMethod.AFTER; + this.stageNumber = 0; + } + + /** + * {@inheritDoc} + * AxialStage will always accept children + */ + @Override + public boolean allowsChildren() { + return true; + } + + @Override + public String getComponentName() { + //// Stage + return trans.get("Stage.Stage"); + } + + /** + * gets the separation configuration of the rocket + * @return the separation configuration of the rocket + */ + public FlightConfigurableParameterSet getSeparationConfigurations() { + return separations; + } + + @Override + public void reset( final FlightConfigurationId fcid){ + separations.reset(fcid); + } + + /** + * {@inheritDoc} + * not strictly accurate, but this should provide an acceptable estimate for total vehicle size + */ + @Override + public Collection getComponentBounds() { + Collection bounds = new ArrayList(8); + Coordinate[] instanceLocations = this.getInstanceLocations(); + double x_min = instanceLocations[0].x; + double x_max = x_min + this.length; + double r_max = 0; + + addBound(bounds, x_min, r_max); + addBound(bounds, x_max, r_max); + + return bounds; + } + + /** + * Check whether the given type can be added to this component. A Stage allows + * only BodyComponents to be added. + * + * @param type The RocketComponent class type to add. + * + * @return Whether such a component can be added. + */ + @Override + public boolean isCompatible(Class type) { + return BodyComponent.class.isAssignableFrom(type); + } + + @Override + public void copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId) { + separations.copyFlightConfiguration(oldConfigId, newConfigId); + } + + @Override + protected RocketComponent copyWithOriginalID() { + AxialStage copy = (AxialStage) super.copyWithOriginalID(); + copy.separations = new FlightConfigurableParameterSet(separations); + return copy; + } + + + /** + * Stages may be positioned relative to other stages. In that case, this will set the stage number + * against which this stage is positioned. + * + * @return the stage number which this stage is positioned relative to + */ + public int getRelativeToStage() { + if (null == this.parent) { + return -1; + } else if(1 == this.getInstanceCount()){ + return --this.stageNumber; + } else { + return this.parent.getStageNumber(); + } + } + + @Override + public int getStageNumber() { + return this.stageNumber; + } + + /** + * {@inheritDoc} + * axialStage is always after + */ + @Override + public boolean isAfter(){ + return true; + } + + /** + * returns if the object is a launch stage + * @return if the object is a launch stage + */ + public boolean isLaunchStage(){ + return ( this instanceof ParallelStage ) + ||( getRocket().getBottomCoreStage().equals(this)); + } + + /** + * sets the stage number + * @param newStageNumber + */ + public void setStageNumber(final int newStageNumber) { + this.stageNumber = newStageNumber; + } + + @Override + protected StringBuilder toDebugDetail() { + StringBuilder buf = super.toDebugDetail(); + // if (-1 == this.getRelativeToStage()) { + // System.err.println(" >>refStageName: " + null + "\n"); + // } else { + // Stage refStage = (Stage) this.parent; + // System.err.println(" >>refStageName: " + refStage.getName() + "\n"); + // System.err.println(" ..refCenterX: " + refStage.position.x + "\n"); + // System.err.println(" ..refLength: " + refStage.getLength() + "\n"); + // } + return buf; + } + + /** + * method used for debugging separation + * @return a string that represents the debug message of separation + */ + public String toDebugSeparation() { + StringBuilder buff = new StringBuilder(); + buff.append( this.separations.toDebug() ); + return buff.toString(); + } + + /** + * gets the previous stage installed in the rockets + * returns null if this is the first stage + * @return the previous stage in the rocket + */ + public AxialStage getUpperStage() { + if( null == this.parent ) { + return null; + }else if(Rocket.class.isAssignableFrom(this.parent.getClass()) ){ + final int thisIndex = getStageNumber(); + if( 0 < thisIndex ){ + return (AxialStage)parent.getChild(thisIndex-1); + } + }else { + return this.parent.getStage(); + } + return null; + } + + @Override + public void toDebugTreeNode(final StringBuilder buffer, final String indent) { + + Coordinate[] relCoords = this.getInstanceOffsets(); + Coordinate[] absCoords = this.getComponentLocations(); + if( 1 == getInstanceCount()){ + buffer.append(String.format("%-40s| %5.3f; %24s; %24s;", indent+this.getName()+" (# "+this.getStageNumber()+")", + this.getLength(), this.getPosition(), this.getComponentLocations()[0])); + buffer.append(String.format("len: %6.4f )(offset: %4.1f via: %s )\n", this.getLength(), this.getAxialOffset(), this.axialMethod.name() )); + }else{ + buffer.append(String.format("%-40s|(len: %6.4f )(offset: %4.1f via: %s)\n", (indent+this.getName()+"(# "+this.getStageNumber()+")"), this.getLength(), this.getAxialOffset(), this.axialMethod.name() )); + for (int instanceNumber = 0; instanceNumber < this.getInstanceCount(); instanceNumber++) { + Coordinate instanceRelativePosition = relCoords[instanceNumber]; + Coordinate instanceAbsolutePosition = absCoords[instanceNumber]; + final String prefix = String.format("%s [%2d/%2d]", indent, instanceNumber+1, getInstanceCount()); + buffer.append(String.format("%-40s| %5.3f; %24s; %24s;\n", prefix, this.getLength(), instanceRelativePosition, instanceAbsolutePosition)); + } + } + + } + + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java b/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java index 6f4d7dbe4a..62f1dab0f8 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java @@ -1,6 +1,7 @@ package net.sf.openrocket.rocketcomponent; import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; @@ -22,7 +23,7 @@ public abstract class BodyComponent extends ExternalComponent { * i.e. body components come after one another. */ public BodyComponent() { - super(RocketComponent.Position.AFTER); + super( AxialMethod.AFTER); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java b/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java index f9ae720cad..be4d06a9ac 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java +++ b/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java @@ -2,11 +2,15 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfigurationSet; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; @@ -24,31 +28,24 @@ public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial private boolean autoRadius = false; // Radius chosen automatically based on parent component // When changing the inner radius, thickness is modified - - private boolean motorMount = false; private double overhang = 0; + private boolean isActingMount = false; - private FlightConfigurationImpl motorConfigurations; - private FlightConfigurationImpl ignitionConfigurations; - + private MotorConfigurationSet motors; public BodyTube() { this(8 * DEFAULT_RADIUS, DEFAULT_RADIUS); this.autoRadius = true; - - this.motorConfigurations = new MotorFlightConfigurationImpl(this, ComponentChangeEvent.MOTOR_CHANGE, MotorConfiguration.NO_MOTORS); - this.ignitionConfigurations = new FlightConfigurationImpl(this, ComponentChangeEvent.EVENT_CHANGE, new IgnitionConfiguration()); } + // root ctor. Always called by other ctors public BodyTube(double length, double radius) { super(); this.outerRadius = Math.max(radius, 0); this.length = Math.max(length, 0); - this.motorConfigurations = new MotorFlightConfigurationImpl(this, ComponentChangeEvent.MOTOR_CHANGE, MotorConfiguration.NO_MOTORS); - this.ignitionConfigurations = new FlightConfigurationImpl(this, ComponentChangeEvent.EVENT_CHANGE, new IgnitionConfiguration()); + motors = new MotorConfigurationSet(this); } - public BodyTube(double length, double radius, boolean filled) { this(length, radius); this.filled = filled; @@ -95,7 +92,6 @@ public double getOuterRadius() { return outerRadius; } - /** * Set the outer radius of the body tube. If the radius is less than the wall thickness, * the wall thickness is decreased accordingly of the value of the radius. @@ -311,14 +307,41 @@ private static double getFilledVolume(double r, double l) { @Override public Collection getComponentBounds() { Collection bounds = new ArrayList(8); - double r = getOuterRadius(); - addBound(bounds, 0, r); - addBound(bounds, length, r); + double x_min_shape = 0; + double x_max_shape = this.length; + double r_max_shape = getOuterRadius(); + + Coordinate[] locs = this.getLocations(); + // not strictly accurate, but this should provide an acceptable estimate for total vehicle size + double x_min_inst = Double.MAX_VALUE; + double x_max_inst = Double.MIN_VALUE; + double r_max_inst = 0.0; + + // refactor: get component inherent bounds + for (Coordinate cur : locs) { + double x_cur = cur.x; + double r_cur = MathUtil.hypot(cur.y, cur.z); + if (x_min_inst > x_cur) { + x_min_inst = x_cur; + } + if (x_max_inst < x_cur) { + x_max_inst = x_cur; + } + if (r_cur > r_max_inst) { + r_max_inst = r_cur; + } + } + + // combine the position bounds with the inherent shape bounds + double x_min = x_min_shape + x_min_inst; + double x_max = x_max_shape + x_max_inst; + double r_max = r_max_shape + r_max_inst; + + addBoundingBox(bounds, x_min, x_max, r_max); return bounds; } - /** * Check whether the given type can be added to this component. BodyTubes allow any * InternalComponents or ExternalComponents, excluding BodyComponents, to be added. @@ -328,6 +351,11 @@ public Collection getComponentBounds() { */ @Override public boolean isCompatible(Class type) { + if (ParallelStage.class.isAssignableFrom(type)) + return true; + if (PodSet.class.isAssignableFrom(type)) + return true; + if (InternalComponent.class.isAssignableFrom(type)) return true; if (ExternalComponent.class.isAssignableFrom(type) && @@ -338,65 +366,75 @@ public boolean isCompatible(Class type) { //////////////// Motor mount ///////////////// - @Override - public FlightConfiguration getMotorConfiguration() { - return motorConfigurations; + public MotorConfiguration getDefaultMotorConfig(){ + return this.motors.getDefault(); } - @Override - public FlightConfiguration getIgnitionConfiguration() { - return ignitionConfigurations; + public MotorConfiguration getMotorConfig( final FlightConfigurationId fcid){ + return this.motors.get(fcid); + } + + @Override + public void setMotorConfig( final MotorConfiguration newMotorConfig, final FlightConfigurationId fcid){ + if(null == newMotorConfig){ + this.motors.set( fcid, null); + }else{ + if( this != newMotorConfig.getMount() ){ + throw new BugException(" attempt to add a MotorConfig to a second mount! "); + } + + this.motors.set(fcid,newMotorConfig); + } + + this.isActingMount=true; + + // this is done automatically in the motorSet + //fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); } - @Override - public void cloneFlightConfiguration(String oldConfigId, String newConfigId) { - motorConfigurations.cloneFlightConfiguration(oldConfigId, newConfigId); - ignitionConfigurations.cloneFlightConfiguration(oldConfigId, newConfigId); + public Iterator getMotorIterator(){ + return this.motors.iterator(); } - @Override - public boolean isMotorMount() { - return motorMount; + public void reset( final FlightConfigurationId fcid){ + this.motors.reset(fcid); } - - + @Override - public void setMotorMount(boolean mount) { - if (motorMount == mount) - return; - motorMount = mount; - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); + public void copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId) { + motors.copyFlightConfiguration(oldConfigId, newConfigId); } - - - @SuppressWarnings("deprecation") - @Deprecated @Override - public Motor getMotor(String id) { - return this.motorConfigurations.get(id).getMotor(); + public void setMotorMount(boolean _active){ + if (this.isActingMount == _active) + return; + this.isActingMount = _active; + fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); + } + + @Override + public boolean isMotorMount(){ + return this.isActingMount; } - - @SuppressWarnings("deprecation") - @Deprecated @Override - public double getMotorDelay(String id) { - return this.motorConfigurations.get(id).getEjectionDelay(); + public boolean hasMotor() { + // the default MotorInstance is the EMPTY_INSTANCE. + // If the class contains more instances, at least one will have motors. + return ( 1 < this.motors.size()); } - - @SuppressWarnings("deprecation") - @Deprecated + @Override public int getMotorCount() { - return 1; + return this.motors.size(); } - + @Override public double getMotorMountDiameter() { return getInnerRadius() * 2; @@ -418,22 +456,30 @@ public void setMotorOverhang(double overhang) { @Override - public Coordinate getMotorPosition(String id) { - Motor motor = getMotor(id); + public Coordinate getMotorPosition(FlightConfigurationId id) { + Motor motor = this.motors.get(id).getMotor(); if (motor == null) { throw new IllegalArgumentException("No motor with id " + id + " defined."); } return new Coordinate(this.getLength() - motor.getLength() + this.getMotorOverhang()); } - - + + @Override + public String toMotorDebug(){ + return this.motors.toDebug(); + } @Override protected RocketComponent copyWithOriginalID() { BodyTube copy = (BodyTube) super.copyWithOriginalID(); - copy.motorConfigurations = new FlightConfigurationImpl(motorConfigurations, copy, ComponentChangeEvent.MOTOR_CHANGE); - copy.ignitionConfigurations = new FlightConfigurationImpl(ignitionConfigurations, copy, ComponentChangeEvent.EVENT_CHANGE); + + copy.motors = new MotorConfigurationSet( this.motors, copy ); return copy; } + + @Override + public ClusterConfiguration getClusterConfiguration() { + return ClusterConfiguration.SINGLE; + } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java b/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java index 36822c4d0b..deedd08146 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Bulkhead.java @@ -8,7 +8,8 @@ public class Bulkhead extends RadiusRingComponent { private static final Translator trans = Application.getTranslator(); - + + public Bulkhead() { setOuterRadiusAutomatic(true); setLength(0.002); diff --git a/core/src/net/sf/openrocket/rocketcomponent/CenteringRing.java b/core/src/net/sf/openrocket/rocketcomponent/CenteringRing.java index 0dc9e1ee34..be94964ec7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/CenteringRing.java +++ b/core/src/net/sf/openrocket/rocketcomponent/CenteringRing.java @@ -77,5 +77,6 @@ public boolean isCompatible(Class type) { public Type getPresetType() { return ComponentPreset.Type.CENTERING_RING; } - + + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ClusterConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/ClusterConfiguration.java index 73e8a6dee7..7a8ba768e3 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ClusterConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ClusterConfiguration.java @@ -52,7 +52,13 @@ public class ClusterConfiguration { Math.sin(2*Math.PI*3/5),Math.cos(2*Math.PI*3/5), Math.sin(2*Math.PI*4/5),Math.cos(2*Math.PI*4/5)), new ClusterConfiguration("6-star", 0,0, 0,1, SQRT3/2,0.5, SQRT3/2,-0.5, - 0,-1, -SQRT3/2,-0.5, -SQRT3/2,0.5) + 0,-1, -SQRT3/2,-0.5, -SQRT3/2,0.5), + new ClusterConfiguration("9-grid", -1.4,1.4, 0,1.4, 1.4,1.4, + -1.4,0, 0,0, 1.4,0, + -1.4,-1.4, 0,-1.4, 1.4,-1.4), + new ClusterConfiguration("9-star", 0, 0, + 1.4,0, 1.4/SQRT2,-1.4/SQRT2, 0,-1.4, -1.4/SQRT2,-1.4/SQRT2, + -1.4,0, -1.4/SQRT2,1.4/SQRT2, 0,1.4, 1.4/SQRT2,1.4/SQRT2) }; diff --git a/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java b/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java index fba858b1ec..b93a655412 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Clusterable.java @@ -2,10 +2,13 @@ import net.sf.openrocket.util.ChangeSource; -public interface Clusterable extends ChangeSource { - +public interface Clusterable extends ChangeSource, Instanceable { + public ClusterConfiguration getClusterConfiguration(); + public void setClusterConfiguration(ClusterConfiguration cluster); + public double getClusterSeparation(); + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java b/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java index de5b78d26d..24468aeb33 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java @@ -2,7 +2,14 @@ import java.util.Collection; import java.util.Collections; +import java.util.Iterator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; +import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; @@ -15,32 +22,47 @@ * * @author Sampo Niskanen */ -public abstract class ComponentAssembly extends RocketComponent { - +public abstract class ComponentAssembly extends RocketComponent implements AxialPositionable { + private static final Logger log = LoggerFactory.getLogger(ComponentAssembly.class); + /** * Sets the position of the components to POSITION_RELATIVE_AFTER. * (Should have no effect.) */ public ComponentAssembly() { - super(RocketComponent.Position.AFTER); + super( AxialMethod.AFTER); + } + + public ComponentAssembly( final AxialMethod initialAxialMethod) { + super(initialAxialMethod); + } + + @Override + public boolean allowsChildren(){ + return true; } + @Override + public double getAxialOffset() { + return getAxialOffset( this.axialMethod ); + } + /** * Null method (ComponentAssembly has no bounds of itself). */ @Override - public Collection getComponentBounds() { + public Collection getComponentBounds() { return Collections.emptyList(); } - + /** * Null method (ComponentAssembly has no mass of itself). */ @Override public Coordinate getComponentCG() { - return Coordinate.NUL; + return Coordinate.ZERO; } - + /** * Null method (ComponentAssembly has no mass of itself). */ @@ -57,6 +79,11 @@ public double getLongitudinalUnitInertia() { return 0; } + @Override + public boolean getOverrideSubcomponents() { + return true; + } + /** * Null method (ComponentAssembly has no mass of itself). */ @@ -64,6 +91,22 @@ public double getLongitudinalUnitInertia() { public double getRotationalUnitInertia() { return 0; } + + public double getBoundingRadius(){ + double outerRadius=0; + for( RocketComponent comp : children ){ + double thisRadius=0; + if( comp instanceof BodyTube ){ + thisRadius = ((BodyTube)comp).getOuterRadius(); + }else if( comp instanceof Transition ){ + Transition trans = (Transition)comp; + thisRadius = Math.max( trans.getForeRadius(), trans.getAftRadius()); + } + + outerRadius = Math.max( outerRadius, thisRadius); + } + return outerRadius; + } /** * Components have no aerodynamic effect, so return false. @@ -83,10 +126,38 @@ public boolean isMassive() { } @Override - public boolean getOverrideSubcomponents() { - return true; + public boolean isAxisymmetric(){ + return !(2 == this.getInstanceCount()); } - + + @Override + public void setAxialOffset(final double _pos) { + this.updateBounds(); + super.setAxialOffset(this.axialMethod, _pos); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public void setAxialMethod( final AxialMethod newMethod ) { + if (null == this.parent) { + throw new NullPointerException(" a Stage requires a parent before any positioning! "); + } + if ((this instanceof ParallelStage ) || ( this instanceof PodSet )){ + if (AxialMethod.AFTER == newMethod) { + log.warn("Stages (or Pods) cannot be relative to other stages via AFTER! Ignoring."); + super.setAxialMethod(AxialMethod.TOP); + } else { + super.setAxialMethod(newMethod); + } + }else if( this.getClass().equals( AxialStage.class)){ + // Centerline stages must be set via AFTER-- regardless of what was requested: + super.setAxialMethod(AxialMethod.AFTER); + }else{ + throw new BugException("Unrecognized subclass of Component Assembly. Please update this method."); + } + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); + } + @Override public void setOverrideSubcomponents(boolean override) { // No-op @@ -97,4 +168,42 @@ public boolean isOverrideSubcomponentsEnabled() { return false; } + @Override + protected void update() { + this.updateBounds(); + if (this.isAfter()){ + this.setAfter(); + } else { + super.update(); + } + + this.updateChildSequence(); + + return; + } + + + @Override + public void updateBounds() { + // currently only updates the length + this.length = 0; + Iterator childIterator = this.getChildren().iterator(); + while (childIterator.hasNext()) { + RocketComponent curChild = childIterator.next(); + if(curChild.isAfter()){ + this.length += curChild.getLength(); + } + } + + } + + protected void updateChildSequence() { + for( RocketComponent curChild : this.children ) { + if(AxialMethod.AFTER == curChild.getAxialMethod()){ + curChild.setAfter(); + } + } + } + + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java b/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java index ff5d6c8b1e..ffeab7f0c1 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java @@ -5,41 +5,88 @@ public class ComponentChangeEvent extends EventObject { private static final long serialVersionUID = 1L; + public enum TYPE { + ERROR(-1, "Error"), + NON_FUNCTIONAL(1, "nonFunctional"), + MASS(2, "Mass"), + AERODYNAMIC(4, "Aerodynamic"), + TREE( 8, "TREE"), + UNDO( 16, "UNDO"), + MOTOR( 32, "Motor"), + EVENT( 64, "Event"), + TEXTURE ( 128, "Texture") + , GRAPHIC( 256, "Configuration") + ; + + protected int value; + protected String name; + + private TYPE( final int _val, final String _name){ + this.value = _val; + this.name = _name; + } + + public boolean matches( final int testValue ){ + return (0 != (this.value & testValue )); + } + + }; /** A change that does not affect simulation results in any way (name, color, etc.) */ - public static final int NONFUNCTIONAL_CHANGE = 1; + public static final int NONFUNCTIONAL_CHANGE = TYPE.NON_FUNCTIONAL.value; /** A change that affects the mass properties of the rocket */ - public static final int MASS_CHANGE = 2; + public static final int MASS_CHANGE = TYPE.MASS.value; /** A change that affects the aerodynamic properties of the rocket */ - public static final int AERODYNAMIC_CHANGE = 4; + public static final int AERODYNAMIC_CHANGE = TYPE.AERODYNAMIC.value; /** A change that affects the mass and aerodynamic properties of the rocket */ - public static final int BOTH_CHANGE = MASS_CHANGE | AERODYNAMIC_CHANGE; // Mass & Aerodynamic + public static final int AEROMASS_CHANGE = (TYPE.MASS.value | TYPE.AERODYNAMIC.value ); + public static final int BOTH_CHANGE = AEROMASS_CHANGE; // syntactic sugar / backward compatibility + /** A change that affects the rocket tree structure */ - public static final int TREE_CHANGE = 8; + public static final int TREE_CHANGE = TYPE.TREE.value; /** A change caused by undo/redo. */ - public static final int UNDO_CHANGE = 16; + public static final int UNDO_CHANGE = TYPE.UNDO.value; /** A change in the motor configurations or names */ - public static final int MOTOR_CHANGE = 32; + public static final int MOTOR_CHANGE = TYPE.MOTOR.value; /** A change that affects the events occurring during flight. */ - public static final int EVENT_CHANGE = 64; + public static final int EVENT_CHANGE = TYPE.EVENT.value; /** A change to the 3D texture assigned to a component*/ - public static final int TEXTURE_CHANGE = 128; - - /** A bit-field that contains all possible change types. */ - public static final int ALL_CHANGE = 0xFFFFFFFF; - + public static final int TEXTURE_CHANGE = TYPE.TEXTURE.value; + // when a flight configuration fires an event, it is of this type + // UI-only change, but does not effect the true + public static final int GRAPHIC_CHANGE = TYPE.GRAPHIC.value; + + //// A bit-field that contains all possible change types. + //// Will output as -1. for an explanation, see "twos-complement" representation of signed integers + //public static final int ALL_CHANGE = 0xFFFFFFFF; + private final int type; - public ComponentChangeEvent(RocketComponent component, int type) { + public ComponentChangeEvent(RocketComponent component, final int type) { super(component); - if (type == 0) { + this.type = type; + } + + + public ComponentChangeEvent(RocketComponent component, final ComponentChangeEvent.TYPE type) { + super(component); + if ((TYPE.ERROR == type)||(null== type)) { throw new IllegalArgumentException("no event type provided"); } - this.type = type; + this.type = type.value; } + + public static TYPE getTypeEnum( final int typeNumber ){ + for( TYPE ccet : ComponentChangeEvent.TYPE.values() ){ + if( ccet.value == typeNumber ){ + return ccet; + } + } + throw new IllegalArgumentException(" type number "+typeNumber+" is not a valid Type enum..."); + } /** * Return the source component of this event as specified in the constructor. @@ -49,43 +96,53 @@ public RocketComponent getSource() { return (RocketComponent) super.getSource(); } - public boolean isTextureChange() { - return (type & TEXTURE_CHANGE) != 0; + public boolean isAerodynamicChange() { + return TYPE.AERODYNAMIC.matches( this.type); } - public boolean isAerodynamicChange() { - return (type & AERODYNAMIC_CHANGE) != 0; + + public boolean isEventChange() { + return TYPE.EVENT.matches( this.type); + } + + public boolean isFunctionalChange() { + return ! this.isNonFunctionalChange(); } - public boolean isMassChange() { - return (type & MASS_CHANGE) != 0; + public boolean isNonFunctionalChange() { + return (TYPE.NON_FUNCTIONAL.matches( this.type)); } - public boolean isOtherChange() { - return (type & BOTH_CHANGE) == 0; + public boolean isMassChange() { + return TYPE.MASS.matches(this.type); + } + + public boolean isTextureChange() { + return TYPE.TEXTURE.matches(this.type); } public boolean isTreeChange() { - return (type & TREE_CHANGE) != 0; + return TYPE.TREE.matches(this.type); } public boolean isUndoChange() { - return (type & UNDO_CHANGE) != 0; + return TYPE.UNDO.matches(this.type); } + public boolean isMotorChange() { - return (type & MOTOR_CHANGE) != 0; + return TYPE.MOTOR.matches(this.type); } public int getType() { - return type; + return this.type; } @Override public String toString() { String s = ""; - if ((type & NONFUNCTIONAL_CHANGE) != 0) + if (isNonFunctionalChange()) s += ",nonfunc"; if (isMassChange()) s += ",mass"; @@ -97,7 +154,7 @@ public String toString() { s += ",undo"; if (isMotorChange()) s += ",motor"; - if ((type & EVENT_CHANGE) != 0) + if (isEventChange()) s += ",event"; if (s.length() > 0) diff --git a/core/src/net/sf/openrocket/rocketcomponent/Configuration.java b/core/src/net/sf/openrocket/rocketcomponent/Configuration.java deleted file mode 100644 index e426df1d7c..0000000000 --- a/core/src/net/sf/openrocket/rocketcomponent/Configuration.java +++ /dev/null @@ -1,468 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import java.util.BitSet; -import java.util.Collection; -import java.util.Collections; -import java.util.EventListener; -import java.util.EventObject; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; - -import net.sf.openrocket.util.ArrayList; -import net.sf.openrocket.util.BugException; -import net.sf.openrocket.util.ChangeSource; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.MathUtil; -import net.sf.openrocket.util.Monitorable; -import net.sf.openrocket.util.StateChangeListener; - - -/** - * A class defining a rocket configuration, including motors and which stages are active. - * - * TODO: HIGH: Remove motor ignition times from this class. - * - * @author Sampo Niskanen - */ -public class Configuration implements Cloneable, ChangeSource, ComponentChangeListener, - Iterable, Monitorable { - - private Rocket rocket; - private BitSet stages = new BitSet(); - - private String flightConfigurationId = null; - - private List listenerList = new ArrayList(); - - - /* Cached data */ - private int boundsModID = -1; - private ArrayList cachedBounds = new ArrayList(); - private double cachedLength = -1; - - private int refLengthModID = -1; - private double cachedRefLength = -1; - - - private int modID = 0; - - - /** - * Create a new configuration with the specified Rocket with - * null motor configuration. - * - * @param rocket the rocket - */ - public Configuration(Rocket rocket) { - this.rocket = rocket; - setAllStages(); - rocket.addComponentChangeListener(this); - } - - - - public Rocket getRocket() { - return rocket; - } - - - public void setAllStages() { - stages.clear(); - stages.set(0, rocket.getStageCount()); - fireChangeEvent(); - } - - - /** - * Set all stages up to and including the given stage number. For example, - * setToStage(0) will set only the first stage active. - * - * @param stage the stage number. - */ - public void setToStage(int stage) { - stages.clear(); - stages.set(0, stage + 1, true); - // stages.set(stage+1, rocket.getStageCount(), false); - fireChangeEvent(); - } - - public void setOnlyStage(int stage) { - stages.clear(); - stages.set(stage, stage + 1, true); - fireChangeEvent(); - } - - /** - * Check whether the up-most stage of the rocket is in this configuration. - * - * @return true if the first stage is active in this configuration. - */ - public boolean isHead() { - return isStageActive(0); - } - - - - /** - * Check whether the stage specified by the index is active. - */ - public boolean isStageActive(int stage) { - if (stage >= rocket.getStageCount()) - return false; - return stages.get(stage); - } - - public int getStageCount() { - return rocket.getStageCount(); - } - - public int getActiveStageCount() { - int count = 0; - int s = rocket.getStageCount(); - - for (int i = 0; i < s; i++) { - if (stages.get(i)) - count++; - } - return count; - } - - public int[] getActiveStages() { - int stageCount = rocket.getStageCount(); - List active = new ArrayList(); - int[] ret; - - for (int i = 0; i < stageCount; i++) { - if (stages.get(i)) { - active.add(i); - } - } - - ret = new int[active.size()]; - for (int i = 0; i < ret.length; i++) { - ret[i] = active.get(i); - } - - return ret; - } - - - /** - * Return the reference length associated with the current configuration. The - * reference length type is retrieved from the Rocket. - * - * @return the reference length for this configuration. - */ - public double getReferenceLength() { - if (rocket.getModID() != refLengthModID) { - refLengthModID = rocket.getModID(); - cachedRefLength = rocket.getReferenceType().getReferenceLength(this); - } - return cachedRefLength; - } - - - public double getReferenceArea() { - return Math.PI * MathUtil.pow2(getReferenceLength() / 2); - } - - - public String getFlightConfigurationID() { - return flightConfigurationId; - } - - public void setFlightConfigurationID(String id) { - if ((flightConfigurationId == null && id == null) || - (id != null && id.equals(flightConfigurationId))) - return; - - flightConfigurationId = id; - fireChangeEvent(); - } - - - - /** - * Removes the listener connection to the rocket and listeners of this object. - * This configuration may not be used after a call to this method! - */ - public void release() { - rocket.removeComponentChangeListener(this); - listenerList = new ArrayList(); - rocket = null; - } - - //////////////// Listeners //////////////// - - @Override - public void addChangeListener(StateChangeListener listener) { - listenerList.add(listener); - } - - @Override - public void removeChangeListener(StateChangeListener listener) { - listenerList.remove(listener); - } - - protected void fireChangeEvent() { - EventObject e = new EventObject(this); - - this.modID++; - boundsModID = -1; - refLengthModID = -1; - - // Copy the list before iterating to prevent concurrent modification exceptions. - EventListener[] listeners = listenerList.toArray(new EventListener[0]); - for (EventListener l : listeners) { - if (l instanceof StateChangeListener) { - ((StateChangeListener) l).stateChanged(e); - } - } - } - - - @Override - public void componentChanged(ComponentChangeEvent e) { - fireChangeEvent(); - } - - - /////////////// Helper methods /////////////// - - /** - * Return whether this configuration has any motors defined to it. - * - * @return true if this configuration has active motor mounts with motors defined to them. - */ - public boolean hasMotors() { - for (RocketComponent c : this) { - if (c instanceof MotorMount) { - MotorMount mount = (MotorMount) c; - if (!mount.isMotorMount()) - continue; - if (mount.getMotor(this.flightConfigurationId) != null) { - return true; - } - } - } - return false; - } - - - /** - * Return whether a component is in the currently active stages. - */ - public boolean isComponentActive(final RocketComponent c) { - int stage = c.getStageNumber(); - return isStageActive(stage); - } - - - /** - * Return the bounds of the current configuration. The bounds are cached. - * - * @return a Collection containing coordinates bouding the rocket. - */ - public Collection getBounds() { - if (rocket.getModID() != boundsModID) { - boundsModID = rocket.getModID(); - cachedBounds.clear(); - - double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY; - for (RocketComponent component : this) { - for (Coordinate c : component.getComponentBounds()) { - for (Coordinate coord : component.toAbsolute(c)) { - cachedBounds.add(coord); - if (coord.x < minX) - minX = coord.x; - if (coord.x > maxX) - maxX = coord.x; - } - } - } - - if (Double.isInfinite(minX) || Double.isInfinite(maxX)) { - cachedLength = 0; - } else { - cachedLength = maxX - minX; - } - } - return cachedBounds.clone(); - } - - - /** - * Returns the length of the rocket configuration, from the foremost bound X-coordinate - * to the aft-most X-coordinate. The value is cached. - * - * @return the length of the rocket in the X-direction. - */ - public double getLength() { - if (rocket.getModID() != boundsModID) - getBounds(); // Calculates the length - - return cachedLength; - } - - - - - /** - * Return an iterator that iterates over the currently active components. - * The Rocket and Stage components are not returned, - * but instead all components that are within currently active stages. - */ - @Override - public Iterator iterator() { - return new ConfigurationIterator(); - } - - - /** - * Return an iterator that iterates over all MotorMounts within the - * current configuration that have an active motor. - * - * @return an iterator over active motor mounts. - */ - public Iterator motorIterator() { - return new MotorIterator(); - } - - - /** - * Perform a deep-clone. The object references are also cloned and no - * listeners are listening on the cloned object. The rocket instance remains the same. - */ - @Override - public Configuration clone() { - try { - Configuration config = (Configuration) super.clone(); - config.listenerList = new ArrayList(); - config.stages = (BitSet) this.stages.clone(); - config.cachedBounds = new ArrayList(); - config.boundsModID = -1; - config.refLengthModID = -1; - rocket.addComponentChangeListener(config); - return config; - } catch (CloneNotSupportedException e) { - throw new BugException("clone not supported!", e); - } - } - - - @Override - public int getModID() { - return modID + rocket.getModID(); - } - - - /** - * A class that iterates over all currently active components. - * - * @author Sampo Niskanen - */ - private class ConfigurationIterator implements Iterator { - Iterator> iterators; - Iterator current = null; - - public ConfigurationIterator() { - List> list = new ArrayList>(); - - for (RocketComponent stage : rocket.getChildren()) { - if (isComponentActive(stage)) { - list.add(stage.iterator(false)); - } - } - - // Get iterators and initialize current - iterators = list.iterator(); - if (iterators.hasNext()) { - current = iterators.next(); - } else { - List l = Collections.emptyList(); - current = l.iterator(); - } - } - - - @Override - public boolean hasNext() { - if (!current.hasNext()) - getNextIterator(); - - return current.hasNext(); - } - - @Override - public RocketComponent next() { - if (!current.hasNext()) - getNextIterator(); - - return current.next(); - } - - /** - * Get the next iterator that has items. If such an iterator does - * not exist, current is left to an empty iterator. - */ - private void getNextIterator() { - while ((!current.hasNext()) && iterators.hasNext()) { - current = iterators.next(); - } - } - - @Override - public void remove() { - throw new UnsupportedOperationException("remove unsupported"); - } - } - - private class MotorIterator implements Iterator { - private final Iterator iterator; - private MotorMount next = null; - - public MotorIterator() { - this.iterator = iterator(); - } - - @Override - public boolean hasNext() { - getNext(); - return (next != null); - } - - @Override - public MotorMount next() { - getNext(); - if (next == null) { - throw new NoSuchElementException("iterator called for too long"); - } - - MotorMount ret = next; - next = null; - return ret; - } - - @Override - public void remove() { - throw new UnsupportedOperationException("remove unsupported"); - } - - private void getNext() { - if (next != null) - return; - while (iterator.hasNext()) { - RocketComponent c = iterator.next(); - if (c instanceof MotorMount) { - MotorMount mount = (MotorMount) c; - if (mount.isMotorMount() && mount.getMotor(flightConfigurationId) != null) { - next = mount; - return; - } - } - } - } - } - -} diff --git a/core/src/net/sf/openrocket/rocketcomponent/DeploymentConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/DeploymentConfiguration.java index 5e1d6d99d8..1ab819f111 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/DeploymentConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/DeploymentConfiguration.java @@ -1,16 +1,12 @@ package net.sf.openrocket.rocketcomponent; -import java.util.EventObject; -import java.util.List; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; -import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Pair; -import net.sf.openrocket.util.StateChangeListener; public class DeploymentConfiguration implements FlightConfigurableParameter { @@ -86,8 +82,6 @@ public String toString() { private static final Translator trans = Application.getTranslator(); - private final List listeners = new ArrayList(); - private DeployEvent deployEvent = DeployEvent.EJECTION; private double deployAltitude = 200; private double deployDelay = 0; @@ -108,7 +102,6 @@ public void setDeployEvent(DeployEvent deployEvent) { throw new NullPointerException("deployEvent is null"); } this.deployEvent = deployEvent; - fireChangeEvent(); } public double getDeployAltitude() { @@ -120,7 +113,6 @@ public void setDeployAltitude(double deployAltitude) { return; } this.deployAltitude = deployAltitude; - fireChangeEvent(); } public double getDeployDelay() { @@ -132,7 +124,6 @@ public void setDeployDelay(double deployDelay) { return; } this.deployDelay = deployDelay; - fireChangeEvent(); } @Override @@ -148,37 +139,20 @@ public String toString() { } - - - @Override - public void addChangeListener(StateChangeListener listener) { - listeners.add(listener); - } - - @Override - public void removeChangeListener(StateChangeListener listener) { - listeners.remove(listener); - } - - - - private void fireChangeEvent() { - EventObject event = new EventObject(this); - Object[] list = listeners.toArray(); - for (Object l : list) { - ((StateChangeListener) l).stateChanged(event); - } - } - - @Override public DeploymentConfiguration clone() { + return copy(null); + } + public DeploymentConfiguration copy( final FlightConfigurationId copyId) { DeploymentConfiguration that = new DeploymentConfiguration(); that.deployAltitude = this.deployAltitude; that.deployDelay = this.deployDelay; that.deployEvent = this.deployEvent; return that; } - + + @Override + public void update(){ + } } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java index 0fa9497c75..59f8ca330b 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java @@ -71,6 +71,7 @@ public void setLength(double length) { if (MathUtil.equals(this.length, length)) return; this.length = length; + validateFinTab(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/EngineBlock.java b/core/src/net/sf/openrocket/rocketcomponent/EngineBlock.java index 660bbba15f..748b548ac4 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/EngineBlock.java +++ b/core/src/net/sf/openrocket/rocketcomponent/EngineBlock.java @@ -3,10 +3,11 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset.Type; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; import net.sf.openrocket.startup.Application; -public class EngineBlock extends ThicknessRingComponent { +public class EngineBlock extends ThicknessRingComponent implements AxialPositionable { private static final Translator trans = Application.getTranslator(); diff --git a/core/src/net/sf/openrocket/rocketcomponent/EngineNozzle.java b/core/src/net/sf/openrocket/rocketcomponent/EngineNozzle.java new file mode 100644 index 0000000000..a518ce6fa5 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/EngineNozzle.java @@ -0,0 +1,858 @@ +package net.sf.openrocket.rocketcomponent; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; + +import java.util.Collection; + +import static java.lang.Math.sin; +import static net.sf.openrocket.util.MathUtil.pow2; +import static net.sf.openrocket.util.MathUtil.pow3; + +public class EngineNozzle extends SymmetricComponent { + private static Translator trans = Application.getTranslator(); + private static final double CLIP_PRECISION = 0.0001; + + private Shape type; + private double shapeParameter; + private boolean clipped; // don't read directly, isClipped() + private double foreRadius, aftRadius; + private boolean autoForeRadius, autoAftRadius; + + private boolean autoAftRadius2; + private double foreShoulderRadius, aftShoulderRadius; + private double foreShoulderThickness, aftShoulderThickness; + private double foreShoulderLength, aftShoulderLength; + private boolean foreShoulderCapped, aftShoulderCapped; + + private double clipLength = -1; + + public EngineNozzle() { + super(); + + this.foreRadius = DEFAULT_RADIUS; + this.aftRadius = DEFAULT_RADIUS; + this.length = DEFAULT_RADIUS * 3; + this.autoForeRadius = true; + this.autoAftRadius = true; + this.type = Shape.CONICAL; + this.shapeParameter = 0; + this.clipped = true; + } + + ///////////////////////// Getters & Setters + //////// Length //////// + @Override + public void setLength( double length ) { + if ( this.length == length ) { + return; + } + // Need to clearPreset when length changes. + clearPreset(); + super.setLength( length ); + } + + + //////// Fore radius //////// + + + @Override + public double getForeRadius() { + if (isForeRadiusAutomatic()) { + // Get the automatic radius from the front + double r = -1; + SymmetricComponent c = this.getPreviousSymmetricComponent(); + if (c != null) { + r = c.getFrontAutoRadius(); + } + if (r < 0) + r = DEFAULT_RADIUS; + return r; + } + return foreRadius; + } + + public void setForeRadius(double radius) { + if ((this.foreRadius == radius) && (autoForeRadius == false)) + return; + + this.autoForeRadius = false; + this.foreRadius = Math.max(radius, 0); + + if (this.thickness > this.foreRadius && this.thickness > this.aftRadius) + this.thickness = Math.max(this.foreRadius, this.aftRadius); + + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public boolean isForeRadiusAutomatic() { + return autoForeRadius; + } + + public void setForeRadiusAutomatic(boolean auto) { + if (autoForeRadius == auto) + return; + + autoForeRadius = auto; + + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + + //////// Aft radius ///////// + + @Override + public double getAftRadius() { + if (isAftRadiusAutomatic()) { + // Return the auto radius from the rear + double r = -1; + SymmetricComponent c = this.getNextSymmetricComponent(); + if (c != null) { + r = c.getRearAutoRadius(); + } + if (r < 0) + r = DEFAULT_RADIUS; + return r; + } + return aftRadius; + } + + + + public void setAftRadius(double radius) { + if ((this.aftRadius == radius) && (autoAftRadius2 == false)) + return; + + this.autoAftRadius2 = false; + this.aftRadius = Math.max(radius, 0); + + if (this.thickness > this.foreRadius && this.thickness > this.aftRadius) + this.thickness = Math.max(this.foreRadius, this.aftRadius); + + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public boolean isAftRadiusAutomatic() { + return autoAftRadius2; + } + + public void setAftRadiusAutomatic(boolean auto) { + if (autoAftRadius2 == auto) + return; + + autoAftRadius2 = auto; + + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + + + //// Radius automatics + + @Override + protected double getFrontAutoRadius() { + if (isAftRadiusAutomatic()) + return -1; + return getAftRadius(); + } + + + @Override + protected double getRearAutoRadius() { + if (isForeRadiusAutomatic()) + return -1; + return getForeRadius(); + } + + + + + //////// Type & shape ///////// + + public Shape getType() { + return type; + } + + public void setType(Shape type) { + if (type == null) { + throw new IllegalArgumentException("setType called with null argument"); + } + if (this.type == type) + return; + this.type = type; + this.clipped = type.isClippable(); + this.shapeParameter = type.defaultParameter(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + public double getShapeParameter() { + return shapeParameter; + } + + public void setShapeParameter(double n) { + if (shapeParameter == n) + return; + this.shapeParameter = MathUtil.clamp(n, type.minParameter(), type.maxParameter()); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + public void setClipped(boolean c) { + if (clipped == c) + return; + clipped = c; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + public boolean isClippedEnabled() { + return type.isClippable(); + } + + public double getShapeParameterMin() { + return type.minParameter(); + } + + public double getShapeParameterMax() { + return type.maxParameter(); + } + + + //////// Shoulders //////// + + public double getForeShoulderRadius() { + return foreShoulderRadius; + } + + public void setForeShoulderRadius(double foreShoulderRadius) { + if (MathUtil.equals(this.foreShoulderRadius, foreShoulderRadius)) + return; + this.foreShoulderRadius = foreShoulderRadius; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + public double getForeShoulderThickness() { + return foreShoulderThickness; + } + + public void setForeShoulderThickness(double foreShoulderThickness) { + if (MathUtil.equals(this.foreShoulderThickness, foreShoulderThickness)) + return; + this.foreShoulderThickness = foreShoulderThickness; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + public double getForeShoulderLength() { + return foreShoulderLength; + } + + public void setForeShoulderLength(double foreShoulderLength) { + if (MathUtil.equals(this.foreShoulderLength, foreShoulderLength)) + return; + this.foreShoulderLength = foreShoulderLength; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + public boolean isForeShoulderCapped() { + return foreShoulderCapped; + } + + public void setForeShoulderCapped(boolean capped) { + if (this.foreShoulderCapped == capped) + return; + this.foreShoulderCapped = capped; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + + + + public double getAftShoulderRadius() { + return aftShoulderRadius; + } + + public void setAftShoulderRadius(double aftShoulderRadius) { + if (MathUtil.equals(this.aftShoulderRadius, aftShoulderRadius)) + return; + this.aftShoulderRadius = aftShoulderRadius; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + public double getAftShoulderThickness() { + return aftShoulderThickness; + } + + public void setAftShoulderThickness(double aftShoulderThickness) { + if (MathUtil.equals(this.aftShoulderThickness, aftShoulderThickness)) + return; + this.aftShoulderThickness = aftShoulderThickness; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + public double getAftShoulderLength() { + return aftShoulderLength; + } + + public void setAftShoulderLength(double aftShoulderLength) { + if (MathUtil.equals(this.aftShoulderLength, aftShoulderLength)) + return; + this.aftShoulderLength = aftShoulderLength; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + public boolean isAftShoulderCapped() { + return aftShoulderCapped; + } + + public void setAftShoulderCapped(boolean capped) { + if (this.aftShoulderCapped == capped) + return; + this.aftShoulderCapped = capped; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + ///////////////////////// End Getters & Setters + + public static enum Shape { + + /** + * Conical shape. + */ + //// Conical + CONICAL(trans.get("Shape.Conical"), + //// A conical nose cone has a profile of a triangle. + trans.get("Shape.Conical.desc1"), + //// A conical transition has straight sides. + trans.get("Shape.Conical.desc2")) { + @Override + public double getRadius(double x, double radius, double length, double param) { + assert x >= 0; + assert x <= length; + assert radius >= 0; + return radius * x / length; + } + }, + + /** + * Ogive shape. The shape parameter is the portion of an extended tangent ogive + * that will be used. That is, for param==1 a tangent ogive will be produced, and + * for smaller values the shape straightens out into a cone at param==0. + */ + //// Ogive + OGIVE(trans.get("Shape.Ogive"), + //// An ogive nose cone has a profile that is a segment of a circle. The shape parameter value 1 produces a tangent ogive, which has a smooth transition to the body tube, values less than 1 produce secant ogives. + trans.get("Shape.Ogive.desc1"), + //// An ogive transition has a profile that is a segment of a circle. The shape parameter value 1 produces a tangent ogive, which has a smooth transition to the body tube at the aft end, values less than 1 produce secant ogives. + trans.get("Shape.Ogive.desc2")) { + @Override + public boolean usesParameter() { + return true; // Range 0...1 is default + } + + @Override + public double defaultParameter() { + return 1.0; // Tangent ogive by default + } + + @Override + public double getRadius(double x, double radius, double length, double param) { + assert x >= 0; + assert x <= length; + assert radius >= 0; + assert param >= 0; + assert param <= 1; + + // Impossible to calculate ogive for length < radius, scale instead + // TODO: LOW: secant ogive could be calculated lower + if (length < radius) { + x = x * radius / length; + length = radius; + } + + if (param < 0.001) + return CONICAL.getRadius(x, radius, length, param); + + // Radius of circle is: + double R = MathUtil.safeSqrt((pow2(length) + pow2(radius)) * + (pow2((2 - param) * length) + pow2(param * radius)) / (4 * pow2(param * radius))); + double L = length / param; + // double R = (radius + length*length/(radius*param*param))/2; + double y0 = MathUtil.safeSqrt(R * R - L * L); + return MathUtil.safeSqrt(R * R - (L - x) * (L - x)) - y0; + } + }, + + /** + * Ellipsoidal shape. + */ + //// Ellipsoid + ELLIPSOID(trans.get("Shape.Ellipsoid"), + //// An ellipsoidal nose cone has a profile of a half-ellipse with major axes of lengths 2×Length and Diameter. + trans.get("Shape.Ellipsoid.desc1"), + //// An ellipsoidal transition has a profile of a half-ellipse with major axes of lengths 2×Length and Diameter. If the transition is not clipped, then the profile is extended at the center by the corresponding radius. + trans.get("Shape.Ellipsoid.desc2"), true) { + @Override + public double getRadius(double x, double radius, double length, double param) { + assert x >= 0; + assert x <= length; + assert radius >= 0; + x = x * radius / length; + return MathUtil.safeSqrt(2 * radius * x - x * x); // radius/length * sphere + } + }, + + //// Power series + POWER(trans.get("Shape.Powerseries"), + trans.get("Shape.Powerseries.desc1"), + trans.get("Shape.Powerseries.desc2"), true) { + @Override + public boolean usesParameter() { // Range 0...1 + return true; + } + + @Override + public double defaultParameter() { + return 0.5; + } + + @Override + public double getRadius(double x, double radius, double length, double param) { + assert x >= 0; + assert x <= length; + assert radius >= 0; + assert param >= 0; + assert param <= 1; + if (param <= 0.00001) { + if (x <= 0.00001) + return 0; + else + return radius; + } + return radius * Math.pow(x / length, param); + } + + }, + + //// Parabolic series + PARABOLIC(trans.get("Shape.Parabolicseries"), + ////A parabolic series nose cone has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a full parabola which is tangent to the body tube, 0.75 produces a 3/4 parabola, 0.5 procudes a 1/2 parabola and 0 produces a conical nose cone. + trans.get("Shape.Parabolicseries.desc1"), + ////A parabolic series transition has a profile of a parabola. The shape parameter defines the segment of the parabola to utilize. The shape parameter 1.0 produces a full parabola which is tangent to the body tube at the aft end, 0.75 produces a 3/4 parabola, 0.5 procudes a 1/2 parabola and 0 produces a conical transition. + trans.get("Shape.Parabolicseries.desc2")) { + + // In principle a parabolic transition is clippable, but the difference is + // negligible. + + @Override + public boolean usesParameter() { // Range 0...1 + return true; + } + + @Override + public double defaultParameter() { + return 1.0; + } + + @Override + public double getRadius(double x, double radius, double length, double param) { + assert x >= 0; + assert x <= length; + assert radius >= 0; + assert param >= 0; + assert param <= 1; + + return radius * ((2 * x / length - param * pow2(x / length)) / (2 - param)); + } + }, + + //// Haack series + HAACK(trans.get("Shape.Haackseries"), + //// The Haack series nose cones are designed to minimize drag. The shape parameter 0 produces an LD-Haack or Von Karman nose cone, which minimizes drag for fixed length and diameter, while a value of 0.333 produces an LV-Haack nose cone, which minimizes drag for fixed length and volume. + trans.get("Shape.Haackseries.desc1"), + //// The Haack series nose cones are designed to minimize drag. These transition shapes are their equivalents, but do not necessarily produce optimal drag for transitions. The shape parameter 0 produces an LD-Haack or Von Karman shape, while a value of 0.333 produces an LV-Haack shape. + trans.get("Shape.Haackseries.desc2"), true) { + + @Override + public boolean usesParameter() { + return true; + } + + @Override + public double maxParameter() { + return 1.0 / 3.0; // Range 0...1/3 + } + + @Override + public double getRadius(double x, double radius, double length, double param) { + assert x >= 0; + assert x <= length; + assert radius >= 0; + assert param >= 0; + assert param <= 2; + + double theta = Math.acos(1 - 2 * x / length); + if (MathUtil.equals(param, 0)) { + return radius * MathUtil.safeSqrt((theta - sin(2 * theta) / 2) / Math.PI); + } + return radius * MathUtil.safeSqrt((theta - sin(2 * theta) / 2 + param * pow3(sin(theta))) / Math.PI); + } + }, + + // POLYNOMIAL("Smooth polynomial", + // "A polynomial is fitted such that the nose cone profile is horizontal "+ + // "at the aft end of the transition. The angle at the tip is defined by "+ + // "the shape parameter.", + // "A polynomial is fitted such that the transition profile is horizontal "+ + // "at the aft end of the transition. The angle at the fore end is defined "+ + // "by the shape parameter.") { + // @Override + // public boolean usesParameter() { + // return true; + // } + // @Override + // public double maxParameter() { + // return 3.0; // Range 0...3 + // } + // @Override + // public double defaultParameter() { + // return 0.0; + // } + // public double getRadius(double x, double radius, double length, double param) { + // assert x >= 0; + // assert x <= length; + // assert radius >= 0; + // assert param >= 0; + // assert param <= 3; + // // p(x) = (k-2)x^3 + (3-2k)x^2 + k*x + // x = x/length; + // return radius*((((param-2)*x + (3-2*param))*x + param)*x); + // } + // } + ; + + // Privete fields of the shapes + private final String name; + private final String transitionDesc; + private final String noseconeDesc; + private final boolean canClip; + + // Non-clippable constructor + Shape(String name, String noseconeDesc, String transitionDesc) { + this(name, noseconeDesc, transitionDesc, false); + } + + // Clippable constructor + Shape(String name, String noseconeDesc, String transitionDesc, boolean canClip) { + this.name = name; + this.canClip = canClip; + this.noseconeDesc = noseconeDesc; + this.transitionDesc = transitionDesc; + } + + + /** + * Return the name of the transition shape name. + */ + public String getName() { + return name; + } + + /** + * Get a description of the Transition shape. + */ + public String getTransitionDescription() { + return transitionDesc; + } + + /** + * Get a description of the NoseCone shape. + */ + public String getNoseConeDescription() { + return noseconeDesc; + } + + /** + * Check whether the shape differs in clipped mode. The clipping should be + * enabled by default if possible. + */ + public boolean isClippable() { + return canClip; + } + + /** + * Return whether the shape uses the shape parameter. (Default false.) + */ + public boolean usesParameter() { + return false; + } + + /** + * Return the minimum value of the shape parameter. (Default 0.) + */ + public double minParameter() { + return 0.0; + } + + /** + * Return the maximum value of the shape parameter. (Default 1.) + */ + public double maxParameter() { + return 1.0; + } + + /** + * Return the default value of the shape parameter. (Default 0.) + */ + public double defaultParameter() { + return 0.0; + } + + /** + * Calculate the basic radius of a transition with the given radius, length and + * shape parameter at the point x from the tip of the component. It is assumed + * that the fore radius if zero and the aft radius is radius >= 0. + * Boattails are achieved by reversing the component. + * + * @param x Position from the tip of the component. + * @param radius Aft end radius >= 0. + * @param length Length of the transition >= 0. + * @param param Valid shape parameter. + * @return The basic radius at the given position. + */ + public abstract double getRadius(double x, double radius, double length, double param); + + + /** + * Returns the name of the shape (same as getName()). + */ + @Override + public String toString() { + return name; + } + + /** + * Lookup the Shape given the localized name. This differs from the standard valueOf as that looks up + * based on the canonical name, not the localized name which is an instance var. + * + * @param localizedName + * @return + */ + public static Shape toShape(String localizedName) { + Shape[] values = Shape.values(); + for (Shape value : values) { + if (value.getName().equals(localizedName)) { + return value; + } + } + return null; + } + } + + /** + * Numerically solve clipLength from the equation + * r1 == type.getRadius(clipLength,r2,clipLength+length) + * using a binary search. It assumes getOuterRadius() to be monotonically increasing. + */ + private void calculateClip(double r1, double r2) { + double min = 0, max = length; + + if (r1 >= r2) { + double tmp = r1; + r1 = r2; + r2 = tmp; + } + + if (r1 == 0) { + clipLength = 0; + return; + } + + if (length <= 0) { + clipLength = 0; + return; + } + + // Required: + // getR(min,min+length,r2) - r1 < 0 + // getR(max,max+length,r2) - r1 > 0 + + int n = 0; + while (type.getRadius(max, r2, max + length, shapeParameter) - r1 < 0) { + min = max; + max *= 2; + n++; + if (n > 10) + break; + } + + while (true) { + clipLength = (min + max) / 2; + if ((max - min) < CLIP_PRECISION) + return; + double val = type.getRadius(clipLength, r2, clipLength + length, shapeParameter); + if (val - r1 > 0) { + max = clipLength; + } else { + min = clipLength; + } + } + } + + + /** + * Return the radius at point x of the transition. + */ + @Override + public double getRadius(double x) { + if (x < 0 || x > length) + return 0; + + double r1 = getForeRadius(); + double r2 = getAftRadius(); + + if (r1 == r2) + return r1; + + if (r1 > r2) { + x = length - x; + double tmp = r1; + r1 = r2; + r2 = tmp; + } + + if (isClipped()) { + // Check clip calculation + if (clipLength < 0) + calculateClip(r1, r2); + return type.getRadius(clipLength + x, r2, clipLength + length, shapeParameter); + } else { + // Not clipped + return r1 + type.getRadius(x, r2 - r1, length, shapeParameter); + } + } + + public boolean isClipped() { + if (!type.isClippable()) + return false; + return clipped; + } + + @Override + public double getInnerRadius(double x) { + return Math.max(getRadius(x) - thickness, 0); + } + + @Override + public Collection getComponentBounds() { + Collection bounds = super.getComponentBounds(); + if (foreShoulderLength > 0.001) + addBound(bounds, -foreShoulderLength, foreShoulderRadius); + if (aftShoulderLength > 0.001) + addBound(bounds, getLength() + aftShoulderLength, aftShoulderRadius); + return bounds; + } + + @Override + public double getComponentVolume() { + double volume = super.getComponentVolume(); + if (getForeShoulderLength() > 0.001) { + final double or = getForeShoulderRadius(); + final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); + volume += ringVolume( or, ir, getForeShoulderLength() ); + } + if (isForeShoulderCapped()) { + final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); + volume += ringVolume(ir, 0, getForeShoulderThickness() ); + } + + if (getAftShoulderLength() > 0.001) { + final double or = getAftShoulderRadius(); + final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); + volume += ringVolume(or, ir, getAftShoulderLength() ); + } + if (isAftShoulderCapped()) { + final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); + volume += ringVolume(ir, 0, getAftShoulderThickness() ); + } + + return volume; + } + + @Override + public Coordinate getComponentCG() { + Coordinate cg = super.getComponentCG(); + if (getForeShoulderLength() > 0.001) { + final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); + cg = cg.average(ringCG(getForeShoulderRadius(), ir, -getForeShoulderLength(), 0, + getMaterial().getDensity())); + } + if (isForeShoulderCapped()) { + final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); + cg = cg.average(ringCG(ir, 0, -getForeShoulderLength(), + getForeShoulderThickness() - getForeShoulderLength(), + getMaterial().getDensity())); + } + + if (getAftShoulderLength() > 0.001) { + final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); + cg = cg.average(ringCG(getAftShoulderRadius(), ir, getLength(), + getLength() + getAftShoulderLength(), getMaterial().getDensity())); + } + if (isAftShoulderCapped()) { + final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); + cg = cg.average(ringCG(ir, 0, + getLength() + getAftShoulderLength() - getAftShoulderThickness(), + getLength() + getAftShoulderLength(), getMaterial().getDensity())); + } + return cg; + } + + + /* + * The moments of inertia are not explicitly corrected for the shoulders. + * However, since the mass is corrected, the inertia is automatically corrected + * to very nearly the correct value. + */ + + + + /** + * Returns the name of the component ("Transition"). + */ + @Override + public String getComponentName() { + //// Transition + return trans.get("Nozzle.Nozzle"); + } + + @Override + protected void componentChanged(ComponentChangeEvent e) { + super.componentChanged(e); + clipLength = -1; + } + + /** + * Check whether the given type can be added to this component. Transitions allow any + * InternalComponents to be added. + * + * @param comptype The RocketComponent class type to add. + * @return Whether such a component can be added. + */ + @Override + public boolean isCompatible(Class comptype) { + if (InternalComponent.class.isAssignableFrom(comptype)){ + return true; + }else if ( FreeformFinSet.class.isAssignableFrom(comptype)){ + return true; + } + return false; + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java b/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java index 4377a8c318..9d34f75192 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java @@ -5,6 +5,7 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; @@ -17,7 +18,7 @@ */ public abstract class ExternalComponent extends RocketComponent { - + public enum Finish { //// Rough ROUGH("ExternalComponent.Rough", 500e-6), @@ -29,50 +30,50 @@ public enum Finish { SMOOTH("ExternalComponent.Smoothpaint", 20e-6), //// Polished POLISHED("ExternalComponent.Polished", 2e-6); - + private static final Translator trans = Application.getTranslator(); private final String name; private final double roughnessSize; - + Finish(String name, double roughness) { this.name = name; this.roughnessSize = roughness; } - + public double getRoughnessSize() { return roughnessSize; } - + @Override public String toString() { return trans.get(name) + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")"; } } - - + + /** * The material of the component. */ protected Material material = null; - + protected Finish finish = Finish.NORMAL; - - - + + + /** * Constructor that sets the relative position of the component. */ - public ExternalComponent(RocketComponent.Position relativePosition) { + public ExternalComponent( AxialMethod relativePosition) { super(relativePosition); this.material = Application.getPreferences().getDefaultComponentMaterial(this.getClass(), Material.Type.BULK); } - + /** * Returns the volume of the component. This value is used in calculating the mass * of the object. */ public abstract double getComponentVolume(); - + /** * Calculates the mass of the component as the product of the volume and interior density. */ @@ -80,7 +81,7 @@ public ExternalComponent(RocketComponent.Position relativePosition) { public double getComponentMass() { return material.getDensity() * getComponentVolume(); } - + /** * ExternalComponent has aerodynamic effect, so return true. */ @@ -88,7 +89,7 @@ public double getComponentMass() { public boolean isAerodynamic() { return true; } - + /** * ExternalComponent has effect on the mass, so return true. */ @@ -96,50 +97,50 @@ public boolean isAerodynamic() { public boolean isMassive() { return true; } - - + + public Material getMaterial() { return material; } - + public void setMaterial(Material mat) { if (mat.getType() != Material.Type.BULK) { throw new IllegalArgumentException("ExternalComponent requires a bulk material" + " type=" + mat.getType()); } - + if (material.equals(mat)) return; material = mat; clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - + public Finish getFinish() { return finish; } - + public void setFinish(Finish finish) { if (this.finish == finish) return; this.finish = finish; fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); } - - + + @Override protected void loadFromPreset(ComponentPreset preset) { super.loadFromPreset(preset); - + // Surface finish is left unchanged - - if ( preset.has(ComponentPreset.MATERIAL ) ) { + + if (preset.has(ComponentPreset.MATERIAL)) { Material mat = preset.get(ComponentPreset.MATERIAL); - if ( mat != null ) { + if (mat != null) { material = mat; } /* - TODO - - else if (c.isMassOverridden()) { + TODO - + else if (c.isMassOverridden()) { double mass = c.getOverrideMass(); double volume = getComponentVolume(); double density; @@ -150,12 +151,11 @@ else if (c.isMassOverridden()) { } mat = Material.newMaterial(Type.BULK, mat.getName(), density, true); setMaterial(mat); - } - */ + } + */ } } - - + @Override protected List copyFrom(RocketComponent c) { ExternalComponent src = (ExternalComponent) c; @@ -163,5 +163,5 @@ protected List copyFrom(RocketComponent c) { this.material = src.material; return super.copyFrom(c); } - + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java index dfa6c64b01..57bb50b273 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java @@ -1,28 +1,42 @@ package net.sf.openrocket.rocketcomponent; +import java.awt.geom.Point2D; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; + +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.ArrayUtils; +import net.sf.openrocket.util.BoundingBox; + +import net.sf.openrocket.rocketcomponent.Transition.Shape; + import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; - -public abstract class FinSet extends ExternalComponent { +public abstract class FinSet extends ExternalComponent implements RingInstanceable, AxialPositionable { private static final Translator trans = Application.getTranslator(); + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(FinSet.class); + /** * Maximum allowed cant of fins. */ public static final double MAX_CANT = (15.0 * Math.PI / 180); - public enum CrossSection { //// Square SQUARE(trans.get("FinSet.CrossSection.SQUARE"), 1.00), @@ -49,90 +63,70 @@ public String toString() { } } - public enum TabRelativePosition { - //// Root chord leading edge - FRONT(trans.get("FinSet.TabRelativePosition.FRONT")), - //// Root chord midpoint - CENTER(trans.get("FinSet.TabRelativePosition.CENTER")), - //// Root chord trailing edge - END(trans.get("FinSet.TabRelativePosition.END")); - - private final String name; - - TabRelativePosition(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } - } - /** * Number of fins. */ - protected int fins = 3; - + private int finCount = 1; + /** * Rotation about the x-axis by 2*PI/fins. */ - protected Transformation finRotation = Transformation.rotate_x(2 * Math.PI / fins); - + private Transformation finRotation = Transformation.IDENTITY; + + /** * Rotation angle of the first fin. Zero corresponds to the positive y-axis. */ - protected double rotation = 0; - - /** - * Rotation about the x-axis by angle this.rotation. - */ - protected Transformation baseRotation = Transformation.rotate_x(rotation); - - + private AngleMethod angleMethod = AngleMethod.RELATIVE; + private double firstFinOffset = 0; + private Transformation baseRotation = Transformation.IDENTITY; // initially, rotate by 0 degrees. + /** * Cant angle of fins. */ - protected double cantAngle = 0; + private double cantAngle = 0; /* Cached value: */ private Transformation cantRotation = null; - + // fixed to body surface... + final private RadiusMethod radiusMethod = RadiusMethod.SURFACE; + /** * Thickness of the fins. */ protected double thickness = 0.003; - - + /** * The cross-section shape of the fins. */ - protected CrossSection crossSection = CrossSection.SQUARE; + private CrossSection crossSection = CrossSection.SQUARE; /* * Fin tab properties. */ + private static final double minimumTabArea = 1e-8; private double tabHeight = 0; private double tabLength = 0.05; - private double tabShift = 0; - private TabRelativePosition tabRelativePosition = TabRelativePosition.CENTER; - + // this is always measured from the the root-lead point. + private double tabPosition = 0.0; + private AxialMethod tabOffsetMethod = AxialMethod.MIDDLE; + private double tabOffset = 0.; + /* * Fin fillet properties */ - - protected Material filletMaterial = null; - protected double filletRadius = 0; - protected double filletCenterY = 0; - - // Cached fin area & CG. Validity of both must be checked using finArea! + private Material filletMaterial; + private double filletRadius = 0; + + // ==== Cached Values ==== // Fin area does not include fin tabs, CG does. - private double finArea = -1; - private double finCGx = -1; - private double finCGy = -1; - + + // planform area of one side of a single fin + private double singlePlanformArea = Double.NaN; + private double totalVolume = Double.NaN; + private Coordinate centerOfMass = Coordinate.NaN; /** * New FinSet with given number of fins and given base rotation angle. @@ -140,18 +134,21 @@ public String toString() { * i.e. fins are positioned at the bottom of the parent component. */ public FinSet() { - super(RocketComponent.Position.BOTTOM); + super( AxialMethod.BOTTOM); this.filletMaterial = Application.getPreferences().getDefaultComponentMaterial(this.getClass(), Material.Type.BULK); } - + @Override + public boolean isAfter(){ + return false; + } /** * Return the number of fins in the set. * @return The number of fins. */ public int getFinCount() { - return fins; + return finCount; } /** @@ -159,48 +156,44 @@ public int getFinCount() { * @param n The number of fins, greater of equal to one. */ public void setFinCount(int n) { - if (fins == n) + if (finCount == n) return; if (n < 1) n = 1; if (n > 8) n = 8; - fins = n; - finRotation = Transformation.rotate_x(2 * Math.PI / fins); + finCount = n; + + finRotation = Transformation.rotate_x(2 * Math.PI / finCount); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public Transformation getFinRotationTransformation() { return finRotation; } - + + @Override + public double getBoundingRadius(){ + return 0.; + } + /** * Gets the base rotation amount of the first fin. * @return The base rotation amount. */ public double getBaseRotation() { - return rotation; + return getAngleOffset(); } /** * Sets the base rotation amount of the first fin. - * @param r The base rotation amount. + * @param r The base rotation in radians */ public void setBaseRotation(double r) { - r = MathUtil.reduce180(r); - if (MathUtil.equals(r, rotation)) - return; - rotation = r; - baseRotation = Transformation.rotate_x(rotation); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + setAngleOffset(r); } - public Transformation getBaseRotationTransformation() { - return baseRotation; - } - - - public double getCantAngle() { return cantAngle; } @@ -228,8 +221,6 @@ public Transformation getCantRotation() { return cantRotation; } - - public double getThickness() { return thickness; } @@ -253,35 +244,28 @@ public void setCrossSection(CrossSection cs) { fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - - - - - @Override - public void setRelativePosition(RocketComponent.Position position) { - super.setRelativePosition(position); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - } - - - @Override - public void setPositionValue(double value) { - super.setPositionValue(value); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - } - - - - public double getTabHeight() { return tabHeight; } - public void setTabHeight(double height) { - height = MathUtil.max(height, 0); - if (MathUtil.equals(this.tabHeight, height)) + /** + * Set the height from the fin's base at the reference point -- i.e. where the tab is located from. If the tab is located via BOTTOM, then the back edge will be + * height deep, and the bottom edge of the tab will be parallel to the stage centerline. If the tab is located via TOP, the the front edge will have corresponding height/depth. + * If the tab is located via MIDDLE, the tab's midpoint is used. + * + * Note this function also does bounds checking, and will not set a tab height that passes through it's parent's midpoint. + * + * @param newHeightRequest how deep the fin tab should project from the fin root, at the reference point + * + */ + public void setTabHeight(final double newHeightRequest) { + if (MathUtil.equals(this.tabHeight, MathUtil.max(newHeightRequest, 0))){ return; - this.tabHeight = height; + } + + this.tabHeight = newHeightRequest; + + validateFinTab(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -294,248 +278,348 @@ public void setTabLength(double length) { length = MathUtil.max(length, 0); if (MathUtil.equals(this.tabLength, length)) return; - this.tabLength = length; + tabLength = length; + validateFinTab(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - - - public double getTabShift() { - return tabShift; - } - - public void setTabShift(double shift) { - this.tabShift = shift; + + /** + * internally, set the internal + * + * @param newOffset new requested shift of tab -- from + */ + public void setTabOffset( final double newOffset) { + this.tabOffset = newOffset; + this.tabPosition = this.tabOffsetMethod.getAsPosition( newOffset, this.tabLength, this.length); + + validateFinTab(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - - public TabRelativePosition getTabRelativePosition() { - return tabRelativePosition; + public AxialMethod getTabOffsetMethod() { + return tabOffsetMethod; } - - public void setTabRelativePosition(TabRelativePosition position) { - if (this.tabRelativePosition == position) - return; - - - double front = getTabFrontEdge(); - switch (position) { - case FRONT: - this.tabShift = front; - break; - - case CENTER: - this.tabShift = front + tabLength / 2 - getLength() / 2; - break; - - case END: - this.tabShift = front + tabLength - getLength(); - break; - - default: - throw new IllegalArgumentException("position=" + position); - } - this.tabRelativePosition = position; - - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); + + /** + * the tab's positioning method variable does not change the internal representation -- + * it is merely a lens through which other modules may view the tab's position. + */ + public void setTabOffsetMethod(final AxialMethod newPositionMethod) { + this.tabOffsetMethod = newPositionMethod; + this.tabOffset = tabOffsetMethod.getAsOffset( tabPosition, tabLength, length); } - /** * Return the tab front edge position from the front of the fin. */ public double getTabFrontEdge() { - switch (this.tabRelativePosition) { - case FRONT: - return tabShift; - - case CENTER: - return getLength() / 2 - tabLength / 2 + tabShift; - - case END: - return getLength() - tabLength + tabShift; - - default: - throw new IllegalStateException("tabRelativePosition=" + tabRelativePosition); - } + return tabPosition; } - + + public double getTabOffset(){ + return this.tabOffsetMethod.getAsOffset(tabPosition, tabLength, length); + } + /** * Return the tab trailing edge position *from the front of the fin*. */ - public double getTabTrailingEdge() { - switch (this.tabRelativePosition) { - case FRONT: - return tabLength + tabShift; - case CENTER: - return getLength() / 2 + tabLength / 2 + tabShift; - - case END: - return getLength() + tabShift; - - default: - throw new IllegalStateException("tabRelativePosition=" + tabRelativePosition); - } + private double getTabTrailingEdge() { + return tabPosition + tabLength; } - - - - /////////// Calculation methods /////////// - - /** - * Return the area of one side of one fin. This does NOT include the area of - * the fin tab. - * - * @return the area of one side of one fin. - */ - public double getFinArea() { - if (finArea < 0) - calculateAreaCG(); + public void validateFinTab(){ + this.tabPosition = this.tabOffsetMethod.getAsPosition(tabOffset, tabLength, length); + + //check front bounds: + if( tabPosition < 0){ + this.tabPosition = 0; + } + + //check tail bounds: + final double xTabBack = getTabTrailingEdge(); + if( this.length < xTabBack ){ + this.tabLength -= (xTabBack - this.length); + } - return finArea; + // check tab height + if( null != getParent() ){ + // pulls the parent-body radius at the fin-tab reference point. + final double xLead = this.getTabFrontEdge(); + final double xTrail = this.getTabTrailingEdge(); + + final SymmetricComponent sym = (SymmetricComponent)this.parent; + final double bodyRadius = MathUtil.min(sym.getRadius( xLead), sym.getRadius( xTrail)); + + // limit the new heights to be no greater than the current body radius. + this.tabHeight = Math.min( this.tabHeight, bodyRadius ); + } } - + /////////// Calculation methods ////////// /** - * Return the unweighted CG of a single fin. The X-coordinate is relative to - * the root chord trailing edge and the Y-coordinate to the fin root chord. + * Return the area of a *single* fin exposed to the airflow (i.e. external area) + * N.B. counts only one side of each fin, + * https://en.wikipedia.org/wiki/Wetted_area * - * @return the unweighted CG coordinate of a single fin. + * @return returns the one-sided air-exposed area of a single fin */ - public Coordinate getFinCG() { - if (finArea < 0) - calculateAreaCG(); - - return new Coordinate(finCGx, finCGy, 0); + public double getPlanformArea() { + if( Double.isNaN(singlePlanformArea) ){ + calculateCM(); + } + return this.singlePlanformArea; } - @Override public double getComponentMass() { - return getFilletMass() + getFinMass(); - } - - public double getFinMass() { - return getComponentVolume() * material.getDensity(); - } - - public double getFilletMass() { - return getFilletVolume() * filletMaterial.getDensity(); + if(this.centerOfMass.isNaN()){ + calculateCM(); + } + return this.centerOfMass.weight; } - @Override public double getComponentVolume() { - // this is for the fins alone, fillets are taken care of separately. - return fins * (getFinArea() + tabHeight * tabLength) * thickness * - crossSection.getRelativeVolume(); + if(Double.isNaN(this.totalVolume)){ + calculateCM(); + } + + return totalVolume; } - - + /** + * Return the center-of-mass of a single fin. The X-coordinate is relative to + * the root chord leading edge and the Y-coordinate to the fin root chord. + * + * @return the Center-of-Mass coordinate of a single fin. + */ @Override public Coordinate getComponentCG() { - if (finArea < 0) - calculateAreaCG(); - - double mass = getFinMass(); - double filletMass = getFilletMass(); - double filletCenter = length / 2; - - double newCGx = (filletCenter * filletMass + finCGx * mass) / (filletMass + mass); + if( centerOfMass.isNaN() ){ + calculateCM(); + } - // FilletRadius/5 is a good estimate for where the vertical centroid of the fillet - // is. Finding the actual position is very involved and won't make a huge difference. - double newCGy = (filletRadius / 5 * filletMass + finCGy * mass) / (filletMass + mass); + return centerOfMass; + } + + private static Coordinate calculateFilletCrossSection(final double filletRadius, final double bodyRadius){ + final double hypotenuse = filletRadius + bodyRadius; + final double innerArcAngle = Math.asin(filletRadius / hypotenuse); + final double outerArcAngle = Math.acos(filletRadius / hypotenuse); + + final double triangleArea = Math.tan(outerArcAngle) * filletRadius * filletRadius / 2; + double crossSectionArea = (triangleArea + - outerArcAngle * filletRadius * filletRadius / 2 + - innerArcAngle * bodyRadius * bodyRadius / 2); + + if(Double.isNaN(crossSectionArea)) { + crossSectionArea = 0.; + }else { + // each fin has a fillet on each side + crossSectionArea *= 2; + } + + // heuristic, relTo the body center + double yCentroid = bodyRadius + filletRadius /5; + + return new Coordinate(0,yCentroid,0,crossSectionArea); + } + + /* + * Here is how the volume of the fillet is found. It assumes a circular concave + * fillet tangent to the fin and the body tube. + * + * 1. Form a triangle with vertices at the BT center, the tangent point between + * the fillet and the fin, and the center of the fillet radius. + * 2. The line between the center of the BT and the center of the fillet radius + * will pass through the tangent point between the fillet and the BT. + * 3. Find the area of the triangle, then subtract the portion of the BT and + * fillet that is in that triangle. (angle/2PI * pi*r^2= angle/2 * r^2) + * 4. Multiply the remaining area by the length. + * 5. Return twice that since there is a fillet on each side of the fin. + */ + protected Coordinate calculateFilletVolumeCentroid() { + if((null == this.parent) || (!SymmetricComponent.class.isAssignableFrom(this.parent.getClass()))){ + return Coordinate.ZERO; + } + Coordinate[] mountPoints = this.getRootPoints(); +// if( null == mountPoints ){ +// return Coordinate.ZERO; +// } + + final SymmetricComponent sym = (SymmetricComponent) this.parent; + + final Coordinate finLead = getFinFront(); + final double xFinEnd = finLead.x + getLength(); + final Coordinate[] rootPoints = getMountPoints( finLead.x, xFinEnd, -finLead.x, -finLead.y); + if (0 == rootPoints.length) { + return Coordinate.ZERO; + } - if (fins == 1) { - return baseRotation.transform( - new Coordinate(finCGx, finCGy + getBodyRadius(), 0, (filletMass + mass))); - } else { - return new Coordinate(finCGx, 0, 0, (filletMass + mass)); - } - } - - public double getFilletVolume() { - /* - * Here is how the volume of the fillet is found. It assumes a circular concave - * fillet tangent to the fin and the body tube. - * - * 1. Form a triangle with vertices at the BT center, the tangent point between - * the fillet and the fin, and the center of the fillet radius. - * 2. The line between the center of the BT and the center of the fillet radius - * will pass through the tangent point between the fillet and the BT. - * 3. Find the area of the triangle, then subtract the portion of the BT and - * fillet that is in that triangle. (angle/2PI * pi*r^2= angle/2 * r^2) - * 4. Multiply the remaining area by the length. - * 5. Return twice that since there is a fillet on each side of the fin. - * - */ - double btRadius = 1000.0; // assume a really big body tube if we can't get the radius, - RocketComponent c = this.getParent(); - if (BodyTube.class.isInstance(c)) { - btRadius = ((BodyTube) c).getOuterRadius(); - } - double totalRad = filletRadius + btRadius; - double innerAngle = Math.asin(filletRadius / totalRad); - double outerAngle = Math.acos(filletRadius / totalRad); - - double outerArea = Math.tan(outerAngle) * filletRadius * filletRadius / 2; - double filletVolume = length * (outerArea - - outerAngle * filletRadius * filletRadius / 2 - - innerAngle * btRadius * btRadius / 2); - return 2 * filletVolume; - } - - private void calculateAreaCG() { - Coordinate[] points = this.getFinPoints(); - finArea = 0; - finCGx = 0; - finCGy = 0; - - for (int i = 0; i < points.length - 1; i++) { - final double x0 = points[i].x; - final double x1 = points[i + 1].x; - final double y0 = points[i].y; - final double y1 = points[i + 1].y; + Coordinate filletVolumeCentroid = Coordinate.ZERO; + + Coordinate prev = mountPoints[0]; + for (int index = 1; index < mountPoints.length; index++) { + final Coordinate cur = mountPoints[index]; + + // cross section at mid-segment + final double xAvg = (prev.x + cur.x) / 2; + final double bodyRadius = sym.getRadius(xAvg); + final Coordinate segmentCrossSection = calculateFilletCrossSection(this.filletRadius, bodyRadius).setX(xAvg); - double da = (y0 + y1) * (x1 - x0) / 2; - finArea += da; - if (Math.abs(y0 + y1) < 0.00001) { - finCGx += (x0 + x1) / 2 * da; - finCGy += y0 / 2 * da; - } else { - finCGx += (x0 * (2 * y0 + y1) + x1 * (y0 + 2 * y1)) / (3 * (y0 + y1)) * da; - finCGy += (y1 + y0 * y0 / (y0 + y1)) / 3 * da; +// final double xCentroid = xAvg; +// final double yCentroid = segmentCrossSection.y; ///< heuristic, not exact + final double segmentLength = Point2D.Double.distance(prev.x, prev.y, cur.x, cur.y); + final double segmentVolume = segmentLength * segmentCrossSection.weight; + + final Coordinate segmentCentroid = segmentCrossSection.setWeight(segmentVolume); + + filletVolumeCentroid = filletVolumeCentroid.add(segmentCentroid); + + prev = cur; + } + + if (finCount == 1) { + Transformation rotation = Transformation.rotate_x( getAngleOffset()); + return rotation.transform(filletVolumeCentroid); + }else{ + return filletVolumeCentroid.setY(0.); + } + } + + /** + * \brief calculate the area-under-the-curve (i.e. the integral) in the form of a centroid + area + * + * @param points define a piece-wise line bounding the area. + * @return x,y,z => centroid of the area; weight => magnitude of the area + */ + protected static Coordinate calculateCurveIntegral( final Coordinate[] points ){ + Coordinate centroidSum = new Coordinate(0); + + if( 0 == points.length ){ + return centroidSum; + } + + Coordinate prev= points[0]; + for( int index = 1; index < points.length; index++){ + Coordinate cur = points[index]; + + // calculate marginal area + final double delta_x = (cur.x - prev.x); + final double y_avg = (cur.y + prev.y)*0.5; + double area_increment = delta_x*y_avg; + if( MathUtil.equals( 0, area_increment)){ + prev = cur; + // zero area increment: ignore and continue; + continue; } + + // calculate centroid increment + final double common = 1/(3*(cur.y+prev.y)); + final double x_ctr = common*( prev.x*(2*prev.y+cur.y) + cur.x*(2*cur.y+prev.y)); + final double y_ctr = common*( cur.y*prev.y + Math.pow( cur.y, 2) + Math.pow( prev.y, 2)); + + Coordinate centroid_increment = new Coordinate( x_ctr, y_ctr, 0, area_increment); + centroidSum = centroidSum.average( centroid_increment ); + + prev=cur; } - if (finArea < 0) - finArea = 0; - - // Add effect of fin tabs to CG - double tabArea = tabLength * tabHeight; - if (!MathUtil.equals(tabArea, 0)) { - - double x = (getTabFrontEdge() + getTabTrailingEdge()) / 2; - double y = -this.tabHeight / 2; - - finCGx += x * tabArea; - finCGy += y * tabArea; - + return centroidSum; + } + + /** + * calculates the planform area-centroid of a single fin's tab: + */ + private Coordinate calculateTabCentroid(){ + RocketComponent comp = getParent(); + + if( !( comp instanceof SymmetricComponent) || isTabTrivial() ){ + // if null or invalid type: + return Coordinate.ZERO; } + // relto: fin + final double xTabFront_fin = getTabFrontEdge(); + final double xTabTrail_fin = getTabTrailingEdge(); + + final Coordinate finFront = getFinFront(); + final double xFinFront_body = finFront.x; + final double xTabFront_body = xFinFront_body + xTabFront_fin; + final double xTabTrail_body = xFinFront_body + xTabTrail_fin; + + // get body points, relTo fin front / centerline); + final Coordinate[] upperCurve = getMountPoints( xTabFront_body, xTabTrail_body, -xFinFront_body, 0); + final Coordinate[] lowerCurve = translateToCenterline( getTabPoints()); + final Coordinate[] tabPoints = combineCurves( upperCurve, lowerCurve); + + return calculateCurveIntegral( tabPoints ); + } + + private Coordinate[] translateToCenterline( final Coordinate[] fromRoot) { + Coordinate finRoot = this.getFinFront(); - if ((finArea + tabArea) > 0) { - finCGx /= (finArea + tabArea); - finCGy /= (finArea + tabArea); - } else { - finCGx = (points[0].x + points[points.length - 1].x) / 2; - finCGy = 0; - } + // locate relative to fin/body centerline + return FinSet.translatePoints( fromRoot, 0.0d, finRoot.y); + } + + /** + * The coordinate contains an x,y coordinate of the centroid, relative to the parent-body-centerline + * The weight contains the area of the fin. + * + * @return area centroid coordinates (weight is the area) + */ + private Coordinate calculateSinglePlanformCentroid(){ + final Coordinate finLead = getFinFront(); + final double xFinTrail = finLead.x+getLength(); + + final Coordinate[] upperCurve = translatePoints(getFinPoints(), 0, finLead.y); + final Coordinate[] lowerCurve = getMountPoints( finLead.x, xFinTrail, -finLead.x, 0); + final Coordinate[] totalCurve = combineCurves( upperCurve, lowerCurve); + + final Coordinate planformCentroid = calculateCurveIntegral( totalCurve ); + + // return as a position relative to fin-root + return planformCentroid; + } + + /** + * copies the supplied areas into a third array, such that the first curve is copied forward, and the second is copied in reverse. + * + * The motivation is to use the two sets of forward points to produce a single close curve, suitable for an integration operation + * + * @param c1 forward curve + * @param c2 backward curve + * @return combined curve + */ + private Coordinate[] combineCurves( final Coordinate[] c1, final Coordinate[] c2){ + Coordinate[] combined = new Coordinate[ c1.length + c2.length]; + + // copy the first array to the start of the return array... + System.arraycopy(c1, 0, combined, 0, c1.length); + + Coordinate[] revCurve = reverse( c2); + int writeIndex = c1.length; // start directly after previous array + int writeCount = revCurve.length; + System.arraycopy(revCurve, 0, combined, writeIndex, writeCount); + + return combined; } + // simply return a reversed copy of the source array + public Coordinate[] reverse( Coordinate[] source){ + Coordinate[] reverse = new Coordinate[ source.length ]; + + int readIndex = 0; + int writeIndex = source.length-1; + while( readIndex < source.length ){ + reverse[writeIndex] = source[readIndex]; + ++readIndex; + --writeIndex; + } + return reverse; + } + /* * Return an approximation of the longitudinal unitary inertia of the fin set. * The process is the following: @@ -551,10 +635,10 @@ private void calculateAreaCG() { */ @Override public double getLongitudinalUnitInertia() { - double area = getFinArea(); - if (MathUtil.equals(area, 0)) - return 0; - + if(Double.isNaN(this.singlePlanformArea)){ + calculateCM(); + } + // Approximate fin with a rectangular fin // w2 and h2 are squares of the fin width and height double w = getLength(); @@ -562,21 +646,21 @@ public double getLongitudinalUnitInertia() { double w2, h2; if (MathUtil.equals(w * h, 0)) { - w2 = area; - h2 = area; + w2 = singlePlanformArea; + h2 = singlePlanformArea; } else { - w2 = w * area / h; - h2 = h * area / w; + w2 = w * singlePlanformArea / h; + h2 = h * singlePlanformArea / w; } double inertia = (h2 + 2 * w2) / 24; - if (fins == 1) + if (finCount == 1) return inertia; - double radius = getBodyRadius(); + final double rFront = this.getFinFront().y; - return fins * (inertia + MathUtil.pow2(MathUtil.safeSqrt(h2) + radius)); + return finCount * (inertia + MathUtil.pow2(MathUtil.safeSqrt(h2) + rFront)); } @@ -592,78 +676,88 @@ public double getLongitudinalUnitInertia() { */ @Override public double getRotationalUnitInertia() { - double area = getFinArea(); - if (MathUtil.equals(area, 0)) - return 0; - + if(Double.isNaN(this.singlePlanformArea)){ + calculateCM(); + } + // Approximate fin with a rectangular fin double w = getLength(); double h = getSpan(); - + if (MathUtil.equals(w * h, 0)) { - h = MathUtil.safeSqrt(area); + h = MathUtil.safeSqrt(singlePlanformArea); } else { - h = MathUtil.safeSqrt(h * area / w); + h = MathUtil.safeSqrt(h * singlePlanformArea/ w); } + + final double rFront = this.getFinFront().y; + + return finCount * (h * h / 12 + MathUtil.pow2(h / 2 + rFront)); + } + + + public BoundingBox getBoundingBox() { + BoundingBox singleFinBounds= new BoundingBox().update(getFinPoints()); + final double finLength = singleFinBounds.max.x; + final double finHeight = singleFinBounds.max.y; - if (fins == 1) - return h * h / 12; - - double radius = getBodyRadius(); + BoundingBox compBox = new BoundingBox().update(getComponentLocations()); - return fins * (h * h / 12 + MathUtil.pow2(h / 2 + radius)); + BoundingBox finSetBox = new BoundingBox( compBox.min.sub( 0, finHeight, finHeight ), + compBox.max.add( finLength, finHeight, finHeight )); + return finSetBox; } - /** - * Adds the fin set's bounds to the collection. + * Adds bounding coordinates to the given set. The body tube will fit within the + * convex hull of the points. + * + * Currently the points are simply a rectangular box around the body tube. */ @Override public Collection getComponentBounds() { - List bounds = new ArrayList(); - double r = getBodyRadius(); + Collection bounds = new ArrayList(8); + + // should simply return this component's bounds in this component's body frame. + + double x_min = Double.MAX_VALUE; + double x_max = Double.MIN_VALUE; + double r_max = 0.0; for (Coordinate point : getFinPoints()) { - addFinBound(bounds, point.x, point.y + r); + double hypot = MathUtil.hypot(point.y, point.z); + double x_cur = point.x; + if (x_min > x_cur) { + x_min = x_cur; + } + if (x_max < x_cur) { + x_max = x_cur; + } + if (r_max < hypot) { + r_max = hypot; + } } - return bounds; - } - - - /** - * Adds the 2d-coordinate bound (x,y) to the collection for both z-components and for - * all fin rotations. - */ - private void addFinBound(Collection set, double x, double y) { - Coordinate c; - int i; + Coordinate location = this.getLocations()[0]; + x_max += location.x; - c = new Coordinate(x, y, thickness / 2); - c = baseRotation.transform(c); - set.add(c); - for (i = 1; i < fins; i++) { - c = finRotation.transform(c); - set.add(c); + if( parent instanceof SymmetricComponent){ + r_max += ((SymmetricComponent)parent).getRadius(0); } - c = new Coordinate(x, y, -thickness / 2); - c = baseRotation.transform(c); - set.add(c); - for (i = 1; i < fins; i++) { - c = finRotation.transform(c); - set.add(c); - } + addBoundingBox(bounds, x_min, x_max, r_max); + return bounds; } - - - + @Override public void componentChanged(ComponentChangeEvent e) { - if (e.isAerodynamicChange()) { - finArea = -1; - cantRotation = null; + if (e.isAerodynamicChange() || e.isMassChange()) { + this.singlePlanformArea = Double.NaN; + this.centerOfMass = Coordinate.NaN; + this.totalVolume = Double.NaN; + this.cantRotation = null; } + super.componentChanged(e); } @@ -675,17 +769,7 @@ public void componentChanged(ComponentChangeEvent e) { * @return radius of the underlying BodyComponent or 0 if none exists. */ public double getBodyRadius() { - RocketComponent s; - - s = this.getParent(); - while (s != null) { - if (s instanceof SymmetricComponent) { - double x = this.toRelative(new Coordinate(0, 0, 0), s)[0].x; - return ((SymmetricComponent) s).getRadius(x); - } - s = s.getParent(); - } - return 0; + return getFinFront().y; } @Override @@ -702,58 +786,218 @@ public boolean allowsChildren() { public boolean isCompatible(Class type) { return false; } - - - - + /** * Return a list of coordinates defining the geometry of a single fin. * The coordinates are the XY-coordinates of points defining the shape of a single fin, * where the origin is the leading root edge. Therefore, the first point must be (0,0,0). - * All Z-coordinates must be zero, and the last coordinate must have Y=0. + * All Z-coordinates must be zero. * * @return List of XY-coordinates. */ public abstract Coordinate[] getFinPoints(); - + public boolean isTabTrivial(){ + return ( FinSet.minimumTabArea > (getTabLength()*getTabHeight())); + } + + public boolean isRootStraight( ){ + if( getParent() instanceof Transition){ + if( ((Transition)getParent()).getType() == Transition.Shape.CONICAL ){ + return true; + }else{ + return false; + } + } + + // by default, assume a flat base + return true; + } + /** - * Return a list of coordinates defining the geometry of a single fin, including a - * possible fin tab. The coordinates are the XY-coordinates of points defining the - * shape of a single fin, where the origin is the leading root edge. This implementation - * calls {@link #getFinPoints()} and adds the necessary points for the fin tab. - * The tab coordinates will have a negative y value. + * Return a copied list of the given input, translated by the delta + * + * @return List of XY-coordinates. + */ + protected static Coordinate[] translatePoints( final Coordinate[] inp, final double x_delta , final double y_delta){ + Coordinate[] returnPoints = new Coordinate[inp.length]; + for( int index=0; index < inp.length; ++index){ + final double new_x = inp[index].x + x_delta; + final double new_y = inp[index].y + y_delta; + returnPoints[index] = new Coordinate(new_x, new_y); + } + return returnPoints; + } + + /** + * Return a copied list of the given input, translated by the delta + * + * @return List of XY-coordinates. + */ + protected static ArrayList translatePoints( final ArrayList inp, final Coordinate delta){ + final ArrayList returnPoints = new ArrayList<>(); + returnPoints.ensureCapacity(inp.size()); + + for( Coordinate c: inp ){ + returnPoints.add(c.add(delta)); + } + + return returnPoints; + } + + /** + * Return a list of X,Y coordinates defining the geometry of a single fin tab. + * The origin is the leading root edge, and the tab height (or 'depth') is + * the radial distance inwards from the reference point, depending on positioning method: + * if via TOP: tab front edge + * if via MIDDLE: tab middle + * if via BOTTOM: tab trailing edge + * + * The tab coordinates will generally have negative y values. * * @return List of XY-coordinates. */ - public Coordinate[] getFinPointsWithTab() { - Coordinate[] points = getFinPoints(); + public Coordinate[] getTabPoints() { if (MathUtil.equals(getTabHeight(), 0) || - MathUtil.equals(getTabLength(), 0)) - return points; + MathUtil.equals(getTabLength(), 0)){ + return new Coordinate[]{}; + } + + final int pointCount = 4; + Coordinate[] points = new Coordinate[pointCount]; + final Coordinate finFront = this.getFinFront(); - double x1 = getTabFrontEdge(); - double x2 = getTabTrailingEdge(); - double y = -getTabHeight(); + final SymmetricComponent body = (SymmetricComponent)this.getParent(); - boolean add1 = x1 != points[0].x; - boolean add2 = x2 != points[points.length - 1].x; + final double xTabFront = getTabFrontEdge(); + final double xTabTrail = getTabTrailingEdge(); - int n = points.length; - points = ArrayUtils.copyOf(points, points.length + 2 + (add1 ? 1 : 0) + (add2 ? 1 : 0)); + final double xTabReference = finFront.x + getTabOffset(); - if (add2) - points[n++] = new Coordinate(x2, 0); - points[n++] = new Coordinate(x2, y); - points[n++] = new Coordinate(x1, y); - if (add1) - points[n++] = new Coordinate(x1, 0); + double yTabFront = 0; + double yTabTrail = 0; + double yTabBottom = -tabHeight; + if( null != body ){ + yTabFront = body.getRadius( finFront.x + xTabFront ) - finFront.y; + yTabTrail = body.getRadius( finFront.x + xTabTrail ) - finFront.y; + yTabBottom = body.getRadius( xTabReference ) - tabHeight - finFront.y; + } - return points; + points[0] = new Coordinate(xTabFront, yTabFront); + points[1] = new Coordinate(xTabFront, yTabBottom ); + points[2] = new Coordinate(xTabTrail, yTabBottom ); + points[3] = new Coordinate(xTabTrail, yTabTrail); + + return points; + } + + public Coordinate getFinFront() { + final double xFinFront = this.getAxialFront(); + final SymmetricComponent symmetricParent = (SymmetricComponent)this.getParent(); + if( null == symmetricParent){ + return new Coordinate( 0, 0); + }else{ + final double yFinFront = symmetricParent.getRadius( xFinFront ); + return new Coordinate(xFinFront, yFinFront); + } + } + + + /* + * yes, this may over-count points between the fin and fin tabs, + * but the minor performance hit is not worth the code complexity of dealing with. + */ + public Coordinate[] getFinPointsWithTab() { + final Coordinate[] finPoints = getFinPoints(); + final Coordinate[] tabPoints = getTabPoints(); + + Coordinate[] combinedPoints = Arrays.copyOf(finPoints, finPoints.length + tabPoints.length); + System.arraycopy(tabPoints, 0, combinedPoints, finPoints.length, tabPoints.length); + return combinedPoints; + } + + @Override + public double getAngleOffset() { + return firstFinOffset; + } + + + @Override + public void setAngleOffset(double angle) { + angle = MathUtil.reduce180(angle); + if (MathUtil.equals(angle, firstFinOffset)) + return; + firstFinOffset = angle; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public double getInstanceAngleIncrement(){ + return ( 2*Math.PI / getFinCount()); + } + + @Override + public double[] getInstanceAngles(){ + final double baseAngle = getAngleOffset(); + final double incrAngle = getInstanceAngleIncrement(); + + double[] result = new double[ getFinCount()]; + for( int i=0; i copyFrom(RocketComponent c) { FinSet src = (FinSet) c; - this.fins = src.fins; + this.finCount = src.finCount; this.finRotation = src.finRotation; - this.rotation = src.rotation; - this.baseRotation = src.baseRotation; + this.firstFinOffset = src.firstFinOffset; this.cantAngle = src.cantAngle; this.cantRotation = src.cantRotation; this.thickness = src.thickness; this.crossSection = src.crossSection; this.tabHeight = src.tabHeight; this.tabLength = src.tabLength; - this.tabRelativePosition = src.tabRelativePosition; - this.tabShift = src.tabShift; + this.tabOffsetMethod = src.tabOffsetMethod; + this.tabPosition = src.tabPosition; return super.copyFrom(c); } @@ -784,7 +1027,6 @@ protected List copyFrom(RocketComponent c) { /* * Handle fin fillet mass properties */ - public Material getFilletMaterial() { return filletMaterial; } @@ -813,5 +1055,184 @@ public void setFilletRadius(double r) { clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } + + /** +<<<<<<< HEAD + * use this for calculating physical properties, and routine drawing + * + * @return points representing the fin-root points, relative to ( x: fin-front, y: centerline ) i.e. relto: fin Component reference point + */ + public Coordinate[] getMountPoints() { + if( null == parent){ + return null; + } + + return getMountPoints(0., parent.getLength(), 0,0); + } + + /** + * used to get body points for the profile design view + * + * @return points representing the fin-root points, relative to ( x: fin-front, y: centerline ) i.e. relto: fin Component reference point + */ + public Coordinate[] getRootPoints(){ + if( null == parent){ + return new Coordinate[]{Coordinate.ZERO}; + } + + final Coordinate finLead = getFinFront(); + final double xFinEnd = finLead.x + getLength(); + + return getMountPoints( finLead.x, xFinEnd, -finLead.x, -finLead.y); + } + + /** + * used to get calculate body profile points: + * + * @param xStart - xStart, in Mount-frame + * @param xEnd - xEnd, in Mount-frame + * @param xOffset - x-Offset to apply to returned points + * @param yOffset - y-Offset to apply to returned points + * + * @return points representing the mount's points + */ + private Coordinate[] getMountPoints(final double xStart, final double xEnd, final double xOffset, final double yOffset) { + if( null == parent){ + return new Coordinate[]{Coordinate.ZERO}; + } + + // for a simple bodies, one increment is perfectly accurate. + int divisionCount = 1; + // cast-assert + final SymmetricComponent body = (SymmetricComponent) getParent(); + + // for anything more complicated, increase the count: + if( ( body instanceof Transition) && ( ((Transition)body).getType() != Shape.CONICAL )){ + // the maximum precision to enforce when calculating the areas of fins ( especially on curved parent bodies) + final double xWidth = 0.005; // width of each individual iteration + divisionCount = (int)Math.ceil( (xEnd - xStart) / xWidth ); + + // When creating body curves, don't create more than this many divisions. -- only relevant on very large components + final int maximumBodyDivisionCount = 100; + divisionCount = Math.min( maximumBodyDivisionCount, divisionCount); + } + + final double intervalLength = xEnd - xStart; + double increment = (intervalLength)/divisionCount; + + double xCur = xStart; + Coordinate[] points = new Coordinate[divisionCount+1]; + for( int index = 0; index < points.length; index++){ + double yCur = body.getRadius( xCur ); + points[index]=new Coordinate( xCur, yCur); + + xCur += increment; + } + + // correct last point, if beyond a rounding error from body's end. + final int lastIndex = points.length - 1; + if( body.getLength()-0.000001 < points[lastIndex].x) { + points[lastIndex] = points[lastIndex].setX(body.getLength()).setY(body.getAftRadius()); + } + + if( 0.0000001 < (Math.abs(xOffset) + Math.abs(yOffset))){ + points = translatePoints(points, xOffset, yOffset); + } + + return points; + } + + // for debugging. You can safely delete this method + public static String getPointDescr( final Coordinate[] points, final String name, final String indent){ + return getPointDescr(Arrays.asList(points), name, indent); + } + + // for debugging. You can safely delete this method + public static String getPointDescr( final List points, final String name, final String indent){ + StringBuilder buf = new StringBuilder(); + + buf.append(String.format("%s >> %s: %d points\n", indent, name, points.size())); + int index =0; + for( Coordinate c : points ){ + buf.append( String.format( indent+" ....[%2d] (%6.4g, %6.4g)\n", index, c.x, c.y)); + index++; + } + return buf.toString(); + } + + @Override + public StringBuilder toDebugDetail(){ + StringBuilder buf = super.toDebugDetail(); + + buf.append( getPointDescr( this.getFinPoints(), "Fin Points", "")); + + if (null != parent) { + buf.append( getPointDescr( this.getMountPoints(0, parent.getLength(), 0, 0), "Body Points", "")); + buf.append( getPointDescr( this.getRootPoints(), "Root Points", "")); + } + + if( ! this.isTabTrivial() ) { + buf.append(String.format(" TabLength: %6.4f TabHeight: %6.4f @ %6.4f via: %s\n", tabLength, tabHeight, tabPosition, this.tabOffsetMethod)); + buf.append(getPointDescr(this.getTabPoints(), "Tab Points", "")); + } + return buf; + } + + private void calculateCM(){ + final Coordinate wettedCentroid = calculateSinglePlanformCentroid(); + this.singlePlanformArea = wettedCentroid.weight; + final double wettedVolume = wettedCentroid.weight * thickness * crossSection.getRelativeVolume(); + final double finBulkMass = wettedVolume * material.getDensity(); + final Coordinate wettedCM = wettedCentroid.setWeight(finBulkMass); + + final Coordinate tabCentroid = calculateTabCentroid(); + final double tabVolume = tabCentroid.weight * thickness; + final double tabMass = tabVolume * material.getDensity(); + final Coordinate tabCM = tabCentroid.setWeight(tabMass); + + Coordinate filletCentroid = calculateFilletVolumeCentroid(); + double filletVolume = filletCentroid.weight; + double filletMass = filletVolume * filletMaterial.getDensity(); + final Coordinate filletCM = filletCentroid.setWeight(filletMass); + + this.totalVolume = (wettedVolume + tabVolume + filletVolume) * finCount; + + final double eachFinMass = finBulkMass + tabMass + filletMass; + final Coordinate eachFinCenterOfMass = wettedCM.average(tabCM).average(filletCM).setWeight(eachFinMass); + + // ^^ per fin + // vv per component + + // set y coordinate: rotate around parent, if single fin; otherwise multiple fins will average out to zero + if (finCount == 1) { + this.centerOfMass = baseRotation.transform( eachFinCenterOfMass ); + } else { + this.centerOfMass = eachFinCenterOfMass.setY(0.).setWeight( eachFinMass * this.finCount); + } + } + // ============= Instanceable Interface Methods =============== + @Override + public Coordinate[] getInstanceOffsets(){ + checkState(); + + final double bodyRadius = this.getBodyRadius(); + final double[] angles = getInstanceAngles(); + + final Transformation localCantRotation = getCantRotation(); + + Coordinate[] toReturn = new Coordinate[finCount]; + for (int instanceNumber = 0; instanceNumber < finCount; instanceNumber++) { + final double curY = bodyRadius * Math.cos(angles[instanceNumber]); + final double curZ = bodyRadius * Math.sin(angles[instanceNumber]); + + final Coordinate naiveLocation = new Coordinate(0, curY, curZ); + + final Coordinate adjustedLocation = baseRotation.transform(localCantRotation.transform( naiveLocation)); + + toReturn[instanceNumber] = adjustedLocation; + } + + return toReturn; + } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableComponent.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableComponent.java index 25a8dea5b4..187f276a29 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableComponent.java @@ -14,6 +14,13 @@ public interface FlightConfigurableComponent { * @param oldConfigId the old configuration ID * @param newConfigId the new configuration ID */ - public void cloneFlightConfiguration(String oldConfigId, String newConfigId); + void copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId); + + /** + * Reset a specific flight configuration ID to use the default parameter value. + * + * @param fcid the flight configuration ID + */ + void reset( final FlightConfigurationId fcid); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameter.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameter.java index f6e32efe7a..efbef013a5 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameter.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameter.java @@ -1,6 +1,5 @@ package net.sf.openrocket.rocketcomponent; -import net.sf.openrocket.util.ChangeSource; /** * Interface for a parameter object that can be configured per @@ -8,12 +7,21 @@ * * @param the parameter type */ -public interface FlightConfigurableParameter extends ChangeSource { +public interface FlightConfigurableParameter { /** - * Return a copy of this object. The listeners must not be copied - * to the new object. + * return an exact copy of this object */ - public E clone(); + E clone(); + + /** + * return a copy of this object, corresponding to the specified Id + * + * @param fcid id to attach the new object to + * @return the desired copy + */ + E copy( final FlightConfigurationId fcid ); + + void update(); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameterSet.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameterSet.java new file mode 100644 index 0000000000..cc4ef365b7 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurableParameterSet.java @@ -0,0 +1,259 @@ +package net.sf.openrocket.rocketcomponent; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +import net.sf.openrocket.util.ArrayList; +import net.sf.openrocket.util.Utils; + +/** + * Represents a value or parameter that can vary based on the + * flight configuration ID. + *

+ * The parameter value is always defined, and null is not a valid + * parameter value. + * + * @param the parameter type + */ +public class FlightConfigurableParameterSet> implements Iterable { + + //private static final Logger log = LoggerFactory.getLogger(ParameterSet.class); + protected final HashMap map = new HashMap(); + + /** + * Construct a FlightConfiguration that has no overrides. + * + * @param _defaultValue the first default value + */ + public FlightConfigurableParameterSet(E _defaultValue) { + this.map.put( FlightConfigurationId.DEFAULT_VALUE_FCID, _defaultValue); + } + + /** + * Construct a copy of an existing FlightConfigurationImpl. + * + * @param configSet the FlightConfigurableParameterSet to copy + */ + public FlightConfigurableParameterSet(FlightConfigurableParameterSet configSet ){ + for (FlightConfigurationId key : configSet.map.keySet()) { + E cloneConfig = configSet.map.get(key).clone(); + this.map.put(key, cloneConfig); + } + } + + /** + * Return the default parameter value for this FlightConfiguration. + * This is used in case a per-flight configuration override + * has not been defined. + * + * @return the default parameter value (never null) + */ + public E getDefault(){ + return this.map.get( FlightConfigurationId.DEFAULT_VALUE_FCID ); + } + + /** + * Set the default parameter value for this FlightConfiguration. + *This is used in case a per-flight configuration override + * has not been defined. + * + * @param nextDefaultValue the parameter value (null not allowed) + */ + public void setDefault(E nextDefaultValue) { + if (nextDefaultValue == null) { + throw new NullPointerException("new Default Value is null"); + } + if( this.isDefault(nextDefaultValue)){ + return; + } + this.map.put( FlightConfigurationId.DEFAULT_VALUE_FCID, nextDefaultValue); + } + + public boolean containsId( final FlightConfigurationId fcid){ + return this.map.containsKey(fcid); + } + + + @Override + public Iterator iterator() { + return map.values().iterator(); + } + + /** + * Return the number of specific flight configurations other than the default. + * @return + */ + public int size() { + return (map.size()-1); + } + + /** + * Return the parameter value for the provided flight configuration ID. + * This returns either the value specified for this flight config ID, + * or the default value. + * + * @param testValue the parameter to find + * @return the flight configuration ID + */ + public FlightConfigurationId getId(E testValue) { + if( null == testValue ){ + return null; + } + for( Entry curEntry : this.map.entrySet()){ + FlightConfigurationId curKey = curEntry.getKey(); + E curValue = curEntry.getValue(); + + if( testValue.equals(curValue)){ + return curKey; + } + } + + return null; + } + + public E get(final int index) { + if( 0 > index){ + throw new ArrayIndexOutOfBoundsException("Attempt to retrieve a configurable parameter by an index less than zero: "+index); + } + if(( 0 > index) || ( this.map.size() <= index )){ + throw new ArrayIndexOutOfBoundsException("Attempt to retrieve a configurable parameter with an index larger " + +" than the stored values: "+index+"/"+this.map.size()); + } + + List ids = this.getIds(); + FlightConfigurationId selectedId = ids.get(index); + return this.map.get(selectedId); + } + + /** + * Return the parameter value for the provided flight configuration ID. + * This returns either the value specified for this flight config ID, + * or the default value. + * + * @param id the flight configuration ID + * @return the parameter to use (never null) + */ + public E get(FlightConfigurationId id) { + E toReturn; + if (map.containsKey(id)) { + toReturn = map.get(id); + } else { + toReturn = this.getDefault(); + } + return toReturn; + } + + + /** + * @return a sorted list of all the contained FlightConfigurationIDs + */ + public List getIds(){ + ArrayList toReturn = new ArrayList(); + + toReturn.addAll( this.map.keySet() ); + toReturn.remove( FlightConfigurationId.DEFAULT_VALUE_FCID ); + // Java 1.8: + //toReturn.sort( null ); + + // Java 1.7: + Collections.sort(toReturn); + + return toReturn; + } + + /** + * Set the parameter value for the provided flight configuration ID. + * This sets the override for this flight configuration ID. + * + * @param fcid the flight configuration ID + * @param nextValue the parameter value (null not allowed) + */ + public void set( final FlightConfigurationId fcid, E nextValue) { + if ( nextValue == null) { + // null value means to delete this fcid + this.map.remove(fcid); + }else if( FlightConfigurationId.DEFAULT_VALUE_FCID == fcid ){ + // if a user wants to set the default value, make them do it explicitly with .setDefaultValue(...) + return; + }else{ + this.map.put(fcid, nextValue); + } + + update(); + } + + + public boolean isDefault( final E testVal) { + return (Utils.equals( this.getDefault(), testVal)); + } + + /** + * Return whether a specific flight configuration ID is using the + * default value. + * + * @param fcid the flight configuration ID + * @return whether the default is being used + */ + public boolean isDefault( final FlightConfigurationId fcid) { + return ( this.getDefault() == this.map.get(fcid)); + } + + /** + * Reset a specific flight configuration ID to use the default parameter value. + * + * @param fcid the flight configuration ID + */ + public void reset( final FlightConfigurationId fcid) { + if( fcid.isValid() ){ + set( fcid, null); + } + } + + /* + * Clears all configuration-specific settings -- meaning querying the parameter for any configuration will return the default value. + */ + public void reset() { + E tempValue = this.getDefault(); + this.map.clear(); + setDefault(tempValue); + } + + public FlightConfigurationId copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId) { + // clones the ENTRIES for the given fcid's. + E oldValue = this.get(oldConfigId); + E newValue = oldValue.copy( newConfigId); + this.set(newConfigId, newValue ); + update(); + return newConfigId; + } + + + public String toDebug(){ + StringBuilder buf = new StringBuilder(); + buf.append(String.format("====== Dumping ConfigurationSet<%s> (%d configurations)\n", this.getDefault().getClass().getSimpleName(), this.size() )); + final String fmt = " [%-12s]: %s\n"; + for( FlightConfigurationId loopFCID : getIds()){ + String shortKey = loopFCID.toShortKey(); + E inst = this.map.get(loopFCID); + if( this.isDefault(inst)){ + shortKey = "*"+shortKey+"*"; + } + buf.append(String.format(fmt, shortKey, inst )); + } + return buf.toString(); + } + + public void update(){ + for( E curValue: this.map.values() ){ + curValue.update(); + } + } + + public FlightConfiguration[] toArray() { + return map.values().toArray( new FlightConfiguration[0]); + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java index 054f50cf37..579abc8763 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfiguration.java @@ -1,74 +1,636 @@ package net.sf.openrocket.rocketcomponent; -import net.sf.openrocket.util.ChangeSource; +import java.util.ArrayDeque; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Queue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfigurationId; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.ArrayList; +import net.sf.openrocket.util.BoundingBox; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Monitorable; +import net.sf.openrocket.util.Transformation; + /** - * Represents a value or parameter that can vary based on the - * flight configuration ID. - *

- * The parameter value is always defined, and null is not a valid - * parameter value. - * - * @param the parameter type + * A class defining a rocket configuration. + * Describes active stages, and active motors. + * + * @author Sampo Niskanen + * @author Daniel Williams */ -public interface FlightConfiguration extends FlightConfigurableComponent, Iterable { +public class FlightConfiguration implements FlightConfigurableParameter, Monitorable { + private static final Logger log = LoggerFactory.getLogger(FlightConfiguration.class); + private static final Translator trans = Application.getTranslator(); + + private String configurationName=null; + + protected final Rocket rocket; + protected final FlightConfigurationId fcid; + + private static int configurationInstanceCount=0; + // made public for testing.... there is probably a better way + public final int configurationInstanceId; + + private class StageFlags implements Cloneable { + public boolean active = true; + //public int prev = -1; + public int stageNumber = -1; + + public StageFlags( int _num, boolean _active) { + this.stageNumber = _num; + this.active = _active; + } + + @Override + public StageFlags clone(){ + return new StageFlags( this.stageNumber, true); + } + } + + /* Cached data */ + final protected HashMap stages = new HashMap(); + final protected HashMap motors = new HashMap(); + + private int boundsModID = -1; + private BoundingBox cachedBounds = new BoundingBox(); + private double cachedLength = -1; + + private int refLengthModID = -1; + private double cachedRefLength = -1; + + private int modID = 0; /** - * Return the default parameter value for this FlightConfiguration. - * This is used in case a per-flight configuration override - * has not been defined. + * Create a new configuration with the specified Rocket. + * + * @param _fcid the ID this configuration should have. + * @param rocket the rocket + */ + public FlightConfiguration(final Rocket rocket, final FlightConfigurationId _fcid ) { + if( null == _fcid){ + this.fcid = new FlightConfigurationId(); + }else{ + this.fcid = _fcid; + } + this.rocket = rocket; + this.configurationName = null; + this.configurationInstanceId = configurationInstanceCount++; + + updateStages(); + updateMotors(); + } + + public Rocket getRocket() { + return rocket; + } + + + public void clearAllStages() { + this._setAllStages(false); + this.updateMotors(); + } + + public void setAllStages() { + this._setAllStages(true); + this.updateMotors(); + } + + private void _setAllStages(final boolean _active) { + for (StageFlags cur : stages.values()) { + cur.active = _active; + } + } + + public void copyStages(FlightConfiguration other) { + for (StageFlags cur : other.stages.values()) + stages.put(cur.stageNumber, new StageFlags(cur.stageNumber, cur.active)); + } + + /** + * This method flags a stage inactive. Other stages are unaffected. * - * @return the default parameter value (never null) + * @param stageNumber stage number to turn off */ - public E getDefault(); + public void clearStage(final int stageNumber) { + _setStageActive( stageNumber, false ); + } + /** + * This method flags the specified stage as active, and all other stages as inactive. + * + * @param stageNumber stage number to activate + */ + public void setOnlyStage(final int stageNumber) { + _setAllStages(false); + _setStageActive(stageNumber, true); + updateMotors(); + } + + /** + * This method flags the specified stage as requested. Other stages are unaffected. + * + * @param stageNumber stage number to flag + * @param _active inactive (false) or active (true) + */ + private void _setStageActive(final int stageNumber, final boolean _active ) { + if ((0 <= stageNumber) && (stages.containsKey(stageNumber))) { + stages.get(stageNumber).active = _active; + return; + } + log.error("error: attempt to retrieve via a bad stage number: " + stageNumber); + } + + + public void toggleStage(final int stageNumber) { + if ((0 <= stageNumber) && (stages.containsKey(stageNumber))) { + StageFlags flags = stages.get(stageNumber); + flags.active = !flags.active; + return; + } + this.updateMotors(); + log.error("error: attempt to retrieve via a bad stage number: " + stageNumber); + } + + /** - * Set the default parameter value for this FlightConfiguration. + * Check whether the stage specified by the index is active. + */ + public boolean isStageActive(int stageNumber) { + if( -1 == stageNumber ) { + return false; + } + + return stages.get(stageNumber).active; + } + + public Collection getAllComponents() { + Queue toProcess = new ArrayDeque(); + toProcess.offer(this.rocket); + + ArrayList toReturn = new ArrayList<>(); + + while (!toProcess.isEmpty()) { + RocketComponent comp = toProcess.poll(); + + toReturn.add(comp); + for (RocketComponent child : comp.getChildren()) { + if (!(child instanceof AxialStage)) { + toProcess.offer(child); + } + } + } + + return toReturn; + } + + // this method is deprecated because it ignores instancing of parent components (e.g. Strapons or pods ) + // depending on your context, this may or may not be what you want. + // recomend migrating to either: `getAllComponents` or `getActiveInstances` + @Deprecated + public Collection getActiveComponents() { + Queue toProcess = new ArrayDeque(this.getActiveStages()); + ArrayList toReturn = new ArrayList<>(); + + while (!toProcess.isEmpty()) { + RocketComponent comp = toProcess.poll(); + + toReturn.add(comp); + for (RocketComponent child : comp.getChildren()) { + if (!(child instanceof AxialStage)) { + toProcess.offer(child); + } + } + } + + return toReturn; + } + + /* + * Generates a read-only, instance-aware collection of the components for this rocket & configuration * - * @param value the parameter value (null not allowed) + * TODO: swap in this function for the 'getActiveComponents() function, above; ONLY WHEN READY / MATURE! + */ + public InstanceMap getActiveInstances() { + InstanceMap contexts = new InstanceMap(); + getContextListAt( this.rocket, contexts, Transformation.IDENTITY); + return contexts; + } + + private InstanceMap getContextListAt(final RocketComponent component, final InstanceMap results, final Transformation parentTransform ){ + final int instanceCount = component.getInstanceCount(); + final Coordinate[] allOffsets = component.getInstanceOffsets(); + final double[] allAngles = component.getInstanceAngles(); + final boolean active = this.isComponentActive(component); + + final Transformation compLocTransform = Transformation.getTranslationTransform( component.getPosition() ); + final Transformation componentTransform = parentTransform.applyTransformation(compLocTransform); + + // generate the Instance's Context: + for(int currentInstanceNumber=0; currentInstanceNumber < instanceCount; currentInstanceNumber++) { + + final Coordinate instanceOffset = allOffsets[currentInstanceNumber]; + final Transformation offsetTransform = Transformation.getTranslationTransform( instanceOffset ); + + final double instanceAngle = allAngles[currentInstanceNumber]; + final Transformation angleTransform = Transformation.getAxialRotation(instanceAngle); + + final Transformation currentTransform = componentTransform.applyTransformation(offsetTransform) + .applyTransformation(angleTransform); + + // constructs entry in-place + results.emplace(component, active, currentInstanceNumber, currentTransform); + + for(RocketComponent child : component.getChildren()) { + getContextListAt(child, results, currentTransform); + } + } + + return results; + } + + public List getActiveStages() { + List activeStages = new ArrayList<>(); + + for (StageFlags flags : this.stages.values()) { + if (flags.active) { + activeStages.add( rocket.getStage( flags.stageNumber) ); + } + } + + return activeStages; + } + + public int getActiveStageCount() { + int activeCount = 0; + for (StageFlags cur : this.stages.values()) { + if (cur.active) { + activeCount++; + } + } + return activeCount; + } + + /** + * @return the component for the bottom-most center, active stage. */ - public void setDefault(E value); + public AxialStage getBottomStage() { + AxialStage bottomStage = null; + for (StageFlags curFlags : this.stages.values()) { + if (curFlags.active) { + bottomStage = rocket.getStage( curFlags.stageNumber); + } + } + return bottomStage; + } + public int getStageCount() { + return stages.size(); + } /** - * Return the parameter value for the provided flight configuration ID. - * This returns either the value specified for this flight config ID, - * or the default value. + * Return the reference length associated with the current configuration. The + * reference length type is retrieved from the Rocket. * - * @param id the flight configuration ID - * @return the parameter to use (never null) + * @return the reference length for this configuration. */ - public E get(String id); + public double getReferenceLength() { + if (rocket.getModID() != refLengthModID) { + refLengthModID = rocket.getModID(); + cachedRefLength = rocket.getReferenceType().getReferenceLength(this); + } + return cachedRefLength; + } + public double getReferenceArea() { + return Math.PI * MathUtil.pow2(getReferenceLength() / 2); + } + + public FlightConfigurationId getFlightConfigurationID() { + return fcid; + } + + public FlightConfigurationId getId() { + return fcid; + } + + //////////////// Listeners //////////////// + + // for outgoing events only + protected void fireChangeEvent() { + this.modID++; + boundsModID = -1; + refLengthModID = -1; + + updateStages(); + updateMotors(); + } + + private void updateStages() { + if (this.rocket.getStageCount() == this.stages.size()) { + return; + } + + this.stages.clear(); + for (AxialStage curStage : this.rocket.getStageList()) { + + StageFlags flagsToAdd = new StageFlags( curStage.getStageNumber(), true); + this.stages.put(curStage.getStageNumber(), flagsToAdd); + } + } + + public boolean isNameOverridden(){ + return (null != this.configurationName ); + } + + public String getName() { + if( null == configurationName){ + return this.getOneLineMotorDescription(); + }else{ + return configurationName; + } + } + + private String getOneLineMotorDescription(){ + StringBuilder buff = new StringBuilder("["); + boolean first = true; + int activeMotorCount = 0; + for ( RocketComponent comp : getActiveComponents() ){ + if (( comp instanceof MotorMount )&&( ((MotorMount)comp).isMotorMount())){ + MotorMount mount = (MotorMount)comp; + MotorConfiguration motorConfig = mount.getMotorConfig( fcid); + + if( first ){ + first = false; + }else{ + buff.append(";"); + } + + if( ! motorConfig.isEmpty()){ + buff.append(motorConfig.toMotorDesignation()); + ++activeMotorCount; + } + } + } + if( 0 == activeMotorCount ){ + return trans.get("noMotors"); + } + buff.append("]"); + return buff.toString(); + } + + @Override + public String toString() { return this.getName(); } + /** - * Set the parameter value for the provided flight configuration ID. - * This sets the override for this flight configuration ID. + * Add a motor instance to this configuration. * - * @param id the flight configuration ID - * @param value the parameter value (null not allowed) + * @param motorConfig the motor instance. + * @throws IllegalArgumentException if a motor with the specified ID already exists. */ - public void set(String id, E value); + public void addMotor(MotorConfiguration motorConfig) { + if( motorConfig.isEmpty() ){ + log.error("attempt to add an empty motorConfig! ignoring. ", new IllegalArgumentException("empty MotorInstance: "+motorConfig.toDebugDetail())); + } + + this.motors.put( motorConfig.getID(), motorConfig); + + modID++; + } + + public boolean hasMotors() { + return (0 < motors.size()); + } + + public Collection getAllMotors() { + return this.motors.values(); + } + public Collection getActiveMotors() { + Collection activeMotors = new ArrayList(); + for( MotorConfiguration config : this.motors.values() ){ + if( isComponentActive( config.getMount() )){ + activeMotors.add( config ); + } + } + + return activeMotors; + } + + private void updateMotors() { + this.motors.clear(); + + for ( RocketComponent comp : getActiveComponents() ){ + if (( comp instanceof MotorMount )&&( ((MotorMount)comp).isMotorMount())){ + MotorMount mount = (MotorMount)comp; + MotorConfiguration motorConfig = mount.getMotorConfig( fcid); + if( motorConfig.isEmpty()){ + continue; + } + + this.motors.put( motorConfig.getMID(), motorConfig); + } + } + + } + + @Override + public void update(){ + updateStages(); + updateMotors(); + } + + /////////////// Helper methods /////////////// + + /** + * Return whether a component is in a currently active stages. + */ + public boolean isComponentActive(final RocketComponent c) { + int stageNum = c.getStageNumber(); + return this.isStageActive( stageNum ); + } + + public boolean isComponentActive(final MotorMount c) { + return isComponentActive( (RocketComponent) c); + } /** - * Return whether a specific flight configuration ID is using the - * default value. + * Return the bounds of the current configuration. The bounds are cached. + * + * @return a Collection containing coordinates bounding the rocket. + * + * @deprecated Migrate to .getBoundingBox(), when practical. + */ + @Deprecated + public Collection getBounds() { + return getBoundingBox().toCollection(); + } + + /** + * Return the bounding box of the current configuration. * - * @param id the flight configuration ID - * @return whether the default is being used + * @return the rocket's bounding box (under the selected configuration) */ - public boolean isDefault(String id); + public BoundingBox getBoundingBox() { + if (rocket.getModID() != boundsModID) { + calculateBounds(); + } + return cachedBounds; + } + + private void calculateBounds(){ + BoundingBox bounds = new BoundingBox(); + + for (RocketComponent component : this.getActiveComponents()) { + BoundingBox componentBounds = new BoundingBox().update(component.getComponentBounds()); + bounds.update( componentBounds ); + } + + boundsModID = rocket.getModID(); + cachedLength = bounds.span().x; + cachedBounds.update( bounds ); + } /** - * Reset a specific flight configuration ID to use the default parameter value. + * Returns the length of the rocket configuration, from the foremost bound X-coordinate + * to the aft-most X-coordinate. The value is cached. * - * @param id the flight configuration ID + * @return the length of the rocket in the X-direction. */ - public void resetDefault(String id); + public double getLength() { + if (rocket.getModID() != boundsModID) { + calculateBounds(); + } + return cachedLength; + } /** - * Return the number of specific flight configurations other than the default. - * @return + * Perform a shallow-clone; copies configuration fields only. + * + * Preserved: + * - components + * - motors + * - configurables + * */ - public int size(); + @Override + public FlightConfiguration clone() { + + // Note the stages are updated in the constructor call. + FlightConfiguration clone = new FlightConfiguration( this.rocket, this.fcid ); + clone.setName(configurationName); + + clone.cachedBounds = this.cachedBounds.clone(); + clone.modID = this.modID; + clone.boundsModID = -1; + clone.refLengthModID = -1; + return clone; + } + + /** + * Copy all available information attached to this, and attached copies to the + * new configuration + * + * @param newId attached the new configuration to this Id + * @return the new configuration + */ + @Override + public FlightConfiguration copy( final FlightConfigurationId newId ) { + // Note the stages are updated in the constructor call. + FlightConfiguration copy= new FlightConfiguration( this.rocket, newId ); + final FlightConfigurationId copyId = copy.getId(); + + // copy motor instances. + for( final MotorConfiguration sourceMotor: motors.values() ){ + MotorConfiguration cloneMotor = sourceMotor.copy( copyId); + copy.addMotor( cloneMotor); + cloneMotor.getMount().setMotorConfig(cloneMotor, copyId); + } + + copy.cachedBounds = this.cachedBounds.clone(); + copy.modID = this.modID; + copy.boundsModID = -1; + copy.refLengthModID = -1; + return copy; + } + + @Override + public int getModID() { + // TODO: this doesn't seem consistent... + int id = modID; +// for (MotorInstance motor : motors.values()) { +// id += motor.getModID(); +// } + id += rocket.getModID(); + return id; + } + + public void setName( final String newName) { + if(( null == newName ) ||( "".equals(newName))){ + this.configurationName = null; + return; + }else if( ! this.getId().isValid()){ + return; + }else if( newName.equals(this.configurationName)){ + return; + } + this.configurationName = newName; + } + + @Override + public boolean equals(Object other){ + return (( other instanceof FlightConfiguration ) && + this.fcid.equals( ((FlightConfiguration)other).fcid)); + } + + @Override + public int hashCode(){ + return this.fcid.hashCode(); + } + + public String toDebug() { + return this.fcid.toDebug()+" (#"+configurationInstanceId+") "+ getOneLineMotorDescription(); + } + + // DEBUG / DEVEL + public String toStageListDetail() { + StringBuilder buf = new StringBuilder(); + buf.append(String.format("\nDumping %d stages for config: %s: (%s)(#: %d)\n", + stages.size(), getName(), getId().toShortKey(), configurationInstanceId)); + final String fmt = " [%-2s][%4s]: %6s \n"; + buf.append(String.format(fmt, "#", "?actv", "Name")); + for (StageFlags flags : stages.values()) { + final int stageNumber = flags.stageNumber; + buf.append(String.format(fmt, stageNumber, (flags.active?" on": "off"), rocket.getStage( stageNumber).getName())); + } + buf.append("\n"); + return buf.toString(); + } + + // DEBUG / DEVEL + public String toMotorDetail(){ + StringBuilder buf = new StringBuilder(); + buf.append(String.format("\nDumping %2d Motors for configuration %s (%s)(#: %s)\n", + motors.size(), getName(), getId().toShortKey(), this.configurationInstanceId)); + + for( MotorConfiguration curConfig : this.motors.values() ){ + boolean active=this.isStageActive( curConfig.getMount().getStage().getStageNumber()); + String activeString = (active?"active":" "); + buf.append(" "+"("+activeString+")"+curConfig.toDebugDetail()+"\n"); + } + buf.append("\n"); + return buf.toString(); + } + + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationId.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationId.java new file mode 100644 index 0000000000..258fd7fe5b --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationId.java @@ -0,0 +1,151 @@ +package net.sf.openrocket.rocketcomponent; + +import java.util.UUID; + +/** + * FlightConfigurationID is a very minimal wrapper class used to identify a given flight configuration for various components and options. + * It is intended to provide better visibility and traceability by more specific type safety -- this class replaces a + * straight-up String Key in previous implementations. + */ +public final class FlightConfigurationId implements Comparable { + final public UUID key; + + private final static long DEFAULT_MOST_SIG_BITS = 0xF4F2F1F0; + private final static UUID ERROR_UUID = new UUID( DEFAULT_MOST_SIG_BITS, 2489); + private final static String ERROR_KEY_NAME = "ErrorKey".intern(); + private final static UUID DEFAULT_VALUE_UUID = new UUID( DEFAULT_MOST_SIG_BITS, 5676); + private final static String DEFAULT_VALUE_NAME = "DefaultKey".intern(); + + public final static FlightConfigurationId ERROR_FCID = new FlightConfigurationId( FlightConfigurationId.ERROR_UUID); + public final static FlightConfigurationId DEFAULT_VALUE_FCID = new FlightConfigurationId( FlightConfigurationId.DEFAULT_VALUE_UUID ); + + /** + * default constructor, builds with an unique random ID + */ + public FlightConfigurationId() { + this(UUID.randomUUID()); + } + + /** + * builds the id with the given String + * @param _str te string to be made into the id + */ + public FlightConfigurationId(final String _str) { + UUID candidate; + if(_str == null || "".equals(_str)){ + candidate = UUID.randomUUID(); + }else{ + try{ + candidate = UUID.fromString( _str); + }catch( IllegalArgumentException iae ){ + candidate = new UUID( 0, _str.hashCode() ); + } + } + this.key = candidate; + } + + /** + * builds he id with the given UUID object + * @param _val the UUID to be made into the id + */ + public FlightConfigurationId(final UUID _val) { + if (null == _val){ + this.key = FlightConfigurationId.ERROR_UUID; + } else { + this.key = _val; + } + } + + /** + * {@inheritDoc} + * considers equals ids with the same key + */ + @Override + public boolean equals(Object anObject) { + if (!(anObject instanceof FlightConfigurationId)) { + return false; + } + + FlightConfigurationId otherFCID = (FlightConfigurationId) anObject; + return this.key.equals(otherFCID.key); + } + + /** + * + * @return + */ + public String toShortKey(){ + if( hasError() ) + return FlightConfigurationId.ERROR_KEY_NAME; + if( isDefaultId()) + return FlightConfigurationId.DEFAULT_VALUE_NAME; + return this.key.toString().substring(0,8); + + } + + //extracted this method because maybe, just maybe, this info could be used somewhere else + /** + * gets if the id is the default + * @return if the id is default + */ + private boolean isDefaultId() { + return this.key == FlightConfigurationId.DEFAULT_VALUE_UUID; + } + + /** + * returns the whole key in the id + * @return the full key of the id + */ + public String toFullKey(){ + return this.toString(); + } + + /** + * {@inheritDoc} + * uses the key hash code + */ + @Override + public int hashCode() { + return this.key.hashCode(); + } + + /** + * checks if the key is the ERROR_UUID flag + * @return if the id has error + */ + public boolean hasError(){ + return (ERROR_UUID == this.key); + } + + /** + * checks if the key from the id is valid + * @return if the id is valid or not + */ + public boolean isValid() { + return !hasError(); + } + + /** + * {@inheritDoc} + * same as get full id + */ + @Override + public String toString() { + return this.key.toString(); + } + + @Override + public int compareTo(FlightConfigurationId other) { + return this.key.compareTo( other.key); + } + + /** + * used for debuggin, gets the short key + * @return the short key version of the id + */ + public String toDebug(){ + return this.toShortKey(); + } + + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationImpl.java b/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationImpl.java deleted file mode 100644 index 91fa99d603..0000000000 --- a/core/src/net/sf/openrocket/rocketcomponent/FlightConfigurationImpl.java +++ /dev/null @@ -1,168 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import java.util.EventObject; -import java.util.HashMap; -import java.util.Iterator; - -import net.sf.openrocket.util.StateChangeListener; -import net.sf.openrocket.util.Utils; - -/** - * An implementation of FlightConfiguration that fires off events - * to the rocket components when the parameter value is changed. - * - * @param the parameter type - */ -class FlightConfigurationImpl> implements FlightConfiguration { - - private final HashMap map = new HashMap(); - private E defaultValue = null; - - private final RocketComponent component; - private final int eventType; - - private final Listener listener = new Listener(); - - - /** - * Construct a FlightConfiguration that has no overrides. - * - * @param component the rocket component on which events are fired when the parameter values are changed - * @param eventType the event type that will be fired on changes - * @param defaultValue the default value (null not allowed) - */ - public FlightConfigurationImpl(RocketComponent component, int eventType, E defaultValue) { - this.component = component; - this.eventType = eventType; - this.defaultValue = defaultValue; - - if (defaultValue == null) { - throw new NullPointerException("defaultValue is null"); - } - add(defaultValue); - } - - - /** - * Construct a copy of an existing FlightConfigurationImpl. - * - * @param component the rocket component on which events are fired when the parameter values are changed - * @param eventType the event type that will be fired on changes - */ - public FlightConfigurationImpl(FlightConfigurationImpl flightConfiguration, RocketComponent component, int eventType) { - this.component = component; - this.eventType = eventType; - - this.defaultValue = flightConfiguration.defaultValue.clone(); - for (String key : flightConfiguration.map.keySet()) { - this.map.put(key, flightConfiguration.map.get(key).clone()); - } - } - - - - @Override - public E getDefault() { - return defaultValue; - } - - @Override - public void setDefault(E value) { - if (value == null) { - throw new NullPointerException("value is null"); - } - if (Utils.equals(this.defaultValue, value)) { - return; - } - remove(this.defaultValue); - this.defaultValue = value; - add(value); - fireEvent(); - } - - @Override - public Iterator iterator() { - return map.values().iterator(); - } - - - @Override - public int size() { - return map.size(); - } - - - @Override - public E get(String id) { - if (map.containsKey(id)) { - return map.get(id); - } else { - return defaultValue; - } - } - - @Override - public void set(String id, E value) { - if (value == null) { - throw new NullPointerException("value is null"); - } - E previous = map.put(id, value); - remove(previous); - add(value); - fireEvent(); - } - - @Override - public boolean isDefault(String id) { - return !map.containsKey(id); - } - - @Override - public void resetDefault(String id) { - E previous = map.remove(id); - remove(previous); - fireEvent(); - } - - - - private void fireEvent() { - component.fireComponentChangeEvent(eventType); - } - - - @Override - public void cloneFlightConfiguration(String oldConfigId, String newConfigId) { - if (isDefault(oldConfigId)) { - this.resetDefault(newConfigId); - } else { - E original = this.get(oldConfigId); - this.set(newConfigId, original.clone()); - } - } - - - - private void add(E value) { - if (value != null) { - value.addChangeListener(listener); - } - } - - - private void remove(E value) { - if (value != null) { - value.removeChangeListener(listener); - } - } - - - private class Listener implements StateChangeListener { - @Override - public void stateChanged(EventObject e) { - fireEvent(); - } - } - - -} diff --git a/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java index 8924eb3baa..47d01afd05 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java @@ -1,27 +1,32 @@ package net.sf.openrocket.rocketcomponent; +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.ArrayList; -import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; public class FreeformFinSet extends FinSet { private static final Logger log = LoggerFactory.getLogger(FreeformFinSet.class); private static final Translator trans = Application.getTranslator(); + + // this class uses certain features of 'ArrayList' which are not implemented in other 'List' implementations. + private ArrayList points = new ArrayList<>(); - private ArrayList points = new ArrayList(); + private static final double SNAP_SMALLER_THAN = 5e-3; + private static final double IGNORE_SMALLER_THAN = 1e-12; public FreeformFinSet() { - points.add(Coordinate.NUL); + points.add(Coordinate.ZERO); points.add(new Coordinate(0.025, 0.05)); points.add(new Coordinate(0.075, 0.05)); points.add(new Coordinate(0.05, 0)); @@ -29,25 +34,6 @@ public FreeformFinSet() { this.length = 0.05; } - - public FreeformFinSet(Coordinate[] finpoints) throws IllegalFinPointException { - setPoints(finpoints); - } - - /* - public FreeformFinSet(FinSet finset) { - Coordinate[] finpoints = finset.getFinPoints(); - this.copyFrom(finset); - - points.clear(); - for (Coordinate c: finpoints) { - points.add(c); - } - this.length = points.get(points.size()-1).x - points.get(0).x; - } - */ - - /** * Convert an existing fin set into a freeform fin set. The specified * fin set is taken out of the rocket tree (if any) and the new component @@ -59,11 +45,10 @@ public FreeformFinSet(FinSet finset) { * @return the new freeform fin set. */ public static FreeformFinSet convertFinSet(FinSet finset) { - log.info("Converting " + finset.getComponentName() + " into freeform fin set"); final RocketComponent root = finset.getRoot(); FreeformFinSet freeform; - List toInvalidate = Collections.emptyList(); - + List toInvalidate = new ArrayList<>(); + try { if (root instanceof Rocket) { ((Rocket) root).freeze(); @@ -79,16 +64,11 @@ public static FreeformFinSet convertFinSet(FinSet finset) { position = -1; } - // Create the freeform fin set - Coordinate[] finpoints = finset.getFinPoints(); - try { - freeform = new FreeformFinSet(finpoints); - } catch (IllegalFinPointException e) { - throw new BugException("Illegal fin points when converting existing fin to " + - "freeform fin, fin=" + finset + " points=" + Arrays.toString(finpoints), - e); - } + Coordinate[] finPoints = finset.getFinPoints(); + freeform = new FreeformFinSet(); + freeform.setPoints(finPoints); + freeform.setAxialOffset(finset.getAxialMethod(), finset.getAxialOffset()); // Copy component attributes toInvalidate = freeform.copyFrom(finset); @@ -121,28 +101,21 @@ public static FreeformFinSet convertFinSet(FinSet finset) { return freeform; } - - /** * Add a fin point between indices index-1 and index. * The point is placed at the midpoint of the current segment. * * @param index the fin point before which to add the new point. + * @param location the target location to create the new point at */ - public void addPoint(int index) { - double x0, y0, x1, y1; - - x0 = points.get(index - 1).x; - y0 = points.get(index - 1).y; - x1 = points.get(index).x; - y1 = points.get(index).y; + public void addPoint(int index, Point2D.Double location) { + // new method: add new point at closest point + points.add(index, new Coordinate(location.x, location.y)); - points.add(index, new Coordinate((x0 + x1) / 2, (y0 + y1) / 2)); // adding a point within the segment affects neither mass nor aerodynamics fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } - /** * Remove the fin point with the given index. The first and last fin points * cannot be removed, and will cause an IllegalFinPointException @@ -156,12 +129,16 @@ public void removePoint(int index) throws IllegalFinPointException { throw new IllegalFinPointException("cannot remove first or last point"); } - ArrayList copy = this.points.clone(); - copy.remove(index); - validate(copy); - this.points = copy; + // copy the old list in case the operation fails + ArrayList copy = new ArrayList<>(this.points); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + this.points.remove(index); + if (intersects()) { + // if error, rollback. + this.points = copy; + } + + fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE); } @@ -169,135 +146,100 @@ public int getPointCount() { return points.size(); } - public void setPoints(Coordinate[] points) throws IllegalFinPointException { - setPoints(Arrays.asList(points)); + /** maintained just for backwards compatibility: + */ + public void setPoints(Coordinate[] newPoints) { + setPoints(new ArrayList<>(Arrays.asList(newPoints))); } - public void setPoints(List points) throws IllegalFinPointException { - ArrayList list = new ArrayList(points); - validate(list); - this.points = list; - - this.length = points.get(points.size() - 1).x; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + /** + * The first point is assumed to be at the origin. If it isn't, it will be moved there. + * + * @param newPoints New points to set as the exposed edges of the fin + */ + public void setPoints( ArrayList newPoints) { + + final Coordinate delta = newPoints.get(0).multiply(-1); + if( IGNORE_SMALLER_THAN < delta.length2()){ + newPoints = translatePoints( newPoints, delta); + } + + // copy the old points, in case validation fails + final ArrayList pointsCopy = new ArrayList<>(this.points); + final double lengthCopy = this.length; + + this.points = newPoints; + + update(); + + if( intersects()){ + // on error, reset to the old points + this.points = pointsCopy; + this.length = lengthCopy; + } + + fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE); } - - + /** * Set the point at position i to coordinates (x,y). *

- * Note that this method enforces basic fin shape restrictions (non-negative y, - * first and last point locations) silently, but throws an - * IllegalFinPointException if the point causes fin segments to - * intersect. - *

+ * Note that this method silently enforces basic fin shape restrictions + * - points may not be within the parent body. + * - first point occurs before last (and vice versa) + * - first and last points must be on the parent body + * - non-self-intersecting fin shape (aborts set on invalid fin point) + *

+ * NOTE: the fin-point axes differ from rocket axes: + * +x within the fin points foreward; +x for the rocket points aft + *

* Moving of the first point in the X-axis is allowed, but this actually moves - * all of the other points the corresponding distance back. + * all of the other points the corresponding distance back, relative to the first. + * That is, moving the first point should not change how the rest of the + * points are positioned *relative to the fin-mount*. * * @param index the point index to modify. - * @param x the x-coordinate. - * @param y the y-coordinate. - * @throws IllegalFinPointException if the specified fin point would cause intersecting - * segments + * @param xRequest the x-coordinate. + * @param yRequest the y-coordinate. */ - public void setPoint(int index, double x, double y) throws IllegalFinPointException { - if (y < 0) - y = 0; - - double x0, y0, x1, y1; - - if (index == 0) { - - // Restrict point - x = Math.min(x, points.get(points.size() - 1).x); - y = 0; - x0 = Double.NaN; - y0 = Double.NaN; - x1 = points.get(1).x; - y1 = points.get(1).y; - - } else if (index == points.size() - 1) { - - // Restrict point - x = Math.max(x, 0); - y = 0; - x0 = points.get(index - 1).x; - y0 = points.get(index - 1).y; - x1 = Double.NaN; - y1 = Double.NaN; - - } else { - - x0 = points.get(index - 1).x; - y0 = points.get(index - 1).y; - x1 = points.get(index + 1).x; - y1 = points.get(index + 1).y; - - } - - - - // Check for intersecting - double px0, py0, px1, py1; - px0 = 0; - py0 = 0; - for (int i = 1; i < points.size(); i++) { - px1 = points.get(i).x; - py1 = points.get(i).y; - - if (i != index - 1 && i != index && i != index + 1) { - if (intersects(x0, y0, x, y, px0, py0, px1, py1)) { - throw new IllegalFinPointException("segments intersect"); - } - } - if (i != index && i != index + 1 && i != index + 2) { - if (intersects(x, y, x1, y1, px0, py0, px1, py1)) { - throw new IllegalFinPointException("segments intersect"); - } - } - - px0 = px1; - py0 = py1; - } - - if (index == 0) { - - //System.out.println("Set point zero to x:" + x); - for (int i = 1; i < points.size(); i++) { - Coordinate c = points.get(i); - points.set(i, c.setX(c.x - x)); + public void setPoint(final int index, final double xRequest, final double yRequest) { + + if(null != this.getParent()) { + final Coordinate prior = points.get(index); + points.set(index, new Coordinate(xRequest, yRequest)); + + if((points.size() - 1) == index){ + clampLastPoint(xRequest-prior.x); } - - } else { - - points.set(index, new Coordinate(x, y)); - } - if (index == 0 || index == points.size() - 1) { - this.length = points.get(points.size() - 1).x; + + update(); + + // this maps the last index and the next-to-last-index to the same 'testIndex' + int testIndex = Math.min(index, (points.size() - 2)); + if (intersects(testIndex)) { + // intersection found! log error and abort! + log.error(String.format("ERROR: found an intersection while setting fin point #%d to [%6.4g, %6.4g] : ABORTING setPoint(..) !! ", index, xRequest, yRequest)); + return; } - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - - - private boolean intersects(double ax0, double ay0, double ax1, double ay1, - double bx0, double by0, double bx1, double by1) { - - double d = ((by1 - by0) * (ax1 - ax0) - (bx1 - bx0) * (ay1 - ay0)); - - double ua = ((bx1 - bx0) * (ay0 - by0) - (by1 - by0) * (ax0 - bx0)) / d; - double ub = ((ax1 - ax0) * (ay0 - by0) - (ay1 - ay0) * (ax0 - bx0)) / d; - - return (ua >= 0) && (ua <= 1) && (ub >= 0) && (ub <= 1); + private void movePoints(final double delta_x, final double delta_y) { + // zero-out 0th index -- it's the local origin and is always (0,0) + points.set(0, Coordinate.ZERO); + + for (int index = 1; index < points.size(); ++index) { + final Coordinate oldPoint = this.points.get(index); + final Coordinate newPoint = oldPoint.add(delta_x, delta_y, 0.0f); + points.set(index, newPoint); + } } - - + @Override public Coordinate[] getFinPoints() { return points.toArray(new Coordinate[0]); } - + @Override public double getSpan() { double max = 0; @@ -314,31 +256,174 @@ public String getComponentName() { return trans.get("FreeformFinSet.FreeformFinSet"); } - @Override protected RocketComponent copyWithOriginalID() { RocketComponent c = super.copyWithOriginalID(); - ((FreeformFinSet) c).points = this.points.clone(); + + ((FreeformFinSet) c).points = new ArrayList<>(this.points); + return c; } + + @Override + public void update() { + this.length = points.get(points.size() -1).x - points.get(0).x; + this.setAxialOffset(this.axialMethod, this.axialOffset); + + if(null != this.getParent()) { + clampFirstPoint(); + + for(int i=1; i < points.size()-1; i++) { + clampInteriorPoint(i); + } + + clampLastPoint(); + + validateFinTab(); + } + } + + private void clampFirstPoint() { + final SymmetricComponent body = (SymmetricComponent) getParent(); + + final Coordinate finFront = getFinFront(); + final double xFinFront = finFront.x; // x of fin start, body-frame + final double yFinFront = finFront.y; // y of fin start, body-frame + + final Coordinate p0 = points.get(0); + + if( ! Coordinate.ZERO.equals(p0)){ + double xDelta = p0.x; + double xTrail = points.get(points.size() - 1).x; + if(xDelta > xTrail){ + xDelta = xTrail; + } + double yDelta = body.getRadius(xFinFront + xDelta) - yFinFront; + + movePoints(-xDelta, -yDelta); + + if(AxialMethod.TOP == getAxialMethod()) { + this.axialOffset = axialOffset + xDelta; + this.position = this.position.add(xDelta, 0, 0); + } else if (AxialMethod.MIDDLE == getAxialMethod()) { + this.axialOffset = axialOffset + xDelta / 2; + } + } + + final int lastIndex = points.size()-1; + this.length = points.get(lastIndex).x; + + } + + private void clampInteriorPoint(final int index) { + final SymmetricComponent sym = (SymmetricComponent) this.getParent(); + + final Coordinate finFront = getFinFront(); + final double xFinFront = finFront.x; // x of fin start, body-frame + final double yFinFront = finFront.y; // y of fin start, body-frame + + final double xBodyFront = -xFinFront; + final double xBodyBack = xBodyFront + sym.getLength(); + + final double xPrior = points.get(index).x; + final double yPrior = points.get(index).y; + + if((xBodyFront <= xPrior ) && ( xPrior <= xBodyBack )) { + final double yBody = sym.getRadius(xPrior + xFinFront) - yFinFront; + + // ensure that an interior point is outside of its mounting body: + if (yBody > yPrior) { + points.set(index, points.get(index).setY(yBody)); + } + } + + } + + private void clampLastPoint() { + clampLastPoint(0); + } + + private void clampLastPoint(final double xDelta) { + final SymmetricComponent body = (SymmetricComponent) getParent(); + + final Coordinate finFront = getFinFront(); + final double xFinStart = finFront.x; // x of fin start, body-frame + final double yFinStart = finFront.y; // y of fin start, body-frame + + int lastIndex = points.size() - 1; + final Coordinate last = points.get(lastIndex); + + double yBody = body.getRadius(xFinStart + last.x) - yFinStart; + double yDelta = yBody - last.y; + if( IGNORE_SMALLER_THAN < Math.abs(yDelta)){ + // i.e. if it delta is close enough above OR is inside the body. In either case, snap it to the body. + + // => set y-value to *exactly* match parent body: + points.set(lastIndex, new Coordinate(last.x, yBody)); + } + + if( IGNORE_SMALLER_THAN < Math.abs(xDelta)) { + this.length = points.get(lastIndex).x; + if (AxialMethod.MIDDLE == getAxialMethod()) { + this.axialOffset = axialOffset + xDelta/2; + } else if (AxialMethod.BOTTOM == getAxialMethod()) { + this.axialOffset = axialOffset + xDelta; + } + } + } + + /** + * Check if *any* of the fin-point line segments intersects with another. + * + * @return true if an intersection is found + */ + public boolean intersects() { + for (int index = 0; index < (this.points.size() - 1); ++index) { + if (intersects(index)) { + return true; + } + } + return false; + } - private void validate(ArrayList pts) throws IllegalFinPointException { - final int n = pts.size(); - if (pts.get(0).x != 0 || pts.get(0).y != 0 || - pts.get(n - 1).x < 0 || pts.get(n - 1).y != 0) { - throw new IllegalFinPointException("Start or end point illegal."); + /** + * Check if the line segment from targetIndex to targetIndex+1 intersects with any other part of the fin. + * + * @return true if an intersection was found + */ + private boolean intersects(final int targetIndex) { + if ((points.size() - 2) < targetIndex) { + throw new IndexOutOfBoundsException("request validate of non-existent fin edge segment: " + targetIndex + "/" + points.size()); } - for (int i = 0; i < n - 1; i++) { - for (int j = i + 2; j < n - 1; j++) { - if (intersects(pts.get(i).x, pts.get(i).y, pts.get(i + 1).x, pts.get(i + 1).y, - pts.get(j).x, pts.get(j).y, pts.get(j + 1).x, pts.get(j + 1).y)) { - throw new IllegalFinPointException("segments intersect"); - } + + // (pre-check the indices above.) + final Point2D.Double pt1 = new Point2D.Double(points.get(targetIndex).x, points.get(targetIndex).y); + final Point2D.Double pt2 = new Point2D.Double(points.get(targetIndex + 1).x, points.get(targetIndex + 1).y); + final Line2D.Double targetLine = new Line2D.Double(pt1, pt2); + + for (int comparisonIndex = targetIndex+1; comparisonIndex < (points.size() - 1); ++comparisonIndex) { + if (2 > Math.abs(targetIndex - comparisonIndex)) { + // a line segment will trivially not intersect with itself + // nor can adjacent line segments intersect with each other, because they share a common endpoint. + continue; + } + final Point2D.Double pc1 = new Point2D.Double(points.get(comparisonIndex).x, points.get(comparisonIndex).y); // p1 + final Point2D.Double pc2 = new Point2D.Double(points.get(comparisonIndex + 1).x, points.get(comparisonIndex + 1).y); // p2 + + // special case for when the first and last points are co-located. + if((0==targetIndex)&&(points.size()==comparisonIndex+2)&&(IGNORE_SMALLER_THAN > Math.abs(pt1.distance(pc2)))){ + continue; } - if (pts.get(i).z != 0) { - throw new IllegalFinPointException("z-coordinate not zero"); + + final Line2D.Double comparisonLine = new Line2D.Double(pc1, pc2); + if (targetLine.intersectsLine(comparisonLine)) { + log.error(String.format("Found intersection at %d-%d and %d-%d", targetIndex, targetIndex+1, comparisonIndex, comparisonIndex+1)); + log.error(String.format(" between (%g, %g) => (%g, %g)", pt1.x, pt1.y, pt2.x, pt2.y)); + log.error(String.format(" and (%g, %g) => (%g, %g)", pc1.x, pc1.y, pc2.x, pc2.y)); + return true; } } + return false; } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FuelTank.java b/core/src/net/sf/openrocket/rocketcomponent/FuelTank.java new file mode 100644 index 0000000000..9c87415c43 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/FuelTank.java @@ -0,0 +1,139 @@ +package net.sf.openrocket.rocketcomponent; + +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.l10n.Translator; + +/** + * This class represents a fuel tank. It's fuel burn rate is set in configuration + * and decreases mass with time. + * + * @author Misha Turnbull + */ + +public class FuelTank extends MassObject { + private static final Translator trans = Application.getTranslator(); + + private double mass = 0; + private double fuelQty = 0; + private double initialFuelQty; + private double burnRate = 0; + private double fuelDensity = 0; + + public static enum FuelType { + FUEL(Application.getTranslator().get("FuelType.Fuel")), + LOX(Application.getTranslator().get("FuelType.LOX")), + KEROSENE(Application.getTranslator().get("FuelType.Kerosene")), + RP1(Application.getTranslator().get("FuelType.RP1")); + + private String title; + FuelType(String title) { + this.title = title; + } + @Override + public String toString() { + return title; + } + } + + private FuelType fuelType = FuelType.FUEL; + + public FuelTank() { + super(); + } + + public FuelTank(double length, double radius, double mass, + double fuelQty, double burnRate, double fuelDensity) { + super(length, radius); + this.mass = mass; + this.initialFuelQty = fuelQty; + this.fuelQty = fuelQty; + this.burnRate = burnRate; + this.fuelDensity = fuelDensity; + } + + @Override + public double getComponentMass() { + return mass + fuelQty; + } + + public void setComponentMass(double mass) { + mass = Math.max(mass, 0); + if (this.mass == mass) { + return; + } + this.mass = mass; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } + + private double estimateMassLeftAtTime(double time_burning) { + double burned = this.burnRate * time_burning; + double newFuelQty = this.initialFuelQty - burned; + if (newFuelQty != this.fuelQty) { + this.fuelQty = newFuelQty; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + + } + return this.fuelQty; + } + + public final FuelTank.FuelType getFuelType() { + mutex.verify(); + return this.fuelType; + } + + public void setFuelType(FuelTank.FuelType fuelType) { + mutex.verify(); + if (this.fuelType == fuelType) { + return; + } + checkState(); // misha: what does this do? + this.fuelType = fuelType; + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); + } + + public double getFuelQty() { + mutex.verify(); + return this.fuelQty; + } + + public void setFuelQty(double fuelQty) { + mutex.verify(); + if (this.fuelQty == fuelQty) { + return; + } + checkState(); + this.fuelQty = fuelQty; + this.estimateMassLeftAtTime(0); + } + + public double getBurnRate() { + mutex.verify(); + return this.burnRate; + } + + public void setBurnRate(double burnRate) { + mutex.verify(); + if (this.burnRate == burnRate) { + return; + } + checkState(); + this.burnRate = burnRate; + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); + } + + @Override + public String getComponentName() { + return trans.get("FuelTank.FuelTank"); + } + + @Override + public boolean allowsChildren() { + return false; + } + + @Override + public boolean isCompatible(Class type) { + return false; + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/IgnitionConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/IgnitionConfiguration.java index 984c18059f..e547fde73f 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/IgnitionConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/IgnitionConfiguration.java @@ -1,138 +1,53 @@ package net.sf.openrocket.rocketcomponent; -import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.simulation.FlightEvent; -import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.AbstractChangeSource; -import net.sf.openrocket.util.MathUtil; -import net.sf.openrocket.util.StateChangeListener; +import net.sf.openrocket.motor.IgnitionEvent; public class IgnitionConfiguration implements FlightConfigurableParameter { - - public enum IgnitionEvent { - //// Automatic (launch or ejection charge) - AUTOMATIC("MotorMount.IgnitionEvent.AUTOMATIC") { - @Override - public boolean isActivationEvent(FlightEvent e, RocketComponent source) { - int count = source.getRocket().getStageCount(); - int stage = source.getStageNumber(); - - if (stage == count - 1) { - return LAUNCH.isActivationEvent(e, source); - } else { - return EJECTION_CHARGE.isActivationEvent(e, source); - } - } - }, - //// Launch - LAUNCH("MotorMount.IgnitionEvent.LAUNCH") { - @Override - public boolean isActivationEvent(FlightEvent e, RocketComponent source) { - return (e.getType() == FlightEvent.Type.LAUNCH); - } - }, - //// First ejection charge of previous stage - EJECTION_CHARGE("MotorMount.IgnitionEvent.EJECTION_CHARGE") { - @Override - public boolean isActivationEvent(FlightEvent e, RocketComponent source) { - if (e.getType() != FlightEvent.Type.EJECTION_CHARGE) - return false; - - int charge = e.getSource().getStageNumber(); - int mount = source.getStageNumber(); - return (mount + 1 == charge); - } - }, - //// First burnout of previous stage - BURNOUT("MotorMount.IgnitionEvent.BURNOUT") { - @Override - public boolean isActivationEvent(FlightEvent e, RocketComponent source) { - if (e.getType() != FlightEvent.Type.BURNOUT) - return false; - - int charge = e.getSource().getStageNumber(); - int mount = source.getStageNumber(); - return (mount + 1 == charge); - } - }, - //// Never - NEVER("MotorMount.IgnitionEvent.NEVER") { - @Override - public boolean isActivationEvent(FlightEvent e, RocketComponent source) { - return false; - } - }, - ; - - - private static final Translator trans = Application.getTranslator(); - private final String description; - - IgnitionEvent(String description) { - this.description = description; - } - - public abstract boolean isActivationEvent(FlightEvent e, RocketComponent source); - - @Override - public String toString() { - return trans.get(description); - } + + protected double ignitionDelay = 0.0; + protected IgnitionEvent ignitionEvent = IgnitionEvent.NEVER; + protected double ignitionTime = 0.0; + + public double getIgnitionDelay() { + return ignitionDelay; } - - - private IgnitionEvent ignitionEvent = IgnitionEvent.AUTOMATIC; - private double delay = 0; - - private final AbstractChangeSource listeners = new AbstractChangeSource(); - - - + + public void setIgnitionDelay(double ignitionDelay) { + this.ignitionDelay = ignitionDelay; + } + public IgnitionEvent getIgnitionEvent() { return ignitionEvent; } - + public void setIgnitionEvent(IgnitionEvent ignitionEvent) { - if (ignitionEvent == null) { - throw new NullPointerException("ignitionEvent is null"); - } - if (ignitionEvent == this.ignitionEvent) { - return; - } this.ignitionEvent = ignitionEvent; - listeners.fireChangeEvent(this); } - - - public double getIgnitionDelay() { - return delay; + + public double getIgnitionTime() { + return ignitionTime; } - - public void setIgnitionDelay(double delay) { - if (MathUtil.equals(delay, this.delay)) { - return; - } - this.delay = delay; - listeners.fireChangeEvent(this); + + public void setIgnitionTime(double ignitionTime) { + this.ignitionTime = ignitionTime; } - + @Override public IgnitionConfiguration clone() { - IgnitionConfiguration copy = new IgnitionConfiguration(); - copy.ignitionEvent = this.ignitionEvent; - copy.delay = this.delay; - return copy; - } - - + return this.copy(null); + } + + public IgnitionConfiguration copy( final FlightConfigurationId copyId) { + IgnitionConfiguration clone = new IgnitionConfiguration(); + clone.ignitionDelay = this.ignitionDelay; + clone.ignitionEvent = this.ignitionEvent; + clone.ignitionTime = this.ignitionTime; + return clone; + } + @Override - public void addChangeListener(StateChangeListener listener) { - listeners.addChangeListener(listener); + public void update(){ } + - - @Override - public void removeChangeListener(StateChangeListener listener) { - listeners.removeChangeListener(listener); - } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java b/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java index 4b97370282..3af29e6ffd 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java +++ b/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java @@ -1,11 +1,18 @@ package net.sf.openrocket.rocketcomponent; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfigurationSet; import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; @@ -18,18 +25,17 @@ * * @author Sampo Niskanen */ -public class InnerTube extends ThicknessRingComponent implements Clusterable, RadialParent, MotorMount { +public class InnerTube extends ThicknessRingComponent implements AxialPositionable, Clusterable, RadialParent, MotorMount { private static final Translator trans = Application.getTranslator(); + private static final Logger log = LoggerFactory.getLogger(InnerTube.class); private ClusterConfiguration cluster = ClusterConfiguration.SINGLE; private double clusterScale = 1.0; private double clusterRotation = 0.0; - private boolean motorMount = false; private double overhang = 0; - - private FlightConfigurationImpl motorConfigurations; - private FlightConfigurationImpl ignitionConfigurations; + private boolean isActingMount; + private MotorConfigurationSet motors; /** * Main constructor. @@ -40,8 +46,7 @@ public InnerTube() { this.setInnerRadius(0.018 / 2); this.setLength(0.070); - this.motorConfigurations = new MotorFlightConfigurationImpl(this, ComponentChangeEvent.MOTOR_CHANGE, MotorConfiguration.NO_MOTORS); - this.ignitionConfigurations = new FlightConfigurationImpl(this, ComponentChangeEvent.EVENT_CHANGE, new IgnitionConfiguration()); + motors = new MotorConfigurationSet(this); } @@ -63,6 +68,12 @@ public String getComponentName() { return trans.get("InnerTube.InnerTube"); } + @Override + public String getPatternName() { + return this.cluster.getXMLName(); + } + + @Override public boolean allowsChildren() { return true; @@ -114,20 +125,28 @@ public ClusterConfiguration getClusterConfiguration() { * @param cluster The cluster configuration. */ @Override - public void setClusterConfiguration(ClusterConfiguration cluster) { - this.cluster = cluster; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + public void setClusterConfiguration( final ClusterConfiguration cluster) { + if( cluster == this.cluster){ + // no change + return; + }else{ + this.cluster = cluster; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } } - /** - * Return the number of tubes in the cluster. - * @return Number of tubes in the current cluster. - */ @Override - public int getClusterCount() { + public int getInstanceCount() { return cluster.getClusterCount(); } + @Override + public void setInstanceCount( final int newCount ){ + log.error("Programmer Error: cannot set the instance count of an InnerTube directly."+ + " Please set setClusterConfiguration(ClusterConfiguration) instead.", + new UnsupportedOperationException("InnerTube.setInstanceCount(..) on an"+this.getClass().getSimpleName())); + } + /** * Get the cluster scaling. A value of 1.0 indicates that the tubes are packed * touching each other, larger values separate the tubes and smaller values @@ -137,6 +156,11 @@ public double getClusterScale() { return clusterScale; } + @Override + public boolean isAfter(){ + return false; + } + /** * Set the cluster scaling. * @see #getClusterScale() @@ -180,9 +204,8 @@ public double getClusterSeparation() { return 2 * getOuterRadius() * clusterScale; } - public List getClusterPoints() { - List list = new ArrayList(getClusterCount()); + List list = new ArrayList(getInstanceCount()); List points = cluster.getPoints(clusterRotation - getRadialDirection()); double separation = getClusterSeparation(); for (int i = 0; i < points.size() / 2; i++) { @@ -191,93 +214,114 @@ public List getClusterPoints() { return list; } - @Override - public Coordinate[] shiftCoordinates(Coordinate[] array) { - array = super.shiftCoordinates(array); + public Coordinate[] getInstanceOffsets(){ - int count = getClusterCount(); - if (count == 1) - return array; + if ( 1 == getInstanceCount()) + return new Coordinate[] { Coordinate.ZERO }; List points = getClusterPoints(); - if (points.size() != count) { - throw new BugException("Inconsistent cluster configuration, cluster count=" + count + - " point count=" + points.size()); - } - Coordinate[] newArray = new Coordinate[array.length * count]; - for (int i = 0; i < array.length; i++) { - for (int j = 0; j < count; j++) { - newArray[i * count + j] = array[i].add(points.get(j)); - } - } - return newArray; - } + return points.toArray( new Coordinate[ points.size()]); + } + +// @Override +// protected Coordinate[] shiftCoordinates(Coordinate[] array) { +// array = super.shiftCoordinates(array); +// +// int count = getClusterCount(); +// if (count == 1) +// return array; +// +// List points = getClusterPoints(); +// if (points.size() != count) { +// throw new BugException("Inconsistent cluster configuration, cluster count=" + count + +// " point count=" + points.size()); +// } +// Coordinate[] newArray = new Coordinate[array.length * count]; +// for (int i = 0; i < array.length; i++) { +// for (int j = 0; j < count; j++) { +// newArray[i * count + j] = array[i].add(points.get(j)); +// } +// } +// +// return newArray; +// } //////////////// Motor mount ///////////////// - - + @Override - public FlightConfiguration getMotorConfiguration() { - return motorConfigurations; + public MotorConfiguration getDefaultMotorConfig(){ + return this.motors.getDefault(); } - - + @Override - public FlightConfiguration getIgnitionConfiguration() { - return ignitionConfigurations; + public MotorConfiguration getMotorConfig( final FlightConfigurationId fcid){ + return this.motors.get(fcid); + } + + @Override + public void setMotorConfig( final MotorConfiguration newMotorConfig, final FlightConfigurationId fcid){ + if((null == newMotorConfig)){ + this.motors.set( fcid, null); + }else{ + if( this != newMotorConfig.getMount() ){ + throw new BugException(" attempt to add a MotorConfig to a second mount!"); + } + + this.motors.set(fcid, newMotorConfig); + } + + this.isActingMount = true; + + // this is done automatically in the motorSet + //fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); } - @Override - public void cloneFlightConfiguration(String oldConfigId, String newConfigId) { - motorConfigurations.cloneFlightConfiguration(oldConfigId, newConfigId); - ignitionConfigurations.cloneFlightConfiguration(oldConfigId, newConfigId); + public Iterator getMotorIterator(){ + return this.motors.iterator(); } - @Override - public boolean isMotorMount() { - return motorMount; + public void copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId) { + motors.copyFlightConfiguration(oldConfigId, newConfigId); } - @Override - public void setMotorMount(boolean mount) { - if (motorMount == mount) - return; - motorMount = mount; - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); + public void reset( final FlightConfigurationId fcid){ + this.motors.reset(fcid); } - @Override - public double getMotorMountDiameter() { - return getInnerRadius() * 2; + public void setMotorMount(boolean _active){ + if (this.isActingMount == _active) + return; + this.isActingMount = _active; + } + + @Override + public boolean isMotorMount(){ + return this.isActingMount; } - @SuppressWarnings("deprecation") - @Deprecated @Override - public int getMotorCount() { - return getClusterCount(); + public boolean hasMotor() { + // the default MotorInstance is the EMPTY_INSTANCE. If we have more than that, then the other instance will have a motor. + return ( 1 < this.motors.size()); } - @SuppressWarnings("deprecation") - @Deprecated @Override - public Motor getMotor(String id) { - return this.motorConfigurations.get(id).getMotor(); + public double getMotorMountDiameter() { + return getInnerRadius() * 2; } - @SuppressWarnings("deprecation") - @Deprecated @Override - public double getMotorDelay(String id) { - return this.motorConfigurations.get(id).getEjectionDelay(); + public int getMotorCount() { + return this.motors.size(); } + @Override public double getMotorOverhang() { return overhang; @@ -292,8 +336,8 @@ public void setMotorOverhang(double overhang) { } @Override - public Coordinate getMotorPosition(String id) { - Motor motor = getMotor(id); + public Coordinate getMotorPosition(FlightConfigurationId id) { + Motor motor = motors.get(id).getMotor(); if (motor == null) { throw new IllegalArgumentException("No motor with id " + id + " defined."); } @@ -304,10 +348,18 @@ public Coordinate getMotorPosition(String id) { @Override protected RocketComponent copyWithOriginalID() { InnerTube copy = (InnerTube) super.copyWithOriginalID(); - copy.motorConfigurations = new FlightConfigurationImpl(motorConfigurations, copy, ComponentChangeEvent.MOTOR_CHANGE); - copy.ignitionConfigurations = new FlightConfigurationImpl(ignitionConfigurations, copy, ComponentChangeEvent.EVENT_CHANGE); + if( copy == this ){ + new IllegalArgumentException(" copyWithOriginalID should return a different instance! "); + } + if( copy.motors == this.motors ){ + new IllegalArgumentException(" copyWithOriginalID should produce different motorSet instances! "); + } + + copy.motors = new MotorConfigurationSet( this.motors, copy ); + return copy; } + /** * For a given coordinate that represents one tube in a cluster, create an instance of that tube. Must be called @@ -330,4 +382,9 @@ public static InnerTube makeIndividualClusterComponent(Coordinate coord, String return copy; } + @Override + public String toMotorDebug( ){ + return this.motors.toDebug(); + } + } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/rocketcomponent/InstanceContext.java b/core/src/net/sf/openrocket/rocketcomponent/InstanceContext.java new file mode 100644 index 0000000000..cecc8342c6 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/InstanceContext.java @@ -0,0 +1,59 @@ +package net.sf.openrocket.rocketcomponent; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Transformation; + +/** + * + * @author teyrana (aka Daniel Williams) + * + */ +public class InstanceContext { + + // =========== Public Functions ======================== + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + + InstanceContext other = (InstanceContext) obj; + return (component.equals(other.component) && transform.equals(other.transform)); + } + + @Override + public int hashCode() { + return (int) (component.hashCode()); + } + + public InstanceContext(final RocketComponent _component, final boolean _active, final int _instanceNumber, final Transformation _transform) { + component = _component; + active = _active; + instanceNumber = _instanceNumber; + transform = _transform; + + } + + @Override + public String toString() { + return String.format("Context for %s #%d", component); + } + + public Coordinate getLocation() { + return transform.transform(Coordinate.ZERO); + } + + // =========== Instance Member Variables ======================== + + + // ==== public ==== + final public RocketComponent component; + final public boolean active; + final public int instanceNumber; + final public Transformation transform; + + // =========== Private Instance Functions ======================== + + +} + diff --git a/core/src/net/sf/openrocket/rocketcomponent/InstanceMap.java b/core/src/net/sf/openrocket/rocketcomponent/InstanceMap.java new file mode 100644 index 0000000000..8e249f30d5 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/InstanceMap.java @@ -0,0 +1,73 @@ +package net.sf.openrocket.rocketcomponent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sf.openrocket.util.Transformation; + + +/** + * + * @author teyrana (aka Daniel Williams) + * + */ +public class InstanceMap extends HashMap> { + + // =========== Public Functions ======================== + + // public InstanceMap() {} + + public int count(final RocketComponent key) { + if(containsKey(key)){ + return get(key).size(); + }else { + return 0; + } + } + + public void emplace(final RocketComponent component, boolean active, int number, final Transformation xform) { + final RocketComponent key = component; + + if(!containsKey(component)) { + put(key, new ArrayList<>()); + } + + final InstanceContext context = new InstanceContext(component, active, number, xform); + get(key).add(context); + } + + public List getInstanceContexts(final RocketComponent key) { + return get(key); + } + + // this is primarily for debugging. + @Override + public String toString() { + StringBuffer buffer = new StringBuffer(); + int outerIndex = 0; + buffer.append(">> Printing InstanceMap:\n"); + for(Map.Entry> entry: entrySet() ) { + final RocketComponent key = entry.getKey(); + final ArrayList contexts = entry.getValue(); + buffer.append(String.format("....[% 2d]:[%s]\n", outerIndex, key.getName())); + outerIndex++; + + int innerIndex = 0; + for(InstanceContext ctxt: contexts ) { + buffer.append(String.format("........[@% 2d][% 2d] %s\n", innerIndex, ctxt.instanceNumber, ctxt.getLocation().toPreciseString())); + innerIndex++; + } + } + + return buffer.toString(); + } + + // =========== Instance Member Variables ======================== + + // =========== Private Instance Functions ======================== + + +} + diff --git a/core/src/net/sf/openrocket/rocketcomponent/Instanceable.java b/core/src/net/sf/openrocket/rocketcomponent/Instanceable.java new file mode 100644 index 0000000000..47d5c5913c --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/Instanceable.java @@ -0,0 +1,53 @@ +package net.sf.openrocket.rocketcomponent; + +import net.sf.openrocket.util.Coordinate; + +public interface Instanceable { + + @Deprecated + public Coordinate[] getLocations(); + + /** + * Returns vector coordinates of each instance of this component relative to this component's parent + * + * Note: this.getOffsets().length == this.getInstanceCount() should ALWAYS be true. + * If getInstanceCount() returns anything besides 1 this function should be overridden as well. + * + * + * @return coordinates location of each instance relative to component's parent + */ + public Coordinate[] getInstanceLocations(); + + /** + * Returns vector coordinates of each instance of this component relative to this component's reference point (typically front center) + * + * Note: this.getOffsets().length == this.getInstanceCount() should ALWAYS be true. + * If getInstanceCount() returns anything besides 1 this function should be overridden as well. + * + * + * @return coordinates location of each instance relative to this component's reference point. + */ + public Coordinate[] getInstanceOffsets(); + + /** + * How many instances of this component are represented. This should generally be editable. + * @param newCount number of instances to set + */ + public void setInstanceCount( final int newCount ); + + /** + * How many instances of this component are represented. This should generally be editable. + * + * @return number of instances this component currently represent. + */ + public int getInstanceCount(); + + /** + * Get a human-readable name for this instance arrangement. + * Note: the same instance count may have different pattern names + * + * @return pattern name + */ + public String getPatternName(); + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/InternalComponent.java b/core/src/net/sf/openrocket/rocketcomponent/InternalComponent.java index 1f2dba40c7..f108eddf2c 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/InternalComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/InternalComponent.java @@ -1,5 +1,7 @@ package net.sf.openrocket.rocketcomponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; /** * A component internal to the rocket. Internal components have no effect on the @@ -10,23 +12,16 @@ * * @author Sampo Niskanen */ -public abstract class InternalComponent extends RocketComponent { +public abstract class InternalComponent extends RocketComponent implements AxialPositionable { public InternalComponent() { - super(RocketComponent.Position.BOTTOM); + super( AxialMethod.BOTTOM); } @Override - public final void setRelativePosition(RocketComponent.Position position) { - super.setRelativePosition(position); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - } - - - @Override - public final void setPositionValue(double value) { - super.setPositionValue(value); + public void setAxialMethod(final AxialMethod newAxialMethod) { + super.setAxialMethod(newAxialMethod); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java b/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java index 414c561e1a..0824a3aefd 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java +++ b/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java @@ -6,13 +6,14 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset.Type; +import net.sf.openrocket.rocketcomponent.position.*; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; -public class LaunchLug extends ExternalComponent implements Coaxial { +public class LaunchLug extends ExternalComponent implements AnglePositionable, Coaxial, LineInstanceable { private static final Translator trans = Application.getTranslator(); @@ -20,14 +21,15 @@ public class LaunchLug extends ExternalComponent implements Coaxial { private double thickness; private double radialDirection = 0; + private double radialDistance = 0; - /* These are calculated when the component is first attached to any Rocket */ - private double shiftY, shiftZ; + private int instanceCount = 1; + private double instanceSeparation = 0; // front-front along the positive rocket axis. i.e. [1,0,0]; + private double angle_rad = 0; - public LaunchLug() { - super(Position.MIDDLE); + super(AxialMethod.MIDDLE); radius = 0.01 / 2; thickness = 0.001; length = 0.03; @@ -72,21 +74,18 @@ public void setThickness(double thickness) { fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - - public double getRadialDirection() { - return radialDirection; + public double getAngularOffset() { + return this.radialDirection; } - - public void setRadialDirection(double direction) { - direction = MathUtil.reduce180(direction); - if (MathUtil.equals(this.radialDirection, direction)) + + public void setAngularOffset(final double newAngle_rad){ + double clamped_rad = MathUtil.clamp( newAngle_rad, -Math.PI, Math.PI); + if (MathUtil.equals(this.radialDirection, clamped_rad)) return; - this.radialDirection = direction; + this.radialDirection = clamped_rad; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - - public void setLength(double length) { if (MathUtil.equals(this.length, length)) return; @@ -95,24 +94,11 @@ public void setLength(double length) { } - - - @Override - public void setRelativePosition(RocketComponent.Position position) { - super.setRelativePosition(position); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - } - - - @Override - public void setPositionValue(double value) { - super.setPositionValue(value); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + public boolean isAfter() { + return false; } - - - + @Override protected void loadFromPreset(ComponentPreset preset) { if (preset.has(ComponentPreset.OUTER_DIAMETER)) { @@ -135,18 +121,32 @@ public Type getPresetType() { return ComponentPreset.Type.LAUNCH_LUG; } - @Override - public Coordinate[] shiftCoordinates(Coordinate[] array) { - array = super.shiftCoordinates(array); + public Coordinate[] getInstanceOffsets(){ + Coordinate[] toReturn = new Coordinate[this.getInstanceCount()]; + + final double yOffset = Math.cos(radialDirection) * (radialDistance); + final double zOffset = Math.sin(radialDirection) * (radialDistance); - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(0, shiftY, shiftZ); + for ( int index=0; index < this.getInstanceCount(); index++){ + toReturn[index] = new Coordinate(index*this.instanceSeparation, yOffset, zOffset); } - return array; + return toReturn; } +// @Override +// protected Coordinate[] shiftCoordinates(Coordinate[] array) { +// array = super.shiftCoordinates(array); +// +// for (int i = 0; i < array.length; i++) { +// array[i] = new Coordinate(xOffset + index*this.instanceSeparation, yOffset, zOffset); +// array[i] = array[i].add(0, shiftY, shiftZ); +// } +// +// return array; +// } + @Override public void componentChanged(ComponentChangeEvent e) { @@ -176,10 +176,7 @@ public void componentChanged(ComponentChangeEvent e) { parentRadius = Math.max(s.getRadius(x1), s.getRadius(x2)); } - shiftY = Math.cos(radialDirection) * (parentRadius + radius); - shiftZ = Math.sin(radialDirection) * (parentRadius + radius); - - // System.out.println("Computed shift: y="+shiftY+" z="+shiftZ); + this.radialDistance = parentRadius + radius; } @@ -232,4 +229,57 @@ public boolean isCompatible(Class type) { return false; } + + + @Override + public double getInstanceSeparation(){ + return this.instanceSeparation; + } + + @Override + public void setInstanceSeparation(final double _separation){ + this.instanceSeparation = _separation; + } + + @Override + public void setInstanceCount( final int newCount ){ + if( 0 < newCount ){ + this.instanceCount = newCount; + } + } + + @Override + public int getInstanceCount(){ + return this.instanceCount; + } + + @Override + public String getPatternName(){ + return (this.getInstanceCount() + "-Line"); + } + + + @Override + public double getAngleOffset() { + return this.angle_rad; + } + + + @Override + public void setAngleOffset(double newAngle) { + this.angle_rad = newAngle; + } + + + @Override + public AngleMethod getAngleMethod() { + return AngleMethod.RELATIVE; + } + + + @Override + public void setAngleMethod(AngleMethod newMethod) { + // no-op + } + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/LineInstanceable.java b/core/src/net/sf/openrocket/rocketcomponent/LineInstanceable.java new file mode 100644 index 0000000000..30b0385dbd --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/LineInstanceable.java @@ -0,0 +1,11 @@ +package net.sf.openrocket.rocketcomponent; + +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; + +public interface LineInstanceable extends AxialPositionable, Instanceable { + + public double getInstanceSeparation(); + + public void setInstanceSeparation(final double radius); + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java index fb4aa7444a..b018919d2c 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Collection; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; @@ -39,10 +40,15 @@ public MassObject(double length, double radius) { this.length = length; this.radius = radius; - this.setRelativePosition(Position.TOP); - this.setPositionValue(0.0); + this.setAxialMethod( AxialMethod.TOP); + this.setAxialOffset(0.0); } + @Override + public boolean isAfter(){ + return false; + } + public void setLength(double length) { length = Math.max(length, 0); @@ -104,13 +110,14 @@ public final void setRadialDirection(double radialDirection) { /** * Shift the coordinates according to the radial position and direction. */ - @Override - public final Coordinate[] shiftCoordinates(Coordinate[] array) { - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(0, shiftY, shiftZ); - } - return array; - } +// @Override +// protected +// final Coordinate[] shiftCoordinates(Coordinate[] array) { +// for (int i = 0; i < array.length; i++) { +// array[i] = array[i].add(0, shiftY, shiftZ); +// } +// return array; +// } @Override public final Coordinate getComponentCG() { diff --git a/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java deleted file mode 100644 index b04e82ca34..0000000000 --- a/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import java.util.EventObject; -import java.util.List; - -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.util.ArrayList; -import net.sf.openrocket.util.MathUtil; -import net.sf.openrocket.util.StateChangeListener; -import net.sf.openrocket.util.Utils; - -/** - * A single motor configuration. This includes the selected motor - * and the ejection charge delay. - */ -public class MotorConfiguration implements FlightConfigurableParameter { - - /** Immutable configuration with no motor and zero delay. */ - public static final MotorConfiguration NO_MOTORS = new MotorConfiguration() { - @Override - public void setMotor(Motor motor) { - throw new UnsupportedOperationException("Trying to modify immutable no-motors configuration"); - }; - - @Override - public void setEjectionDelay(double delay) { - throw new UnsupportedOperationException("Trying to modify immutable no-motors configuration"); - }; - }; - - private final List listeners = new ArrayList(); - - private Motor motor; - private double ejectionDelay; - - - public Motor getMotor() { - return motor; - } - - public void setMotor(Motor motor) { - if (Utils.equals(this.motor, motor)) { - return; - } - this.motor = motor; - fireChangeEvent(); - } - - public double getEjectionDelay() { - return ejectionDelay; - } - - public void setEjectionDelay(double delay) { - if (MathUtil.equals(ejectionDelay, delay)) { - return; - } - this.ejectionDelay = delay; - fireChangeEvent(); - } - - - @Override - public MotorConfiguration clone() { - MotorConfiguration copy = new MotorConfiguration(); - copy.motor = this.motor; - copy.ejectionDelay = this.ejectionDelay; - return copy; - } - - - @Override - public void addChangeListener(StateChangeListener listener) { - listeners.add(listener); - } - - @Override - public void removeChangeListener(StateChangeListener listener) { - listeners.remove(listener); - } - - private void fireChangeEvent() { - EventObject event = new EventObject(this); - Object[] list = listeners.toArray(); - for (Object l : list) { - ((StateChangeListener) l).stateChanged(event); - } - } - -} diff --git a/core/src/net/sf/openrocket/rocketcomponent/MotorFlightConfigurationImpl.java b/core/src/net/sf/openrocket/rocketcomponent/MotorFlightConfigurationImpl.java deleted file mode 100644 index 8be3a841a7..0000000000 --- a/core/src/net/sf/openrocket/rocketcomponent/MotorFlightConfigurationImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -/** - * FlightConfiguration implementation that prevents changing the default value. - * This is used for motors, where the default value is always no motor. - */ -public class MotorFlightConfigurationImpl> extends FlightConfigurationImpl { - - public MotorFlightConfigurationImpl(RocketComponent component, int eventType, E defaultValue) { - super(component, eventType, defaultValue); - } - - @Override - public void setDefault(E value) { - throw new UnsupportedOperationException("Cannot change default value of motor configuration"); - } - -} diff --git a/core/src/net/sf/openrocket/rocketcomponent/MotorMount.java b/core/src/net/sf/openrocket/rocketcomponent/MotorMount.java index d11c32b92c..ab47b44a5c 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MotorMount.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MotorMount.java @@ -1,73 +1,105 @@ package net.sf.openrocket.rocketcomponent; -import net.sf.openrocket.motor.Motor; +import java.util.Iterator; + +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.Coordinate; public interface MotorMount extends ChangeSource, FlightConfigurableComponent { + /** - * Is the component currently a motor mount. + * Does this mount contain at least one motor? * - * @return whether the component holds a motor. + * @return whether the component holds a motor + */ + public boolean hasMotor(); + + /** + * Programmatically : implementing classes will always be (x instanceof MotorMount) + * The component may potentially act as a mount, or just a structural component. + * This flag indicates how the component behaves. + * + * @param acting if the component should behave like a motor mount. False if it's structural only. + */ + public void setMotorMount(boolean acting); + + /** + * Programmatically : implementing classes will always be (x instanceof MotorMount) + * This flag indicates whether the component is acting as a motor mount, or just a structural component + * + * @return true if the component is acting as a motor mount */ public boolean isMotorMount(); /** - * Set whether the component is currently a motor mount. + * Get all motors configured for this mount. + * + * @return an iterator to all motors configured for this component */ - public void setMotorMount(boolean mount); - - + public Iterator getMotorIterator(); + /** - * Return the motor configurations for this motor mount. + * Returns the Default Motor Instance for this mount. + * + * @return The default MotorInstance */ - public FlightConfiguration getMotorConfiguration(); + public MotorConfiguration getDefaultMotorConfig(); + /** + * Default implementatino supplied by RocketComponent (returns 1); + * + * @return number of times this component is instanced + */ + public int getInstanceCount(); + + /** - * Return the ignition configurations for this motor mount. + * Get the current cluster configuration. + * @return The current cluster configuration. + */ + public ClusterConfiguration getClusterConfiguration(); + + /** + * Get the length of this motor mount. Synonymous with the RocketComponent method. + * + * @return */ - public FlightConfiguration getIgnitionConfiguration(); + public double getLength(); + + // duplicate of RocketComponent + public String getID(); + + // duplicate of RocketComponent + public String getDebugName(); + + // duplicate of RocketComponent + public AxialStage getStage(); + // duplicate of RocketComponent + public Coordinate[] getLocations(); /** - * Return the motor for the motor configuration. May return null - * if no motor has been set. This method must return null if ID - * is null or if the ID is not valid for the current rocket - * (or if the component is not part of any rocket). * - * @param id the motor configuration ID - * @return the motor, or null if not set. - * @deprecated Use getMotorConfiguration().get(id).getMotor() instead. + * @param fcid id for which to return the motor (null retrieves the default) + * @return requested motorInstance (which may also be the default motor instance) */ - @Deprecated - public Motor getMotor(String id); - + public MotorConfiguration getMotorConfig( final FlightConfigurationId fcid); + /** - * Get the number of similar motors clustered. * - * TODO: HIGH: This should not be used, since the components themselves can be clustered - * - * @return the number of motors. + * @param fcid index the supplied motor against this flight configuration + * @param newMotorInstance motor instance to store */ - @Deprecated - public int getMotorCount(); - - + public void setMotorConfig( final MotorConfiguration newMotorConfig, final FlightConfigurationId fcid); /** - * Return the ejection charge delay of given motor configuration. - * A "plugged" motor without an ejection charge is given by - * {@link Motor#PLUGGED} (Double.POSITIVE_INFINITY). + * Get the number of motors available for all flight configurations * - * @param id the motor configuration ID - * @return the ejection charge delay. - * @deprecated Use getMotorConfiguration().get(id).getMotor() instead. + * @return the number of motors. */ - @Deprecated - public double getMotorDelay(String id); - - + public int getMotorCount(); /** * Return the distance that the motors hang outside this motor mount. @@ -100,6 +132,12 @@ public interface MotorMount extends ChangeSource, FlightConfigurableComponent { * @return the position of the motor relative to this component. * @throws IllegalArgumentException if a motor with the specified ID does not exist. */ - public Coordinate getMotorPosition(String id); + public Coordinate getMotorPosition(FlightConfigurationId id); + /** + * Development / Debug method. + * + * @return table describing all the motors configured for this mount. + */ + public String toMotorDebug( ); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/NoseCone.java b/core/src/net/sf/openrocket/rocketcomponent/NoseCone.java index 6ef65ed24b..f58f40bd21 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/NoseCone.java +++ b/core/src/net/sf/openrocket/rocketcomponent/NoseCone.java @@ -34,6 +34,8 @@ public NoseCone(Transition.Shape type, double length, double radius) { super.setLength(length); super.setClipped(false); + super.setAftRadiusAutomatic(false); + super.setAftRadius(radius); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java b/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java new file mode 100644 index 0000000000..daf79abdae --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java @@ -0,0 +1,240 @@ +package net.sf.openrocket.rocketcomponent; + +import java.util.ArrayList; +import java.util.Collection; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; + +public class ParallelStage extends AxialStage implements FlightConfigurableComponent, RingInstanceable { + + private static final Translator trans = Application.getTranslator(); + //private static final Logger log = LoggerFactory.getLogger(BoosterSet.class); + + protected int instanceCount = 1; + + protected AngleMethod angleMethod = AngleMethod.RELATIVE; + protected double angleSeparation = Math.PI; + protected double angleOffset_rad = 0; + + protected RadiusMethod radiusMethod = RadiusMethod.RELATIVE; + protected double radiusOffset_m = 0; + + public ParallelStage() { + this.instanceCount = 2; + this.axialMethod = AxialMethod.BOTTOM; + this.angleSeparation = Math.PI * 2 / this.instanceCount; + } + + public ParallelStage( final int _count ){ + this(); + + this.instanceCount = _count; + this.angleSeparation = Math.PI * 2 / this.instanceCount; + } + + @Override + public String getComponentName() { + //// Stage + return trans.get("BoosterSet.BoosterSet"); + } + + // not strictly accurate, but this should provide an acceptable estimate for total vehicle size + @Override + public Collection getComponentBounds() { + Collection bounds = new ArrayList(8); + double x_min = Double.MAX_VALUE; + double x_max = Double.MIN_VALUE; + double r_max = 0; + + Coordinate[] instanceLocations = this.getComponentLocations(); + + for (Coordinate currentInstanceLocation : instanceLocations) { + if (x_min > (currentInstanceLocation.x)) { + x_min = currentInstanceLocation.x; + } + if (x_max < (currentInstanceLocation.x + this.length)) { + x_max = currentInstanceLocation.x + this.length; + } + if (r_max < (this.getRadiusOffset())) { + r_max = this.getRadiusOffset(); + } + } + addBound(bounds, x_min, r_max); + addBound(bounds, x_max, r_max); + + return bounds; + } + + /** + * Check whether the given type can be added to this component. A Stage allows + * only BodyComponents to be added. + * + * @param type The RocketComponent class type to add. + * + * @return Whether such a component can be added. + */ + @Override + public boolean isCompatible(Class type) { + return BodyComponent.class.isAssignableFrom(type); + } + + @Override + public void copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId) { + this.separations.copyFlightConfiguration(oldConfigId, newConfigId); + } + + @Override + protected RocketComponent copyWithOriginalID() { + ParallelStage copy = (ParallelStage) (super.copyWithOriginalID()); + return copy; + } + + @Override + public double getAngleOffset() { + return this.angleOffset_rad; + } + + @Override + public int getInstanceCount() { + return this.instanceCount; + } + + @Override + public boolean isAfter(){ + return false; + } + + @Override + public boolean isLaunchStage(){ + return true; + } + + @Override + public void setInstanceCount( final int newCount ){ + mutex.verify(); + if ( newCount < 1) { + // there must be at least one instance.... + return; + } + + this.instanceCount = newCount; + this.angleSeparation = Math.PI * 2 / this.instanceCount; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public double getRadiusOffset() { + return this.radiusOffset_m; + } + + @Override + public double[] getInstanceAngles(){ + final double baseAngle = getAngleOffset(); + final double incrAngle = getInstanceAngleIncrement(); + + double[] result = new double[ getInstanceCount()]; + for( int i=0; i getComponentBounds() { + Collection bounds = new ArrayList(8); + double x_min = Double.MAX_VALUE; + double x_max = Double.MIN_VALUE; + double r_max = 0; + + Coordinate[] instanceLocations = this.getComponentLocations(); + + for (Coordinate currentInstanceLocation : instanceLocations) { + if (x_min > (currentInstanceLocation.x)) { + x_min = currentInstanceLocation.x; + } + if (x_max < (currentInstanceLocation.x + this.length)) { + x_max = currentInstanceLocation.x + this.length; + } + if (r_max < (this.getRadiusOffset())) { + r_max = this.getRadiusOffset(); + } + } + addBound(bounds, x_min, r_max); + addBound(bounds, x_max, r_max); + + return bounds; + } + + /** + * Check whether the given type can be added to this component. A Stage allows + * only BodyComponents to be added. + * + * @param type The RocketComponent class type to add. + * + * @return Whether such a component can be added. + */ + @Override + public boolean isCompatible(Class type) { + return BodyComponent.class.isAssignableFrom(type); + } + + + @Override + public double getInstanceAngleIncrement(){ + return angleSeparation; + } + + @Override + public double[] getInstanceAngles(){ + // , angleMethod, angleOffset_rad + final double baseAngle = getAngleOffset(); + final double incrAngle = getInstanceAngleIncrement(); + + double[] result = new double[ getInstanceCount()]; + for( int i=0; i Math.abs(returnValue)) { + returnValue = 0.0; + } + + return returnValue; + } + + @Override + public double getAngleOffset() { + return this.angleOffset_rad; + } + + @Override + public String getPatternName(){ + return (this.getInstanceCount() + "-ring"); + } + + @Override + public double getRadiusOffset() { + return this.radiusOffset_m; + } + + @Override + public int getInstanceCount() { + return this.instanceCount; + } + + + @Override + public void setInstanceCount( final int newCount ){ + mutex.verify(); + if ( newCount < 1) { + // there must be at least one instance.... + return; + } + + this.instanceCount = newCount; + this.angleSeparation = Math.PI * 2 / this.instanceCount; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + protected StringBuilder toDebugDetail() { + StringBuilder buf = super.toDebugDetail(); + // if (-1 == this.getRelativeToStage()) { + // System.err.println(" >>refStageName: " + null + "\n"); + // } else { + // Stage refStage = (Stage) this.parent; + // System.err.println(" >>refStageName: " + refStage.getName() + "\n"); + // System.err.println(" ..refCenterX: " + refStage.position.x + "\n"); + // System.err.println(" ..refLength: " + refStage.getLength() + "\n"); + // } + return buf; + } + + @Override + public void setAngleOffset(double angle_rad) { + mutex.verify(); + this.angleOffset_rad = angle_rad; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public AngleMethod getAngleMethod( ) { + return angleMethod; + } + @Override + public void setAngleMethod( final AngleMethod newMethod ) { + + } + + @Override + public void setRadiusOffset(double radius_m) { + mutex.verify(); + if( this.radiusMethod.clampToZero() ) { + this.radiusOffset_m = 0.0; + }else { + this.radiusOffset_m = radius_m; + } + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public RadiusMethod getRadiusMethod() { + return this.radiusMethod; + } + + @Override + public void setRadiusMethod( final RadiusMethod newMethod ) { + mutex.verify(); + this.radiusMethod = newMethod; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public void setRadius( final RadiusMethod requestMethod, final double requestRadius ) { + mutex.verify(); + + RadiusMethod newMethod = requestMethod; + double newRadius = requestRadius; + + if( this.radiusMethod.clampToZero() ) { + newRadius = 0.; + } + + this.radiusMethod = newMethod; + this.radiusOffset_m = newRadius; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java index 6d0ccb657e..0c0da4d193 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java @@ -5,18 +5,19 @@ import net.sf.openrocket.util.MathUtil; /** - * An inner component that consists of a hollow cylindrical component. This can be - * an inner tube, tube coupler, centering ring, bulkhead etc. - * - * The properties include the inner and outer radii, length and radial position. + * ??? * * @author Sampo Niskanen */ -public abstract class RadiusRingComponent extends RingComponent implements Coaxial { +public abstract class RadiusRingComponent extends RingComponent implements Coaxial, LineInstanceable { protected double outerRadius = 0; protected double innerRadius = 0; + protected int instanceCount = 1; + // front-front along the positive rocket axis. i.e. [1,0,0]; + protected double instanceSeparation = 0; + @Override protected void loadFromPreset(ComponentPreset preset) { super.loadFromPreset(preset); @@ -36,7 +37,6 @@ protected void loadFromPreset(ComponentPreset preset) { @Override public double getOuterRadius() { if (outerRadiusAutomatic && getParent() instanceof RadialParent) { - RocketComponent parent = getParent(); double pos1 = this.toRelative(Coordinate.NUL, parent)[0].x; double pos2 = this.toRelative(new Coordinate(getLength()), parent)[0].x; pos1 = MathUtil.clamp(pos1, 0, parent.getLength()); @@ -100,4 +100,42 @@ public void setThickness(double thickness) { setInnerRadius(outer - thickness); } + + @Override + public double getInstanceSeparation(){ + return this.instanceSeparation; + } + + @Override + public void setInstanceSeparation(final double _separation){ + this.instanceSeparation = _separation; + } + + @Override + public void setInstanceCount( final int newCount ){ + if( 0 < newCount ){ + this.instanceCount = newCount; + } + } + + @Override + public Coordinate[] getInstanceOffsets(){ + Coordinate[] toReturn = new Coordinate[this.getInstanceCount()]; + for ( int index=0 ; index < this.getInstanceCount(); index++){ + toReturn[index] = new Coordinate( index*this.instanceSeparation, 0, 0); + } + + return toReturn; + } + + + @Override + public int getInstanceCount(){ + return this.instanceCount; + } + + @Override + public String getPatternName(){ + return (this.getInstanceCount() + "-Line"); + } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RailButton.java b/core/src/net/sf/openrocket/rocketcomponent/RailButton.java new file mode 100644 index 0000000000..df6ea275ae --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/RailButton.java @@ -0,0 +1,355 @@ +package net.sf.openrocket.rocketcomponent; + +import java.util.ArrayList; +import java.util.Collection; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.preset.ComponentPreset.Type; +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.AnglePositionable; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; + +/** + * WARNING: This class is only partially implemented. Recomend a bit of testing before you attach it to the GUI. + * @author widget (Daniel Williams) + * + */ +public class RailButton extends ExternalComponent implements AnglePositionable, AxialPositionable, LineInstanceable { + + private static final Translator trans = Application.getTranslator(); + + // NOTE: Rail Button ARE NOT STANDARD -- They vary by manufacturer, and model. + // These presets have appropriate dimensions for each rail size, given the Rail Buttons contribute so little to flying properties. + public static final RailButton ROUND_1010 = make1010Button(); + public static final RailButton ROUND_1515 = make1515Button(); + + /* + * Rail Button Dimensions (side view) + * + * > outer dia < + * | | v + * ^ [[[[[[]]]]]] flangeHeight + * total >||||||<= inner dia ^ + * height |||||| v + * v [[[[[[]]]]]] standoff == baseHeight + * ================== ^ + * (body) + * + */ + // Note: the reference point for Rail Button Components is in the center bottom of the button. + protected double outerDiameter_m; + protected double totalHeight_m; + protected double innerDiameter_m; + protected double flangeHeight_m; + protected double standoff_m; + + protected final static double MINIMUM_STANDOFF= 0.001; + + private double radialDistance_m=0; + protected static final AngleMethod angleMethod = AngleMethod.RELATIVE; + private double angle_rad = 0; + private int instanceCount = 1; + private double instanceSeparation = 0; // front-front along the positive rocket axis. i.e. [1,0,0]; + + public RailButton(){ + super(AxialMethod.MIDDLE); + this.outerDiameter_m = 1.0; + this.totalHeight_m = 1.0; + this.innerDiameter_m = 0.8; + this.flangeHeight_m = 0.002; + this.setStandoff( 0.002); + this.setInstanceSeparation( 1.0); + } + + public RailButton( final double od, final double ht ) { + this(); + this.setOuterDiameter( od); + this.setTotalHeight( ht); + } + + public RailButton( final double od, final double id, final double ht, final double flangeThickness, final double _standoff ) { + super(AxialMethod.MIDDLE); + this.outerDiameter_m = od; + this.totalHeight_m = ht; + this.innerDiameter_m = id; + this.flangeHeight_m = flangeThickness; + this.setStandoff( _standoff); + this.setInstanceSeparation( od*2); + } + + private static final RailButton make1010Button(){ + final double id = 0.008; // guess + final double od = 0.0097; + final double ht = 0.0097; + final double thickness = 0.002; // guess + final double standoff = 0.002; // guess + RailButton rb1010 = new RailButton( od, id, ht, thickness, standoff); + rb1010.setMassOverridden(true); + rb1010.setOverrideMass(0.0019); + + rb1010.setInstanceCount(1); + rb1010.setInstanceSeparation( od*6 ); + return rb1010; + } + + private static final RailButton make1515Button(){ + final double id = 0.012; // guess + final double od = 0.016; + final double ht = 0.0173; + final double thickness = 0.0032; // guess + final double standoff = 0.0032; // guess + RailButton rb1010 = new RailButton( od, id, ht, thickness, standoff); + rb1010.setMassOverridden(true); + rb1010.setOverrideMass(0.0077); + + return rb1010; + } + + public double getStandoff(){ + return this.standoff_m; + } + + public double getBaseHeight(){ + return this.getStandoff(); + } + + public double getOuterDiameter() { + return this.outerDiameter_m; + } + + public double getInnerDiameter() { + return this.innerDiameter_m; + } + + public double getInnerHeight() { + return (this.totalHeight_m - this.flangeHeight_m - this.standoff_m); + } + + public double getTotalHeight() { + return this.totalHeight_m; + } + + public double getFlangeHeight() { + return this.flangeHeight_m; + } + + + public void setStandoff( final double newStandoff){ + this.standoff_m = Math.max( newStandoff, RailButton.MINIMUM_STANDOFF ); + } + + public void setInnerDiameter( final double newID ){ + this.innerDiameter_m = newID; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + + public void setOuterDiameter( final double newOD ){ + this.outerDiameter_m = newOD; + + // devel + this.innerDiameter_m = newOD*0.8; + this.setInstanceSeparation( newOD*6); + + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + public void setTotalHeight( final double newHeight ) { + this.totalHeight_m = newHeight; + + // devel + this.flangeHeight_m = newHeight*0.25; + this.setStandoff( newHeight*0.25); + + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + public void setThickness( final double newThickness ) { + this.flangeHeight_m = newThickness; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public boolean isAerodynamic(){ + // TODO: implement aerodynamics + return false; + } + + @Override + public double getAngleOffset(){ + return angle_rad; + } + + @Override + public AngleMethod getAngleMethod() { + return RailButton.angleMethod; + } + + @Override + public void setAngleMethod(AngleMethod newMethod) { + // no-op + } + + + @Override + public void setAngleOffset(final double angle_rad){ + double clamped_rad = MathUtil.clamp(angle_rad, -Math.PI, Math.PI); + + if (MathUtil.equals(this.angle_rad, clamped_rad)) + return; + this.angle_rad = clamped_rad; + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); + } + + + @Override + public void setAxialMethod( AxialMethod position) { + super.setAxialMethod(position); + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); + } + + @Override + public Coordinate[] getInstanceOffsets(){ + Coordinate[] toReturn = new Coordinate[this.getInstanceCount()]; + + final double yOffset = Math.cos(this.angle_rad) * ( this.radialDistance_m ); + final double zOffset = Math.sin(this.angle_rad) * ( this.radialDistance_m ); + + for ( int index=0; index < this.getInstanceCount(); index++){ + toReturn[index] = new Coordinate(index*this.instanceSeparation, yOffset, zOffset); + } + + return toReturn; + } + + @Override + public Type getPresetType() { + return ComponentPreset.Type.RAIL_BUTTON; + } + + @Override + public void componentChanged(ComponentChangeEvent e) { + super.componentChanged(e); + + RocketComponent body; + double parentRadius=0; + + for (body = this.getParent(); body != null; body = body.getParent()) { + if (body instanceof BodyTube) + parentRadius = ((BodyTube) body).getOuterRadius(); + } + + this.radialDistance_m = parentRadius; + } + + + @Override + public double getComponentVolume() { + final double volOuter = Math.PI*Math.pow( outerDiameter_m/2, 2)*flangeHeight_m; + final double volInner = Math.PI*Math.pow( innerDiameter_m/2, 2)*getInnerHeight(); + final double volStandoff = Math.PI*Math.pow( outerDiameter_m/2, 2)*standoff_m; + return (volOuter+ + volInner+ + volStandoff); + } + + @Override + public double getInstanceSeparation(){ + return this.instanceSeparation; + } + + @Override + public void setInstanceSeparation(final double _separation){ + this.instanceSeparation = _separation; + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); + } + + @Override + public void setInstanceCount( final int newCount ){ + if( 0 < newCount ){ + this.instanceCount = newCount; + } + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + @Override + public int getInstanceCount(){ + return this.instanceCount; + } + + @Override + public String getPatternName(){ + return (this.getInstanceCount() + "-Line"); + } + + @Override + public Collection getComponentBounds() { + final double r = outerDiameter_m / 2.0; + ArrayList set = new ArrayList(); + set.add(new Coordinate(r, totalHeight_m, r)); + set.add(new Coordinate(r, totalHeight_m, -r)); + set.add(new Coordinate(r, 0, r)); + set.add(new Coordinate(r, 0, -r)); + set.add(new Coordinate(-r, 0, r)); + set.add(new Coordinate(-r, 0, -r)); + set.add(new Coordinate(-r, totalHeight_m, r)); + set.add(new Coordinate(-r, totalHeight_m, -r)); + return set; + } + + @Override + public Coordinate getComponentCG() { + // Math.PI and density are assumed constant through calculation, and thus may be factored out. + final double volumeFlange = Math.pow( outerDiameter_m/2, 2)*flangeHeight_m; + final double volumeInner = Math.pow( innerDiameter_m/2, 2)*(getInnerHeight()); + final double volumeStandoff = Math.pow( outerDiameter_m/2, 2)*this.standoff_m; + final double totalVolume = volumeFlange + volumeInner + volumeStandoff; + final double heightCM = (volumeFlange*( this.totalHeight_m-getFlangeHeight()/2) + volumeInner*( this.standoff_m + this.getInnerHeight()/2) + volumeStandoff*(this.standoff_m/2))/totalVolume; + + if( heightCM > this.totalHeight_m ){ + throw new BugException(" bug found while computing the CG of a RailButton: "+this.getName()+"\n height of CG: "+heightCM); + } + + final double CMy = Math.cos(this.angle_rad)*heightCM; + final double CMz = Math.sin(this.angle_rad)*heightCM; + + return new Coordinate( 0, CMy, CMz, getComponentMass()); + } + + @Override + public String getComponentName() { + return trans.get("RailButton.RailButton"); + } + + @Override + public double getLongitudinalUnitInertia() { + // 1/12 * (3 * (r2^2 + r1^2) + h^2) +// return (3 * (MathUtil.pow2(getOuterRadius()) + MathUtil.pow2(getInnerRadius())) + MathUtil.pow2(getLength())) / 12; + return 0.0; + } + + @Override + public double getRotationalUnitInertia() { + // 1/2 * (r1^2 + r2^2) +// return (MathUtil.pow2(getInnerRadius()) + MathUtil.pow2(getOuterRadius())) / 2; + return 0.0; + } + + @Override + public boolean allowsChildren() { + return false; + } + + @Override + public boolean isCompatible(Class type) { + // Allow nothing to be attached to a LaunchButton + return false; + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java b/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java index c9318b28b1..7de46329c1 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java @@ -25,19 +25,13 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu private Material.Surface material; - private FlightConfigurationImpl deploymentConfigurations; - - + private FlightConfigurableParameterSet deploymentConfigurations; public RecoveryDevice() { - this.deploymentConfigurations = new FlightConfigurationImpl(this, ComponentChangeEvent.EVENT_CHANGE, new DeploymentConfiguration()); + this.deploymentConfigurations = new FlightConfigurableParameterSet( new DeploymentConfiguration()); setMaterial(Application.getPreferences().getDefaultComponentMaterial(RecoveryDevice.class, Material.Type.SURFACE)); } - - - - public abstract double getArea(); public abstract double getComponentCD(double mach); @@ -91,17 +85,19 @@ public final void setMaterial(Material mat) { fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - - public FlightConfiguration getDeploymentConfiguration() { + public FlightConfigurableParameterSet getDeploymentConfigurations() { return deploymentConfigurations; } - @Override - public void cloneFlightConfiguration(String oldConfigId, String newConfigId) { - deploymentConfigurations.cloneFlightConfiguration(oldConfigId, newConfigId); + public void copyFlightConfiguration(FlightConfigurationId oldConfigId, FlightConfigurationId newConfigId) { + deploymentConfigurations.copyFlightConfiguration(oldConfigId, newConfigId); } + @Override + public void reset( final FlightConfigurationId fcid){ + deploymentConfigurations.reset(fcid); + } @Override public double getComponentMass() { @@ -121,8 +117,7 @@ protected void loadFromPreset(ComponentPreset preset) { @Override protected RocketComponent copyWithOriginalID() { RecoveryDevice copy = (RecoveryDevice) super.copyWithOriginalID(); - copy.deploymentConfigurations = new FlightConfigurationImpl(deploymentConfigurations, - copy, ComponentChangeEvent.EVENT_CHANGE); + copy.deploymentConfigurations = new FlightConfigurableParameterSet(deploymentConfigurations); return copy; } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ReferenceType.java b/core/src/net/sf/openrocket/rocketcomponent/ReferenceType.java index 02264ebe5b..a341be5cd3 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ReferenceType.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ReferenceType.java @@ -7,10 +7,10 @@ public enum ReferenceType { NOSECONE { @Override - public double getReferenceLength(Configuration config) { - for (RocketComponent c: config) { + public double getReferenceLength(FlightConfiguration config) { + for (RocketComponent c : config.getActiveComponents()) { if (c instanceof SymmetricComponent) { - SymmetricComponent s = (SymmetricComponent)c; + SymmetricComponent s = (SymmetricComponent) c; if (s.getForeRadius() >= 0.0005) return s.getForeRadius() * 2; if (s.getAftRadius() >= 0.0005) @@ -23,11 +23,11 @@ public double getReferenceLength(Configuration config) { MAXIMUM { @Override - public double getReferenceLength(Configuration config) { + public double getReferenceLength(FlightConfiguration config) { double r = 0; - for (RocketComponent c: config) { + for (RocketComponent c : config.getActiveComponents()) { if (c instanceof SymmetricComponent) { - SymmetricComponent s = (SymmetricComponent)c; + SymmetricComponent s = (SymmetricComponent) c; r = Math.max(r, s.getForeRadius()); r = Math.max(r, s.getAftRadius()); } @@ -37,14 +37,14 @@ public double getReferenceLength(Configuration config) { r = Rocket.DEFAULT_REFERENCE_LENGTH; return r; } - }, - + }, + CUSTOM { @Override - public double getReferenceLength(Configuration config) { + public double getReferenceLength(FlightConfiguration config) { return config.getRocket().getCustomReferenceLength(); } }; - public abstract double getReferenceLength(Configuration rocket); + public abstract double getReferenceLength(FlightConfiguration rocket); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java index 9e2c16bc11..5dbf4d5baf 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java @@ -22,13 +22,12 @@ public abstract class RingComponent extends StructuralComponent implements Coaxi protected boolean innerRadiusAutomatic = false; - private double radialDirection = 0; - private double radialPosition = 0; + protected double radialDirection = 0; + protected double radialPosition = 0; private double shiftY = 0; private double shiftZ = 0; - @Override public abstract double getOuterRadius(); @@ -163,29 +162,6 @@ public void setRadialShift(double y, double z) { fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - - /** - * Return the number of times the component is multiplied. - */ - public int getClusterCount() { - if (this instanceof Clusterable) - return ((Clusterable) this).getClusterConfiguration().getClusterCount(); - return 1; - } - - - /** - * Shift the coordinates according to the radial position and direction. - */ - @Override - public Coordinate[] shiftCoordinates(Coordinate[] array) { - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(0, shiftY, shiftZ); - } - return array; - } - - @Override public Collection getComponentBounds() { List bounds = new ArrayList(); @@ -194,17 +170,29 @@ public Collection getComponentBounds() { return bounds; } - - @Override public Coordinate getComponentCG() { - return new Coordinate(length / 2, 0, 0, getComponentMass()); + Coordinate cg = Coordinate.ZERO; + final int instanceCount = getInstanceCount(); + final double instanceMass = ringMass(getOuterRadius(), getInnerRadius(), getLength(), getMaterial().getDensity()); + + if (1 == instanceCount ) { + cg = new Coordinate( length/2, 0, 0, instanceMass ); + }else{ + Coordinate offsets[] = getInstanceOffsets(); + for( Coordinate c : offsets) { + c = c.setWeight( instanceMass ); + cg = cg.average(c); + } + cg = cg.add( length/2, 0, 0); + } + return cg; } @Override public double getComponentMass() { return ringMass(getOuterRadius(), getInnerRadius(), getLength(), - getMaterial().getDensity()) * getClusterCount(); + getMaterial().getDensity()) * getInstanceCount(); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java b/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java new file mode 100644 index 0000000000..b97a244972 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/RingInstanceable.java @@ -0,0 +1,33 @@ +package net.sf.openrocket.rocketcomponent; + +import net.sf.openrocket.rocketcomponent.position.AnglePositionable; +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusPositionable; + +public interface RingInstanceable extends Instanceable, AnglePositionable, RadiusPositionable { + + @Override + public double getAngleOffset(); + @Override + public void setAngleOffset( final double angle); + @Override + public AngleMethod getAngleMethod(); + @Override + public void setAngleMethod( final AngleMethod method ); + + public double getInstanceAngleIncrement(); + + public double[] getInstanceAngles(); + + + @Override + public double getRadiusOffset(); + @Override + public void setRadiusOffset( final double radius); + @Override + public RadiusMethod getRadiusMethod(); + @Override + public void setRadiusMethod( final RadiusMethod method ); + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/Rocket.java b/core/src/net/sf/openrocket/rocketcomponent/Rocket.java index 295b6f452a..f29a5f4f57 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Rocket.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Rocket.java @@ -1,15 +1,17 @@ package net.sf.openrocket.rocketcomponent; import java.util.Collection; -import java.util.Collections; import java.util.EventListener; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.Coordinate; @@ -17,9 +19,6 @@ import net.sf.openrocket.util.StateChangeListener; import net.sf.openrocket.util.UniqueID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * Base for all rocket components. This is the "starting point" for all rocket trees. @@ -30,19 +29,17 @@ * * @author Sampo Niskanen */ - -public class Rocket extends RocketComponent { +@SuppressWarnings("serial") +public class Rocket extends ComponentAssembly { private static final Logger log = LoggerFactory.getLogger(Rocket.class); private static final Translator trans = Application.getTranslator(); - public static final String DEFAULT_NAME = "[{motors}]"; - public static final double DEFAULT_REFERENCE_LENGTH = 0.01; - - + protected static final double DEFAULT_REFERENCE_LENGTH = 0.01; + /** * List of component change listeners. */ - private List listenerList = new ArrayList(); + private List listenerList = new ArrayList<>(); /** * When freezeList != null, events are not dispatched but stored in the list. @@ -57,46 +54,41 @@ public class Rocket extends RocketComponent { private int treeModID; private int functionalModID; + private boolean eventsEnabled=false; private ReferenceType refType = ReferenceType.MAXIMUM; // Set in constructor private double customReferenceLength = DEFAULT_REFERENCE_LENGTH; - // The default configuration used in dialogs - private final Configuration defaultConfiguration; - - private String designer = ""; private String revision = ""; // Flight configuration list - private ArrayList flightConfigurationIDs = new ArrayList(); - private HashMap flightConfigurationNames = new HashMap(); - { - flightConfigurationIDs.add(null); - } - + private FlightConfiguration selectedConfiguration; + private FlightConfigurableParameterSet configSet; + private HashMap stageMap = new HashMap<>(); // Does the rocket have a perfect finish (a notable amount of laminar flow) private boolean perfectFinish = false; - ///////////// Constructor ///////////// public Rocket() { - super(RocketComponent.Position.AFTER); + super(AxialMethod.ABSOLUTE); modID = UniqueID.next(); massModID = modID; aeroModID = modID; treeModID = modID; functionalModID = modID; - defaultConfiguration = new Configuration(this); + + // must be after the hashmaps :P + FlightConfiguration defaultConfig = new FlightConfiguration(this, FlightConfigurationId.DEFAULT_VALUE_FCID); + configSet = new FlightConfigurableParameterSet<>( defaultConfig ); + this.selectedConfiguration = defaultConfig; } - - public String getDesigner() { checkState(); return designer; @@ -129,10 +121,9 @@ public void setRevision(String s) { */ public int getStageCount() { checkState(); - return this.getChildCount(); + return this.stageMap.size(); } - /** * Return the non-negative modification ID of this rocket. The ID is changed * every time any change occurs in the rocket. This can be used to check @@ -195,9 +186,79 @@ public int getFunctionalModID() { return functionalModID; } + public Collection getStageList() { + return this.stageMap.values(); + } + + public AxialStage getStage( final int stageNumber ) { + return this.stageMap.get( stageNumber); + } + /* + * Returns the stage at the top of the central stack + * + * @Return a reference to the topmost stage + */ + public AxialStage getTopmostStage(){ + return (AxialStage) getChild(0); + } + /* + * Returns the stage at the top of the central stack + * + * @Return a reference to the topmost stage + */ + /*package-local*/ AxialStage getBottomCoreStage(){ + // get last stage that's a direct child of the rocket. + return (AxialStage) children.get( children.size()-1 ); + } + @Override + public int getStageNumber() { + // invalid, error value + return -1; + } + private int getNewStageNumber() { + int guess = 0; + while (stageMap.containsKey(guess)) { + guess++; + } + return guess; + } + + /*package-local*/ void trackStage(final AxialStage newStage) { + int stageNumber = newStage.getStageNumber(); + AxialStage value = stageMap.get(stageNumber); + + if (newStage.equals(value)) { + // stage is already added + if( newStage != value ){ + // but the value is the wrong instance + stageMap.put(stageNumber, newStage); + } + return; + } else { + stageNumber = getNewStageNumber(); + newStage.setStageNumber(stageNumber); + this.stageMap.put(stageNumber, newStage); + } + } + + /*package-local*/ void forgetStage(final AxialStage oldStage) { + this.stageMap.remove(oldStage.getStageNumber()); + } + + @Override + public void setAxialMethod(final AxialMethod newAxialMethod) { + this.axialMethod = AxialMethod.ABSOLUTE; + } + + @Override + public void setAxialOffset( final double requestOffset ) { + this.axialOffset = 0.; + this.position = Coordinate.ZERO; + } + public ReferenceType getReferenceType() { checkState(); return refType; @@ -257,24 +318,30 @@ public boolean isPerfectFinish() { - - /** - * Make a deep copy of the Rocket structure. This method is exposed as public to allow + * Make a shallow copy of the Rocket structure. This method is exposed as public to allow * for undo/redo system functionality. + * + * note: the .clone() function returns a shallow copy-- which is probably appropriate. */ - @SuppressWarnings("unchecked") @Override public Rocket copyWithOriginalID() { Rocket copy = (Rocket) super.copyWithOriginalID(); - copy.flightConfigurationIDs = this.flightConfigurationIDs.clone(); - copy.flightConfigurationNames = - (HashMap) this.flightConfigurationNames.clone(); - copy.resetListeners(); + + // Rocket copy is cloned, so non-trivial members must be cloned as well: + copy.stageMap = new HashMap(); + copy.configSet = new FlightConfigurableParameterSet( this.configSet ); + copy.selectedConfiguration = copy.configSet.get( this.getSelectedConfiguration().getId()); + copy.listenerList = new ArrayList(); return copy; } + public int getFlightConfigurationCount() { + checkState(); + return this.configSet.size(); + } + /** * Load the rocket structure from the source. The method loads the fields of this * Rocket object and copies the references to siblings from the source. @@ -285,7 +352,6 @@ public Rocket copyWithOriginalID() { * and therefore fires an UNDO_EVENT, masked with all applicable mass/aerodynamic/tree * changes. */ - @SuppressWarnings("unchecked") public void loadFrom(Rocket r) { // Store list of components to invalidate after event has been fired @@ -306,16 +372,10 @@ public void loadFrom(Rocket r) { this.functionalModID = r.functionalModID; this.refType = r.refType; this.customReferenceLength = r.customReferenceLength; + this.configSet = new FlightConfigurableParameterSet( r.configSet ); - this.flightConfigurationIDs = r.flightConfigurationIDs.clone(); - this.flightConfigurationNames = - (HashMap) r.flightConfigurationNames.clone(); this.perfectFinish = r.perfectFinish; - String id = defaultConfiguration.getFlightConfigurationID(); - if (!this.flightConfigurationIDs.contains(id)) - defaultConfiguration.setFlightConfigurationID(null); - this.checkComponentStructure(); fireComponentChangeEvent(type); @@ -366,54 +426,93 @@ public void removeComponentChangeListener(ComponentChangeListener l) { } @Override - protected void fireComponentChangeEvent(ComponentChangeEvent e) { + protected void fireComponentChangeEvent(ComponentChangeEvent cce) { + if( ! this.eventsEnabled ){ + return; + } + mutex.lock("fireComponentChangeEvent"); try { checkState(); + { // vvvv DEVEL vvvv + //System.err.println("fireEvent@rocket."); + } // ^^^^ DEVEL ^^^^ + // Update modification ID's only for normal (not undo/redo) events - if (!e.isUndoChange()) { + if (!cce.isUndoChange()) { modID = UniqueID.next(); - if (e.isMassChange()) + if (cce.isMassChange()) massModID = modID; - if (e.isAerodynamicChange()) + if (cce.isAerodynamicChange()) aeroModID = modID; - if (e.isTreeChange()) + if (cce.isTreeChange()) treeModID = modID; - if (e.getType() != ComponentChangeEvent.NONFUNCTIONAL_CHANGE) + if (cce.isFunctionalChange()) functionalModID = modID; } // Check whether frozen if (freezeList != null) { - log.debug("Rocket is in frozen state, adding event " + e + " info freeze list"); - freezeList.add(e); + log.debug("Rocket is in frozen state, adding event " + cce + " info freeze list"); + freezeList.add(cce); return; } - - log.debug("Firing rocket change event " + e); - + // Notify all components first Iterator iterator = this.iterator(true); while (iterator.hasNext()) { - iterator.next().componentChanged(e); + iterator.next().componentChanged(cce); } - // Notify all listeners - // Copy the list before iterating to prevent concurrent modification exceptions. - EventListener[] list = listenerList.toArray(new EventListener[0]); - for (EventListener l : list) { - if (l instanceof ComponentChangeListener) { - ((ComponentChangeListener) l).componentChanged(e); - } else if (l instanceof StateChangeListener) { - ((StateChangeListener) l).stateChanged(e); - } - } + updateConfigurations(); + + notifyAllListeners(cce); + } finally { mutex.unlock("fireComponentChangeEvent"); } } + @Override + public void update(){ + updateStageMap(); + updateConfigurations(); + } + + private void updateStageMap(){ + for( RocketComponent component : getChildren() ){ + if (component instanceof AxialStage) { + AxialStage stage = (AxialStage) component; + trackStage(stage); + } + } + } + + private void updateConfigurations(){ + this.selectedConfiguration.update(); + for( FlightConfiguration config : configSet ){ + config.update(); + } + } + + + private void notifyAllListeners(final ComponentChangeEvent cce){ + // Copy the list before iterating to prevent concurrent modification exceptions. + EventListener[] list = listenerList.toArray(new EventListener[0]); + for (EventListener l : list) { + { // vvvv DEVEL vvvv + //System.err.println("notifying listener. (type= "+l.getClass().getSimpleName()+")"); + //System.err.println(" (type= "+l.getClass().getName()+")"); + } // ^^^^ DEVEL ^^^^ + + if (l instanceof ComponentChangeListener) { + ((ComponentChangeListener) l).componentChanged(cce); + } else if (l instanceof StateChangeListener) { + ((StateChangeListener) l).stateChanged(cce); + } + } + } /** * Freezes the rocket structure from firing any events. This may be performed to @@ -436,7 +535,7 @@ protected void fireComponentChangeEvent(ComponentChangeEvent e) { public void freeze() { checkState(); if (freezeList == null) { - freezeList = new LinkedList(); + freezeList = new LinkedList<>(); log.debug("Freezing Rocket"); } else { Application.getExceptionHandler().handleErrorCondition("Attempting to freeze Rocket when it is already frozen, " + @@ -483,76 +582,56 @@ public void thaw() { /** - * Return the default configuration. This should be used in the user interface + * Return the currently selected configuration. This should be used in the user interface * to ensure a consistent rocket configuration between dialogs. It should NOT * be used in simulations not relating to the UI. * - * @return the default {@link Configuration}. + * @return the current {@link FlightConfiguration}. */ - public Configuration getDefaultConfiguration() { + public FlightConfiguration getSelectedConfiguration() { checkState(); - return defaultConfiguration; + return selectedConfiguration; } - - /** - * Return an array of the flight configuration IDs. This array is guaranteed - * to contain the null ID as the first element. - * - * @return an array of the flight configuration IDs. - */ - public String[] getFlightConfigurationIDs() { - checkState(); - return flightConfigurationIDs.toArray(new String[0]); + public int getConfigurationCount(){ + return this.configSet.size(); } - /** - * Add a new flight configuration ID to the flight configurations. The new ID - * is returned. - * - * @return the new flight configuration ID. - */ - public String newFlightConfigurationID() { - checkState(); - String id = UUID.randomUUID().toString(); - flightConfigurationIDs.add(id); - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); - return id; + public List getIds(){ + return configSet.getIds(); } - - /** - * Add a specified motor configuration ID to the motor configurations. - * - * @param id the motor configuration ID. - * @return true if successful, false if the ID was already used. - */ - public boolean addMotorConfigurationID(String id) { - checkState(); - if (id == null || flightConfigurationIDs.contains(id)) - return false; - flightConfigurationIDs.add(id); - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); - return true; - } - + /** - * Remove a flight configuration ID from the configuration IDs. The null - * ID cannot be removed, and an attempt to remove it will be silently ignored. + * Remove a flight configuration ID from the configuration IDs. The + * FlightConfigurationId.DEFAULT_VALUE_FCID ID cannot be removed, + * and an attempt to remove it will be silently ignored. * - * @param id the flight configuration ID to remove + * @param fcid the flight configuration ID to remove */ - public void removeFlightConfigurationID(String id) { + public void removeFlightConfiguration(final FlightConfigurationId fcid) { checkState(); - if (id == null) + if( fcid.hasError() ){ return; - // Get current configuration: - String currentId = getDefaultConfiguration().getFlightConfigurationID(); - // If we're removing the current configuration, we need to switch to a different one first. - if (currentId != null && currentId.equals(id)) { - getDefaultConfiguration().setFlightConfigurationID(null); } - flightConfigurationIDs.remove(id); - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); + + if( selectedConfiguration.getId().equals( fcid)){ + selectedConfiguration = configSet.getDefault(); + } + + // removed any component configuration tied to this FCID + Iterator iterator = this.iterator(); + while (iterator.hasNext()) { + RocketComponent comp = iterator.next(); + + if (comp instanceof FlightConfigurableComponent){ + FlightConfigurableComponent confbl = (FlightConfigurableComponent)comp; + confbl.reset( fcid); + } + } + + // Get current configuration: + this.configSet.reset( fcid); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -562,23 +641,26 @@ public void removeFlightConfigurationID(String id) { * @param id the configuration ID. * @return whether a motor configuration with that ID exists. */ - public boolean isFlightConfigurationID(String id) { + public boolean containsFlightConfigurationID(final FlightConfigurationId id) { checkState(); - return flightConfigurationIDs.contains(id); + if( id.hasError() ){ + return false; + } + return configSet.containsId( id); } - /** * Check whether the given motor configuration ID has motors defined for it. * - * @param id the motor configuration ID (may be invalid). + * @param fcid the FlightConfigurationID containing the motor (may be invalid). * @return whether any motors are defined for it. */ - public boolean hasMotors(String id) { + public boolean hasMotors(FlightConfigurationId fcid) { checkState(); - if (id == null) + if( fcid.hasError() ){ return false; + } Iterator iterator = this.iterator(); while (iterator.hasNext()) { @@ -588,108 +670,169 @@ public boolean hasMotors(String id) { MotorMount mount = (MotorMount) c; if (!mount.isMotorMount()) continue; - if (mount.getMotorConfiguration().get(id).getMotor() != null) { + if (mount.getMotorConfig(fcid).getMotor() != null) { return true; } } } return false; } - - + /** - * Return the user-set name of the flight configuration. If no name has been set, - * returns the default name ({@link #DEFAULT_NAME}). + * Return a flight configuration. If the supplied id does not have a specific instance, the default is returned. * - * @param id the flight configuration id - * @return the configuration name + * @param fcid the flight configuration id + * @return FlightConfiguration instance */ - public String getFlightConfigurationName(String id) { + public FlightConfigurationId createFlightConfiguration( final FlightConfigurationId fcid) { checkState(); - if (!isFlightConfigurationID(id)) - return DEFAULT_NAME; - String s = flightConfigurationNames.get(id); - if (s == null) - return DEFAULT_NAME; - return s; + + if( null == fcid ){ + // fall-through to the default case: + // ...creating a FlightConfiguration( null ) just allocates a fresh new FCID + }else if( fcid.hasError() ){ + return configSet.getDefault().getFlightConfigurationID(); + }else if( configSet.containsId(fcid)){ + return fcid; + } + FlightConfiguration nextConfig = new FlightConfiguration(this, fcid); + this.configSet.set(nextConfig.getId(), nextConfig); + fireComponentChangeEvent(ComponentChangeEvent.TREE_CHANGE); + return nextConfig.getFlightConfigurationID(); } /** - * Set the name of the flight configuration. A name can be unset by passing + * Return a flight configuration. If the supplied id does not have a specific instance, the default is returned. + * + * @param fcid the flight configuration id + * @return a FlightConfiguration instance + */ + public FlightConfiguration getFlightConfiguration(final FlightConfigurationId fcid) { + checkState(); + return this.configSet.get(fcid); + } + + public FlightConfiguration getFlightConfigurationByIndex(final int configIndex) { + return getFlightConfigurationByIndex( configIndex, false); + } + + /** + * Return a flight configuration. If the supplied index is out of bounds, an exception is thrown. + * If the default instance is allowed, the default will be at index 0. + * + * @param allowDefault Whether to allow returning the default instance + * @param configIndex The flight configuration index number + * @return FlightConfiguration instance + */ + public FlightConfiguration getFlightConfigurationByIndex( int configIndex, final boolean allowDefault ) { + if( allowDefault ){ + if( 0 == configIndex ){ + return configSet.getDefault(); + } + --configIndex; + } + return this.configSet.get( this.getId(configIndex)); + } + + public FlightConfigurationId getId( final int configIndex) { + List idList = configSet.getIds(); + return idList.get(configIndex); + } + + public void setSelectedConfiguration(final FlightConfigurationId selectId) { + checkState(); + + if( selectId.equals( selectedConfiguration.getFlightConfigurationID())){ + // if desired configuration is already selected, skip the event + return; + } + + this.selectedConfiguration = this.configSet.get( selectId ); + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); + } + + /** + * Associate the given ID and flight configuration. * null or an empty string. * - * @param id the flight configuration id - * @param name the name for the flight configuration + * @param fcid the flight configuration id + * @param newConfig new FlightConfiguration to store */ - public void setFlightConfigurationName(String id, String name) { + public void setFlightConfiguration(final FlightConfigurationId fcid, FlightConfiguration newConfig) { checkState(); - if (name == null || name.equals("") || DEFAULT_NAME.equals(name)) { - flightConfigurationNames.remove(id); - } else { - flightConfigurationNames.put(id, name); + if( fcid.hasError() ){ + log.error("attempt to set a 'fcid = config' with a error fcid. Ignored.", new IllegalArgumentException("error id:"+fcid)); + return; + } + + if (null == newConfig){ + configSet.reset( fcid); + }else if( fcid.equals( configSet.get(fcid).getFlightConfigurationID())){ + // this mapping already exists; skip the event + return; + }else{ + configSet.set(fcid, newConfig); } fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } - - - //////// Obligatory component information - - @Override public String getComponentName() { //// Rocket return trans.get("Rocket.compname.Rocket"); } - @Override - public Coordinate getComponentCG() { - return new Coordinate(0, 0, 0, 0); - } - - @Override - public double getComponentMass() { - return 0; - } - - @Override - public double getLongitudinalUnitInertia() { - return 0; - } - - @Override - public double getRotationalUnitInertia() { - return 0; - } + + /** + * Allows only AxialStage components to be added to the type Rocket. + */ @Override - public Collection getComponentBounds() { - return Collections.emptyList(); + public boolean isCompatible(Class type) { + return (AxialStage.class.equals(type)); } - - @Override - public boolean isAerodynamic() { - return false; + + /** + * STUB. would enable the monitoring, relay and production of events in this rocket instance. + */ + public void enableEvents() { + this.enableEvents(true); + this.update(); } - @Override - public boolean isMassive() { - return false; + /** + * STUB. would enable the monitoring, relay and production of events in this rocket instance. + */ + public void enableEvents( final boolean _enable ) { + if( this.eventsEnabled && _enable){ + return; + }else if( _enable ){ + this.eventsEnabled = true; + this.fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE); + }else{ + this.eventsEnabled = false; + } } - @Override - public boolean allowsChildren() { - return true; + public String toDebugConfigs(){ + StringBuilder buf = new StringBuilder(); + buf.append(String.format("====== Dumping %d Configurations from rocket: %s ======\n", + this.getConfigurationCount(), this.getName())); + final String fmt = " [%12s]: %s\n"; + for( FlightConfiguration config : this.configSet ){ + String shortKey = config.getId().toShortKey(); + if( this.selectedConfiguration.equals( config)){ + shortKey = "=>" + shortKey; + } + buf.append(String.format(fmt, shortKey, config.getName() )); + } + return buf.toString(); } - - /** - * Allows only Stage components to be added to the type Rocket. - */ - @Override - public boolean isCompatible(Class type) { - return (Stage.class.isAssignableFrom(type)); + + public FlightConfiguration getEmptyConfiguration() { + return this.configSet.getDefault(); } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index 8edda664ba..fc20dc813e 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -1,15 +1,23 @@ package net.sf.openrocket.rocketcomponent; +import java.util.ArrayDeque; import java.util.Collection; +import java.util.Deque; import java.util.EventObject; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.appearance.Appearance; import net.sf.openrocket.appearance.Decal; +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.preset.ComponentPreset; -import net.sf.openrocket.startup.Application; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.ChangeSource; @@ -20,15 +28,16 @@ import net.sf.openrocket.util.LineStyle; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.SafetyMutex; -import net.sf.openrocket.util.SimpleStack; import net.sf.openrocket.util.StateChangeListener; import net.sf.openrocket.util.UniqueID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - +/** + * Master class that defines components of rockets + * almost all hardware from the rocket extends from this abstract class + * + */ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable { + @SuppressWarnings("unused") private static final Logger log = LoggerFactory.getLogger(RocketComponent.class); // Because of changes to Java 1.7.0-45's mechanism to construct DataFlavor objects (used in Drag and Drop) @@ -36,40 +45,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab // on to the Translator object, we'll just use when we need it. //private static final Translator trans = Application.getTranslator(); - - /* - * Text is suitable to the form - * Position relative to: - */ - public enum Position { - /** Position relative to the top of the parent component. */ - //// Top of the parent component - TOP(Application.getTranslator().get("RocketComponent.Position.TOP")), - /** Position relative to the middle of the parent component. */ - //// Middle of the parent component - MIDDLE(Application.getTranslator().get("RocketComponent.Position.MIDDLE")), - /** Position relative to the bottom of the parent component. */ - //// Bottom of the parent component - BOTTOM(Application.getTranslator().get("RocketComponent.Position.BOTTOM")), - /** Position after the parent component (for body components). */ - //// After the parent component - AFTER(Application.getTranslator().get("RocketComponent.Position.AFTER")), - /** Specify an absolute X-coordinate position. */ - //// Tip of the nose cone - ABSOLUTE(Application.getTranslator().get("RocketComponent.Position.ABSOLUTE")); - - private String title; - - Position(String title) { - this.title = title; - } - - @Override - public String toString() { - return title; - } - } - /** * A safety mutex that can be used to prevent concurrent access to this component. */ @@ -79,12 +54,12 @@ public String toString() { /** * Parent component of the current component, or null if none exists. */ - private RocketComponent parent = null; + protected RocketComponent parent = null; /** * List of child components of this component. */ - private ArrayList<RocketComponent> children = new ArrayList<RocketComponent>(); + protected ArrayList<RocketComponent> children = new ArrayList<RocketComponent>(); //////// Parameters common to all components: @@ -98,16 +73,22 @@ public String toString() { protected double length = 0; /** - * Positioning of this component relative to the parent component. + * How this component is axially positioned, possibly in relative to the parent component. */ - protected Position relativePosition; + protected AxialMethod axialMethod = AxialMethod.AFTER; /** * Offset of the position of this component relative to the normal position given by * relativePosition. By default zero, i.e. no position change. */ - protected double position = 0; + protected double axialOffset = 0; + /** + * Position of this component relative to it's parent. + * In case (null == parent ): i.e. the Rocket/root component, the position is constrained to 0,0,0, and is the reference origin for the entire rocket. + * Defaults to (0,0,0) + */ + protected Coordinate position = new Coordinate(); // Color of the component, null means to use the default color private Color color = null; @@ -119,6 +100,8 @@ public String toString() { private boolean massOverriden = false; private double overrideCGX = 0; private boolean cgOverriden = false; + private double overrideCD = 0; + private boolean cdOverriden = false; private boolean overrideSubcomponents = false; @@ -153,10 +136,10 @@ public String toString() { * Default constructor. Sets the name of the component to the component's static name * and the relative position of the component. */ - public RocketComponent(Position relativePosition) { + public RocketComponent( AxialMethod newAxialMethod ) { // These must not fire any events, due to Rocket undo system initialization this.name = getComponentName(); - this.relativePosition = relativePosition; + this.axialMethod = newAxialMethod; newID(); } @@ -241,6 +224,8 @@ public final boolean isCompatible(RocketComponent c) { /** * Return a collection of bounding coordinates. The coordinates must be such that * the component is fully enclosed in their convex hull. + * + * Note: this function gets the bounds only for this component. Subchildren must be called individually. * * @return a collection of coordinates that bound the component. */ @@ -261,7 +246,18 @@ public final boolean isCompatible(RocketComponent c) { //////////// Methods that may be overridden //////////// - + /** + * Convenience method. + * + * @return indicates if a component is positioned via AFTER + */ + public boolean isAfter(){ + return (AxialMethod.AFTER == this.axialMethod ); + } + + public boolean isAxisymmetric(){ + return true; + } /** * Shift the coordinates in the array corresponding to radial movement. A component @@ -275,10 +271,10 @@ public final boolean isCompatible(RocketComponent c) { * @return an array of shifted coordinates. The method may modify the contents * of the passed array and return the array itself. */ - public Coordinate[] shiftCoordinates(Coordinate[] c) { - checkState(); - return c; - } +// protected Coordinate[] shiftCoordinates(Coordinate[] c) { +// checkState(); +// return c; +// } /** @@ -292,11 +288,11 @@ public Coordinate[] shiftCoordinates(Coordinate[] c) { protected void componentChanged(ComponentChangeEvent e) { // No-op checkState(); + update(); } - /** * Return the user-provided name of the component, or the component base * name if the user-provided name is empty. This can be used in the UI. @@ -328,6 +324,10 @@ public final String toDebugString() { } } + /** + * appends the debug string of the component into the passed builder + * @param sb String builder to be appended + */ private void toDebugString(StringBuilder sb) { sb.append(this.getClass().getSimpleName()).append('@').append(System.identityHashCode(this)); sb.append("[\"").append(this.getName()).append('"'); @@ -395,7 +395,7 @@ protected RocketComponent copyWithOriginalID() { // Add copied children to the structure without firing events. for (RocketComponent child : this.children) { RocketComponent childCopy = child.copyWithOriginalID(); - // Don't use add method since it fires events + // Don't use addChild(...) method since it fires events clone.children.add(childCopy); childCopy.parent = clone; } @@ -604,6 +604,60 @@ public final void setCGOverridden(boolean o) { cgOverriden = o; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } + + + + /** Return the current override CD. The CD is not neccesarily overriden. + * + * @return the override CG. + */ + public final double getOverrideCD() { + mutex.verify(); + return overrideCD; + } + + /** + * Set the current override CD to x. + * + * @param x the override CD to set. + */ + public final void setOverrideCD(double x) { + if (MathUtil.equals(overrideCD, x)) + return; + checkState(); + this.overrideCD = x; + if (isCDOverridden()) + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + else + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); + } + + + + /** + * Return whether the CD is currently overriden. + * + * @return whether the CD is overridden + */ + public final boolean isCDOverridden() { + mutex.verify(); + return cdOverriden; + } + + + /** + * Set whether the CD is currently overriden. + * + * @param o whether the CD is overriden + */ + public final void setCDOverridden(boolean o) { + if(cdOverriden == o) { + return; + } + checkState(); + cdOverriden = o; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + } @@ -653,8 +707,14 @@ public boolean isOverrideSubcomponentsEnabled() { return isCGOverridden() || isMassOverridden(); } - - + /** + * placeholder. This allows code to generally test if this component represents multiple instances with just one function call. + * + * @return number of instances + */ + public int getInstanceCount() { + return 1; + } /** * Get the user-defined name of the component. @@ -820,6 +880,10 @@ public final String getID() { return id; } + public final String getDebugName() { + return (name + "/" + id.substring(0,8)); + } + /** * Generate a new ID for this component. */ @@ -843,15 +907,14 @@ public final double getLength() { mutex.verify(); return length; } - + /** * Get the positioning of the component relative to its parent component. - * This is one of the enums of {@link Position}. A setter method is not provided, - * but can be provided by a subclass. + * + * @return This will return one of the enums of {@link AxialMethod} */ - public final Position getRelativePosition() { - mutex.verify(); - return relativePosition; + public final AxialMethod getAxialMethod() { + return axialMethod; } @@ -864,121 +927,271 @@ public final Position getRelativePosition() { * it should override this with a public method that simply calls this * supermethod AND fire a suitable ComponentChangeEvent. * - * @param position the relative positioning. + * @param newAxialMethod the relative positioning. */ - protected void setRelativePosition(RocketComponent.Position position) { - if (this.relativePosition == position) + public void setAxialMethod(final AxialMethod newAxialMethod) { + if (newAxialMethod == this.axialMethod) { + // no change. return; - checkState(); - - // Update position so as not to move the component - if (this.parent != null) { - double thisPos = this.toRelative(Coordinate.NUL, this.parent)[0].x; - - switch (position) { - case ABSOLUTE: - this.position = this.toAbsolute(Coordinate.NUL)[0].x; - break; - - case TOP: - this.position = thisPos; - break; - - case MIDDLE: - this.position = thisPos - (this.parent.length - this.length) / 2; - break; - - case BOTTOM: - this.position = thisPos - (this.parent.length - this.length); - break; - - default: - throw new BugException("Unknown position type: " + position); - } } - this.relativePosition = position; + // this variable does not change the internal representation + // the relativePosition (method) is just the lens through which external code may view this component's position. + this.axialMethod = newAxialMethod; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } - - + /** * Determine position relative to given position argument. Note: This is a side-effect free method. No state * is modified. * - * @param thePosition the relative position to be used as the basis for the computation - * @param relativeTo the position is computed relative the the given component + * @param asMethod the relative positioning method to be used for the computation * * @return double position of the component relative to the parent, with respect to <code>position</code> */ - public double asPositionValue(Position thePosition, RocketComponent relativeTo) { - double result = this.position; - if (relativeTo != null) { - double thisPos = this.toRelative(Coordinate.NUL, relativeTo)[0].x; - - switch (thePosition) { - case ABSOLUTE: - result = this.toAbsolute(Coordinate.NUL)[0].x; - break; - case TOP: - result = thisPos; - break; - case MIDDLE: - result = thisPos - (relativeTo.length - this.length) / 2; - break; - case BOTTOM: - result = thisPos - (relativeTo.length - this.length); - break; - default: - throw new BugException("Unknown position type: " + thePosition); - } + public double getAxialOffset(AxialMethod asMethod) { + double parentLength = 0; + if (null != this.parent) { + parentLength = this.parent.length; + } + + if(AxialMethod.ABSOLUTE == asMethod){ + return this.getComponentLocations()[0].x; + }else { + return asMethod.getAsOffset(this.position.x, this.length, parentLength); } - return result; } - /** - * Get the position value of the component. The exact meaning of the value is - * dependent on the current relative positioning. - * - * @return the positional value. - */ - public final double getPositionValue() { + public double getAxialOffset() { + return this.axialOffset; + } + + public double getAxialFront(){ + return this.position.x; + } + + public double getRadiusOffset() { mutex.verify(); - return position; + return 0; } + public RadiusMethod getRadiusMethod() { + return RadiusMethod.COAXIAL; + } + + public double getAngleOffset() { + mutex.verify(); + return 0; + } + + public boolean isAncestor(final RocketComponent testComp) { + RocketComponent curComp = testComp.parent; + while (curComp != null) { + if (this == curComp) { + return true; + } + curComp = curComp.parent; + } + return false; + } + + protected void setAfter() { + checkState(); + + if (null == this.parent) { + // Probably initialization order issue. Ignore for now. + return; + } + + this.axialMethod = AxialMethod.AFTER; + this.axialOffset = 0.; + + // if first component in the stage. => position from the top of the parent + final int thisIndex = this.parent.getChildPosition( this ); + if( 0 == thisIndex ) { + this.position = this.position.setX(0.); + }else if( 0 < thisIndex ) { + RocketComponent referenceComponent = parent.getChild( thisIndex - 1 ); + + double refLength = referenceComponent.getLength(); + double refRelX = referenceComponent.getPosition().x; + + this.position = this.position.setX(refRelX + refLength); + } + } /** * Set the position value of the component. The exact meaning of the value * depends on the current relative positioning. + * + * @param newOffset the desired offset of this component, using the components current axial-method + */ + public void setAxialOffset(double newOffset) { + this.setAxialOffset(this.axialMethod, newOffset); + this.fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); + } + + protected void setAxialOffset( final AxialMethod requestedMethod, final double requestedOffset) { + checkState(); + + double newX = Double.NaN; + + if (null == this.parent) { + // best-effort approximation. this should be corrected later on in the initialization process. + newX = requestedOffset; + } else if (AxialMethod.ABSOLUTE == requestedMethod){ + // in this case, this is simply the intended result + newX = requestedOffset - this.parent.getComponentLocations()[0].x; + } else if ( this.isAfter()){ + this.setAfter(); + return; + } else { + newX = requestedMethod.getAsPosition(requestedOffset, this.length, this.parent.getLength()); + } + + // snap to zero if less than the threshold 'EPSILON' + final double EPSILON = 0.000001; + if (EPSILON > Math.abs(newX)) { + newX = 0.0; + } else if (Double.isNaN(newX)){ + throw new BugException("setAxialOffset is broken -- attempted to update as NaN: " + this.toDebugDetail()); + } + + // store for later: + this.axialMethod = requestedMethod; + this.axialOffset = requestedOffset; + this.position = this.position.setX( newX ); + } + + protected void update() { + this.setAxialOffset(this.axialMethod, this.axialOffset); + } + + private final void updateChildren(){ + this.update(); + for( RocketComponent rc : children ){ + rc.updateChildren(); + } + } + + public Coordinate getPosition() { + return this.position; + } + + /** + * Returns coordinates of this component's instances in relation to this.parent. * <p> - * The default implementation is of protected visibility, since many components - * do not support setting the relative position. A component that does support - * it should override this with a public method that simply calls this - * supermethod AND fire a suitable ComponentChangeEvent. + * For example, the absolute position of any given instance is the parent's position + * plus the instance position returned by this method + * <p> + * NOTE: the length of this array returned always equals this.getInstanceCount() * - * @param value the position value of the component. + * @return a generated (i.e. new) array of instance locations */ - public void setPositionValue(double value) { - if (MathUtil.equals(this.position, value)) - return; + // @Override Me ! + public Coordinate[] getInstanceLocations(){ checkState(); - this.position = value; + + Coordinate center = this.position; + Coordinate[] offsets = getInstanceOffsets(); + + Coordinate[] locations= new Coordinate[offsets.length]; + for (int instanceNumber = 0; instanceNumber < locations.length; instanceNumber++) { + locations[instanceNumber] = center.add( offsets[instanceNumber] ); + } + + return locations; + } + + /** + * Provides locations of all instances of component relative to this component's reference point + * + * <p> + * NOTE: the length of this array returned always equals this.getInstanceCount() + * NOTE: default implementation just returns (0,0,0) + * + * @returns returns an array of coordinates, relative to its parent's position + */ + public Coordinate[] getInstanceOffsets(){ + return new Coordinate[]{Coordinate.ZERO}; + } + + // this is an inefficient way to calculate all of the locations; + // it also breaks locality, (i.e. is a rocket-wide calculation ) + @Deprecated + public Coordinate[] getLocations() { + return getComponentLocations(); } + /** + * Provides locations of all instances of component *accounting for all parent instancing* + * + * <p> + * NOTE: the length of this array MAY OR MAY NOT EQUAL this.getInstanceCount() + * --> RocketComponent::getInstanceCount() counts how many times this component replicates on its own + * --> vs. the total instance count due to parent assembly instancing + * + * @return Coordinates of all instance locations in the rocket, relative to the rocket's origin + */ + public Coordinate[] getComponentLocations() { + if (null == this.parent) { + // == improperly initialized components OR the root Rocket instance + return getInstanceOffsets(); + } else { + Coordinate[] parentPositions = this.parent.getComponentLocations(); + int parentCount = parentPositions.length; + + // override <instance>.getInstanceLocations() in each subclass + Coordinate[] instanceLocations = this.getInstanceLocations(); + int instanceCount = instanceLocations.length; + + // usual case optimization + if((1 == parentCount)&&(1 == instanceCount)){ + return new Coordinate[]{parentPositions[0].add(instanceLocations[0])}; + } + + int thisCount = instanceCount*parentCount; + Coordinate[] thesePositions = new Coordinate[thisCount]; + for (int pi = 0; pi < parentCount; pi++) { + for( int ii = 0; ii < instanceCount; ii++ ){ + thesePositions[pi + parentCount*ii] = parentPositions[pi].add(instanceLocations[ii]); + } + } + return thesePositions; + } + } + public double[] getInstanceAngles(){ + return new double[getInstanceCount()]; + } /////////// Coordinate changes /////////// /** - * Returns coordinate c in absolute coordinates. Equivalent to toComponent(c,null). + * Returns coordinate c in absolute/global/rocket coordinates. Equivalent to toComponent(c,null). + * Input coordinate C is interpreted to be position relative to this component's *center*, just as + * this component's center is the root of the component coordinate frame. + * + * @param c Coordinate in the component's coordinate system. + * @return an array of coordinates describing <code>c</code> in global coordinates. */ public Coordinate[] toAbsolute(Coordinate c) { checkState(); - return toRelative(c, null); + final String lockText = "toAbsolute"; + mutex.lock(lockText); + Coordinate[] thesePositions = this.getComponentLocations(); + + final int instanceCount = thesePositions.length; + + Coordinate[] toReturn = new Coordinate[instanceCount]; + for (int coordIndex = 0; coordIndex < instanceCount; coordIndex++) { + toReturn[coordIndex] = thesePositions[coordIndex].add(c); + } + + mutex.unlock(lockText); + return toReturn; } - - + /** * Return coordinate <code>c</code> described in the coordinate system of * <code>dest</code>. If <code>dest</code> is <code>null</code> returns @@ -996,115 +1209,57 @@ public Coordinate[] toAbsolute(Coordinate c) { * relative to <code>dest</code>. */ public final Coordinate[] toRelative(Coordinate c, RocketComponent dest) { + if (null == dest) { + throw new BugException("calling toRelative(c,null) is being refactored. "); + } + checkState(); mutex.lock("toRelative"); - try { - double absoluteX = Double.NaN; - RocketComponent search = dest; - Coordinate[] array = new Coordinate[1]; - array[0] = c; - - RocketComponent component = this; - while ((component != search) && (component.parent != null)) { - - array = component.shiftCoordinates(array); - - switch (component.relativePosition) { - case TOP: - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(component.position, 0, 0); - } - break; - - case MIDDLE: - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(component.position + - (component.parent.length - component.length) / 2, 0, 0); - } - break; - - case BOTTOM: - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(component.position + - (component.parent.length - component.length), 0, 0); - } - break; - - case AFTER: - // Add length of all previous brother-components with POSITION_RELATIVE_AFTER - int index = component.parent.children.indexOf(component); - assert (index >= 0); - for (index--; index >= 0; index--) { - RocketComponent comp = component.parent.children.get(index); - double componentLength = comp.getTotalLength(); - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(componentLength, 0, 0); - } - } - for (int i = 0; i < array.length; i++) { - array[i] = array[i].add(component.position + component.parent.length, 0, 0); - } - break; - - case ABSOLUTE: - search = null; // Requires back-search if dest!=null - if (Double.isNaN(absoluteX)) { - absoluteX = component.position; - } - break; - - default: - throw new BugException("Unknown relative positioning type of component" + - component + ": " + component.relativePosition); - } - - component = component.parent; // parent != null - } - - if (!Double.isNaN(absoluteX)) { - for (int i = 0; i < array.length; i++) { - array[i] = array[i].setX(absoluteX + c.x); - } - } - - // Check whether destination has been found or whether to backtrack - // TODO: LOW: Backtracking into clustered components uses only one component - if ((dest != null) && (component != dest)) { - Coordinate[] origin = dest.toAbsolute(Coordinate.NUL); - for (int i = 0; i < array.length; i++) { - array[i] = array[i].sub(origin[0]); - } - } - - return array; - } finally { - mutex.unlock("toRelative"); + + // not sure if this will give us an answer, or THE answer... + //final Coordinate sourceLoc = this.getLocation()[0]; + final Coordinate[] destLocs = dest.getLocations(); + Coordinate[] toReturn = new Coordinate[destLocs.length]; + for (int coordIndex = 0; coordIndex < destLocs.length; coordIndex++) { + toReturn[coordIndex] = this.getLocations()[0].add(c).sub(destLocs[coordIndex]); } + + mutex.unlock("toRelative"); + return toReturn; } +// protected static final Coordinate[] rebase(final Coordinate toMove[], final Coordinate source, final Coordinate dest) { +// final Coordinate delta = source.sub(dest); +// Coordinate[] toReturn = new Coordinate[toMove.length]; +// for (int coordIndex = 0; coordIndex < toMove.length; coordIndex++) { +// toReturn[coordIndex] = toMove[coordIndex].add(delta); +// } +// +// return toReturn; +// } + /** - * Recursively sum the lengths of all subcomponents that have position + * Iteratively sum the lengths of all subcomponents that have position * Position.AFTER. * * @return Sum of the lengths. */ - private final double getTotalLength() { - checkState(); - this.checkComponentStructure(); - mutex.lock("getTotalLength"); - try { - double l = 0; - if (relativePosition == Position.AFTER) - l = length; - for (int i = 0; i < children.size(); i++) - l += children.get(i).getTotalLength(); - return l; - } finally { - mutex.unlock("getTotalLength"); - } - } - +// private final double getTotalLength() { +// checkState(); +// this.checkComponentStructure(); +// mutex.lock("getTotalLength"); +// try { +// double l = 0; +// if (relativePosition == Position.AFTER) +// l = length; +// for (int i = 0; i < children.size(); i++) +// l += children.get(i).getTotalLength(); +// return l; +// } finally { +// mutex.unlock("getTotalLength"); +// } +// } /////////// Total mass and CG calculation //////////// @@ -1198,7 +1353,6 @@ public final void addChild(RocketComponent component) { addChild(component, children.size()); } - /** * Adds a child to the rocket component tree. The component is added to * the given position of the component's child list. @@ -1226,13 +1380,18 @@ public void addChild(RocketComponent component, int index) { } if (!isCompatible(component)) { - throw new IllegalStateException("Component " + component.getComponentName() + - " not currently compatible with component " + getComponentName()); + throw new IllegalStateException("Component: " + component.getComponentName() + + " not currently compatible with component: " + getComponentName()); } children.add(index, component); component.parent = this; + if (component instanceof AxialStage) { + AxialStage nStage = (AxialStage) component; + this.getRocket().trackStage(nStage); + } + this.checkComponentStructure(); component.checkComponentStructure(); @@ -1241,19 +1400,15 @@ public void addChild(RocketComponent component, int index) { /** * Removes a child from the rocket component tree. + * (redirect to the removed-by-component * * @param n remove the n'th child. * @throws IndexOutOfBoundsException if n is out of bounds */ public final void removeChild(int n) { checkState(); - RocketComponent component = children.remove(n); - component.parent = null; - - this.checkComponentStructure(); - component.checkComponentStructure(); - - fireAddRemoveEvent(component); + RocketComponent component = this.getChild(n); + this.removeChild(component); } /** @@ -1268,13 +1423,21 @@ public final boolean removeChild(RocketComponent component) { component.checkComponentStructure(); + if (children.remove(component)) { component.parent = null; + if (component instanceof AxialStage) { + AxialStage stage = (AxialStage) component; + this.getRocket().forgetStage(stage); + } + this.checkComponentStructure(); component.checkComponentStructure(); fireAddRemoveEvent(component); + updateBounds(); + return true; } return false; @@ -1298,6 +1461,7 @@ public final void moveChild(RocketComponent component, int index) { this.checkComponentStructure(); component.checkComponentStructure(); + updateBounds(); fireAddRemoveEvent(component); } } @@ -1373,8 +1537,9 @@ public final RocketComponent getParent() { public final RocketComponent getRoot() { checkState(); RocketComponent gp = this; - while (gp.parent != null) + while (gp.parent != null){ gp = gp.parent; + } return gp; } @@ -1400,43 +1565,53 @@ public final Rocket getRocket() { * IllegalStateException if a Stage is not in the parentage of this component. * * @return The Stage component this component belongs to. - * @throws IllegalStateException if a Stage component is not in the parentage. + * @throws IllegalStateException if we cannot find an AxialStage above <code>this</code> */ - public final Stage getStage() { + public final AxialStage getStage() { checkState(); - RocketComponent c = this; - while (c != null) { - if (c instanceof Stage) - return (Stage) c; - c = c.getParent(); + + RocketComponent curComponent = this; + while ( null != curComponent ) { + if (curComponent instanceof AxialStage) + return (AxialStage) curComponent; + curComponent = curComponent.parent; } - throw new IllegalStateException("getStage() called without Stage as a parent."); + throw new IllegalStateException("getStage() called on hierarchy without an AxialStage."); } + /** + * Return the first component assembly component that this component belongs to. + * + * @return The Stage component this component belongs to. + * @throws IllegalStateException if we cannot find an AxialStage above <code>this</code> + */ + public final ComponentAssembly getAssembly() { + checkState(); + + RocketComponent curComponent = this; + while ( null != curComponent ) { + if( ComponentAssembly.class.isAssignableFrom( curComponent.getClass())) + return (ComponentAssembly) curComponent; + curComponent = curComponent.parent; + } + throw new IllegalStateException("getAssembly() called on hierarchy without a ComponentAssembly."); + } + + /** * Return the stage number of the stage this component belongs to. The stages * are numbered from zero upwards. * * @return the stage number this component belongs to. */ - public final int getStageNumber() { + public int getStageNumber() { checkState(); - if (parent == null) { - throw new IllegalArgumentException("getStageNumber() called for root component"); - } - RocketComponent stage = this; - while (!(stage instanceof Stage)) { - stage = stage.parent; - if (stage == null || stage.parent == null) { - throw new IllegalStateException("getStageNumber() could not find parent " + - "stage."); - } - } - return stage.parent.getChildPosition(stage); + // obviously, this depends on AxialStage overriding <code> .getStageNumber() </code>. + // It does as of this writing, but check it just to be sure.... + return this.getStage().getStageNumber(); } - /** * Find a component with the given ID. The component tree is searched from this component * down (including this component) for the ID and the corresponding component is returned, @@ -1598,7 +1773,7 @@ protected void fireComponentChangeEvent(ComponentChangeEvent e) { * @param type Type of event * @see #fireComponentChangeEvent(ComponentChangeEvent) */ - protected void fireComponentChangeEvent(int type) { + public void fireComponentChangeEvent(int type) { fireComponentChangeEvent(new ComponentChangeEvent(this, type)); } @@ -1708,6 +1883,14 @@ public int hashCode() { return id.hashCode(); } + /** + * the default implementation is mostly a placeholder here, however in inheriting classes, + * this function is useful to indicate adjacent placements and view sizes + */ + protected void updateBounds() { + return; + } + ///////////// Visitor pattern implementation public <R> R accept(RocketComponentVisitor<R> visitor) { visitor.visit(this); @@ -1718,9 +1901,16 @@ public <R> R accept(RocketComponentVisitor<R> visitor) { + /** + * Helper method to add two points on opposite corners of a box around the rocket centerline. This box will be (x_max - x_min) long, and 2*r wide/high. + */ + protected static final void addBoundingBox(Collection<Coordinate> bounds, double x_min, double x_max, double r) { + bounds.add(new Coordinate(x_min, -r, -r)); + bounds.add(new Coordinate(x_max, r, r)); + } /** - * Helper method to add rotationally symmetric bounds at the specified coordinates. + * Helper method to add four bounds rotated around the given x coordinate at radius 'r', and 90deg between each. * The X-axis value is <code>x</code> and the radius at the specified position is * <code>r</code>. */ @@ -1760,8 +1950,6 @@ protected static final double ringRotationalUnitInertia(double outerRadius, return (MathUtil.pow2(innerRadius) + MathUtil.pow2(outerRadius)) / 2; } - - //////////// OTHER @@ -1815,7 +2003,7 @@ protected List<RocketComponent> copyFrom(RocketComponent src) { // Set all parameters this.length = src.length; - this.relativePosition = src.relativePosition; + this.axialMethod = src.axialMethod; this.position = src.position; this.color = src.color; this.lineStyle = src.lineStyle; @@ -1850,7 +2038,7 @@ protected void invalidate() { */ private static class RocketComponentIterator implements Iterator<RocketComponent> { // Stack holds iterators which still have some components left. - private final SimpleStack<Iterator<RocketComponent>> iteratorStack = new SimpleStack<Iterator<RocketComponent>>(); + private final Deque<Iterator<RocketComponent>> iteratorStack = new ArrayDeque<Iterator<RocketComponent>>(); private final Rocket root; private final int treeModID; @@ -1931,5 +2119,115 @@ public void remove() { "RocketComponent iterator"); } } + + /// debug functions + public String toDebugName(){ + return this.getName()+"<"+this.getClass().getSimpleName()+">("+this.getID().substring(0,8)+")"; + } + + // multi-line output + protected StringBuilder toDebugDetail() { + StringBuilder buf = new StringBuilder(); + + // infer the calling method name + StackTraceElement[] stackTrace = (new Exception()).getStackTrace(); + String callingMethod = stackTrace[1].getMethodName(); + for( StackTraceElement el : stackTrace ){ + if( ! "toDebugDetail".equals(el.getMethodName())){ + callingMethod = el.getMethodName(); + break; + } + } + + buf.append(String.format(" >> Dumping Detailed Information from: %s\n", callingMethod)); + buf.append(String.format(" At Component: %s, of class: %s \n", this.getName(), this.getClass().getSimpleName())); + buf.append(String.format(" position: %.6f at offset: %.4f via: %s\n", this.position.x, this.axialOffset, this.axialMethod.name())); + buf.append(String.format(" length: %.4f\n", this.length )); + return buf; + } + + // Primarily for debug use + public String toDebugTree() { + StringBuilder buffer = new StringBuilder(); + buffer.append("\n ====== ====== ====== ====== ====== ====== ====== ====== ====== ====== ====== ======\n"); + buffer.append(" [Name] [Length] [Rel Pos] [Abs Pos] \n"); + this.toDebugTreeHelper(buffer, ""); + buffer.append("\n ====== ====== ====== ====== ====== ====== ====== ====== ====== ====== ====== ======\n"); + return buffer.toString(); + } + + + public void toDebugTreeHelper(StringBuilder buffer, final String indent) { + this.toDebugTreeNode(buffer, indent); + + Iterator<RocketComponent> iterator = this.children.iterator(); + while (iterator.hasNext()) { + iterator.next().toDebugTreeHelper(buffer, indent + "...."); + } + } + + + public void toDebugTreeNode(final StringBuilder buffer, final String indent) { + String prefix = String.format("%s%s (x%d)", indent, this.getName(), this.getInstanceCount() ); + + // 1) instanced vs non-instanced + if( 1 == getInstanceCount() ){ + // un-instanced RocketComponents (usual case) + buffer.append(String.format("%-40s| %5.3f; %24s; %24s; ", prefix, this.getLength(), this.axialOffset, this.getComponentLocations()[0])); + buffer.append(String.format("(offset: %4.1f via: %s )\n", this.getAxialOffset(), this.axialMethod.name())); + }else if( this instanceof Instanceable ){ + // instanced components -- think motor clusters or booster stage clusters + final String patternName = ((Instanceable)this).getPatternName(); + buffer.append(String.format("%-40s (cluster: %s )", prefix, patternName)); + buffer.append(String.format("(offset: %4.1f via: %s )\n", this.getAxialOffset(), this.axialMethod.name())); + + for (int instanceNumber = 0; instanceNumber < this.getInstanceCount(); instanceNumber++) { + final String instancePrefix = String.format("%s [%2d/%2d]", indent, instanceNumber+1, getInstanceCount()); + buffer.append(String.format("%-40s| %5.3f; %24s; %24s;\n", instancePrefix, getLength(), this.axialOffset, getLocations()[0])); + } + }else{ + throw new IllegalStateException("This is a developer error! If you implement an instanced class, please subclass the Instanceable interface."); + } + + // 2) if this is an ACTING motor mount: + if(( this instanceof MotorMount ) &&( ((MotorMount)this).isMotorMount())){ + // because InnerTube and BodyTube don't really share a common ancestor besides RocketComponent + // ... and it's easier to have all this code in one place... + toDebugMountNode( buffer, indent); + } + } + + public void toDebugMountNode(final StringBuilder buffer, final String indent) { + MotorMount mnt = (MotorMount)this; + +// Coordinate[] relCoords = this.getInstanceOffsets(); + Coordinate[] absCoords = this.getComponentLocations(); + FlightConfigurationId curId = this.getRocket().getSelectedConfiguration().getFlightConfigurationID(); +// final int instanceCount = this.getInstanceCount(); + MotorConfiguration curInstance = mnt.getMotorConfig( curId); + if( curInstance.isEmpty() ){ + // print just the tube locations + buffer.append(indent+" [X] This Instance doesn't have any motors for the active configuration.\n"); + }else{ + // curInstance has a motor ... + Motor curMotor = curInstance.getMotor(); + final double motorOffset = this.getLength() - curMotor.getLength(); + final String instancePrefix = String.format("%s [ */%2d]", indent, getInstanceCount()); + + buffer.append(String.format("%-40sThrust: %f N; \n", + indent+" Mounted: "+curMotor.getDesignation(), curMotor.getMaxThrustEstimate() )); + + Coordinate motorRelativePosition = new Coordinate(motorOffset, 0, 0); + Coordinate tubeAbs = absCoords[0]; + Coordinate motorAbsolutePosition = new Coordinate(tubeAbs.x+motorOffset,tubeAbs.y,tubeAbs.z); + buffer.append(String.format("%-40s| %5.3f; %24s; %24s;\n", instancePrefix, curMotor.getLength(), motorRelativePosition, motorAbsolutePosition)); + + } + } + + public boolean isMotorMount() { + return false; + } + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketUtils.java b/core/src/net/sf/openrocket/rocketcomponent/RocketUtils.java index 71360b9a22..f875c2b761 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketUtils.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketUtils.java @@ -2,16 +2,13 @@ import java.util.Collection; -import net.sf.openrocket.masscalc.BasicMassCalculator; -import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; import net.sf.openrocket.util.Coordinate; public abstract class RocketUtils { - + public static double getLength(Rocket rocket) { double length = 0; - Collection<Coordinate> bounds = rocket.getDefaultConfiguration().getBounds(); + Collection<Coordinate> bounds = rocket.getSelectedConfiguration().getBounds(); if (!bounds.isEmpty()) { double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY; for (Coordinate c : bounds) { @@ -24,11 +21,6 @@ public static double getLength(Rocket rocket) { } return length; } - - public static Coordinate getCG(Rocket rocket, MassCalcType calcType) { - MassCalculator massCalculator = new BasicMassCalculator(); - Coordinate cg = massCalculator.getCG(rocket.getDefaultConfiguration(), calcType); - return cg; - } + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java b/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java index f6f342c605..aafff54226 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java @@ -49,7 +49,6 @@ public void setOuterRadius(double r) { public double getInnerRadius() { // Implement parent inner radius automation if (isInnerRadiusAutomatic() && getParent() instanceof RadialParent) { - RocketComponent parent = getParent(); double pos1 = this.toRelative(Coordinate.NUL, parent)[0].x; double pos2 = this.toRelative(new Coordinate(getLength()), parent)[0].x; pos1 = MathUtil.clamp(pos1, 0, parent.getLength()); diff --git a/core/src/net/sf/openrocket/rocketcomponent/Stage.java b/core/src/net/sf/openrocket/rocketcomponent/Stage.java deleted file mode 100644 index a3885117bf..0000000000 --- a/core/src/net/sf/openrocket/rocketcomponent/Stage.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.startup.Application; - -public class Stage extends ComponentAssembly implements FlightConfigurableComponent { - - static final Translator trans = Application.getTranslator(); - - private FlightConfigurationImpl<StageSeparationConfiguration> separationConfigurations; - - - public Stage() { - this.separationConfigurations = new FlightConfigurationImpl<StageSeparationConfiguration>(this, ComponentChangeEvent.EVENT_CHANGE, new StageSeparationConfiguration()); - } - - @Override - public String getComponentName() { - //// Stage - return trans.get("Stage.Stage"); - } - - - public FlightConfiguration<StageSeparationConfiguration> getStageSeparationConfiguration() { - return separationConfigurations; - } - - - - - @Override - public boolean allowsChildren() { - return true; - } - - /** - * Check whether the given type can be added to this component. A Stage allows - * only BodyComponents to be added. - * - * @param type The RocketComponent class type to add. - * - * @return Whether such a component can be added. - */ - @Override - public boolean isCompatible(Class<? extends RocketComponent> type) { - return BodyComponent.class.isAssignableFrom(type); - } - - - - @Override - public void cloneFlightConfiguration(String oldConfigId, String newConfigId) { - separationConfigurations.cloneFlightConfiguration(oldConfigId, newConfigId); - } - - @Override - protected RocketComponent copyWithOriginalID() { - Stage copy = (Stage) super.copyWithOriginalID(); - copy.separationConfigurations = new FlightConfigurationImpl<StageSeparationConfiguration>(separationConfigurations, - copy, ComponentChangeEvent.EVENT_CHANGE); - return copy; - } - -} diff --git a/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java index a7a2a13d9e..7ccf99901e 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java @@ -1,14 +1,9 @@ package net.sf.openrocket.rocketcomponent; -import java.util.EventObject; -import java.util.List; - import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.MathUtil; -import net.sf.openrocket.util.StateChangeListener; public class StageSeparationConfiguration implements FlightConfigurableParameter<StageSeparationConfiguration> { @@ -16,7 +11,7 @@ public static enum SeparationEvent { //// Upper stage motor ignition UPPER_IGNITION(trans.get("Stage.SeparationEvent.UPPER_IGNITION")) { @Override - public boolean isSeparationEvent(FlightEvent e, Stage stage) { + public boolean isSeparationEvent(FlightEvent e, AxialStage stage) { if (e.getType() != FlightEvent.Type.IGNITION) return false; @@ -28,7 +23,7 @@ public boolean isSeparationEvent(FlightEvent e, Stage stage) { //// Current stage motor ignition IGNITION(trans.get("Stage.SeparationEvent.IGNITION")) { @Override - public boolean isSeparationEvent(FlightEvent e, Stage stage) { + public boolean isSeparationEvent(FlightEvent e, AxialStage stage) { if (e.getType() != FlightEvent.Type.IGNITION) return false; @@ -40,7 +35,7 @@ public boolean isSeparationEvent(FlightEvent e, Stage stage) { //// Current stage motor burnout BURNOUT(trans.get("Stage.SeparationEvent.BURNOUT")) { @Override - public boolean isSeparationEvent(FlightEvent e, Stage stage) { + public boolean isSeparationEvent(FlightEvent e, AxialStage stage) { if (e.getType() != FlightEvent.Type.BURNOUT) return false; @@ -52,7 +47,7 @@ public boolean isSeparationEvent(FlightEvent e, Stage stage) { //// Current stage ejection charge EJECTION(trans.get("Stage.SeparationEvent.EJECTION")) { @Override - public boolean isSeparationEvent(FlightEvent e, Stage stage) { + public boolean isSeparationEvent(FlightEvent e, AxialStage stage) { if (e.getType() != FlightEvent.Type.EJECTION_CHARGE) return false; @@ -64,14 +59,14 @@ public boolean isSeparationEvent(FlightEvent e, Stage stage) { //// Launch LAUNCH(trans.get("Stage.SeparationEvent.LAUNCH")) { @Override - public boolean isSeparationEvent(FlightEvent e, Stage stage) { + public boolean isSeparationEvent(FlightEvent e, AxialStage stage) { return e.getType() == FlightEvent.Type.LAUNCH; } }, //// Never NEVER(trans.get("Stage.SeparationEvent.NEVER")) { @Override - public boolean isSeparationEvent(FlightEvent e, Stage stage) { + public boolean isSeparationEvent(FlightEvent e, AxialStage stage) { return false; } }, @@ -87,7 +82,7 @@ public boolean isSeparationEvent(FlightEvent e, Stage stage) { /** * Test whether a specific event is a stage separation event. */ - public abstract boolean isSeparationEvent(FlightEvent e, Stage stage); + public abstract boolean isSeparationEvent(FlightEvent e, AxialStage stage); @Override public String toString() { @@ -98,12 +93,10 @@ public String toString() { private static final Translator trans = Application.getTranslator(); - private final List<StateChangeListener> listeners = new ArrayList<StateChangeListener>(); - private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION; + private SeparationEvent separationEvent = SeparationEvent.NEVER; private double separationDelay = 0; - - + public SeparationEvent getSeparationEvent() { return separationEvent; } @@ -142,28 +135,24 @@ public String toString() { @Override public StageSeparationConfiguration clone() { + return copy(null); + } + + public StageSeparationConfiguration copy( final FlightConfigurationId copyId){ StageSeparationConfiguration clone = new StageSeparationConfiguration(); clone.separationEvent = this.separationEvent; clone.separationDelay = this.separationDelay; return clone; } - @Override - public void addChangeListener(StateChangeListener listener) { - listeners.add(listener); - } - @Override - public void removeChangeListener(StateChangeListener listener) { - listeners.remove(listener); + private void fireChangeEvent() { + } - private void fireChangeEvent() { - EventObject event = new EventObject(this); - Object[] list = listeners.toArray(); - for (Object l : list) { - ((StateChangeListener) l).stateChanged(event); - } + + @Override + public void update(){ } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java index 7b455fa859..a530bfe94a 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java @@ -7,6 +7,7 @@ import java.util.List; import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; @@ -116,6 +117,10 @@ public boolean isFilled() { return filled; } + @Override + public boolean isAfter(){ + return true; + } /** * Sets whether the component is set as filled. If the component is filled, then @@ -268,7 +273,7 @@ public double getLongitudinalUnitInertia() { @Override public double getRotationalUnitInertia() { if (rotationalInertia < 0) { - if (getComponentVolume() > 0.0000001) + if (getComponentVolume() > 0.0000001) // == 0.1cm^3 integrateInertiaVolume(); else integrateInertiaSurface(); @@ -276,8 +281,6 @@ public double getRotationalUnitInertia() { return rotationalInertia; } - - /** * Performs integration over the length of the component and updates the cached variables. */ @@ -422,19 +425,18 @@ private void integrateInertiaVolume() { final double inner; final double dV; - if (filled || r1 < thickness || r2 < thickness) { + final double hyp = MathUtil.hypot(r2 - r1, l); + final double height = thickness * hyp / l; + if (filled || r1 < height || r2 < height ) { inner = 0; dV = pil3 * (r1 * r1 + r1 * r2 + r2 * r2); } else { - final double hyp = MathUtil.hypot(r2 - r1, l); - final double height = thickness * hyp / l; dV = pil * height * (r1 + r2 - height); - inner = Math.max(outer - height, 0); + inner = Math.max(outer - height, 0.); } rotationalInertia += dV * (pow2(outer) + pow2(inner)) / 2; - longitudinalInertia += dV * ((3 * (pow2(outer) + pow2(inner)) + pow2(l)) / 12 - + pow2(x + l / 2)); + longitudinalInertia += dV * ((3 * (pow2(outer) + pow2(inner)) + pow2(l)) / 12 + pow2(x + l / 2)); vol += dV; @@ -520,7 +522,7 @@ private void integrateInertiaSurface() { @Override protected void componentChanged(ComponentChangeEvent e) { super.componentChanged(e); - if (!e.isOtherChange()) { + if( e.isAerodynamicChange() || e.isMassChange()){ wetArea = -1; planArea = -1; planCenter = -1; @@ -570,8 +572,8 @@ protected final SymmetricComponent getPreviousSymmetricComponent() { if (c instanceof SymmetricComponent) { return (SymmetricComponent) c; } - if (!(c instanceof Stage) && - (c.relativePosition == RocketComponent.Position.AFTER)) + if (!(c instanceof AxialStage) && + (c.axialMethod == AxialMethod.AFTER)) return null; // Bad component type as "parent" } return null; @@ -590,8 +592,8 @@ protected final SymmetricComponent getNextSymmetricComponent() { if (c instanceof SymmetricComponent) { return (SymmetricComponent) c; } - if (!(c instanceof Stage) && - (c.relativePosition == RocketComponent.Position.AFTER)) + if (!(c instanceof AxialStage) && + (c.axialMethod == AxialMethod.AFTER)) return null; // Bad component type as "parent" } return null; diff --git a/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java index c2d0a9bd46..84dd937671 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java @@ -38,7 +38,6 @@ protected void loadFromPreset(ComponentPreset preset) { @Override public double getOuterRadius() { if (isOuterRadiusAutomatic() && getParent() instanceof RadialParent) { - RocketComponent parent = getParent(); double pos1 = this.toRelative(Coordinate.NUL, parent)[0].x; double pos2 = this.toRelative(new Coordinate(getLength()), parent)[0].x; pos1 = MathUtil.clamp(pos1, 0, parent.getLength()); diff --git a/core/src/net/sf/openrocket/rocketcomponent/Transition.java b/core/src/net/sf/openrocket/rocketcomponent/Transition.java index 6b12f156ec..d89f6de699 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Transition.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Transition.java @@ -1,5 +1,11 @@ package net.sf.openrocket.rocketcomponent; +import static java.lang.Math.sin; +import static net.sf.openrocket.util.MathUtil.pow2; +import static net.sf.openrocket.util.MathUtil.pow3; + +import java.util.Collection; + import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset.Type; @@ -7,12 +13,6 @@ import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; -import java.util.Collection; - -import static java.lang.Math.sin; -import static net.sf.openrocket.util.MathUtil.pow2; -import static net.sf.openrocket.util.MathUtil.pow3; - public class Transition extends SymmetricComponent { private static final Translator trans = Application.getTranslator(); @@ -23,8 +23,8 @@ public class Transition extends SymmetricComponent { private double shapeParameter; private boolean clipped; // Not to be read - use isClipped(), which may be overriden - private double radius1, radius2; - private boolean autoRadius1, autoRadius2; // Whether the start radius is automatic + private double foreRadius, aftRadius; + private boolean autoForeRadius, autoAftRadius2; // Whether the start radius is automatic private double foreShoulderRadius; @@ -43,11 +43,11 @@ public class Transition extends SymmetricComponent { public Transition() { super(); - this.radius1 = DEFAULT_RADIUS; - this.radius2 = DEFAULT_RADIUS; + this.foreRadius = DEFAULT_RADIUS; + this.aftRadius = DEFAULT_RADIUS; this.length = DEFAULT_RADIUS * 3; - this.autoRadius1 = true; - this.autoRadius2 = true; + this.autoForeRadius = true; + this.autoAftRadius2 = true; this.type = Shape.CONICAL; this.shapeParameter = 0; @@ -82,18 +82,18 @@ public double getForeRadius() { r = DEFAULT_RADIUS; return r; } - return radius1; + return foreRadius; } public void setForeRadius(double radius) { - if ((this.radius1 == radius) && (autoRadius1 == false)) + if ((this.foreRadius == radius) && (autoForeRadius == false)) return; - this.autoRadius1 = false; - this.radius1 = Math.max(radius, 0); + this.autoForeRadius = false; + this.foreRadius = Math.max(radius, 0); - if (this.thickness > this.radius1 && this.thickness > this.radius2) - this.thickness = Math.max(this.radius1, this.radius2); + if (this.thickness > this.foreRadius && this.thickness > this.aftRadius) + this.thickness = Math.max(this.foreRadius, this.aftRadius); clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); @@ -101,14 +101,14 @@ public void setForeRadius(double radius) { @Override public boolean isForeRadiusAutomatic() { - return autoRadius1; + return autoForeRadius; } public void setForeRadiusAutomatic(boolean auto) { - if (autoRadius1 == auto) + if (autoForeRadius == auto) return; - autoRadius1 = auto; + autoForeRadius = auto; clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); @@ -130,20 +130,20 @@ public double getAftRadius() { r = DEFAULT_RADIUS; return r; } - return radius2; + return aftRadius; } public void setAftRadius(double radius) { - if ((this.radius2 == radius) && (autoRadius2 == false)) + if ((this.aftRadius == radius) && (autoAftRadius2 == false)) return; - this.autoRadius2 = false; - this.radius2 = Math.max(radius, 0); + this.autoAftRadius2 = false; + this.aftRadius = Math.max(radius, 0); - if (this.thickness > this.radius1 && this.thickness > this.radius2) - this.thickness = Math.max(this.radius1, this.radius2); + if (this.thickness > this.foreRadius && this.thickness > this.aftRadius) + this.thickness = Math.max(this.foreRadius, this.aftRadius); clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); @@ -151,14 +151,14 @@ public void setAftRadius(double radius) { @Override public boolean isAftRadiusAutomatic() { - return autoRadius2; + return autoAftRadius2; } public void setAftRadiusAutomatic(boolean auto) { - if (autoRadius2 == auto) + if (autoAftRadius2 == auto) return; - autoRadius2 = auto; + autoAftRadius2 = auto; clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); @@ -348,8 +348,10 @@ public void setAftShoulderCapped(boolean capped) { */ @Override public double getRadius(double x) { - if (x < 0 || x > length) - return 0; + if ( x < 0 ) + return getForeRadius(); + if ( x > length) + return getAftRadius(); double r1 = getForeRadius(); double r2 = getAftRadius(); @@ -526,13 +528,16 @@ protected void componentChanged(ComponentChangeEvent e) { * Check whether the given type can be added to this component. Transitions allow any * InternalComponents to be added. * - * @param ctype The RocketComponent class type to add. + * @param comptype The RocketComponent class type to add. * @return Whether such a component can be added. */ @Override - public boolean isCompatible(Class<? extends RocketComponent> ctype) { - if (InternalComponent.class.isAssignableFrom(ctype)) + public boolean isCompatible(Class<? extends RocketComponent> comptype) { + if (InternalComponent.class.isAssignableFrom(comptype)){ return true; + }else if ( FreeformFinSet.class.isAssignableFrom(comptype)){ + return true; + } return false; } @@ -932,4 +937,5 @@ public static Shape toShape(String localizedName) { return null; } } + } diff --git a/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java index d8e7f5d573..b8a92a993f 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java @@ -1,13 +1,13 @@ package net.sf.openrocket.rocketcomponent; +import java.util.ArrayList; +import java.util.List; + import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; -import java.util.ArrayList; -import java.util.List; - /** * A set of trapezoidal fins. The root and tip chords are perpendicular to the rocket * base line, while the leading and aft edges may be slanted. @@ -39,7 +39,7 @@ public class TrapezoidFinSet extends FinSet { public TrapezoidFinSet() { - this(3, 0.05, 0.05, 0.025, 0.03); + this(1, 0.05, 0.05, 0.025, 0.03); } // TODO: HIGH: height=0 -> CP = NaN @@ -65,6 +65,7 @@ public void setFinShape(double rootChord, double tipChord, double sweep, double this.sweep = sweep; this.height = height; this.thickness = thickness; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -76,6 +77,7 @@ public void setRootChord(double r) { if (length == r) return; length = Math.max(r, 0); + validateFinTab(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java index 9af60bff21..aa9ad73abf 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java @@ -7,12 +7,14 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset.Type; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.AxialPositionable; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; -public class TubeFinSet extends ExternalComponent { +public class TubeFinSet extends ExternalComponent implements AxialPositionable { private static final Translator trans = Application.getTranslator(); private final static double DEFAULT_RADIUS = 0.025; @@ -45,7 +47,7 @@ public class TubeFinSet extends ExternalComponent { * i.e. fins are positioned at the bottom of the parent component. */ public TubeFinSet() { - super(RocketComponent.Position.BOTTOM); + super(AxialMethod.BOTTOM); length = 0.10; } @@ -166,6 +168,12 @@ public int getFinCount() { return fins; } + + @Override + public boolean isAfter(){ + return false; + } + /** * Sets the number of fins in the set. * @param n The number of fins, greater of equal to one. @@ -216,15 +224,8 @@ public Transformation getFinRotationTransformation() { } @Override - public void setRelativePosition(RocketComponent.Position position) { - super.setRelativePosition(position); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - } - - - @Override - public void setPositionValue(double value) { - super.setPositionValue(value); + public void setAxialMethod(AxialMethod position) { + super.setAxialMethod(position); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -268,14 +269,9 @@ public double getLongitudinalUnitInertia() { } // translate each to the center of mass. - final double hypot = getOuterRadius() + getBodyRadius(); - final double finrotation = 2 * Math.PI / fins; - double angularoffset = 0.0; double totalInertia = 0.0; for (int i = 0; i < fins; i++) { - double offset = hypot * Math.cos(angularoffset); - totalInertia += inertia + MathUtil.pow2(offset); - angularoffset += finrotation; + totalInertia += inertia + MathUtil.pow2( this.axialOffset); } return totalInertia; } @@ -333,7 +329,7 @@ public double getBodyRadius() { s = this.getParent(); while (s != null) { if (s instanceof SymmetricComponent) { - double x = this.toRelative(new Coordinate(0, 0, 0), s)[0].x; + double x = this.getPosition().x; return ((SymmetricComponent) s).getRadius(x); } s = s.getParent(); diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/AngleMethod.java b/core/src/net/sf/openrocket/rocketcomponent/position/AngleMethod.java new file mode 100644 index 0000000000..59395da17a --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/AngleMethod.java @@ -0,0 +1,68 @@ +package net.sf.openrocket.rocketcomponent.position; + +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.MathUtil; + +public enum AngleMethod implements DistanceMethod { + + // Defines placement on the outside of the target component. + RELATIVE (Application.getTranslator().get("RocketComponent.Position.Method.Angle.RELATIVE") ){ + @Override + public boolean clampToZero() { return true; } + + @Override + public double getAngle( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedAngleOffset_radians ){ + return parentComponent.getAngleOffset() + requestedAngleOffset_radians; + } + }, + + + // this component is always zero degrees, relative to its parent. + FIXED (Application.getTranslator().get("RocketComponent.Position.Method.Angle.FIXED") ){ + @Override + public double getAngle( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedAngleOffset_radians ){ + return 0.; + } + }, + + // Mirror Instances + // - Intended for 2x-instance components... + // - Undefined behavior for components with 3 or more instances + MIRROR_XY (Application.getTranslator().get("RocketComponent.Position.Method.Angle.MIRROR_XY") ){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getAngle( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedOffset ){ + double combinedAngle = MathUtil.reduce2PI( parentComponent.getAngleOffset() + requestedOffset ); + + if( Math.PI > combinedAngle ) { + combinedAngle = - ( combinedAngle - Math.PI); + } + + return combinedAngle; + } + }; + + public static final AngleMethod[] choices(){ + return new AngleMethod[]{ AngleMethod.RELATIVE }; + } + + public final String description; + + private AngleMethod( final String descr ) { + this.description= descr; + } + + @Override + public String toString() { + return description; + } + + @Override + public boolean clampToZero() { return true; } + + public abstract double getAngle( final RocketComponent parentComponent, final RocketComponent thisComponent, final double angleOffset_radians ) ; + +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/AnglePositionable.java b/core/src/net/sf/openrocket/rocketcomponent/position/AnglePositionable.java new file mode 100644 index 0000000000..577b3bdf21 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/AnglePositionable.java @@ -0,0 +1,11 @@ +package net.sf.openrocket.rocketcomponent.position; + +public interface AnglePositionable { + + public double getAngleOffset(); + + public void setAngleOffset(final double angle); + + public AngleMethod getAngleMethod( ); + public void setAngleMethod( final AngleMethod newMethod ); +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/AxialMethod.java b/core/src/net/sf/openrocket/rocketcomponent/position/AxialMethod.java new file mode 100644 index 0000000000..370dcb523b --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/AxialMethod.java @@ -0,0 +1,117 @@ +package net.sf.openrocket.rocketcomponent.position; + +import net.sf.openrocket.startup.Application; + +public enum AxialMethod implements DistanceMethod { + // subject component is simply located absolutely, from the origin (tip-of-rocket) + ABSOLUTE (Application.getTranslator().get("RocketComponent.Position.Method.Axial.ABSOLUTE")){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getAsPosition(double offset, double innerLength, double outerLength){ + return offset; + } + + @Override + public double getAsOffset(double position, double innerLength, double outerLength){ + return position; + } + }, + + // subject component will trail the target component, in the increasing coordinate direction + AFTER (Application.getTranslator().get("RocketComponent.Position.Method.Axial.AFTER")){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getAsPosition(double offset, double innerLength, double outerLength){ + return outerLength + offset; + } + + @Override + public double getAsOffset(double position, double innerLength, double outerLength){ + return position - outerLength; + //return outerLength - position; + } + }, + + // measure from the top of the target component to the top of the subject component + TOP (Application.getTranslator().get("RocketComponent.Position.Method.Axial.TOP")){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getAsPosition(double offset, double innerLength, double outerLength){ + return offset; + } + + @Override + public double getAsOffset(double position, double innerLength, double outerLength){ + return position; + } + }, + + // This coordinate is measured from the middle of the parent component to the middle of this component + MIDDLE (Application.getTranslator().get("RocketComponent.Position.Method.Axial.MIDDLE")) { + @Override + public boolean clampToZero() { + return false; + } + + @Override + public double getAsPosition(double offset, double innerLength, double outerLength){ + return offset + (outerLength - innerLength) / 2; + // return (outerLength - innerLength) / 2 - offset; + } + + @Override + public double getAsOffset(double position, double innerLength, double outerLength){ + return position + (innerLength - outerLength) / 2; + } + }, + + // This coordinate is measured from the bottom of the parent component to the bottom of this component + BOTTOM (Application.getTranslator().get("RocketComponent.Position.Method.Axial.BOTTOM")){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getAsPosition(double offset, double innerLength, double outerLength){ + return offset + (outerLength - innerLength); + //return outerLength - innerLength - offset; + } + + @Override + public double getAsOffset(double position, double innerLength, double outerLength){ + return position + (innerLength - outerLength); + } + + + }; + + + + // just as a reminder: + // public T[] getEnumConstants() + + public static final AxialMethod[] axialOffsetMethods = { TOP, MIDDLE, BOTTOM }; + + public final String description; + + AxialMethod( final String newDescription ) { + this.description=newDescription; + } + + public abstract boolean clampToZero(); + + public abstract double getAsOffset(double position, double innerLength, double outerLength); + + public abstract double getAsPosition(double offset, double innerLength, double outerLength); + + @Override + public String toString() { + return description; + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/AxialPositionable.java b/core/src/net/sf/openrocket/rocketcomponent/position/AxialPositionable.java new file mode 100644 index 0000000000..dde970096f --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/AxialPositionable.java @@ -0,0 +1,13 @@ +package net.sf.openrocket.rocketcomponent.position; + + +public interface AxialPositionable { + + public double getAxialOffset(); + + public void setAxialOffset(final double newAxialOffset); + + public AxialMethod getAxialMethod( ); + + public void setAxialMethod( AxialMethod newMethod ); +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/Distance.java b/core/src/net/sf/openrocket/rocketcomponent/position/Distance.java new file mode 100644 index 0000000000..679e8c8773 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/Distance.java @@ -0,0 +1,14 @@ +package net.sf.openrocket.rocketcomponent.position; + +public class Distance { + + public DistanceMethod method; + public double distance; + + // just for convenience + public Distance( final DistanceMethod initialMethod, final double initialMagnitude ) { + this.method = initialMethod; + this.distance = initialMagnitude; + } + +} diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/DistanceMethod.java b/core/src/net/sf/openrocket/rocketcomponent/position/DistanceMethod.java new file mode 100644 index 0000000000..b56019a31c --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/DistanceMethod.java @@ -0,0 +1,6 @@ +package net.sf.openrocket.rocketcomponent.position; + + +public interface DistanceMethod { + public boolean clampToZero(); +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/RadiusMethod.java b/core/src/net/sf/openrocket/rocketcomponent/position/RadiusMethod.java new file mode 100644 index 0000000000..b671953c62 --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/RadiusMethod.java @@ -0,0 +1,86 @@ +package net.sf.openrocket.rocketcomponent.position; + + +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.startup.Application; + +public enum RadiusMethod implements DistanceMethod { + + // just as a reminder: + // public T[] getEnumConstants() + + // both components are on the same axis + COAXIAL ( Application.getTranslator().get("RocketComponent.Position.Method.Radius.COAXIAL") ){ + @Override + public double getRadius( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedOffset ){ + return 0.; + } + }, + + FREE(Application.getTranslator().get("RocketComponent.Position.Method.Radius.FREE") ){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getRadius( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedOffset ){ + return requestedOffset; + } + }, + + RELATIVE ( Application.getTranslator().get("RocketComponent.Position.Method.Radius.RELATIVE") ){ + @Override + public boolean clampToZero() { return false; } + + @Override + public double getRadius( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedOffset ){ + double radius = requestedOffset; + if( parentComponent instanceof BodyTube ) { + radius += ((BodyTube)parentComponent).getOuterRadius(); + } + if( thisComponent instanceof RadiusPositionable ) { + radius += ((RadiusPositionable)thisComponent).getBoundingRadius(); + } + return radius; + } + }, + + // Defines placement relative to the outside of the target component + // (a) launchlug => parent-body-tube: SURFACE @ 0 + // (b) pod => parent-assembly; SURFACE @ distance + SURFACE ( Application.getTranslator().get("RocketComponent.Position.Method.Radius.SURFACE") ) { + @Override + public double getRadius( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedOffset ){ + double radius = 0.; + if( parentComponent instanceof BodyTube ) { + radius += ((BodyTube)parentComponent).getOuterRadius(); + } + if( thisComponent instanceof RadiusPositionable ) { + radius += ((RadiusPositionable)thisComponent).getBoundingRadius(); + } + return radius; + } + }; + + public static final RadiusMethod[] choices(){ + return new RadiusMethod[]{ RadiusMethod.FREE, RadiusMethod.RELATIVE }; + } + + public final String description; + + // ============= + + private RadiusMethod( final String descr ) { + this.description = descr; + } + + @Override + public String toString() { + return description; + } + + @Override + public boolean clampToZero() { return true; } + + public abstract double getRadius( final RocketComponent parentComponent, final RocketComponent thisComponent, final double requestedOffset ); +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java b/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java new file mode 100644 index 0000000000..68c749783e --- /dev/null +++ b/core/src/net/sf/openrocket/rocketcomponent/position/RadiusPositionable.java @@ -0,0 +1,22 @@ +package net.sf.openrocket.rocketcomponent.position; + +public interface RadiusPositionable { + + public double getBoundingRadius(); + + public double getRadiusOffset(); + public void setRadiusOffset(final double radius); + + public RadiusMethod getRadiusMethod(); + public void setRadiusMethod( final RadiusMethod method ); + + /** + * Equivalent to: + * `instance.setRadiusMethod(); instance.setRadiusOffset()` + * + * @param radius + * @param method + */ + public void setRadius( final RadiusMethod method, final double radius ); + +} diff --git a/core/src/net/sf/openrocket/rocketvisitors/CopyFlightConfigurationVisitor.java b/core/src/net/sf/openrocket/rocketvisitors/CopyFlightConfigurationVisitor.java deleted file mode 100644 index 239570907c..0000000000 --- a/core/src/net/sf/openrocket/rocketvisitors/CopyFlightConfigurationVisitor.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.sf.openrocket.rocketvisitors; - -import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; -import net.sf.openrocket.rocketcomponent.RocketComponent; - -public class CopyFlightConfigurationVisitor extends DepthFirstRecusiveVisitor<Void> { - - private final String oldConfigId; - private final String newConfigId; - - public CopyFlightConfigurationVisitor(String oldConfigId, String newConfigId) { - super(); - this.oldConfigId = oldConfigId; - this.newConfigId = newConfigId; - } - - @Override - public void doAction(RocketComponent visitable) { - - if (visitable instanceof FlightConfigurableComponent) { - ((FlightConfigurableComponent) visitable).cloneFlightConfiguration(oldConfigId, newConfigId); - } - } - - @Override - public Void getResult() { - return null; - } - -} diff --git a/core/src/net/sf/openrocket/simulation/AbstractSimulationStepper.java b/core/src/net/sf/openrocket/simulation/AbstractSimulationStepper.java index 0aab853ac4..3d753d547a 100644 --- a/core/src/net/sf/openrocket/simulation/AbstractSimulationStepper.java +++ b/core/src/net/sf/openrocket/simulation/AbstractSimulationStepper.java @@ -1,12 +1,10 @@ package net.sf.openrocket.simulation; +import java.util.Collection; + import net.sf.openrocket.masscalc.MassCalculator; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.listeners.SimulationListenerHelper; import net.sf.openrocket.util.BugException; @@ -45,7 +43,7 @@ protected AtmosphericConditions modelAtmosphericConditions(SimulationStatus stat } - + /** * Compute the wind to use, allowing listeners to override. * @@ -75,7 +73,7 @@ protected Coordinate modelWindVelocity(SimulationStatus status) throws Simulatio } - + /** * Compute the gravity to use, allowing listeners to override. * @@ -104,7 +102,7 @@ protected double modelGravity(SimulationStatus status) throws SimulationExceptio } - + /** * Compute the mass data to use, allowing listeners to override. * @@ -112,39 +110,50 @@ protected double modelGravity(SimulationStatus status) throws SimulationExceptio * @return the mass data to use * @throws SimulationException if a listener throws SimulationException */ - protected MassData calculateMassData(SimulationStatus status) throws SimulationException { - MassData mass; - Coordinate cg; - double longitudinalInertia, rotationalInertia, propellantMass; + protected RigidBody calculateStructureMass(SimulationStatus status) throws SimulationException { + RigidBody structureMass; // Call pre-listener - mass = SimulationListenerHelper.firePreMassCalculation(status); - if (mass != null) { - return mass; + structureMass = SimulationListenerHelper.firePreMassCalculation(status); + if (structureMass != null) { + return structureMass; } - MassCalculator calc = status.getSimulationConditions().getMassCalculator(); - cg = calc.getCG(status.getConfiguration(), status.getMotorConfiguration()); - longitudinalInertia = calc.getLongitudinalInertia(status.getConfiguration(), status.getMotorConfiguration()); - rotationalInertia = calc.getRotationalInertia(status.getConfiguration(), status.getMotorConfiguration()); - propellantMass = calc.getPropellantMass(status.getConfiguration(), status.getMotorConfiguration()); - mass = new MassData(cg, longitudinalInertia, rotationalInertia, propellantMass); + structureMass = MassCalculator.calculateStructure( status.getConfiguration() ); + + // Call post-listener + structureMass = SimulationListenerHelper.firePostMassCalculation(status, structureMass); + + checkNaN(structureMass.getCenterOfMass()); + checkNaN(structureMass.getLongitudinalInertia()); + checkNaN(structureMass.getRotationalInertia()); + return structureMass; + } + + protected RigidBody calculateMotorMass(SimulationStatus status) throws SimulationException { + RigidBody motorMass; + + // Call pre-listener + motorMass = SimulationListenerHelper.firePreMassCalculation(status); + if (motorMass != null) { + return motorMass; + } + + motorMass = MassCalculator.calculateMotor( status ); + + // Call post-listener - mass = SimulationListenerHelper.firePostMassCalculation(status, mass); + motorMass = SimulationListenerHelper.firePostMassCalculation(status, motorMass); - checkNaN(mass.getCG()); - checkNaN(mass.getLongitudinalInertia()); - checkNaN(mass.getRotationalInertia()); - checkNaN(mass.getPropellantMass()); + checkNaN(motorMass.getCenterOfMass()); + checkNaN(motorMass.getLongitudinalInertia()); + checkNaN(motorMass.getRotationalInertia()); - return mass; + return motorMass; } - - - /** * Calculate the average thrust produced by the motors in the current configuration, allowing * listeners to override. The average is taken between <code>status.time</code> and @@ -159,7 +168,7 @@ protected MassData calculateMassData(SimulationStatus status) throws SimulationE * @param stepMotors whether to step the motors forward or work on a clone object * @return the average thrust during the time step. */ - protected double calculateThrust(SimulationStatus status, double timestep, + protected double calculateAverageThrust(SimulationStatus status, double timestep, double acceleration, AtmosphericConditions atmosphericConditions, boolean stepMotors) throws SimulationException { double thrust; @@ -170,20 +179,12 @@ protected double calculateThrust(SimulationStatus status, double timestep, return thrust; } - Configuration configuration = status.getConfiguration(); - - // Iterate over the motors and calculate combined thrust - MotorInstanceConfiguration mic = status.getMotorConfiguration(); - if (!stepMotors) { - mic = mic.clone(); - } - mic.step(status.getSimulationTime() + timestep, acceleration, atmosphericConditions); thrust = 0; - for (MotorId id : mic.getMotorIDs()) { - if (configuration.isComponentActive((RocketComponent) mic.getMotorMount(id))) { - MotorInstance motor = mic.getMotorInstance(id); - thrust += motor.getThrust(); - } + final double currentTime = status.getSimulationTime() + timestep; + Collection<MotorClusterState> activeMotorList = status.getMotors(); + for (MotorClusterState currentMotorState : activeMotorList ) { + thrust += currentMotorState.getAverageThrust( status.getSimulationTime(), currentTime ); + //thrust += currentMotorState.getThrust( currentTime ); } // Post-listeners diff --git a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index afadf26c26..f64a164c39 100644 --- a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -1,21 +1,22 @@ package net.sf.openrocket.simulation; -import java.util.Iterator; +import java.util.ArrayDeque; +import java.util.Deque; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfigurationId; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; import net.sf.openrocket.simulation.exception.MotorIgnitionException; import net.sf.openrocket.simulation.exception.SimulationException; @@ -26,10 +27,6 @@ import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Pair; -import net.sf.openrocket.util.SimpleStack; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class BasicEventSimulationEngine implements SimulationEngine { @@ -52,12 +49,12 @@ public class BasicEventSimulationEngine implements SimulationEngine { private SimulationStepper currentStepper; - private SimulationStatus status; + private SimulationStatus currentStatus; - private String flightConfigurationId; - - private SimpleStack<SimulationStatus> stages = new SimpleStack<SimulationStatus>(); + private FlightConfigurationId fcid; + // this is just a list of simulation branches to + Deque<SimulationStatus> toSimulate = new ArrayDeque<SimulationStatus>(); @Override public FlightData simulate(SimulationConditions simulationConditions) throws SimulationException { @@ -66,46 +63,45 @@ public FlightData simulate(SimulationConditions simulationConditions) throws Sim FlightData flightData = new FlightData(); // Set up rocket configuration - Configuration configuration = setupConfiguration(simulationConditions); - flightConfigurationId = configuration.getFlightConfigurationID(); - MotorInstanceConfiguration motorConfiguration = setupMotorConfiguration(configuration); - if (motorConfiguration.getMotorIDs().isEmpty()) { + this.fcid = simulationConditions.getFlightConfigurationID(); + FlightConfiguration simulationConfig = simulationConditions.getRocket().getFlightConfiguration( this.fcid).clone(); + if ( ! simulationConfig.hasMotors() ) { throw new MotorIgnitionException(trans.get("BasicEventSimulationEngine.error.noMotorsDefined")); } - status = new SimulationStatus(configuration, motorConfiguration, simulationConditions); - status.getEventQueue().add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket())); + currentStatus = new SimulationStatus(simulationConfig, simulationConditions); + currentStatus.getEventQueue().add(new FlightEvent(FlightEvent.Type.LAUNCH, 0, simulationConditions.getRocket())); { - // main sustainer stage - RocketComponent sustainer = configuration.getRocket().getChild(0); - status.setFlightData(new FlightDataBranch(sustainer.getName(), FlightDataType.TYPE_TIME)); + // main simulation branch + final String branchName = simulationConfig.getRocket().getTopmostStage().getName(); + currentStatus.setFlightData(new FlightDataBranch( branchName, FlightDataType.TYPE_TIME)); } - stages.add(status); - - SimulationListenerHelper.fireStartSimulation(status); + toSimulate.push(currentStatus); - while (true) { - if (stages.size() == 0) { + SimulationListenerHelper.fireStartSimulation(currentStatus); + do{ + if( null == toSimulate.peek()){ break; } - SimulationStatus stageStatus = stages.pop(); - if (stageStatus == null) { - break; - } - status = stageStatus; + currentStatus = toSimulate.pop(); + log.info(">>Starting simulation of branch: "+currentStatus.getFlightData().getBranchName()); + FlightDataBranch dataBranch = simulateLoop(); flightData.addBranch(dataBranch); - flightData.getWarningSet().addAll(status.getWarnings()); - } - - SimulationListenerHelper.fireEndSimulation(status, null); + flightData.getWarningSet().addAll(currentStatus.getWarnings()); + + log.info(String.format("<<Finished simulating branch: %s curTime:%s finTime:%s", + dataBranch.getBranchName(), + currentStatus.getSimulationTime(), + dataBranch.getLast(FlightDataType.TYPE_TIME))); + }while( ! toSimulate.isEmpty()); - configuration.release(); + SimulationListenerHelper.fireEndSimulation(currentStatus, null); if (!flightData.getWarningSet().isEmpty()) { log.info("Warnings at the end of simulation: " + flightData.getWarningSet()); } - + return flightData; } @@ -113,95 +109,95 @@ private FlightDataBranch simulateLoop() { // Initialize the simulation currentStepper = flightStepper; - status = currentStepper.initialize(status); + currentStatus = currentStepper.initialize(currentStatus); // Get originating position (in case listener has modified launch position) - Coordinate origin = status.getRocketPosition(); - Coordinate originVelocity = status.getRocketVelocity(); + Coordinate origin = currentStatus.getRocketPosition(); + Coordinate originVelocity = currentStatus.getRocketVelocity(); try { + // Start the simulation while (handleEvents()) { - // Take the step - double oldAlt = status.getRocketPosition().z; + double oldAlt = currentStatus.getRocketPosition().z; - if (SimulationListenerHelper.firePreStep(status)) { + if (SimulationListenerHelper.firePreStep(currentStatus)) { // Step at most to the next event double maxStepTime = Double.MAX_VALUE; - FlightEvent nextEvent = status.getEventQueue().peek(); + FlightEvent nextEvent = currentStatus.getEventQueue().peek(); if (nextEvent != null) { - maxStepTime = MathUtil.max(nextEvent.getTime() - status.getSimulationTime(), 0.001); + maxStepTime = MathUtil.max(nextEvent.getTime() - currentStatus.getSimulationTime(), 0.001); } - log.trace("BasicEventSimulationEngine: Taking simulation step at t=" + status.getSimulationTime()); - currentStepper.step(status, maxStepTime); + log.trace("Taking simulation step at t=" + currentStatus.getSimulationTime() + " altitude " + oldAlt); + currentStepper.step(currentStatus, maxStepTime); } - SimulationListenerHelper.firePostStep(status); + SimulationListenerHelper.firePostStep(currentStatus); // Check for NaN values in the simulation status checkNaN(); // Add altitude event - addEvent(new FlightEvent(FlightEvent.Type.ALTITUDE, status.getSimulationTime(), - status.getConfiguration().getRocket(), - new Pair<Double, Double>(oldAlt, status.getRocketPosition().z))); + addEvent(new FlightEvent(FlightEvent.Type.ALTITUDE, currentStatus.getSimulationTime(), + currentStatus.getConfiguration().getRocket(), + new Pair<Double, Double>(oldAlt, currentStatus.getRocketPosition().z))); - if (status.getRocketPosition().z > status.getMaxAlt()) { - status.setMaxAlt(status.getRocketPosition().z); + if (currentStatus.getRocketPosition().z > currentStatus.getMaxAlt()) { + currentStatus.setMaxAlt(currentStatus.getRocketPosition().z); } // Position relative to start location - Coordinate relativePosition = status.getRocketPosition().sub(origin); + Coordinate relativePosition = currentStatus.getRocketPosition().sub(origin); // Add appropriate events - if (!status.isLiftoff()) { + if (!currentStatus.isLiftoff()) { // Avoid sinking into ground before liftoff if (relativePosition.z < 0) { - status.setRocketPosition(origin); - status.setRocketVelocity(originVelocity); + currentStatus.setRocketPosition(origin); + currentStatus.setRocketVelocity(originVelocity); } // Detect lift-off if (relativePosition.z > 0.02) { - addEvent(new FlightEvent(FlightEvent.Type.LIFTOFF, status.getSimulationTime())); + addEvent(new FlightEvent(FlightEvent.Type.LIFTOFF, currentStatus.getSimulationTime())); } } else { // Check ground hit after liftoff - if (status.getRocketPosition().z < 0) { - status.setRocketPosition(status.getRocketPosition().setZ(0)); - addEvent(new FlightEvent(FlightEvent.Type.GROUND_HIT, status.getSimulationTime())); - addEvent(new FlightEvent(FlightEvent.Type.SIMULATION_END, status.getSimulationTime())); + if (currentStatus.getRocketPosition().z < 0) { + currentStatus.setRocketPosition(currentStatus.getRocketPosition().setZ(0)); + addEvent(new FlightEvent(FlightEvent.Type.GROUND_HIT, currentStatus.getSimulationTime())); + addEvent(new FlightEvent(FlightEvent.Type.SIMULATION_END, currentStatus.getSimulationTime())); } } // Check for launch guide clearance - if (!status.isLaunchRodCleared() && - relativePosition.length() > status.getSimulationConditions().getLaunchRodLength()) { - addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, status.getSimulationTime(), null)); + if (!currentStatus.isLaunchRodCleared() && + relativePosition.length() > currentStatus.getSimulationConditions().getLaunchRodLength()) { + addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, currentStatus.getSimulationTime(), null)); } // Check for apogee - if (!status.isApogeeReached() && status.getRocketPosition().z < status.getMaxAlt() - 0.01) { - status.setMaxAltTime(status.getSimulationTime()); - addEvent(new FlightEvent(FlightEvent.Type.APOGEE, status.getSimulationTime(), - status.getConfiguration().getRocket())); + if (!currentStatus.isApogeeReached() && currentStatus.getRocketPosition().z < currentStatus.getMaxAlt() - 0.01) { + currentStatus.setMaxAltTime(currentStatus.getSimulationTime()); + addEvent(new FlightEvent(FlightEvent.Type.APOGEE, currentStatus.getSimulationTime(), + currentStatus.getConfiguration().getRocket())); } - - // Check for burnt out motors - for (MotorId motorId : status.getMotorConfiguration().getMotorIDs()) { - MotorInstance motor = status.getMotorConfiguration().getMotorInstance(motorId); - if (!motor.isActive() && status.addBurntOutMotor(motorId)) { - addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, status.getSimulationTime(), - (RocketComponent) status.getMotorConfiguration().getMotorMount(motorId), motorId)); - } - } +// //@Obsolete +// //@Redundant +// // Check for burnt out motors +// for( MotorClusterState state : currentStatus.getActiveMotors()){ +// if ( state.isSpent()){ +// addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, currentStatus.getSimulationTime(), +// (RocketComponent) state.getMount(), state)); +// } +// } // Check for Tumbling // Conditions for transision are: @@ -211,23 +207,23 @@ private FlightDataBranch simulateLoop() { // and aoa > AOA_TUMBLE_CONDITION threshold // and thrust < THRUST_TUMBLE_CONDITION threshold - if (!status.isTumbling()) { - final double t = status.getFlightData().getLast(FlightDataType.TYPE_THRUST_FORCE); - final double cp = status.getFlightData().getLast(FlightDataType.TYPE_CP_LOCATION); - final double cg = status.getFlightData().getLast(FlightDataType.TYPE_CG_LOCATION); - final double aoa = status.getFlightData().getLast(FlightDataType.TYPE_AOA); + if (!currentStatus.isTumbling()) { + final double t = currentStatus.getFlightData().getLast(FlightDataType.TYPE_THRUST_FORCE); + final double cp = currentStatus.getFlightData().getLast(FlightDataType.TYPE_CP_LOCATION); + final double cg = currentStatus.getFlightData().getLast(FlightDataType.TYPE_CG_LOCATION); + final double aoa = currentStatus.getFlightData().getLast(FlightDataType.TYPE_AOA); final boolean wantToTumble = (cg > cp && aoa > AOA_TUMBLE_CONDITION); if (wantToTumble) { final boolean tooMuchThrust = t > THRUST_TUMBLE_CONDITION; - final boolean isSustainer = status.getConfiguration().isStageActive(0); - final boolean isApogee = status.isApogeeReached(); + final boolean isSustainer = currentStatus.getConfiguration().isStageActive(0); + final boolean isApogee = currentStatus.isApogeeReached(); if (tooMuchThrust) { - status.getWarnings().add(Warning.TUMBLE_UNDER_THRUST); - } else if (isApogee) { - addEvent(new FlightEvent(FlightEvent.Type.TUMBLE, status.getSimulationTime())); - status.setTumbling(true); + currentStatus.getWarnings().add(Warning.TUMBLE_UNDER_THRUST); + } else if (isApogee || !isSustainer) { + addEvent(new FlightEvent(FlightEvent.Type.TUMBLE, currentStatus.getSimulationTime())); + currentStatus.setTumbling(true); } } @@ -236,61 +232,14 @@ private FlightDataBranch simulateLoop() { } } catch (SimulationException e) { - SimulationListenerHelper.fireEndSimulation(status, e); + SimulationListenerHelper.fireEndSimulation(currentStatus, e); // Add FlightEvent for Abort. - status.getFlightData().addEvent(new FlightEvent(FlightEvent.Type.EXCEPTION, status.getSimulationTime(), status.getConfiguration().getRocket(), e.getLocalizedMessage())); - status.getWarnings().add(e.getLocalizedMessage()); + currentStatus.getFlightData().addEvent(new FlightEvent(FlightEvent.Type.EXCEPTION, currentStatus.getSimulationTime(), currentStatus.getConfiguration().getRocket(), e.getLocalizedMessage())); + currentStatus.getWarnings().add(e.getLocalizedMessage()); } - return status.getFlightData(); - } - - /** - * Create a rocket configuration from the launch conditions. - * - * @param simulation the launch conditions. - * @return a rocket configuration with all stages attached. - */ - private Configuration setupConfiguration(SimulationConditions simulation) { - Configuration configuration = new Configuration(simulation.getRocket()); - configuration.setAllStages(); - configuration.setFlightConfigurationID(simulation.getMotorConfigurationID()); - - return configuration; - } - - - - /** - * Create a new motor instance configuration for the rocket configuration. - * - * @param configuration the rocket configuration. - * @return a new motor instance configuration with all motors in place. - */ - private MotorInstanceConfiguration setupMotorConfiguration(Configuration configuration) { - MotorInstanceConfiguration motors = new MotorInstanceConfiguration(); - final String flightConfigId = configuration.getFlightConfigurationID(); - - Iterator<MotorMount> iterator = configuration.motorIterator(); - while (iterator.hasNext()) { - MotorMount mount = iterator.next(); - RocketComponent component = (RocketComponent) mount; - MotorConfiguration motorConfig = mount.getMotorConfiguration().get(flightConfigId); - IgnitionConfiguration ignitionConfig = mount.getIgnitionConfiguration().get(flightConfigId); - Motor motor = motorConfig.getMotor(); - - if (motor != null) { - Coordinate[] positions = component.toAbsolute(mount.getMotorPosition(flightConfigId)); - for (int i = 0; i < positions.length; i++) { - Coordinate position = positions[i]; - MotorId id = new MotorId(component.getID(), i + 1); - motors.addMotor(id, motor.getInstance(), motorConfig.getEjectionDelay(), mount, - ignitionConfig.getIgnitionEvent(), ignitionConfig.getIgnitionDelay(), position); - } - } - } - return motors; - } + return currentStatus.getFlightData(); + } /** * Handles events occurring during the flight from the event queue. @@ -301,65 +250,64 @@ private boolean handleEvents() throws SimulationException { boolean ret = true; FlightEvent event; - log.trace("HandleEvents: current branch = " + status.getFlightData().getBranchName()); - log.trace("EventQueue = " + status.getEventQueue().toString()); + log.trace("HandleEvents: current branch = " + currentStatus.getFlightData().getBranchName()); for (event = nextEvent(); event != null; event = nextEvent()) { + log.trace("Obtained event from queue: " + event.toString()); + log.trace("Remaining EventQueue = " + currentStatus.getEventQueue().toString()); + + // Check for motor ignition events, add ignition events to queue + for (MotorClusterState state : currentStatus.getActiveMotors() ){ + if( state.testForIgnition(event )){ + final double simulationTime = currentStatus.getSimulationTime() ; + + MotorClusterState sourceState = (MotorClusterState) event.getData(); + double ignitionDelay = 0; + if (event.getType() == FlightEvent.Type.BURNOUT) + ignitionDelay = 0; + else if (event.getType() == FlightEvent.Type.EJECTION_CHARGE) + ignitionDelay = sourceState.getEjectionDelay(); + + MotorMount mount = state.getMount(); + MotorConfiguration motorInstance = mount.getMotorConfig(this.fcid); + ignitionDelay += motorInstance.getIgnitionDelay(); + + final double ignitionTime = currentStatus.getSimulationTime() + ignitionDelay; + + // TODO: this event seems to get enqueue'd multiple times ... + log.info("Queueing Ignition Event for: "+state.toDescription()+" @: "+ignitionTime); + //log.info(" Because of "+event.getType().name()+" @"+event.getTime()+" from: "+event.getSource().getName()); + + addEvent(new FlightEvent(FlightEvent.Type.IGNITION, ignitionTime, (RocketComponent) mount, state )); + } + } // Ignore events for components that are no longer attached to the rocket if (event.getSource() != null && event.getSource().getParent() != null && - !status.getConfiguration().isStageActive(event.getSource().getStageNumber())) { + !currentStatus.getConfiguration().isComponentActive(event.getSource())) { + log.trace("Ignoring event from unattached componenent"); continue; } // Call simulation listeners, allow aborting event handling - if (!SimulationListenerHelper.fireHandleFlightEvent(status, event)) { + if (!SimulationListenerHelper.fireHandleFlightEvent(currentStatus, event)) { continue; } - if (event.getType() != FlightEvent.Type.ALTITUDE) { - log.trace("BasicEventSimulationEngine: Handling event " + event); - } - - if (event.getType() == FlightEvent.Type.IGNITION) { - MotorMount mount = (MotorMount) event.getSource(); - MotorId motorId = (MotorId) event.getData(); - MotorInstance instance = status.getMotorConfiguration().getMotorInstance(motorId); - if (!SimulationListenerHelper.fireMotorIgnition(status, motorId, mount, instance)) { - continue; - } - } - if (event.getType() == FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT) { RecoveryDevice device = (RecoveryDevice) event.getSource(); - if (!SimulationListenerHelper.fireRecoveryDeviceDeployment(status, device)) { + if (!SimulationListenerHelper.fireRecoveryDeviceDeployment(currentStatus, device)) { continue; } } - - // Check for motor ignition events, add ignition events to queue - for (MotorId id : status.getMotorConfiguration().getMotorIDs()) { - IgnitionConfiguration.IgnitionEvent ignitionEvent = status.getMotorConfiguration().getMotorIgnitionEvent(id); - MotorMount mount = status.getMotorConfiguration().getMotorMount(id); - RocketComponent component = (RocketComponent) mount; - - if (ignitionEvent.isActivationEvent(event, component)) { - double ignitionDelay = status.getMotorConfiguration().getMotorIgnitionDelay(id); - addEvent(new FlightEvent(FlightEvent.Type.IGNITION, - status.getSimulationTime() + ignitionDelay, - component, id)); - } - } - - // Check for stage separation event - for (int stageNo : status.getConfiguration().getActiveStages()) { + for (AxialStage stage : currentStatus.getConfiguration().getActiveStages()) { + int stageNo = stage.getStageNumber(); if (stageNo == 0) continue; - Stage stage = (Stage) status.getConfiguration().getRocket().getChild(stageNo); - StageSeparationConfiguration separationConfig = stage.getStageSeparationConfiguration().get(flightConfigurationId); + StageSeparationConfiguration separationConfig = stage.getSeparationConfigurations().get(this.fcid); if (separationConfig.getSeparationEvent().isSeparationEvent(event, stage)) { addEvent(new FlightEvent(FlightEvent.Type.STAGE_SEPARATION, event.getTime() + separationConfig.getSeparationDelay(), stage)); @@ -368,12 +316,10 @@ private boolean handleEvents() throws SimulationException { // Check for recovery device deployment, add events to queue - Iterator<RocketComponent> rci = status.getConfiguration().iterator(); - while (rci.hasNext()) { - RocketComponent c = rci.next(); + for (RocketComponent c : currentStatus.getConfiguration().getActiveComponents()) { if (!(c instanceof RecoveryDevice)) continue; - DeploymentConfiguration deployConfig = ((RecoveryDevice) c).getDeploymentConfiguration().get(flightConfigurationId); + DeploymentConfiguration deployConfig = ((RecoveryDevice) c).getDeploymentConfigurations().get(this.fcid); if (deployConfig.isActivationEvent(event, c)) { // Delay event by at least 1ms to allow stage separation to occur first addEvent(new FlightEvent(FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT, @@ -381,90 +327,118 @@ private boolean handleEvents() throws SimulationException { } } - // Handle event + log.trace("Handling event " + event); switch (event.getType()) { case LAUNCH: { - status.getFlightData().addEvent(event); + currentStatus.getFlightData().addEvent(event); break; } case IGNITION: { + MotorClusterState motorState = (MotorClusterState) event.getData(); + + log.info(" Igniting motor: "+motorState.toDescription()+" @"+currentStatus.getSimulationTime()); + motorState.ignite( event.getTime()); + // Ignite the motor - MotorId motorId = (MotorId) event.getData(); - MotorInstanceConfiguration config = status.getMotorConfiguration(); - config.setMotorIgnitionTime(motorId, event.getTime()); - status.setMotorIgnited(true); - status.getFlightData().addEvent(event); + currentStatus.setMotorIgnited(true); + currentStatus.getFlightData().addEvent(event); + // ... ignite ...uhh, again? + // TBH, I'm not sure what this call is for. It seems to be mostly a bunch of event distribution. + MotorConfigurationId motorId = motorState.getID(); + MotorMount mount = (MotorMount) event.getSource(); + if (!SimulationListenerHelper.fireMotorIgnition(currentStatus, motorId, mount, motorState)) { + continue; + } + + // and queue up the burnout for this motor, as well. +// double duration = motorState.getMotor().getBurnTimeEstimate(); + double duration = motorState.getBurnTime(); + double burnout = currentStatus.getSimulationTime() + duration; + addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, burnout, + event.getSource(), motorState )); break; } case LIFTOFF: { // Mark lift-off as occurred - status.setLiftoff(true); - status.getFlightData().addEvent(event); + currentStatus.setLiftoff(true); + currentStatus.getFlightData().addEvent(event); break; } case LAUNCHROD: { // Mark launch rod as cleared - status.setLaunchRodCleared(true); - status.getFlightData().addEvent(event); + currentStatus.setLaunchRodCleared(true); + currentStatus.getFlightData().addEvent(event); break; } case BURNOUT: { // If motor burnout occurs without lift-off, abort - if (!status.isLiftoff()) { + if (!currentStatus.isLiftoff()) { throw new SimulationLaunchException(trans.get("BasicEventSimulationEngine.error.earlyMotorBurnout")); } + // Add ejection charge event - MotorId motorId = (MotorId) event.getData(); - double delay = status.getMotorConfiguration().getEjectionDelay(motorId); - if (delay != Motor.PLUGGED) { - addEvent(new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, status.getSimulationTime() + delay, - event.getSource(), event.getData())); + MotorClusterState motorState = (MotorClusterState) event.getData(); + motorState.burnOut( event.getTime() ); + + AxialStage stage = motorState.getMount().getStage(); + //log.debug( " adding EJECTION_CHARGE event for motor "+motorState.getMotor().getDesignation()+" on stage "+stage.getStageNumber()+": "+stage.getName()); + log.debug( " detected Motor Burnout for motor "+motorState.getMotor().getDesignation()+"@ "+event.getTime()+" on stage "+stage.getStageNumber()+": "+stage.getName()); + + + double delay = motorState.getEjectionDelay(); + if ( motorState.hasEjectionCharge() ){ + addEvent(new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, currentStatus.getSimulationTime() + delay, + stage, event.getData())); } - status.getFlightData().addEvent(event); + currentStatus.getFlightData().addEvent(event); break; } case EJECTION_CHARGE: { - status.getFlightData().addEvent(event); + MotorClusterState motorState = (MotorClusterState) event.getData(); + motorState.expend( event.getTime() ); + currentStatus.getFlightData().addEvent(event); break; } case STAGE_SEPARATION: { // Record the event. - status.getFlightData().addEvent(event); - - RocketComponent stage = event.getSource(); - int n = stage.getStageNumber(); - - // Prepare the booster status for simulation. - SimulationStatus boosterStatus = new SimulationStatus(status); - boosterStatus.setFlightData(new FlightDataBranch(stage.getName(), FlightDataType.TYPE_TIME)); - - stages.add(boosterStatus); + currentStatus.getFlightData().addEvent(event); + RocketComponent boosterStage = event.getSource(); + final int stageNumber = boosterStage.getStageNumber(); + // Mark the status as having dropped the booster - status.getConfiguration().setToStage(n - 1); - + currentStatus.getConfiguration().clearStage( stageNumber); + + // Prepare the simulation branch + SimulationStatus boosterStatus = new SimulationStatus(currentStatus); + boosterStatus.setFlightData(new FlightDataBranch(boosterStage.getName(), FlightDataType.TYPE_TIME)); // Mark the booster status as only having the booster. - boosterStatus.getConfiguration().setOnlyStage(n); + boosterStatus.getConfiguration().setOnlyStage(stageNumber); + toSimulate.push(boosterStatus); + log.info(String.format("==>> @ %g; from Branch: %s ---- Branching: %s ---- \n", + currentStatus.getSimulationTime(), + currentStatus.getFlightData().getBranchName(), boosterStatus.getFlightData().getBranchName())); + break; } case APOGEE: // Mark apogee as reached - status.setApogeeReached(true); - status.getFlightData().addEvent(event); + currentStatus.setApogeeReached(true); + currentStatus.getFlightData().addEvent(event); // This apogee event might be the optimum if recovery has not already happened. - if (status.getSimulationConditions().isCalculateExtras() && status.getDeployedRecoveryDevices().size() == 0) { - status.getFlightData().setOptimumAltitude(status.getMaxAlt()); - status.getFlightData().setTimeToOptimumAltitude(status.getMaxAltTime()); + if (currentStatus.getSimulationConditions().isCalculateExtras() && currentStatus.getDeployedRecoveryDevices().size() == 0) { + currentStatus.getFlightData().setOptimumAltitude(currentStatus.getMaxAlt()); + currentStatus.getFlightData().setTimeToOptimumAltitude(currentStatus.getMaxAltTime()); } break; @@ -472,72 +446,77 @@ private boolean handleEvents() throws SimulationException { RocketComponent c = event.getSource(); int n = c.getStageNumber(); // Ignore event if stage not active - if (status.getConfiguration().isStageActive(n)) { + if (currentStatus.getConfiguration().isStageActive(n)) { // TODO: HIGH: Check stage activeness for other events as well? // Check whether any motor in the active stages is active anymore - for (MotorId motorId : status.getMotorConfiguration().getMotorIDs()) { - int stage = ((RocketComponent) status.getMotorConfiguration(). - getMotorMount(motorId)).getStageNumber(); - if (!status.getConfiguration().isStageActive(stage)) + for (MotorClusterState state : currentStatus.getActiveMotors() ) { + if ( state.isSpent() ) { continue; - if (!status.getMotorConfiguration().getMotorInstance(motorId).isActive()) - continue; - status.getWarnings().add(Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING); + } + currentStatus.getWarnings().add(Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING); } // Check for launch rod - if (!status.isLaunchRodCleared()) { - status.getWarnings().add(Warning.RECOVERY_LAUNCH_ROD); + if (!currentStatus.isLaunchRodCleared()) { + currentStatus.getWarnings().add(Warning.RECOVERY_LAUNCH_ROD); } // Check current velocity - if (status.getRocketVelocity().length() > 20) { - status.getWarnings().add(new Warning.HighSpeedDeployment(status.getRocketVelocity().length())); + if (currentStatus.getRocketVelocity().length() > 20) { + currentStatus.getWarnings().add(new Warning.HighSpeedDeployment(currentStatus.getRocketVelocity().length())); } - status.setLiftoff(true); - status.getDeployedRecoveryDevices().add((RecoveryDevice) c); + currentStatus.setLiftoff(true); + currentStatus.getDeployedRecoveryDevices().add((RecoveryDevice) c); // If we haven't already reached apogee, then we need to compute the actual coast time // to determine the optimum altitude. - if (status.getSimulationConditions().isCalculateExtras() && !status.isApogeeReached()) { + if (currentStatus.getSimulationConditions().isCalculateExtras() && !currentStatus.isApogeeReached()) { FlightData coastStatus = computeCoastTime(); - status.getFlightData().setOptimumAltitude(coastStatus.getMaxAltitude()); - status.getFlightData().setTimeToOptimumAltitude(coastStatus.getTimeToApogee()); + + currentStatus.getFlightData().setOptimumAltitude(coastStatus.getMaxAltitude()); + currentStatus.getFlightData().setTimeToOptimumAltitude(coastStatus.getTimeToApogee()); } this.currentStepper = this.landingStepper; - this.status = currentStepper.initialize(status); + this.currentStatus = currentStepper.initialize(currentStatus); - status.getFlightData().addEvent(event); + currentStatus.getFlightData().addEvent(event); } break; case GROUND_HIT: - status.getFlightData().addEvent(event); + currentStatus.getFlightData().addEvent(event); break; case SIMULATION_END: ret = false; - status.getFlightData().addEvent(event); + currentStatus.getFlightData().addEvent(event); break; case ALTITUDE: + // nothing special needs to be done for this event break; case TUMBLE: this.currentStepper = this.tumbleStepper; - this.status = currentStepper.initialize(status); - status.getFlightData().addEvent(event); + this.currentStatus = currentStepper.initialize(currentStatus); + currentStatus.getFlightData().addEvent(event); break; } } + if( 1200 < currentStatus.getSimulationTime() ){ + ret = false; + log.error("Simulation hit max time (1200s): aborting."); + currentStatus.getFlightData().addEvent(new FlightEvent( FlightEvent.Type.SIMULATION_END, currentStatus.getSimulationTime())); + } + // If no motor has ignited, abort - if (!status.isMotorIgnited()) { + if (!currentStatus.isMotorIgnited()) { throw new MotorIgnitionException(trans.get("BasicEventSimulationEngine.error.noIgnition")); } @@ -550,8 +529,8 @@ private boolean handleEvents() throws SimulationException { * @param event the event to add to the queue. */ private void addEvent(FlightEvent event) throws SimulationException { - if (SimulationListenerHelper.fireAddFlightEvent(status, event)) { - status.getEventQueue().add(event); + if (SimulationListenerHelper.fireAddFlightEvent(currentStatus, event)) { + currentStatus.getEventQueue().add(event); } } @@ -565,16 +544,16 @@ private void addEvent(FlightEvent event) throws SimulationException { * @return the flight event to handle, or null */ private FlightEvent nextEvent() { - EventQueue queue = status.getEventQueue(); + EventQueue queue = currentStatus.getEventQueue(); FlightEvent event = queue.peek(); if (event == null) return null; // Jump to event if no motors have been ignited - if (!status.isMotorIgnited() && event.getTime() > status.getSimulationTime()) { - status.setSimulationTime(event.getTime()); + if (!currentStatus.isMotorIgnited() && event.getTime() > currentStatus.getSimulationTime()) { + currentStatus.setSimulationTime(event.getTime()); } - if (event.getTime() <= status.getSimulationTime()) { + if (event.getTime() <= currentStatus.getSimulationTime()) { return queue.poll(); } else { return null; @@ -586,33 +565,33 @@ private FlightEvent nextEvent() { private void checkNaN() throws SimulationException { double d = 0; boolean b = false; - d += status.getSimulationTime(); - d += status.getPreviousTimeStep(); - b |= status.getRocketPosition().isNaN(); - b |= status.getRocketVelocity().isNaN(); - b |= status.getRocketOrientationQuaternion().isNaN(); - b |= status.getRocketRotationVelocity().isNaN(); - d += status.getEffectiveLaunchRodLength(); + d += currentStatus.getSimulationTime(); + d += currentStatus.getPreviousTimeStep(); + b |= currentStatus.getRocketPosition().isNaN(); + b |= currentStatus.getRocketVelocity().isNaN(); + b |= currentStatus.getRocketOrientationQuaternion().isNaN(); + b |= currentStatus.getRocketRotationVelocity().isNaN(); + d += currentStatus.getEffectiveLaunchRodLength(); if (Double.isNaN(d) || b) { log.error("Simulation resulted in NaN value:" + - " simulationTime=" + status.getSimulationTime() + - " previousTimeStep=" + status.getPreviousTimeStep() + - " rocketPosition=" + status.getRocketPosition() + - " rocketVelocity=" + status.getRocketVelocity() + - " rocketOrientationQuaternion=" + status.getRocketOrientationQuaternion() + - " rocketRotationVelocity=" + status.getRocketRotationVelocity() + - " effectiveLaunchRodLength=" + status.getEffectiveLaunchRodLength()); + " simulationTime=" + currentStatus.getSimulationTime() + + " previousTimeStep=" + currentStatus.getPreviousTimeStep() + + " rocketPosition=" + currentStatus.getRocketPosition() + + " rocketVelocity=" + currentStatus.getRocketVelocity() + + " rocketOrientationQuaternion=" + currentStatus.getRocketOrientationQuaternion() + + " rocketRotationVelocity=" + currentStatus.getRocketRotationVelocity() + + " effectiveLaunchRodLength=" + currentStatus.getEffectiveLaunchRodLength()); throw new SimulationException(trans.get("BasicEventSimulationEngine.error.NaNResult")); } } private FlightData computeCoastTime() { try { - SimulationConditions conds = status.getSimulationConditions().clone(); + SimulationConditions conds = currentStatus.getSimulationConditions().clone(); conds.getSimulationListenerList().add(OptimumCoastListener.INSTANCE); BasicEventSimulationEngine e = new BasicEventSimulationEngine(); - + FlightData d = e.simulate(conds); return d; } catch (Exception e) { diff --git a/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java b/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java index eea8352002..cf2cf6e04f 100644 --- a/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java +++ b/core/src/net/sf/openrocket/simulation/BasicLandingStepper.java @@ -38,8 +38,7 @@ public void step(SimulationStatus status, double maxTimeStep) throws SimulationE // Compute drag force double dynP = (0.5 * atmosphere.getDensity() * airSpeed.length2()); double dragForce = totalCD * dynP * refArea; - MassData massData = calculateMassData(status); - double mass = massData.getCG().weight; + double mass = calculateStructureMass(status).getMass(); // Compute drag acceleration diff --git a/core/src/net/sf/openrocket/simulation/BasicTumbleStatus.java b/core/src/net/sf/openrocket/simulation/BasicTumbleStatus.java index 1993c5aaf2..9d895809d0 100644 --- a/core/src/net/sf/openrocket/simulation/BasicTumbleStatus.java +++ b/core/src/net/sf/openrocket/simulation/BasicTumbleStatus.java @@ -2,9 +2,8 @@ import java.util.Iterator; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; @@ -20,10 +19,9 @@ public class BasicTumbleStatus extends SimulationStatus { private final double drag; - public BasicTumbleStatus(Configuration configuration, - MotorInstanceConfiguration motorConfiguration, + public BasicTumbleStatus(FlightConfiguration configuration, SimulationConditions simulationConditions) { - super(configuration, motorConfiguration, simulationConditions); + super(configuration, simulationConditions); this.drag = computeTumbleDrag(); } @@ -56,15 +54,16 @@ private double computeTumbleDrag() { continue; } if (component instanceof FinSet) { + final FinSet finComponent = ((FinSet) component); + final double finArea = finComponent.getPlanformArea(); + int finCount = finComponent.getFinCount(); - double finComponent = ((FinSet) component).getFinArea(); - int finCount = ((FinSet) component).getFinCount(); // check bounds on finCount. if (finCount >= finEff.length) { finCount = finEff.length - 1; } - aFins += finComponent * finEff[finCount]; + aFins += finArea * finEff[finCount]; } else if (component instanceof SymmetricComponent) { aBt += ((SymmetricComponent) component).getComponentPlanformArea(); diff --git a/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java b/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java index 15afc122da..f1e3795dcc 100644 --- a/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java +++ b/core/src/net/sf/openrocket/simulation/BasicTumbleStepper.java @@ -1,5 +1,6 @@ package net.sf.openrocket.simulation; + import net.sf.openrocket.models.atmosphere.AtmosphericConditions; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.util.Coordinate; @@ -34,8 +35,9 @@ public void step(SimulationStatus status, double maxTimeStep) throws SimulationE // Compute drag force double dynP = (0.5 * atmosphere.getDensity() * airSpeed.length2()); double dragForce = tumbleDrag * dynP; - MassData massData = calculateMassData(status); - double mass = massData.getCG().weight; + + // n.b. this is constant, and could be calculated once at the beginning of this simulation branch... + double mass = calculateStructureMass(status).getMass(); // Compute drag acceleration diff --git a/core/src/net/sf/openrocket/simulation/DefaultSimulationOptionFactory.java b/core/src/net/sf/openrocket/simulation/DefaultSimulationOptionFactory.java index 785598c596..23a2f82f04 100644 --- a/core/src/net/sf/openrocket/simulation/DefaultSimulationOptionFactory.java +++ b/core/src/net/sf/openrocket/simulation/DefaultSimulationOptionFactory.java @@ -33,7 +33,7 @@ public DefaultSimulationOptionFactory() { } public SimulationOptions getDefault() { - SimulationOptions defaults = new SimulationOptions(null); + SimulationOptions defaults = new SimulationOptions(); if (prefs != null) { defaults.setWindSpeedAverage(prefs.getDouble(SIMCONDITION_WIND_SPEED, defaults.getWindSpeedAverage())); diff --git a/core/src/net/sf/openrocket/simulation/FlightDataBranch.java b/core/src/net/sf/openrocket/simulation/FlightDataBranch.java index 0f523b2f19..5337178321 100644 --- a/core/src/net/sf/openrocket/simulation/FlightDataBranch.java +++ b/core/src/net/sf/openrocket/simulation/FlightDataBranch.java @@ -279,7 +279,7 @@ public double getOptimumDelay() { */ public void addEvent(FlightEvent event) { mutable.check(); - events.add(event.resetSourceAndData()); + events.add(event); modID++; } diff --git a/core/src/net/sf/openrocket/simulation/FlightEvent.java b/core/src/net/sf/openrocket/simulation/FlightEvent.java index 0ad2412ff2..a3eab8ef9d 100644 --- a/core/src/net/sf/openrocket/simulation/FlightEvent.java +++ b/core/src/net/sf/openrocket/simulation/FlightEvent.java @@ -1,6 +1,8 @@ package net.sf.openrocket.simulation; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -102,23 +104,26 @@ public String toString() { private final Object data; - public FlightEvent(Type type, double time) { - this(type, time, null); + public FlightEvent( final Type type, final double time) { + this(type, time, null, null); } - public FlightEvent(Type type, double time, RocketComponent source) { + public FlightEvent( final Type type, final double time, final RocketComponent source) { this(type, time, source, null); } - public FlightEvent(Type type, double time, RocketComponent source, Object data) { + public FlightEvent(final FlightEvent _sourceEvent, final RocketComponent _comp, final Object _data) { + this(_sourceEvent.type, _sourceEvent.time, _comp, _data); + } + + public FlightEvent( final Type type, final double time, final RocketComponent source, final Object data) { this.type = type; this.time = time; this.source = source; this.data = data; + validate(); } - - - + public Type getType() { return type; } @@ -136,16 +141,7 @@ public Object getData() { } - /** - * Return a new FlightEvent with the same information as the current event - * but with <code>null</code> source. This is used to avoid memory leakage by - * retaining references to obsolete components. - * - * @return a new FlightEvent with same type, time and data. - */ - public FlightEvent resetSourceAndData() { - return new FlightEvent(type, time, null, null); - } + /** @@ -164,6 +160,81 @@ public int compareTo(FlightEvent o) { @Override public String toString() { - return "FlightEvent[type=" + type.name() + ",time=" + time + ",source=" + source + "]"; + return "FlightEvent[type=" + type.name() + ",time=" + time + ",source=" + source + ",data=" + String.valueOf(data) + "]"; + + } + + /** + * verify that this event's state is well-formed. + * + * User actions should not cause these. + * + * @return + */ + public void validate(){ + if( this.time == Double.NaN ){ + throw new IllegalStateException(type.name()+" event has a NaN time!"); + } + switch( this.type ){ + case BURNOUT: + if( null != this.source){ + if( ! ( this.source instanceof MotorMount)){ + throw new IllegalStateException(type.name()+" events should have " + +MotorMount.class.getSimpleName()+" type data payloads, instead of" + +this.getSource().getClass().getSimpleName()); + } + } + if( null != this.data ){ + if( ! ( this.data instanceof MotorClusterState)){ + throw new IllegalStateException(type.name()+" events should have " + +MotorClusterState.class.getSimpleName()+" type data payloads"); + } + } + break; + case IGNITION: + if( null != this.source){ + if( ! ( this.getSource() instanceof MotorMount)){ + throw new IllegalStateException(type.name()+" events should have " + +MotorMount.class.getSimpleName()+" type data payloads, instead of" + +this.getSource().getClass().getSimpleName()); + } + } + if( null != this.data ){ + if( ! ( this.data instanceof MotorClusterState)){ + throw new IllegalStateException(type.name()+"events should have " + +MotorClusterState.class.getSimpleName()+" type data payloads"); + } + } + break; + case EJECTION_CHARGE: + if( null != this.source){ + if( ! ( this.getSource() instanceof AxialStage)){ + throw new IllegalStateException(type.name()+" events should have " + +AxialStage.class.getSimpleName()+" type data payloads, instead of" + +this.getSource().getClass().getSimpleName()); + } + } + if( null != this.data ){ + if( ! ( this.data instanceof MotorClusterState)){ + throw new IllegalStateException(type.name()+" events should have " + +MotorClusterState.class.getSimpleName()+" type data payloads"); + } + } + break; + case LAUNCH: + case LIFTOFF: + case LAUNCHROD: + case STAGE_SEPARATION: + case APOGEE: + case RECOVERY_DEVICE_DEPLOYMENT: + case GROUND_HIT: + case SIMULATION_END: + case ALTITUDE: + case TUMBLE: + case EXCEPTION: + default: + } } + + } diff --git a/core/src/net/sf/openrocket/simulation/MassData.java b/core/src/net/sf/openrocket/simulation/MassData.java deleted file mode 100644 index 74386364d3..0000000000 --- a/core/src/net/sf/openrocket/simulation/MassData.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.sf.openrocket.simulation; - -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.MathUtil; - -/** - * An immutable value object containing the mass data of a rocket. - * - * @author Sampo Niskanen <sampo.niskanen@iki.fi> - */ -public class MassData { - - private final Coordinate cg; - private final double longitudinalInertia; - private final double rotationalInertia; - private final double propellantMass; - - - public MassData(Coordinate cg, double longitudinalInertia, double rotationalInertia, double propellantMass) { - if (cg == null) { - throw new IllegalArgumentException("cg is null"); - } - this.cg = cg; - this.longitudinalInertia = longitudinalInertia; - this.rotationalInertia = rotationalInertia; - this.propellantMass = propellantMass; - } - - - - - public Coordinate getCG() { - return cg; - } - - public double getLongitudinalInertia() { - return longitudinalInertia; - } - - public double getRotationalInertia() { - return rotationalInertia; - } - - public double getPropellantMass() { - return propellantMass; - } - - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!(obj instanceof MassData)) - return false; - - MassData other = (MassData) obj; - return (this.cg.equals(other.cg) && MathUtil.equals(this.longitudinalInertia, other.longitudinalInertia) && - MathUtil.equals(this.rotationalInertia, other.rotationalInertia)) && MathUtil.equals(this.propellantMass, other.propellantMass) ; - } - - - @Override - public int hashCode() { - return (int) (cg.hashCode() ^ Double.doubleToLongBits(longitudinalInertia) ^ Double.doubleToLongBits(rotationalInertia) ^ Double.doubleToLongBits(propellantMass) ); - } - - - @Override - public String toString() { - return "MassData [cg=" + cg + ", longitudinalInertia=" + longitudinalInertia - + ", rotationalInertia=" + rotationalInertia + ", propellantMass="+propellantMass + "]"; - } - -} diff --git a/core/src/net/sf/openrocket/simulation/MotorClusterState.java b/core/src/net/sf/openrocket/simulation/MotorClusterState.java new file mode 100644 index 0000000000..39a97d7460 --- /dev/null +++ b/core/src/net/sf/openrocket/simulation/MotorClusterState.java @@ -0,0 +1,199 @@ +package net.sf.openrocket.simulation; + +import net.sf.openrocket.motor.IgnitionEvent; +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfigurationId; +import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.RocketComponent; + +public class MotorClusterState { + + // for reference: set at initialization ONLY. + final protected Motor motor; + final protected MotorConfiguration config; + final protected int motorCount; + final protected double thrustDuration; + + // for state: + protected double ignitionTime = Double.NaN; + protected double cutoffTime = Double.NaN; + protected double ejectionTime = Double.NaN; + protected ThrustState currentState = ThrustState.ARMED; + + public MotorClusterState(final MotorConfiguration _config) { + this.config = _config; + + this.motor = this.config.getMotor(); + this.motorCount = this.config.getMotorCount(); + this.thrustDuration = this.motor.getBurnTimeEstimate(); + + this.reset(); + } + + public double getIgnitionTime() { + return ignitionTime; + } + + public IgnitionEvent getIgnitionEvent() { + return config.getIgnitionEvent(); + } + + public void ignite( final double _ignitionTime ){ + if( ThrustState.ARMED == currentState ){ + this.ignitionTime = _ignitionTime; + this.currentState = this.currentState.getNext(); +// }else{ +// System.err.println("!! Attempted to ignite motor "+toDescription() +// +" with current status="+this.currentState.getName()+" ... Ignoring."); + } + } + + public void burnOut( final double _burnOutTime ){ + if( ThrustState.THRUSTING == currentState ){ + this.cutoffTime = _burnOutTime; + this.currentState = this.currentState.getNext(); +// }else{ +// System.err.println("!! Attempted to turn off motor state "+toDescription()+" with current status=" +// +this.currentState.getName()+" ... Ignoring."); + } + if( !this.hasEjectionCharge() ) { + this.currentState = ThrustState.SPENT; + } + } + + public void expend( final double _ejectionTime ){ + if( ThrustState.DELAYING == currentState ){ + this.ejectionTime = _ejectionTime; + this.currentState = this.currentState.getNext(); +// }else{ +// System.err.println("!! Attempted to mark as spent motor state "+toDescription()+" with current status=" +// +this.currentState.getName()+" ... Ignoring."); + } + } + + public double getBurnTime( ) { + return motor.getBurnTime(); + } + /** + * Alias for "burnOut(double)" + */ + public void cutOff( final double _cutoffTime ){ + burnOut( _cutoffTime ); + } + + public MotorConfiguration getConfig(){ + return config; + } + + public double getEjectionDelay() { + return config.getEjectionDelay(); + } + + public MotorConfigurationId getID() { + return config.getID(); + } + + public double getPropellantMass(){ + return (motor.getLaunchMass() - motor.getBurnoutMass()); + } + + public double getPropellantMass( final double motorTime ){ + return (motor.getPropellantMass( motorTime) - motor.getBurnoutMass()); + } + + public MotorMount getMount(){ + return config.getMount(); + } + + public Motor getMotor(){ + return this.motor; + } + + double getCutOffTime(){ + return this.cutoffTime; + } + + public double getMotorTime( final double _simulationTime ){ + return _simulationTime - this.getIgnitionTime(); + } + + /** + * Compute the average thrust over an interval. + * + * @param simulationTime + * @param cond + * @return + */ + public double getAverageThrust( final double startSimulationTime, final double endSimulationTime) { + if( this.currentState.isThrusting() ) { + double motorStartTime = this.getMotorTime( startSimulationTime); + double motorEndTime = this.getMotorTime( endSimulationTime); + + int instanceCount = this.config.getMount().getLocations().length; + return instanceCount * motor.getAverageThrust( motorStartTime, motorEndTime ); + }else{ + return 0.00; + } + } + + /** + * Compute the average thrust over an interval. + * + * @param simulationTime + * @param cond + * @return + */ + public double getThrust( final double simulationTime){ + if( this.currentState.isThrusting() ){ + double motorTime = this.getMotorTime( simulationTime); + return this.motorCount * motor.getThrust( motorTime ); + + }else{ + return 0.0; + } + } + + public boolean isPlugged(){ + return ( this.config.getEjectionDelay() == Motor.PLUGGED_DELAY); + } + + public boolean hasEjectionCharge(){ + return ! isPlugged(); + } + + public boolean isSpent(){ + return currentState == ThrustState.SPENT; + } + + /** + * alias to 'resetToPreflight()' + */ + public void reset(){ + // i.e. in the "future" + ignitionTime = Double.POSITIVE_INFINITY; + cutoffTime = Double.POSITIVE_INFINITY; + ejectionTime = Double.POSITIVE_INFINITY; + + currentState = ThrustState.ARMED; + } + + public boolean testForIgnition( final FlightEvent _event ){ + RocketComponent mount = (RocketComponent) this.getMount(); + return getIgnitionEvent().isActivationEvent( _event, mount); + } + + public String toDescription(){ + return String.format("%32s / %4s - %s", + getMount().getDebugName(), this.motor.getDesignation(), this.currentState.getName()); + } + + + @Override + public String toString(){ + return this.motor.getDesignation(); + } + + + +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/simulation/RK4SimulationStatus.java b/core/src/net/sf/openrocket/simulation/RK4SimulationStatus.java index db366fbdc2..67465e16d9 100644 --- a/core/src/net/sf/openrocket/simulation/RK4SimulationStatus.java +++ b/core/src/net/sf/openrocket/simulation/RK4SimulationStatus.java @@ -1,8 +1,7 @@ package net.sf.openrocket.simulation; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.util.Coordinate; public class RK4SimulationStatus extends SimulationStatus implements Cloneable { @@ -15,10 +14,9 @@ public class RK4SimulationStatus extends SimulationStatus implements Cloneable { private double maxZVelocity = 0; private double startWarningTime = -1; - public RK4SimulationStatus(Configuration configuration, - MotorInstanceConfiguration motorConfiguration, + public RK4SimulationStatus(FlightConfiguration configuration, SimulationConditions simulationConditions ) { - super(configuration, motorConfiguration, simulationConditions); + super(configuration, simulationConditions); } public RK4SimulationStatus( SimulationStatus other ) { diff --git a/core/src/net/sf/openrocket/simulation/RK4SimulationStepper.java b/core/src/net/sf/openrocket/simulation/RK4SimulationStepper.java index d431569af1..7625e113a0 100644 --- a/core/src/net/sf/openrocket/simulation/RK4SimulationStepper.java +++ b/core/src/net/sf/openrocket/simulation/RK4SimulationStepper.java @@ -10,6 +10,7 @@ import net.sf.openrocket.aerodynamics.FlightConditions; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; import net.sf.openrocket.simulation.exception.SimulationCalculationException; import net.sf.openrocket.simulation.exception.SimulationException; @@ -110,7 +111,7 @@ public void step(SimulationStatus simulationStatus, double maxTimeStep) throws S /* * Compute the initial thrust estimate. This is used for the first time step computation. */ - store.thrustForce = calculateThrust(status, store.timestep, status.getPreviousAcceleration(), + store.thrustForce = calculateAverageThrust(status, store.timestep, status.getPreviousAcceleration(), status.getPreviousAtmosphericConditions(), false); @@ -179,8 +180,9 @@ public void step(SimulationStatus simulationStatus, double maxTimeStep) throws S * diminished by it affecting only 1/6th of the total, so it's an acceptable error. */ double thrustEstimate = store.thrustForce; - store.thrustForce = calculateThrust(status, store.timestep, store.longitudinalAcceleration, + store.thrustForce = calculateAverageThrust(status, store.timestep, store.longitudinalAcceleration, store.atmosphericConditions, true); + log.trace("Thrust = " + store.thrustForce); double thrustDiff = Math.abs(store.thrustForce - thrustEstimate); // Log if difference over 1%, recompute if over 10% if (thrustDiff > 0.01 * thrustEstimate) { @@ -244,9 +246,6 @@ public void step(SimulationStatus simulationStatus, double maxTimeStep) throws S //// Sum all together, y(n+1) = y(n) + h*(k1 + 2*k2 + 2*k3 + k4)/6 - - - Coordinate deltaV, deltaP, deltaR, deltaO; deltaV = k2.a.add(k3.a).multiply(2).add(k1.a).add(k4.a).multiply(store.timestep / 6); deltaP = k2.v.add(k3.v).multiply(2).add(k1.v).add(k4.v).multiply(store.timestep / 6); @@ -254,7 +253,6 @@ public void step(SimulationStatus simulationStatus, double maxTimeStep) throws S deltaO = k2.rv.add(k3.rv).multiply(2).add(k1.rv).add(k4.rv).multiply(store.timestep / 6); - status.setRocketVelocity(status.getRocketVelocity().add(deltaV)); status.setRocketPosition(status.getRocketPosition().add(deltaP)); status.setRocketRotationVelocity(status.getRocketRotationVelocity().add(deltaR)); @@ -264,6 +262,10 @@ public void step(SimulationStatus simulationStatus, double maxTimeStep) throws S w = status.getSimulationConditions().getGeodeticComputation().addCoordinate(w, status.getRocketPosition()); status.setRocketWorldPosition(w); + if (!(0 <= store.timestep)) { + // Also catches NaN + throw new IllegalArgumentException("Stepping backwards in time, timestep=" +store.timestep); + } status.setSimulationTime(status.getSimulationTime() + store.timestep); status.setPreviousTimeStep(store.timestep); @@ -325,8 +327,10 @@ private void calculateAcceleration(RK4SimulationStatus status, DataStore store) calculateForces(status, store); // Calculate mass data - store.massData = calculateMassData(status); + RigidBody structureMassData = calculateStructureMass(status); + store.motorMass = calculateMotorMass(status); + store.rocketMass = structureMassData.add( store.motorMass ); // Calculate the forces from the aerodynamic coefficients @@ -343,9 +347,9 @@ private void calculateAcceleration(RK4SimulationStatus status, DataStore store) double forceZ = store.thrustForce - store.dragForce; - store.linearAcceleration = new Coordinate(-fN / store.massData.getCG().weight, - -fSide / store.massData.getCG().weight, - forceZ / store.massData.getCG().weight); + store.linearAcceleration = new Coordinate(-fN / store.rocketMass.getMass(), + -fSide / store.rocketMass.getMass(), + forceZ / store.rocketMass.getMass()); store.linearAcceleration = store.thetaRotation.rotateZ(store.linearAcceleration); @@ -374,8 +378,8 @@ private void calculateAcceleration(RK4SimulationStatus status, DataStore store) } else { // Shift moments to CG - double Cm = store.forces.getCm() - store.forces.getCN() * store.massData.getCG().x / refLength; - double Cyaw = store.forces.getCyaw() - store.forces.getCside() * store.massData.getCG().x / refLength; + double Cm = store.forces.getCm() - store.forces.getCN() * store.rocketMass.getCM().x / refLength; + double Cyaw = store.forces.getCyaw() - store.forces.getCside() * store.rocketMass.getCM().x / refLength; // Compute moments double momX = -Cyaw * dynP * refArea * refLength; @@ -383,9 +387,9 @@ private void calculateAcceleration(RK4SimulationStatus status, DataStore store) double momZ = store.forces.getCroll() * dynP * refArea * refLength; // Compute acceleration in rocket coordinates - store.angularAcceleration = new Coordinate(momX / store.massData.getLongitudinalInertia(), - momY / store.massData.getLongitudinalInertia(), - momZ / store.massData.getRotationalInertia()); + store.angularAcceleration = new Coordinate(momX / store.rocketMass.getLongitudinalInertia(), + momY / store.rocketMass.getLongitudinalInertia(), + momZ / store.rocketMass.getRotationalInertia()); store.rollAcceleration = store.angularAcceleration.z; // TODO: LOW: This should be hypot, but does it matter? @@ -485,8 +489,9 @@ private void calculateFlightConditions(RK4SimulationStatus status, DataStore sto //// Local wind speed and direction - Coordinate windSpeed = modelWindVelocity(status); - Coordinate airSpeed = status.getRocketVelocity().add(windSpeed); + Coordinate windVelocity = modelWindVelocity(status); + store.windSpeed = windVelocity.length(); + Coordinate airSpeed = status.getRocketVelocity().add(windVelocity); airSpeed = status.getRocketOrientationQuaternion().invRotate(airSpeed); @@ -593,24 +598,30 @@ private void storeData(RK4SimulationStatus status, DataStore store) { data.setValue(FlightDataType.TYPE_MACH_NUMBER, store.flightConditions.getMach()); } - if (store.massData != null) { - data.setValue(FlightDataType.TYPE_CG_LOCATION, store.massData.getCG().x); + if (store.rocketMass != null) { + data.setValue(FlightDataType.TYPE_CG_LOCATION, store.rocketMass.getCM().x); } if (status.isLaunchRodCleared()) { // Don't include CP and stability with huge launch AOA if (store.forces != null) { data.setValue(FlightDataType.TYPE_CP_LOCATION, store.forces.getCP().x); } - if (store.forces != null && store.flightConditions != null && store.massData != null) { + if (store.forces != null && store.flightConditions != null && store.rocketMass != null) { data.setValue(FlightDataType.TYPE_STABILITY, - (store.forces.getCP().x - store.massData.getCG().x) / store.flightConditions.getRefLength()); + (store.forces.getCP().x - store.rocketMass.getCM().x) / store.flightConditions.getRefLength()); } } - if (store.massData != null) { - data.setValue(FlightDataType.TYPE_MASS, store.massData.getCG().weight); - data.setValue(FlightDataType.TYPE_PROPELLANT_MASS, store.massData.getPropellantMass()); - data.setValue(FlightDataType.TYPE_LONGITUDINAL_INERTIA, store.massData.getLongitudinalInertia()); - data.setValue(FlightDataType.TYPE_ROTATIONAL_INERTIA, store.massData.getRotationalInertia()); + + if( null != store.motorMass ){ + data.setValue(FlightDataType.TYPE_PROPELLANT_MASS, store.motorMass.getMass()); + //data.setValue(FlightDataType.TYPE_PROPELLANT_LONGITUDINAL_INERTIA, store.propellantMassData.getLongitudinalInertia()); + //data.setValue(FlightDataType.TYPE_PROPELLANT_ROTATIONAL_INERTIA, store.propellantMassData.getRotationalInertia()); + } + if (store.rocketMass != null) { + // N.B.: These refer to total mass + data.setValue(FlightDataType.TYPE_MASS, store.rocketMass.getMass()); + data.setValue(FlightDataType.TYPE_LONGITUDINAL_INERTIA, store.rocketMass.getLongitudinalInertia()); + data.setValue(FlightDataType.TYPE_ROTATIONAL_INERTIA, store.rocketMass.getRotationalInertia()); } data.setValue(FlightDataType.TYPE_THRUST_FORCE, store.thrustForce); @@ -618,11 +629,11 @@ private void storeData(RK4SimulationStatus status, DataStore store) { data.setValue(FlightDataType.TYPE_GRAVITY, store.gravity); if (status.isLaunchRodCleared() && store.forces != null) { - if (store.massData != null && store.flightConditions != null) { + if (store.rocketMass != null && store.flightConditions != null) { data.setValue(FlightDataType.TYPE_PITCH_MOMENT_COEFF, - store.forces.getCm() - store.forces.getCN() * store.massData.getCG().x / store.flightConditions.getRefLength()); + store.forces.getCm() - store.forces.getCN() * store.rocketMass.getCM().x / store.flightConditions.getRefLength()); data.setValue(FlightDataType.TYPE_YAW_MOMENT_COEFF, - store.forces.getCyaw() - store.forces.getCside() * store.massData.getCG().x / store.flightConditions.getRefLength()); + store.forces.getCyaw() - store.forces.getCside() * store.rocketMass.getCM().x / store.flightConditions.getRefLength()); } data.setValue(FlightDataType.TYPE_NORMAL_FORCE_COEFF, store.forces.getCN()); data.setValue(FlightDataType.TYPE_SIDE_FORCE_COEFF, store.forces.getCside()); @@ -705,7 +716,9 @@ private static class DataStore { public double longitudinalAcceleration = Double.NaN; - public MassData massData; + public RigidBody rocketMass; + + public RigidBody motorMass; public Coordinate coriolisAcceleration; diff --git a/core/src/net/sf/openrocket/simulation/SimulationConditions.java b/core/src/net/sf/openrocket/simulation/SimulationConditions.java index c1c5f22570..66fd5cb970 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationConditions.java +++ b/core/src/net/sf/openrocket/simulation/SimulationConditions.java @@ -9,6 +9,7 @@ import net.sf.openrocket.models.atmosphere.AtmosphericModel; import net.sf.openrocket.models.gravity.GravityModel; import net.sf.openrocket.models.wind.WindModel; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.simulation.listeners.SimulationListener; import net.sf.openrocket.util.BugException; @@ -26,9 +27,6 @@ */ public class SimulationConditions implements Monitorable, Cloneable { - private Rocket rocket; - private String motorID = null; - private Simulation simulation; // The parent simulation private double launchRodLength = 1; @@ -102,26 +100,16 @@ public void setMassCalculator(MassCalculator massCalculator) { public Rocket getRocket() { - return rocket; + return simulation.getRocket(); } - - - public void setRocket(Rocket rocket) { - if (this.rocket != null) - this.modIDadd += this.rocket.getModID(); - this.modID++; - this.rocket = rocket; - } - - - public String getMotorConfigurationID() { - return motorID; + + + public FlightConfigurationId getMotorConfigurationID() { + return simulation.getId(); } - - - public void setMotorConfigurationID(String motorID) { - this.motorID = motorID; - this.modID++; + + public FlightConfigurationId getFlightConfigurationID() { + return simulation.getId(); } @@ -309,7 +297,7 @@ public List<SimulationListener> getSimulationListenerList() { public int getModID() { //return (modID + modIDadd + rocket.getModID() + windModel.getModID() + atmosphericModel.getModID() + // gravityModel.getModID() + aerodynamicCalculator.getModID() + massCalculator.getModID()); - return (modID + modIDadd + rocket.getModID() + windModel.getModID() + atmosphericModel.getModID() + + return (modID + modIDadd + simulation.getRocket().getModID() + windModel.getModID() + atmosphericModel.getModID() + aerodynamicCalculator.getModID() + massCalculator.getModID()); } @@ -323,6 +311,7 @@ public SimulationConditions clone() { for (SimulationListener listener : this.simulationListeners) { clone.simulationListeners.add(listener.clone()); } + return clone; } catch (CloneNotSupportedException e) { throw new BugException(e); diff --git a/core/src/net/sf/openrocket/simulation/SimulationOptions.java b/core/src/net/sf/openrocket/simulation/SimulationOptions.java index 734ce1fea1..5aa4d534bf 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationOptions.java +++ b/core/src/net/sf/openrocket/simulation/SimulationOptions.java @@ -6,15 +6,16 @@ import java.util.List; import java.util.Random; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.aerodynamics.BarrowmanCalculator; -import net.sf.openrocket.formatting.MotorDescriptionSubstitutor; -import net.sf.openrocket.masscalc.BasicMassCalculator; +import net.sf.openrocket.masscalc.MassCalculator; import net.sf.openrocket.models.atmosphere.AtmosphericModel; import net.sf.openrocket.models.atmosphere.ExtendedISAModel; import net.sf.openrocket.models.gravity.GravityModel; import net.sf.openrocket.models.gravity.WGSGravityModel; import net.sf.openrocket.models.wind.PinkNoiseWindModel; -import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.util.BugException; @@ -22,12 +23,8 @@ import net.sf.openrocket.util.GeodeticComputationStrategy; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.StateChangeListener; -import net.sf.openrocket.util.Utils; import net.sf.openrocket.util.WorldCoordinate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * A class holding simulation options in basic parameter form and which functions * as a ChangeSource. A SimulationConditions instance is generated from this class @@ -37,6 +34,7 @@ */ public class SimulationOptions implements ChangeSource, Cloneable { + @SuppressWarnings("unused") private static final Logger log = LoggerFactory.getLogger(SimulationOptions.class); public static final double MAX_LAUNCH_ROD_ANGLE = Math.PI / 3; @@ -48,10 +46,6 @@ public class SimulationOptions implements ChangeSource, Cloneable { protected final Preferences preferences = Application.getPreferences(); - private final Rocket rocket; - private String motorID = null; - - /* * NOTE: When adding/modifying parameters, they must also be added to the * equals and copyFrom methods!! @@ -91,37 +85,9 @@ public class SimulationOptions implements ChangeSource, Cloneable { private List<EventListener> listeners = new ArrayList<EventListener>(); - public SimulationOptions(Rocket rocket) { - this.rocket = rocket; - } - - public Rocket getRocket() { - return rocket; + public SimulationOptions() { } - - public String getMotorConfigurationID() { - return motorID; - } - - /** - * Set the motor configuration ID. This must be a valid motor configuration ID of - * the rocket, otherwise the configuration is set to <code>null</code>. - * - * @param id the configuration to set. - */ - public void setMotorConfigurationID(String id) { - if (id != null) - id = id.intern(); - if (!rocket.isFlightConfigurationID(id)) - id = null; - if (id == motorID) - return; - motorID = id; - fireChangeEvent(); - } - - public double getLaunchRodLength() { return launchRodLength; } @@ -130,7 +96,6 @@ public void setLaunchRodLength(double launchRodLength) { if (MathUtil.equals(this.launchRodLength, launchRodLength)) return; this.launchRodLength = launchRodLength; - fireChangeEvent(); } @@ -428,38 +393,6 @@ public SimulationOptions clone() { public void copyFrom(SimulationOptions src) { - if (this.rocket == src.rocket) { - - this.motorID = src.motorID; - - } else { - - if (src.rocket.hasMotors(src.motorID)) { - // First check for exact match: - if (this.rocket.isFlightConfigurationID(src.motorID)) { - this.motorID = src.motorID; - } else { - // Try to find a closely matching motor ID - MotorDescriptionSubstitutor formatter = Application.getInjector().getInstance(MotorDescriptionSubstitutor.class); - - String motorDesc = formatter.getMotorConfigurationDescription(src.rocket, src.motorID); - String matchID = null; - - for (String id : this.rocket.getFlightConfigurationIDs()) { - String motorDesc2 = formatter.getMotorConfigurationDescription(this.rocket, id); - if (motorDesc.equals(motorDesc2)) { - matchID = id; - break; - } - } - - this.motorID = matchID; - } - } else { - this.motorID = null; - } - } - this.launchAltitude = src.launchAltitude; this.launchLatitude = src.launchLatitude; this.launchLongitude = src.launchLongitude; @@ -559,9 +492,7 @@ public boolean equals(Object other) { if (!(other instanceof SimulationOptions)) return false; SimulationOptions o = (SimulationOptions) other; - return ((this.rocket == o.rocket) && - Utils.equals(this.motorID, o.motorID) && - MathUtil.equals(this.launchAltitude, o.launchAltitude) && + return (MathUtil.equals(this.launchAltitude, o.launchAltitude) && MathUtil.equals(this.launchLatitude, o.launchLatitude) && MathUtil.equals(this.launchLongitude, o.launchLongitude) && MathUtil.equals(this.launchPressure, o.launchPressure) && @@ -582,9 +513,7 @@ public boolean equals(Object other) { */ @Override public int hashCode() { - if (motorID == null) - return rocket.hashCode(); - return rocket.hashCode() + motorID.hashCode(); + return 0; } @Override @@ -614,9 +543,7 @@ private void fireChangeEvent() { // TODO: HIGH: Clean up public SimulationConditions toSimulationConditions() { SimulationConditions conditions = new SimulationConditions(); - - conditions.setRocket((Rocket) getRocket().copy()); - conditions.setMotorConfigurationID(getMotorConfigurationID()); + conditions.setLaunchRodLength(getLaunchRodLength()); conditions.setLaunchRodAngle(getLaunchRodAngle()); conditions.setLaunchRodDirection(getLaunchRodDirection()); @@ -638,7 +565,7 @@ public SimulationConditions toSimulationConditions() { conditions.setGravityModel(gravityModel); conditions.setAerodynamicCalculator(new BarrowmanCalculator()); - conditions.setMassCalculator(new BasicMassCalculator()); + conditions.setMassCalculator(new MassCalculator()); conditions.setTimeStep(getTimeStep()); conditions.setMaximumAngleStep(getMaximumStepAngle()); diff --git a/core/src/net/sf/openrocket/simulation/SimulationStatus.java b/core/src/net/sf/openrocket/simulation/SimulationStatus.java index bad65b1c90..9ea75832d8 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationStatus.java +++ b/core/src/net/sf/openrocket/simulation/SimulationStatus.java @@ -1,15 +1,18 @@ package net.sf.openrocket.simulation; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import net.sf.openrocket.aerodynamics.AerodynamicCalculator; import net.sf.openrocket.aerodynamics.FlightConditions; import net.sf.openrocket.aerodynamics.WarningSet; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstanceConfiguration; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfigurationId; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RocketComponent; @@ -25,11 +28,11 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ + public class SimulationStatus implements Monitorable { private SimulationConditions simulationConditions; - private Configuration configuration; - private MotorInstanceConfiguration motorConfiguration; + private FlightConfiguration configuration; private FlightDataBranch flightData; private double time; @@ -45,9 +48,9 @@ public class SimulationStatus implements Monitorable { private double effectiveLaunchRodLength; - // Set of burnt out motors - Set<MotorId> motorBurntOut = new HashSet<MotorId>(); - + // Set of all motors + private List<MotorClusterState> motorStateList = new ArrayList<MotorClusterState>(); + /** Nanosecond time when the simulation was started. */ private long simulationStartWallTime = Long.MIN_VALUE; @@ -85,13 +88,10 @@ public class SimulationStatus implements Monitorable { private int modID = 0; private int modIDadd = 0; - public SimulationStatus(Configuration configuration, - MotorInstanceConfiguration motorConfiguration, - SimulationConditions simulationConditions) { + public SimulationStatus(FlightConfiguration configuration, SimulationConditions simulationConditions) { this.simulationConditions = simulationConditions; this.configuration = configuration; - this.motorConfiguration = motorConfiguration; this.time = 0; this.previousTimeStep = this.simulationConditions.getTimeStep(); @@ -102,7 +102,6 @@ public SimulationStatus(Configuration configuration, // Initialize to roll angle with least stability w.r.t. the wind Quaternion o; FlightConditions cond = new FlightConditions(this.configuration); - this.simulationConditions.getAerodynamicCalculator().getWorstCP(this.configuration, cond, null); double angle = -cond.getTheta() - (Math.PI / 2.0 - this.simulationConditions.getLaunchRodDirection()); o = Quaternion.rotation(new Coordinate(0, 0, angle)); @@ -119,7 +118,7 @@ public SimulationStatus(Configuration configuration, */ double length = this.simulationConditions.getLaunchRodLength(); double lugPosition = Double.NaN; - for (RocketComponent c : this.configuration) { + for (RocketComponent c : this.configuration.getActiveComponents()) { if (c instanceof LaunchLug) { double pos = c.toAbsolute(new Coordinate(c.getLength()))[0].x; if (Double.isNaN(lugPosition) || pos > lugPosition) { @@ -146,8 +145,8 @@ public SimulationStatus(Configuration configuration, this.launchRodCleared = false; this.apogeeReached = false; + this.populateMotors(); this.warnings = new WarningSet(); - } /** @@ -164,7 +163,6 @@ public SimulationStatus(Configuration configuration, public SimulationStatus(SimulationStatus orig) { this.simulationConditions = orig.simulationConditions.clone(); this.configuration = orig.configuration.clone(); - this.motorConfiguration = orig.motorConfiguration.clone(); // FlightData is not cloned. this.flightData = orig.flightData; this.time = orig.time; @@ -181,11 +179,15 @@ public SimulationStatus(SimulationStatus orig) { this.launchRodCleared = orig.launchRodCleared; this.apogeeReached = orig.apogeeReached; this.tumbling = orig.tumbling; - this.motorBurntOut = orig.motorBurntOut; + + this.configuration.copyStages(orig.configuration); this.deployedRecoveryDevices.clear(); this.deployedRecoveryDevices.addAll(orig.deployedRecoveryDevices); + this.motorStateList.clear(); + this.motorStateList.addAll(orig.motorStateList); + this.eventQueue.clear(); this.eventQueue.addAll(orig.eventQueue); @@ -208,33 +210,36 @@ public void setSimulationTime(double time) { public double getSimulationTime() { return time; } - - - public void setConfiguration(Configuration configuration) { + + public void setConfiguration(FlightConfiguration configuration) { if (this.configuration != null) this.modIDadd += this.configuration.getModID(); this.modID++; this.configuration = configuration; } - - public Configuration getConfiguration() { - return configuration; + public Collection<MotorClusterState> getMotors() { + return motorStateList; } - - public void setMotorConfiguration(MotorInstanceConfiguration motorConfiguration) { - if (this.motorConfiguration != null) - this.modIDadd += this.motorConfiguration.getModID(); - this.modID++; - this.motorConfiguration = motorConfiguration; + public Collection<MotorClusterState> getActiveMotors() { + List<MotorClusterState> activeList = new ArrayList<MotorClusterState>(); + for( MotorClusterState state: this.motorStateList ){ + if(( ! state.isSpent()) && (this.configuration.isComponentActive( state.getMount()))){ + activeList.add( state ); + } + } + + return activeList; } - - public MotorInstanceConfiguration getMotorConfiguration() { - return motorConfiguration; + public FlightConfiguration getConfiguration() { + return configuration; } + public FlightConfiguration getFlightConfiguration() { + return configuration; + } public void setFlightData(FlightDataBranch flightData) { if (this.flightData != null) @@ -248,7 +253,6 @@ public FlightDataBranch getFlightData() { return flightData; } - public double getPreviousTimeStep() { return previousTimeStep; } @@ -290,10 +294,12 @@ public Coordinate getRocketVelocity() { } - public boolean addBurntOutMotor(MotorId motor) { - return motorBurntOut.add(motor); - } - + public boolean moveBurntOutMotor( final MotorConfigurationId motor) { + // get motor from normal list + // remove motor from 'normal' list + // add to spent list + return false; + } public Quaternion getRocketOrientationQuaternion() { return orientation; @@ -439,12 +445,10 @@ public void setSimulationConditions(SimulationConditions simulationConditions) { this.simulationConditions = simulationConditions; } - public SimulationConditions getSimulationConditions() { return simulationConditions; } - /** * Store extra data available for use by simulation listeners. The data can be retrieved * using {@link #getExtraData(String)}. @@ -485,13 +489,42 @@ public SimulationStatus clone() { } } - @Override public int getModID() { return (modID + modIDadd + simulationConditions.getModID() + configuration.getModID() + - motorConfiguration.getModID() + flightData.getModID() + deployedRecoveryDevices.getModID() + + flightData.getModID() + deployedRecoveryDevices.getModID() + eventQueue.getModID() + warnings.getModID()); } + public String toEventDebug(){ + final StringBuilder buf = new StringBuilder(""); + for ( FlightEvent event : this.eventQueue){ + buf.append(" [t:"+event.getType()+" @"+ event.getTime()); + if( null != event.getSource()){ + buf.append(" src:"+event.getSource().getName()); + } + if( null != event.getData()){ + buf.append(" data:"+event.getData().getClass().getSimpleName()); + } + buf.append("]\n"); + } + return buf.toString(); + } + + public String toMotorsDebug(){ + final StringBuilder buf = new StringBuilder("MotorState list:\n"); + for ( MotorClusterState state : this.motorStateList){ + buf.append(" ["+state.toDescription()+"]\n"); + } + return buf.toString(); + } + private void populateMotors(){ + motorStateList.clear(); + for( MotorConfiguration motorConfig : this.configuration.getAllMotors() ) { + MotorClusterState simMotor = new MotorClusterState( motorConfig); + this.motorStateList.add( simMotor); + } + } + } diff --git a/core/src/net/sf/openrocket/simulation/ThrustState.java b/core/src/net/sf/openrocket/simulation/ThrustState.java new file mode 100644 index 0000000000..37a71d87dd --- /dev/null +++ b/core/src/net/sf/openrocket/simulation/ThrustState.java @@ -0,0 +1,102 @@ +package net.sf.openrocket.simulation; + + +public enum ThrustState { + SPENT("Spent", "Finished Producing thrust.", null) + ,DELAYING("Delaying", " After Burnout, but before ejection", SPENT){ + @Override + public boolean needsSimulation(){ return true;} + } + ,THRUSTING("Thrusting", "Currently Producing thrust", DELAYING){ + @Override + public boolean isThrusting(){ return true; } + @Override + public boolean needsSimulation(){ return true;} + } + ,ARMED("Armed", "Armed, but not yet lit.", THRUSTING) + ; + + private final static int SEQUENCE_NUMBER_END = 10; // arbitrary number + + private final String name; + private final String description; + private final int sequenceNumber; + private final ThrustState nextState; + + ThrustState( final String name, final String description, final ThrustState _nextState) { + this.name = name; + this.description = description; + if( null == _nextState ){ + this.sequenceNumber = SEQUENCE_NUMBER_END; + this.nextState = null; + }else{ + this.sequenceNumber = -1 + _nextState.getSequenceNumber() ; + this.nextState = _nextState; + } + } + + /** + * Return a short name of this motor type. + * @return a short name of the motor type. + */ + public String getName() { + return this.name; + } + + /* + * + * @Return a MotorState which should follow this one + */ + public ThrustState getNext( ){ + return this.nextState; + } + + /** + * Return a long description of this motor type. + * @return a description of the motor type. + */ + public String getDescription() { + return this.description; + } + + /** + * Sequence numbers have no intrinsic meaning, but their sequence (and relative value) + * indicate which states occur before other states. + * @see isAfter(MotorState) + * @see isBefore(MotorState) + * @return integer indicating this state's place in the allowable sequence + */ + public int getSequenceNumber(){ + return this.sequenceNumber; + } + + public boolean isAfter( final ThrustState other ){ + return this.sequenceNumber > other.sequenceNumber; + } + + public boolean isBefore( final ThrustState other ){ + return this.sequenceNumber < other.sequenceNumber; + } + + /* + * If this motor is in a state which produces thrust + */ + public boolean isThrusting(){ + return false; + } + + /** + * This flag determines whether the motor has its state updated, and updates of cg and thrust updated. + * A motor instance will always receive events -- which may affect the simulation yes/no state + * + * @return should this motor be simulated + */ + public boolean needsSimulation(){ + return false; + } + + @Override + public String toString() { + return name; + } +} diff --git a/core/src/net/sf/openrocket/simulation/customexpression/IndexExpression.java b/core/src/net/sf/openrocket/simulation/customexpression/IndexExpression.java index c1e240cd43..acde4dcb53 100644 --- a/core/src/net/sf/openrocket/simulation/customexpression/IndexExpression.java +++ b/core/src/net/sf/openrocket/simulation/customexpression/IndexExpression.java @@ -6,7 +6,6 @@ import org.slf4j.LoggerFactory; import de.congrace.exp4j.Calculable; -import de.congrace.exp4j.ExpressionBuilder; import de.congrace.exp4j.Variable; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.logging.Markers; diff --git a/core/src/net/sf/openrocket/simulation/extension/impl/ScriptingSimulationListener.java b/core/src/net/sf/openrocket/simulation/extension/impl/ScriptingSimulationListener.java index 5eab2dfa8e..6067378f47 100644 --- a/core/src/net/sf/openrocket/simulation/extension/impl/ScriptingSimulationListener.java +++ b/core/src/net/sf/openrocket/simulation/extension/impl/ScriptingSimulationListener.java @@ -6,16 +6,19 @@ import javax.script.Invocable; import javax.script.ScriptException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; +import net.sf.openrocket.motor.MotorConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.simulation.AccelerationData; import net.sf.openrocket.simulation.FlightEvent; -import net.sf.openrocket.simulation.MassData; +import net.sf.openrocket.simulation.MotorClusterState; import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.exception.SimulationListenerException; @@ -25,9 +28,6 @@ import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class ScriptingSimulationListener implements SimulationListener, SimulationComputationListener, SimulationEventListener, Cloneable { private final static Logger logger = LoggerFactory.getLogger(ScriptingSimulationListener.class); @@ -105,7 +105,7 @@ public boolean handleFlightEvent(SimulationStatus status, FlightEvent event) thr } @Override - public boolean motorIgnition(SimulationStatus status, MotorId motorId, MotorMount mount, MotorInstance instance) throws SimulationException { + public boolean motorIgnition(SimulationStatus status, MotorConfigurationId motorId, MotorMount mount, MotorClusterState instance) throws SimulationException { return invoke(Boolean.class, true, "motorIgnition", status, motorId, mount, instance); } @@ -144,8 +144,8 @@ public double preGravityModel(SimulationStatus status) throws SimulationExceptio } @Override - public MassData preMassCalculation(SimulationStatus status) throws SimulationException { - return invoke(MassData.class, null, "preMassCalculation", status); + public RigidBody preMassCalculation(SimulationStatus status) throws SimulationException { + return invoke(RigidBody.class, null, "preMassCalculation", status); } @Override @@ -184,8 +184,8 @@ public double postGravityModel(SimulationStatus status, double gravity) throws S } @Override - public MassData postMassCalculation(SimulationStatus status, MassData massData) throws SimulationException { - return invoke(MassData.class, null, "postMassCalculation", status, massData); + public RigidBody postMassCalculation(SimulationStatus status, RigidBody RigidBody) throws SimulationException { + return invoke(RigidBody.class, null, "postMassCalculation", status, RigidBody); } @Override diff --git a/core/src/net/sf/openrocket/simulation/listeners/AbstractSimulationListener.java b/core/src/net/sf/openrocket/simulation/listeners/AbstractSimulationListener.java index 1ad3ef4ad6..b1244fbc4c 100644 --- a/core/src/net/sf/openrocket/simulation/listeners/AbstractSimulationListener.java +++ b/core/src/net/sf/openrocket/simulation/listeners/AbstractSimulationListener.java @@ -2,14 +2,14 @@ import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; +import net.sf.openrocket.motor.MotorConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.simulation.AccelerationData; import net.sf.openrocket.simulation.FlightEvent; -import net.sf.openrocket.simulation.MassData; +import net.sf.openrocket.simulation.MotorClusterState; import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.util.BugException; @@ -72,7 +72,7 @@ public boolean handleFlightEvent(SimulationStatus status, FlightEvent event) thr } @Override - public boolean motorIgnition(SimulationStatus status, MotorId motorId, MotorMount mount, MotorInstance instance) throws SimulationException { + public boolean motorIgnition(SimulationStatus status, MotorConfigurationId motorId, MotorMount mount, MotorClusterState instance) throws SimulationException { return true; } @@ -111,7 +111,7 @@ public double preGravityModel(SimulationStatus status) throws SimulationExceptio } @Override - public MassData preMassCalculation(SimulationStatus status) throws SimulationException { + public RigidBody preMassCalculation(SimulationStatus status) throws SimulationException { return null; } @@ -151,7 +151,7 @@ public double postGravityModel(SimulationStatus status, double gravity) throws S } @Override - public MassData postMassCalculation(SimulationStatus status, MassData massData) throws SimulationException { + public RigidBody postMassCalculation(SimulationStatus status, RigidBody RigidBody) throws SimulationException { return null; } diff --git a/core/src/net/sf/openrocket/simulation/listeners/SimulationComputationListener.java b/core/src/net/sf/openrocket/simulation/listeners/SimulationComputationListener.java index 88422d72c8..656d2fea20 100644 --- a/core/src/net/sf/openrocket/simulation/listeners/SimulationComputationListener.java +++ b/core/src/net/sf/openrocket/simulation/listeners/SimulationComputationListener.java @@ -2,9 +2,9 @@ import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; import net.sf.openrocket.simulation.AccelerationData; -import net.sf.openrocket.simulation.MassData; import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.util.Coordinate; @@ -55,9 +55,9 @@ public AerodynamicForces preAerodynamicCalculation(SimulationStatus status) public AerodynamicForces postAerodynamicCalculation(SimulationStatus status, AerodynamicForces forces) throws SimulationException; - public MassData preMassCalculation(SimulationStatus status) throws SimulationException; + public RigidBody preMassCalculation(SimulationStatus status) throws SimulationException; - public MassData postMassCalculation(SimulationStatus status, MassData massData) throws SimulationException; + public RigidBody postMassCalculation(SimulationStatus status, RigidBody massData) throws SimulationException; public double preSimpleThrustCalculation(SimulationStatus status) throws SimulationException; diff --git a/core/src/net/sf/openrocket/simulation/listeners/SimulationEventListener.java b/core/src/net/sf/openrocket/simulation/listeners/SimulationEventListener.java index 300fb86458..218fed0742 100644 --- a/core/src/net/sf/openrocket/simulation/listeners/SimulationEventListener.java +++ b/core/src/net/sf/openrocket/simulation/listeners/SimulationEventListener.java @@ -1,10 +1,10 @@ package net.sf.openrocket.simulation.listeners; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; +import net.sf.openrocket.motor.MotorConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.simulation.FlightEvent; +import net.sf.openrocket.simulation.MotorClusterState; import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.exception.SimulationException; @@ -43,8 +43,8 @@ public interface SimulationEventListener { * @param instance the motor instance being ignited * @return <code>true</code> to ignite the motor, <code>false</code> to abort ignition */ - public boolean motorIgnition(SimulationStatus status, MotorId motorId, MotorMount mount, - MotorInstance instance) throws SimulationException; + public boolean motorIgnition(SimulationStatus status, MotorConfigurationId motorId, MotorMount mount, + MotorClusterState instance) throws SimulationException; /** diff --git a/core/src/net/sf/openrocket/simulation/listeners/SimulationListenerHelper.java b/core/src/net/sf/openrocket/simulation/listeners/SimulationListenerHelper.java index d0a64fe509..903971481b 100644 --- a/core/src/net/sf/openrocket/simulation/listeners/SimulationListenerHelper.java +++ b/core/src/net/sf/openrocket/simulation/listeners/SimulationListenerHelper.java @@ -7,14 +7,14 @@ import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; import net.sf.openrocket.aerodynamics.Warning; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstance; +import net.sf.openrocket.motor.MotorConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.simulation.AccelerationData; import net.sf.openrocket.simulation.FlightEvent; -import net.sf.openrocket.simulation.MassData; +import net.sf.openrocket.simulation.MotorClusterState; import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.util.Coordinate; @@ -167,19 +167,19 @@ public static boolean fireHandleFlightEvent(SimulationStatus status, FlightEvent * * @return <code>true</code> to handle the event normally, <code>false</code> to skip event. */ - public static boolean fireMotorIgnition(SimulationStatus status, MotorId motorId, MotorMount mount, - MotorInstance instance) throws SimulationException { - boolean b; + public static boolean fireMotorIgnition(SimulationStatus status, MotorConfigurationId motorId, MotorMount mount, + MotorClusterState instance) throws SimulationException { + boolean result; int modID = status.getModID(); // Contains also motor instance for (SimulationListener l : status.getSimulationConditions().getSimulationListenerList()) { if (l instanceof SimulationEventListener) { - b = ((SimulationEventListener) l).motorIgnition(status, motorId, mount, instance); + result = ((SimulationEventListener) l).motorIgnition(status, motorId, mount, instance); if (modID != status.getModID()) { warn(status, l); modID = status.getModID(); } - if (b == false) { + if ( false == result ) { warn(status, l); return false; } @@ -196,17 +196,17 @@ public static boolean fireMotorIgnition(SimulationStatus status, MotorId motorId */ public static boolean fireRecoveryDeviceDeployment(SimulationStatus status, RecoveryDevice device) throws SimulationException { - boolean b; + boolean result; int modID = status.getModID(); // Contains also motor instance for (SimulationListener l : status.getSimulationConditions().getSimulationListenerList()) { if (l instanceof SimulationEventListener) { - b = ((SimulationEventListener) l).recoveryDeviceDeployment(status, device); + result = ((SimulationEventListener) l).recoveryDeviceDeployment(status, device); if (modID != status.getModID()) { warn(status, l); modID = status.getModID(); } - if (b == false) { + if (false == result) { warn(status, l); return false; } @@ -502,9 +502,9 @@ public static AerodynamicForces firePostAerodynamicCalculation(SimulationStatus * * @return <code>null</code> normally, or overriding mass data. */ - public static MassData firePreMassCalculation(SimulationStatus status) + public static RigidBody firePreMassCalculation(SimulationStatus status) throws SimulationException { - MassData mass; + RigidBody mass; int modID = status.getModID(); for (SimulationListener l : status.getSimulationConditions().getSimulationListenerList()) { @@ -526,10 +526,10 @@ public static MassData firePreMassCalculation(SimulationStatus status) /** * Fire postMassCalculation event. * - * @return the aerodynamic forces to use. + * @return the resultant mass data */ - public static MassData firePostMassCalculation(SimulationStatus status, MassData mass) throws SimulationException { - MassData m; + public static RigidBody firePostMassCalculation(SimulationStatus status, RigidBody mass) throws SimulationException { + RigidBody m; int modID = status.getModID(); for (SimulationListener l : status.getSimulationConditions().getSimulationListenerList()) { diff --git a/core/src/net/sf/openrocket/simulation/listeners/example/DampingMoment.java b/core/src/net/sf/openrocket/simulation/listeners/example/DampingMoment.java index 3e58beb5ef..cb8bc78c8d 100644 --- a/core/src/net/sf/openrocket/simulation/listeners/example/DampingMoment.java +++ b/core/src/net/sf/openrocket/simulation/listeners/example/DampingMoment.java @@ -6,8 +6,8 @@ import net.sf.openrocket.aerodynamics.AerodynamicCalculator; import net.sf.openrocket.aerodynamics.AerodynamicForces; import net.sf.openrocket.aerodynamics.FlightConditions; -import net.sf.openrocket.motor.MotorId; -import net.sf.openrocket.motor.MotorInstanceConfiguration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.simulation.FlightDataType; @@ -15,12 +15,13 @@ import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.listeners.AbstractSimulationListener; import net.sf.openrocket.unit.UnitGroup; -import net.sf.openrocket.util.Coordinate; public class DampingMoment extends AbstractSimulationListener { private static final FlightDataType type = FlightDataType.getType("Damping moment coefficient", "Cdm", UnitGroup.UNITS_COEFFICIENT); - private static final FlightDataType[] typeList = { type }; + + // unused + //private static final FlightDataType[] typeList = { type }; @Override public FlightConditions postFlightConditions(SimulationStatus status, FlightConditions flightConditions) throws SimulationException { @@ -66,11 +67,10 @@ private double calculate(SimulationStatus status, FlightConditions flightConditi // find the maximum distance from nose to nozzle. double nozzleDistance = 0; - for (MotorId id : status.getMotorConfiguration().getMotorIDs()) { - MotorInstanceConfiguration config = status.getMotorConfiguration(); - Coordinate position = config.getMotorPosition(id); - - double x = position.x + config.getMotorInstance(id).getParentMotor().getLength(); + FlightConfiguration config = status.getConfiguration(); + for (MotorConfiguration inst : config.getActiveMotors()) { + double x_position= inst.getX(); + double x = x_position + inst.getMotor().getLaunchCGx(); if (x > nozzleDistance) { nozzleDistance = x; } @@ -97,7 +97,7 @@ private double calculate(SimulationStatus status, FlightConditions flightConditi double CNa = entry.getValue().getCNa(); //? double Cp = entry.getValue().getCP().length(); - double z = comp.getPositionValue(); //? + double z = comp.getAxialOffset(); aerodynamicPart += CNa * Math.pow(z - Cp, 2); } diff --git a/core/src/net/sf/openrocket/simulation/listeners/example/RollControlListener.java b/core/src/net/sf/openrocket/simulation/listeners/example/RollControlListener.java index 68063cb40a..55a557d709 100644 --- a/core/src/net/sf/openrocket/simulation/listeners/example/RollControlListener.java +++ b/core/src/net/sf/openrocket/simulation/listeners/example/RollControlListener.java @@ -36,7 +36,7 @@ public class RollControlListener extends AbstractSimulationListener { // Maximum control fin angle (rad) private static final double MAX_ANGLE = 15 * Math.PI / 180; - + /* * PID parameters * @@ -47,9 +47,9 @@ public class RollControlListener extends AbstractSimulationListener { private static final double KP = 0.007; private static final double KI = 0.2; - - - + + + private double rollrate; private double prevTime = 0; @@ -58,7 +58,7 @@ public class RollControlListener extends AbstractSimulationListener { private double finPosition = 0; - + @Override public FlightConditions postFlightConditions(SimulationStatus status, FlightConditions flightConditions) { // Store the current roll rate for later use @@ -78,7 +78,7 @@ public void postStep(SimulationStatus status) throws SimulationException { // Find the fin set named CONTROL FinSet finset = null; - for (RocketComponent c : status.getConfiguration()) { + for (RocketComponent c : status.getConfiguration().getActiveComponents()) { if ((c instanceof FinSet) && (c.getName().equals(CONTROL_FIN_NAME))) { finset = (FinSet) c; break; @@ -88,12 +88,12 @@ public void postStep(SimulationStatus status) throws SimulationException { throw new SimulationException("A fin set with name '" + CONTROL_FIN_NAME + "' was not found"); } - + // Determine time step double deltaT = status.getSimulationTime() - prevTime; prevTime = status.getSimulationTime(); - + // PID controller double error = SETPOINT - rollrate; @@ -103,7 +103,7 @@ public void postStep(SimulationStatus status) throws SimulationException { double value = p + i; - + // Clamp the fin angle between -MAX_ANGLE and MAX_ANGLE if (Math.abs(value) > MAX_ANGLE) { System.err.printf("Attempting to set angle %.1f at t=%.3f, clamping.\n", @@ -111,7 +111,7 @@ public void postStep(SimulationStatus status) throws SimulationException { value = MathUtil.clamp(value, -MAX_ANGLE, MAX_ANGLE); } - + // Limit the fin turn rate if (finPosition < value) { finPosition = Math.min(finPosition + TURNRATE * deltaT, value); diff --git a/core/src/net/sf/openrocket/startup/Preferences.java b/core/src/net/sf/openrocket/startup/Preferences.java index 4a542a4d3a..480f990cbd 100644 --- a/core/src/net/sf/openrocket/startup/Preferences.java +++ b/core/src/net/sf/openrocket/startup/Preferences.java @@ -18,6 +18,7 @@ import net.sf.openrocket.rocketcomponent.InternalComponent; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.MassObject; +import net.sf.openrocket.rocketcomponent.RailButton; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.TubeFinSet; @@ -57,6 +58,7 @@ public abstract class Preferences implements ChangeSource { public static final String MOTOR_DIAMETER_FILTER = "MotorDiameterMatch"; public static final String MOTOR_HIDE_SIMILAR = "MotorHideSimilar"; + public static final String MOTOR_HIDE_UNAVAILABLE = "MotorHideUnavailable"; // Node names public static final String PREFERRED_THRUST_CURVE_MOTOR_NODE = "preferredThrustCurveMotors"; @@ -758,6 +760,7 @@ private static class StaticFieldHolder { DEFAULT_COLORS.put(TubeFinSet.class, "0,0,200"); DEFAULT_COLORS.put(FinSet.class, "0,0,200"); DEFAULT_COLORS.put(LaunchLug.class, "0,0,180"); + DEFAULT_COLORS.put(RailButton.class, "0,0,180"); DEFAULT_COLORS.put(InternalComponent.class, "170,0,100"); DEFAULT_COLORS.put(MassObject.class, "0,0,0"); DEFAULT_COLORS.put(RecoveryDevice.class, "255,0,0"); diff --git a/core/src/net/sf/openrocket/thrustcurve/Base64Decoder.java b/core/src/net/sf/openrocket/thrustcurve/Base64Decoder.java new file mode 100644 index 0000000000..dea1b33485 --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/Base64Decoder.java @@ -0,0 +1,122 @@ +package net.sf.openrocket.thrustcurve; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; + +public abstract class Base64Decoder { + + private static final String BASE64_CHARS = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + private static final char PAD_CHAR = '='; + + private final static short[] _charToBits = new short[128]; + + static { + + for (int i = 0; i < _charToBits.length; i++) + _charToBits[i] = -1; + + for (int i = 0; i < BASE64_CHARS.length(); i++) + _charToBits[BASE64_CHARS.charAt(i)] = (byte) i; + _charToBits[PAD_CHAR] = 0; + + } + + /** + * Decode the specified Base64 string and write binary data + * to the given stream. + * @param str Base64 encoded string + * @param w output stream + */ + public static String decodeData(String str) throws IOException + { + StringReader r; + int c1; + + if (str == null || str.length() < 1) + return null; + + r = new StringReader(str); + + StringWriter w = new StringWriter(); + + // spin through the input string + c1 = readToNonSpace(r); + while (c1 > 0) + { + int c2, c3, c4; + int p1, p2, p3, p4; + int pad, n; + + pad = 0; + + c2 = readToNonSpace(r); + c3 = readToNonSpace(r); + c4 = readToNonSpace(r); + if (c4 < 0) + throw new IllegalArgumentException("Encoded string ends prematurely."); + + p1 = charToBits(c1); + p2 = charToBits(c2); + + if (c3 == PAD_CHAR) + { + p3 = 0; + pad++; + } + else + p3 = charToBits(c3); + + if (c4 == PAD_CHAR) + { + p4 = 0; + pad++; + } + else + p4 = charToBits(c4); + + if (p1 < 0 || p2 < 0 || p3 < 0 || p4 < 0) + throw new IllegalArgumentException("Encoded string contains invalid characters."); + + n = (p1 << 18) | (p2 << 12) | (p3 << 6) | p4; + + w.write((byte) ((n & 0xFF0000) >> 16)); + if (pad < 2) + w.write((byte) ((n & 0x00FF00) >> 8)); + if (pad < 1) + w.write((byte) (n & 0x0000FF)); + + c1 = readToNonSpace(r); + if (c1 > 0 && pad > 0) + throw new IllegalArgumentException("Extra characters found after padding."); + } + + return w.toString(); + } + + + private static int readToNonSpace(Reader r) + throws IOException + { + int c; + + c = r.read(); + while (c >= 0 && Character.isWhitespace(c)) + c = r.read(); + + return c; + } + + private static int charToBits(int c) + { + // use it to look up the value + if (c < 0 || c >= _charToBits.length) + return -1; + else + return _charToBits[c]; + } + + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/DownloadRequest.java b/core/src/net/sf/openrocket/thrustcurve/DownloadRequest.java new file mode 100644 index 0000000000..d49d7d4a57 --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/DownloadRequest.java @@ -0,0 +1,43 @@ +package net.sf.openrocket.thrustcurve; + +import java.util.ArrayList; + +class DownloadRequest { + + private ArrayList<Integer> motorIds = new ArrayList<Integer>(); + + private String format = null; + + public void add(Integer motorId) { + this.motorIds.add(motorId); + } + + public void setFormat(String format) { + this.format = format; + } + + @Override + public String toString() { + StringBuilder w = new StringBuilder(); + + w.append("<?xml version=\"1.0\" encoding=\"ascii\"?>\n"); + w.append("<download-request\n"); + w.append(" xmlns=\"http://www.thrustcurve.org/2008/DownloadRequest\"\n"); + w.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); + w.append(" xsi:schemaLocation=\"http://www.thrustcurve.org/2008/DownloadRequest http://www.thrustcurve.org/2008/download-request.xsd\">\n"); + + if (format != null) { + w.append(" <format>").append(format).append("</format>\n"); + } + + w.append(" <motor-ids>\n"); + for (Integer i : motorIds) { + w.append(" <id>").append(i).append("</id>\n"); + } + w.append(" </motor-ids>\n"); + w.append("</download-request>\n"); + return w.toString(); + } + + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/DownloadResponse.java b/core/src/net/sf/openrocket/thrustcurve/DownloadResponse.java new file mode 100644 index 0000000000..c7a49239ec --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/DownloadResponse.java @@ -0,0 +1,41 @@ +package net.sf.openrocket.thrustcurve; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class DownloadResponse { + + private Map<Integer,List<MotorBurnFile>> data = new HashMap<Integer,List<MotorBurnFile>>(); + + private String error = null; + + public void add( MotorBurnFile mbd ) { + List<MotorBurnFile> currentData = data.get(mbd.getMotorId()); + if ( currentData == null ) { + currentData = new ArrayList<MotorBurnFile>(); + data.put(mbd.getMotorId(), currentData); + } + currentData.add(mbd); + } + + public List<MotorBurnFile> getData(Integer motor_id) { + return data.get(motor_id); + } + + public void setError(String error) { + this.error = error; + } + + public String getError() { + return error; + } + + @Override + public String toString() { + return "DownloadResponse [error=" + error + ", data=" + data + "]"; + } + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/DownloadResponseParser.java b/core/src/net/sf/openrocket/thrustcurve/DownloadResponseParser.java new file mode 100644 index 0000000000..3941afad21 --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/DownloadResponseParser.java @@ -0,0 +1,75 @@ +package net.sf.openrocket.thrustcurve; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.file.simplesax.ElementHandler; +import net.sf.openrocket.file.simplesax.SimpleSAX; + +public class DownloadResponseParser implements ElementHandler { + + private static final String thrustcurveURI = "http://www.thrustcurve.org/2009/DownloadResponse"; + + private static final String root_tag = "download-response"; + private static final String results_tag = "results"; + private static final String result_tag = "result"; + private static final String motor_id_tag = "motor-id"; + private static final String simfile_id_tag = "simfile-id"; + private static final String format_tag = "format"; + private static final String source_tag = "source"; + private static final String license_tag = "license"; + private static final String data_tag = "data"; + private static final String error_tag = "error"; + + private DownloadResponse response = new DownloadResponse(); + + private MotorBurnFile motorBurnFile; + + private DownloadResponseParser() { + }; + + public static DownloadResponse parse(InputStream in) throws IOException, SAXException { + + DownloadResponseParser handler = new DownloadResponseParser(); + WarningSet warnings = new WarningSet(); + SimpleSAX.readXML(new InputSource(in), handler, warnings); + + return handler.response; + + } + + @Override + public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException { + if (result_tag.equals(element)) { + motorBurnFile = new MotorBurnFile(); + } + return this; + } + + @Override + public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException { + if (result_tag.equals(element)) { + response.add(motorBurnFile); + } else if (motor_id_tag.equals(element)) { + motorBurnFile.setMotorId(Integer.parseInt(content)); + } else if (format_tag.equals(element)) { + motorBurnFile.setFiletype(content); + } else if (data_tag.equals(element)) { + try { + motorBurnFile.decodeFile(content); + } catch (IOException e) { + throw new SAXException(e); + } + } + } + + @Override + public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException { + } + +} \ No newline at end of file diff --git a/core/src/net/sf/openrocket/thrustcurve/MotorBurnFile.java b/core/src/net/sf/openrocket/thrustcurve/MotorBurnFile.java new file mode 100644 index 0000000000..4f07c9551a --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/MotorBurnFile.java @@ -0,0 +1,84 @@ +package net.sf.openrocket.thrustcurve; + +import java.io.IOException; +import java.io.StringReader; +import java.util.List; + +import net.sf.openrocket.file.motor.RASPMotorLoader; +import net.sf.openrocket.file.motor.RockSimMotorLoader; +import net.sf.openrocket.motor.ThrustCurveMotor; + +public class MotorBurnFile { + + private Integer motorId; + private String filetype; + private ThrustCurveMotor.Builder thrustCurveMotor; + + public void init() { + this.motorId = null; + this.filetype = null; + this.thrustCurveMotor = null; + } + + @Override + public MotorBurnFile clone() { + MotorBurnFile clone = new MotorBurnFile(); + clone.motorId = this.motorId; + clone.filetype = this.filetype; + clone.thrustCurveMotor = this.thrustCurveMotor; + return clone; + } + + public void decodeFile(String data) throws IOException { + data = Base64Decoder.decodeData(data); + try { + if (SupportedFileTypes.RASP_FORMAT.equals(filetype)) { + RASPMotorLoader loader = new RASPMotorLoader(); + List<ThrustCurveMotor.Builder> motors = loader.load(new StringReader(data), "download"); + this.thrustCurveMotor = (ThrustCurveMotor.Builder)motors.get(0); + } else if (SupportedFileTypes.ROCKSIM_FORMAT.equals(filetype)) { + RockSimMotorLoader loader = new RockSimMotorLoader(); + List<ThrustCurveMotor.Builder> motors = loader.load(new StringReader(data), "download"); + this.thrustCurveMotor = (ThrustCurveMotor.Builder)motors.get(0); + } + } catch (IOException ex) { + this.thrustCurveMotor = null; + } + } + + /** + * @return the motor_id + */ + public Integer getMotorId() { + return motorId; + } + + /** + * @param motor_id the motor_id to set + */ + public void setMotorId(Integer motorId) { + this.motorId = motorId; + } + + /** + * @return the filetype + */ + public String getFiletype() { + return filetype; + } + + /** + * @param filetype the filetype to set + */ + public void setFiletype(String filetype) { + this.filetype = filetype; + } + + /** + * @return the thrustCurveMotor + */ + public ThrustCurveMotor.Builder getThrustCurveMotor() { + return thrustCurveMotor; + } + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/SearchRequest.java b/core/src/net/sf/openrocket/thrustcurve/SearchRequest.java new file mode 100644 index 0000000000..a39cf4da01 --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/SearchRequest.java @@ -0,0 +1,117 @@ +package net.sf.openrocket.thrustcurve; + +public class SearchRequest { + + private String manufacturer; + private String designation; + private String brand_name; + + private String common_name; + private String impulse_class; + private Integer diameter; + + /* + public enum Type { + "SU"; + "reload"; + "hybrid" + }; + */ + private String type; + + public void setManufacturer(String manufacturer) { + this.manufacturer = null; + if (manufacturer != null) { + manufacturer = manufacturer.trim(); + if (!"".equals(manufacturer)) { + this.manufacturer = manufacturer; + } + } + } + + public void setDesignation(String designation) { + this.designation = designation; + } + + public void setBrand_name(String brand_name) { + this.brand_name = brand_name; + } + + public void setCommon_name(String common_name) { + if (common_name == null) { + this.common_name = null; + return; + } + this.common_name = common_name.trim(); + if ("".equals(this.common_name)) { + this.common_name = null; + } + } + + public void setImpulse_class(String impulse_class) { + this.impulse_class = null; + if (impulse_class != null) { + this.impulse_class = impulse_class.trim(); + if ("".equals(impulse_class)) { + this.impulse_class = null; + } + } + } + + public void setDiameter(Integer diameter) { + this.diameter = diameter; + } + + public void setDiameter(String diameter) { + this.diameter = null; + if (diameter == null) { + return; + } + try { + this.diameter = Integer.decode(diameter); + } catch (NumberFormatException ex) { + this.diameter = null; + } + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + StringBuilder w = new StringBuilder(); + + w.append("<?xml version=\"1.0\" encoding=\"ascii\"?>\n"); + w.append("<search-request\n"); + w.append(" xmlns=\"http://www.thrustcurve.org/2014/SearchRequest\"\n"); + w.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); + w.append(" xsi:schemaLocation=\"http://www.thrustcurve.org/2014/SearchRequest http://www.thrustcurve.org/2014/search-request.xsd\">\n"); + + if (manufacturer != null) { + w.append(" <manufacturer>").append(manufacturer).append("</manufacturer>\n"); + } + if (designation != null) { + w.append(" <designation>").append(designation).append("</designation>\n"); + } + if (brand_name != null) { + w.append(" <brand-name>").append(brand_name).append("</brand-name>\n"); + } + if (common_name != null) { + w.append(" <common-name>").append(common_name).append("</common-name>\n"); + } + if (impulse_class != null) { + w.append(" <impulse-class>").append(impulse_class).append("</impulse-class>\n"); + } + if (diameter != null) { + w.append(" <diameter>").append(diameter).append("</diameter>\n"); + } + if (type != null) { + w.append(" <type>").append(type).append("</type>\n"); + } + w.append("<data-fields>*</data-fields>"); + w.append("<max-results>0</max-results>"); + w.append("</search-request>\n"); + return w.toString(); + } +} diff --git a/core/src/net/sf/openrocket/thrustcurve/SearchResponse.java b/core/src/net/sf/openrocket/thrustcurve/SearchResponse.java new file mode 100644 index 0000000000..a15d06febd --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/SearchResponse.java @@ -0,0 +1,45 @@ +package net.sf.openrocket.thrustcurve; + +import java.util.ArrayList; +import java.util.List; + + +public class SearchResponse { + + private List<TCMotor> results = new ArrayList<TCMotor>(); + + private int matches; + + private String error; + + public List<TCMotor> getResults() { + return results; + } + + void addMotor(TCMotor motor) { + results.add(motor); + } + + public int getMatches() { + return matches; + } + + public void setMatches(int matches) { + this.matches = matches; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + @Override + public String toString() { + return "SearchResult [results=" + results + ", matches=" + matches + + ", error=" + error + "]"; + } + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/SearchResponseParser.java b/core/src/net/sf/openrocket/thrustcurve/SearchResponseParser.java new file mode 100644 index 0000000000..3c8b08fe7c --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/SearchResponseParser.java @@ -0,0 +1,183 @@ +package net.sf.openrocket.thrustcurve; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.file.simplesax.ElementHandler; +import net.sf.openrocket.file.simplesax.SimpleSAX; + +public class SearchResponseParser implements ElementHandler { + + private static final String thrustcurveURI = "http://www.thrustcurve.org/2008/SearchResponse"; + /* + * XML Tags in SearchResult xsd + */ + private static final String root_tag = "search-response"; + private static final String criteria = "criteria"; + private static final String criterion = "criterion"; + private static final String name = "name"; + private static final String value = "value"; + private static final String matches = "matches"; + private static final String results = "results"; + private static final String result = "result"; + + private static final String motor_id = "motor-id"; + private static final String manufacturer = "manufacturer"; + private static final String manufacturer_abbr = "manufacturer-abbrev"; + private static final String designation = "designation"; + private static final String brand_name = "brand-name"; + private static final String common_name = "common-name"; + private static final String impulse_class = "impulse-class"; + private static final String diameter = "diameter"; + private static final String length = "length"; + private static final String type = "type"; + private static final String cert_org = "cert-org"; + private static final String avg_thrust_n = "avg-thrust-n"; + private static final String max_thrust_n = "max-thrust-n"; + private static final String tot_impulse_ns = "tot-impulse-ns"; + private static final String burn_time_s = "burn-time-s"; + private static final String data_files = "data-files"; + private static final String info_url = "info-url"; + private static final String total_weight_g = "total-weight-g"; + private static final String prop_weight_g = "prop-weight-g"; + private static final String delays = "delays"; + private static final String case_info = "case-info"; + private static final String prop_info = "prop-info"; + private static final String updated_on = "updated-on"; + private static final String availability = "availability"; + + private SearchResponse response = new SearchResponse(); + + private TCMotor currentMotor; + + private SearchResponseParser() { + } + + public static SearchResponse parse(InputStream in) throws IOException, SAXException { + + SearchResponseParser handler = new SearchResponseParser(); + WarningSet warnings = new WarningSet(); + SimpleSAX.readXML(new InputSource(in), handler, warnings); + + return handler.response; + + } + + @Override + public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException { + if (result.equals(element)) { + currentMotor = new TCMotor(); + } + return this; + } + + @Override + public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException { + + switch (element) { + case result: + // Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A. + if ("a".equalsIgnoreCase(currentMotor.getImpulse_class())) { + if (currentMotor.getCommon_name().startsWith("1/2A")) { + currentMotor.setImpulse_class("1/2A"); + } else if (currentMotor.getCommon_name().startsWith("1/4A")) { + currentMotor.setImpulse_class("1/4A"); + } else if (currentMotor.getCommon_name().startsWith("Micro")) { + currentMotor.setImpulse_class("1/8A"); + } + } + + // Convert Case Info. + if (currentMotor.getCase_info() == null + || "single use".equalsIgnoreCase(currentMotor.getCase_info()) + || "single-use".equalsIgnoreCase(currentMotor.getCase_info())) { + currentMotor.setCase_info(currentMotor.getType() + " " + currentMotor.getDiameter() + "x" + currentMotor.getLength()); + } + response.addMotor(currentMotor); + break; + case matches: + this.response.setMatches(Integer.parseInt(content)); + break; + case motor_id: + currentMotor.setMotor_id(Integer.parseInt(content)); + break; + case manufacturer: + currentMotor.setManufacturer(content); + break; + case manufacturer_abbr: + currentMotor.setManufacturer_abbr(content); + break; + case designation: + currentMotor.setDesignation(content); + break; + case brand_name: + currentMotor.setBrand_name(content); + break; + case common_name: + currentMotor.setCommon_name(content); + break; + case impulse_class: + currentMotor.setImpulse_class(content); + break; + case diameter: + currentMotor.setDiameter(Float.parseFloat(content)); + break; + case length: + currentMotor.setLength(Float.parseFloat(content)); + break; + case type: + currentMotor.setType(content); + break; + case cert_org: + currentMotor.setCert_org(content); + break; + case avg_thrust_n: + currentMotor.setAvg_thrust_n(Float.parseFloat(content)); + break; + case max_thrust_n: + currentMotor.setMax_thrust_n(Float.parseFloat(content)); + break; + case tot_impulse_ns: + currentMotor.setTot_impulse_ns(Float.parseFloat(content)); + break; + case burn_time_s: + currentMotor.setBurn_time_s(Float.parseFloat(content)); + break; + case data_files: + currentMotor.setData_files(Integer.parseInt(content)); + break; + case info_url: + currentMotor.setInfo_url(content); + break; + case total_weight_g: + currentMotor.setTot_mass_g(Double.parseDouble(content)); + break; + case prop_weight_g: + currentMotor.setProp_mass_g(Double.parseDouble(content)); + break; + case delays: + currentMotor.setDelays(content); + break; + case case_info: + currentMotor.setCase_info(content); + break; + case prop_info: + currentMotor.setProp_info(content); + break; + case availability: + currentMotor.setAvailability(content); + break; + } + + } + + @Override + public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException { + } + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/SerializeThrustcurveMotors.java b/core/src/net/sf/openrocket/thrustcurve/SerializeThrustcurveMotors.java new file mode 100644 index 0000000000..e43d1a3a0a --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/SerializeThrustcurveMotors.java @@ -0,0 +1,194 @@ +package net.sf.openrocket.thrustcurve; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectOutputStream; +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.List; + +import org.xml.sax.SAXException; + +import net.sf.openrocket.file.iterator.DirectoryIterator; +import net.sf.openrocket.file.iterator.FileIterator; +import net.sf.openrocket.file.motor.GeneralMotorLoader; +import net.sf.openrocket.gui.util.SimpleFileFilter; +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.ThrustCurveMotor; +import net.sf.openrocket.util.Pair; + +public class SerializeThrustcurveMotors { + + private static String[] manufacturers = { + "AeroTech", + "Alpha", + "AMW", + "Apogee", + "Cesaroni", + "Contrail", + "Ellis", + "Estes", + "GR", + "Hypertek", + "KBA", + "Kosdon", + "Loki", + "PP", + "PML", + "Quest", + "RATT", + "Roadrunner", + "RV", + "SkyR", + "SCR", + "WCH" + }; + + public static void main(String[] args) throws Exception { + + if (args.length != 2) { + System.out.println("Usage: java " + SerializeThrustcurveMotors.class.getCanonicalName() + " <input-dir> <output-file>"); + System.exit(1); + } + + String inputDir = args[0]; + String outputFile = args[1]; + + final List<Motor> allMotors = new ArrayList<Motor>(); + + loadFromLocalMotorFiles(allMotors, inputDir); + + loadFromThrustCurve(allMotors); + + File outFile = new File(outputFile); + + FileOutputStream ofs = new FileOutputStream(outFile); + final ObjectOutputStream oos = new ObjectOutputStream(ofs); + + oos.writeObject(allMotors); + + oos.flush(); + ofs.flush(); + ofs.close(); + + } + + public static void loadFromThrustCurve(List<Motor> allMotors) throws SAXException, MalformedURLException, IOException { + + SearchRequest searchRequest = new SearchRequest(); + for (String m : manufacturers) { + searchRequest.setManufacturer(m); + System.out.println("Motors for : " + m); + + SearchResponse res = ThrustCurveAPI.doSearch(searchRequest); + + for (TCMotor mi : res.getResults()) { + StringBuilder message = new StringBuilder(); + message.append(mi.getManufacturer_abbr()); + message.append(" "); + message.append(mi.getCommon_name()); + message.append(" "); + message.append(mi.getMotor_id()); + + if (mi.getData_files() == null || mi.getData_files().intValue() == 0) { + continue; + } + + final Motor.Type type; + switch (mi.getType()) { + case "SU": + type = Motor.Type.SINGLE; + break; + case "reload": + type = Motor.Type.RELOAD; + break; + case "hybrid": + type = Motor.Type.HYBRID; + break; + default: + type = Motor.Type.UNKNOWN; + break; + } + + System.out.println(message); + + List<MotorBurnFile> b = getThrustCurvesForMotorId(mi.getMotor_id()); + + for (MotorBurnFile burnFile : b) { + + ThrustCurveMotor.Builder builder = burnFile.getThrustCurveMotor(); + if (builder == null) { + continue; + } + if (mi.getTot_mass_g() != null) { + builder.setInitialMass(mi.getTot_mass_g() / 1000.0); + } + if (mi.getProp_mass_g() != null) { +// builder.setPropellantMass(mi.getProp_mass_g() / 1000.0); + } + + builder.setCaseInfo(mi.getCase_info()); + builder.setPropellantInfo(mi.getProp_info()); + builder.setDiameter(mi.getDiameter() / 1000.0); + builder.setLength(mi.getLength() / 1000.0); + builder.setMotorType(type); + + if ("OOP".equals(mi.getAvailiability())) { + builder.setDesignation(mi.getDesignation()); + builder.setAvailablity(false); + } else if (mi.getDesignation().startsWith("Micro")) { + builder.setDesignation(mi.getDesignation()); + } else { + builder.setDesignation(mi.getCommon_name()); + } + + allMotors.add(builder.build()); + + } + + System.out.println("\t curves: " + b.size()); + + } + } + + } + + private static List<MotorBurnFile> getThrustCurvesForMotorId(int motorId) { + List<MotorBurnFile> b = new ArrayList<>(); + try { + b.addAll(ThrustCurveAPI.downloadData(motorId, "RockSim")); + } catch (Exception ex) { + System.out.println("\tError downloading RockSim"); + } + try { + b.addAll(ThrustCurveAPI.downloadData(motorId, "RASP")); + } catch (Exception ex) { + System.out.println("\tError downloading RASP"); + } + return b; + } + + private static void loadFromLocalMotorFiles(List<Motor> allMotors, String inputDir) throws IOException { + GeneralMotorLoader loader = new GeneralMotorLoader(); + FileIterator iterator = DirectoryIterator.findDirectory(inputDir, new SimpleFileFilter("", false, loader.getSupportedExtensions())); + if (iterator == null) { + System.out.println("Can't find " + inputDir + " directory"); + System.exit(1); + } else { + while (iterator.hasNext()) { + Pair<String, InputStream> f = iterator.next(); + String fileName = f.getU(); + InputStream is = f.getV(); + + List<ThrustCurveMotor.Builder> motors = loader.load(is, fileName); + + for (ThrustCurveMotor.Builder builder : motors) { + allMotors.add(builder.build()); + } + } + } + + } +} diff --git a/core/src/net/sf/openrocket/thrustcurve/SupportedFileTypes.java b/core/src/net/sf/openrocket/thrustcurve/SupportedFileTypes.java new file mode 100644 index 0000000000..37d486f06d --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/SupportedFileTypes.java @@ -0,0 +1,11 @@ +package net.sf.openrocket.thrustcurve; + +public abstract class SupportedFileTypes { + + public final static String ROCKSIM_FORMAT = "RockSim"; + public final static String RASP_FORMAT = "RASP"; + + public static boolean isSupportedFileType( String arg0 ) { + return (ROCKSIM_FORMAT.equals(arg0) || RASP_FORMAT.equals(arg0)); + } +} diff --git a/core/src/net/sf/openrocket/thrustcurve/TCMotor.java b/core/src/net/sf/openrocket/thrustcurve/TCMotor.java new file mode 100644 index 0000000000..e9e645fcac --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/TCMotor.java @@ -0,0 +1,298 @@ +package net.sf.openrocket.thrustcurve; + +import java.util.Date; + +public class TCMotor implements Cloneable { + + private Integer motor_id; + private String manufacturer; + private String manufacturer_abbr; + private String designation; + private String brand_name; + private String common_name; + private String impulse_class; + private Float diameter; + private Float length; + private String type; + private String cert_org; + private Float avg_thrust_n; + private Float max_thrust_n; + private Float tot_impulse_ns; + private Float burn_time_s; + private Integer data_files; + private String info_url; + private Double tot_mass_g; + private Double prop_mass_g; + private String delays; + private String case_info; + private String prop_info; + private Date updated_on; + private String availability; + + public void init() { + motor_id = null; + manufacturer = null; + manufacturer_abbr = null; + designation = null; + brand_name = null; + common_name = null; + impulse_class = null; + diameter = null; + length = null; + type = null; + cert_org = null; + avg_thrust_n = null; + max_thrust_n = null; + tot_impulse_ns = null; + burn_time_s = null; + data_files = null; + info_url = null; + tot_mass_g = null; + prop_mass_g = null; + delays = null; + case_info = null; + prop_info = null; + updated_on = null; + availability = null; + } + + @Override + public TCMotor clone() { + TCMotor clone = new TCMotor(); + clone.motor_id = this.motor_id; + clone.manufacturer = this.manufacturer; + clone.manufacturer_abbr = this.manufacturer_abbr; + clone.designation = this.designation; + clone.brand_name = this.brand_name; + clone.common_name = this.common_name; + clone.impulse_class = this.impulse_class; + clone.diameter = this.diameter; + clone.length = this.length; + clone.type = this.type; + clone.cert_org = this.cert_org; + clone.avg_thrust_n = this.avg_thrust_n; + clone.max_thrust_n = this.max_thrust_n; + clone.tot_impulse_ns = this.tot_impulse_ns; + clone.burn_time_s = this.burn_time_s; + clone.data_files = this.data_files; + clone.info_url = this.info_url; + clone.tot_mass_g = this.tot_mass_g; + clone.prop_mass_g = this.prop_mass_g; + clone.delays = this.delays; + clone.case_info = this.case_info; + clone.prop_info = this.prop_info; + clone.updated_on = this.updated_on; + clone.availability = this.availability; + return clone; + } + + public Integer getMotor_id() { + return motor_id; + } + + public void setMotor_id(Integer motor_id) { + this.motor_id = motor_id; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + + public String getManufacturer_abbr() { + return manufacturer_abbr; + } + + public void setManufacturer_abbr(String manufacturer_abbr) { + this.manufacturer_abbr = manufacturer_abbr; + } + + public String getDesignation() { + return designation; + } + + public void setDesignation(String designation) { + this.designation = designation; + } + + public String getBrand_name() { + return brand_name; + } + + public void setBrand_name(String brand_name) { + this.brand_name = brand_name; + } + + public String getCommon_name() { + return common_name; + } + + public void setCommon_name(String common_name) { + this.common_name = common_name; + } + + public String getImpulse_class() { + return impulse_class; + } + + public void setImpulse_class(String impulse_class) { + this.impulse_class = impulse_class; + } + + public Float getDiameter() { + return diameter; + } + + public void setDiameter(Float diameter) { + this.diameter = diameter; + } + + public Float getLength() { + return length; + } + + public void setLength(Float length) { + this.length = length; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getCert_org() { + return cert_org; + } + + public void setCert_org(String cert_org) { + this.cert_org = cert_org; + } + + public Float getAvg_thrust_n() { + return avg_thrust_n; + } + + public void setAvg_thrust_n(Float avg_thrust_n) { + this.avg_thrust_n = avg_thrust_n; + } + + public Float getMax_thrust_n() { + return max_thrust_n; + } + + public void setMax_thrust_n(Float max_thrust_n) { + this.max_thrust_n = max_thrust_n; + } + + public Float getTot_impulse_ns() { + return tot_impulse_ns; + } + + public void setTot_impulse_ns(Float tot_impulse_ns) { + this.tot_impulse_ns = tot_impulse_ns; + } + + public Float getBurn_time_s() { + return burn_time_s; + } + + public void setBurn_time_s(Float burn_time_s) { + this.burn_time_s = burn_time_s; + } + + public Integer getData_files() { + return data_files; + } + + public void setData_files(Integer data_files) { + this.data_files = data_files; + } + + public String getInfo_url() { + return info_url; + } + + public void setInfo_url(String info_url) { + this.info_url = info_url; + } + + public Double getTot_mass_g() { + return tot_mass_g; + } + + public void setTot_mass_g(Double tot_mass_g) { + this.tot_mass_g = tot_mass_g; + } + + public Double getProp_mass_g() { + return prop_mass_g; + } + + public void setProp_mass_g(Double prop_mass_g) { + this.prop_mass_g = prop_mass_g; + } + + public String getDelays() { + return delays; + } + + public void setDelays(String delays) { + this.delays = delays; + } + + public String getCase_info() { + return case_info; + } + + public void setCase_info(String case_info) { + this.case_info = case_info; + } + + public String getProp_info() { + return prop_info; + } + + public void setProp_info(String prop_info) { + this.prop_info = prop_info; + } + + public Date getUpdated_on() { + return updated_on; + } + + public void setUpdated_on(Date updated_on) { + this.updated_on = updated_on; + } + + public String getAvailiability() { + return availability; + } + + public void setAvailability(String avail) { + this.availability = avail; + } + + @Override + public String toString() { + return "TCMotor [motor_id=" + motor_id + ", manufacturer=" + + manufacturer + ", manufacturer_abbr=" + manufacturer_abbr + + ", designation=" + designation + ", brand_name=" + brand_name + + ", common_name=" + common_name + ", impulse_class=" + + impulse_class + ", diameter=" + diameter + ", length=" + + length + ", type=" + type + ", cert_org=" + cert_org + + ", avg_thrust_n=" + avg_thrust_n + ", max_thrust_n=" + + max_thrust_n + ", tot_impulse_ns=" + tot_impulse_ns + + ", burn_time_s=" + burn_time_s + ", data_files=" + data_files + + ", info_url=" + info_url + ", tot_mass_g=" + tot_mass_g + + ", prop_mass_g=" + prop_mass_g + ", delays=" + delays + + ", case_info=" + case_info + ", prop_info=" + prop_info + + ", updated_on=" + updated_on + "]"; + } + +} diff --git a/core/src/net/sf/openrocket/thrustcurve/ThrustCurveAPI.java b/core/src/net/sf/openrocket/thrustcurve/ThrustCurveAPI.java new file mode 100644 index 0000000000..8b810855cd --- /dev/null +++ b/core/src/net/sf/openrocket/thrustcurve/ThrustCurveAPI.java @@ -0,0 +1,83 @@ +package net.sf.openrocket.thrustcurve; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.Collections; +import java.util.List; + +import org.xml.sax.SAXException; + + +public abstract class ThrustCurveAPI { + + public static SearchResponse doSearch(SearchRequest request) throws MalformedURLException, IOException, SAXException { + + String requestString = request.toString(); + + // Froyo has troubles resolving URLS constructed with protocols. Because of this + // we need to do it in parts. + URL url = new URL("http", "www.thrustcurve.org", "/servlets/search"); + + OutputStream stream; + + URLConnection conn = url.openConnection(); + conn.setConnectTimeout(2000); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + + stream = conn.getOutputStream(); + + stream.write(requestString.getBytes()); + + InputStream is = conn.getInputStream(); + + SearchResponse result = SearchResponseParser.parse(is); + + return result; + } + + public static List<MotorBurnFile> downloadData(Integer motor_id, String format) throws MalformedURLException, IOException, SAXException { + + if (motor_id == null) { + return null; + } + DownloadRequest dr = new DownloadRequest(); + dr.add(motor_id); + dr.setFormat(format); + + String requestString = dr.toString(); + + // Froyo has troubles resolving URLS constructed with protocols. Because of this + // we need to do it in parts. + URL url = new URL("http", "www.thrustcurve.org", "/servlets/download"); + + OutputStream stream; + + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setDoInput(true); + conn.setDoOutput(true); + conn.setUseCaches(false); + conn.connect(); + + stream = conn.getOutputStream(); + + stream.write(requestString.getBytes()); + + if (conn.getResponseCode() == HttpURLConnection.HTTP_BAD_REQUEST) { + return Collections.<MotorBurnFile> emptyList(); + } + InputStream is = conn.getInputStream(); + + DownloadResponse downloadResponse = DownloadResponseParser.parse(is); + + return downloadResponse.getData(motor_id); + + } + +} diff --git a/core/src/net/sf/openrocket/unit/CaliberUnit.java b/core/src/net/sf/openrocket/unit/CaliberUnit.java index cc93cb5114..27c76278a6 100644 --- a/core/src/net/sf/openrocket/unit/CaliberUnit.java +++ b/core/src/net/sf/openrocket/unit/CaliberUnit.java @@ -2,7 +2,7 @@ import java.util.Iterator; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; @@ -14,7 +14,7 @@ public class CaliberUnit extends GeneralUnit { public static final double DEFAULT_CALIBER = 0.01; - private final Configuration configuration; + private final FlightConfiguration configuration; private final Rocket rocket; private int rocketModId = -1; @@ -23,9 +23,9 @@ public class CaliberUnit extends GeneralUnit { private double caliber = -1; - - - public CaliberUnit(Configuration configuration) { + + + public CaliberUnit(FlightConfiguration configuration) { super(1.0, "cal"); this.configuration = configuration; @@ -69,7 +69,7 @@ public double toUnit(double value) { } - + private void checkCaliber() { if (configuration != null && configuration.getModID() != configurationModId) { caliber = -1; @@ -97,8 +97,8 @@ private void checkCaliber() { * @param config the rocket configuration * @return the caliber of the rocket, or the default caliber. */ - public static double calculateCaliber(Configuration config) { - return calculateCaliber(config.iterator()); + public static double calculateCaliber(FlightConfiguration config) { + return calculateCaliber(config.getActiveComponents().iterator()); } /** @@ -112,7 +112,7 @@ public static double calculateCaliber(Rocket rocket) { } - + private static double calculateCaliber(Iterator<RocketComponent> iterator) { double cal = 0; diff --git a/core/src/net/sf/openrocket/unit/Unit.java b/core/src/net/sf/openrocket/unit/Unit.java index 75931d0509..4c4195b151 100644 --- a/core/src/net/sf/openrocket/unit/Unit.java +++ b/core/src/net/sf/openrocket/unit/Unit.java @@ -114,7 +114,7 @@ protected double roundForDecimalFormat(double val) { double sign = Math.signum(val); val = Math.abs(val); double mul = 1.0; - while (val < 100) { + while (val < 100 && mul < 1000) { mul *= 10; val *= 10; } @@ -178,14 +178,14 @@ public Value toValue(double value) { */ public abstract double getPreviousValue(double value); - //public abstract ArrayList<Tick> getTicks(double start, double end, double scale); - - /** - * Return ticks in the range start - end (in current units). minor is the minimum - * distance between minor, non-notable ticks and major the minimum distance between - * major non-notable ticks. The values are in current units, i.e. no conversion is - * performed. - */ + /** + * Return ticks in the range start - end (in current units). + * + * @param start start of interval to draw + * @param end end of interval to draw + * @param minor the minimum distance between minor, non-notable ticks + * @param major the minimum distance between major, non-notable ticks + */ public abstract Tick[] getTicks(double start, double end, double minor, double major); /** diff --git a/core/src/net/sf/openrocket/unit/UnitGroup.java b/core/src/net/sf/openrocket/unit/UnitGroup.java index ae1a895b93..4905329c0a 100644 --- a/core/src/net/sf/openrocket/unit/UnitGroup.java +++ b/core/src/net/sf/openrocket/unit/UnitGroup.java @@ -16,7 +16,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.Rocket; @@ -456,7 +456,7 @@ public static UnitGroup stabilityUnits(Rocket rocket) { * @param config the rocket configuration from which to calculate the caliber * @return the unit group */ - public static UnitGroup stabilityUnits(Configuration config) { + public static UnitGroup stabilityUnits(FlightConfiguration config) { return new StabilityUnitGroup(config); } @@ -716,7 +716,7 @@ public StabilityUnitGroup(Rocket rocket) { this(new CaliberUnit(rocket)); } - public StabilityUnitGroup(Configuration config) { + public StabilityUnitGroup(FlightConfiguration config) { this(new CaliberUnit(config)); } diff --git a/core/src/net/sf/openrocket/util/BoundingBox.java b/core/src/net/sf/openrocket/util/BoundingBox.java new file mode 100644 index 0000000000..6d5f46eb8f --- /dev/null +++ b/core/src/net/sf/openrocket/util/BoundingBox.java @@ -0,0 +1,140 @@ +package net.sf.openrocket.util; + +import java.awt.geom.Rectangle2D; +import java.util.ArrayList; +import java.util.Collection; + +public class BoundingBox { + public Coordinate min; + public Coordinate max; + + public BoundingBox() { + clear(); + } + + public BoundingBox( Coordinate _min, Coordinate _max) { + this(); + this.min = _min.clone(); + this.max = _max.clone(); + } + + public void clear() { + min = Coordinate.MAX.setWeight( 0.0); + max = Coordinate.MIN.setWeight( 0.0); + } + + @Override + public BoundingBox clone() { + return new BoundingBox( this.min, this.max ); + } + + + private void update_x_min( final double xVal) { + if( min.x > xVal) + min = min.setX( xVal ); + } + + private void update_y_min( final double yVal) { + if( min.y > yVal ) + min = min.setY( yVal ); + } + + private void update_z_min( final double zVal) { + if( min.z > zVal ) + min = min.setZ( zVal ); + } + + private void update_x_max( final double xVal) { + if( max.x < xVal ) + max = max.setX( xVal ); + } + + private void update_y_max( final double yVal) { + if( max.y < yVal ) + max = max.setY( yVal ); + } + + private void update_z_max( final double zVal) { + if( max.z < zVal ) + max = max.setZ( zVal ); + } + + public BoundingBox update( final double val) { + update_x_min(val); + update_y_min(val); + update_z_min(val); + + update_x_max(val); + update_y_max(val); + update_z_max(val); + return this; + } + + + public void update( Coordinate c ) { + update_x_min(c.x); + update_y_min(c.y); + update_z_min(c.z); + + update_x_max(c.x); + update_y_max(c.y); + update_z_max(c.z); + } + + public BoundingBox update( Rectangle2D rect ) { + update_x_min(rect.getMinX()); + update_y_min(rect.getMinY()); + update_x_max(rect.getMaxX()); + update_y_max(rect.getMaxY()); + return this; + } + + public BoundingBox update( final Coordinate[] list ) { + for( Coordinate c: list ) { + update( c ); + } + return this; + } + + public BoundingBox update( Collection<Coordinate> list ) { + for( Coordinate c: list ) { + update( c ); + } + return this; + } + + public BoundingBox update( BoundingBox other ) { + update_x_min(other.min.x); + update_y_min(other.min.y); + update_z_min(other.min.y); + + update_x_max(other.max.x); + update_y_max(other.max.y); + update_z_max(other.max.z); + return this; + } + + public Coordinate span() { return max.sub( min ); } + + public Coordinate[] toArray() { + return new Coordinate[] { this.min, this.max }; + } + + public Collection<Coordinate> toCollection(){ + Collection<Coordinate> toReturn = new ArrayList<Coordinate>(); + toReturn.add( this.max); + toReturn.add( this.min); + return toReturn; + } + + public Rectangle2D toRectangle() { + return new Rectangle2D.Double(min.x, min.y, (max.x-min.x), (max.y - min.y)); + } + + @Override + public String toString() { + return String.format("[( %g, %g, %g) < ( %g, %g, %g)]", + min.x, min.y, min.z, + max.x, max.y, max.z ); + } +} diff --git a/core/src/net/sf/openrocket/util/Coordinate.java b/core/src/net/sf/openrocket/util/Coordinate.java index 9724cf8cd3..51c8b00f19 100644 --- a/core/src/net/sf/openrocket/util/Coordinate.java +++ b/core/src/net/sf/openrocket/util/Coordinate.java @@ -59,10 +59,15 @@ public final class Coordinate implements Cloneable, Serializable { //////// End debug section - + public static final Coordinate ZERO = new Coordinate(0, 0, 0, 0); public static final Coordinate NUL = new Coordinate(0, 0, 0, 0); - public static final Coordinate NaN = new Coordinate(Double.NaN, Double.NaN, - Double.NaN, Double.NaN); + public static final Coordinate NaN = new Coordinate(Double.NaN, Double.NaN,Double.NaN, Double.NaN); + public static final Coordinate MAX = new Coordinate(Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE,Double.MAX_VALUE); + public static final Coordinate MIN = new Coordinate(Double.MIN_VALUE,Double.MIN_VALUE,Double.MIN_VALUE,Double.MIN_VALUE); + + public static final Coordinate X_UNIT = new Coordinate(1, 0, 0); + public static final Coordinate Y_UNIT = new Coordinate(0, 1, 0); + public static final Coordinate Z_UNIT = new Coordinate(0, 0, 1); public final double x, y, z; public final double weight; @@ -151,7 +156,7 @@ public Coordinate add(double x1, double y1, double z1, double w1) { /** * Subtract a Coordinate from this Coordinate. The weight of the resulting Coordinate - * is the same as of this Coordinate, the weight of the argument is ignored. + * is the same as of this Coordinate; i.e. the weight of the argument is ignored. * * @param other Coordinate to subtract from this. * @return The result @@ -331,6 +336,11 @@ public String toString() { return String.format("(%.3f,%.3f,%.3f)", x, y, z); } + // high-precision output, for use with verifying calculations + public String toPreciseString() { + return String.format("cm= %.8fg @[%.8f,%.8f,%.8f]", weight, x, y, z); + } + @Override public Coordinate clone() { return new Coordinate(this.x, this.y, this.z, this.weight); diff --git a/core/src/net/sf/openrocket/util/MathUtil.java b/core/src/net/sf/openrocket/util/MathUtil.java index 434792a84f..e1e986b240 100644 --- a/core/src/net/sf/openrocket/util/MathUtil.java +++ b/core/src/net/sf/openrocket/util/MathUtil.java @@ -184,7 +184,31 @@ public static double max(double x, double y, double z) { public static double hypot(double x, double y) { return Math.sqrt(x * x + y * y); } + + /** + * Reduce the angle x to the range -PI - PI. + * + * Either -PI and PI might be returned, depending on the rounding function. + * + * @param x Original angle. + * @return The equivalent angle in the range -PI ... PI. + */ + public static double reducePI(double x) { + double d = Math.rint(x / (2 * Math.PI)); + return x - d * 2 * Math.PI; + } + + /** + * Reduce the angle x to the range 0 - 2*PI. + * @param x Original angle. + * @return The equivalent angle in the range 0 ... 2*PI. + */ + public static double reduce2PI(double x) { + double d = Math.floor(x / (2 * Math.PI)); + return x - d * 2 * Math.PI; + } + /** * Reduce the angle x to the range 0 - 2*PI. * @param x Original angle. @@ -207,8 +231,7 @@ public static double reduce180(double x) { double d = Math.rint(x / (2 * Math.PI)); return x - d * 2 * Math.PI; } - - + /** * Return the square root of a value. If the value is negative, zero is returned. * This is safer in cases where rounding errors might make a value slightly negative. diff --git a/core/src/net/sf/openrocket/util/SimpleStack.java b/core/src/net/sf/openrocket/util/SimpleStack.java deleted file mode 100644 index 91915c5b9b..0000000000 --- a/core/src/net/sf/openrocket/util/SimpleStack.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.sf.openrocket.util; - -import java.util.NoSuchElementException; -/** - * SimpleStack implementation backed by an ArrayList. - * - */ -public class SimpleStack<T> extends ArrayList<T> { - - public void push( T value ) { - this.add(value); - } - - public T peek() { - if ( size() <= 0 ) { - return null; - } - return this.get( size() -1 ); - } - - public T pop() { - if ( size() <= 0 ) { - throw new NoSuchElementException(); - } - T value = this.remove( size() -1 ); - return value; - } - - public String toString() { - StringBuilder sb = new StringBuilder("SimpleStack count=" + size() + "\n"); - for( T element: this ) { - sb.append(" ").append(element.toString()); - } - return sb.toString(); - } -} diff --git a/core/src/net/sf/openrocket/util/TestRockets.java b/core/src/net/sf/openrocket/util/TestRockets.java index f4fff07628..0f025371e2 100644 --- a/core/src/net/sf/openrocket/util/TestRockets.java +++ b/core/src/net/sf/openrocket/util/TestRockets.java @@ -11,41 +11,45 @@ import net.sf.openrocket.material.Material.Type; import net.sf.openrocket.motor.Manufacturer; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPresetFactory; import net.sf.openrocket.preset.InvalidComponentPresetException; import net.sf.openrocket.preset.TypedPropertyMap; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.Bulkhead; import net.sf.openrocket.rocketcomponent.CenteringRing; +import net.sf.openrocket.rocketcomponent.ClusterConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; +import net.sf.openrocket.rocketcomponent.EngineBlock; import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.FinSet.CrossSection; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.FreeformFinSet; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.IllegalFinPointException; import net.sf.openrocket.rocketcomponent.InnerTube; import net.sf.openrocket.rocketcomponent.InternalComponent; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.MassComponent; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.Parachute; +import net.sf.openrocket.rocketcomponent.ParallelStage; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.ReferenceType; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.RocketComponent.Position; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.ShockCord; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.rocketcomponent.Transition.Shape; import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; import net.sf.openrocket.rocketcomponent.TubeCoupler; -import net.sf.openrocket.simulation.SimulationOptions; +import net.sf.openrocket.rocketcomponent.position.*; import net.sf.openrocket.simulation.customexpression.CustomExpression; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.extension.impl.ScriptingExtension; @@ -82,6 +86,130 @@ public TestRockets(String key) { } + // Minimal motor without any useful numbers data + private static ThrustCurveMotor getTestMotor() { + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("A")) + .setDesignation("F12X") + .setDescription("Desc") + .setMotorType(Motor.Type.UNKNOWN) + .setStandardDelays(new double[] {}) + .setDiameter(0.024) + .setLength(0.07) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 1, 0 }) + .setCGPoints(new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }) + .setDigest("digestA") + .build(); + } + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + private static Motor generateMotor_A8_18mm(){ + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("Estes")) + .setDesignation("A8") + .setDescription(" SU Black Powder") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {0,3,5}) + .setDiameter(0.018) + .setLength(0.070) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 9, 0 }) + .setCGPoints(new Coordinate[] { + new Coordinate(0.035, 0, 0, 0.0164),new Coordinate(.035, 0, 0, 0.0145),new Coordinate(.035, 0, 0, 0.0131)}) + .setDigest("digest A8 test") + .build(); + } + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + private static Motor generateMotor_B4_18mm(){ + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("Estes")) + .setDesignation("B4") + .setDescription(" SU Black Powder") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {0,3,5}) + .setDiameter(0.018) + .setLength(0.070) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 11.4, 0 }) + .setCGPoints(new Coordinate[] { + new Coordinate(0.035, 0, 0, 0.0195),new Coordinate(.035, 0, 0, 0.0155),new Coordinate(.035, 0, 0, 0.013)}) + .setDigest("digest B4 test") + .build(); + } + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + private static Motor generateMotor_C6_18mm(){ + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("Estes")) + .setDesignation("C6") + .setDescription(" SU Black Powder") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {0,3,5,7}) + .setDiameter(0.018) + .setLength(0.070) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 6, 0 }) + .setCGPoints(new Coordinate[] { + new Coordinate(0.035, 0, 0, 0.0227),new Coordinate(.035, 0, 0, 0.0165),new Coordinate(.035, 0, 0, 0.012)}) + .setDigest("digest C6 test") + .build(); + } + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + private static Motor generateMotor_D21_18mm(){ + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("AeroTech")) + .setDesignation("D21") + .setDescription("Desc") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {}) + .setDiameter(0.018) + .setLength(0.070) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 32, 0 }) + .setCGPoints(new Coordinate[] { + new Coordinate(.035, 0, 0, 0.025),new Coordinate(.035, 0, 0, .020),new Coordinate(.035, 0, 0, 0.0154)}) + .setDigest("digest D21 test") + .build(); + } + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + private static Motor generateMotor_M1350_75mm(){ + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("AeroTech")) + .setDesignation("M1350") + .setDescription("Desc") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {}) + .setDiameter(0.075) + .setLength(0.622) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 1357, 0 }) + .setCGPoints(new Coordinate[] { + new Coordinate(.311, 0, 0, 4.808),new Coordinate(.311, 0, 0, 3.389),new Coordinate(.311, 0, 0, 1.970)}) + .setDigest("digest M1350 test") + .build(); + } + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + private static Motor generateMotor_G77_29mm(){ + return new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("AeroTech")) + .setDesignation("G77") + .setDescription("Desc") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {4,7,10}) + .setDiameter(0.029) + .setLength(0.124) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 1, 0 }) + .setCGPoints(new Coordinate[] { + new Coordinate(.062, 0, 0, 0.123),new Coordinate(.062, 0, 0, .0935),new Coordinate(.062, 0, 0, 0.064)}) + .setDigest("digest G77 test") + .build(); + } /** * Create a new test rocket based on the value 'key'. The rocket utilizes most of the @@ -104,7 +232,7 @@ public Rocket makeTestRocket() { rocket.setRevision("Rocket revision " + key); rocket.setName(key); - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); setBasics(stage); rocket.addChild(stage); @@ -153,7 +281,7 @@ public Rocket makeTestRocket() { body.setThickness(rnd(0.002)); body.setFilled(rnd.nextBoolean()); body.setLength(rnd(0.3)); - body.setMotorMount(rnd.nextBoolean()); + //body.setMotorMount(rnd.nextBoolean()); body.setMotorOverhang(rnd.nextGaussian() * 0.03); body.setOuterRadius(rnd(0.06)); body.setOuterRadiusAutomatic(rnd.nextBoolean()); @@ -191,6 +319,7 @@ public Rocket makeTestRocket() { mass.setRadius(rnd(0.05)); nose.addChild(mass); + rocket.enableEvents(); return rocket; } @@ -220,8 +349,8 @@ private void setBasics(RocketComponent c) { if (c instanceof InternalComponent) { InternalComponent i = (InternalComponent) c; - i.setRelativePosition((Position) randomEnum(Position.class)); - i.setPositionValue(rnd(0.3)); + i.setAxialMethod((AxialMethod) randomEnum(AxialMethod.class)); + i.setAxialOffset(rnd(0.3)); } } @@ -237,76 +366,245 @@ private <T extends Enum<T>> Enum<T> randomEnum(Class<T> c) { Enum<T>[] values = c.getEnumConstants(); if (values.length == 0) return null; - + return values[rnd.nextInt(values.length)]; } + final static FlightConfigurationId ESTES_ALPHA_III_FCID[] = { + null, // treat the array as 1-indexed. + new FlightConfigurationId("test_config #1: A8-0"), + new FlightConfigurationId("test_config #2: B4-3"), + new FlightConfigurationId("test_config #3: C6-3"), + new FlightConfigurationId("test_config #4: C6-5"), + new FlightConfigurationId("test_config #5: C6-7"), + }; - public static Rocket makeSmallFlyable() { - double noseconeLength = 0.10, noseconeRadius = 0.01; - double bodytubeLength = 0.20, bodytubeRadius = 0.01, bodytubeThickness = 0.001; - - int finCount = 3; - @SuppressWarnings("unused") - double finRootChord = 0.04, finTipChord = 0.05, finSweep = 0.01, finThickness = 0.003, finHeight = 0.03; - - Rocket rocket; - Stage stage; - NoseCone nosecone; - BodyTube bodytube; - TrapezoidFinSet finset; - - rocket = new Rocket(); - stage = new Stage(); - stage.setName("Stage1"); - - nosecone = new NoseCone(Transition.Shape.ELLIPSOID, noseconeLength, noseconeRadius); - bodytube = new BodyTube(bodytubeLength, bodytubeRadius, bodytubeThickness); + // This is a Estes Alpha III + // http://www.rocketreviews.com/alpha-iii---estes-221256.html + // It is picked as a standard, simple, validation rocket. + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + public static final Rocket makeEstesAlphaIII(){ + Rocket rocket = new Rocket(); + FlightConfigurationId fcid[] = new FlightConfigurationId[5]; + fcid[0] = rocket.createFlightConfiguration( ESTES_ALPHA_III_FCID[1] ); + fcid[1] = rocket.createFlightConfiguration( ESTES_ALPHA_III_FCID[2] ); + fcid[2] = rocket.createFlightConfiguration( ESTES_ALPHA_III_FCID[3] ); + fcid[3] = rocket.createFlightConfiguration( ESTES_ALPHA_III_FCID[4] ); + fcid[4] = rocket.createFlightConfiguration( ESTES_ALPHA_III_FCID[5] ); - finset = new TrapezoidFinSet(finCount, finRootChord, finTipChord, finSweep, finHeight); - // Stage construction + rocket.setName("Estes Alpha III / Code Verification Rocket"); + AxialStage stage = new AxialStage(); + stage.setName("Stage"); rocket.addChild(stage); - - // Component construction + + double noseconeLength = 0.07; + double noseconeRadius = 0.012; + NoseCone nosecone = new NoseCone(Transition.Shape.OGIVE, noseconeLength, noseconeRadius); + nosecone.setAftShoulderLength(0.02); + nosecone.setAftShoulderRadius(0.011); + nosecone.setName("Nose Cone"); stage.addChild(nosecone); + + double bodytubeLength = 0.20; + double bodytubeRadius = 0.012; + double bodytubeThickness = 0.0003; + BodyTube bodytube = new BodyTube(bodytubeLength, bodytubeRadius, bodytubeThickness); + bodytube.setName("Body Tube"); stage.addChild(bodytube); - bodytube.addChild(finset); + TrapezoidFinSet finset; + { + int finCount = 3; + double finRootChord = .05; + double finTipChord = .03; + double finSweep = 0.02; + double finHeight = 0.05; + finset = new TrapezoidFinSet(finCount, finRootChord, finTipChord, finSweep, finHeight); + finset.setThickness( 0.0032); + finset.setAxialMethod(AxialMethod.BOTTOM); + finset.setName("3 Fin Set"); + bodytube.addChild(finset); + + LaunchLug lug = new LaunchLug(); + lug.setName("Launch Lugs"); + lug.setAxialMethod(AxialMethod.TOP); + lug.setAxialOffset(0.111); + lug.setLength(0.050); + lug.setOuterRadius(0.0022); + lug.setInnerRadius(0.0020); + bodytube.addChild(lug); + + InnerTube inner = new InnerTube(); + inner.setAxialMethod(AxialMethod.TOP); + inner.setAxialOffset(0.133); + inner.setLength(0.07); + inner.setOuterRadius(0.009); + inner.setThickness(0.0003); + inner.setMotorMount(true); + inner.setName("Motor Mount Tube"); + bodytube.addChild(inner); + + { + // MotorBlock + EngineBlock thrustBlock= new EngineBlock(); + thrustBlock.setAxialMethod(AxialMethod.TOP); + thrustBlock.setAxialOffset(0.0); + thrustBlock.setLength(0.005); + thrustBlock.setOuterRadius(0.009); + thrustBlock.setThickness(0.0008); + thrustBlock.setName("Engine Block"); + inner.addChild(thrustBlock); + inner.setMotorMount( true); + + { + MotorConfiguration motorConfig = new MotorConfiguration(inner,fcid[0]); + Motor mtr = TestRockets.generateMotor_A8_18mm(); + motorConfig.setMotor( mtr); + motorConfig.setEjectionDelay(0.0); + inner.setMotorConfig( motorConfig, fcid[0]); + } + { + MotorConfiguration motorConfig = new MotorConfiguration(inner,fcid[1]); + Motor mtr = TestRockets.generateMotor_B4_18mm(); + motorConfig.setMotor( mtr); + motorConfig.setEjectionDelay(3.0); + inner.setMotorConfig( motorConfig, fcid[1]); + } + { + MotorConfiguration motorConfig = new MotorConfiguration(inner,fcid[2]); + Motor mtr = TestRockets.generateMotor_C6_18mm(); + motorConfig.setEjectionDelay(3.0); + motorConfig.setMotor( mtr); + inner.setMotorConfig( motorConfig, fcid[2]); + } + { + MotorConfiguration motorConfig = new MotorConfiguration(inner,fcid[3]); + Motor mtr = TestRockets.generateMotor_C6_18mm(); + motorConfig.setEjectionDelay(5.0); + motorConfig.setMotor( mtr); + inner.setMotorConfig( motorConfig, fcid[3]); + } + { + MotorConfiguration motorConfig = new MotorConfiguration(inner,fcid[4]); + Motor mtr = TestRockets.generateMotor_C6_18mm(); + motorConfig.setEjectionDelay(7.0); + motorConfig.setMotor( mtr); + inner.setMotorConfig( motorConfig, fcid[4]); + } + } + + // parachute + Parachute chute = new Parachute(); + chute.setAxialMethod(AxialMethod.TOP); + chute.setName("Parachute"); + chute.setAxialOffset(0.028); + chute.setOverrideMass(0.002); + chute.setMassOverridden(true); + bodytube.addChild(chute); + + // bulkhead x2 + CenteringRing centerings = new CenteringRing(); + centerings.setName("Centering Rings"); + centerings.setAxialMethod(AxialMethod.TOP); + centerings.setAxialOffset(0.14); + centerings.setLength(0.006); + centerings.setInstanceCount(2); + centerings.setInstanceSeparation(0.035); + bodytube.addChild(centerings); + } Material material = Application.getPreferences().getDefaultComponentMaterial(null, Material.Type.BULK); nosecone.setMaterial(material); bodytube.setMaterial(material); finset.setMaterial(material); - String id = rocket.newFlightConfigurationID(); - bodytube.setMotorMount(true); - - MotorConfiguration motorConfig = new MotorConfiguration(); - ThrustCurveMotor motor = getTestMotor(); - motorConfig.setMotor(motor); - motorConfig.setEjectionDelay(5); - - bodytube.getMotorConfiguration().set(id, motorConfig); - bodytube.setMotorOverhang(0.005); - rocket.getDefaultConfiguration().setFlightConfigurationID(id); - rocket.getDefaultConfiguration().setAllStages(); + // preserve default default configuration of rocket -- to test what the default is set to upon initialization. + rocket.enableEvents(); return rocket; } + // This is an extra stage tacked onto the end of an Estes Alpha III + // http://www.rocketreviews.com/alpha-iii---estes-221256.html + // + // This function is used for unit, integration tests, DO NOT CHANGE WITHOUT UPDATING TESTS + public static final Rocket makeBeta(){ + Rocket rocket = makeEstesAlphaIII(); + rocket.setName("Kit-bash Beta"); + + AxialStage sustainerStage = (AxialStage)rocket.getChild(0); + sustainerStage.setName( "Sustainer Stage"); + BodyTube sustainerBody = (BodyTube)sustainerStage.getChild(1); + final double sustainerRadius = sustainerBody.getAftRadius(); + final double sustainerThickness = sustainerBody.getThickness(); + + AxialStage boosterStage = new AxialStage(); + boosterStage.setName("Booster Stage"); + rocket.addChild( boosterStage ); + { + BodyTube boosterBody = new BodyTube(0.06, sustainerRadius, sustainerThickness); + boosterBody.setName("Booster Body"); + boosterStage.addChild( boosterBody); + { + TubeCoupler coupler = new TubeCoupler(); + coupler.setName("Coupler"); + coupler.setOuterRadiusAutomatic(true); + coupler.setThickness( sustainerThickness ); + coupler.setLength(0.03); + coupler.setAxialMethod(AxialMethod.TOP); + coupler.setAxialOffset(-0.015); + boosterBody.addChild(coupler); + + int finCount = 3; + double finRootChord = .05; + double finTipChord = .03; + double finSweep = 0.02; + double finHeight = 0.05; + FinSet finset = new TrapezoidFinSet(finCount, finRootChord, finTipChord, finSweep, finHeight); + finset.setName("Booster Fins"); + finset.setThickness( 0.0032); + finset.setAxialMethod(AxialMethod.BOTTOM); + finset.setAxialOffset(0.); + boosterBody.addChild(finset); + + // Motor mount + InnerTube boosterMMT = new InnerTube(); + boosterMMT.setName("Booster MMT"); + boosterMMT.setAxialOffset(0.005); + boosterMMT.setAxialMethod(AxialMethod.BOTTOM); + boosterMMT.setOuterRadius(0.019 / 2); + boosterMMT.setInnerRadius(0.018 / 2); + boosterMMT.setLength(0.05); + boosterMMT.setMotorMount(true); + { + MotorConfiguration motorConfig= new MotorConfiguration(boosterMMT, ESTES_ALPHA_III_FCID[1] ); + Motor mtr = generateMotor_D21_18mm(); + motorConfig.setMotor(mtr); + boosterMMT.setMotorConfig( motorConfig, ESTES_ALPHA_III_FCID[1]); + } + boosterBody.addChild(boosterMMT); + } + } + + rocket.setSelectedConfiguration( ESTES_ALPHA_III_FCID[1] ); + rocket.getSelectedConfiguration().setAllStages(); + rocket.enableEvents(); + + return rocket; + } public static Rocket makeBigBlue() { Rocket rocket; - Stage stage; + AxialStage stage; NoseCone nosecone; BodyTube bodytube; FreeformFinSet finset; MassComponent mcomp; rocket = new Rocket(); - stage = new Stage(); + stage = new AxialStage(); stage.setName("Stage1"); nosecone = new NoseCone(Transition.Shape.ELLIPSOID, 0.105, 0.033); @@ -314,17 +612,14 @@ public static Rocket makeBigBlue() { bodytube = new BodyTube(0.69, 0.033, 0.001); finset = new FreeformFinSet(); - try { - finset.setPoints(new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0.115, 0.072), - new Coordinate(0.255, 0.072), - new Coordinate(0.255, 0.037), - new Coordinate(0.150, 0) - }); - } catch (IllegalFinPointException e) { - e.printStackTrace(); - } + final Coordinate[] finPoints = { + new Coordinate(0, 0), + new Coordinate(0.115, 0.072), + new Coordinate(0.255, 0.072), + new Coordinate(0.255, 0.037), + new Coordinate(0.150, 0)}; + finset.setPoints(finPoints); + finset.setThickness(0.003); finset.setFinCount(4); @@ -332,8 +627,8 @@ public static Rocket makeBigBlue() { //System.err.println("Fin cant angle: " + (finset.getCantAngle() * 180 / Math.PI)); mcomp = new MassComponent(0.2, 0.03, 0.045 + 0.060); - mcomp.setRelativePosition(Position.TOP); - mcomp.setPositionValue(0); + mcomp.setAxialMethod(AxialMethod.TOP); + mcomp.setAxialOffset(0); // Stage construction rocket.addChild(stage); @@ -352,23 +647,24 @@ public static Rocket makeBigBlue() { // bodytube.setMaterial(material); // finset.setMaterial(material); - String id = rocket.newFlightConfigurationID(); - bodytube.setMotorMount(true); +// FlightConfiguration config = rocket.getDefaultConfiguration(); +// FlightConfigurationID fcid = config.getFlightConfigurationID(); +// config.setAllStages(); // Motor m = Application.getMotorSetDatabase().findMotors(null, null, "F12J", Double.NaN, Double.NaN).get(0); // bodytube.setMotor(id, m); // bodytube.setMotorOverhang(0.005); - rocket.getDefaultConfiguration().setFlightConfigurationID(id); - - rocket.getDefaultConfiguration().setAllStages(); + rocket.enableEvents(); return rocket; } + + public static Rocket makeIsoHaisu() { Rocket rocket; - Stage stage; + AxialStage stage; NoseCone nosecone; BodyTube tube1, tube2, tube3; TrapezoidFinSet finset; @@ -379,7 +675,7 @@ public static Rocket makeIsoHaisu() { final double R = 0.07; rocket = new Rocket(); - stage = new Stage(); + stage = new AxialStage(); stage.setName("Stage1"); nosecone = new NoseCone(Transition.Shape.OGIVE, 0.53, R); @@ -412,26 +708,26 @@ public static Rocket makeIsoHaisu() { coupler.setLength(0.28); coupler.setMassOverridden(true); coupler.setOverrideMass(0.360); - coupler.setRelativePosition(Position.BOTTOM); - coupler.setPositionValue(-0.14); + coupler.setAxialMethod(AxialMethod.BOTTOM); + coupler.setAxialOffset(-0.14); tube1.addChild(coupler); // Parachute MassComponent mass = new MassComponent(0.05, 0.05, 0.280); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(0.2); + mass.setAxialMethod(AxialMethod.TOP); + mass.setAxialOffset(0.2); tube1.addChild(mass); // Cord mass = new MassComponent(0.05, 0.05, 0.125); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(0.2); + mass.setAxialMethod(AxialMethod.TOP); + mass.setAxialOffset(0.2); tube1.addChild(mass); // Payload mass = new MassComponent(0.40, R, 1.500); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(0.25); + mass.setAxialMethod(AxialMethod.TOP); + mass.setAxialOffset(0.25); tube1.addChild(mass); auxfinset = new TrapezoidFinSet(); @@ -443,38 +739,38 @@ public static Rocket makeIsoHaisu() { auxfinset.setSweep(0); auxfinset.setThickness(0.008); auxfinset.setCrossSection(CrossSection.AIRFOIL); - auxfinset.setRelativePosition(Position.TOP); - auxfinset.setPositionValue(0.28); + auxfinset.setAxialMethod(AxialMethod.TOP); + auxfinset.setAxialOffset(0.28); auxfinset.setBaseRotation(Math.PI / 2); tube1.addChild(auxfinset); coupler = new TubeCoupler(); coupler.setOuterRadiusAutomatic(true); coupler.setLength(0.28); - coupler.setRelativePosition(Position.TOP); - coupler.setPositionValue(0.47); + coupler.setAxialMethod(AxialMethod.TOP); + coupler.setAxialOffset(0.47); coupler.setMassOverridden(true); coupler.setOverrideMass(0.360); tube2.addChild(coupler); // Parachute mass = new MassComponent(0.1, 0.05, 0.028); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(0.14); + mass.setAxialMethod(AxialMethod.TOP); + mass.setAxialOffset(0.14); tube2.addChild(mass); Bulkhead bulk = new Bulkhead(); bulk.setOuterRadiusAutomatic(true); bulk.setMassOverridden(true); bulk.setOverrideMass(0.050); - bulk.setRelativePosition(Position.TOP); - bulk.setPositionValue(0.27); + bulk.setAxialMethod(AxialMethod.TOP); + bulk.setAxialOffset(0.27); tube2.addChild(bulk); // Chord mass = new MassComponent(0.1, 0.05, 0.125); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(0.19); + mass.setAxialMethod(AxialMethod.TOP); + mass.setAxialOffset(0.19); tube2.addChild(mass); InnerTube inner = new InnerTube(); @@ -491,8 +787,8 @@ public static Rocket makeIsoHaisu() { center.setLength(0.005); center.setMassOverridden(true); center.setOverrideMass(0.038); - center.setRelativePosition(Position.BOTTOM); - center.setPositionValue(0); + center.setAxialMethod(AxialMethod.BOTTOM); + center.setAxialOffset(0); tube3.addChild(center); center = new CenteringRing(); @@ -501,8 +797,8 @@ public static Rocket makeIsoHaisu() { center.setLength(0.005); center.setMassOverridden(true); center.setOverrideMass(0.038); - center.setRelativePosition(Position.TOP); - center.setPositionValue(0.28); + center.setAxialMethod(AxialMethod.TOP); + center.setAxialOffset(0.28); tube3.addChild(center); center = new CenteringRing(); @@ -511,8 +807,8 @@ public static Rocket makeIsoHaisu() { center.setLength(0.005); center.setMassOverridden(true); center.setOverrideMass(0.038); - center.setRelativePosition(Position.TOP); - center.setPositionValue(0.83); + center.setAxialMethod(AxialMethod.TOP); + center.setAxialOffset(0.83); tube3.addChild(center); finset = new TrapezoidFinSet(); @@ -521,8 +817,8 @@ public static Rocket makeIsoHaisu() { finset.setHeight(0.185); finset.setThickness(0.005); finset.setSweep(0.3); - finset.setRelativePosition(Position.BOTTOM); - finset.setPositionValue(-0.03); + finset.setAxialMethod(AxialMethod.BOTTOM); + finset.setAxialOffset(-0.03); finset.setBaseRotation(Math.PI / 2); tube3.addChild(finset); @@ -533,21 +829,186 @@ public static Rocket makeIsoHaisu() { rocket.addChild(stage); rocket.setPerfectFinish(false); - String id = rocket.newFlightConfigurationID(); - tube3.setMotorMount(true); - + FlightConfiguration config = rocket.getSelectedConfiguration(); +// FlightConfigurationID fcid = config.getFlightConfigurationID(); + // Motor m = Application.getMotorSetDatabase().findMotors(null, null, "L540", Double.NaN, Double.NaN).get(0); // tube3.setMotor(id, m); // tube3.setMotorOverhang(0.02); - rocket.getDefaultConfiguration().setFlightConfigurationID(id); // tube3.setIgnitionEvent(MotorMount.IgnitionEvent.NEVER); - rocket.getDefaultConfiguration().setAllStages(); - + config.setAllStages(); + rocket.enableEvents(); return rocket; } + public final static String FALCON_9H_FCID_1="test_config #1: [ M1350, G77]"; + public final static int FALCON_9H_PAYLOAD_STAGE_NUMBER=0; + public final static int FALCON_9H_CORE_STAGE_NUMBER=1; + public final static int FALCON_9H_BOOSTER_STAGE_NUMBER=2; + + + + // This function is used for unit, integration tests, DO NOT CHANGE (without updating tests). + public static Rocket makeFalcon9Heavy() { + Rocket rocket = new Rocket(); + rocket.setName("Falcon9H Scale Rocket"); + + FlightConfigurationId selFCID = rocket.createFlightConfiguration( new FlightConfigurationId( FALCON_9H_FCID_1 )); + rocket.setSelectedConfiguration(selFCID); + + // ====== Payload Stage ====== + // ====== ====== ====== ====== + AxialStage payloadStage = new AxialStage(); + payloadStage.setName("Payload Fairing Stage"); + rocket.addChild(payloadStage); + + { + NoseCone payloadFairingNoseCone = new NoseCone(Transition.Shape.POWER, 0.118, 0.052); + payloadFairingNoseCone.setName("PL Fairing Nose"); + payloadFairingNoseCone.setThickness(0.001); + payloadFairingNoseCone.setShapeParameter(0.5); + //payloadFairingNoseCone.setLength(0.118); + //payloadFairingNoseCone.setAftRadius(0.052); + payloadFairingNoseCone.setAftShoulderRadius( 0.051 ); + payloadFairingNoseCone.setAftShoulderLength( 0.02 ); + payloadFairingNoseCone.setAftShoulderThickness( 0.001 ); + payloadFairingNoseCone.setAftShoulderCapped( false ); + payloadStage.addChild(payloadFairingNoseCone); + + BodyTube payloadBody = new BodyTube(0.132, 0.052, 0.001); + payloadBody.setName("PL Fairing Body"); + payloadStage.addChild(payloadBody); + + Transition payloadFairingTail = new Transition(); + payloadFairingTail.setName("PL Fairing Transition"); + payloadFairingTail.setLength(0.014); + payloadFairingTail.setThickness(0.002); + payloadFairingTail.setForeRadiusAutomatic(true); + payloadFairingTail.setAftRadiusAutomatic(true); + payloadStage.addChild(payloadFairingTail); + + BodyTube upperStageBody= new BodyTube(0.18, 0.0385, 0.001); + upperStageBody.setName("Upper Stage Body "); + payloadStage.addChild( upperStageBody); + + { + // Parachute + Parachute upperChute= new Parachute(); + upperChute.setName("Parachute"); + upperChute.setAxialMethod(AxialMethod.MIDDLE); + upperChute.setAxialOffset(0.0); + upperChute.setDiameter(0.3); + upperChute.setLineCount(6); + upperChute.setLineLength(0.3); + upperStageBody.addChild( upperChute); + + // Cord + ShockCord cord = new ShockCord(); + cord.setName("Shock Cord"); + cord.setAxialMethod(AxialMethod.BOTTOM); + cord.setAxialOffset(0.0); + cord.setCordLength(0.4); + upperStageBody.addChild( cord); + } + + BodyTube interstage= new BodyTube(0.12, 0.0385, 0.001); + interstage.setName("Interstage"); + payloadStage.addChild( interstage); + } + + // ====== Core Stage ====== + // ====== ====== ====== ====== + AxialStage coreStage = new AxialStage(); + coreStage.setName("Core Stage"); + rocket.addChild(coreStage); + + { + BodyTube coreBody = new BodyTube(0.8, 0.0385, 0.001); + // 74 mm inner dia + coreBody.setName("Core Stage Body"); + coreBody.setMotorMount(true); + coreStage.addChild( coreBody); + { + MotorConfiguration coreMotorConfig = new MotorConfiguration(coreBody, selFCID); + Motor mtr = TestRockets.generateMotor_M1350_75mm(); + coreMotorConfig.setMotor( mtr); + coreBody.setMotorMount( true); + FlightConfigurationId motorConfigId = selFCID; + coreBody.setMotorConfig( coreMotorConfig, motorConfigId); + + // ====== Booster Stage Set ====== + // ====== ====== ====== ====== + ParallelStage boosterStage = new ParallelStage(); + boosterStage.setName("Booster Stage"); + coreBody.addChild( boosterStage); + boosterStage.setAxialMethod(AxialMethod.BOTTOM); + boosterStage.setAxialOffset(0.0); + boosterStage.setInstanceCount(2); + boosterStage.setRadius( RadiusMethod.SURFACE, 0.0 ); + boosterStage.setAngleMethod( AngleMethod.RELATIVE ); + + { + NoseCone boosterCone = new NoseCone(Transition.Shape.POWER, 0.08, 0.0385); + boosterCone.setShapeParameter(0.5); + boosterCone.setName("Booster Nose"); + boosterCone.setThickness(0.002); + //payloadFairingNoseCone.setLength(0.118); + //payloadFairingNoseCone.setAftRadius(0.052); + boosterCone.setAftShoulderRadius( 0.051 ); + boosterCone.setAftShoulderLength( 0.02 ); + boosterCone.setAftShoulderThickness( 0.001 ); + boosterCone.setAftShoulderCapped( false ); + boosterStage.addChild( boosterCone); + + BodyTube boosterBody = new BodyTube(0.8, 0.0385, 0.001); + boosterBody.setName("Booster Body"); + boosterBody.setOuterRadiusAutomatic(true); + boosterStage.addChild( boosterBody); + + { + InnerTube boosterMotorTubes = new InnerTube(); + boosterMotorTubes.setName("Booster Motor Tubes"); + boosterMotorTubes.setLength(0.15); + boosterMotorTubes.setOuterRadius(0.015); // => 29mm motors + boosterMotorTubes.setThickness(0.0005); + boosterMotorTubes.setClusterConfiguration( ClusterConfiguration.CONFIGURATIONS[5]); // 4-ring + //boosterMotorTubes.setClusterConfiguration( ClusterConfiguration.CONFIGURATIONS[13]); // 9-star + boosterMotorTubes.setClusterScale(1.0); + boosterBody.addChild( boosterMotorTubes); + + MotorConfiguration boosterMotorConfig = new MotorConfiguration( boosterMotorTubes, selFCID); + Motor boosterMotor = TestRockets.generateMotor_G77_29mm(); + boosterMotorConfig.setMotor( boosterMotor ); + boosterMotorTubes.setMotorConfig( boosterMotorConfig, motorConfigId); + boosterMotorTubes.setMotorOverhang(0.01234); + + TrapezoidFinSet boosterFins = new TrapezoidFinSet(); + boosterBody.addChild(boosterFins); + boosterFins.setName("Booster Fins"); + boosterFins.setFinCount(3); + boosterFins.setBaseRotation( Math.PI / 4); + boosterFins.setThickness(0.003); + boosterFins.setCrossSection(CrossSection.ROUNDED); + boosterFins.setRootChord(0.32); + boosterFins.setTipChord(0.12); + boosterFins.setHeight(0.12); + boosterFins.setSweep(0.18); + boosterFins.setAxialMethod(AxialMethod.BOTTOM); + boosterFins.setAxialOffset(0.0); + } + } + + } + } + + rocket.enableEvents(); + rocket.setSelectedConfiguration( selFCID); + rocket.getFlightConfiguration( selFCID).setAllStages(); + + return rocket; + } /* * Create a new file version 1.00 rocket @@ -557,7 +1018,7 @@ public static OpenRocketDocument makeTestRocket_v100() { rocket.setName("v100"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); // make body tube @@ -565,7 +1026,7 @@ public static OpenRocketDocument makeTestRocket_v100() { stage.addChild(bodyTube); rocket.addChild(stage); - + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -578,7 +1039,7 @@ public static OpenRocketDocument makeTestRocket_v101_withFinTabs() { rocket.setName("v101_withFinTabs"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -594,8 +1055,8 @@ public static OpenRocketDocument makeTestRocket_v101_withFinTabs() { fins.setTabLength(0.25); bodyTube.addChild(fins); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); - } /* @@ -607,7 +1068,7 @@ public static OpenRocketDocument makeTestRocket_v101_withTubeCouplerChild() { rocket.setName("v101_withTubeCouplerChild"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -621,6 +1082,7 @@ public static OpenRocketDocument makeTestRocket_v101_withTubeCouplerChild() { tubeCoupler.addChild(centeringRing); bodyTube.addChild(tubeCoupler); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -631,9 +1093,12 @@ public static OpenRocketDocument makeTestRocket_v104_withMotor() { Rocket rocket = new Rocket(); rocket.setName("v104_withMotorConfig"); + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConfigurationId fcid = config.getFlightConfigurationID(); + config.setName("F12X"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -643,22 +1108,18 @@ public static OpenRocketDocument makeTestRocket_v104_withMotor() { // make inner tube with motor mount flag set InnerTube innerTube = new InnerTube(); - innerTube.setMotorMount(true); bodyTube.addChild(innerTube); // create motor config and add a motor to it - MotorConfiguration motorConfig = new MotorConfiguration(); ThrustCurveMotor motor = getTestMotor(); + MotorConfiguration motorConfig = new MotorConfiguration(innerTube, fcid); motorConfig.setMotor(motor); motorConfig.setEjectionDelay(5); // add motor config to inner tube (motor mount) - innerTube.getMotorConfiguration().set("F12X", motorConfig); - - // add motor config to rocket's flight config - rocket.newFlightConfigurationID(); - rocket.addMotorConfigurationID("F12X"); + innerTube.setMotorConfig( motorConfig, fcid); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -669,9 +1130,12 @@ public static OpenRocketDocument makeTestRocket_v104_withSimulationData() { Rocket rocket = new Rocket(); rocket.setName("v104_withSimulationData"); + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConfigurationId fcid = config.getFlightConfigurationID(); + config.setName("F12X"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -681,33 +1145,28 @@ public static OpenRocketDocument makeTestRocket_v104_withSimulationData() { // make inner tube with motor mount flag set InnerTube innerTube = new InnerTube(); - innerTube.setMotorMount(true); bodyTube.addChild(innerTube); // create motor config and add a motor to it - MotorConfiguration motorConfig = new MotorConfiguration(); ThrustCurveMotor motor = getTestMotor(); + MotorConfiguration motorConfig = new MotorConfiguration(innerTube, fcid); motorConfig.setMotor(motor); motorConfig.setEjectionDelay(5); // add motor config to inner tube (motor mount) - innerTube.getMotorConfiguration().set("F12X", motorConfig); - - // add motor config to rocket's flight config - //rocket.newFlightConfigurationID(); - rocket.addMotorConfigurationID("F12X"); - + innerTube.setMotorConfig(motorConfig, fcid); + OpenRocketDocument rocketDoc = OpenRocketDocumentFactory.createDocumentFromRocket(rocket); // create simulation data - SimulationOptions options = new SimulationOptions(rocket); - options.setMotorConfigurationID("F12X"); Simulation simulation1 = new Simulation(rocket); + simulation1.setFlightConfigurationId(fcid); rocketDoc.addSimulation(simulation1); Simulation simulation2 = new Simulation(rocket); rocketDoc.addSimulation(simulation2); + rocket.enableEvents(); return rocketDoc; } @@ -719,7 +1178,7 @@ public static OpenRocketDocument makeTestRocket_v105_withCustomExpression() { rocket.setName("v105_withCustomExpression"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -732,6 +1191,7 @@ public static OpenRocketDocument makeTestRocket_v105_withCustomExpression() { CustomExpression expression = new CustomExpression(rocketDoc, "name", "symbol", "unit", "expression"); rocketDoc.addCustomExpression(expression); + rocket.enableEvents(); return rocketDoc; } @@ -743,7 +1203,7 @@ public static OpenRocketDocument makeTestRocket_v105_withComponentPreset() { rocket.setName("v105_withComponentPreset"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -768,6 +1228,7 @@ public static OpenRocketDocument makeTestRocket_v105_withComponentPreset() { e.printStackTrace(); } + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -779,7 +1240,7 @@ public static OpenRocketDocument makeTestRocket_v105_withLowerStageRecoveryDevic rocket.setName("v105_withLowerStageRecoveryDevice"); // make 1st stage - Stage stage1 = new Stage(); + AxialStage stage1 = new AxialStage(); stage1.setName("Stage1"); rocket.addChild(stage1); @@ -791,14 +1252,15 @@ public static OpenRocketDocument makeTestRocket_v105_withLowerStageRecoveryDevic RecoveryDevice parachute = new Parachute(); DeploymentConfiguration deploymentConfig = new DeploymentConfiguration(); deploymentConfig.setDeployEvent(DeployEvent.LOWER_STAGE_SEPARATION); - parachute.getDeploymentConfiguration().setDefault(deploymentConfig); + parachute.getDeploymentConfigurations().setDefault(deploymentConfig); bodyTube1.addChild(parachute); // make 2nd stage - Stage stage2 = new Stage(); + AxialStage stage2 = new AxialStage(); stage2.setName("Stage2"); rocket.addChild(stage2); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -810,7 +1272,7 @@ public static OpenRocketDocument makeTestRocket_v106_withAppearance() { rocket.setName("v106_withAppearance"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -820,6 +1282,7 @@ public static OpenRocketDocument makeTestRocket_v106_withAppearance() { bodyTube.setAppearance(appearance); stage.addChild(bodyTube); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -829,9 +1292,10 @@ public static OpenRocketDocument makeTestRocket_v106_withAppearance() { public static OpenRocketDocument makeTestRocket_v106_withMotorMountIgnitionConfig() { Rocket rocket = new Rocket(); rocket.setName("v106_withwithMotorMountIgnitionConfig"); + FlightConfigurationId fcid = new FlightConfigurationId(); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -841,14 +1305,19 @@ public static OpenRocketDocument makeTestRocket_v106_withMotorMountIgnitionConfi // make inner tube with motor mount flag set InnerTube innerTube = new InnerTube(); - innerTube.setMotorMount(true); bodyTube.addChild(innerTube); - // set ignition configuration for motor mount - IgnitionConfiguration ignitionConfig = new IgnitionConfiguration(); - ignitionConfig.setIgnitionDelay(2); - innerTube.getIgnitionConfiguration().set("2SecondDelay", ignitionConfig); + // make inner tube with motor mount flag set + MotorConfiguration motorConfig = new MotorConfiguration(innerTube, fcid); + Motor mtr = getTestMotor(); + motorConfig.setMotor( mtr); + innerTube.setMotorConfig(motorConfig,fcid); + + // set ignition parameters for motor mount + // inst.setIgnitionEvent( IgnitionEvent.AUTOMATIC); + motorConfig.setIgnitionDelay(2); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -858,9 +1327,10 @@ public static OpenRocketDocument makeTestRocket_v106_withMotorMountIgnitionConfi public static OpenRocketDocument makeTestRocket_v106_withRecoveryDeviceDeploymentConfig() { Rocket rocket = new Rocket(); rocket.setName("v106_withRecoveryDeviceDeploymentConfig"); + FlightConfigurationId testFCID = new FlightConfigurationId("testParachute"); // make stage - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); stage.setName("Stage1"); rocket.addChild(stage); @@ -872,9 +1342,10 @@ public static OpenRocketDocument makeTestRocket_v106_withRecoveryDeviceDeploymen RecoveryDevice parachute = new Parachute(); DeploymentConfiguration deploymentConfig = new DeploymentConfiguration(); deploymentConfig.setDeployAltitude(1000); - parachute.getDeploymentConfiguration().set("testParachute", deploymentConfig); + parachute.getDeploymentConfigurations().set(testFCID, deploymentConfig); bodyTube.addChild(parachute); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } @@ -884,9 +1355,9 @@ public static OpenRocketDocument makeTestRocket_v106_withRecoveryDeviceDeploymen public static OpenRocketDocument makeTestRocket_v106_withStageSeparationConfig() { Rocket rocket = new Rocket(); rocket.setName("v106_withStageSeparationConfig"); - + FlightConfigurationId fcid = new FlightConfigurationId("3SecondDelay"); // make 1st stage - Stage stage1 = new Stage(); + AxialStage stage1 = new AxialStage(); stage1.setName("Stage1"); rocket.addChild(stage1); @@ -901,10 +1372,10 @@ public static OpenRocketDocument makeTestRocket_v106_withStageSeparationConfig() // set stage separation configuration StageSeparationConfiguration stageSepConfig = new StageSeparationConfiguration(); stageSepConfig.setSeparationDelay(3); - stage1.getStageSeparationConfiguration().set("3SecondDelay", stageSepConfig); + stage1.getSeparationConfigurations().set(fcid, stageSepConfig); // make 2nd stage - Stage stage2 = new Stage(); + AxialStage stage2 = new AxialStage(); stage2.setName("Stage2"); rocket.addChild(stage2); @@ -912,12 +1383,13 @@ public static OpenRocketDocument makeTestRocket_v106_withStageSeparationConfig() BodyTube bodyTube2 = new BodyTube(12, 1, 0.05); stage2.addChild(bodyTube2); + rocket.enableEvents(); return OpenRocketDocumentFactory.createDocumentFromRocket(rocket); } public static OpenRocketDocument makeTestRocket_v107_withSimulationExtension(String script) { - Rocket rocket = makeSmallFlyable(); + Rocket rocket = makeEstesAlphaIII(); OpenRocketDocument document = OpenRocketDocumentFactory.createDocumentFromRocket(rocket); Simulation sim = new Simulation(rocket); ScriptingExtension ext = new ScriptingExtension(); @@ -926,6 +1398,14 @@ public static OpenRocketDocument makeTestRocket_v107_withSimulationExtension(Str ext.setScript(script); sim.getSimulationExtensions().add(ext); document.addSimulation(sim); + + rocket.enableEvents(); + return document; + } + + public static OpenRocketDocument makeTestRocket_v108_withBoosters() { + Rocket rocket = makeFalcon9Heavy(); + OpenRocketDocument document = OpenRocketDocumentFactory.createDocumentFromRocket(rocket); return document; } @@ -937,7 +1417,7 @@ public static OpenRocketDocument makeTestRocket_for_estimateFileSize() { rocket.setName("for_estimateFileSize"); // make 1st stage - Stage stage1 = new Stage(); + AxialStage stage1 = new AxialStage(); stage1.setName("Stage1"); rocket.addChild(stage1); @@ -955,11 +1435,11 @@ public static OpenRocketDocument makeTestRocket_for_estimateFileSize() { DeploymentConfiguration deploymentConfig = new DeploymentConfiguration(); deploymentConfig.setDeployEvent(DeployEvent.LOWER_STAGE_SEPARATION); deploymentConfig.setDeployEvent(DeployEvent.ALTITUDE); - parachute.getDeploymentConfiguration().setDefault(deploymentConfig); + parachute.getDeploymentConfigurations().setDefault(deploymentConfig); bodyTube1.addChild(parachute); // make 2nd stage - Stage stage2 = new Stage(); + AxialStage stage2 = new AxialStage(); stage2.setName("Stage2"); rocket.addChild(stage2); @@ -998,19 +1478,8 @@ public static OpenRocketDocument makeTestRocket_for_estimateFileSize() { // do nothing, we don't care } + rocket.enableEvents(); return rocketDoc; } - - - - private static ThrustCurveMotor getTestMotor() { - return new ThrustCurveMotor( - Manufacturer.getManufacturer("A"), - "F12X", "Desc", Motor.Type.UNKNOWN, new double[] {}, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 1, 0 }, - new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestA"); - } - - } diff --git a/core/src/net/sf/openrocket/util/Transformation.java b/core/src/net/sf/openrocket/util/Transformation.java index 8656a4f257..d31bb79069 100644 --- a/core/src/net/sf/openrocket/util/Transformation.java +++ b/core/src/net/sf/openrocket/util/Transformation.java @@ -1,5 +1,6 @@ package net.sf.openrocket.util; +import java.nio.DoubleBuffer; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -15,9 +16,9 @@ public class Transformation implements java.io.Serializable { + public static final double ANGLE_EPSILON = 0.000000001; - public static final Transformation IDENTITY = - new Transformation(); + public static final Transformation IDENTITY = new Transformation(); public static final Transformation PROJECT_XY = new Transformation(new double[][]{{1,0,0},{0,1,0},{0,0,0}}); @@ -26,6 +27,7 @@ public class Transformation implements java.io.Serializable { public static final Transformation PROJECT_XZ = new Transformation(new double[][]{{1,0,0},{0,0,0},{0,0,1}}); + private static final int X = 0; private static final int Y = 1; private static final int Z = 2; @@ -33,10 +35,17 @@ public class Transformation implements java.io.Serializable { private final Coordinate translate; private final double[][] rotation = new double[3][3]; + static public Transformation getTranslationTransform( double x, double y, double z) { + return new Transformation(new Coordinate(x,y,z)); + } + static public Transformation getTranslationTransform( final Coordinate translate ){ + return new Transformation( translate ); + } + /** * Create identity transformation. */ - public Transformation() { + private Transformation() { translate = new Coordinate(0,0,0); rotation[X][X]=1; rotation[Y][Y]=1; @@ -45,6 +54,7 @@ public Transformation() { /** * Create transformation with only translation. + * * @param x Translation in x-axis. * @param y Translation in y-axis. * @param z Translation in z-axis. @@ -112,7 +122,6 @@ public Coordinate transform(Coordinate orig) { return new Coordinate(x,y,z,orig.weight); } - /** * Transform an array of coordinates. The transformed coordinates are stored * in the same array, and the array is returned. @@ -190,6 +199,14 @@ public Transformation applyTransformation(Transformation other) { return combined; } + /** + * Returns a rotation around the rocket's long axis + * + * @param theta rotation around rocket axis, in radians + */ + static public Transformation getAxialRotation( double theta ) { + return Transformation.rotate_x(theta); + } /** * Rotate around x-axis a given angle. @@ -197,6 +214,9 @@ public Transformation applyTransformation(Transformation other) { * @return The transformation. */ public static Transformation rotate_x(double theta) { + if( ANGLE_EPSILON > Math.abs(theta)) { + return Transformation.IDENTITY; + } return new Transformation(new double[][]{ {1,0,0}, {0,Math.cos(theta),-Math.sin(theta)}, @@ -209,6 +229,9 @@ public static Transformation rotate_x(double theta) { * @return The transformation. */ public static Transformation rotate_y(double theta) { + if( ANGLE_EPSILON > Math.abs(theta)) { + return Transformation.IDENTITY; + } return new Transformation(new double[][]{ {Math.cos(theta),0,Math.sin(theta)}, {0,1,0}, @@ -221,6 +244,9 @@ public static Transformation rotate_y(double theta) { * @return The transformation. */ public static Transformation rotate_z(double theta) { + if( ANGLE_EPSILON > Math.abs(theta)) { + return Transformation.IDENTITY; + } return new Transformation(new double[][]{ {Math.cos(theta),-Math.sin(theta),0}, {Math.sin(theta),Math.cos(theta),0}, @@ -228,6 +254,13 @@ public static Transformation rotate_z(double theta) { } + public boolean isIdentity() { + if( this == Transformation.IDENTITY ) { + return true; + } + return this.equals( Transformation.IDENTITY ); + } + public void print(String... str) { for (String s: str) { @@ -242,6 +275,47 @@ public void print(String... str) { System.out.println(); } + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + + sb.append(String.format("[%3.2f %3.2f %3.2f] [%3.2f]\n", + rotation[X][X],rotation[X][Y],rotation[X][Z],translate.x)); + sb.append(String.format("[%3.2f %3.2f %3.2f] + [%3.2f]\n", + rotation[Y][X],rotation[Y][Y],rotation[Y][Z],translate.y)); + sb.append(String.format("[%3.2f %3.2f %3.2f] [%3.2f]\n", + rotation[Z][X],rotation[Z][Y],rotation[Z][Z],translate.z)); + return sb.toString(); + } + + + /** + * Rotation matrix is constructed from Euler angles, in a z-x-z order + * + * $ y = f(x) = R_z( R_x( R_z( x ))) + v $ + * + * @param alpha rotation around z (in radians) + * @param beta rotation around x' (in radians) + * @param gamma rotation around z' (in radians) + */ + static public Transformation getEulerAngle313Transform( double alpha, double beta, double gamma ) { + return new Transformation( new double[][]{ + { + (Math.cos(alpha)*Math.cos(gamma) - Math.sin(alpha)*Math.cos(beta)*Math.sin(gamma)), + (-Math.cos(alpha)*Math.sin(gamma) - Math.sin(alpha)*Math.cos(beta)*Math.cos(gamma)), + (Math.sin(alpha)*Math.sin(beta)) + },{ + (Math.sin(alpha)*Math.cos(gamma) + Math.cos(alpha)*Math.cos(beta)*Math.sin(gamma)), + (-Math.sin(alpha)*Math.sin(gamma) + Math.cos(alpha)*Math.cos(beta)*Math.cos(gamma)), + (-Math.cos(alpha)*Math.sin(beta)) + },{ + (Math.sin(beta)*Math.sin(gamma)), + (Math.sin(beta)*Math.cos(gamma)), + (Math.cos(beta)) + } + }, + Coordinate.ZERO); + } @Override public boolean equals(Object other) { @@ -256,5 +330,49 @@ public boolean equals(Object other) { } return this.translate.equals(o.translate); } + + @Override + public int hashCode() { + long bits = 0; + for(int i=0;i<Z;++i) { + for(int j=0;j<Z;++j) { + Double.doubleToLongBits( rotation[i][j] ); + } + } + bits ^= translate.hashCode(); + return (int)(bits ^ (bits >>> 32)); + } + + /** + * + * + * m = [ m[0] m[4] m[ 8] m[12] ] = [ 1 0 0 1 ] + * [ m[1] m[5] m[ 9] m[13] ] [ 0 1 0 1 ] + * [ m[2] m[6] m[10] m[14] ] [ 0 0 1 1 ] + * [ m[3] m[7] m[11] m[15] ] [ 0 0 0 1 ] + * + * @return + */ + public DoubleBuffer getGLMatrix() { + double[] data = new double[]{1,0,0,0,0,1,0,0,0,0,1,0,1,1,1,1}; + + // output array is in column-major order + // https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadMatrix.xml + for( int i=0; i<3; ++i) { + for( int j=0; j<3; ++j) { + data[i+j*4] = this.rotation[i][j]; + } + } + + data[12] = this.translate.x; + data[13] = this.translate.y; + data[14] = this.translate.z; + + return DoubleBuffer.wrap(data); + } + + public Coordinate getTranslationVector() { + return this.translate; + } } diff --git a/core/src/net/sf/openrocket/utils/MotorCheck.java b/core/src/net/sf/openrocket/utils/MotorCheck.java deleted file mode 100644 index 5710486d87..0000000000 --- a/core/src/net/sf/openrocket/utils/MotorCheck.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.file.motor.MotorLoader; -import net.sf.openrocket.motor.Manufacturer; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.ThrustCurveMotor; - -public class MotorCheck { - - // Warn if less that this many points - public static final int WARN_POINTS = 6; - - - public static void main(String[] args) { - MotorLoader loader = new GeneralMotorLoader(); - - // Load files - for (String file : args) { - System.out.print("Checking " + file + "... "); - System.out.flush(); - - boolean ok = true; - - List<Motor> motors = null; - try { - InputStream stream = new FileInputStream(file); - motors = loader.load(stream, file); - stream.close(); - } catch (IOException e) { - System.out.println("ERROR: " + e.getMessage()); - e.printStackTrace(System.out); - ok = false; - } - - String base = file.split("_")[0]; - Manufacturer mfg = Manufacturer.getManufacturer(base); - - if (motors != null) { - if (motors.size() == 0) { - System.out.println("ERROR: File contained no motors"); - ok = false; - } else { - for (Motor motor : motors) { - ThrustCurveMotor m = (ThrustCurveMotor) motor; - double sum = 0; - sum += m.getAverageThrustEstimate(); - sum += m.getBurnTimeEstimate(); - sum += m.getTotalImpulseEstimate(); - // sum += m.getTotalTime(); - sum += m.getDiameter(); - sum += m.getLength(); - sum += m.getEmptyCG().weight; - sum += m.getEmptyCG().x; - sum += m.getLaunchCG().weight; - sum += m.getLaunchCG().x; - sum += m.getMaxThrustEstimate(); - if (Double.isInfinite(sum) || Double.isNaN(sum)) { - System.out.println("ERROR: Invalid motor values"); - ok = false; - } - - if (m.getManufacturer() != mfg) { - System.out.println("ERROR: Inconsistent manufacturer " + - m.getManufacturer() + " (file name indicates " + mfg - + ")"); - ok = false; - } - - int points = ((ThrustCurveMotor) m).getTimePoints().length; - if (points < WARN_POINTS) { - System.out.println("WARNING: Only " + points + " data points"); - ok = false; - } - } - } - } - - if (ok) { - System.out.println("OK"); - } - } - } -} diff --git a/core/src/net/sf/openrocket/utils/MotorCompare.java b/core/src/net/sf/openrocket/utils/MotorCompare.java deleted file mode 100644 index 8c4390804a..0000000000 --- a/core/src/net/sf/openrocket/utils/MotorCompare.java +++ /dev/null @@ -1,347 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.file.motor.MotorLoader; -import net.sf.openrocket.motor.Manufacturer; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.ThrustCurveMotor; - -public class MotorCompare { - - /** Maximum allowed difference in maximum thrust */ - private static final double MAX_THRUST_MARGIN = 0.30; - /** Maximum allowed difference in total impulse */ - private static final double TOTAL_IMPULSE_MARGIN = 0.20; - /** Maximum allowed difference in mass values */ - private static final double MASS_MARGIN = 0.20; - - /** Number of time points in thrust curve to compare */ - @SuppressWarnings("unused") - private static final int DIVISIONS = 100; - /** Maximum difference in thrust for a time point to be considered invalid */ - @SuppressWarnings("unused") - private static final double THRUST_MARGIN = 0.20; - /** Number of invalid time points allowed */ - @SuppressWarnings("unused") - private static final int ALLOWED_INVALID_POINTS = 20; - - /** Minimum number of thrust curve points allowed (incl. start and end points) */ - private static final int MIN_POINTS = 7; - - - public static void main(String[] args) throws IOException { - @SuppressWarnings("unused") - final double maxThrust; - @SuppressWarnings("unused") - final double maxTime; - @SuppressWarnings("unused") - int maxDelays; - @SuppressWarnings("unused") - int maxPoints; - @SuppressWarnings("unused") - int maxCommentLen; - - @SuppressWarnings("unused") - double min, max, diff; - - @SuppressWarnings("unused") - int[] goodness; - - @SuppressWarnings("unused") - boolean bad = false; - @SuppressWarnings("unused") - List<String> cause = new ArrayList<String>(); - - MotorLoader loader = new GeneralMotorLoader(); - List<ThrustCurveMotor> motors = new ArrayList<ThrustCurveMotor>(); - List<String> files = new ArrayList<String>(); - - // Load files - System.out.printf("Files :"); - for (String file : args) { - System.out.printf("\t%s", file); - List<Motor> m = null; - try { - InputStream stream = new FileInputStream(file); - m = loader.load(stream, file); - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - System.out.print("(ERR:" + e.getMessage() + ")"); - } - if (m != null) { - motors.addAll((List) m); - for (int i = 0; i < m.size(); i++) - files.add(file); - } - } - System.out.println(); - - compare(motors, files); - } - - - - - - public static void compare(List<ThrustCurveMotor> motors, List<String> files) { - @SuppressWarnings("unused") - final double maxThrust, maxTime; - int maxDelays; - int maxPoints; - int maxCommentLen; - - double min, max; - double diff; - - int[] goodness; - - boolean bad = false; - List<String> cause = new ArrayList<String>(); - - - if (motors.size() == 0) { - System.err.println("No motors loaded."); - System.out.println("ERROR: No motors loaded.\n"); - return; - - } - - if (motors.size() == 1) { - System.out.println("Best (ONLY): " + files.get(0)); - System.out.println(); - return; - } - - final int n = motors.size(); - goodness = new int[n]; - - - for (String s : files) { - System.out.print("\t" + s); - } - System.out.println(); - - - // Designations - System.out.printf("Designation:"); - String des = motors.get(0).getDesignation(); - for (Motor m : motors) { - System.out.printf("\t%s", m.getDesignation()); - if (!m.getDesignation().equals(des)) { - cause.add("Designation"); - bad = true; - } - } - System.out.println(); - - // Manufacturers - System.out.printf("Manufacture:"); - Manufacturer mfg = motors.get(0).getManufacturer(); - for (ThrustCurveMotor m : motors) { - System.out.printf("\t%s", m.getManufacturer()); - if (m.getManufacturer() != mfg) { - cause.add("Manufacturer"); - bad = true; - } - } - System.out.println(); - - - // Max. thrust - max = 0; - min = Double.MAX_VALUE; - System.out.printf("Max.thrust :"); - for (Motor m : motors) { - double f = m.getMaxThrustEstimate(); - System.out.printf("\t%.2f", f); - max = Math.max(max, f); - min = Math.min(min, f); - } - diff = (max - min) / min; - if (diff > MAX_THRUST_MARGIN) { - bad = true; - cause.add("Max thrust"); - } - System.out.printf("\t(discrepancy %.1f%%)\n", 100.0 * diff); - maxThrust = (min + max) / 2; - - - // Total time - max = 0; - min = Double.MAX_VALUE; - System.out.printf("Burn time :"); - for (Motor m : motors) { - double t = m.getBurnTimeEstimate(); - System.out.printf("\t%.2f", t); - max = Math.max(max, t); - min = Math.min(min, t); - } - diff = (max - min) / min; - System.out.printf("\t(discrepancy %.1f%%)\n", 100.0 * diff); - maxTime = max; - - - // Total impulse - max = 0; - min = Double.MAX_VALUE; - System.out.printf("Impulse :"); - for (Motor m : motors) { - double f = m.getTotalImpulseEstimate(); - System.out.printf("\t%.2f", f); - max = Math.max(max, f); - min = Math.min(min, f); - } - diff = (max - min) / min; - if (diff > TOTAL_IMPULSE_MARGIN) { - bad = true; - cause.add("Total impulse"); - } - System.out.printf("\t(discrepancy %.1f%%)\n", 100.0 * diff); - - - // Initial mass - max = 0; - min = Double.MAX_VALUE; - System.out.printf("Init mass :"); - for (Motor m : motors) { - double f = m.getLaunchCG().weight; - System.out.printf("\t%.2f", f * 1000); - max = Math.max(max, f); - min = Math.min(min, f); - } - diff = (max - min) / min; - if (diff > MASS_MARGIN) { - bad = true; - cause.add("Initial mass"); - } - System.out.printf("\t(discrepancy %.1f%%)\n", 100.0 * diff); - - - // Empty mass - max = 0; - min = Double.MAX_VALUE; - System.out.printf("Empty mass :"); - for (Motor m : motors) { - double f = m.getEmptyCG().weight; - System.out.printf("\t%.2f", f * 1000); - max = Math.max(max, f); - min = Math.min(min, f); - } - diff = (max - min) / min; - if (diff > MASS_MARGIN) { - bad = true; - cause.add("Empty mass"); - } - System.out.printf("\t(discrepancy %.1f%%)\n", 100.0 * diff); - - - // Delays - maxDelays = 0; - System.out.printf("Delays :"); - for (ThrustCurveMotor m : motors) { - System.out.printf("\t%d", m.getStandardDelays().length); - maxDelays = Math.max(maxDelays, m.getStandardDelays().length); - } - System.out.println(); - - - // Data points - maxPoints = 0; - System.out.printf("Points :"); - for (Motor m : motors) { - System.out.printf("\t%d", ((ThrustCurveMotor) m).getTimePoints().length); - maxPoints = Math.max(maxPoints, ((ThrustCurveMotor) m).getTimePoints().length); - } - System.out.println(); - - - // Comment length - maxCommentLen = 0; - System.out.printf("Comment len:"); - for (Motor m : motors) { - System.out.printf("\t%d", m.getDescription().length()); - maxCommentLen = Math.max(maxCommentLen, m.getDescription().length()); - } - System.out.println(); - - - if (bad) { - String str = "ERROR: "; - for (int i = 0; i < cause.size(); i++) { - str += cause.get(i); - if (i < cause.size() - 1) - str += ", "; - } - str += " differs"; - System.out.println(str); - System.out.println(); - return; - } - - // Check consistency - // TODO: Does not check consistency - // int invalidPoints = 0; - // for (int i = 0; i < DIVISIONS; i++) { - // double t = maxTime * i / (DIVISIONS - 1); - // min = Double.MAX_VALUE; - // max = 0; - // // System.out.printf("%.2f:", t); - // for (Motor m : motors) { - // double f = m.getThrust(t); - // // System.out.printf("\t%.2f", f); - // min = Math.min(min, f); - // max = Math.max(max, f); - // } - // diff = (max - min) / maxThrust; - // // System.out.printf("\t(diff %.1f%%)\n", diff*100); - // if (diff > THRUST_MARGIN) - // invalidPoints++; - // } - // - // if (invalidPoints > ALLOWED_INVALID_POINTS) { - // System.out.println("ERROR: " + invalidPoints + "/" + DIVISIONS - // + " points have thrust differing over " + (THRUST_MARGIN * 100) + "%"); - // System.out.println(); - // return; - // } - - - // Check goodness - for (int i = 0; i < n; i++) { - ThrustCurveMotor m = motors.get(i); - if (m.getStandardDelays().length == maxDelays) - goodness[i] += 1000; - if (((ThrustCurveMotor) m).getTimePoints().length == maxPoints) - goodness[i] += 100; - if (m.getDescription().length() == maxCommentLen) - goodness[i] += 10; - if (files.get(i).matches(".*\\.[rR][sS][eE]$")) - goodness[i] += 1; - } - int best = 0; - for (int i = 1; i < n; i++) { - if (goodness[i] > goodness[best]) - best = i; - } - - - // Verify enough points - int pts = ((ThrustCurveMotor) motors.get(best)).getTimePoints().length; - if (pts < MIN_POINTS) { - System.out.println("WARNING: Best has only " + pts + " data points"); - } - - System.out.println("Best (" + goodness[best] + "): " + files.get(best)); - System.out.println(); - - - } - -} diff --git a/core/src/net/sf/openrocket/utils/MotorCompareAll.java b/core/src/net/sf/openrocket/utils/MotorCompareAll.java deleted file mode 100644 index f3a6f8a7bf..0000000000 --- a/core/src/net/sf/openrocket/utils/MotorCompareAll.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.file.motor.MotorLoader; -import net.sf.openrocket.motor.ThrustCurveMotor; -import net.sf.openrocket.util.Pair; - -public class MotorCompareAll { - - /* - * Usage: - * - * java MotorCompareAll *.eng *.rse - */ - public static void main(String[] args) throws IOException { - - Map<String, Pair<List<ThrustCurveMotor>, List<String>>> map = - new HashMap<String, Pair<List<ThrustCurveMotor>, List<String>>>(); - - MotorLoader loader = new GeneralMotorLoader(); - - for (String filename : args) { - - List<ThrustCurveMotor> motors = (List) loader.load(new FileInputStream(filename), filename); - - for (ThrustCurveMotor m : motors) { - String key = m.getManufacturer() + ":" + m.getDesignation(); - Pair<List<ThrustCurveMotor>, List<String>> pair = map.get(key); - if (pair == null) { - pair = new Pair<List<ThrustCurveMotor>, List<String>> - (new ArrayList<ThrustCurveMotor>(), new ArrayList<String>()); - map.put(key, pair); - } - pair.getU().add(m); - pair.getV().add(filename); - } - } - - Collator collator = Collator.getInstance(); - - List<String> keys = new ArrayList<String>(map.keySet()); - Collections.sort(keys, collator); - for (String basename : keys) { - Pair<List<ThrustCurveMotor>, List<String>> pair = map.get(basename); - System.err.println(basename + ": " + pair.getV()); - MotorCompare.compare(pair.getU(), pair.getV()); - } - } - -} diff --git a/core/src/net/sf/openrocket/utils/MotorCorrelation.java b/core/src/net/sf/openrocket/utils/MotorCorrelation.java index 44261a1048..227ee7579f 100644 --- a/core/src/net/sf/openrocket/utils/MotorCorrelation.java +++ b/core/src/net/sf/openrocket/utils/MotorCorrelation.java @@ -1,17 +1,6 @@ package net.sf.openrocket.utils; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.file.motor.MotorLoader; -import net.sf.openrocket.models.atmosphere.AtmosphericConditions; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.MotorInstance; -import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.MathUtil; @@ -60,30 +49,23 @@ private static double diff(double a, double b) { * @param motor2 the second motor. * @return the scaled cross-correlation of the two thrust curves. */ - public static double crossCorrelation(Motor motor1, Motor motor2) { - MotorInstance m1 = motor1.getInstance(); - MotorInstance m2 = motor2.getInstance(); - - AtmosphericConditions cond = new AtmosphericConditions(); - + public static double crossCorrelation(Motor motor1, Motor motor2) { double t; double auto1 = 0; double auto2 = 0; double cross = 0; for (t = 0; t < 1000; t += 0.01) { - m1.step(t, 0, cond); - m2.step(t, 0, cond); - double t1 = m1.getThrust(); - double t2 = m2.getThrust(); + double thrust1 = motor1.getThrust( t); + double thrust2 = motor2.getThrust( t); - if (t1 < 0 || t2 < 0) { - throw new BugException("Negative thrust, t1=" + t1 + " t2=" + t2); + if ( thrust1 < 0 || thrust2 < 0) { + throw new BugException("Negative thrust, t1=" + thrust1 + " t2=" + thrust2); } - auto1 += t1 * t1; - auto2 += t2 * t2; - cross += t1 * t2; + auto1 += thrust1 * thrust1; + auto2 += thrust2 * thrust2; + cross += thrust1 * thrust2; } double auto = Math.max(auto1, auto2); @@ -95,47 +77,4 @@ public static double crossCorrelation(Motor motor1, Motor motor2) { return cross / auto; } - - - - public static void main(String[] args) { - - MotorLoader loader = new GeneralMotorLoader(); - List<Motor> motors = new ArrayList<Motor>(); - List<String> files = new ArrayList<String>(); - - // Load files - for (String file : args) { - List<Motor> m = null; - try { - InputStream stream = new FileInputStream(file); - m = loader.load(stream, file); - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - System.exit(1); - } - if (m != null) { - motors.addAll(m); - for (int i = 0; i < m.size(); i++) - files.add(file); - } - } - - // Output motor digests - final int count = motors.size(); - for (int i = 0; i < count; i++) { - System.out.println(files.get(i) + ": " + ((ThrustCurveMotor) motors.get(i)).getDigest()); - } - - // Cross-correlate every pair - for (int i = 0; i < count; i++) { - for (int j = i + 1; j < count; j++) { - System.out.println(files.get(i) + " " + files.get(j) + " : " + - crossCorrelation(motors.get(i), motors.get(j))); - } - } - - } - } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/utils/MotorDigester.java b/core/src/net/sf/openrocket/utils/MotorDigester.java deleted file mode 100644 index 5940f4622b..0000000000 --- a/core/src/net/sf/openrocket/utils/MotorDigester.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.file.motor.MotorLoader; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.ThrustCurveMotor; - -public class MotorDigester { - - public static void main(String[] args) { - final MotorLoader loader = new GeneralMotorLoader(); - final boolean printFileNames; - - if (args.length == 0) { - System.err.println("Usage: MotorDigester <files>"); - printFileNames = false; - System.exit(1); - } else if (args.length == 1) { - printFileNames = false; - } else { - printFileNames = true; - } - - - for (String file : args) { - - List<Motor> motors = null; - try { - InputStream stream = new FileInputStream(file); - motors = loader.load(stream, file); - stream.close(); - } catch (IOException e) { - System.err.println("ERROR: " + e.getMessage()); - e.printStackTrace(); - continue; - } - - for (Motor m : motors) { - if (!(m instanceof ThrustCurveMotor)) { - System.err.println(file + ": Not ThrustCurveMotor: " + m); - continue; - } - - String digest = ((ThrustCurveMotor) m).getDigest(); - if (printFileNames) { - System.out.print(file + ": "); - } - System.out.println(digest); - } - } - - } - -} diff --git a/core/src/net/sf/openrocket/utils/MotorPrinter.java b/core/src/net/sf/openrocket/utils/MotorPrinter.java deleted file mode 100644 index a794fdb23c..0000000000 --- a/core/src/net/sf/openrocket/utils/MotorPrinter.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.List; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.file.motor.MotorLoader; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.ThrustCurveMotor; - -public class MotorPrinter { - - public static void main(String[] args) throws IOException { - - MotorLoader loader = new GeneralMotorLoader(); - - System.out.println(); - for (String arg : args) { - InputStream stream = new FileInputStream(arg); - - List<Motor> motors = loader.load(stream, arg); - - System.out.println("*** " + arg + " ***"); - System.out.println(); - for (Motor motor : motors) { - ThrustCurveMotor m = (ThrustCurveMotor) motor; - System.out.println(" Manufacturer: " + m.getManufacturer()); - System.out.println(" Designation: " + m.getDesignation()); - System.out.println(" Delays: " + - Arrays.toString(m.getStandardDelays())); - System.out.printf(" Nominal time: %.2f s\n", m.getBurnTimeEstimate()); - // System.out.printf(" Total time: %.2f s\n", m.getTotalTime()); - System.out.printf(" Avg. thrust: %.2f N\n", m.getAverageThrustEstimate()); - System.out.printf(" Max. thrust: %.2f N\n", m.getMaxThrustEstimate()); - System.out.printf(" Total impulse: %.2f Ns\n", m.getTotalImpulseEstimate()); - System.out.println(" Diameter: " + m.getDiameter() * 1000 + " mm"); - System.out.println(" Length: " + m.getLength() * 1000 + " mm"); - System.out.println(" Digest: " + m.getDigest()); - - if (m instanceof ThrustCurveMotor) { - ThrustCurveMotor tc = (ThrustCurveMotor) m; - System.out.println(" Data points: " + tc.getTimePoints().length); - for (int i = 0; i < m.getTimePoints().length; i++) { - double time = m.getTimePoints()[i]; - double thrust = m.getThrustPoints()[i]; - System.out.printf(" t=%.3f F=%.3f\n", time, thrust); - } - } - - System.out.println(" Comment:"); - System.out.println(m.getDescription()); - System.out.println(); - } - } - } -} diff --git a/core/src/net/sf/openrocket/utils/SerializeMotors.java b/core/src/net/sf/openrocket/utils/SerializeMotors.java deleted file mode 100644 index fb5e9b6c8a..0000000000 --- a/core/src/net/sf/openrocket/utils/SerializeMotors.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; - -import net.sf.openrocket.file.iterator.DirectoryIterator; -import net.sf.openrocket.file.iterator.FileIterator; -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.gui.util.SimpleFileFilter; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.util.Pair; - -public class SerializeMotors { - - public static void main(String[] args) throws Exception { - - if (args.length != 2) { - System.out.println("Usage: java " + SerializeMotors.class.getCanonicalName() + " <input-dir> <output-file>"); - System.exit(1); - } - - String inputDir = args[0]; - String outputFile = args[1]; - - //Application.setPreferences(new SwingPreferences()); - - File outFile = new File(outputFile); - - FileOutputStream ofs = new FileOutputStream(outFile); - final ObjectOutputStream oos = new ObjectOutputStream(ofs); - - final List<Motor> allMotors = new ArrayList<Motor>(); - - - GeneralMotorLoader loader = new GeneralMotorLoader(); - FileIterator iterator = DirectoryIterator.findDirectory(inputDir, new SimpleFileFilter("", false, loader.getSupportedExtensions())); - if (iterator == null) { - System.out.println("Can't find resources-src/thrustcurves directory"); - System.exit(1); - } else { - while (iterator.hasNext()) { - Pair<String, InputStream> f = iterator.next(); - String fileName = f.getU(); - InputStream is = f.getV(); - - List<Motor> motors = loader.load(is, fileName); - - allMotors.addAll(motors); - } - } - - oos.writeObject(allMotors); - - oos.flush(); - ofs.flush(); - ofs.close(); - } - -} diff --git a/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java b/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java new file mode 100644 index 0000000000..6e09fc6786 --- /dev/null +++ b/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java @@ -0,0 +1,214 @@ +package net.sf.openrocket.aerodynamics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; + +import net.sf.openrocket.ServicesForTesting; +import net.sf.openrocket.plugin.PluginModule; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.TestRockets; + +public class BarrowmanCalculatorTest { + protected final double EPSILON = 0.00001; + + private static Injector injector; + + @BeforeClass + public static void setup() { + Module applicationModule = new ServicesForTesting(); + Module pluginModule = new PluginModule(); + + injector = Guice.createInjector( applicationModule, pluginModule); + Application.setInjector(injector); + +// { +// GuiModule guiModule = new GuiModule(); +// Module pluginModule = new PluginModule(); +// Injector injector = Guice.createInjector(guiModule, pluginModule); +// Application.setInjector(injector); +// } + } + + @Test + public void testCPSimpleDry() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + AxialStage stage = (AxialStage)rocket.getChild(0); + FlightConfiguration config = rocket.getSelectedConfiguration(); + BarrowmanCalculator calc = new BarrowmanCalculator(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + + // By Hand: i.e. Manually calculate the Barrowman numbers + double exp_cna; + double exp_cpx; + { + NoseCone nose = (NoseCone)stage.getChild(0); + assertEquals(" Estes Alpha III nose cone has incorrect length:", 0.07, nose.getLength(), EPSILON); + assertEquals(" Estes Alpha III nosecone has wrong (base) radius:", 0.012, nose.getAftRadius(), EPSILON); + assertEquals(" Estes Alpha III nosecone has wrong type:", Transition.Shape.OGIVE, nose.getType()); + double cna_nose = 2; + double cpx_nose = 0.03235; + + double cna_body=0; // equal-to-zero, see [Barrowman66] p15. + double cpx_body=0; + + double cna_3fin = 24.146933; + double cpx_3fin = 0.0193484; + double fin_x = 0.22; + cpx_3fin += fin_x; + + double cna_lugs=0; // n/a + double cpx_lugs=0; // n/a + + // N.B. CP @ AoA = zero + exp_cna = cna_nose + cna_body + cna_3fin + cna_lugs; + exp_cpx = ( cna_nose*cpx_nose + cna_body*cpx_body + cna_3fin*cpx_3fin + cna_lugs*cpx_lugs)/exp_cna; + } + + Coordinate cp_calc = calc.getCP(config, conditions, warnings); + + assertEquals(" Estes Alpha III CNa value is incorrect:", exp_cna, cp_calc.weight, EPSILON); + assertEquals(" Estes Alpha III cp x value is incorrect:", exp_cpx, cp_calc.x, EPSILON); + assertEquals(" Estes Alpha III cp x value is incorrect:", 0.0, cp_calc.y, EPSILON); + } + + @Test + public void testCPSimpleWithMotor() { + Rocket rkt = TestRockets.makeEstesAlphaIII(); + FlightConfiguration config = rkt.getSelectedConfiguration(); + AerodynamicCalculator calc = new BarrowmanCalculator(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + + // calculated from OpenRocket 15.03: + //double expCPx = 0.225; + // verified from the equations: + double expCPx = 0.2235154; + double exp_cna = 26.146933; + Coordinate calcCP = calc.getCP(config, conditions, warnings); + + assertEquals(" Estes Alpha III cp x value is incorrect:", expCPx, calcCP.x, EPSILON); + assertEquals(" Estes Alpha III CNa value is incorrect:", exp_cna, calcCP.weight, EPSILON); + } + + @Test + public void testCPParallelBoosters() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + final ParallelStage boosterStage = (ParallelStage) rocket.getChild(1).getChild(0).getChild(0); + final TrapezoidFinSet boosterFins = (TrapezoidFinSet) boosterStage.getChild(1).getChild(1); + final FlightConfiguration config = rocket.getSelectedConfiguration(); + final BarrowmanCalculator calc = new BarrowmanCalculator(); + final FlightConditions conditions = new FlightConditions(config); + final WarningSet warnings = new WarningSet(); + + { + boosterFins.setFinCount(3); + final Coordinate cp_3fin = calc.getCP(config, conditions, warnings); + assertEquals(" Falcon 9 Heavy CNa value is incorrect:", 21.5111598, cp_3fin.weight, EPSILON); + assertEquals(" Falcon 9 Heavy CP x value is incorrect:", 1.04662388, cp_3fin.x, EPSILON); + assertEquals(" Falcon 9 Heavy CP y value is incorrect:", 0.0, cp_3fin.y, EPSILON); + assertEquals(" Falcon 9 Heavy CP z value is incorrect:", 0.0, cp_3fin.z, EPSILON); + }{ + boosterFins.setFinCount(2); + final Coordinate cp_2fin = calc.getCP(config, conditions, warnings); + assertEquals(" Falcon 9 Heavy CNa value is incorrect:", 15.43711197, cp_2fin.weight, EPSILON); + assertEquals(" Falcon 9 Heavy CP x value is incorrect:", 0.99464238, cp_2fin.x, EPSILON); + assertEquals(" Falcon 9 Heavy CP y value is incorrect:", 0.0, cp_2fin.y, EPSILON); + assertEquals(" Falcon 9 Heavy CP z value is incorrect:", 0.0, cp_2fin.z, EPSILON); + }{ + boosterFins.setFinCount(1); + final Coordinate cp_1fin = calc.getCP(config, conditions, warnings); + assertEquals(" Falcon 9 Heavy CNa value is incorrect:", 9.36306412, cp_1fin.weight, EPSILON); + assertEquals(" Falcon 9 Heavy CP x value is incorrect:", 0.87521867, cp_1fin.x, EPSILON); + assertEquals(" Falcon 9 Heavy CP y value is incorrect:", 0f, cp_1fin.y, EPSILON); + assertEquals(" Falcon 9 Heavy CP z value is incorrect:", 0f, cp_1fin.z, EPSILON); + }{ + // absent -- 3.28901627g @[0.31469937,0.05133333,0.00000000] + } + } + + @Test + public void testGetWorstCP() { +// Rocket rocket = TestRockets.makeFalcon9Heavy(); +// FlightConfiguration config = rocket.getSelectedConfiguration(); +// BarrowmanCalculator calc = new BarrowmanCalculator(); +// FlightConditions conditions = new FlightConditions(config); +// WarningSet warnings = new WarningSet(); + + // NYI +// Coordinate calcBestCP = calc.getCP(config, conditions, warnings); +// Coordinate calcWorstCP = calc.getWorstCP(config, conditions, warnings); + + //fail("Not yet implemented"); +// Coordinate expBestCP = new Coordinate( -1, 0,0,0); +// assertEquals(" Falcon Heavy best CP x value is incorrect:", expBestCP.x, calcBestCP.x, EPSILON); +// Coordinate expWorstCP = new Coordinate( -1, 0,0,0); +// assertEquals(" Falcon Heavy Worst CP x value is incorrect:", expWorstCP.x, calcWorstCP.x, EPSILON); + } + + @Test + public void testContinuousRocket() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + AerodynamicCalculator calc = new BarrowmanCalculator(); + + assertTrue("Estes Alpha III should be continous: ", calc.isContinuous( rocket)); + } + + @Test + public void testContinuousRocketWithStrapOns() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + AerodynamicCalculator calc = new BarrowmanCalculator(); + + assertTrue("F9H should be continuous: ", calc.isContinuous( rocket)); + } + + @Test + public void testRadialDiscontinuousRocket() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + AerodynamicCalculator calc = new BarrowmanCalculator(); + + NoseCone nose = (NoseCone)rocket.getChild(0).getChild(0); + BodyTube body = (BodyTube)rocket.getChild(0).getChild(1); + + nose.setAftRadius(0.015); + body.setOuterRadius( 0.012 ); + body.setName( body.getName()+" << discontinuous"); + + assertFalse(" Estes Alpha III has an undetected discontinuity:", calc.isContinuous( rocket)); + } + + @Test + public void testRadialDiscontinuityWithStrapOns() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + AerodynamicCalculator calc = new BarrowmanCalculator(); + + final AxialStage coreStage = (AxialStage)rocket.getChild(1); + final ParallelStage booster = (ParallelStage)coreStage.getChild(0).getChild(0); + + NoseCone nose = (NoseCone)booster.getChild(0); + BodyTube body = (BodyTube)booster.getChild(1); + + nose.setAftRadius(0.015); + body.setOuterRadius( 0.012 ); + body.setName( body.getName()+" << discontinuous"); + + assertFalse(" Missed discontinuity in Falcon 9 Heavy:", calc.isContinuous( rocket)); + } +} diff --git a/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java b/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java new file mode 100644 index 0000000000..7eb12199f3 --- /dev/null +++ b/core/test/net/sf/openrocket/aerodynamics/FinSetCalcTest.java @@ -0,0 +1,105 @@ +package net.sf.openrocket.aerodynamics; + +import static org.junit.Assert.assertEquals; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; + +import net.sf.openrocket.ServicesForTesting; +import net.sf.openrocket.aerodynamics.barrowman.FinSetCalc; +import net.sf.openrocket.plugin.PluginModule; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.TestRockets; + +public class FinSetCalcTest { + protected final double EPSILON = 0.0001; + + private static Injector injector; + @BeforeClass + public static void setup() { + Module applicationModule = new ServicesForTesting(); + Module pluginModule = new PluginModule(); + + injector = Guice.createInjector( applicationModule, pluginModule); + Application.setInjector(injector); + +// { +// GuiModule guiModule = new GuiModule(); +// Module pluginModule = new PluginModule(); +// Injector injector = Guice.createInjector(guiModule, pluginModule); +// Application.setInjector(injector); +// } + } + + @Test + public void test3Fin() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + TrapezoidFinSet fins = (TrapezoidFinSet)rocket.getChild(0).getChild(1).getChild(0); + + // to make the fin properties explicit + assertEquals(" Estes Alpha III fins have wrong count:", 3, fins.getFinCount(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong root chord:", 0.05, fins.getRootChord(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong tip chord:", 0.03, fins.getTipChord(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong sweep: ", 0.02, fins.getSweep(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong height: ", 0.05, fins.getHeight(), EPSILON); + + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + AerodynamicForces forces = new AerodynamicForces(); + FinSetCalc calcObj = new FinSetCalc( fins ); + + + // vvv TEST MEH! vvv + calcObj.calculateNonaxialForces(conditions, forces, warnings); + // ^^^ + + double exp_cna_fins = 24.146933; + double exp_cpx_fins = 0.0193484; + + assertEquals(" FinSetCalc produces bad CNa: ", exp_cna_fins, forces.getCNa(), EPSILON); + assertEquals(" FinSetCalc produces bad C_p.x: ", exp_cpx_fins, forces.getCP().x, EPSILON); + assertEquals(" FinSetCalc produces bad CN: ", 0.0, forces.getCN(), EPSILON); + assertEquals(" FinSetCalc produces bad C_m: ", 0.0, forces.getCm(), EPSILON); + } + + + @Test + public void test4Fin() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + TrapezoidFinSet fins = (TrapezoidFinSet)rocket.getChild(0).getChild(1).getChild(0); + fins.setFinCount(4); + + // to make the fin properties explicit + assertEquals(" Estes Alpha III fins have wrong count:", 4, fins.getFinCount(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong root chord:", 0.05, fins.getRootChord(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong tip chord:", 0.03, fins.getTipChord(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong sweep: ", 0.02, fins.getSweep(), EPSILON); + assertEquals(" Estes Alpha III fins have wrong height: ", 0.05, fins.getHeight(), EPSILON); + + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + AerodynamicForces forces = new AerodynamicForces(); + FinSetCalc calcObj = new FinSetCalc( fins ); + + + // vvv TEST MEH! vvv + calcObj.calculateNonaxialForces(conditions, forces, warnings); + // ^^^ + + double exp_cna_fins = 32.195911; + double exp_cpx_fins = 0.0193484; + + assertEquals(" FinSetCalc produces bad CNa: ", exp_cna_fins, forces.getCNa(), EPSILON); + assertEquals(" FinSetCalc produces bad C_p.x: ", exp_cpx_fins, forces.getCP().x, EPSILON); + assertEquals(" FinSetCalc produces bad CN: ", 0.0, forces.getCN(), EPSILON); + assertEquals(" FinSetCalc produces bad C_m: ", 0.0, forces.getCm(), EPSILON); + } +} diff --git a/core/test/net/sf/openrocket/aerodynamics/SymmetricComponentCalcTest.java b/core/test/net/sf/openrocket/aerodynamics/SymmetricComponentCalcTest.java new file mode 100644 index 0000000000..3fb44f26ec --- /dev/null +++ b/core/test/net/sf/openrocket/aerodynamics/SymmetricComponentCalcTest.java @@ -0,0 +1,103 @@ +package net.sf.openrocket.aerodynamics; + +import static org.junit.Assert.assertEquals; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; + +import net.sf.openrocket.ServicesForTesting; +import net.sf.openrocket.aerodynamics.barrowman.SymmetricComponentCalc; +import net.sf.openrocket.plugin.PluginModule; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.TestRockets; + +public class SymmetricComponentCalcTest { + protected final double EPSILON = MathUtil.EPSILON*1000; + + private static Injector injector; + @BeforeClass + public static void setup() { + Module applicationModule = new ServicesForTesting(); + Module pluginModule = new PluginModule(); + + injector = Guice.createInjector( applicationModule, pluginModule); + Application.setInjector(injector); + +// { +// GuiModule guiModule = new GuiModule(); +// Module pluginModule = new PluginModule(); +// Injector injector = Guice.createInjector(guiModule, pluginModule); +// Application.setInjector(injector); +// } + } + + @Test + public void testConicalNoseParams() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + NoseCone nose = (NoseCone)rocket.getChild(0).getChild(0); + nose.setType( Transition.Shape.CONICAL ); + + // to illustrate the NoseCone properties to the reader: + assertEquals(" Estes Alpha III nose cone has incorrect length:", 0.07, nose.getLength(), EPSILON); + assertEquals(" Estes Alpha III nosecone has wrong (base) radius:", 0.012, nose.getAftRadius(), EPSILON); + assertEquals(" Estes Alpha III nosecone has wrong type:", Transition.Shape.CONICAL, nose.getType()); + + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + AerodynamicForces forces = new AerodynamicForces(); + SymmetricComponentCalc calcObj = new SymmetricComponentCalc( nose ); + + conditions.setAOA(0.0); + // vvv TEST MEH! vvv + calcObj.calculateNonaxialForces(conditions, forces, warnings); + // ^^^ + + double cna_nose = 2; + double cpx_nose = 2.0/3.0*nose.getLength(); + + assertEquals(" SymmetricComponentCalc produces bad CNa: ", cna_nose, forces.getCNa(), EPSILON); + assertEquals(" SymmetricComponentCalc produces bad C_p.x: ", cpx_nose, forces.getCP().x, EPSILON); + assertEquals(" SymmetricComponentCalc produces bad CN: ", 0.0, forces.getCN(), EPSILON); + assertEquals(" SymmetricComponentCalc produces bad C_m: ", 0.0, forces.getCm(), EPSILON); + } + + @Test + public void testOgiveNoseParams() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + NoseCone nose = (NoseCone)rocket.getChild(0).getChild(0); + + // to illustrate the NoseCone properties to the reader: + assertEquals(" Estes Alpha III nose cone has incorrect length:", 0.07, nose.getLength(), EPSILON); + assertEquals(" Estes Alpha III nosecone has wrong (base) radius:", 0.012, nose.getAftRadius(), EPSILON); + assertEquals(" Estes Alpha III nosecone has wrong type:", Transition.Shape.OGIVE, nose.getType()); + + FlightConfiguration config = rocket.getSelectedConfiguration(); + FlightConditions conditions = new FlightConditions(config); + WarningSet warnings = new WarningSet(); + AerodynamicForces forces = new AerodynamicForces(); + SymmetricComponentCalc calcObj = new SymmetricComponentCalc( nose ); + + conditions.setAOA(0.0); + // vvv TEST vvv + calcObj.calculateNonaxialForces(conditions, forces, warnings); + // ^^^ ^^^ + + double l_nose = nose.getLength(); + double cna_nose = 2; + double cpx_nose = 0.46216*l_nose; + assertEquals(" SymmetricComponentCalc produces bad CNa: ", cna_nose, forces.getCNa(), EPSILON); + assertEquals(" SymmetricComponentCalc produces bad C_p.x:", cpx_nose, forces.getCP().x, EPSILON); + assertEquals(" SymmetricComponentCalc produces bad CN: ", 0.0, forces.getCN(), EPSILON); + assertEquals(" SymmetricComponentCalc produces bad C_m: ", 0.0, forces.getCm(), EPSILON); + } + +} diff --git a/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java b/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java index a544e44b27..bd17f6b706 100644 --- a/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java +++ b/core/test/net/sf/openrocket/database/ThrustCurveMotorSetTest.java @@ -20,29 +20,61 @@ public class ThrustCurveMotorSetTest { - private static final ThrustCurveMotor motor1 = new ThrustCurveMotor( - Manufacturer.getManufacturer("A"), - "F12X", "Desc", Motor.Type.UNKNOWN, new double[] {}, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 1, 0 }, - new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestA"); + private static final ThrustCurveMotor motor1 = new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("A")) + .setDesignation("F12X") + .setDescription("Desc") + .setMotorType(Motor.Type.UNKNOWN) + .setStandardDelays(new double[] {}) + .setDiameter(0.024) + .setLength(0.07) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 1, 0 }) + .setCGPoints(new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }) + .setDigest("digestA") + .build(); - private static final ThrustCurveMotor motor2 = new ThrustCurveMotor( - Manufacturer.getManufacturer("A"), - "F12H", "Desc", Motor.Type.SINGLE, new double[] { 5 }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 1, 0 }, - new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestB"); + private static final ThrustCurveMotor motor2 = new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("A")) + .setDesignation("F12H") + .setDescription("Desc") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] { 5 }) + .setDiameter(0.024) + .setLength(0.07) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 1, 0 }) + .setCGPoints(new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }) + .setDigest("digestB") + .build(); - private static final ThrustCurveMotor motor3 = new ThrustCurveMotor( - Manufacturer.getManufacturer("A"), - "F12", "Desc", Motor.Type.UNKNOWN, new double[] { 0, Motor.PLUGGED }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 2, 0 }, - new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestC"); + private static final ThrustCurveMotor motor3 = new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("A")) + .setDesignation("F12") + .setDescription("Desc") + .setMotorType(Motor.Type.UNKNOWN) + .setStandardDelays(new double[] { 0, Motor.PLUGGED_DELAY }) + .setDiameter(0.024) + .setLength(0.07) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 2, 0 }) + .setCGPoints(new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }) + .setDigest("digestC") + .build(); - private static final ThrustCurveMotor motor4 = new ThrustCurveMotor( - Manufacturer.getManufacturer("A"), - "F12", "Desc", Motor.Type.HYBRID, new double[] { 0 }, - 0.024, 0.07, new double[] { 0, 1, 2 }, new double[] { 0, 2, 0 }, - new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }, "digestD"); + private static final ThrustCurveMotor motor4 = new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("A")) + .setDesignation("F12") + .setDesignation("Desc") + .setMotorType(Motor.Type.HYBRID) + .setStandardDelays(new double[] { 0 }) + .setDiameter(0.024) + .setLength(0.07) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 2, 0 }) + .setCGPoints(new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }) + .setDigest("digestD") + .build(); @Test @@ -114,7 +146,7 @@ public void testAdding() { assertEquals(motor3, set.getMotors().get(0)); assertEquals(motor2, set.getMotors().get(1)); assertEquals(motor1, set.getMotors().get(2)); - assertEquals(Arrays.asList(0.0, 5.0, Motor.PLUGGED), set.getDelays()); + assertEquals(Arrays.asList(0.0, 5.0, Motor.PLUGGED_DELAY), set.getDelays()); // Test that adding motor4 fails assertFalse(set.matches(motor4)); diff --git a/core/test/net/sf/openrocket/file/motor/TestMotorLoader.java b/core/test/net/sf/openrocket/file/motor/TestMotorLoader.java index ee8e479785..3a603fc7e0 100644 --- a/core/test/net/sf/openrocket/file/motor/TestMotorLoader.java +++ b/core/test/net/sf/openrocket/file/motor/TestMotorLoader.java @@ -53,7 +53,7 @@ public void testZipMotorLoader() throws IOException { private void test(MotorLoader loader, String file, String... digests) throws IOException { - List<Motor> motors; + List<ThrustCurveMotor.Builder> motors; InputStream is = this.getClass().getResourceAsStream(file); assertNotNull("File " + file + " not found", is); @@ -63,7 +63,7 @@ private void test(MotorLoader loader, String file, String... digests) throws IOE String[] d = new String[digests.length]; for (int i = 0; i < motors.size(); i++) { - d[i] = ((ThrustCurveMotor) motors.get(i)).getDigest(); + d[i] = motors.get(i).build().getDigest(); } Arrays.sort(digests); diff --git a/core/test/net/sf/openrocket/file/openrocket/OpenRocketSaverTest.java b/core/test/net/sf/openrocket/file/openrocket/OpenRocketSaverTest.java index ca18850a10..6e6cac7f40 100644 --- a/core/test/net/sf/openrocket/file/openrocket/OpenRocketSaverTest.java +++ b/core/test/net/sf/openrocket/file/openrocket/OpenRocketSaverTest.java @@ -25,12 +25,14 @@ import net.sf.openrocket.file.motor.GeneralMotorLoader; import net.sf.openrocket.l10n.DebugTranslator; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.motor.Manufacturer; import net.sf.openrocket.motor.Motor; import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.plugin.PluginModule; import net.sf.openrocket.simulation.extension.impl.ScriptingExtension; import net.sf.openrocket.simulation.extension.impl.ScriptingUtil; import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.TestRockets; import org.junit.After; @@ -47,7 +49,7 @@ public class OpenRocketSaverTest { private OpenRocketSaver saver = new OpenRocketSaver(); - private static final String TMP_DIR = "./tmp/"; + private static final File TMP_DIR = new File("./tmp/"); public static final String SIMULATION_EXTENSION_SCRIPT = "// Test < &\n// >\n// <![CDATA["; @@ -70,23 +72,19 @@ protected void configure() { injector = Guice.createInjector(Modules.override(applicationModule).with(dbOverrides), pluginModule); Application.setInjector(injector); - File tmpDir = new File("./tmp"); - if (!tmpDir.exists()) { - boolean success = tmpDir.mkdirs(); + if( !(TMP_DIR.exists() && TMP_DIR.isDirectory()) ){ + boolean success = TMP_DIR.mkdirs(); if (!success) { fail("Unable to create core/tmp dir needed for tests."); } } } - @After public void deleteRocketFilesFromTemp() { final String fileNameMatchStr = String.format("%s_.*\\.ork", this.getClass().getName()); - File directory = new File(TMP_DIR); - - File[] toBeDeleted = directory.listFiles(new FileFilter() { + File[] toBeDeleted = TMP_DIR.listFiles(new FileFilter() { @Override public boolean accept(File theFile) { if (theFile.isFile()) { @@ -129,6 +127,7 @@ public void testCreateLoadSave() { rocketDocs.add(TestRockets.makeTestRocket_v106_withRecoveryDeviceDeploymentConfig()); rocketDocs.add(TestRockets.makeTestRocket_v106_withStageSeparationConfig()); rocketDocs.add(TestRockets.makeTestRocket_v107_withSimulationExtension(SIMULATION_EXTENSION_SCRIPT)); + rocketDocs.add(TestRockets.makeTestRocket_v108_withBoosters()); rocketDocs.add(TestRockets.makeTestRocket_for_estimateFileSize()); StorageOptions options = new StorageOptions(); @@ -190,118 +189,14 @@ public void testEstimateFileSize() { } - //////////////////////////////// - // Tests for File Version 1.0 // - //////////////////////////////// - - @Test - public void testFileVersion100() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v100(); - assertEquals(100, getCalculatedFileVersion(rocketDoc)); - } - - //////////////////////////////// - // Tests for File Version 1.1 // - //////////////////////////////// - - @Test - public void testFileVersion101_withFinTabs() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v101_withFinTabs(); - assertEquals(101, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion101_withTubeCouplerChild() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v101_withTubeCouplerChild(); - assertEquals(101, getCalculatedFileVersion(rocketDoc)); - } - - //////////////////////////////// - // Tests for File Version 1.2 // - //////////////////////////////// - - // no version 1.2 file type exists - - //////////////////////////////// - // Tests for File Version 1.3 // - //////////////////////////////// - - // no version 1.3 file type exists - - //////////////////////////////// - // Tests for File Version 1.4 // - //////////////////////////////// - - @Test - public void testFileVersion104_withSimulationData() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v104_withSimulationData(); - assertEquals(104, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion104_withMotor() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v104_withMotor(); - assertEquals(104, getCalculatedFileVersion(rocketDoc)); - } - - //////////////////////////////// - // Tests for File Version 1.5 // - //////////////////////////////// - - @Test - public void testFileVersion105_withComponentPresets() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v105_withComponentPreset(); - assertEquals(105, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion105_withCustomExpressions() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v105_withCustomExpression(); - assertEquals(105, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion105_withLowerStageRecoveryDevice() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v105_withLowerStageRecoveryDevice(); - assertEquals(105, getCalculatedFileVersion(rocketDoc)); - } - - //////////////////////////////// - // Tests for File Version 1.6 // - //////////////////////////////// - - @Test - public void testFileVersion106_withAppearance() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v106_withAppearance(); - assertEquals(106, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion106_withMotorMountIgnitionConfig() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v106_withMotorMountIgnitionConfig(); - assertEquals(106, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion106_withRecoveryDeviceDeploymentConfig() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v106_withRecoveryDeviceDeploymentConfig(); - assertEquals(106, getCalculatedFileVersion(rocketDoc)); - } - - @Test - public void testFileVersion106_withStageDeploymentConfig() { - OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v106_withStageSeparationConfig(); - assertEquals(106, getCalculatedFileVersion(rocketDoc)); - } - //////////////////////////////// // Tests for File Version 1.7 // //////////////////////////////// @Test - public void testFileVersion107_withSimulationExtension() { + public void testFileVersion108_withSimulationExtension() { OpenRocketDocument rocketDoc = TestRockets.makeTestRocket_v107_withSimulationExtension(SIMULATION_EXTENSION_SCRIPT); - assertEquals(107, getCalculatedFileVersion(rocketDoc)); + assertEquals(108, getCalculatedFileVersion(rocketDoc)); } @@ -327,25 +222,24 @@ private OpenRocketDocument loadRocket(String fileName) { } private File saveRocket(OpenRocketDocument rocketDoc, StorageOptions options) { - String fileName = String.format(TMP_DIR + "%s_%s.ork", this.getClass().getName(), rocketDoc.getRocket().getName()); - File file = new File(fileName); - + File file = null; OutputStream out = null; try { + file = File.createTempFile( TMP_DIR.getName(), ".ork"); out = new FileOutputStream(file); this.saver.save(out, rocketDoc, options); } catch (FileNotFoundException e) { - fail("FileNotFound saving file " + fileName + ": " + e.getMessage()); + fail("FileNotFound saving temp file in: " + TMP_DIR.getName() + ": " + e.getMessage()); } catch (IOException e) { - fail("IOException saving file " + fileName + ": " + e.getMessage()); - } - - try { - if (out != null) { - out.close(); + fail("IOException saving temp file in: " + TMP_DIR.getName() + ": " + e.getMessage()); + }finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + fail("Unable to close output stream for temp file in " + TMP_DIR.getName() + ": " + e.getMessage()); } - } catch (IOException e) { - fail("Unable to close output stream for file " + fileName + ": " + e.getMessage()); } return file; @@ -357,8 +251,8 @@ private static ThrustCurveMotor readMotor() { InputStream is = OpenRocketSaverTest.class.getResourceAsStream("/net/sf/openrocket/Estes_A8.rse"); assertNotNull("Problem in unit test, cannot find Estes_A8.rse", is); try { - for (Motor m : loader.load(is, "Estes_A8.rse")) { - return (ThrustCurveMotor) m; + for (ThrustCurveMotor.Builder m : loader.load(is, "Estes_A8.rse")) { + return m.build(); } is.close(); } catch (IOException e) { @@ -384,8 +278,21 @@ private static class MotorDbProvider implements Provider<ThrustCurveMotorSetData public MotorDbProvider() { db.addMotor(readMotor()); - - assertEquals(1, db.getMotorSets().size()); + db.addMotor( new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("A")) + .setDesignation("F12X") + .setDescription("Desc") + .setMotorType(Motor.Type.UNKNOWN) + .setStandardDelays(new double[] {}) + .setDiameter(0.024) + .setLength(0.07) + .setTimePoints(new double[] { 0, 1, 2 }) + .setThrustPoints(new double[] { 0, 1, 0 }) + .setCGPoints(new Coordinate[] { Coordinate.NUL, Coordinate.NUL, Coordinate.NUL }) + .setDigest("digestA") + .build()); + + assertEquals(2, db.getMotorSets().size()); } @Override diff --git a/core/test/net/sf/openrocket/file/openrocket/importt/DocumentConfigTest.java b/core/test/net/sf/openrocket/file/openrocket/importt/DocumentConfigTest.java index e095480b88..526f5f4db2 100644 --- a/core/test/net/sf/openrocket/file/openrocket/importt/DocumentConfigTest.java +++ b/core/test/net/sf/openrocket/file/openrocket/importt/DocumentConfigTest.java @@ -1,11 +1,6 @@ package net.sf.openrocket.file.openrocket.importt; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Arrays; -import java.util.List; - import net.sf.openrocket.file.openrocket.OpenRocketSaver; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; @@ -13,29 +8,6 @@ public class DocumentConfigTest extends BaseTestCase { - /** - * Check that unit tests exist for all supported OR file versions. - * - * This test is here to remind future developers to update the unit tests after adding a file version. - * - * Whenever a new file version is created, this test needs to be updated after new unit tests - * are created in OpenRocketSaver.java for the new file version. - */ - @Test - public void testAllVersionsTested() { - - // Update this after creating new unit tests in OpenRocketSaver for a new OR file version - String[] testedVersionsStr = { "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7" }; - - List<String> supportedVersions = Arrays.asList(DocumentConfig.SUPPORTED_VERSIONS); - List<String> testedVersions = Arrays.asList(testedVersionsStr); - - for (String supportedVersion : supportedVersions) { - String msg = String.format("No unit tests exist for OpenRocket file version %s", supportedVersion); - assertTrue(msg, testedVersions.contains(supportedVersion)); - } - } - @Test public void testFileVersionDivisor() { assertEquals(OpenRocketSaver.FILE_VERSION_DIVISOR, DocumentConfig.FILE_VERSION_DIVISOR); diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/BodyTubeHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/BodyTubeHandlerTest.java index 0c7b19469d..66e551581a 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/BodyTubeHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/BodyTubeHandlerTest.java @@ -9,7 +9,7 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.ExternalComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import org.junit.Assert; import org.junit.Test; @@ -37,7 +37,7 @@ public void testConstructor() throws Exception { //success } - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); BodyTubeHandler handler = new BodyTubeHandler(null, stage, new WarningSet()); BodyTube component = (BodyTube) getField(handler, "bodyTube"); assertContains(component, stage.getChildren()); @@ -50,8 +50,8 @@ public void testConstructor() throws Exception { */ @Test public void testOpenElement() throws Exception { - Assert.assertEquals(PlainTextHandler.INSTANCE, new BodyTubeHandler(null, new Stage(), new WarningSet()).openElement(null, null, null)); - Assert.assertNotNull(new BodyTubeHandler(null, new Stage(), new WarningSet()).openElement("AttachedParts", null, null)); + Assert.assertEquals(PlainTextHandler.INSTANCE, new BodyTubeHandler(null, new AxialStage(), new WarningSet()).openElement(null, null, null)); + Assert.assertNotNull(new BodyTubeHandler(null, new AxialStage(), new WarningSet()).openElement("AttachedParts", null, null)); } /** @@ -62,7 +62,7 @@ public void testOpenElement() throws Exception { */ @Test public void testCloseElement() throws Exception { - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); BodyTubeHandler handler = new BodyTubeHandler(null, stage, new WarningSet()); BodyTube component = (BodyTube) getField(handler, "bodyTube"); HashMap<String, String> attributes = new HashMap<String, String>(); @@ -134,7 +134,7 @@ public void testCloseElement() throws Exception { */ @Test public void testGetComponent() throws Exception { - Assert.assertTrue(new BodyTubeHandler(null, new Stage(), new WarningSet()).getComponent() instanceof BodyTube); + Assert.assertTrue(new BodyTubeHandler(null, new AxialStage(), new WarningSet()).getComponent() instanceof BodyTube); } /** @@ -144,7 +144,7 @@ public void testGetComponent() throws Exception { */ @Test public void testGetMaterialType() throws Exception { - Assert.assertEquals(Material.Type.BULK, new BodyTubeHandler(null, new Stage(), new WarningSet()).getMaterialType()); + Assert.assertEquals(Material.Type.BULK, new BodyTubeHandler(null, new AxialStage(), new WarningSet()).getMaterialType()); } } diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/FinSetHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/FinSetHandlerTest.java index a963e52d4a..2975282897 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/FinSetHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/FinSetHandlerTest.java @@ -3,29 +3,77 @@ */ package net.sf.openrocket.file.rocksim.importt; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashMap; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import com.google.inject.util.Modules; + +import net.sf.openrocket.ServicesForTesting; import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.l10n.DebugTranslator; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.plugin.PluginModule; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.EllipticalFinSet; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; +import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; -import java.lang.reflect.Method; -import java.util.HashMap; /** * FinSetHandler Tester. * */ -public class FinSetHandlerTest extends TestCase { - +public class FinSetHandlerTest { + + final static double EPSILON = MathUtil.EPSILON; + + @BeforeClass + public static void setup() { + Module applicationModule = new ServicesForTesting(); + + Module pluginModule = new PluginModule(); + + Module debugTranslator = new AbstractModule() { + @Override + protected void configure() { + bind(Translator.class).toInstance(new DebugTranslator(null)); + } + }; + + Injector injector = Guice.createInjector(Modules.override(applicationModule).with(debugTranslator), pluginModule); + + Application.setInjector(injector); + + File tmpDir = new File("./tmp"); + if (!tmpDir.exists()) { + boolean success = tmpDir.mkdirs(); + assertTrue("Unable to create core/tmp dir needed for tests.", success); + } + + } + + /** * Method: asOpenRocket(WarningSet warnings) * * @throws Exception thrown if something goes awry */ - @org.junit.Test + @Test public void testAsOpenRocket() throws Exception { FinSetHandler dto = new FinSetHandler(null, new BodyTube()); @@ -37,15 +85,15 @@ public void testAsOpenRocket() throws Exception { dto.closeElement("ShapeCode", attributes, "0", warnings); dto.closeElement("Xb", attributes, "2", warnings); dto.closeElement("FinCount", attributes, "4", warnings); - dto.closeElement("RootChord", attributes, "10", warnings); - dto.closeElement("TipChord", attributes, "11", warnings); + dto.closeElement("RootChord", attributes, "100", warnings); + dto.closeElement("TipChord", attributes, "50", warnings); dto.closeElement("SemiSpan", attributes, "12", warnings); dto.closeElement("MidChordLen", attributes, "13", warnings); dto.closeElement("SweepDistance", attributes, "14", warnings); dto.closeElement("Thickness", attributes, "200", warnings); dto.closeElement("TipShapeCode", attributes, "1", warnings); - dto.closeElement("TabLength", attributes, "400", warnings); - dto.closeElement("TabDepth", attributes, "500", warnings); + dto.closeElement("TabLength", attributes, "40", warnings); + dto.closeElement("TabDepth", attributes, "50", warnings); dto.closeElement("TabOffset", attributes, "30", warnings); dto.closeElement("RadialAngle", attributes, ".123", warnings); dto.closeElement("PointList", attributes, "20,0|2,2|0,0", warnings); @@ -55,34 +103,37 @@ public void testAsOpenRocket() throws Exception { FinSet fins = dto.asOpenRocket(set); assertNotNull(fins); assertEquals(0, set.size()); + + String debugInfo = fins.toDebugDetail().toString(); assertEquals("The name", fins.getName()); assertTrue(fins instanceof TrapezoidFinSet); - assertEquals(4, fins.getFinCount()); + assertEquals("imported fin count does not match.", 4, fins.getFinCount()); - assertEquals(0.012d, ((TrapezoidFinSet) fins).getHeight()); - assertEquals(0.012d, fins.getSpan()); + assertEquals("imported fin height does not match.", 0.012d, ((TrapezoidFinSet) fins).getHeight(), EPSILON); + assertEquals("imported fin span does not match.", 0.012d, fins.getSpan(), EPSILON); - assertEquals(0.2d, fins.getThickness()); - assertEquals(0.4d, fins.getTabLength()); - assertEquals(0.5d, fins.getTabHeight()); - assertEquals(0.03d, fins.getTabShift()); - assertEquals(.123d, fins.getBaseRotation()); + assertEquals("imported fin thickness does not match.", 0.2d, fins.getThickness(), EPSILON); + assertEquals("imported fin tab length does not match: "+debugInfo, 0.04d, fins.getTabLength(), EPSILON); + assertEquals("imported fin tab height does not match: "+debugInfo, 0.05d, fins.getTabHeight(), EPSILON); + assertEquals("imported fin shift does not match.", 0.03d, fins.getTabOffset(), EPSILON); + assertEquals("imported fin rotation does not match.", .123d, fins.getBaseRotation(), EPSILON); dto.closeElement("ShapeCode", attributes, "1", warnings); + fins = dto.asOpenRocket(set); assertNotNull(fins); assertEquals(0, set.size()); assertEquals("The name", fins.getName()); assertTrue(fins instanceof EllipticalFinSet); - assertEquals(4, fins.getFinCount()); + assertEquals("imported fin count does not match.", 4, fins.getFinCount()); - assertEquals(0.2d, fins.getThickness()); - assertEquals(0.4d, fins.getTabLength()); - assertEquals(0.5d, fins.getTabHeight()); - assertEquals(0.03d, fins.getTabShift()); - assertEquals(.123d, fins.getBaseRotation()); + assertEquals("imported fin thickness does not match.", 0.2d, fins.getThickness(), EPSILON); + assertEquals("imported fin tab length does not match.", 0.04d, fins.getTabLength(), EPSILON); + assertEquals("imported fin tab height does not match.", 0.05d, fins.getTabHeight(), EPSILON); + assertEquals("imported fin tab shift does not match.", 0.03d, fins.getTabOffset(), EPSILON); + assertEquals("imported fin rotation does not match.", .123d, fins.getBaseRotation(), EPSILON); } diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandlerTest.java index b361c33b29..418f24584f 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/InnerBodyTubeHandlerTest.java @@ -9,7 +9,7 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.InnerTube; -import net.sf.openrocket.rocketcomponent.RocketComponent; + import org.junit.Assert; import java.util.HashMap; @@ -117,20 +117,6 @@ public void testCloseElement() throws Exception { handler.closeElement("Name", attributes, "Test Name", warnings); Assert.assertEquals("Test Name", component.getName()); } - - /** - * Method: setRelativePosition(RocketComponent.Position position) - * - * @throws Exception thrown if something goes awry - */ - @org.junit.Test - public void testSetRelativePosition() throws Exception { - BodyTube tube = new BodyTube(); - InnerBodyTubeHandler handler = new InnerBodyTubeHandler(null, tube, new WarningSet()); - InnerTube component = (InnerTube) getField(handler, "bodyTube"); - handler.setRelativePosition(RocketComponent.Position.ABSOLUTE); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); - } /** * Method: getComponent() diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/LaunchLugHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/LaunchLugHandlerTest.java index df4e5400f2..6d62f99140 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/LaunchLugHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/LaunchLugHandlerTest.java @@ -10,7 +10,7 @@ import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.LaunchLug; -import net.sf.openrocket.rocketcomponent.RocketComponent; + import org.junit.Assert; import java.util.HashMap; @@ -108,20 +108,6 @@ public void testCloseElement() throws Exception { handler.closeElement("Name", attributes, "Test Name", warnings); Assert.assertEquals("Test Name", component.getName()); } - - /** - * Method: setRelativePosition(RocketComponent.Position position) - * - * @throws Exception thrown if something goes awry - */ - @org.junit.Test - public void testSetRelativePosition() throws Exception { - BodyTube tube = new BodyTube(); - LaunchLugHandler handler = new LaunchLugHandler(null, tube, new WarningSet()); - LaunchLug component = (LaunchLug) getField(handler, "lug"); - handler.setRelativePosition(RocketComponent.Position.ABSOLUTE); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); - } /** * Method: getComponent() diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/MassObjectHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/MassObjectHandlerTest.java index 99094d8e20..543bbe07d4 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/MassObjectHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/MassObjectHandlerTest.java @@ -9,7 +9,7 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.MassComponent; -import net.sf.openrocket.rocketcomponent.RocketComponent; + import org.junit.Assert; import java.util.HashMap; @@ -89,20 +89,6 @@ public void testCloseElement() throws Exception { warnings.clear(); } - - /** - * Method: setRelativePosition(RocketComponent.Position position) - * - * @throws Exception thrown if something goes awry - */ - @org.junit.Test - public void testSetRelativePosition() throws Exception { - BodyTube tube = new BodyTube(); - MassObjectHandler handler = new MassObjectHandler(null, tube, new WarningSet()); - MassComponent component = (MassComponent) getField(handler, "mass"); - handler.setRelativePosition(RocketComponent.Position.ABSOLUTE); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); - } /** * Method: getComponent() diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/NoseConeHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/NoseConeHandlerTest.java index 6b88cb82f1..e9650da7b3 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/NoseConeHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/NoseConeHandlerTest.java @@ -10,7 +10,7 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.NoseCone; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.Transition; import org.junit.Assert; import org.junit.Test; @@ -39,7 +39,7 @@ public void testConstructor() throws Exception { //success } - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); NoseConeHandler handler = new NoseConeHandler(null, stage, new WarningSet()); NoseCone component = (NoseCone) getField(handler, "noseCone"); assertContains(component, stage.getChildren()); @@ -52,8 +52,8 @@ public void testConstructor() throws Exception { */ @Test public void testOpenElement() throws Exception { - Assert.assertEquals(PlainTextHandler.INSTANCE, new NoseConeHandler(null, new Stage(), new WarningSet()).openElement(null, null, null)); - Assert.assertNotNull(new NoseConeHandler(null, new Stage(), new WarningSet()).openElement("AttachedParts", null, null)); + Assert.assertEquals(PlainTextHandler.INSTANCE, new NoseConeHandler(null, new AxialStage(), new WarningSet()).openElement(null, null, null)); + Assert.assertNotNull(new NoseConeHandler(null, new AxialStage(), new WarningSet()).openElement("AttachedParts", null, null)); } /** @@ -65,7 +65,7 @@ public void testOpenElement() throws Exception { @Test public void testCloseElement() throws Exception { - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); HashMap<String, String> attributes = new HashMap<String, String>(); WarningSet warnings = new WarningSet(); @@ -188,7 +188,7 @@ public void testCloseElement() throws Exception { */ @Test public void testGetComponent() throws Exception { - Assert.assertTrue(new NoseConeHandler(null, new Stage(), new WarningSet()).getComponent() instanceof NoseCone); + Assert.assertTrue(new NoseConeHandler(null, new AxialStage(), new WarningSet()).getComponent() instanceof NoseCone); } /** @@ -198,6 +198,6 @@ public void testGetComponent() throws Exception { */ @Test public void testGetMaterialType() throws Exception { - Assert.assertEquals(Material.Type.BULK, new NoseConeHandler(null, new Stage(), new WarningSet()).getMaterialType()); + Assert.assertEquals(Material.Type.BULK, new NoseConeHandler(null, new AxialStage(), new WarningSet()).getMaterialType()); } } diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/ParachuteHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/ParachuteHandlerTest.java index 431d33c95f..35b4318184 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/ParachuteHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/ParachuteHandlerTest.java @@ -3,16 +3,17 @@ */ package net.sf.openrocket.file.rocksim.importt; +import java.util.HashMap; + +import org.junit.Assert; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.Parachute; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import org.junit.Assert; - -import java.util.HashMap; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; /** * ParachuteHandler Tester. @@ -103,17 +104,17 @@ public void testConstructor() throws Exception { } /** - * Method: setRelativePosition(RocketComponent.Position position) + * Method: setAxialMethod(AxialMethod position) * * @throws Exception thrown if something goes awry */ @org.junit.Test - public void testSetRelativePosition() throws Exception { + public void testSetAxialMethod() throws Exception { BodyTube tube = new BodyTube(); ParachuteHandler handler = new ParachuteHandler(null, tube, new WarningSet()); Parachute component = (Parachute) getField(handler, "chute"); - handler.setRelativePosition(RocketComponent.Position.ABSOLUTE); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); + handler.getComponent().setAxialMethod(AxialMethod.ABSOLUTE); + Assert.assertEquals(AxialMethod.ABSOLUTE, component.getAxialMethod()); } /** @@ -152,13 +153,13 @@ public void testEndHandler() throws Exception { handler.closeElement("Xb", attributes, "-10", warnings); handler.closeElement("LocationMode", attributes, "1", warnings); handler.endHandler("Parachute", attributes, null, warnings); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); - Assert.assertEquals(component.getPositionValue(), -10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); + Assert.assertEquals(AxialMethod.ABSOLUTE, component.getAxialMethod()); + Assert.assertEquals(component.getAxialOffset(), -10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); handler.closeElement("Xb", attributes, "-10", warnings); handler.closeElement("LocationMode", attributes, "2", warnings); handler.endHandler("Parachute", attributes, null, warnings); - Assert.assertEquals(RocketComponent.Position.BOTTOM, component.getRelativePosition()); - Assert.assertEquals(component.getPositionValue(), 10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); + Assert.assertEquals(AxialMethod.BOTTOM, component.getAxialMethod()); + Assert.assertEquals(component.getAxialOffset(), 10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); } } diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/RingHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/RingHandlerTest.java index 8b06b848bc..970d4e8b81 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/RingHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/RingHandlerTest.java @@ -3,6 +3,11 @@ */ package net.sf.openrocket.file.rocksim.importt; +import java.util.HashMap; + +import org.junit.Assert; +import org.junit.Test; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.simplesax.PlainTextHandler; @@ -12,12 +17,8 @@ import net.sf.openrocket.rocketcomponent.CenteringRing; import net.sf.openrocket.rocketcomponent.EngineBlock; import net.sf.openrocket.rocketcomponent.RingComponent; -import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.TubeCoupler; -import org.junit.Assert; -import org.junit.Test; - -import java.util.HashMap; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; /** * RingHandler Tester. @@ -87,7 +88,11 @@ public void testCloseElement() throws Exception { public void testBulkhead() throws Exception { BodyTube tube = new BodyTube(); RingHandler handler = new RingHandler(null, tube, new WarningSet()); - CenteringRing component = (CenteringRing) getField(handler, "ring"); + + + @SuppressWarnings("unused") + CenteringRing component = (CenteringRing) getField(handler, "ring"); + HashMap<String, String> attributes = new HashMap<String, String>(); WarningSet warnings = new WarningSet(); @@ -108,8 +113,8 @@ public void testBulkhead() throws Exception { Assert.assertEquals(10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, child.getLength(), 0.001); Assert.assertEquals("Test Name", child.getName()); Assert.assertEquals(109.9/1000, child.getMass(), 0.001); - Assert.assertEquals(0, child.getPositionValue(), 0.0); - Assert.assertEquals(RocketComponent.Position.TOP, child.getRelativePosition()); + Assert.assertEquals(0, child.getAxialOffset(), 0.0); + Assert.assertEquals(AxialMethod.TOP, child.getAxialMethod()); Assert.assertTrue(child instanceof Bulkhead); } @@ -144,8 +149,8 @@ public void testTubeCoupler() throws Exception { Assert.assertEquals(10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, child.getLength(), 0.001); Assert.assertEquals("Test Name", child.getName()); Assert.assertEquals(109.9/1000, child.getMass(), 0.001); - Assert.assertEquals(0, child.getPositionValue(), 0.0); - Assert.assertEquals(RocketComponent.Position.TOP, child.getRelativePosition()); + Assert.assertEquals(0, child.getAxialOffset(), 0.0); + Assert.assertEquals(AxialMethod.TOP, child.getAxialMethod()); } /** @@ -179,8 +184,8 @@ public void testEngineBlock() throws Exception { Assert.assertEquals(10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, child.getLength(), 0.001); Assert.assertEquals("Test Name", child.getName()); Assert.assertEquals(109.9/1000, child.getMass(), 0.001); - Assert.assertEquals(0, child.getPositionValue(), 0.0); - Assert.assertEquals(RocketComponent.Position.TOP, child.getRelativePosition()); + Assert.assertEquals(0, child.getAxialOffset(), 0.0); + Assert.assertEquals(AxialMethod.TOP, child.getAxialMethod()); Assert.assertEquals(4d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, child.getCG().x, 0.000001); } @@ -214,8 +219,8 @@ public void testRing() throws Exception { Assert.assertEquals(10d / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, child.getLength(), 0.001); Assert.assertEquals("Test Name", child.getName()); Assert.assertEquals(109.9/1000, child.getMass(), 0.001); - Assert.assertEquals(0, child.getPositionValue(), 0.0); - Assert.assertEquals(RocketComponent.Position.TOP, child.getRelativePosition()); + Assert.assertEquals(0, child.getAxialOffset(), 0.0); + Assert.assertEquals(AxialMethod.TOP, child.getAxialMethod()); Assert.assertTrue(child instanceof CenteringRing); } @@ -237,23 +242,10 @@ public void testConstructor() throws Exception { BodyTube tube = new BodyTube(); RingHandler handler = new RingHandler(null, tube, new WarningSet()); - CenteringRing component = (CenteringRing) getField(handler, "ring"); - } - - /** - * Method: setRelativePosition(RocketComponent.Position position) - * - * @throws Exception thrown if something goes awry - */ - @org.junit.Test - public void testSetRelativePosition() throws Exception { - BodyTube tube = new BodyTube(); - RingHandler handler = new RingHandler(null, tube, new WarningSet()); - CenteringRing component = (CenteringRing) getField(handler, "ring"); - handler.setRelativePosition(RocketComponent.Position.ABSOLUTE); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); + + @SuppressWarnings("unused") + CenteringRing component = (CenteringRing) getField(handler, "ring"); } - /** * Method: getComponent() diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/RocksimLoaderTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/RocksimLoaderTest.java index 72d8be26c4..288396feeb 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/RocksimLoaderTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/RocksimLoaderTest.java @@ -4,21 +4,22 @@ */ package net.sf.openrocket.file.rocksim.importt; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.Assert; + import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.OpenRocketDocumentFactory; import net.sf.openrocket.file.DatabaseMotorFinder; import net.sf.openrocket.file.DocumentLoadingContext; import net.sf.openrocket.file.RocketLoadException; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; -import org.junit.Assert; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; /** * RocksimLoader Tester. @@ -85,13 +86,13 @@ public void testLoadFromStream() throws Exception { Assert.assertEquals("Three Stage Everything Included Rocket", doc.getRocket().getName()); Assert.assertEquals(0, loader.getWarnings().size()); Assert.assertEquals(3, rocket.getStageCount()); - Stage stage1 = (Stage) rocket.getChild(0); + AxialStage stage1 = (AxialStage) rocket.getChild(0); Assert.assertFalse(stage1.isMassOverridden()); Assert.assertFalse(stage1.isCGOverridden()); - Stage stage2 = (Stage) rocket.getChild(1); + AxialStage stage2 = (AxialStage) rocket.getChild(1); Assert.assertFalse(stage2.isMassOverridden()); Assert.assertFalse(stage2.isCGOverridden()); - Stage stage3 = (Stage) rocket.getChild(2); + AxialStage stage3 = (AxialStage) rocket.getChild(2); Assert.assertFalse(stage3.isMassOverridden()); Assert.assertFalse(stage3.isCGOverridden()); @@ -109,9 +110,9 @@ public void testLoadFromStream() throws Exception { Assert.assertNotNull(rocket); Assert.assertEquals("Three Stage Everything Included Rocket - Override Total Mass/CG", doc.getRocket().getName()); Assert.assertEquals(3, rocket.getStageCount()); - stage1 = (Stage) rocket.getChild(0); - stage2 = (Stage) rocket.getChild(1); - stage3 = (Stage) rocket.getChild(2); + stage1 = (AxialStage) rocket.getChild(0); + stage2 = (AxialStage) rocket.getChild(1); + stage3 = (AxialStage) rocket.getChild(2); //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. @@ -133,7 +134,7 @@ public void testLoadFromStream() throws Exception { BodyTube bt = (BodyTube) stage2.getChild(0); LaunchLug ll = (LaunchLug) bt.getChild(6); - Assert.assertEquals(1.22d, ll.getRadialDirection(), 0.001); + Assert.assertEquals(1.22d, ll.getAngularOffset(), 0.001); Assert.assertEquals(2, stage3.getChildCount()); Assert.assertEquals("Transition", stage3.getChild(0).getName()); @@ -170,7 +171,7 @@ public void testSubAssemblyRocket() throws IOException, RocketLoadException { rocket = doc.getRocket(); Assert.assertNotNull(rocket); Assert.assertEquals(1, rocket.getStageCount()); - Stage stage1 = (Stage) rocket.getChild(0); + AxialStage stage1 = (AxialStage) 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()); diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/StreamerHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/StreamerHandlerTest.java index d6370e29c7..5b0c7ce784 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/StreamerHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/StreamerHandlerTest.java @@ -3,18 +3,19 @@ */ package net.sf.openrocket.file.rocksim.importt; +import java.util.HashMap; + +import org.junit.Assert; +import org.junit.Test; + import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.file.rocksim.RocksimCommonConstants; import net.sf.openrocket.file.rocksim.RocksimDensityType; import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.BodyTube; -import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Streamer; -import org.junit.Assert; -import org.junit.Test; - -import java.util.HashMap; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; /** * StreamerHandler Tester. @@ -99,7 +100,7 @@ public void testConstructor() throws Exception { } /** - * Method: setRelativePosition(RocketComponent.Position position) + * Method: setRelativePosition(AxialMethod position) * * @throws Exception thrown if something goes awry */ @@ -108,8 +109,8 @@ public void testSetRelativePosition() throws Exception { BodyTube tube = new BodyTube(); StreamerHandler handler = new StreamerHandler(null, tube, new WarningSet()); Streamer component = (Streamer) getField(handler, "streamer"); - handler.setRelativePosition(RocketComponent.Position.ABSOLUTE); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); + handler.getComponent().setAxialMethod(AxialMethod.ABSOLUTE); + Assert.assertEquals(AxialMethod.ABSOLUTE, component.getAxialMethod()); } /** @@ -148,14 +149,14 @@ public void testEndHandler() throws Exception { handler.closeElement("Xb", attributes, "-10", warnings); handler.closeElement("LocationMode", attributes, "1", warnings); handler.endHandler("Streamer", attributes, null, warnings); - Assert.assertEquals(RocketComponent.Position.ABSOLUTE, component.getRelativePosition()); - Assert.assertEquals(component.getPositionValue(), -10d/ RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); + Assert.assertEquals(AxialMethod.ABSOLUTE, component.getAxialMethod()); + Assert.assertEquals(component.getAxialOffset(), -10d/ RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); handler.closeElement("Xb", attributes, "-10", warnings); handler.closeElement("LocationMode", attributes, "2", warnings); handler.endHandler("Streamer", attributes, null, warnings); - Assert.assertEquals(RocketComponent.Position.BOTTOM, component.getRelativePosition()); - Assert.assertEquals(component.getPositionValue(), 10d/ RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); + Assert.assertEquals(AxialMethod.BOTTOM, component.getAxialMethod()); + Assert.assertEquals(component.getAxialOffset(), 10d/ RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH, 0.001); handler.closeElement("Thickness", attributes, "0.02", warnings); Assert.assertEquals(0.01848, handler.computeDensity(RocksimDensityType.ROCKSIM_BULK, 924d), 0.001); diff --git a/core/test/net/sf/openrocket/file/rocksim/importt/TransitionHandlerTest.java b/core/test/net/sf/openrocket/file/rocksim/importt/TransitionHandlerTest.java index a2298e8f55..fe7d43c285 100644 --- a/core/test/net/sf/openrocket/file/rocksim/importt/TransitionHandlerTest.java +++ b/core/test/net/sf/openrocket/file/rocksim/importt/TransitionHandlerTest.java @@ -9,7 +9,7 @@ import net.sf.openrocket.file.simplesax.PlainTextHandler; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.ExternalComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.Transition; import org.junit.Assert; @@ -36,7 +36,7 @@ public void testConstructor() throws Exception { //success } - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); TransitionHandler handler = new TransitionHandler(null, stage, new WarningSet()); Transition component = (Transition) getField(handler, "transition"); assertContains(component, stage.getChildren()); @@ -49,7 +49,7 @@ public void testConstructor() throws Exception { */ @org.junit.Test public void testOpenElement() throws Exception { - Assert.assertEquals(PlainTextHandler.INSTANCE, new TransitionHandler(null, new Stage(), new WarningSet()).openElement(null, null, null)); + Assert.assertEquals(PlainTextHandler.INSTANCE, new TransitionHandler(null, new AxialStage(), new WarningSet()).openElement(null, null, null)); } /** @@ -60,7 +60,7 @@ public void testOpenElement() throws Exception { @org.junit.Test public void testCloseElement() throws Exception { - Stage stage = new Stage(); + AxialStage stage = new AxialStage(); HashMap<String, String> attributes = new HashMap<String, String>(); WarningSet warnings = new WarningSet(); @@ -214,7 +214,7 @@ public void testCloseElement() throws Exception { */ @org.junit.Test public void testGetComponent() throws Exception { - Assert.assertTrue(new TransitionHandler(null, new Stage(), new WarningSet()).getComponent() instanceof Transition); + Assert.assertTrue(new TransitionHandler(null, new AxialStage(), new WarningSet()).getComponent() instanceof Transition); } /** @@ -224,7 +224,7 @@ public void testGetComponent() throws Exception { */ @org.junit.Test public void testGetMaterialType() throws Exception { - Assert.assertEquals(Material.Type.BULK, new TransitionHandler(null, new Stage(), new WarningSet()).getMaterialType()); + Assert.assertEquals(Material.Type.BULK, new TransitionHandler(null, new AxialStage(), new WarningSet()).getMaterialType()); } diff --git a/core/test/net/sf/openrocket/masscalc/MassCacheTest.java b/core/test/net/sf/openrocket/masscalc/MassCacheTest.java new file mode 100644 index 0000000000..15311a3124 --- /dev/null +++ b/core/test/net/sf/openrocket/masscalc/MassCacheTest.java @@ -0,0 +1,74 @@ +package net.sf.openrocket.masscalc; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class MassCacheTest extends BaseTestCase { + + + @Test + public void testCMCache() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("TestRocket."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + // ant throws in error if it can't find a test case in the *Test.java file. + // .... soooo we have this waste of space. -DMW + assertTrue( true ); + } +// +// FlightConfiguration config = rocket.getEmptyConfiguration(); +// MassCalculator mc = new MassCalculator(); +// +// { +// // validate payload stage +// AxialStage payloadStage = (AxialStage) rocket.getChild(0); +// int plNum = payloadStage.getStageNumber(); +// config.setOnlyStage( plNum ); +// +// MassData calcMass = mc.calculateBurnoutMassData( config ); +// +// double expMass = 0.116287; +// double expCMx = 0.278070785749; +// assertEquals("Upper Stage Mass is incorrect: ", expMass, calcMass.getCM().weight, EPSILON); +// assertEquals("Upper Stage CM.x is incorrect: ", expCMx, calcMass.getCM().x, EPSILON); +// assertEquals("Upper Stage CM.y is incorrect: ", 0.0f, calcMass.getCM().y, EPSILON); +// assertEquals("Upper Stage CM.z is incorrect: ", 0.0f, calcMass.getCM().z, EPSILON); +// +// MassData rocketLaunchMass = mc.getRocketLaunchMassData( config); +// assertEquals("Upper Stage Mass (cache) is incorrect: ", expMass, rocketLaunchMass.getCM().weight, EPSILON); +// assertEquals("Upper Stage CM.x (cache) is incorrect: ", expCMx, rocketLaunchMass.getCM().x, EPSILON); +// +// MassData rocketSpentMass = mc.getRocketSpentMassData( config); +// assertEquals("Upper Stage Mass (cache) is incorrect: ", expMass, rocketSpentMass.getCM().weight, EPSILON); +// assertEquals("Upper Stage CM.x (cache) is incorrect: ", expCMx, rocketSpentMass.getCM().x, EPSILON); +// }{ +// ParallelStage boosters = (ParallelStage) rocket.getChild(1).getChild(1); +// int boostNum = boosters.getStageNumber(); +// config.setOnlyStage( boostNum ); +// +// MassData boosterMass = mc.calculateBurnoutMassData( config); +// +// double expMass = BOOSTER_SET_NO_MOTORS_MASS; +// double expCMx = BOOSTER_SET_NO_MOTORS_CMX; +// assertEquals("Heavy Booster Mass is incorrect: ", expMass, boosterMass.getCM().weight, EPSILON); +// assertEquals("Heavy Booster CM.x is incorrect: ", expCMx, boosterMass.getCM().x, EPSILON); +// assertEquals("Heavy Booster CM.y is incorrect: ", 0.0f, boosterMass.getCM().y, EPSILON); +// assertEquals("Heavy Booster CM.z is incorrect: ", 0.0f, boosterMass.getCM().z, EPSILON); +// +// MassData rocketLaunchMass = mc.getRocketLaunchMassData( config); +// assertEquals(" Booster Stage Mass (cache) is incorrect: ", expMass, rocketLaunchMass.getCM().weight, EPSILON); +// assertEquals(" Booster Stage CM.x (cache) is incorrect: ", expCMx, rocketLaunchMass.getCM().x, EPSILON); +// +// MassData rocketSpentMass = mc.getRocketSpentMassData( config); +// assertEquals(" Booster Stage Mass (cache) is incorrect: ", expMass, rocketSpentMass.getCM().weight, EPSILON); +// assertEquals(" Booster Stage CM.x (cache) is incorrect: ", expCMx, rocketSpentMass.getCM().x, EPSILON); +// } +// } +// + +} diff --git a/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java b/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java new file mode 100644 index 0000000000..ab56fcc622 --- /dev/null +++ b/core/test/net/sf/openrocket/masscalc/MassCalculatorTest.java @@ -0,0 +1,817 @@ +package net.sf.openrocket.masscalc; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.BodyComponent; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.InnerTube; +import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.Parachute; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.ShockCord; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.simulation.SimulationConditions; +import net.sf.openrocket.simulation.SimulationStatus; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class MassCalculatorTest extends BaseTestCase { + + // tolerance for compared double test results + private static final double EPSILON = 0.000001; + + @Test + public void testAlphaIIIStructure() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + rocket.setName("AlphaIII."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + config.setAllStages(); + + final RigidBody actualStructure = MassCalculator.calculateStructure( config ); + final double actualRocketDryMass = actualStructure.cm.weight; + final Coordinate actualRocketDryCM = actualStructure.cm; + + double expRocketDryMass = 0.025268247714878626; + assertEquals(" Alpha III Empty Mass is incorrect: ", expRocketDryMass, actualRocketDryMass, EPSILON); + + double expCMx = 0.1917685523; + Coordinate expCM = new Coordinate(expCMx,0,0, expRocketDryMass); + assertEquals("Simple Rocket CM.x is incorrect: ", expCM.x, actualRocketDryCM.x, EPSILON); + assertEquals("Simple Rocket CM.y is incorrect: ", expCM.y, actualRocketDryCM.y, EPSILON); + assertEquals("Simple Rocket CM.z is incorrect: ", expCM.z, actualRocketDryCM.z, EPSILON); + assertEquals("Simple Rocket CM is incorrect: ", expCM, actualRocketDryCM); + } + + @Test + public void testAlphaIIILaunchMass() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + rocket.setName("AlphaIII."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfigurationByIndex(0, false); + + InnerTube mmt = (InnerTube)rocket.getChild(0).getChild(1).getChild(2); + Motor activeMotor = mmt.getMotorConfig( config.getFlightConfigurationID() ).getMotor(); + String desig = activeMotor.getDesignation(); + + RigidBody actualLaunchRigidBody = MassCalculator.calculateLaunch( config ); + double actualRocketLaunchMass = actualLaunchRigidBody.getMass(); + final Coordinate actualRocketLaunchCM = actualLaunchRigidBody.cm; + + double expRocketLaunchMass = 0.041668247714878634; + assertEquals(" Alpha III Total Mass (with motor: "+desig+") is incorrect: ", expRocketLaunchMass, actualRocketLaunchMass, EPSILON); + + double expCMx = 0.20996455968266833; + Coordinate expCM = new Coordinate(expCMx,0,0, expRocketLaunchMass); + assertEquals("Simple Rocket CM.x is incorrect: ", expCM.x, actualRocketLaunchCM.x, EPSILON); + assertEquals("Simple Rocket CM.y is incorrect: ", expCM.y, actualRocketLaunchCM.y, EPSILON); + assertEquals("Simple Rocket CM.z is incorrect: ", expCM.z, actualRocketLaunchCM.z, EPSILON); + assertEquals("Simple Rocket CM is incorrect: ", expCM, actualRocketLaunchCM); + } + + @Test + public void testAlphaIIIMotorMass() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + rocket.setName("AlphaIII."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + InnerTube mmt = (InnerTube) rocket.getChild(0).getChild(1).getChild(2); + FlightConfiguration config = rocket.getFlightConfigurationByIndex(0, false); + FlightConfigurationId fcid = config.getFlightConfigurationID(); + Motor activeMotor = mmt.getMotorConfig( fcid ).getMotor(); + String desig = activeMotor.getDesignation(); + + final double expMotorLaunchMass = activeMotor.getLaunchMass(); // 0.0164 kg + + RigidBody actualMotorData = MassCalculator.calculateMotor( config ); + + assertEquals(" Motor Mass "+desig+" is incorrect: ", expMotorLaunchMass, actualMotorData.getMass(), EPSILON); + + double expCMx = 0.238; + Coordinate expCM = new Coordinate(expCMx,0,0, expMotorLaunchMass); + assertEquals("Simple Rocket CM.x is incorrect: ", expCM.x, actualMotorData.cm.x, EPSILON); + assertEquals("Simple Rocket CM.y is incorrect: ", expCM.y, actualMotorData.cm.y, EPSILON); + assertEquals("Simple Rocket CM.z is incorrect: ", expCM.z, actualMotorData.cm.z, EPSILON); + assertEquals("Simple Rocket CM is incorrect: ", expCM, actualMotorData.cm); + } + + + @Test + public void testAlphaIIIMotorSimulationMass() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + rocket.setName("AlphaIII."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + InnerTube mmt = (InnerTube) rocket.getChild(0).getChild(1).getChild(2); + FlightConfiguration config = rocket.getFlightConfigurationByIndex(0, false); + FlightConfigurationId fcid = config.getFlightConfigurationID(); + Motor activeMotor = mmt.getMotorConfig( fcid ).getMotor(); + String desig = activeMotor.getDesignation(); + + // this is probably not enough for a full-up simulation, but it IS enough for a motor-mass calculation. + SimulationStatus status = new SimulationStatus( config, new SimulationConditions()); + + { + final double simTime = 0.03; // almost launch + status.setSimulationTime( simTime ); + RigidBody actualMotorData = MassCalculator.calculateMotor( status ); + double expMass = activeMotor.getTotalMass(simTime); + assertEquals(" Motor Mass "+desig+" is incorrect: ", expMass, actualMotorData.getMass(), EPSILON); + }{ + final double simTime = 1.03; // middle + status.setSimulationTime( simTime ); + RigidBody actualMotorData = MassCalculator.calculateMotor( status ); + double expMass = activeMotor.getTotalMass(simTime); + assertEquals(" Motor Mass "+desig+" is incorrect: ", expMass, actualMotorData.getMass(), EPSILON); + }{ + final double simTime = 2.03; // after burnout + status.setSimulationTime( simTime ); + RigidBody actualMotorData = MassCalculator.calculateMotor( status ); + double expMass = activeMotor.getTotalMass(simTime); + assertEquals(" Motor Mass "+desig+" is incorrect: ", expMass, actualMotorData.getMass(), EPSILON); + } + } + + @Test + public void testFalcon9HComponentMasses() { + Rocket rkt = TestRockets.makeFalcon9Heavy(); + rkt.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + double expMass; + RocketComponent cc; + double compMass; + + // ====== Payload Stage ====== + // ====== ====== ====== ====== + { + expMass = 0.022549558353; + cc= rkt.getChild(0).getChild(0); + compMass = cc.getComponentMass(); + assertEquals("P/L NoseCone mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.02904490372; + cc= rkt.getChild(0).getChild(1); + compMass = cc.getComponentMass(); + assertEquals("P/L Body mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.007289284477103441; + cc= rkt.getChild(0).getChild(2); + compMass = cc.getComponentMass(); + assertEquals("P/L Transition mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.029224351500753608; + cc= rkt.getChild(0).getChild(3); + compMass = cc.getComponentMass(); + assertEquals("P/L Upper Stage Body mass calculated incorrectly: ", expMass, compMass, EPSILON); + { + expMass = 0.0079759509252; + cc= rkt.getChild(0).getChild(3).getChild(0); + compMass = cc.getComponentMass(); + assertEquals(cc.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.00072; + cc= rkt.getChild(0).getChild(3).getChild(1); + compMass = cc.getComponentMass(); + assertEquals(cc.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + } + + expMass = 0.01948290100050243; + cc= rkt.getChild(0).getChild(4); + compMass = cc.getComponentMass(); + assertEquals(cc.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + } + + // ====== Core Stage ====== + // ====== ====== ====== + final AxialStage coreStage = (AxialStage)rkt.getChild(1); + { + expMass = 0.1298860066700161; + final BodyComponent coreBody = (BodyComponent)coreStage.getChild(0); + compMass = coreBody.getComponentMass(); + assertEquals(coreBody.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + } + + // ====== Booster Set Stage ====== + // ====== ====== ====== + ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + { + expMass = 0.0222459863653; + // think of the casts as an assert that ( child instanceof NoseCone) == true + NoseCone nose = (NoseCone) boosters.getChild(0); + compMass = nose.getComponentMass(); + assertEquals( nose.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.129886006; + BodyTube body = (BodyTube) boosters.getChild(1); + compMass = body.getComponentMass(); + assertEquals( body.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.01890610458; + InnerTube mmt = (InnerTube)boosters.getChild(1).getChild(0); + compMass = mmt.getComponentMass(); + assertEquals( mmt.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + + expMass = 0.15995232; + final FinSet boosterFins = (FinSet)boosters.getChild(1).getChild(1); + compMass = boosterFins.getComponentMass(); + assertEquals(boosterFins.getName()+" mass calculated incorrectly: ", expMass, compMass, EPSILON); + } + } + + @Test + public void testFalcon9HComponentCM() { + Rocket rkt = TestRockets.makeFalcon9Heavy(); + rkt.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + double expCMx; + double actCMx; + // ====== Payload Stage ====== + // ====== ====== ====== ====== + { + expCMx= 0.080801726467; + NoseCone nc = (NoseCone)rkt.getChild(0).getChild(0); + actCMx = nc.getComponentCG().x; + assertEquals("P/L NoseCone CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.066; + BodyTube plbody = (BodyTube)rkt.getChild(0).getChild(1); + actCMx = plbody.getComponentCG().x; + assertEquals("P/L Body CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.006640945419; + Transition tr= (Transition)rkt.getChild(0).getChild(2); + actCMx = tr.getComponentCG().x; + assertEquals("P/L Transition CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.09; + BodyTube upperBody = (BodyTube)rkt.getChild(0).getChild(3); + actCMx = upperBody.getComponentCG().x; + assertEquals("P/L Upper Stage Body CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + { + expCMx = 0.0125; + Parachute chute = (Parachute)rkt.getChild(0).getChild(3).getChild(0); + actCMx = chute.getComponentCG().x; + assertEquals("Parachute CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.0125; + ShockCord cord= (ShockCord)rkt.getChild(0).getChild(3).getChild(1); + actCMx = cord.getComponentCG().x; + assertEquals("Shock Cord CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + } + + expCMx = 0.06; + BodyTube interstage = (BodyTube)rkt.getChild(0).getChild(4); + actCMx = interstage.getComponentCG().x; + assertEquals("Interstage CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + } + + // ====== Core Stage ====== + // ====== ====== ====== + final AxialStage coreStage = (AxialStage)rkt.getChild(1); + { + expCMx = 0.4; + BodyTube coreBody = (BodyTube)coreStage.getChild(0); + actCMx = coreBody.getComponentCG().x; + assertEquals("Core Body CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + } + + // ====== Booster Set Stage ====== + // ====== ====== ====== + ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + { + expCMx = 0.055710581052; + // think of the casts as an assert that ( child instanceof NoseCone) == true + NoseCone nose = (NoseCone) boosters.getChild(0); + actCMx = nose.getComponentCG().x; + assertEquals("Booster Nose CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.4; + BodyTube body = (BodyTube) boosters.getChild(1); + actCMx = body.getComponentCG().x; + assertEquals("BoosterBody CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.075; + InnerTube mmt = (InnerTube)boosters.getChild(1).getChild(0); + actCMx = mmt.getComponentCG().x; + assertEquals(" Motor Mount Tube CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + + expCMx = 0.19393939; + FinSet boosterFins = (FinSet) boosters.getChild(1).getChild(1); + actCMx = boosterFins .getComponentCG().x; + assertEquals("Core Fins CMx calculated incorrectly: ", expCMx, actCMx, EPSILON); + } + } + + @Test + public void testFalcon9HComponentMOI() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration emptyConfig = rocket.getEmptyConfiguration(); + rocket.setSelectedConfiguration( emptyConfig.getFlightConfigurationID() ); + + double expInertia; + RocketComponent cc; + double compInertia; + + // ====== Payload Stage ====== + // ====== ====== ====== ====== + { + final AxialStage payloadStage = (AxialStage) rocket.getChild(0); + + // Component: Nose Cone + final NoseCone payloadNose = (NoseCone) payloadStage.getChild(0); + assertEquals(payloadNose.getName()+" Rotational MOI calculated incorrectly: ", 3.508155e-5, payloadNose.getRotationalInertia(), EPSILON); + assertEquals(payloadNose.getName()+" Longitudinal MOI calculated incorrectly: ", 2.0400578477e-6, payloadNose.getLongitudinalInertia(), EPSILON); + + // Component: Payload BodyTube + final BodyTube payloadBody = (BodyTube)payloadStage.getChild(1); + assertEquals(payloadBody.getName()+" Rotational MOI calculated incorrectly: ", 7.70416e-5, payloadBody.getRotationalInertia(), EPSILON); + assertEquals(payloadBody.getName()+" Longitudinal MOI calculated incorrectly: ", 8.06940e-5, payloadBody.getLongitudinalInertia(), EPSILON); + + // Component: Payload Trailing Transition + final Transition payloadTail = (Transition) payloadStage.getChild(2); + assertEquals(payloadTail.getName()+" Rotational MOI calculated incorrectly: ", 1.43691e-5, payloadTail.getRotationalInertia(), EPSILON); + assertEquals(payloadTail.getName()+" Longitudinal MOI calculated incorrectly: ", 7.30265e-6, payloadTail.getLongitudinalInertia(), EPSILON); + + // Component: Interstage + cc= rocket.getChild(0).getChild(3); + expInertia = 4.22073e-5; + compInertia = cc.getRotationalInertia(); + assertEquals(cc.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 0.0001; + compInertia = cc.getLongitudinalInertia(); + assertEquals(cc.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + { + cc= rocket.getChild(0).getChild(3).getChild(0); + expInertia = 6.23121e-7; + compInertia = cc.getRotationalInertia(); + assertEquals(cc.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 7.26975e-7; + compInertia = cc.getLongitudinalInertia(); + assertEquals(cc.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + cc= rocket.getChild(0).getChild(3).getChild(1); + expInertia = 5.625e-8; + compInertia = cc.getRotationalInertia(); + assertEquals(cc.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 6.5625e-8; + compInertia = cc.getLongitudinalInertia(); + assertEquals(cc.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + } + + cc= rocket.getChild(0).getChild(4); + expInertia = 2.81382e-5; + compInertia = cc.getRotationalInertia(); + assertEquals(cc.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 3.74486e-5; + compInertia = cc.getLongitudinalInertia(); + assertEquals(cc.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + } + + // ====== Core Stage ====== + // ====== ====== ====== + final AxialStage coreStage = (AxialStage)rocket.getChild(1); + { + final BodyTube coreBody = (BodyTube)coreStage.getChild(0); + expInertia = 0.000187588; + compInertia = coreBody.getRotationalInertia(); + assertEquals(coreBody.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 0.00702105; + compInertia = coreBody.getLongitudinalInertia(); + assertEquals(coreBody.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + } + + // ====== Booster Set Stage ====== + // ====== ====== ====== + ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + { + final NoseCone boosterNose = (NoseCone)boosters.getChild(0); + expInertia = 1.82665797857e-5; + compInertia = boosterNose.getRotationalInertia(); + assertEquals(boosterNose.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 1.96501191666e-7; + compInertia = boosterNose.getLongitudinalInertia(); + assertEquals(boosterNose.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + final BodyTube boosterBody = (BodyTube)boosters.getChild(1); + expInertia = 1.875878651e-4; + compInertia = boosterBody.getRotationalInertia(); + assertEquals(boosterBody.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 0.00702104762; + compInertia = boosterBody.getLongitudinalInertia(); + assertEquals(boosterBody.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + cc= boosters.getChild(1).getChild(0); + expInertia = 4.11444e-6; + compInertia = cc.getRotationalInertia(); + assertEquals(cc.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 3.75062e-5; + compInertia = cc.getLongitudinalInertia(); + assertEquals(cc.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + final FinSet boosterFins = (FinSet)boosters.getChild(1).getChild(1); + expInertia = 0.00413298; + compInertia = boosterFins.getRotationalInertia(); + assertEquals(boosterFins.getName()+" Rotational MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + expInertia = 0.01215133; + compInertia = boosterFins.getLongitudinalInertia(); + assertEquals(boosterFins.getName()+" Longitudinal MOI calculated incorrectly: ", expInertia, compInertia, EPSILON); + + } + } + + @Test + public void testFalcon9HPayloadStructureCM() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + + // validate payload stage + AxialStage payloadStage = (AxialStage) rocket.getChild(0); + config.setOnlyStage( payloadStage.getStageNumber() ); + + final RigidBody actualStructureData = MassCalculator.calculateStructure( config ); + final Coordinate actualCM = actualStructureData.cm; + + double expMass = 0.116287; + double expCMx = 0.278070785749; + assertEquals("Upper Stage Mass is incorrect: ", expMass, actualCM.weight, EPSILON); + + assertEquals("Upper Stage CM.x is incorrect: ", expCMx, actualCM.x, EPSILON); + assertEquals("Upper Stage CM.y is incorrect: ", 0.0f, actualCM.y, EPSILON); + assertEquals("Upper Stage CM.z is incorrect: ", 0.0f, actualCM.z, EPSILON); + } + + @Test + public void testFalcon9HCoreStructureCM() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + AxialStage coreStage = (AxialStage) rocket.getChild(1); + config.setOnlyStage( coreStage.getStageNumber() ); + + final RigidBody actualData = MassCalculator.calculateStructure( config ); + final Coordinate actualCM = actualData.cm; + + double expMass = 0.12988600; + double expCMx = 0.964; + assertEquals("Upper Stage Mass is incorrect: ", expMass, actualCM.weight, EPSILON); + + assertEquals("Upper Stage CM.x is incorrect: ", expCMx, actualCM.x, EPSILON); + assertEquals("Upper Stage CM.y is incorrect: ", 0.0f, actualCM.y, EPSILON); + assertEquals("Upper Stage CM.z is incorrect: ", 0.0f, actualCM.z, EPSILON); + } + + @Test + public void testFalcon9HCoreMotorLaunchCM() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1) ); + AxialStage core = (AxialStage) rocket.getChild(1); + final int coreNum = core.getStageNumber(); + config.setOnlyStage( coreNum); + + final MotorMount mnt = (MotorMount)core.getChild(0); + final Motor motor = mnt.getMotorConfig( config.getFlightConfigurationID()).getMotor(); + final String motorDesignation= motor.getDesignation(); + + RigidBody actMotorData = MassCalculator.calculateMotor( config ); + + final double actMotorMass = actMotorData.getMass(); + final Coordinate actCM= actMotorData.cm; + + final double expMotorMass = motor.getLaunchMass(); + final Coordinate expCM = new Coordinate( 1.053, 0, 0, expMotorMass); + + assertEquals(core.getName()+" => "+motorDesignation+" propellant mass is incorrect: ", expMotorMass, actMotorMass, EPSILON); + assertEquals(core.getName()+" => "+motorDesignation+" propellant CoM x is incorrect: ", expCM.x, actCM.x, EPSILON); + assertEquals(core.getName()+" => "+motorDesignation+" propellant CoM y is incorrect: ", expCM.y, actCM.y, EPSILON); + assertEquals(core.getName()+" => "+motorDesignation+" propellant CoM z is incorrect: ", expCM.z, actCM.z, EPSILON); + } + + @Test + public void testFalcon9HCoreMotorLaunchMOIs() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1) ); + config.setOnlyStage( 1 ); + + RigidBody corePropInertia = MassCalculator.calculateMotor( config ); + + // validated against a specific motor/radius/length + final double expIxx = 0.003380625; + + final double expIyy = 0.156701835; + + final double actCorePropIxx = corePropInertia.getIxx(); + final double actCorePropIyy = corePropInertia.getIyy(); + + assertEquals("Core Stage motor axial MOI is incorrect: ", expIxx, actCorePropIxx, EPSILON); + assertEquals("Core Stage motor longitudinal MOI is incorrect: ", expIyy, actCorePropIyy, EPSILON); + } + + @Test + public void testFalcon9HBoosterStructureCM() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + final RigidBody actualData = MassCalculator.calculateStructure( config ); + final Coordinate actualCM = actualData.getCM(); + + double expMass = 0.66198084; + double expCMx = 1.08642949; + assertEquals("Heavy Booster Mass is incorrect: ", expMass, actualCM.weight, EPSILON); + + assertEquals("Heavy Booster CM.x is incorrect: ", expCMx, actualCM.x, EPSILON); + assertEquals("Heavy Booster CM.y is incorrect: ", 0.0f, actualCM.y, EPSILON); + assertEquals("Heavy Booster CM.z is incorrect: ", 0.0f, actualCM.z, EPSILON); + } + + @Test + public void testFalcon9HBoosterLaunchCM() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1)); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + RigidBody actualBoosterLaunchData = MassCalculator.calculateLaunch( config ); + + double actualMass = actualBoosterLaunchData.getMass(); + double expectedMass = 1.64598084; + assertEquals(" Booster Launch Mass is incorrect: ", expectedMass, actualMass, EPSILON); + + final Coordinate actualCM = actualBoosterLaunchData.getCM(); + double expectedCMx = 1.22267891; + Coordinate expCM = new Coordinate(expectedCMx,0,0, expectedMass); + assertEquals(" Booster Launch CM.x is incorrect: ", expCM.x, actualCM.x, EPSILON); + assertEquals(" Booster Launch CM.y is incorrect: ", expCM.y, actualCM.y, EPSILON); + assertEquals(" Booster Launch CM.z is incorrect: ", expCM.z, actualCM.z, EPSILON); + assertEquals(" Booster Launch CM is incorrect: ", expCM, actualCM); + } + + @Test + public void testFalcon9HBoosterSpentCM(){ + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1)); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + // Validate Booster Launch Mass + RigidBody spentData = MassCalculator.calculateBurnout( config ); + Coordinate spentCM = spentData.getCM(); + + double expSpentMass = 1.17398084; + double expSpentCMx = 1.18582650; + Coordinate expLaunchCM = new Coordinate( expSpentCMx, 0, 0, expSpentMass); + assertEquals(" Booster Launch Mass is incorrect: ", expLaunchCM.weight, spentCM.weight, EPSILON); + assertEquals(" Booster Launch CM.x is incorrect: ", expLaunchCM.x, spentCM.x, EPSILON); + assertEquals(" Booster Launch CM.y is incorrect: ", expLaunchCM.y, spentCM.y, EPSILON); + assertEquals(" Booster Launch CM.z is incorrect: ", expLaunchCM.z, spentCM.z, EPSILON); + assertEquals(" Booster Launch CM is incorrect: ", expLaunchCM, spentCM); + } + + @Test + public void testFalcon9HBoosterMotorCM() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1) ); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + RigidBody actualPropellant = MassCalculator.calculateMotor( config ); + final Coordinate actCM= actualPropellant.getCM(); + + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + final MotorMount mnt = (MotorMount)boosters.getChild(1).getChild(0); + final Motor boosterMotor = mnt.getMotorConfig( config.getFlightConfigurationID()).getMotor(); + + final double expBoosterPropMassEach = boosterMotor.getLaunchMass(); + final double boosterSetMotorCount = 8.; /// use a double merely to prevent type-casting issues + final double expBoosterPropMass = expBoosterPropMassEach * boosterSetMotorCount; + + final Coordinate expCM = new Coordinate( 1.31434, 0, 0, expBoosterPropMass); + + assertEquals( boosters.getName()+" => "+boosterMotor.getDesignation()+" propellant mass is incorrect: ", expBoosterPropMass, actualPropellant.getMass(), EPSILON); + assertEquals( boosters.getName()+" => "+boosterMotor.getDesignation()+" propellant CoM x is incorrect: ", expCM.x, actCM.x, EPSILON); + assertEquals( boosters.getName()+" => "+boosterMotor.getDesignation()+" propellant CoM y is incorrect: ", expCM.y, actCM.y, EPSILON); + assertEquals( boosters.getName()+" => "+boosterMotor.getDesignation()+" propellant CoM z is incorrect: ", expCM.z, actCM.z, EPSILON); + } + + @Test + public void testFalcon9HeavyBoosterMotorLaunchMOIs() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1) ); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + RigidBody actualInertia = MassCalculator.calculateMotor( config ); + +// System.err.println( rocket.toDebugTree()); + + final double expIxx = 0.006380379; + assertEquals("Booster stage propellant axial MOI is incorrect: ", expIxx, actualInertia.getIxx(), EPSILON); + final double expIyy = 0.001312553; + assertEquals("Booster stage propellant longitudinal MOI is incorrect: ", expIyy, actualInertia.getIyy(), EPSILON); + } + + @Test + public void testFalcon9HeavyBoosterSpentMOIs() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1)); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + RigidBody spent = MassCalculator.calculateBurnout( config); + + double expMOIRotational = 0.01593066; + double boosterMOIRotational = spent.getRotationalInertia(); + assertEquals(" Booster x-axis MOI is incorrect: ", expMOIRotational, boosterMOIRotational, EPSILON); + + double expMOI_tr = 0.08018692435877221; + double boosterMOI_tr= spent.getLongitudinalInertia(); + assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); + } + + @Test + public void testFalcon9HeavyBoosterLaunchMOIs() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getFlightConfiguration( new FlightConfigurationId( TestRockets.FALCON_9H_FCID_1)); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + + RigidBody launchData = MassCalculator.calculateLaunch( config); + + final double expIxx = 0.01899116; + final double actIxx= launchData.getRotationalInertia(); + final double expIyy = 0.08637653; + final double actIyy= launchData.getLongitudinalInertia(); + + assertEquals(" Booster x-axis MOI is incorrect: ", expIxx, actIxx, EPSILON); + assertEquals(" Booster transverse MOI is incorrect: ", expIyy, actIyy, EPSILON); + } + + + @Test + public void testFalcon9HeavyBoosterStageMassOverride() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + rocket.setSelectedConfiguration( config.getId() ); + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + final double overrideMass = 0.5; + boosters.setOverrideSubcomponents(true); + boosters.setMassOverridden(true); + boosters.setOverrideMass(overrideMass); + boosters.setCGOverridden(true); + boosters.setOverrideCGX(6.0); + + RigidBody burnout = MassCalculator.calculateStructure( config); + Coordinate boosterSetCM = burnout.getCM(); + double calcTotalMass = burnout.getMass(); + + double expTotalMass = overrideMass; + assertEquals(" Booster Launch Mass is incorrect: ", expTotalMass, calcTotalMass, EPSILON); + + double expCMx = 6.0; + Coordinate expCM = new Coordinate( expCMx, 0, 0, expTotalMass); + assertEquals(" Booster Launch CM.x is incorrect: ", expCM.x, boosterSetCM.x, EPSILON); + assertEquals(" Booster Launch CM.y is incorrect: ", expCM.y, boosterSetCM.y, EPSILON); + assertEquals(" Booster Launch CM.z is incorrect: ", expCM.z, boosterSetCM.z, EPSILON); + assertEquals(" Booster Launch CM is incorrect: ", expCM, boosterSetCM); + + // Validate MOI + double expMOI_axial = 0.01261079; + double boosterMOI_xx= burnout.getRotationalInertia(); + assertEquals(" Booster x-axis MOI is incorrect: ", expMOI_axial, boosterMOI_xx, EPSILON); + + double expMOI_tr = 16.163954943504205; + double boosterMOI_tr= burnout.getLongitudinalInertia(); + assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); + } + + @Test + public void testFalcon9HeavyComponentMassOverride() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + rocket.setSelectedConfiguration( config.getId() ); + + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + config.setOnlyStage( boosters.getStageNumber() ); + + NoseCone nose = (NoseCone)boosters.getChild(0); + nose.setMassOverridden(true); + nose.setOverrideMass( 0.71 ); + + BodyTube body = (BodyTube)boosters.getChild(1); + body.setMassOverridden(true); + body.setOverrideMass( 0.622 ); + + InnerTube mmt = (InnerTube)boosters.getChild(1).getChild(0); + mmt.setMassOverridden(true); + mmt.setOverrideMass( 0.213 ); + + RigidBody boosterData = MassCalculator.calculateStructure( config ); + Coordinate boosterCM = boosterData.getCM(); + + double expTotalMass = 3.40990464; + assertEquals(" Booster Launch Mass is incorrect: ", expTotalMass, boosterData.getMass(), EPSILON); + + double expCMx = 0.85361377; + Coordinate expCM = new Coordinate( expCMx, 0, 0, expTotalMass); + assertEquals(" Booster Launch CM.x is incorrect: ", expCM.x, boosterCM.x, EPSILON); + assertEquals(" Booster Launch CM.y is incorrect: ", expCM.y, boosterCM.y, EPSILON); + assertEquals(" Booster Launch CM.z is incorrect: ", expCM.z, boosterCM.z, EPSILON); + assertEquals(" Booster Launch CM is incorrect: ", expCM, boosterCM); + + // Validate MOI + double expMOI_axial = 0.031538609; + double boosterMOI_xx= boosterData.getRotationalInertia(); + assertEquals(" Booster x-axis MOI is incorrect: ", expMOI_axial, boosterMOI_xx, EPSILON); + + double expMOI_tr = 0.37548843; + double boosterMOI_tr= boosterData.getLongitudinalInertia(); + assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); + } + + @Test + public void testFalcon9HeavyComponentCMxOverride() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("Falcon9Heavy."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + FlightConfiguration config = rocket.getEmptyConfiguration(); + rocket.setSelectedConfiguration( config.getId() ); + + config.setOnlyStage( TestRockets.FALCON_9H_BOOSTER_STAGE_NUMBER ); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosters = (ParallelStage) coreStage.getChild(0).getChild(0); + + NoseCone nose = (NoseCone)boosters.getChild(0); + nose.setCGOverridden(true); + nose.setOverrideCGX(0.22); + + BodyTube body = (BodyTube)boosters.getChild(1); + body.setCGOverridden(true); + body.setOverrideCGX( 0.433); + + InnerTube mmt = (InnerTube)boosters.getChild(1).getChild(0); + mmt.setCGOverridden(true); + mmt.setOverrideCGX( 0.395 ); + + RigidBody structure = MassCalculator.calculateStructure( config); + + final double expMass = 0.66198084; + double calcTotalMass = structure.getMass(); + assertEquals(" Booster Launch Mass is incorrect: ", expMass, calcTotalMass, EPSILON); + + final double expCMx = 1.12869951; + Coordinate expCM = new Coordinate( expCMx, 0, 0, expMass); + assertEquals(" Booster Launch CM.x is incorrect: ", expCM.x, structure.getCM().x, EPSILON); + assertEquals(" Booster Launch CM.y is incorrect: ", expCM.y, structure.getCM().y, EPSILON); + assertEquals(" Booster Launch CM.z is incorrect: ", expCM.z, structure.getCM().z, EPSILON); + assertEquals(" Booster Launch CM is incorrect: ", expCM, structure.getCM()); + + // Validate MOI + final double expMOI_axial = 0.012610790; + double boosterMOI_xx= structure.getRotationalInertia(); + assertEquals(" Booster x-axis MOI is incorrect: ", expMOI_axial, boosterMOI_xx, EPSILON); + + final double expMOI_tr = 0.063491225; + double boosterMOI_tr= structure.getLongitudinalInertia(); + assertEquals(" Booster transverse MOI is incorrect: ", expMOI_tr, boosterMOI_tr, EPSILON); + } + + +} diff --git a/core/test/net/sf/openrocket/masscalc/RigidBodyTest.java b/core/test/net/sf/openrocket/masscalc/RigidBodyTest.java new file mode 100644 index 0000000000..343a8200c8 --- /dev/null +++ b/core/test/net/sf/openrocket/masscalc/RigidBodyTest.java @@ -0,0 +1,166 @@ +package net.sf.openrocket.masscalc; + +//import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + + +public class RigidBodyTest extends BaseTestCase { + + // tolerance for compared double test results + protected final double EPSILON = MathUtil.EPSILON; + + protected final Coordinate ZERO = new Coordinate(0., 0., 0.); + + @Test + public void testTwoPointInline() { + double m1 = 2.5; + Coordinate r1 = new Coordinate(0,-40, 0, m1); + double I1ax=28.7; + double I1t = I1ax/2; + RigidBody body1 = new RigidBody(r1, I1ax, I1t); + + double m2 = 5.7; + Coordinate r2 = new Coordinate(0, 32, 0, m2); + double I2ax=20; + double I2t = I2ax/2; + RigidBody body2 = new RigidBody(r2, I2ax, I2t); + + // point 3 is defined as the CM of bodies 1 and 2 combined. + RigidBody asbly3 = body1.add(body2); + + Coordinate cm3_expected = r1.average(r2); + + assertEquals(" Center of Mass calculated incorrectly: ", cm3_expected, asbly3.getCM() ); + + // these are a bit of a hack, and depend upon all the bodies being along the y=0, z=0 line. + Coordinate delta13 = asbly3.getCM().sub( r1); + Coordinate delta23 = asbly3.getCM().sub( r2); + + double y13 = delta13.y; + double dy_13_2 = MathUtil.pow2( y13); // hack + double I13ax = I1ax + m1*dy_13_2; + double I13zz = I1t + m1*dy_13_2; + + double y23 = delta23.y; + double dy_23_2 = MathUtil.pow2( y23); // hack + double I23ax = I2ax + m2*dy_23_2 ; + double I23zz = I2t + m2*dy_23_2 ; + + double expI3xx = I13ax+I23ax; + double expI3yy = I1t+I2t; + double expI3zz = I13zz+I23zz; + + assertEquals("x-axis MOI don't match: ", asbly3.getIxx(), expI3xx, EPSILON*10); + + assertEquals("y-axis MOI don't match: ", asbly3.getIyy(), expI3yy, EPSILON*10); + + assertEquals("z-axis MOI don't match: ", asbly3.getIzz(), expI3zz, EPSILON*10); + } + + + @Test + public void testTwoPointGeneral() { + double m1 = 2.5; + Coordinate r1 = new Coordinate(0,-40, -10, m1); + double I1xx=28.7; + double I1t = I1xx/2; + RigidBody body1 = new RigidBody(r1, I1xx, I1t); + + double m2 = 5.7; + Coordinate r2 = new Coordinate(0, 32, 15, m2); + double I2xx=20; + double I2t = I2xx/2; + RigidBody body2 = new RigidBody(r2, I2xx, I2t); + + // point 3 is defined as the CM of bodies 1 and 2 combined. + RigidBody asbly3 = body1.add(body2); + + Coordinate cm3_expected = r1.average(r2); + assertEquals(" Center of Mass calculated incorrectly: ", cm3_expected, asbly3.getCM() ); + + // these are a bit of a hack, and depend upon all the bodies being along the y=0, z=0 line. + Coordinate delta13 = asbly3.getCM().sub( r1); + Coordinate delta23 = asbly3.getCM().sub( r2); + double x2, y2, z2; + + x2 = MathUtil.pow2( delta13.x); + y2 = MathUtil.pow2( delta13.y); + z2 = MathUtil.pow2( delta13.z); + double I13xx = I1xx + m1*(y2+z2); + double I13yy = I1t + m1*(x2+z2); + double I13zz = I1t + m1*(x2+y2); + + x2 = MathUtil.pow2( delta23.x); + y2 = MathUtil.pow2( delta23.y); + z2 = MathUtil.pow2( delta23.z); + double I23xx = I2xx + m2*(y2+z2); + double I23yy = I2t + m2*(x2+z2); + double I23zz = I2t + m2*(x2+y2); + + double expI3xx = I13xx + I23xx; + assertEquals("x-axis MOI don't match: ", asbly3.getIxx(), expI3xx, EPSILON*10); + + double expI3yy = I13yy + I23yy; + assertEquals("y-axis MOI don't match: ", asbly3.getIyy(), expI3yy, EPSILON*10); + + double expI3zz = I13zz + I23zz; + assertEquals("z-axis MOI don't match: ", asbly3.getIzz(), expI3zz, EPSILON*10); + } + + + @Test + public void testRigidBodyCompoundCalculations() { + double m1 = 2.5; + Coordinate r1 = new Coordinate(0,-40, 0, m1); + double I1ax=28.7; + double I1t = I1ax/2; + RigidBody body1 = new RigidBody(r1, I1ax, I1t); + + double m2 = m1; + Coordinate r2 = new Coordinate(0, -2, 0, m2); + double I2ax=28.7; + double I2t = I2ax/2; + RigidBody body2 = new RigidBody(r2, I2ax, I2t); + + double m5 = 5.7; + Coordinate r5 = new Coordinate(0, 32, 0, m5); + double I5ax=20; + double I5t = I5ax/2; + RigidBody body5 = new RigidBody(r5, I5ax, I5t); + + // point 3 is defined as the CM of bodies 1 and 2 combined. + RigidBody asbly3 = body1.add(body2); + + // point 4 is defined as the CM of bodies 1, 2 and 5 combined. + RigidBody asbly4_indirect = asbly3.add(body5); + Coordinate cm4_expected = r1.average(r2).average(r5); + + assertEquals(" Center of Mass calculated incorrectly: ", cm4_expected, new Coordinate( 0, 7.233644859813085, 0, m1+m2+m5 ) ); + + // these are a bit of a hack, and depend upon all the bodies being along the y=0, z=0 line. + double y4 = cm4_expected.y; + double I14ax = I1ax + m1*MathUtil.pow2( Math.abs(body1.getCM().y - y4) ); + double I24ax = I2ax + m2*MathUtil.pow2( Math.abs(body2.getCM().y - y4) ); + double I54ax = I5ax + m5*MathUtil.pow2( Math.abs(body5.getCM().y - y4) ); + + double I14zz = I1t + m1*MathUtil.pow2( Math.abs(body1.getCM().y - y4) ); + double I24zz = I2t + m2*MathUtil.pow2( Math.abs(body2.getCM().y - y4) ); + double I54zz = I5t + m5*MathUtil.pow2( Math.abs(body5.getCM().y - y4) ); + + double I4xx = I14ax+I24ax+I54ax; + double I4yy = I1t+I2t+I5t; + double I4zz = I14zz+I24zz+I54zz; + RigidBody asbly4_expected = new RigidBody( cm4_expected, I4xx, I4yy, I4zz); + + assertEquals("x-axis MOI don't match: ", asbly4_indirect.getIxx(), asbly4_expected.getIxx(), EPSILON*10); + assertEquals("y-axis MOI don't match: ", asbly4_indirect.getIyy(), asbly4_expected.getIyy(), EPSILON*10); + assertEquals("z-axis MOI don't match: ", asbly4_indirect.getIzz(), asbly4_expected.getIzz(), EPSILON*10); + } + +} diff --git a/core/test/net/sf/openrocket/motor/ThrustCurveMotorTest.java b/core/test/net/sf/openrocket/motor/ThrustCurveMotorTest.java index 327ec375ee..f2c93cfb46 100644 --- a/core/test/net/sf/openrocket/motor/ThrustCurveMotorTest.java +++ b/core/test/net/sf/openrocket/motor/ThrustCurveMotorTest.java @@ -1,73 +1,188 @@ package net.sf.openrocket.motor; import static org.junit.Assert.assertEquals; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.Inertia; +import static org.junit.Assert.assertTrue; import org.junit.Test; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Pair; + + public class ThrustCurveMotorTest { - private final double EPS = 0.000001; + // private final double EPSILON = 0.000001; private final double radius = 0.025; private final double length = 0.10; - private final double longitudinal = Inertia.filledCylinderLongitudinal(radius, length); - private final double rotational = Inertia.filledCylinderRotational(radius); - private final ThrustCurveMotor motor = - new ThrustCurveMotor(Manufacturer.getManufacturer("foo"), - "X6", "Description of X6", Motor.Type.RELOAD, - new double[] {0, 2, Motor.PLUGGED}, radius*2, length, - new double[] {0, 1, 3, 4}, // time - new double[] {0, 2, 3, 0}, // thrust - new Coordinate[] { + private final ThrustCurveMotor motorX6 = new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("foo")) + .setDesignation("X6") + .setDescription("Description of X6") + .setMotorType(Motor.Type.RELOAD) + .setStandardDelays(new double[] {0, 2, Motor.PLUGGED_DELAY}) + .setDiameter(radius*2) + .setLength(length) + .setTimePoints(new double[] {0, 1, 3, 4}) + .setThrustPoints(new double[] {0, 2, 3, 0}) + .setCGPoints(new Coordinate[] { new Coordinate(0.02,0,0,0.05), new Coordinate(0.02,0,0,0.05), new Coordinate(0.02,0,0,0.05), - new Coordinate(0.03,0,0,0.03) - }, "digestA"); + new Coordinate(0.03,0,0,0.03)}) + .setDigest("digestA") + .build(); + + + private final double radiusA8 = 0.018; + private final double lengthA8 = 0.10; + private final ThrustCurveMotor motorEstesA8_3 = new ThrustCurveMotor.Builder() + .setManufacturer(Manufacturer.getManufacturer("Estes")) + .setDesignation("A8-3") + .setDescription("A8 Test Motor") + .setMotorType(Motor.Type.SINGLE) + .setStandardDelays(new double[] {0, 2, Motor.PLUGGED_DELAY}) + .setDiameter(radiusA8*2) + .setLength(lengthA8) + .setTimePoints(new double[] { + 0, 0.041, 0.084, 0.127, + 0.166, 0.192, 0.206, 0.226, + 0.236, 0.247, 0.261, 0.277, + 0.306, 0.351, 0.405, 0.467, + 0.532, 0.589, 0.632, 0.652, + 0.668, 0.684, 0.703, 0.73}) + .setThrustPoints(new double[] { + 0, 0.512, 2.115, 4.358, + 6.794, 8.588, 9.294, 9.73, + 8.845, 7.179, 5.063, 3.717, + 3.205, 2.884, 2.499, 2.371, + 2.307, 2.371, 2.371, 2.243, + 1.794, 1.153, 0.448, 0}) + .setCGPoints(new Coordinate[] { + new Coordinate(0.0350, 0, 0, 0.016350),new Coordinate(0.0352, 0, 0, 0.016335),new Coordinate(0.0354, 0, 0, 0.016255),new Coordinate(0.0356, 0, 0, 0.016057), + new Coordinate(0.0358, 0, 0, 0.015748),new Coordinate(0.0360, 0, 0, 0.015463),new Coordinate(0.0362, 0, 0, 0.015285),new Coordinate(0.0364, 0, 0, 0.015014), + new Coordinate(0.0366, 0, 0, 0.014882),new Coordinate(0.0368, 0, 0, 0.014757),new Coordinate(0.0370, 0, 0, 0.014635),new Coordinate(0.0372, 0, 0, 0.014535), + new Coordinate(0.0374, 0, 0, 0.014393),new Coordinate(0.0376, 0, 0, 0.014198),new Coordinate(0.0378, 0, 0, 0.013991),new Coordinate(0.0380, 0, 0, 0.013776), + new Coordinate(0.0382, 0, 0, 0.013560),new Coordinate(0.0384, 0, 0, 0.013370),new Coordinate(0.0386, 0, 0, 0.013225),new Coordinate(0.0388, 0, 0, 0.013160), + new Coordinate(0.0390, 0, 0, 0.013114),new Coordinate(0.0392, 0, 0, 0.013080),new Coordinate(0.0394, 0, 0, 0.013059),new Coordinate(0.0396, 0, 0, 0.013050)}) + .setDigest("digestA8-3") + .build(); + + + @Test + public void testVerifyMotorA8_3Times(){ + final ThrustCurveMotor mtr = motorEstesA8_3; + + assertEquals( 0.041, mtr.getTime( 0.041), 0.001 ); + + assertEquals( 0.206, mtr.getTime( 0.206), 0.001 ); + } + + @Test + public void testVerifyMotorA8_3Thrusts(){ + final ThrustCurveMotor mtr = motorEstesA8_3; + + assertEquals( 0.512, mtr.getThrust( 0.041), 0.001 ); + + assertEquals( 9.294, mtr.getThrust( 0.206), 0.001 ); + } + + + @Test + public void testVerifyMotorA8_3CG(){ + final ThrustCurveMotor mtr = motorEstesA8_3; + + final double actCGx0p041 = mtr.getCMx(0.041); + assertEquals( 0.0352, actCGx0p041, 0.001 ); + final double actMass0p041 = mtr.getTotalMass( 0.041 ); + assertEquals( 0.016335, actMass0p041, 0.001 ); + + final double actCGx0p206 = mtr.getCMx( 0.206 ); + assertEquals( 0.0362, actCGx0p206, 0.001 ); + final double actMass0p206 = mtr.getTotalMass( 0.206 ); + assertEquals( 0.015285, actMass0p206, 0.001 ); + } + + private class TestPair extends Pair<Double,Double>{ + private TestPair(){ super( 0., 0.);} + + public TestPair( Double u, Double v){ + super(u,v); + } + } + + @Test + public void testThrustInterpolation(){ + final ThrustCurveMotor mtr = motorEstesA8_3; + + Pair<Double, Double> testPairs[] = new TestPair[]{ + new TestPair(0.512, 0.041), + new TestPair(2.115, 0.084), + new TestPair( 1.220, 0.060), + new TestPair( 1.593, 0.070), + new TestPair( 1.965, 0.080), + new TestPair( 2.428, 0.090), + }; + + for( Pair<Double,Double> testCase : testPairs ){ + final double motorTime = testCase.getV(); + final double expThrust = testCase.getU(); + final double actThrust = mtr.getThrust(motorTime); + + assertEquals( "Error in interpolating thrust: ", expThrust, actThrust, 0.001 ); + } + } @Test public void testMotorData() { + assertEquals("X6", motorX6.getDesignation()); + assertEquals("X6-5", motorX6.getDesignation(5.0)); + assertEquals("Description of X6", motorX6.getDescription()); + assertEquals(Motor.Type.RELOAD, motorX6.getMotorType()); + } + + @Test + public void testTimeIndexingNegative(){ + final ThrustCurveMotor mtr = motorX6; + // attempt to retrieve for a time before the motor ignites + assertTrue( "Fault in negative time indexing: ", Double.isNaN( mtr.getTime( -1 )) ); + } + + @Test + public void testTimeIndexingPastBurnout(){ + final ThrustCurveMotor mtr = motorX6; - assertEquals("X6", motor.getDesignation()); - assertEquals("X6-5", motor.getDesignation(5.0)); - assertEquals("Description of X6", motor.getDescription()); - assertEquals(Motor.Type.RELOAD, motor.getMotorType()); - + // attempt to retrieve for a time after the motor finishes + // should retrieve the last time value. In this case: 4.0 + assertEquals( 4.0, mtr.getTime( Double.MAX_VALUE ), 0.00000001 ); + assertEquals( 4.0, mtr.getTime( 20.0 ), 0.00000001 ); } + @Test - public void testInstance() { - MotorInstance instance = motor.getInstance(); + public void testTimeIndexingAtBurnout(){ + // attempt to retrieve for a time after motor cutoff + assertEquals( 4.0, motorX6.getTime( 4.0), 0.00001 ); + } + + @Test + public void testTimeRetrieval(){ + final ThrustCurveMotor mtr = motorX6; + + final double[] timeList = { 0.2, 0.441, 0.512, 1., 2., 3}; - verify(instance, 0, 0.05, 0.02); - instance.step(0.0, 0, null); - verify(instance, 0, 0.05, 0.02); - instance.step(0.5, 0, null); - verify(instance, 0.5, 0.05, 0.02); - instance.step(1.5, 0, null); - verify(instance, (1.5 + 2.125)/2, 0.05, 0.02); - instance.step(2.5, 0, null); - verify(instance, (2.125 + 2.875)/2, 0.05, 0.02); - instance.step(3.0, 0, null); - verify(instance, (2+3.0/4 + 3)/2, 0.05, 0.02); - instance.step(3.5, 0, null); - verify(instance, (1.5 + 3)/2, 0.045, 0.0225); - instance.step(4.5, 0, null); - // mass and cg is simply average of the end points - verify(instance, 1.5/4, 0.035, 0.0275); - instance.step(5.0, 0, null); - verify(instance, 0, 0.03, 0.03); + for( double searchTime : timeList ){ + assertEquals( searchTime, mtr.getTime(searchTime), 0.00001); + } } - private void verify(MotorInstance instance, double thrust, double mass, double cgx) { - assertEquals("Testing thrust", thrust, instance.getThrust(), EPS); - assertEquals("Testing mass", mass, instance.getCG().weight, EPS); - assertEquals("Testing cg x", cgx, instance.getCG().x, EPS); - assertEquals("Testing longitudinal inertia", mass*longitudinal, instance.getLongitudinalInertia(), EPS); - assertEquals("Testing rotational inertia", mass*rotational, instance.getRotationalInertia(), EPS); + @Test + public void testThrustRetrieval(){ + // attempt to retrieve an integer index: + assertEquals( 2.0, motorX6.getThrust( 1 ), 0.001 ); + assertEquals( 2.5, motorX6.getThrust( 2 ), 0.001 ); + assertEquals( 3.0, motorX6.getThrust( 3 ), 0.001 ); } diff --git a/core/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java b/core/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java index 608788a3e8..b067c6c979 100644 --- a/core/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java +++ b/core/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java @@ -3,6 +3,15 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.auto.Mock; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.Test; +import org.junit.runner.RunWith; + import net.sf.openrocket.document.Simulation; import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.general.Point; @@ -13,14 +22,6 @@ import net.sf.openrocket.util.Pair; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.jmock.auto.Mock; -import org.jmock.integration.junit4.JMock; -import org.jmock.integration.junit4.JUnit4Mockery; -import org.junit.Test; -import org.junit.runner.RunWith; - @RunWith(JMock.class) public class TestRocketOptimizationFunction extends BaseTestCase { @@ -222,12 +223,13 @@ Simulation newSimulationInstance(Simulation sim) { @Test - public void testNewSimulationInstance() { + public void testNewSimulationNames() { final Rocket rocket = new Rocket(); rocket.setName("Foobar"); final Simulation simulation = new Simulation(rocket); simulation.setName("MySim"); + RocketOptimizationFunction function = new RocketOptimizationFunction(simulation, parameter, goal, domain, modifier1, modifier2); diff --git a/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java b/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java index cca185cc07..33d75293b0 100644 --- a/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java +++ b/core/test/net/sf/openrocket/preset/BodyTubePresetTests.java @@ -222,7 +222,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:TubeCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("TubeCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } @@ -264,7 +264,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } diff --git a/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java b/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java index 61dc2b1a4b..2f393bac37 100644 --- a/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java +++ b/core/test/net/sf/openrocket/preset/BulkHeadPresetTests.java @@ -126,7 +126,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:BulkHeadCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("BulkHeadCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } @@ -166,7 +166,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } diff --git a/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java b/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java index 17a5286690..718e4be593 100644 --- a/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java +++ b/core/test/net/sf/openrocket/preset/CenteringRingPresetTests.java @@ -222,7 +222,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:CenteringRingCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("CenteringRingCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } @@ -264,7 +264,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } diff --git a/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java b/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java index e8158e7160..d032b5134a 100644 --- a/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java +++ b/core/test/net/sf/openrocket/preset/EngineBlockPresetTests.java @@ -222,7 +222,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:EngineBlockCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("EngineBlockCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } @@ -264,7 +264,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } diff --git a/core/test/net/sf/openrocket/preset/LaunchLugPresetTests.java b/core/test/net/sf/openrocket/preset/LaunchLugPresetTests.java index f7f7f7b130..207931d3cd 100644 --- a/core/test/net/sf/openrocket/preset/LaunchLugPresetTests.java +++ b/core/test/net/sf/openrocket/preset/LaunchLugPresetTests.java @@ -222,7 +222,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:TubeCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("TubeCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } @@ -264,7 +264,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } diff --git a/core/test/net/sf/openrocket/preset/NoseConePresetTests.java b/core/test/net/sf/openrocket/preset/NoseConePresetTests.java index 0cef4d55b4..56e849c5b8 100644 --- a/core/test/net/sf/openrocket/preset/NoseConePresetTests.java +++ b/core/test/net/sf/openrocket/preset/NoseConePresetTests.java @@ -158,7 +158,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:NoseConeCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("NoseConeCustom", preset.get(ComponentPreset.MATERIAL).getName()); // note - epsilon is 1% of the simple computation of density assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.01 * density); } @@ -200,7 +200,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); // note - epsilon is 1% of the simple computation of density assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.01 * density); } diff --git a/core/test/net/sf/openrocket/preset/TransitionPresetTests.java b/core/test/net/sf/openrocket/preset/TransitionPresetTests.java index e182a5bf27..26593dd8e4 100644 --- a/core/test/net/sf/openrocket/preset/TransitionPresetTests.java +++ b/core/test/net/sf/openrocket/preset/TransitionPresetTests.java @@ -163,7 +163,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:TransitionCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("TransitionCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.01 * density); } @@ -214,7 +214,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.01 * density); } diff --git a/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java b/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java index f7c9a66add..7ef16ede94 100644 --- a/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java +++ b/core/test/net/sf/openrocket/preset/TubeCouplerPresetTests.java @@ -222,7 +222,7 @@ public void testComputeDensityNoMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:TubeCustom]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("TubeCustom", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } @@ -264,7 +264,7 @@ public void testComputeDensityWithMaterial() throws Exception { double density = 100.0 / volume; - assertEquals("[material:test]", preset.get(ComponentPreset.MATERIAL).getName()); + assertEquals("test", preset.get(ComponentPreset.MATERIAL).getName()); assertEquals(density, preset.get(ComponentPreset.MATERIAL).getDensity(), 0.0005); } diff --git a/core/test/net/sf/openrocket/rocketcomponent/ComponentCompare.java b/core/test/net/sf/openrocket/rocketcomponent/ComponentCompare.java deleted file mode 100644 index 8aff7b8e63..0000000000 --- a/core/test/net/sf/openrocket/rocketcomponent/ComponentCompare.java +++ /dev/null @@ -1,153 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.lang.reflect.Method; -import java.util.Iterator; -import java.util.regex.Pattern; - -import net.sf.openrocket.util.BugException; - -public class ComponentCompare { - - private static final Pattern GETTER_PATTERN = Pattern.compile("^(is|get)[A-Z].*+"); - - private static final String[] IGNORED_METHODS = { - "getClass", "getChildCount", "getChildren", "getNextComponent", "getID", - "getPreviousComponent", "getParent", "getRocket", "getRoot", "getStage", - "getStageNumber", "getComponentName", - "getStageSeparationConfiguration", - "getMotorConfiguration", - "getIgnitionConfiguration", - // Rocket specific methods: - "getModID", "getMassModID", "getAerodynamicModID", "getTreeModID", "getFunctionalModID", - "getFlightConfigurationIDs", "getDefaultConfiguration", "getMotorMounts" - }; - - - /** - * Check whether the two components are <em>equal</em>. Two components are considered - * equal if they are of the same type and all of their getXXX() and isXXX() methods - * return equal values. - * - * @param c1 the first component to compare. - * @param c2 the second component to compare. - */ - public static void assertEquality(RocketComponent c1, RocketComponent c2) { - assertEquals(c1.getClass(), c2.getClass()); - - // Same class + similar == equal - assertSimilarity(c1, c2); - } - - - - public static void assertDeepEquality(RocketComponent c1, RocketComponent c2) { - assertEquality(c1, c2); - - Iterator<RocketComponent> i1 = c1.getChildren().iterator(); - Iterator<RocketComponent> i2 = c2.getChildren().iterator(); - while (i1.hasNext()) { - assertTrue("iterator continues", i2.hasNext()); - RocketComponent comp1 = i1.next(); - RocketComponent comp2 = i2.next(); - assertDeepEquality(comp1, comp2); - } - assertFalse("iterator end", i2.hasNext()); - } - - - - public static void assertDeepSimilarity(RocketComponent c1, RocketComponent c2, - boolean allowNameDifference) { - assertSimilarity(c1, c2, allowNameDifference); - - Iterator<RocketComponent> i1 = c1.getChildren().iterator(); - Iterator<RocketComponent> i2 = c2.getChildren().iterator(); - while (i1.hasNext()) { - assertTrue("iterator continues", i2.hasNext()); - RocketComponent comp1 = i1.next(); - RocketComponent comp2 = i2.next(); - assertDeepSimilarity(comp1, comp2, allowNameDifference); - } - assertFalse("iterator end", i2.hasNext()); - } - - - - /** - * Check whether the two components are <em>similar</em>. Two components are similar - * if each of the getXXX and isXXX methods that both object types have return - * equal values. This does not check whether the two components are of the same type. - * - * @param c1 the first component. - * @param c2 the second component. - */ - public static void assertSimilarity(RocketComponent c1, RocketComponent c2) { - assertSimilarity(c1, c2, false); - } - - /** - * Check whether the two components are <em>similar</em>, allowing a name difference. - * - * @param c1 the first component. - * @param c2 the second component. - * @param allowNameDifference whether to allow the components to have different names. - */ - public static void assertSimilarity(RocketComponent c1, RocketComponent c2, - boolean allowNameDifference) { - Class<? extends RocketComponent> class1 = c1.getClass(); - Class<? extends RocketComponent> class2 = c2.getClass(); - - mainloop: for (Method m1 : class1.getMethods()) { - // Check for getter method - String name = m1.getName(); - if (!GETTER_PATTERN.matcher(name).matches()) - continue; - - // Ignore methods that take parameters - if (m1.getParameterTypes().length != 0) - continue; - - // Ignore specific getters - for (String ignore : IGNORED_METHODS) { - if (name.equals(ignore)) - continue mainloop; - } - if (allowNameDifference && name.equals("getName")) - continue; - - - // Check for method in other class - Method m2; - try { - m2 = class2.getMethod(name); - } catch (NoSuchMethodException e) { - continue; - } - - // System.out.println("Testing results of method " + name); - - // Run the methods - Object result1, result2; - try { - result1 = m1.invoke(c1); - result2 = m2.invoke(c2); - } catch (Exception e) { - throw new BugException("Error executing method " + name, e); - } - - if (result1 != null && result2 != null && - result1.getClass().isArray() && result2.getClass().isArray()) { - assertArrayEquals("Comparing result of method " + name, - (Object[]) result1, (Object[]) result2); - } else { - assertEquals("Comparing result of method " + name, result1, result2); - } - } - } - -} diff --git a/core/test/net/sf/openrocket/rocketcomponent/ComponentCompareTest.java b/core/test/net/sf/openrocket/rocketcomponent/ComponentCompareTest.java deleted file mode 100644 index c954edbd69..0000000000 --- a/core/test/net/sf/openrocket/rocketcomponent/ComponentCompareTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.util.Iterator; - -import net.sf.openrocket.util.Color; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.BaseTestCase.BaseTestCase; - -import org.junit.Test; - -public class ComponentCompareTest extends BaseTestCase { - - @Test - public void testComponentEquality() { - - //System.out.println("TEST CLASSPATH: " + System.getProperty("java.class.path")); - - Rocket r1 = net.sf.openrocket.util.TestRockets.makeBigBlue(); - Rocket r2 = net.sf.openrocket.util.TestRockets.makeBigBlue(); - - Iterator<RocketComponent> i1 = r1.iterator(true); - Iterator<RocketComponent> i2 = r2.iterator(true); - while (i1.hasNext()) { - assertTrue(i2.hasNext()); - - RocketComponent c1 = i1.next(); - RocketComponent c2 = i2.next(); - - ComponentCompare.assertEquality(c1, c2); - ComponentCompare.assertSimilarity(c1, c2); - } - assertFalse(i2.hasNext()); - - - ComponentCompare.assertDeepEquality(r1, r2); - ComponentCompare.assertDeepSimilarity(r1, r2, false); - - - r1.setColor(Color.BLACK); - try { - ComponentCompare.assertEquality(r1, r2); - fail(); - } catch (AssertionError e) { - // Correct behavior - } - - - i1 = r1.iterator(true); - i2 = r2.iterator(true); - boolean finsetfound = false; - while (i1.hasNext()) { - RocketComponent c1 = i1.next(); - RocketComponent c2 = i2.next(); - - if (c1 instanceof FinSet) { - finsetfound = true; - FinSet f1 = (FinSet) c1; - f1.setTabHeight(0.001); - - try { - ComponentCompare.assertEquality(c1, c2); - fail(); - } catch (AssertionError e) { - // Correct behavior - } - } - } - assertTrue(finsetfound); - } - - - @Test - public void testComponentSimilarity() throws IllegalFinPointException { - FinSet trap = new TrapezoidFinSet( - 5, // fins - 5.0, // root - 3.0, // tip - 0.0, // sweep - 2.0); // height - FinSet free = new FreeformFinSet(new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0, 2), - new Coordinate(3, 2), - new Coordinate(5, 0) - }); - free.setFinCount(5); - - ComponentCompare.assertSimilarity(trap, free, true); - - try { - ComponentCompare.assertSimilarity(trap, free); - fail(); - } catch (AssertionError e) { - // Correct behavior - } - - free.setName(trap.getName()); - ComponentCompare.assertSimilarity(trap, free); - - try { - ComponentCompare.assertEquality(trap, free); - fail(); - } catch (AssertionError e) { - // Correct behavior - } - - - BodyTube t1 = new BodyTube(); - BodyTube t2 = new BodyTube(); - t1.addChild(free); - t2.addChild(trap); - - ComponentCompare.assertDeepSimilarity(t1, t2, false); - - try { - ComponentCompare.assertDeepEquality(t1, t2); - fail(); - } catch (AssertionError e) { - // Correct behavior - } - - t1.addChild(new TrapezoidFinSet()); - - try { - ComponentCompare.assertDeepSimilarity(t1, t2, true); - fail(); - } catch (AssertionError e) { - // Correct behavior - } - - } - -} diff --git a/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java b/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java deleted file mode 100644 index 7c1d52de91..0000000000 --- a/core/test/net/sf/openrocket/rocketcomponent/ConfigurationTest.java +++ /dev/null @@ -1,533 +0,0 @@ -package net.sf.openrocket.rocketcomponent; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.BitSet; -import java.util.EventObject; -import java.util.Iterator; - -import net.sf.openrocket.rocketcomponent.RocketComponent.Position; -import net.sf.openrocket.util.StateChangeListener; -import net.sf.openrocket.util.BaseTestCase.BaseTestCase; - -import org.junit.Test; - -public class ConfigurationTest extends BaseTestCase { - - /** - * Test change events and modIDs - */ - @Test - public void testChangeEvent() { - - /* Setup */ - Rocket r1 = makeEmptyRocket(); - Configuration config = r1.getDefaultConfiguration(); - - StateChangeListener listener1 = new StateChangeListener() { - @Override - public void stateChanged(EventObject e) { - } - }; - - StateChangeListener listener2 = new StateChangeListener() { - @Override - public void stateChanged(EventObject e) { - } - }; - - config.addChangeListener(listener1); - config.addChangeListener(listener2); - - /* Test */ - - // ModID should not change if nothing changed - int origModID = config.getModID(); - int noChangeModID = config.getModID(); - assertTrue(origModID == noChangeModID); - - - // After a change event, modID should change - config.fireChangeEvent(); - int changeModID = config.getModID(); - assertTrue(origModID < changeModID); - - /* Cleanup */ - config.removeChangeListener(listener1); - config.removeChangeListener(listener2); - config.release(); - - } - - - /** - * Test configuration rocket component and motor iterators - */ - @Test - public void testConfigIterators() { - - /* Setup */ - Rocket r1 = makeSingleStageTestRocket(); - Configuration config = r1.getDefaultConfiguration(); - - /* Test */ - - // Test rocket component iterator - // TODO: validate iterator iterates correctly - for (Iterator<RocketComponent> i = config.iterator(); i.hasNext();) { - i.next(); - } - - // Rocket component iterator remove method is unsupported, should throw exception - try { - Iterator<RocketComponent> configIterator = config.iterator(); - configIterator.remove(); - } catch (UnsupportedOperationException e) { - assertTrue(e.getMessage().equals("remove unsupported")); - } - - // Test motor iterator - /* TODO: no motors in model Iterator<MotorMount> motorIterator() - * TODO: validate iterator iterates correctly - for (Iterator<MotorMount> i = config.motorIterator(); i.hasNext();) { - i.next(); - } - */ - - // Motor iterator remove method is unsupported, should throw exception - try { - Iterator<MotorMount> motorIterator = config.motorIterator(); - motorIterator.remove(); - } catch (UnsupportedOperationException e) { - assertTrue(e.getMessage().equals("remove unsupported")); - } - - /* Cleanup */ - config.release(); - - } - - - /** - * Empty rocket (no components) specific configuration tests - */ - @Test - public void testEmptyRocket() { - Rocket r1 = makeEmptyRocket(); - Configuration config = r1.getDefaultConfiguration(); - - Configuration configClone = config.clone(); // TODO validate clone worked - assertFalse(config.getRocket() == null); - assertFalse(config.hasMotors()); - - config.release(); - } - - - /** - * Test flight configuration ID methods - */ - @Test - public void testFlightConfigID() { - - /* Setup */ - Rocket r1 = makeSingleStageTestRocket(); - Configuration config = r1.getDefaultConfiguration(); - - /* Test */ - - // Test flight configuration ID setting - String origFlightConfigID = config.getFlightConfigurationID(); // save for later - String testFlightConfigID = origFlightConfigID + "_ConfigurationTest"; - - // if id is already set (ie, not null), setting to null should work - assertFalse(config.getFlightConfigurationID() == null); - config.setFlightConfigurationID(null); - assertTrue(config.getFlightConfigurationID() == null); - - // now that id is set to null, setting to null should not set again (do for coverage) - config.setFlightConfigurationID(null); - assertTrue(config.getFlightConfigurationID() == null); - - // reset the id from null to a test value - config.setFlightConfigurationID(testFlightConfigID); - assertTrue(config.getFlightConfigurationID().equals(testFlightConfigID)); - - // setting it to the same non-null value should just return (do for coverage) - config.setFlightConfigurationID(testFlightConfigID); - assertTrue(config.getFlightConfigurationID().equals(testFlightConfigID)); - - // set back to original value - config.setFlightConfigurationID(origFlightConfigID); - assertTrue(config.getFlightConfigurationID().equals(origFlightConfigID)); - - /* Cleanup */ - config.release(); - } - - - /** - * Test flight configuration ID methods - */ - @Test - public void testGeneralMethods() { - - /* Setup */ - Rocket r1 = makeSingleStageTestRocket(); - Configuration config = r1.getDefaultConfiguration(); - - /* Test */ - - // general method tests - Configuration configClone = config.clone(); // TODO validate clone worked - - assertFalse(config.getRocket() == null); - - // TODO rocket has no motors! assertTrue(config.hasMotors()); - - // rocket info tests - - double length = config.getLength(); - double refLength = config.getReferenceLength(); - double refArea = config.getReferenceArea(); - - // TODO validate that the values are correct - //log.debug("ConfigurationTest, length: " + String.valueOf(length)); - //log.debug("ConfigurationTest, refLength: " + String.valueOf(refLength)); - //log.debug("ConfigurationTest, refArea: " + String.valueOf(refArea)); - - /* Cleanup */ - config.release(); - } - - /** - * Single stage rocket specific configuration tests - */ - @Test - public void testSingleStageRocket() { - - /* Setup */ - Rocket r1 = makeSingleStageTestRocket(); - Configuration config = r1.getDefaultConfiguration(); - - BitSet activeStageFlags = new BitSet(); - activeStageFlags.set(0, false); // first stage - - /* Test */ - - // test cloning of single stage rocket - Configuration configClone = config.clone(); // TODO validate clone worked - - // test explicitly setting only first stage active - config.setOnlyStage(0); - activeStageFlags.clear(); - activeStageFlags.set(0, true); - validateStages(config, 1, activeStageFlags); - - // test explicitly setting all stages up to first stage active - config.setToStage(0); - activeStageFlags.clear(); - activeStageFlags.set(0, true); - validateStages(config, 1, activeStageFlags); - - // test explicitly setting all stages active - config.setAllStages(); - activeStageFlags.clear(); - activeStageFlags.set(0, true); - validateStages(config, 1, activeStageFlags); - - // Cleanup - config.release(); - - } - - /** - * Multi stage rocket specific configuration tests - */ - @Test - public void testMultiStageRocket() { - - /* Setup */ - Rocket r1 = makeTwoStageTestRocket(); - Configuration config = r1.getDefaultConfiguration(); - - BitSet activeStageFlags = new BitSet(); - activeStageFlags.set(0, false); // booster (first) stage - activeStageFlags.set(1, false); // sustainer (second) stage - - /* Test */ - - // test cloning of two stage rocket - Configuration configClone = config.clone(); // TODO validate clone worked - - // test explicitly setting only first stage active - config.setOnlyStage(0); - activeStageFlags.clear(); - activeStageFlags.set(0, true); - validateStages(config, 2, activeStageFlags); - - // test explicitly setting all stages up to first stage active - config.setToStage(0); - activeStageFlags.clear(); - activeStageFlags.set(0, true); - validateStages(config, 2, activeStageFlags); - - // test explicitly setting all stages up to second stage active - config.setToStage(1); - activeStageFlags.clear(); - activeStageFlags.set(0, 2, true); - validateStages(config, 2, activeStageFlags); - - // test explicitly setting all two stages active - config.setAllStages(); - activeStageFlags.clear(); - activeStageFlags.set(0, 2, true); - validateStages(config, 2, activeStageFlags); - - // Cleanup - config.release(); - - - } - - ///////////////////// Helper Methods //////////////////////////// - - public void validateStages(Configuration config, int expectedStageCount, BitSet activeStageFlags) { - - // test that getStageCount() returns correct value - int stageCount = config.getStageCount(); - assertTrue(stageCount == expectedStageCount); - - // test that getActiveStageCount() and getActiveStages() returns correct values - int expectedActiveStageCount = 0; - for (int i = 0; i < expectedStageCount; i++) { - if (activeStageFlags.get(i)) { - expectedActiveStageCount++; - } - } - assertTrue(config.getActiveStageCount() == expectedActiveStageCount); - int[] stages = config.getActiveStages(); - assertTrue(stages.length == expectedActiveStageCount); - - // test if isHead() detects first stage being active or inactive - if (activeStageFlags.get(0)) { - assertTrue(config.isHead()); - } else { - assertFalse(config.isHead()); - } - - // test if isStageActive() detects stage x being active or inactive - for (int i = 0; i < expectedStageCount; i++) { - if (activeStageFlags.get(i)) { - assertTrue(config.isStageActive(i)); - } else { - assertFalse(config.isStageActive(i)); - } - } - - // test boundary conditions - - // stage -1 should not exist, and isStageActive() should throw exception - boolean IndexOutOfBoundsExceptionFlag = false; - try { - assertFalse(config.isStageActive(-1)); - } catch (IndexOutOfBoundsException e) { - IndexOutOfBoundsExceptionFlag = true; - } - assertTrue(IndexOutOfBoundsExceptionFlag); - - // n+1 stage should not exist, isStageActive() should return false - // TODO: isStageActive(stageCount + 1) really should throw IndexOutOfBoundsException - assertFalse(config.isStageActive(stageCount + 1)); - - } - - - //////////////////// Test Rocket Creation Methods ///////////////////////// - - public static Rocket makeEmptyRocket() { - Rocket rocket = new Rocket(); - return rocket; - } - - public static Rocket makeSingleStageTestRocket() { - - // TODO: get units correct, these units are prob wrong, are lengths are CM, mass are grams - - Rocket rocket; - Stage stage; - NoseCone nosecone; - BodyTube tube1; - TrapezoidFinSet finset; - - // body tube constants - final double R = 2.5 / 2; // cm - final double BT_T = 0.1; - - // nose cone constants - final double NC_T = 0.2; - final double R2 = 2.3 / 2; - - rocket = new Rocket(); - stage = new Stage(); - stage.setName("Stage1"); - - nosecone = new NoseCone(Transition.Shape.OGIVE, 10.0, R); - nosecone.setThickness(NC_T); - nosecone.setAftShoulderLength(2.0); - nosecone.setAftShoulderRadius(R2); - nosecone.setAftShoulderThickness(NC_T); - nosecone.setAftShoulderCapped(true); - nosecone.setFilled(false); - stage.addChild(nosecone); - - tube1 = new BodyTube(30, R, BT_T); - stage.addChild(tube1); - - LaunchLug lug = new LaunchLug(); - lug.setLength(3.5); - tube1.addChild(lug); - - /* - TubeCoupler coupler = new TubeCoupler(); - coupler.setOuterRadiusAutomatic(true); - coupler.setThickness(0.005); - coupler.setLength(0.28); - coupler.setMassOverridden(true); - coupler.setOverrideMass(0.360); - coupler.setRelativePosition(Position.BOTTOM); - coupler.setPositionValue(-0.14); - tube1.addChild(coupler); - */ - - // Parachute - MassComponent mass = new MassComponent(4.5, R2, 8.0); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(3.0); - tube1.addChild(mass); - - // Cord - mass = new MassComponent(40.0, R2, 72); - mass.setRelativePosition(Position.TOP); - mass.setPositionValue(2.0); - tube1.addChild(mass); - - // Motor mount - InnerTube inner = new InnerTube(); - inner.setMotorMount(true); - inner.setPositionValue(0.5); - inner.setRelativePosition(Position.BOTTOM); - inner.setOuterRadius(1.9 / 2); - inner.setInnerRadius(1.8 / 2); - inner.setLength(7.5); - tube1.addChild(inner); - - // Centering rings for motor mount - - CenteringRing center = new CenteringRing(); - center.setInnerRadiusAutomatic(true); - center.setOuterRadiusAutomatic(true); - center.setLength(0.005); - center.setMassOverridden(true); - center.setOverrideMass(0.038); - center.setRelativePosition(Position.BOTTOM); - center.setPositionValue(0.25); - tube1.addChild(center); - - center = new CenteringRing(); - center.setInnerRadiusAutomatic(true); - center.setOuterRadiusAutomatic(true); - center.setLength(0.005); - center.setMassOverridden(true); - center.setOverrideMass(0.038); - center.setRelativePosition(Position.BOTTOM); - center.setPositionValue(-6.0); - tube1.addChild(center); - - - center = new CenteringRing(); - center.setInnerRadiusAutomatic(true); - center.setOuterRadiusAutomatic(true); - center.setLength(0.005); - center.setMassOverridden(true); - center.setOverrideMass(0.038); - center.setRelativePosition(Position.TOP); - center.setPositionValue(0.83); - tube1.addChild(center); - - // Fins - finset = new TrapezoidFinSet(); - finset.setFinCount(3); - finset.setRootChord(5.0); - finset.setTipChord(5.0); - finset.setHeight(3.0); - finset.setThickness(0.005); - finset.setSweepAngle(40.0); - finset.setRelativePosition(Position.BOTTOM); - finset.setPositionValue(-0.5); - finset.setBaseRotation(Math.PI / 2); - tube1.addChild(finset); - - // Stage construction - rocket.addChild(stage); - rocket.setPerfectFinish(false); - - // Flight configuration - String id = rocket.newFlightConfigurationID(); - - // Motor m = Application.getMotorSetDatabase().findMotors(null, null, "L540", Double.NaN, Double.NaN).get(0); - // tube3.setMotor(id, m); - // tube3.setMotorOverhang(0.02); - rocket.getDefaultConfiguration().setFlightConfigurationID(id); - - // tube3.setIgnitionEvent(MotorMount.IgnitionEvent.NEVER); - - rocket.getDefaultConfiguration().setAllStages(); - - return rocket; - } - - - public static Rocket makeTwoStageTestRocket() { - - // TODO: get units correct, these units are prob wrong, are lengths are CM, mass are grams - - final double R = 2.5 / 2; // cm - final double BT_T = 0.1; - - Rocket rocket = makeSingleStageTestRocket(); - - Stage stage = new Stage(); - stage.setName("Booster"); - - BodyTube boosterTube = new BodyTube(9.0, R, BT_T); - stage.addChild(boosterTube); - - TubeCoupler coupler = new TubeCoupler(); - coupler.setOuterRadiusAutomatic(true); - coupler.setThickness(BT_T); - coupler.setLength(3.0); - coupler.setRelativePosition(Position.TOP); - coupler.setPositionValue(-1.5); - boosterTube.addChild(coupler); - - TrapezoidFinSet finset = new TrapezoidFinSet(); - finset.setFinCount(3); - finset.setRootChord(5.0); - finset.setTipChord(5.0); - finset.setHeight(3.0); - finset.setThickness(0.005); - finset.setSweepAngle(40.0); - finset.setRelativePosition(Position.BOTTOM); - finset.setPositionValue(-0.25); - finset.setBaseRotation(Math.PI / 2); - boosterTube.addChild(finset); - - rocket.addChild(stage); - - return rocket; - - } - -} diff --git a/core/test/net/sf/openrocket/rocketcomponent/FinSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/FinSetTest.java index 58dc0a440d..cd94adee7d 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/FinSetTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/FinSetTest.java @@ -1,302 +1,210 @@ package net.sf.openrocket.rocketcomponent; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import net.sf.openrocket.aerodynamics.AerodynamicForces; -import net.sf.openrocket.aerodynamics.FlightConditions; -import net.sf.openrocket.aerodynamics.WarningSet; -import net.sf.openrocket.aerodynamics.barrowman.FinSetCalc; + import net.sf.openrocket.material.Material; -import net.sf.openrocket.material.Material.Type; -import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; -import net.sf.openrocket.rocketcomponent.FinSet.CrossSection; -import net.sf.openrocket.rocketcomponent.FinSet.TabRelativePosition; -import net.sf.openrocket.rocketcomponent.RocketComponent.Position; -import net.sf.openrocket.util.Color; +import org.junit.Test; + +import net.sf.openrocket.rocketcomponent.position.*; import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.LineStyle; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; -import org.junit.Test; - public class FinSetTest extends BaseTestCase { - + + private static final double EPSILON = 1E-8; + @Test - public void testTrapezoidCGComputation() { - - { - // This is a simple square fin with sides of 1.0. - TrapezoidFinSet fins = new TrapezoidFinSet(); - fins.setFinCount(1); - fins.setFinShape(1.0, 1.0, 0.0, 1.0, .005); - - Coordinate coords = fins.getCG(); - assertEquals(1.0, fins.getFinArea(), 0.001); - assertEquals(0.5, coords.x, 0.001); - assertEquals(0.5, coords.y, 0.001); - } - - { - // This is a trapezoid. Height 1, root 1, tip 1/2 no sweep. - // It can be decomposed into a rectangle followed by a triangle - // +---+ - // | \ - // | \ - // +------+ - TrapezoidFinSet fins = new TrapezoidFinSet(); - fins.setFinCount(1); - fins.setFinShape(1.0, 0.5, 0.0, 1.0, .005); - - Coordinate coords = fins.getCG(); - assertEquals(0.75, fins.getFinArea(), 0.001); - assertEquals(0.3889, coords.x, 0.001); - assertEquals(0.4444, coords.y, 0.001); - } - + public void testMultiplicity() { + final EllipticalFinSet fins = new EllipticalFinSet(); + assertEquals(1, fins.getFinCount()); + } + + /** + * sweep= 0.02 | tipChord = 0.02 + * | | | + * | +------+ ---------- + * | / \ + * | / \ height = 0.05 + * | / \ + * / \ + * __________/________________\_____ length == rootChord == 0.06 + * | | + * | | tab height = 0.02 + * | | + * +--------+ tab length = 0.02 + * position = 0.0 via middle + * + * Fin Area = 0.05 * ( (0.2 + 0.06)/2) = 0.0 + */ + private static FinSet createSimpleFin() { + + TrapezoidFinSet fins = new TrapezoidFinSet(1, 0.06, 0.02, 0.02, 0.05); + fins.setName("test fins"); + fins.setAxialOffset(AxialMethod.MIDDLE, 0.0); + fins.setMaterial(Material.newMaterial(Material.Type.BULK, "Fin-Test-Material", 1.0, true)); + fins.setThickness(0.005); // == 5 mm + + fins.setTabLength(0.02); + fins.setTabOffsetMethod(AxialMethod.TOP); + fins.setTabOffset(0.02); + + fins.setFilletRadius(0.0); + + return fins; } - + @Test - public void testFreeformCGComputation() throws Exception { - - { - // This is a trapezoid. Height 1, root 1, tip 1/2 no sweep. - // It can be decomposed into a rectangle followed by a triangle - // +---+ - // | \ - // | \ - // +------+ - FreeformFinSet fins = new FreeformFinSet(); - fins.setFinCount(1); - Coordinate[] points = new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0, 1), - new Coordinate(.5, 1), - new Coordinate(1, 0) - }; - fins.setPoints(points); - Coordinate coords = fins.getCG(); - assertEquals(0.75, fins.getFinArea(), 0.001); - assertEquals(0.3889, coords.x, 0.001); - assertEquals(0.4444, coords.y, 0.001); - } - - { - // This is the same trapezoid as previous free form, but it has - // some extra points along the lines. - FreeformFinSet fins = new FreeformFinSet(); - fins.setFinCount(1); - Coordinate[] points = new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0, .5), - new Coordinate(0, 1), - new Coordinate(.25, 1), - new Coordinate(.5, 1), - new Coordinate(.75, .5), - new Coordinate(1, 0) - }; - fins.setPoints(points); - Coordinate coords = fins.getCG(); - assertEquals(0.75, fins.getFinArea(), 0.001); - assertEquals(0.3889, coords.x, 0.001); - assertEquals(0.4444, coords.y, 0.001); - } - - { - // This is the same trapezoid as previous free form, but it has - // some extra points which are very close to previous points. - // in particular for points 0 & 1, - // y0 + y1 is very small. - FreeformFinSet fins = new FreeformFinSet(); - fins.setFinCount(1); - Coordinate[] points = new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0, 1E-15), - new Coordinate(0, 1), - new Coordinate(1E-15, 1), - new Coordinate(.5, 1), - new Coordinate(.5, 1 - 1E-15), - new Coordinate(1, 1E-15), - new Coordinate(1, 0) - }; - fins.setPoints(points); - Coordinate coords = fins.getCG(); - assertEquals(0.75, fins.getFinArea(), 0.001); - assertEquals(0.3889, coords.x, 0.001); - assertEquals(0.4444, coords.y, 0.001); + public void testTabLocation() { + final FinSet fins = FinSetTest.createSimpleFin(); + assertEquals("incorrect fin length:", 0.06, fins.getLength(), EPSILON); + assertEquals("incorrect fin tab length:", 0.02, fins.getTabLength(), EPSILON); + + final double expFront = 0.02; + final AxialMethod[] methods = AxialMethod.axialOffsetMethods; + final double[] expShift = {0.02, 0.0, -0.02}; + for( int caseIndex=0; caseIndex < methods.length; ++caseIndex ){ + double actFront = fins.getTabFrontEdge(); + assertEquals(" Front edge doesn't match!", expFront, actFront, EPSILON); + + // update + fins.setTabOffsetMethod( methods[caseIndex]); + + //query + double actShift = fins.getTabOffset(); + assertEquals(String.format("Offset doesn't match for: %s \n", methods[caseIndex].name()), expShift[caseIndex], actShift, EPSILON); } - } - + + @Test + public void testTabGetAs(){ + final FinSet fins = FinSetTest.createSimpleFin(); + assertEquals("incorrect fin length:", 0.06, fins.getLength(), EPSILON); + assertEquals("incorrect fin tab length:", 0.02, fins.getTabLength(), EPSILON); + + // TOP -> native(TOP) + fins.setTabOffsetMethod(AxialMethod.TOP); + fins.setTabOffset(0.0); + + assertEquals("Setting by TOP method failed!", 0.0, fins.getTabFrontEdge(), EPSILON); + assertEquals("Setting by TOP method failed!", 0.0, fins.getTabOffset(), EPSILON); + + // MIDDLE -> native + fins.setTabOffsetMethod(AxialMethod.MIDDLE); + fins.setTabOffset(0.0); + assertEquals("Setting by TOP method failed!", 0.02, fins.getTabFrontEdge(), EPSILON); + assertEquals("Setting by TOP method failed!", 0.0, fins.getTabOffset(), EPSILON); + + // BOTTOM -> native + fins.setTabOffsetMethod(AxialMethod.BOTTOM); + fins.setTabOffset(0.0); + + assertEquals("Setting by TOP method failed!", 0.04, fins.getTabFrontEdge(), EPSILON); + assertEquals("Setting by TOP method failed!", 0.0, fins.getTabOffset(), EPSILON); + } + @Test - public void testWildmanVindicatorShape() throws Exception { - // This fin shape is similar to the aft fins on the Wildman Vindicator. - // A user noticed that if the y values are similar but not equal, - // the compuation of CP was incorrect because of numerical instability. + public void testTabLocationUpdate() { + final FinSet fins = FinSetTest.createSimpleFin(); + assertEquals("incorrect fin length:", 0.06, fins.getLength(), EPSILON); + assertEquals("incorrect fin tab length:", 0.02, fins.getTabLength(), EPSILON); + + // TOP -> native(TOP) + fins.setTabOffsetMethod(AxialMethod.MIDDLE); + fins.setTabOffset(0.0); + + assertEquals("Setting by TOP method failed!", 0.0, fins.getTabOffset(), EPSILON); + assertEquals("Setting by TOP method failed!", 0.02, fins.getTabFrontEdge(), EPSILON); + + ((TrapezoidFinSet)fins).setRootChord(0.08); + + assertEquals("Front edge doesn't match after adjusting root chord...", 0.03, fins.getTabFrontEdge(), EPSILON); + assertEquals("Offset doesn't match after adjusting root chord....", 0.0, fins.getTabOffset(), EPSILON); + } + + @Test + public void testAreaCalculationsSingleIncrement() { + Coordinate[] basicPoints = { + new Coordinate(0.00, 0.0), + new Coordinate(0.06, 0.06), + new Coordinate(0.06, 0.0), + new Coordinate(0.00, 0.0) }; // - // +-----------------+ - // \ \ - // \ \ - // + \ - // / \ - // +---------------------+ + // [1] + + // /| + // / | + // [0] +--+ [2] + // [3] // - FreeformFinSet fins = new FreeformFinSet(); - fins.setFinCount(1); - Coordinate[] points = new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0.02143125, 0.01143), - new Coordinate(0.009524999999999999, 0.032543749999999996), - new Coordinate(0.041275, 0.032537399999999994), - new Coordinate(0.066675, 0) - }; - fins.setPoints(points); - Coordinate coords = fins.getCG(); - assertEquals(0.00130, fins.getFinArea(), 0.00001); - assertEquals(0.03423, coords.x, 0.00001); - assertEquals(0.01427, coords.y, 0.00001); - - BodyTube bt = new BodyTube(); - bt.addChild(fins); - FinSetCalc calc = new FinSetCalc(fins); - FlightConditions conditions = new FlightConditions(null); - AerodynamicForces forces = new AerodynamicForces(); - WarningSet warnings = new WarningSet(); - calc.calculateNonaxialForces(conditions, forces, warnings); - System.out.println(forces); - assertEquals(0.023409, forces.getCP().x, 0.0001); + + final double expArea = 0.06 * 0.06 * 0.5; + final Coordinate actCentroid = FinSet.calculateCurveIntegral(basicPoints); + assertEquals(" basic area doesn't match...", expArea, actCentroid.weight, EPSILON); + assertEquals(" basic centroid x doesn't match: ", 0.04, actCentroid.x, 1e-8); + assertEquals(" basic centroid y doesn't match: ", 0.02, actCentroid.y, 1e-8); } - + @Test - public void testFreeFormCGWithNegativeY() throws Exception { - // This particular fin shape is currently not allowed in OR since the y values are negative - // however, it is possible to convert RockSim files and end up with fins which - // have negative y values. - - // A user submitted an ork file which could not be simulated because the fin - // was constructed on a tail cone. It so happened that for one pair of points - // y_n = - y_(n+1) which caused a divide by zero and resulted in CGx = NaN. - - // This Fin set is constructed to have the same problem. It is a square and rectagle - // where the two trailing edge corners of the rectangle satisfy y_0 = -y_1 + public void testAreaCalculationsDoubleIncrement() { + Coordinate[] basicPoints = { + new Coordinate(0.00, 0.0), + new Coordinate(0.06, 0.06), + new Coordinate(0.12, 0.0), + new Coordinate(0.00, 0.0) }; // - // +---------+ - // | | - // | | - // +----+ | - // | | - // | | - // +----+ - - FreeformFinSet fins = new FreeformFinSet(); - fins.setFinCount(1); - Coordinate[] points = new Coordinate[] { - new Coordinate(0, 0), - new Coordinate(0, 1), - new Coordinate(2, 1), - new Coordinate(2, -1), - new Coordinate(1, -1), - new Coordinate(1, 0) - }; - fins.setPoints(points); - Coordinate coords = fins.getCG(); - assertEquals(3.0, fins.getFinArea(), 0.001); - assertEquals(3.5 / 3.0, coords.x, 0.001); - assertEquals(0.5 / 3.0, coords.y, 0.001); - + // [1] + + // / \ + // / \ + // [0] +-----+ [2] + // [3] + // + + final double expArea = 0.06 * 0.12 * 0.5; + final Coordinate actCentroid = FinSet.calculateCurveIntegral(basicPoints); + assertEquals(" basic area doesn't match...", expArea, actCentroid.weight, EPSILON); + assertEquals(" basic centroid x doesn't match: ", 0.06, actCentroid.x, 1e-8); + assertEquals(" basic centroid y doesn't match: ", 0.02, actCentroid.y, 1e-8); } - - + + @Test - public void testFreeformConvert() { - testFreeformConvert(new TrapezoidFinSet()); - testFreeformConvert(new EllipticalFinSet()); - testFreeformConvert(new FreeformFinSet()); + public void testAreaCalculations() { + Coordinate[] basicPoints = { + new Coordinate(0.00, 0.0), + new Coordinate(0.02, 0.05), + new Coordinate(0.04, 0.05), + new Coordinate(0.06, 0.0), + new Coordinate(0.00, 0.0) }; + /* + * [1] +--+ [2] + * / \ + * / \ + * [0] +--------+ [3] + * [4] + */ + final double expArea = 0.04 * 0.05; + final Coordinate actCentroid = FinSet.calculateCurveIntegral(basicPoints); + assertEquals(" basic area doesn't match...", expArea, actCentroid.weight, EPSILON); + assertEquals(" basic centroid x doesn't match: ", 0.03000, actCentroid.x, 1e-8); + assertEquals(" basic centroid y doesn't match: ", 0.020833333, actCentroid.y, 1e-8); } - - - private void testFreeformConvert(FinSet fin) { - FreeformFinSet converted; - Material mat = Material.newMaterial(Type.BULK, "foo", 0.1, true); - - fin.setBaseRotation(1.1); - fin.setCantAngle(0.001); - fin.setCGOverridden(true); - fin.setColor(Color.BLACK); - fin.setComment("cmt"); - fin.setCrossSection(CrossSection.ROUNDED); - fin.setFinCount(5); - fin.setFinish(Finish.ROUGH); - fin.setLineStyle(LineStyle.DASHDOT); - fin.setMassOverridden(true); - fin.setMaterial(mat); - fin.setOverrideCGX(0.012); - fin.setOverrideMass(0.0123); - fin.setOverrideSubcomponents(true); - fin.setPositionValue(0.1); - fin.setRelativePosition(Position.ABSOLUTE); - fin.setTabHeight(0.01); - fin.setTabLength(0.02); - fin.setTabRelativePosition(TabRelativePosition.END); - fin.setTabShift(0.015); - fin.setThickness(0.005); - - - converted = FreeformFinSet.convertFinSet((FinSet) fin.copy()); - - ComponentCompare.assertSimilarity(fin, converted, true); - - assertEquals(converted.getComponentName(), converted.getName()); - - - // Create test rocket - Rocket rocket = new Rocket(); - Stage stage = new Stage(); - BodyTube body = new BodyTube(); - - rocket.addChild(stage); - stage.addChild(body); - body.addChild(fin); - - Listener l1 = new Listener("l1"); - rocket.addComponentChangeListener(l1); - - fin.setName("Custom name"); - assertTrue(l1.changed); - assertEquals(ComponentChangeEvent.NONFUNCTIONAL_CHANGE, l1.changetype); - - - // Create copy - RocketComponent rocketcopy = rocket.copy(); - - Listener l2 = new Listener("l2"); - rocketcopy.addComponentChangeListener(l2); - - FinSet fincopy = (FinSet) rocketcopy.getChild(0).getChild(0).getChild(0); - FreeformFinSet.convertFinSet(fincopy); - - assertTrue(l2.changed); - assertEquals(ComponentChangeEvent.TREE_CHANGE, - l2.changetype & ComponentChangeEvent.TREE_CHANGE); - - } - - - private static class Listener implements ComponentChangeListener { - private boolean changed = false; - private int changetype = 0; - private final String name; - - public Listener(String name) { - this.name = name; - } + + @Test + public void testFinInstanceAngles() { + FinSet fins = createSimpleFin(); + fins.setBaseRotation(Math.PI/6); // == 30d + fins.setInstanceCount(3); // == 120d between each fin + // => [ 30, 150, 270 ] + // => PI*[ 1/6, 5/6, 9/6 ] + // => [ .523, 2.61, 4.71 ] + + final double[] instanceAngles = fins.getInstanceAngles(); + assertEquals( (1./6.)* Math.PI, fins.getBaseRotation(), EPSILON); + assertEquals( (1./6.)* Math.PI, fins.getAngleOffset(), EPSILON); - @Override - public void componentChanged(ComponentChangeEvent e) { - assertFalse("Ensuring listener " + name + " has not been called.", changed); - changed = true; - changetype = e.getType(); - } + assertEquals((1./6.)* Math.PI, instanceAngles[0], EPSILON); + assertEquals((5./6.)* Math.PI, instanceAngles[1], EPSILON); + assertEquals((9./6.)* Math.PI, instanceAngles[2], EPSILON); } - + + } diff --git a/core/test/net/sf/openrocket/rocketcomponent/FlightConfigurationTest.java b/core/test/net/sf/openrocket/rocketcomponent/FlightConfigurationTest.java new file mode 100644 index 0000000000..b8a0a58757 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/FlightConfigurationTest.java @@ -0,0 +1,477 @@ +package net.sf.openrocket.rocketcomponent; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class FlightConfigurationTest extends BaseTestCase { + private final static double EPSILON = MathUtil.EPSILON*1E3; + + /** + * Empty rocket (no components) specific configuration tests + */ + @Test + public void testEmptyRocket() { + Rocket r1 = TestRockets.makeEstesAlphaIII(); + FlightConfiguration config = r1.getSelectedConfiguration(); + + FlightConfiguration configClone = config.clone(); + + assertTrue(config.getRocket() == configClone.getRocket()); + } + + + @Test + public void testFlightConfigurationRocketLength() { + Rocket rocket = TestRockets.makeBeta(); + FlightConfiguration config = rocket.getEmptyConfiguration(); + rocket.setSelectedConfiguration( config.getId() ); + + config.setAllStages(); + + // preconditions + assertThat("active stage count doesn't match", config.getActiveStageCount(), equalTo(2)); + + final double expectedLength = 0.33; + final double calculatedLength = config.getLength(); + assertEquals("source config length doesn't match: ", expectedLength, calculatedLength, EPSILON); + + double expectedReferenceLength = 0.024; + assertEquals("source config reference length doesn't match: ", expectedReferenceLength, config.getReferenceLength(), EPSILON); + + double expectedReferenceArea = Math.pow(expectedReferenceLength/2,2)*Math.PI; + double actualReferenceArea = config.getReferenceArea(); + assertEquals("source config reference area doesn't match: ", expectedReferenceArea, actualReferenceArea, EPSILON); + } + + + @Test + public void testCloneBasic() { + Rocket rkt1 = TestRockets.makeBeta(); + FlightConfiguration config1 = rkt1.getSelectedConfiguration(); + + // preconditions + config1.setAllStages(); + int expectedStageCount = 2; + int actualStageCount = config1.getActiveStageCount(); + assertThat("active stage count doesn't match", actualStageCount, equalTo(expectedStageCount)); + int expectedMotorCount = 2; + int actualMotorCount = config1.getActiveMotors().size(); + assertThat("active motor count doesn't match", actualMotorCount, equalTo(expectedMotorCount)); + double expectedLength = 0.33; + assertEquals("source config length doesn't match: ", expectedLength, config1.getLength(), EPSILON); + double expectedReferenceLength = 0.024; + assertEquals("source config reference length doesn't match: ", expectedReferenceLength, config1.getReferenceLength(), EPSILON); + double expectedReferenceArea = Math.pow(expectedReferenceLength/2,2)*Math.PI; + double actualReferenceArea = config1.getReferenceArea(); + assertEquals("source config reference area doesn't match: ", expectedReferenceArea, actualReferenceArea, EPSILON); + + + // vvvv test target vvvv + FlightConfiguration config2= config1.clone(); + // ^^^^ test target ^^^^ + + // postconditions + expectedStageCount = 2; + actualStageCount = config2.getActiveStageCount(); + assertThat("active stage count doesn't match", actualStageCount, equalTo(expectedStageCount)); + expectedMotorCount = 2; + actualMotorCount = config2.getActiveMotors().size(); + assertThat("active motor count doesn't match", actualMotorCount, equalTo(expectedMotorCount)); + assertEquals("source config length doesn't match: ", expectedLength, config2.getLength(), EPSILON); + assertEquals("source config reference length doesn't match: ", expectedReferenceLength, config2.getReferenceLength(), EPSILON); + assertEquals("source config reference area doesn't match: ", expectedReferenceArea, config2.getReferenceArea(), EPSILON); + + } + + /** + * Test flight configuration ID methods + */ + @Test + public void testCloneIndependence() { + Rocket rkt1 = TestRockets.makeBeta(); + FlightConfiguration config1 = rkt1.getSelectedConfiguration(); + int expectedStageCount; + int actualStageCount; + int expectedMotorCount; + int actualMotorCount; + + // test that cloned configurations operate independently: + // change #1, test clone #2 -- verify that cloned configurations change independent. + config1.setAllStages(); + // vvvv test target vvvv + FlightConfiguration config2 = config1.clone(); + // ^^^^ test target ^^^^ + config1.clearAllStages(); + + // postcondition: config #1 + expectedStageCount = 0; + actualStageCount = config1.getActiveStageCount(); + assertThat("active stage count doesn't match", actualStageCount, equalTo(expectedStageCount)); + expectedMotorCount = 0; + actualMotorCount = config1.getActiveMotors().size(); + assertThat("active motor count doesn't match", actualMotorCount, equalTo(expectedMotorCount)); + + // postcondition: config #2 + expectedStageCount = 2; + actualStageCount = config2.getActiveStageCount(); + assertThat("active stage count doesn't match", actualStageCount, equalTo(expectedStageCount)); + expectedMotorCount = 2; + actualMotorCount = config2.getActiveMotors().size(); + assertThat("active motor count doesn't match", actualMotorCount, equalTo(expectedMotorCount)); + } + + /** + * Single stage rocket specific configuration tests + */ + @Test + public void testSingleStageRocket() { + Rocket r1 = TestRockets.makeEstesAlphaIII(); + FlightConfiguration config = r1.getSelectedConfiguration(); + + // test explicitly setting only first stage active + config.clearAllStages(); + config.setOnlyStage(0); + + // test that getStageCount() returns correct value + int expectedStageCount = 1; + int stageCount = config.getStageCount(); + assertTrue("stage count doesn't match", stageCount == expectedStageCount); + + expectedStageCount = 1; + stageCount = config.getActiveStageCount(); + assertThat("active stage count doesn't match", stageCount, equalTo(expectedStageCount)); + + // test explicitly setting all stages up to first stage active + config.setOnlyStage(0); + + // test explicitly setting all stages active + config.setAllStages(); + } + + /** + * Single stage rocket specific configuration tests + */ + @Test + public void testDefaultConfigurationIsEmpty() { + Rocket r1 = TestRockets.makeEstesAlphaIII(); + + // don't change the configuration: + FlightConfiguration defaultConfig = r1.getSelectedConfiguration(); + + assertThat( "Empty configuration has motors! it should be empty!", r1.getEmptyConfiguration().getActiveMotors().size(), equalTo(0)); + assertThat( "Default configuration is not the empty configuration. It should be!", defaultConfig.getActiveMotors().size(), equalTo(0)); + } + + @Test + public void testCreateConfigurationNullId() { + /* Setup */ + Rocket rkt = TestRockets.makeEstesAlphaIII(); + + // PRE-CONDITION: + // test that all configurations correctly loaded: + int expectedConfigCount = 5; + int actualConfigCount = rkt.getConfigurationCount(); + assertThat("number of loaded configuration counts doesn't actually match.", actualConfigCount, equalTo(expectedConfigCount)); + + // create with + rkt.createFlightConfiguration( (FlightConfigurationId)null); + expectedConfigCount = 6; + actualConfigCount = rkt.getConfigurationCount(); + assertThat("createFlightConfiguration with null: doesn't actually work.", actualConfigCount, equalTo(expectedConfigCount)); + } + + @Test + public void testMotorConfigurations() { + /* Setup */ + Rocket rkt = TestRockets.makeEstesAlphaIII(); + + InnerTube smmt = (InnerTube)rkt.getChild(0).getChild(1).getChild(2); + + int expectedMotorCount = 5; + int actualMotorCount = smmt.getMotorCount(); + assertThat("number of motor configurations doesn't match.", actualMotorCount, equalTo(expectedMotorCount)); + + } + + @Test + public void testFlightConfigurationGetters(){ + Rocket rkt = TestRockets.makeEstesAlphaIII(); + + // test that all configurations correctly loaded: + int expectedConfigCount = 5; + int actualConfigCount = rkt.getConfigurationCount(); + assertThat("number of loaded configuration counts doesn't actually match.", actualConfigCount, equalTo(expectedConfigCount)); + + actualConfigCount = rkt.getIds().size(); + assertThat("number of configuration array ids doesn't actually match.", + actualConfigCount, equalTo(expectedConfigCount)); + + // upon success, these silently complete. + // upon failure, they'll throw exceptions: + rkt.getFlightConfigurationByIndex(4); + rkt.getFlightConfigurationByIndex(5, true); + } + + + @Test(expected=java.lang.IndexOutOfBoundsException.class) + public void testGetFlightConfigurationOutOfBounds(){ + Rocket rkt = TestRockets.makeEstesAlphaIII(); + + // test that all configurations correctly loaded: + int expectedConfigCount = 5; + int actualConfigCount = rkt.getConfigurationCount(); + assertThat("number of loaded configuration counts doesn't actually match.", actualConfigCount, equalTo(expectedConfigCount)); + + // this SHOULD throw an exception -- + // it's out of bounds on, and no configuration exists at index 5. + rkt.getFlightConfigurationByIndex(5); + } + + /** + * Multi stage rocket specific configuration tests + */ + @Test + public void testMultiStageRocket() { + + /* Setup */ + Rocket rkt = TestRockets.makeBeta(); + FlightConfiguration config = rkt.getSelectedConfiguration(); + + int expectedStageCount; + int stageCount; + + expectedStageCount = 2; + stageCount = config.getStageCount(); + assertThat("stage count doesn't match", stageCount, equalTo(expectedStageCount)); + + config.clearAllStages(); + assertThat(" clear all stages: check #0: ", config.isStageActive(0), equalTo(false)); + assertThat(" clear all stages: check #1: ", config.isStageActive(1), equalTo(false)); + + // test explicitly setting only first stage active + config.setOnlyStage(0); + + expectedStageCount = 1; + stageCount = config.getActiveStageCount(); + assertThat("active stage count doesn't match", stageCount, equalTo(expectedStageCount)); + + assertThat(" setting single stage active: ", config.isStageActive(0), equalTo(true)); + + // test explicitly setting all stages up to second stage active + config.setOnlyStage(1); + assertThat("Setting single stage active: ", config.isStageActive(0), equalTo(false)); + assertThat("Setting single stage active: ", config.isStageActive(1), equalTo(true)); + + config.clearStage(0); + assertThat(" deactivate stage #0: ", config.isStageActive(0), equalTo(false)); + assertThat(" active stage #1: ", config.isStageActive(1), equalTo(true)); + + // test explicitly setting all two stages active + config.setAllStages(); + assertThat(" activate all stages: check stage #0: ", config.isStageActive(0), equalTo(true)); + assertThat(" activate all stages: check stage #1: ", config.isStageActive(1), equalTo(true)); + + // test toggling single stage + config.setAllStages(); + config.toggleStage(0); + assertThat(" toggle stage #0: ", config.isStageActive(0), equalTo(false)); + + config.toggleStage(0); + assertThat(" toggle stage #0: ", config.isStageActive(0), equalTo(true)); + + config.toggleStage(0); + assertThat(" toggle stage #0: ", config.isStageActive(0), equalTo(false)); + + } + + /** + * Multi stage rocket specific configuration tests + */ + @Test + public void testMotorClusters() { + + /* Setup */ + Rocket rkt = TestRockets.makeBeta(); + FlightConfiguration config = rkt.getSelectedConfiguration(); + + + config.clearAllStages(); + int expectedMotorCount = 0; + int actualMotorCount = config.getActiveMotors().size(); + assertThat("active motor count doesn't match", actualMotorCount, equalTo(expectedMotorCount)); + + config.setOnlyStage(0); + expectedMotorCount = 1; + actualMotorCount = config.getActiveMotors().size(); + assertThat("active motor count doesn't match: ", actualMotorCount, equalTo(expectedMotorCount)); + + config.setOnlyStage(1); + expectedMotorCount = 1; + actualMotorCount = config.getActiveMotors().size(); + assertThat("active motor count doesn't match: ", actualMotorCount, equalTo(expectedMotorCount)); + + config.setAllStages(); + expectedMotorCount = 2; + actualMotorCount = config.getActiveMotors().size(); + assertThat("active motor count doesn't match: ", actualMotorCount, equalTo(expectedMotorCount)); + } + + @Test + public void testIterateComponents() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + FlightConfiguration selected = rocket.getSelectedConfiguration(); + + selected.clearAllStages(); + selected.toggleStage(2); + + // vvvv Test Target vvvv + InstanceMap instances = selected.getActiveInstances(); + // ^^^^ Test Target ^^^^ + + // Payload Stage + final AxialStage coreStage = (AxialStage)rocket.getChild(1); + { // Core Stage + final List<InstanceContext> coreStageContextList = instances.getInstanceContexts(coreStage); + final InstanceContext coreStageContext = coreStageContextList.get(0); + assertThat(coreStageContext.component.getClass(), equalTo(AxialStage.class)); + assertThat(coreStageContext.component.getID(), equalTo(rocket.getChild(1).getID())); + assertThat(coreStageContext.component.getInstanceCount(), equalTo(1)); + + final Coordinate coreLocation = coreStageContext.getLocation(); + assertEquals(coreLocation.x, 0.564, EPSILON); + assertEquals(coreLocation.y, 0.0, EPSILON); + assertEquals(coreLocation.z, 0.0, EPSILON); + + //... skip uninteresting component + } + + // Booster Stage + { // instance #1 + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + final List<InstanceContext> boosterStageContextList = instances.getInstanceContexts(boosterStage); + final InstanceContext boosterStage0Context = boosterStageContextList.get(0); + assertThat(boosterStage0Context.component.getClass(), equalTo(ParallelStage.class)); + assertThat(boosterStage0Context.component.getID(), equalTo(boosterStage.getID())); + assertThat(boosterStage0Context.instanceNumber, equalTo(0)); + { + final Coordinate loc = boosterStage0Context.getLocation(); + assertEquals(loc.x, 0.484, EPSILON); + assertEquals(loc.y, 0.077, EPSILON); + assertEquals(loc.z, 0.0, EPSILON); + } + + final InstanceContext boosterStage1Context = boosterStageContextList.get(1); + assertThat(boosterStage1Context.component.getClass(), equalTo(ParallelStage.class)); + assertThat(boosterStage1Context.component.getID(), equalTo(boosterStage.getID())); + assertThat(boosterStage1Context.instanceNumber, equalTo(1)); + { + final Coordinate loc = boosterStage1Context.getLocation(); + assertEquals(loc.x, 0.484, EPSILON); + assertEquals(loc.y, -0.077, EPSILON); + assertEquals(loc.z, 0.0, EPSILON); + } + + { // Booster Body: + final BodyTube boosterBody = (BodyTube)boosterStage.getChild(1); + final List<InstanceContext> boosterBodyContextList = instances.getInstanceContexts(boosterBody); + + // this is the instance number rocket-wide + final InstanceContext boosterBodyContext = boosterBodyContextList.get(1); + + // this is the instance number per-parent + assertThat(boosterBodyContext.instanceNumber, equalTo(0)); + + assertThat(boosterBodyContext.component.getClass(), equalTo(BodyTube.class)); + + final Coordinate bodyTubeLocation = boosterBodyContext.getLocation(); + assertEquals(bodyTubeLocation.x, 0.564, EPSILON); + assertEquals(bodyTubeLocation.y, -0.077, EPSILON); + assertEquals(bodyTubeLocation.z, 0.0, EPSILON); + + { // Booster::Motor Tubes ( x2 x4) + final InnerTube boosterMMT = (InnerTube)boosterBody.getChild(0); + final List<InstanceContext> mmtContextList = instances.getInstanceContexts(boosterMMT); + assertEquals(8, mmtContextList.size()); + + final InstanceContext motorTubeContext0 = mmtContextList.get(4); + assertThat(motorTubeContext0.component.getClass(), equalTo(InnerTube.class)); + assertThat(motorTubeContext0.instanceNumber, equalTo(0)); + final Coordinate motorTube0Location = motorTubeContext0.getLocation(); + assertEquals(motorTube0Location.x, 1.214, EPSILON); + assertEquals(motorTube0Location.y, -0.062, EPSILON); + assertEquals(motorTube0Location.z, -0.015, EPSILON); + + final InstanceContext motorTubeContext1 = mmtContextList.get(5); + assertThat(motorTubeContext1.component.getClass(), equalTo(InnerTube.class)); + assertThat(motorTubeContext1.instanceNumber, equalTo(1)); + final Coordinate motorTube1Location = motorTubeContext1.getLocation(); + assertEquals(motorTube1Location.x, 1.214, EPSILON); + assertEquals(motorTube1Location.y, -0.092, EPSILON); + assertEquals(motorTube1Location.z, -0.015, EPSILON); + + final InstanceContext motorTubeContext2 = mmtContextList.get(6); + assertThat(motorTubeContext2.component.getClass(), equalTo(InnerTube.class)); + assertThat(motorTubeContext2.instanceNumber, equalTo(2)); + final Coordinate motorTube2Location = motorTubeContext2.getLocation(); + assertEquals(motorTube2Location.x, 1.214, EPSILON); + assertEquals(motorTube2Location.y, -0.092, EPSILON); + assertEquals(motorTube2Location.z, 0.015, EPSILON); + + final InstanceContext motorTubeContext3 = mmtContextList.get(7); + assertThat(motorTubeContext3.component.getClass(), equalTo(InnerTube.class)); + assertThat(motorTubeContext3.instanceNumber, equalTo(3)); + final Coordinate motorTube3Location = motorTubeContext3.getLocation(); + assertEquals(motorTube3Location.x, 1.214, EPSILON); + assertEquals(motorTube3Location.y, -0.062, EPSILON); + assertEquals(motorTube3Location.z, 0.015, EPSILON); + + }{ // Booster::Fins::Instances ( x2 x3) + final FinSet fins = (FinSet)boosterBody.getChild(1); + final List<InstanceContext> finContextList = instances.getInstanceContexts(fins); + assertEquals(6, finContextList.size()); + + final InstanceContext boosterFinContext0 = finContextList.get(3); + assertThat(boosterFinContext0.component.getClass(), equalTo(TrapezoidFinSet.class)); + assertThat(boosterFinContext0.instanceNumber, equalTo(0)); + final Coordinate boosterFin0Location = boosterFinContext0.getLocation(); + assertEquals(boosterFin0Location.x, 1.044, EPSILON); + assertEquals(boosterFin0Location.y, -0.104223611, EPSILON); + assertEquals(boosterFin0Location.z, -0.027223611, EPSILON); + + final InstanceContext boosterFinContext1 = finContextList.get(4); + assertThat(boosterFinContext1.component.getClass(), equalTo(TrapezoidFinSet.class)); + assertThat(boosterFinContext1.instanceNumber, equalTo(1)); + final Coordinate boosterFin1Location = boosterFinContext1.getLocation(); + assertEquals(boosterFin1Location.x, 1.044, EPSILON); + assertEquals(boosterFin1Location.y, -0.03981186, EPSILON); + assertEquals(boosterFin1Location.z, -0.00996453, EPSILON); + + final InstanceContext boosterFinContext2 = finContextList.get(5); + assertThat(boosterFinContext2.component.getClass(), equalTo(TrapezoidFinSet.class)); + assertThat(boosterFinContext2.instanceNumber, equalTo(2)); + final Coordinate boosterFin2Location = boosterFinContext2.getLocation(); + assertEquals(boosterFin2Location.x, 1.044, EPSILON); + assertEquals(boosterFin2Location.y, -0.08696453, EPSILON); + assertEquals(boosterFin2Location.z, 0.03718814, EPSILON); + + } + + } + + } + } + +} + + diff --git a/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java new file mode 100644 index 0000000000..38499750c5 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/FreeformFinSetTest.java @@ -0,0 +1,1419 @@ +package net.sf.openrocket.rocketcomponent; + +import java.awt.geom.Point2D; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.*; + +import net.sf.openrocket.aerodynamics.AerodynamicForces; +import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.aerodynamics.WarningSet; +import net.sf.openrocket.aerodynamics.barrowman.FinSetCalc; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.material.Material.Type; +import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.rocketcomponent.FinSet.CrossSection; + +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.Transition.Shape; +import net.sf.openrocket.util.Color; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.LineStyle; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class FreeformFinSetTest extends BaseTestCase { + + private static final double EPSILON = 1E-6; + + private FreeformFinSet testFreeformConvert(FinSet sourceSet) { + sourceSet.setName("test-convert-finset"); + sourceSet.setBaseRotation(1.1); + sourceSet.setCantAngle(0.001); + sourceSet.setCGOverridden(true); + sourceSet.setColor(Color.BLACK); + sourceSet.setComment("cmt"); + sourceSet.setCrossSection(CrossSection.ROUNDED); + sourceSet.setFinCount(5); + + if( EllipticalFinSet.class.isAssignableFrom(sourceSet.getClass())){ + ((EllipticalFinSet)sourceSet).setLength(0.1); + }else if( TrapezoidFinSet.class.isAssignableFrom(sourceSet.getClass())){ + ((TrapezoidFinSet)sourceSet).setRootChord(0.1); + } + + sourceSet.setFinish(Finish.ROUGH); + sourceSet.setLineStyle(LineStyle.DASHDOT); + sourceSet.setMassOverridden(true); + sourceSet.setMaterial(Material.newMaterial(Type.BULK, "test-material", 0.1, true)); + sourceSet.setOverrideCGX(0.012); + sourceSet.setOverrideMass(0.0123); + sourceSet.setOverrideSubcomponents(true); + sourceSet.setAxialOffset(0.1); + sourceSet.setAxialMethod(AxialMethod.ABSOLUTE); + sourceSet.setTabHeight(0.01); + sourceSet.setTabLength(0.02); + sourceSet.setTabOffsetMethod(AxialMethod.BOTTOM); + sourceSet.setTabOffset(-0.015); + sourceSet.setThickness(0.005); + + return FreeformFinSet.convertFinSet( sourceSet); + } + + private Rocket createTemplateRocket(){ + Rocket rocket = new Rocket(); + AxialStage stage = new AxialStage(); + rocket.addChild(stage); + + NoseCone nose = new NoseCone(); + nose.setForeRadius(0.0); + nose.setLength(1.0); + nose.setAftRadius(1.0); + nose.setType( Shape.ELLIPSOID ); + nose.setShapeParameter(0.5); + nose.setName("Nose Fairing"); + stage.addChild(nose); + + BodyTube body = new BodyTube(2.0,1.0,0.01); + body.setName("Body Tube"); + stage.addChild(body); + + Transition tail = new Transition(); + tail.setType(Shape.CONICAL); + tail.setForeRadius(1.0); + tail.setLength(1.0); + tail.setAftRadius(0.5); + // slope = .5/1.0 = 0.5 + tail.setName("Tail Cone"); + stage.addChild(tail); + + // zero-length body tube -- triggers a whole other class of errors + final BodyTube phantom = new BodyTube(0., 0.5, 0.01); + phantom.setName("Phantom Body Tube"); + body.setOuterRadiusAutomatic(true); + stage.addChild(phantom); + + rocket.enableEvents(); + return rocket; + } + + private FreeformFinSet createFinOnEllipsoidNose(NoseCone nose){ + FreeformFinSet fins = new FreeformFinSet(); + fins.setName("test-freeform-finset"); + fins.setFinCount(1); + fins.setAxialOffset( AxialMethod.TOP, 0.02); + final Coordinate[] points = { + new Coordinate( 0.0, 0.0), + new Coordinate( 0.4, 1.0), + new Coordinate( 0.6, 1.0), + new Coordinate( 0.8, 0.788) // y-value should be automatically adjusted to snap to body + }; + fins.setPoints(points); + nose.addChild(fins); + + return fins; + } + + private FreeformFinSet createFinOnTube(final BodyTube body){ + // This is a trapezoid: + // - Height: 1 + // - Root Chord: 1 + // - Tip Chord: 1/2 + // - Sweep: 1/2 + // It can be decomposed into a triangle followed by a rectangle + // +--+ + // /. | + // / . | + // +=====+ + FreeformFinSet fins = new FreeformFinSet(); + fins.setName("TubeBodyFins"); + fins.setFinCount(1); + fins.setPoints(new Coordinate[]{ + new Coordinate(0, 0), + new Coordinate(0.5, 1), + new Coordinate(1, 1), + new Coordinate(1, 0) + }); + fins.setAxialOffset( AxialMethod.BOTTOM, 0.0); + + body.addChild(fins); + + return fins; + } + + private FreeformFinSet createFinOnConicalTransition(final Transition body) { + // ----+ (1) + // (0) ----- | + // ---+ | + // ----- | + // ----+ (2) + FreeformFinSet fins = new FreeformFinSet(); + fins.setName("test-freeform-finset"); + fins.setFinCount(1); + fins.setThickness(0.005); + fins.setAxialOffset( AxialMethod.TOP, 0.4); + Coordinate[] initPoints = new Coordinate[] { + new Coordinate( 0.0, 0.0), + new Coordinate( 0.4, 0.2), + new Coordinate( 0.4,-0.2) + }; + fins.setPoints(initPoints); + + body.addChild(fins); + + return fins; + } + + // ==================== Test Methods ==================== + @Test + public void testConvertEllipticalToFreeform() { + final FreeformFinSet finSet = testFreeformConvert(new EllipticalFinSet()); + + assertEquals( finSet.getName(), "test-convert-finset"); + + assertEquals(1.1, finSet.getBaseRotation(), EPSILON); + assertEquals(0.001, finSet.getCantAngle(), EPSILON); + assertTrue(finSet.isCGOverridden()); + assertTrue(finSet.isMassOverridden()); + assertEquals(Color.BLACK, finSet.getColor()); + assertEquals("cmt", finSet.getComment()); + assertEquals(CrossSection.ROUNDED, finSet.getCrossSection()); + assertEquals(5, finSet.getFinCount()); + assertEquals(Finish.ROUGH, finSet.getFinish()); + assertEquals(LineStyle.DASHDOT, finSet.getLineStyle()); + { + final Material mat = finSet.getMaterial(); + assertEquals(Type.BULK, mat.getType()); + assertEquals("test-material", mat.getName()); + assertEquals(0.1, mat.getDensity(), EPSILON); + assertTrue(mat.isUserDefined()); + } + assertEquals(0.012, finSet.getOverrideCGX(), EPSILON); + assertEquals(0.0123, finSet.getOverrideMass(), EPSILON); + assertTrue(finSet.getOverrideSubcomponents()); + + assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod()); + assertEquals(0.1, finSet.getAxialOffset(), EPSILON); + assertEquals(0.01, finSet.getTabHeight(), EPSILON); + assertEquals( 0.02, finSet.getTabLength(), EPSILON); + assertEquals( AxialMethod.BOTTOM, finSet.getTabOffsetMethod()); + assertEquals( -0.015, finSet.getTabOffset(), EPSILON); + assertEquals( 0.005, finSet.getThickness(), EPSILON); + } + + @Test + public void testConvertTrapezoidToFreeform() { + final FreeformFinSet finSet = testFreeformConvert(new TrapezoidFinSet()); + + assertEquals( finSet.getName(), "test-convert-finset"); + + assertEquals(1.1, finSet.getBaseRotation(), EPSILON); + assertEquals(0.001, finSet.getCantAngle(), EPSILON); + assertTrue(finSet.isCGOverridden()); + assertTrue(finSet.isMassOverridden()); + assertEquals(Color.BLACK, finSet.getColor()); + assertEquals("cmt", finSet.getComment()); + assertEquals(CrossSection.ROUNDED, finSet.getCrossSection()); + assertEquals(5, finSet.getFinCount()); + assertEquals(Finish.ROUGH, finSet.getFinish()); + assertEquals(LineStyle.DASHDOT, finSet.getLineStyle()); + { + final Material mat = finSet.getMaterial(); + assertEquals(Type.BULK, mat.getType()); + assertEquals("test-material", mat.getName()); + assertEquals(0.1, mat.getDensity(), EPSILON); + assertTrue(mat.isUserDefined()); + } + assertEquals(0.012, finSet.getOverrideCGX(), EPSILON); + assertEquals(0.0123, finSet.getOverrideMass(), EPSILON); + assertTrue(finSet.getOverrideSubcomponents()); + + assertEquals(AxialMethod.ABSOLUTE, finSet.getAxialMethod()); + assertEquals(0.1, finSet.getAxialOffset(), EPSILON); + assertEquals(0.01, finSet.getTabHeight(), EPSILON); + assertEquals( 0.02, finSet.getTabLength(), EPSILON); + assertEquals( AxialMethod.BOTTOM, finSet.getTabOffsetMethod()); + assertEquals( -0.015, finSet.getTabOffset(), EPSILON); + assertEquals( 0.005, finSet.getThickness(), EPSILON); + + } + + @Test + public void testFreeformCMComputation_trapezoidOnTube() { + final Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube)rkt.getChild(0).getChild(1); + final FreeformFinSet fins = createFinOnTube(body); + + // assert pre-condition: + final Coordinate[] finPoints = fins.getFinPoints(); + assertEquals(4, finPoints.length); + assertEquals(finPoints[0], Coordinate.ZERO); + assertEquals(finPoints[1], new Coordinate(0.5, 1.0)); + assertEquals(finPoints[2], new Coordinate(1.0, 1.0)); + assertEquals(finPoints[3], new Coordinate(1.0, 0.0)); + + final double x0 = fins.getAxialFront(); + assertEquals(1.0, x0, EPSILON); + assertEquals(1.0, body.getRadius(x0), EPSILON); + + // NOTE: this will be relative to the center of the finset -- which is at the center of it's mounted body + final Coordinate coords = fins.getCG(); + assertEquals(0.75, fins.getPlanformArea(), EPSILON); + assertEquals(0.611111, coords.x, EPSILON); + assertEquals(1.444444, coords.y, EPSILON); + } + + @Test + public void testFreeformCMComputation_triangleOnTransition(){ + Rocket rkt = createTemplateRocket(); + final Transition finMount = (Transition)rkt.getChild(0).getChild(2); + final FreeformFinSet fins = createFinOnConicalTransition(finMount); + + // assert pre-condition: + final Coordinate[] finPoints = fins.getFinPoints(); + assertEquals(3, finPoints.length); + assertEquals(finPoints[0], Coordinate.ZERO); + assertEquals(finPoints[1], new Coordinate(0.4, 0.2)); + assertEquals(finPoints[2], new Coordinate(0.4, -0.2)); + + final double x0 = fins.getAxialFront(); + assertEquals(0.4, x0, EPSILON); + assertEquals(0.8, finMount.getRadius(x0), EPSILON); + + // vv Test target vv + final Coordinate coords = fins.getCG(); + // ^^ Test target ^^ + + // in fin-mount frame coordinates + final double expectedWettedArea = 0.08; + assertEquals(expectedWettedArea, fins.getPlanformArea(), EPSILON); + assertEquals(0.266666, coords.x, EPSILON); + assertEquals(0.8, coords.y, EPSILON); + + { // now, add a tab + fins.setTabOffsetMethod(AxialMethod.TOP); + fins.setTabOffset(0.1); + fins.setTabHeight(0.2); + fins.setTabLength(0.2); + + // fin is a simple trapezoid against a linearly changing body... + // height is set s.t. the tab trailing edge height == 0 + final double expectedTabArea = (fins.getTabHeight())*3/4 * fins.getTabLength(); + final double expectedTotalVolume = (expectedWettedArea + expectedTabArea)*fins.getThickness(); + assertEquals("Calculated fin volume is wrong: ", expectedTotalVolume, fins.getComponentVolume(), EPSILON); + + Coordinate tcg = fins.getCG(); // relative to parent. also includes fin tab CG. + assertEquals("Calculated fin centroid is wrong! ", 0.245454, tcg.x, EPSILON); + assertEquals("Calculated fin centroid is wrong! ", 0.75303, tcg.y, EPSILON); + } + } + + + @Test + public void testFreeformCMComputation_triangleOnEllipsoid(){ + final Rocket rkt = createTemplateRocket(); + final NoseCone nose = (NoseCone) rkt.getChild(0).getChild(0); + final FinSet fins = createFinOnEllipsoidNose(nose); + + { // assert preconditions::Mount + assertEquals(Shape.ELLIPSOID, nose.getType()); + assertEquals(1.0, nose.getLength(), EPSILON); + + }{ // Assert fin shape + // [1] [2] + // +======+ + // / \ [3] + // / ---+---- + // / -------- + // [0] / -------- + // ---+---- + // + // [0] ( 0.0, 0.0) + // [1] ( 0.4, 1.0) + // [2] ( 0.6, 1.0) + // [3] ( 0.8, 0.7847) + + assertEquals(AxialMethod.TOP, fins.getAxialMethod()); + assertEquals(0.02, fins.getAxialOffset(), EPSILON); + assertEquals(0.8, fins.getLength(), EPSILON); + + final Coordinate[] finPoints = fins.getFinPoints(); + assertEquals(4, finPoints.length); + assertEquals(Coordinate.ZERO, finPoints[0]); + assertEquals(new Coordinate(0.4, 1.0), finPoints[1]); + assertEquals(new Coordinate(0.6, 1.0), finPoints[2]); + assertEquals(new Coordinate(0.8, 0.78466912), finPoints[3]); + } + + final double expectedPlanformArea = 0.13397384; + final double actualPlanformArea = fins.getPlanformArea(); + assertEquals("Calculated fin planform area is wrong: ", expectedPlanformArea, actualPlanformArea, EPSILON); + + Coordinate wcg = fins.getCG(); // relative to parent + assertEquals("Calculated fin weight is wrong! ", 0.2733066, wcg.weight, EPSILON); + assertEquals("Calculated fin centroid is wrong! ", 0.4793588, wcg.x, EPSILON); + assertEquals("Calculated fin centroid is wrong! ", 0.996741, wcg.y, EPSILON); + } + + + @Test + public void testFreeformCMComputationTrapezoidExtraPoints() { + final Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + final FreeformFinSet fins = createFinOnTube(body); + + // This is the same trapezoid as previous free form, but it has + // some extra points along the lines. + Coordinate[] points = new Coordinate[]{ + new Coordinate(0.0, 0.0), // original + new Coordinate(0.5, 1.0), // original + new Coordinate(0.6, 1.0), + new Coordinate(0.8, 1.0), + new Coordinate(1.0, 1.0), // original + new Coordinate(1.0, 0.6), + new Coordinate(1.0, 0.0) // original + }; + fins.setPoints(points); + + Coordinate coords = fins.getCG(); + assertEquals(0.75, fins.getPlanformArea(), EPSILON); + assertEquals(0.611111, coords.x, EPSILON); + assertEquals(1.444444, coords.y, EPSILON); + } + + @Test + public void testFreeformCMComputationAdjacentPoints() { + Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + final FreeformFinSet fins = createFinOnTube(body); + + // This is the same trapezoid as previous free form, but it has + // some extra points which are very close to previous points. + // in particular for points 0 & 1, + // y0 + y1 is very small. + final double PERMUTATION = 1e-15; + Coordinate[] points = new Coordinate[] { + new Coordinate(0.0, 0.0), // original + new Coordinate(0, PERMUTATION), + new Coordinate(0.5, 1.0), // original + new Coordinate(0.5 + PERMUTATION, 1.0), + new Coordinate(1.0, 1.0), // original + new Coordinate(1.0, PERMUTATION), + new Coordinate(1.0, 0.0) // original + }; + fins.setPoints(points); + + Coordinate coords = fins.getCG(); + assertEquals(0.75, fins.getPlanformArea(), EPSILON); + assertEquals(0.611111, coords.x, EPSILON); + assertEquals(1.444444, coords.y, EPSILON); + } + + @Test + public void testFreeformFinAddPoint() { + Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + final FreeformFinSet fin = createFinOnTube(body); + + assertEquals(4, fin.getPointCount()); + + // +--+ + // / |x + // / | + // +=====+ + Point2D.Double toAdd = new Point2D.Double(1.01, 0.8); + fin.addPoint(3, toAdd); + + assertEquals(5, fin.getPointCount()); + final Coordinate added = fin.getFinPoints()[3]; + assertEquals(1.1,added.x, 0.1); + assertEquals(0.8, added.y, 0.1); + } + + @Test + public void testSetFirstPoint() { + // more transitions trigger more complicated positioning math: + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = createFinOnConicalTransition(tailCone); + final Coordinate[] initialPoints = fins.getFinPoints(); + + // assert pre-conditions: + assertEquals(0.4, fins.getLength(), EPSILON); + assertEquals(initialPoints[0], Coordinate.ZERO); + assertEquals(initialPoints[1], new Coordinate(0.4, 0.2)); + assertEquals(initialPoints[2], new Coordinate(0.4, -0.2)); + assertEquals(1.0, tailCone.getLength(), EPSILON); + assertEquals(0.8, tailCone.getRadius(fins.getAxialFront()), EPSILON); + + { // case 1: + fins.setAxialOffset( AxialMethod.TOP, 0.1); + fins.setPoints(initialPoints); + assertEquals(0.1f, fins.getAxialOffset(), EPSILON); + + // vvvv function under test vvvv + fins.setPoint( 0, 0.2, 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.3f, fins.getAxialOffset(), EPSILON); + assertEquals(0.2f, fins.getLength(), EPSILON); + + assertEquals(0.3, fins.getFinFront().x, EPSILON); + assertEquals(0.85, fins.getFinFront().y, EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // middle point: + assertEquals(0.2, postPoints[1].x, EPSILON); + assertEquals(0.3, postPoints[1].y, EPSILON); + + // final point + assertEquals(0.2, postPoints[2].x, EPSILON); + assertEquals(-0.1, postPoints[2].y, EPSILON); + + }{ // case 2: + fins.setAxialOffset( AxialMethod.TOP, 0.1); + fins.setPoints(initialPoints); + + // vvvv function under test vvvv + fins.setPoint( 0, -0.2, 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(-0.1, fins.getFinFront().x, EPSILON); + assertEquals(1.0, fins.getFinFront().y, EPSILON); + + assertEquals(-0.1f, fins.getAxialOffset(), EPSILON); + assertEquals(0.6f, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + assertEquals(0.6, postPoints[1].x, EPSILON); + assertEquals(0.15, postPoints[1].y, EPSILON); + + assertEquals(0.6, postPoints[2].x, EPSILON); + assertEquals(-0.25, postPoints[2].y, EPSILON); + + }{ // case 3: + fins.setAxialOffset( AxialMethod.MIDDLE, 0.0); + fins.setPoints(initialPoints); + assertEquals(0.3, fins.getFinFront().x, EPSILON); + + // vvvv function under test vvvv + fins.setPoint( 0, 0.1, 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.05, fins.getAxialOffset(), EPSILON); + assertEquals(0.3, fins.getLength(), EPSILON); + + assertEquals(0.35, fins.getFinFront().x, EPSILON); + assertEquals(0.825, fins.getFinFront().y, EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid-point + assertEquals(0.3, postPoints[1].x, EPSILON); + assertEquals(0.25, postPoints[1].y, EPSILON); + + assertEquals(0.3, postPoints[2].x, EPSILON); + assertEquals(-0.15, postPoints[2].y, EPSILON); + + }{ // case 4: + fins.setAxialOffset( AxialMethod.MIDDLE, 0.0); + fins.setPoints(initialPoints); + + // vvvv function under test vvvv + fins.setPoint( 0, -0.1, 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.25, fins.getFinFront().x, EPSILON); + assertEquals(0.875, fins.getFinFront().y, EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid point + assertEquals(0.5, postPoints[1].x, EPSILON); + //assertEquals(0.15, postPoints[1].y, EPSILON); + + assertEquals(0.5, postPoints[2].x, EPSILON); + //assertEquals(0.15, postPoints[2].y, EPSILON); + + assertEquals(-0.05f, fins.getAxialOffset(), EPSILON); + assertEquals(0.5f, fins.getLength(), EPSILON); + }{ // case 5: + fins.setAxialOffset( AxialMethod.BOTTOM, 0.0); + fins.setPoints(initialPoints); + assertEquals(0.6, fins.getFinFront().x, EPSILON); + + // vvvv function under test vvvv + fins.setPoint( 0, 0.1, 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.7, fins.getFinFront().x, EPSILON); + assertEquals(0.65, fins.getFinFront().y, EPSILON); + assertEquals(0.0, fins.getAxialOffset(), EPSILON); + assertEquals(0.3, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid-point + assertEquals(0.3, postPoints[1].x, EPSILON); + //assertEquals(0.05, postPoints[1].y, EPSILON); + + assertEquals(0.3, postPoints[2].x, EPSILON); + //assertEquals(0.15, postPoints[2].y, EPSILON); + + }{ // case 6: + fins.setAxialOffset( AxialMethod.BOTTOM, 0.0); + fins.setPoints(initialPoints); + assertEquals(0.6, fins.getFinFront().x, EPSILON); + + // vvvv function under test vvvv + fins.setPoint( 0, -0.1, 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.5, fins.getFinFront().x, EPSILON); + assertEquals(0.75, fins.getFinFront().y, EPSILON); + assertEquals(0.5, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(3, postPoints.length); + + assertEquals(0.5, postPoints[1].x, EPSILON); + assertEquals(0.15, postPoints[1].y, EPSILON); + + assertEquals(0.5, postPoints[2].x, EPSILON); + assertEquals(-0.25, postPoints[2].y, EPSILON); + } + } + + @Test + public void testSetLastPoint() { + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = createFinOnConicalTransition(tailCone); + final Coordinate[] initialPoints = fins.getFinPoints(); + final int lastIndex = initialPoints.length - 1; + final double xf = initialPoints[lastIndex].x; + final double yf = initialPoints[lastIndex].y; + + // assert pre-conditions: + assertEquals(0.4, fins.getLength(), EPSILON); + assertEquals(initialPoints[0], Coordinate.ZERO); + assertEquals(initialPoints[1], new Coordinate(0.4, 0.2)); + assertEquals(initialPoints[2], new Coordinate(0.4, -0.2)); + assertEquals(1.0, tailCone.getLength(), EPSILON); + assertEquals(0.8, tailCone.getRadius(fins.getAxialFront()), EPSILON); + + { // case 1: + fins.setAxialOffset( AxialMethod.TOP, 0.1); + fins.setPoints(initialPoints); + + // vvvv function under test vvvv + fins.setPoint( lastIndex, xf+0.2, yf - 0.3f); + // ^^^^ function under test ^^^^ + + assertEquals(0.1, fins.getFinFront().x, EPSILON); + assertEquals(0.95, fins.getFinFront().y, EPSILON); + assertEquals(0.6, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // middle point: + assertEquals(0.4, postPoints[1].x, EPSILON); + assertEquals(0.2, postPoints[1].y, EPSILON); + + // last point: + assertEquals(0.6, postPoints[2].x, EPSILON); + assertEquals(-0.3, postPoints[2].y, EPSILON); + + + }{ // case 2: + fins.setAxialOffset( AxialMethod.TOP, 0.1); + fins.setPoints(initialPoints); + + // vvvv function under test vvvv + fins.setPoint( lastIndex, xf - 0.2, yf + 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.1, fins.getFinFront().x, EPSILON); + assertEquals(0.95, fins.getFinFront().y, EPSILON); + assertEquals(0.2, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // middle point: + assertEquals(0.4, postPoints[1].x, EPSILON); + assertEquals(0.2, postPoints[1].y, EPSILON); + + // last point: + assertEquals(0.2, postPoints[2].x, EPSILON); + assertEquals(-0.1, postPoints[2].y, EPSILON); + + }{ // case 3: + fins.setAxialOffset( AxialMethod.MIDDLE, 0.0); + fins.setPoints(initialPoints); + assertEquals(0.3, fins.getFinFront().x, EPSILON); + + // vvvv function under test vvvv + fins.setPoint( lastIndex, xf + 0.1, yf + 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.3, fins.getFinFront().x, EPSILON); + assertEquals(0.85, fins.getFinFront().y, EPSILON); + assertEquals(0.5, fins.getLength(), EPSILON); + assertEquals(0.05, fins.getAxialOffset(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid-point + assertEquals(0.4, postPoints[1].x, EPSILON); + assertEquals(0.2, postPoints[1].y, EPSILON); + + // last point + assertEquals(0.5, postPoints[2].x, EPSILON); + assertEquals(-0.25, postPoints[2].y, EPSILON); + + }{ // case 4: + fins.setAxialOffset( AxialMethod.MIDDLE, 0.0); + fins.setPoints(initialPoints); + assertEquals(0.3, fins.getFinFront().x, EPSILON); + + // vvvv function under test vvvv + fins.setPoint( lastIndex, xf - 0.1, yf + 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.3, fins.getFinFront().x, EPSILON); + assertEquals(0.85, fins.getFinFront().y, EPSILON); + assertEquals(0.3, fins.getLength(), EPSILON); + assertEquals(-0.05, fins.getAxialOffset(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid point + assertEquals(0.4, postPoints[1].x, EPSILON); + assertEquals(0.2, postPoints[1].y, EPSILON); + + // last point + assertEquals(0.3, postPoints[2].x, EPSILON); + assertEquals(-0.15, postPoints[2].y, EPSILON); + + }{ // case 5: + fins.setAxialOffset( AxialMethod.BOTTOM, 0.0); + fins.setPoints(initialPoints); + + // vvvv function under test vvvv + fins.setPoint( lastIndex, xf + 0.1, yf + 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.6, fins.getFinFront().x, EPSILON); + assertEquals(0.7, fins.getFinFront().y, EPSILON); + assertEquals(0.1, fins.getAxialOffset(), EPSILON); + assertEquals(0.5f, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid-point + assertEquals(0.4, postPoints[1].x, EPSILON); + assertEquals(0.2, postPoints[1].y, EPSILON); + + // pseudo last point + assertEquals(0.5, postPoints[2].x, EPSILON); + assertEquals(-0.2, postPoints[2].y, EPSILON); + + }{ // case 6: + fins.setAxialOffset( AxialMethod.BOTTOM, 0.0); + fins.setPoints(initialPoints); + + // vvvv function under test vvvv + fins.setPoint( lastIndex, xf - 0.1, yf + 0.1f); + // ^^^^ function under test ^^^^ + + assertEquals(0.6, fins.getFinFront().x, EPSILON); + assertEquals(0.7, fins.getFinFront().y, EPSILON); + assertEquals(-0.1, fins.getAxialOffset(), EPSILON); + assertEquals(0.3, fins.getLength(), EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // mid-point + assertEquals(0.4, postPoints[1].x, EPSILON); + assertEquals(0.2, postPoints[1].y, EPSILON); + + // last point + assertEquals(0.3, postPoints[2].x, EPSILON); + assertEquals(-0.15, postPoints[2].y, EPSILON); + + } + } + + @Test + public void testSetInteriorPoint() { + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + { // preconditions // initial points + final Coordinate[] initialPoints = fins.getFinPoints(); + assertEquals(initialPoints[0], Coordinate.ZERO); + assertEquals(initialPoints[1], new Coordinate(0.4, 0.2)); + assertEquals(initialPoints[2], new Coordinate(0.4, -0.2)); + assertEquals(0.4, fins.getLength(), EPSILON); + }{ // preconditions // mount + Transition finMount = (Transition) rkt.getChild(0).getChild(2); + assertEquals(0.4, fins.getFinFront().x, EPSILON); + assertEquals(0.8, fins.getFinFront().y, EPSILON); + assertEquals(0.8, finMount.getRadius(fins.getAxialFront()), EPSILON); + + assertEquals(AxialMethod.TOP, fins.getAxialMethod()); + assertEquals(0.4, fins.getAxialOffset(), EPSILON); + + }{ // test target + final Coordinate p1 = fins.getFinPoints()[1]; + + // vvvv function under test vvvv + fins.setPoint( 1, p1.x + 0.1, p1.y + 0.1f); + // ^^^^ function under test ^^^^ + + }{ // postconditions + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(postPoints.length, 3); + + // middle point: + assertEquals(0.5, postPoints[1].x, EPSILON); + assertEquals(0.3, postPoints[1].y, EPSILON); + + // last point: + assertEquals(0.4, postPoints[2].x, EPSILON); + assertEquals(-0.2, postPoints[2].y, EPSILON); + + assertEquals(0.4, fins.getLength(), EPSILON); + assertEquals(0.4, fins.getFinFront().x, EPSILON); + assertEquals(0.8, fins.getFinFront().y, EPSILON); + } + } + + @Test + public void testSetAllPointsOnPhantomBody() { + final Rocket rkt = createTemplateRocket(); + final BodyTube phantomBody = (BodyTube) rkt.getChild(0).getChild(3); + + { // setup // mount + assertEquals(0.5, phantomBody.getOuterRadius(), EPSILON); + assertEquals(0.0, phantomBody.getLength(), EPSILON); + }{ + // (1)---------(2) + // | Fin | + // | | + // (0)----+----(3) + // | + // (body) + final FreeformFinSet fins = new FreeformFinSet(); + fins.setName("SquareFin"); + phantomBody.addChild(fins); + fins.setAxialOffset(AxialMethod.MIDDLE, 0.0); + fins.setPoints(new Coordinate[]{ + new Coordinate(-0.5, 0.0), + new Coordinate(-0.5, 1.0), + new Coordinate(0.5, 1.0), + new Coordinate(0.5, 0.0) + }); + + }{ // postconditions + FreeformFinSet fins = (FreeformFinSet) rkt.getChild(0).getChild(3).getChild(0); + + assertEquals(AxialMethod.MIDDLE, fins.getAxialMethod()); + assertEquals(0.0, fins.getAxialOffset(), EPSILON); + + assertEquals(-0.5, fins.getFinFront().x, EPSILON); + assertEquals(0.5, fins.getFinFront().y, EPSILON); + + final Coordinate[] postPoints = fins.getFinPoints(); + assertEquals(4, postPoints.length); + + // p0 + assertEquals("p0::x", 0.0, postPoints[0].x, EPSILON); + assertEquals("p0::y", 0.0, postPoints[0].y, EPSILON); + + // p1 + assertEquals("p1::x", 0.0, postPoints[1].x, EPSILON); + assertEquals("p1::y", 1.0, postPoints[1].y, EPSILON); + + // p2 + assertEquals("p2::x", 1.0, postPoints[2].x, EPSILON); + assertEquals("p2::y", 1.0, postPoints[2].y, EPSILON); + + // p3 / last + assertEquals("p3::x", 1.0, postPoints[3].x, EPSILON); + assertEquals("p3::y", 0.0, postPoints[3].y, EPSILON); + + assertEquals(1.0, fins.getLength(), EPSILON); + } + } + + @Test + public void testSetFirstPoint_clampToLast() { + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + assertEquals( 1, fins.getFinCount()); + assertEquals( 3, fins.getPointCount()); + assertEquals( AxialMethod.TOP, fins.getAxialMethod()); + assertEquals( 0.4, fins.getAxialOffset(), EPSILON); // pre-condition + assertEquals( 1.0, tailCone.getLength(), EPSILON); + + // fin offset: 0.4 -> 0.59 (just short of prev fin end) + // fin end: 0.4 ~> min root chord + // vv Test Target vv + fins.setPoint( 0, 0.6, 0); + // ^^ Test Target ^^ + + assertEquals(fins.getFinPoints()[ 0], Coordinate.ZERO); + + // setting the first point actually offsets the whole fin by that amount: + final double expFinOffset = 0.8; + assertEquals("Resultant fin offset does not match!", expFinOffset, fins.getAxialOffset(), EPSILON); + + assertEquals( 3, fins.getPointCount()); + Coordinate actualLastPoint = fins.getFinPoints()[2]; + assertEquals(0, actualLastPoint.x, EPSILON); + assertEquals(0, actualLastPoint.y, EPSILON); + assertEquals("New fin length is wrong: ", 0.0, fins.getLength(), EPSILON); + } + + @Test + public void testSetPoint_otherPoint(){ + // combine the simple case with the complicated to ensure that the simple case is flagged, tested, and debugged before running the more complicated case... + { // setting points on a Tube Body is the simpler case. Test this first: + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = createFinOnConicalTransition(tailCone); + + // all points are restricted to be outside the parent body: + Coordinate exp_pt = fins.getFinPoints()[0]; + fins.setPoint(0, -0.6, 0); + Coordinate act_pt = fins.getFinPoints()[0]; + assertEquals( exp_pt.x, act_pt.x, EPSILON); + // the last point is already clamped to the body; It should remain so. + assertEquals( 0.0, act_pt.y, EPSILON); + } + { // more transitions trigger more complicated positioning math: + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + Coordinate act_p_l; + Coordinate exp_p_l; + + final int testIndex = 1; + // move point, and verify that it is coerced to be outside the parent body: + exp_p_l = new Coordinate( 0.2, -0.1, 0.0); + fins.setPoint( testIndex, 0.2, -0.2); // incorrect y-val. The function should correct the y-value to above. + + act_p_l = fins.getFinPoints()[ testIndex ]; + assertEquals( exp_p_l.x, act_p_l.x, EPSILON); + assertEquals( exp_p_l.y, act_p_l.y, EPSILON); + } + } + + + @Test + public void testSetOffset_triggerLeadingClampCorrection() { + // test correction of last point due to moving entire fin: + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + final int lastIndex = fins.getPointCount()-1; + + { // pre-condition + assertEquals(AxialMethod.TOP, fins.getAxialMethod()); + assertEquals(0.4, fins.getAxialOffset(), EPSILON); + assertEquals(0.4, fins.getLength(), EPSILON); + } + + // vv Test Target vv + fins.setAxialOffset( -0.2); + // ^^ Test Target ^^ + + // fin start: 0.4 => 0.8 [body] + // fin end: 0.8 => 1.2 [body] + assertEquals( -0.2, fins.getAxialOffset(), EPSILON); + assertEquals( 0.4, fins.getLength(), EPSILON); + + // SHOULD DEFINITELY CHANGE + Coordinate actualLastPoint = fins.getFinPoints()[ lastIndex]; + assertEquals( 0.4, actualLastPoint.x, EPSILON); + assertEquals( -0.1, actualLastPoint.y, EPSILON); + } + + @Test + public void testSetOffset_triggerTrailingClampCorrection() { + // test correction of last point due to moving entire fin: + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + final int lastIndex = fins.getPointCount()-1; + + { // pre-condition + assertEquals(AxialMethod.TOP, fins.getAxialMethod()); + assertEquals(0.4, fins.getAxialOffset(), EPSILON); + assertEquals(0.4, fins.getLength(), EPSILON); + } + + // vv Test Target vv + fins.setAxialOffset( 0.8); + // ^^ Test Target ^^ + + // fin start: 0.4 => 0.8 [body] + // fin end: 0.8 => 1.2 [body] + assertEquals( 0.8, fins.getAxialOffset(), EPSILON); + assertEquals( 0.4, fins.getLength(), EPSILON); + + // SHOULD DEFINITELY CHANGE + Coordinate actualLastPoint = fins.getFinPoints()[ lastIndex]; + assertEquals( 0.4, actualLastPoint.x, EPSILON); + assertEquals( -0.1, actualLastPoint.y, EPSILON); + } + + @Test + public void testComputeCM_mountlessFin(){ + // This is a trapezoid. Height 1, root 1, tip 1/2 no sweep. + // It can be decomposed into a rectangle followed by a triangle + // +---+ + // | \ + // | \ + // +------+ + FreeformFinSet fins = new FreeformFinSet(); + fins.setFinCount(1); + Coordinate[] points = new Coordinate[] { + new Coordinate(0, 0), + new Coordinate(0, 1), + new Coordinate(.5, 1), + new Coordinate(1, 0) + }; + fins.setPoints(points); + Coordinate coords = fins.getCG(); + assertEquals(0.75, fins.getPlanformArea(), EPSILON); + + assertEquals(0.388889, coords.x, EPSILON); + assertEquals(0.444444, coords.y, EPSILON); + } + + @Test + public void testTranslatePoints(){ + final Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + final FreeformFinSet fin = this.createFinOnTube(body); + + assertNotNull(fin.getParent()); + + // Fin length = 1 + // Body Length = 2 + // +--+ + // / | + // / | + // +---+-----+---+ + final Coordinate[] expectPoints = new Coordinate[]{ + Coordinate.ZERO, + new Coordinate(0.5, 1), + new Coordinate(1, 1), + new Coordinate(1, 0) + }; + + final Coordinate[] finPoints = fin.getFinPoints(); + assertEquals(4, finPoints.length); + assertEquals(expectPoints[1], finPoints[1]); + assertEquals(expectPoints[2], finPoints[2]); + assertEquals(expectPoints[3], finPoints[3]); + + // mounting body: + assertEquals(body.getLength(), 2.0, EPSILON); + + assertEquals(fin.getAxialMethod(), AxialMethod.BOTTOM); + assertEquals(fin.getAxialOffset(), 0.0, EPSILON); + + final AxialMethod[] pos={AxialMethod.TOP, AxialMethod.MIDDLE, AxialMethod.MIDDLE, AxialMethod.BOTTOM}; + final double[] offs = {1.0, 0.0, 0.4, -0.2}; + final double[] expOffs = {1.0, 0.5, 0.9, 0.8}; + for( int caseIndex=0; caseIndex < pos.length; ++caseIndex ){ + fin.setAxialOffset( pos[caseIndex], offs[caseIndex]); + + assertEquals(fin.getAxialMethod(), pos[caseIndex]); + assertEquals(fin.getAxialOffset(), offs[caseIndex], EPSILON); + + final double x_delta = fin.getAxialOffset(AxialMethod.TOP); + + final Coordinate[] actualPoints = fin.getFinPoints(); + + final String rawPointDescr = "\n"+fin.toDebugDetail().toString()+"\n>> axial offset: "+x_delta; + + Coordinate[] displayPoints = FinSet.translatePoints( actualPoints, x_delta, 0); + for( int index=0; index < displayPoints.length; ++index){ + assertEquals(String.format("Bad Fin Position.x (%6.2g via:%s at point: %d) %s\n",offs[caseIndex], pos[caseIndex].name(), index, rawPointDescr), + (expectPoints[index].x + expOffs[caseIndex]), displayPoints[index].x, EPSILON); + assertEquals(String.format("Bad Fin Position.y (%6.2g via:%s at point: %d) %s\n",offs[caseIndex], pos[caseIndex].name(), index, rawPointDescr), + expectPoints[index].y, displayPoints[index].y, EPSILON); + } + } + + } + + @Test + public void testForIntersection_false() { + final Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + final FreeformFinSet fins = createFinOnTube(body); + + // Fin length = 1 + // Body Length = 2 + // +--+ + // / | + // / | + // +---+-----+---+ + final Coordinate[] finPoints = fins.getFinPoints(); + assertEquals(4, finPoints.length); + assertEquals(finPoints[0], Coordinate.ZERO); + assertEquals(finPoints[1], new Coordinate(0.5, 1.0)); + assertEquals(finPoints[2], new Coordinate(1.0, 1.0)); + assertEquals(finPoints[3], new Coordinate(1.0, 0.0)); + + assertFalse( " Fin detects false positive intersection in fin points: ", fins.intersects()); + } + + @Test + public void testForIntersection_true() { + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + // An obviously intersecting fin: + // [2] +-----+ [1] + // \ / + // \ / + // X + // / \ + // [0] / \ [3] + // +---+-----+---+ + // = +x => + Coordinate[] initPoints = new Coordinate[] { + new Coordinate(0, 0), + new Coordinate(1, 1), + new Coordinate(0, 1), + new Coordinate(1, 0) + }; + // this line throws an exception? + fins.setPoints(initPoints); + + // this *already* has detected the intersection, and aborted... + Coordinate p1 = fins.getFinPoints()[1]; + // ... which makes a rather hard-to-test functionality... + assertThat( "Fin Set failed to detect an intersection! ", p1.x, not(equalTo(initPoints[1].x))); + assertThat( "Fin Set failed to detect an intersection! ", p1.y, not(equalTo(initPoints[1].y))); + } + + @Test + public void testForIntersectionAtFirstLast() { + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + // An obviously intersecting fin: + // [2] +---+ [1] + // | / + // | / + // [0]|/ [3] + // +---+-----+---+ + // = +x => + Coordinate[] initPoints = new Coordinate[] { + new Coordinate(0, 0), + new Coordinate(0, 1), + new Coordinate(1, 1), + new Coordinate(0, 0) + }; + // this line throws an exception? + fins.setPoints(initPoints); + + final Coordinate[] finPoints = fins.getFinPoints(); + + // p0 + assertEquals("incorrect body points! ", 0., finPoints[0].x, EPSILON); + assertEquals("incorrect body points! ", 0., finPoints[0].y, EPSILON); + + // p1 + assertEquals("incorrect body points! ", 0., finPoints[1].x, EPSILON); + assertEquals("incorrect body points! ", 1., finPoints[1].y, EPSILON); + + // p2 + assertEquals("incorrect body points! ", 1., finPoints[2].x, EPSILON); + assertEquals("incorrect body points! ", 1., finPoints[2].y, EPSILON); + + // pf + assertEquals("incorrect body points! ", 0., finPoints[3].x, EPSILON); + assertEquals("incorrect body points! ", 0., finPoints[3].y, EPSILON); + } + + + + @Test + public void testWildmanVindicatorShape() throws Exception { + // This fin shape is similar to the aft fins on the Wildman Vindicator. + // A user noticed that if the y values are similar but not equal, + // the computation of CP was incorrect because of numerical instability. + // + // +-----------------+ + // \ \ + // \ \ + // + \ +x + // / \ <=+ + // +---------------------+ + // + FreeformFinSet fins = new FreeformFinSet(); + fins.setFinCount(1); + Coordinate[] points = new Coordinate[] { + new Coordinate(0, 0), + new Coordinate(0.02143125, 0.01143), + new Coordinate(0.009524999999999999, 0.032543749999999996), + new Coordinate(0.041275, 0.032537399999999994), + new Coordinate(0.066675, 0) + }; + fins.setPoints(points); + Coordinate coords = fins.getCG(); + + assertEquals(0.00130708, fins.getPlanformArea(), EPSILON); + + assertEquals(0.03423168, coords.x, EPSILON); + assertEquals(0.01427544, coords.y, EPSILON); + + BodyTube bt = new BodyTube(); + bt.addChild(fins); + FinSetCalc calc = new FinSetCalc(fins); + FlightConditions conditions = new FlightConditions(null); + AerodynamicForces forces = new AerodynamicForces(); + WarningSet warnings = new WarningSet(); + calc.calculateNonaxialForces(conditions, forces, warnings); + //System.out.println(forces); + assertEquals(0.023409, forces.getCP().x, 0.0001); + } + + @Test + public void testGenerateRootPointsOnBodyTube(){ + final Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + final FreeformFinSet fins = this.createFinOnTube(body); + + { // root points (relative to fin-front) + final Coordinate[] finPoints = fins.getFinPoints(); + final Coordinate[] rootPoints = fins.getRootPoints(); + + assertEquals("Method should only generate minimal points for a conical transition fin body! ", 2, rootPoints.length ); + assertEquals("incorrect body point: 0::x ! ", finPoints[0].x, rootPoints[0].x, EPSILON); + assertEquals("incorrect body point: 0::y ! ", finPoints[0].y, rootPoints[0].y, EPSILON); + assertEquals("incorrect body point: -1::x !", finPoints[finPoints.length-1].x, rootPoints[1].x, EPSILON); + assertEquals("incorrect body point: -1::y !", finPoints[finPoints.length-1].y, rootPoints[1].y, EPSILON); + } + } + + @Test + public void testGenerateBodyPointsOnConicalTransition(){ + final Rocket rkt = createTemplateRocket(); + final Transition tailCone = (Transition) rkt.getChild(0).getChild(2); + final FreeformFinSet fins = this.createFinOnConicalTransition(tailCone); + + { // body points (relative to root) + final Coordinate[] finPoints = fins.getFinPoints(); + final Coordinate[] rootPoints = fins.getRootPoints(); + + assertEquals("Method should only generate minimal points for a conical transition fin body! ", 2, rootPoints.length ); + assertEquals("incorrect body points! ", finPoints[0].x, rootPoints[0].x, EPSILON); + assertEquals("incorrect body points! ", finPoints[0].y, rootPoints[0].y, EPSILON); + assertEquals("incorrect body points! ", finPoints[finPoints.length-1].x, rootPoints[1].x, EPSILON); + assertEquals("incorrect body points! ", finPoints[finPoints.length-1].y, rootPoints[1].y, EPSILON); + } + } + + @Test + public void testGenerateBodyPointsOnEllipsoidNose(){ + final Rocket rocket = createTemplateRocket(); + final NoseCone nose = (NoseCone) rocket.getChild(0).getChild(0); + final FreeformFinSet fins = this.createFinOnEllipsoidNose(nose); + + final Coordinate finFront = fins.getFinFront(); + final Coordinate[] finPoints = fins.getFinPoints(); + + { // fin points (relative to fin) // preconditions + assertEquals(4, finPoints.length); + + assertEquals("incorrect fin points! ", 0f, finPoints[0].x, EPSILON); + assertEquals("incorrect fin points! ", 0f, finPoints[0].y, EPSILON); + + assertEquals("incorrect fin points! ", 0.8, finPoints[3].x, EPSILON); + + assertEquals(nose.getRadius(0.8+finFront.x) - finFront.y, finPoints[3].y, EPSILON); + + assertEquals("incorrect fin points! ", 0.78466912, finPoints[3].y, EPSILON); + + }{ // body points (relative to fin) + final Coordinate[] rootPoints = fins.getRootPoints(); + assertEquals(101, rootPoints.length); + final int lastIndex = 100; + + // trivial, and uninteresting: + assertEquals("incorrect body points! ", finPoints[0].x, rootPoints[0].x, EPSILON); + assertEquals("incorrect body points! ", finPoints[0].y, rootPoints[0].y, EPSILON); + + // n.b.: This should match EXACTLY the end point of the fin. (in fin coordinates) + assertEquals("incorrect body points! ", finPoints[finPoints.length -1].x, rootPoints[lastIndex].x, EPSILON); + assertEquals("incorrect body points! ", finPoints[finPoints.length -1].y, rootPoints[lastIndex].y, EPSILON); + + {// the tests within this scope is are rather fragile, and may break for reasons other than bugs :( + // the number of points is somewhat arbitrary, but if this test fails, the rest *definitely* will. + assertEquals("Method is generating how many points? ", 101, rootPoints.length ); + + final int[] testIndices = { 2, 5, 61, 88}; + final double[] expectedX = { 0.016, 0.04, 0.488, 0.704}; + + for( int testCase = 0; testCase < testIndices.length; testCase++){ + final int testIndex = testIndices[testCase]; + assertEquals(String.format("Root points @ %d :: x coordinate mismatch!", testIndex), + expectedX[testCase], rootPoints[testIndex].x, EPSILON); + assertEquals(String.format("Root points @ %d :: y coordinate mismatch!", testIndex), + nose.getRadius(rootPoints[testIndex].x + finFront.x) - finFront.y, rootPoints[testIndex].y, EPSILON); + } + } + } + } + + @Test + public void testFreeFormCMWithNegativeY() throws Exception { + final Rocket rkt = createTemplateRocket(); + final BodyTube body = (BodyTube) rkt.getChild(0).getChild(1); + + // A user submitted an ork file which could not be simulated. + // This Fin set is constructed to have the same problem. It is a square and rectangle + // where the two trailing edge corners of the rectangle satisfy y_0 = -y_1 + // + // +=> +x + // 0 1 2 3 + // | | | | + // + // +---------+ - +1 + // | | ^ + // | | | +y + //----+----+ | - 0 + + // | | + // | | + // +----+ - -1 + // | + // | + FreeformFinSet fins = new FreeformFinSet(); + body.addChild(fins); + fins.setAxialOffset( AxialMethod.TOP, 1.0); + + Coordinate[] points = new Coordinate[] { + new Coordinate(0.0, 0), + new Coordinate(0.0, 1), + new Coordinate(2.0, 1), + new Coordinate(2.0, -1), + new Coordinate(1.0001, -1), + new Coordinate(1.0, 0) + }; + fins.setPoints(points); + + fins.setPoints( points); + fins.setFilletRadius( 0.0); + fins.setTabHeight( 0.0); + fins.setCrossSection( CrossSection.SQUARE ); // to ensure uniform density + fins.setMaterial( Material.newMaterial(Type.BULK, "dummy", 1.0, true)); + + assertEquals( 3.0, fins.getPlanformArea(), 0.0001); + + final Coordinate cg = fins.getCG(); + assertEquals(1.1666, cg.x, 0.0001); + assertEquals(1.1666, cg.y, 0.0001); + assertEquals( 0.0, cg.z, EPSILON); + assertEquals( 0.009, cg.weight, EPSILON); + } + + @Test + public void testFreeFormCMWithTooManyPoints() { + final Rocket rkt = createTemplateRocket(); + final BodyTube phantomBody = (BodyTube) rkt.getChild(0).getChild(3); + final FreeformFinSet fins = new FreeformFinSet(); + + // fins.setAxialOffset( Position.BOTTOM, 1.0); // ERROR: no parent! + final Coordinate[] setPoints = new Coordinate[] { + new Coordinate(0.006349996571001852, 0.0), + new Coordinate(0.00635, 0.022224999999999998), + new Coordinate(0.0067056, 0.02716387422039681), + new Coordinate(0.007619999999999999, 0.03174998285500926), + new Coordinate(0.0093472, 0.036159702695982766), + new Coordinate(0.0110998, 0.03951108977512263), + new Coordinate(0.028134012585410983, 0.06508746485276898), + new Coordinate(0.030427066902717206, 0.06843885193190885), + new Coordinate(0.03298470441048184, 0.07170204461422924), + new Coordinate(0.0351895643309686, 0.073906904534716), + new Coordinate(0.03801178502919164, 0.0756707924711054), + new Coordinate(0.04101039452105363, 0.07672912523293904), + new Coordinate(0.04409719840973508, 0.07743468040749481), + new Coordinate(0.04762497428251389, 0.07787565239159215), + new Coordinate(0.0511527501552927, 0.07797799999999999), + new Coordinate(0.08021280390730812, 0.07797799999999999), + new Coordinate(0.08127113666914176, 0.07796384678841163), + new Coordinate(0.08206488624051698, 0.07787565239159215), + new Coordinate(0.08281453861348248, 0.07747877760590453), + new Coordinate(0.08316731620076037, 0.07681731962975852), + new Coordinate(0.08325551059757984, 0.07584718126474434), + new Coordinate(0.083312, 0.07487704289973017), + new Coordinate(0.08329960779598958, 0.033293384799349984), + new Coordinate(0.08325551059757984, 0.03254373242638449), + new Coordinate(0.08307912180394089, 0.03174998285500926), + new Coordinate(0.08263814981984355, 0.031132622077272968), + new Coordinate(0.08180030305005857, 0.030691650093175617), + new Coordinate(0.0806978730898152, 0.030479999999999997), + new Coordinate(0.06178017497203885, 0.030479999999999997), + new Coordinate(0.05635621956764143, 0.030479999999999997), + new Coordinate(0.05344580447259892, 0.030225999999999996), + new Coordinate(0.051461430544160844, 0.0292862), + new Coordinate(0.050006222996639586, 0.027711399999999997), + new Coordinate(0.04921247342526435, 0.0261112), + new Coordinate(0.048683307044347535, 0.024002999999999997), + new Coordinate(0.048768, 0.022098), + new Coordinate(0.048768, 0.0) + }; + fins.setPoints( setPoints); + phantomBody.addChild(fins); + + { // fin points (relative to fin) // preconditions + final Coordinate[] finPoints = fins.getFinPoints(); + assertEquals(37, finPoints.length); + + // fin root length: + assertEquals(0.04241800, fins.length, EPSILON); + + // p_first + assertEquals(0f, finPoints[0].x, EPSILON); + assertEquals(0f, finPoints[0].y, EPSILON); + + // p_last + assertEquals(0.042418, finPoints[36].x, EPSILON); + assertEquals(0., finPoints[36].y, EPSILON); + + } + } + +} diff --git a/core/test/net/sf/openrocket/rocketcomponent/LaunchLugTest.java b/core/test/net/sf/openrocket/rocketcomponent/LaunchLugTest.java new file mode 100644 index 0000000000..4d82d9b807 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/LaunchLugTest.java @@ -0,0 +1,67 @@ +package net.sf.openrocket.rocketcomponent; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class LaunchLugTest extends BaseTestCase { + protected final double EPSILON = MathUtil.EPSILON; + + @Test + public void testLaunchLugLocationZeroAngle() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + + BodyTube body= (BodyTube)rocket.getChild(0).getChild(1); + LaunchLug lug = (LaunchLug)rocket.getChild(0).getChild(1).getChild(1); + lug.setInstanceSeparation(0.05); + lug.setInstanceCount(2); + + double expX = 0.111 + body.getLocations()[0].x; + double expR = body.getOuterRadius()+lug.getOuterRadius(); + Coordinate expPos = new Coordinate( expX, expR, 0, 0); + Coordinate actPos[] = lug.getLocations(); + assertEquals(" LaunchLug has the wrong x value: ", expPos.x, actPos[0].x, EPSILON); + assertEquals(" LaunchLug has the wrong y value: ", expPos.y, actPos[0].y, EPSILON); + assertEquals(" LaunchLug has the wrong z value: ", expPos.z, actPos[0].z, EPSILON); + assertEquals(" LaunchLug has the wrong weight: ", 0, actPos[0].weight, EPSILON); + assertEquals(" LaunchLug #1 is in the wrong place: ", expPos, actPos[0]); + + expPos = expPos.setX( expX+0.05 ); + assertEquals(" LaunchLug #2 is in the wrong place: ", expPos, actPos[1]); + } + + @Test + public void testLaunchLugLocationAtAngles() { + Rocket rocket = TestRockets.makeEstesAlphaIII(); + + BodyTube body= (BodyTube)rocket.getChild(0).getChild(1); + LaunchLug lug = (LaunchLug)rocket.getChild(0).getChild(1).getChild(1); + double startAngle = Math.PI/2; + lug.setAngularOffset( startAngle ); + lug.setInstanceSeparation(0.05); + lug.setInstanceCount(2); + + double expX = 0.111 + body.getLocations()[0].x; + double expR = 0.015; + double expY = Math.cos(startAngle)*expR ; + double expZ = Math.sin(startAngle)*expR ; + Coordinate expPos = new Coordinate( expX, expY, expZ, 0); + Coordinate actPos[] = lug.getLocations(); + assertEquals(" LaunchLug has the wrong x value: ", expPos.x, actPos[0].x, EPSILON); + assertEquals(" LaunchLug has the wrong y value: ", expPos.y, actPos[0].y, EPSILON); + assertEquals(" LaunchLug has the wrong z value: ", expPos.z, actPos[0].z, EPSILON); + assertEquals(" LaunchLug has the wrong weight: ", 0, actPos[0].weight, EPSILON); + assertEquals(" LaunchLug is in the wrong place: ", expPos, actPos[0]); + + if( 1 < actPos.length){ + expPos = expPos.setX( expX+0.05 ); + assertEquals(" LaunchLug #2 is in the wrong place: ", expPos, actPos[1]); + } + } + +} diff --git a/core/test/net/sf/openrocket/rocketcomponent/ParallelStageTest.java b/core/test/net/sf/openrocket/rocketcomponent/ParallelStageTest.java new file mode 100644 index 0000000000..3d62a20713 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/ParallelStageTest.java @@ -0,0 +1,721 @@ +package net.sf.openrocket.rocketcomponent; + +//import junit.framework.TestCase; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.*; + +import org.junit.Test; + +import junit.framework.Assert; +import net.sf.openrocket.rocketcomponent.position.*; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class ParallelStageTest extends BaseTestCase { + + // tolerance for compared double test results + protected final double EPSILON = 0.000001; + + /* From OpenRocket Technical Documentation + * + * 3.1.4 Coordinate systems + * During calculation of the aerodynamic properties a coordinate system fixed to the rocket will be used. + * The origin of the coordinates is at the nose cone tip with the positive x-axis directed along the rocket + * when discussing the fins. During simulation, however, the y- and z-axes are fixed in relation to the rocket, + * and do not necessarily align with the plane of the pitching moments. + */ + + public ParallelStage createExtraBooster() { + double tubeRadius = 0.8; + + ParallelStage strapon = new ParallelStage(); + strapon.setName("Booster Stage"); + RocketComponent boosterNose = new NoseCone(Transition.Shape.CONICAL, 2.0, tubeRadius); + boosterNose.setName("Booster Nosecone"); + strapon.addChild(boosterNose); + RocketComponent boosterBody = new BodyTube(2.0, tubeRadius, 0.01); + boosterBody.setName("Booster Body "); + strapon.addChild(boosterBody); + Transition boosterTail = new Transition(); + boosterTail.setName("Booster Tail"); + boosterTail.setForeRadius(1.0); + boosterTail.setAftRadius(0.5); + boosterTail.setLength(1.0); + strapon.addChild(boosterTail); + + strapon.setInstanceCount(3); + strapon.setRadiusMethod( RadiusMethod.FREE ); + strapon.setRadiusOffset( 0.18 ); + + return strapon; + } + + @Test + public void testSetRocketPositionFail() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + + // case 1: the rocket Rocket should be stationary + rocket.setAxialOffset( +4.8 ); + + assertEquals( AxialMethod.ABSOLUTE, rocket.getAxialMethod() ); + assertEquals( 0, rocket.getAxialOffset(), EPSILON); + assertEquals( 0, rocket.getPosition().x, EPSILON); + } + + @Test + public void testCreatePayloadStage() { + // vvvv function under test vvvv + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + // ^^^^ function under test ^^^^ + + // Sustainer Stage + AxialStage payloadStage = (AxialStage) rocket.getChild(0); + RocketComponent payloadNose = payloadStage.getChild(0); + RocketComponent payloadBody = payloadStage.getChild(1); + assertThat(" createTestRocket failed: is payload stage an ancestor of the payload stage? ", payloadStage.isAncestor(payloadStage), equalTo(false)); + assertThat(" createTestRocket failed: is payload stage an ancestor of the payload nose? ", payloadStage.isAncestor(payloadNose), equalTo(true)); + assertThat(" createTestRocket failed: is the rocket an ancestor of the sustainer Nose? ", rocket.isAncestor(payloadNose), equalTo(true)); + assertThat(" createTestRocket failed: is payload Body an ancestor of the payload Nose? ", payloadBody.isAncestor(payloadNose), equalTo(false)); + + int relToExpected = -1; + int relToStage = payloadStage.getRelativeToStage(); + assertThat(" createTestRocket failed: sustainer relative position: ", relToStage, equalTo(relToExpected)); + + double expectedPayloadLength = 0.564; + Assert.assertEquals( payloadStage.getLength(), expectedPayloadLength, EPSILON); + + double expectedPayloadStageX = 0; + Assert.assertEquals( payloadStage.getPosition().x, expectedPayloadStageX, EPSILON); + Assert.assertEquals( payloadStage.getComponentLocations()[0].x, expectedPayloadStageX, EPSILON); + + Assert.assertEquals( 0, payloadNose.getPosition().x, EPSILON); + Assert.assertEquals( 0, payloadNose.getComponentLocations()[0].x, EPSILON); + + double expectedPayloadBodyX = payloadNose.getLength(); + Assert.assertEquals( payloadBody.getPosition().x, expectedPayloadBodyX, EPSILON); + Assert.assertEquals( payloadBody.getComponentLocations()[0].x, expectedPayloadBodyX, EPSILON); + } + + // WARNING: this test will not pass unless 'testAddTopStage' is passing as well -- that function tests the dependencies... + @Test + public void testCreateCoreStage() { + // vvvv function under test vvvv + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + // ^^^^ function under test ^^^^ + + // Payload Stage + AxialStage payloadStage = (AxialStage)rocket.getChild(0); + final double expectedPayloadLength = 0.564; + final double payloadLength = payloadStage.getLength(); + Assert.assertEquals( payloadLength, expectedPayloadLength, EPSILON); + + // Core Stage + AxialStage coreStage = (AxialStage) rocket.getChild(1); + double expectedCoreLength = 0.8; + assertThat(" createTestRocket failed: @ Core size: ", coreStage.getLength(), equalTo(expectedCoreLength)); + + int relToExpected = 0; + int relToStage = coreStage.getRelativeToStage(); + assertThat(" createTestRocket failed! @ core relative position: ", relToStage, equalTo(relToExpected)); + + final double expectedCoreStageX = payloadLength; + Assert.assertEquals( expectedCoreStageX, 0.564, EPSILON); + Assert.assertEquals( coreStage.getPosition().x, expectedCoreStageX, EPSILON); + Assert.assertEquals( coreStage.getComponentLocations()[0].x, expectedCoreStageX, EPSILON); + + RocketComponent coreBody = coreStage.getChild(0); + Assert.assertEquals( coreBody.getPosition().x, 0.0, EPSILON); + Assert.assertEquals( coreBody.getComponentLocations()[0].x, expectedCoreStageX, EPSILON); + + } + + + @Test + public void testStageAncestry() { + RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + + AxialStage sustainer = (AxialStage) rocket.getChild(0); + AxialStage coreStage = (AxialStage) rocket.getChild(1); + AxialStage booster = (AxialStage) coreStage.getChild(0).getChild(0); + + AxialStage sustainerPrev = sustainer.getUpperStage(); + assertThat("sustainer parent is not found correctly: ", sustainerPrev, equalTo(null)); + + AxialStage corePrev = coreStage.getUpperStage(); + assertThat("core parent is not found correctly: ", corePrev, equalTo(sustainer)); + + AxialStage boosterPrev = booster.getUpperStage(); + assertThat("booster parent is not found correctly: ", boosterPrev, equalTo(coreStage)); + } + + @Test + public void testSetStagePosition_topOfStack() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + + AxialStage sustainer = (AxialStage) rocket.getChild(0); + Coordinate expectedPosition = new Coordinate(0, 0., 0.); // i.e. half the tube length + Coordinate targetPosition = new Coordinate(+4.0, 0., 0.); + + + // without making the rocket 'external' and the Stage should be restricted to AFTER positioning. + sustainer.setAxialMethod(AxialMethod.ABSOLUTE); + assertThat("Setting a centerline stage to anything other than AFTER is ignored.", sustainer.isAfter(), equalTo(true)); + assertThat("Setting a centerline stage to anything other than AFTER is ignored.", sustainer.getAxialMethod(), equalTo(AxialMethod.AFTER)); + + // vv function under test + sustainer.setAxialOffset(targetPosition.x); + // ^^ function under test + String rocketTree = rocket.toDebugTree(); + + Coordinate resultantRelativePosition = sustainer.getPosition(); + assertThat(" 'setAxialPosition(double)' failed:\n" + rocketTree + " Relative position: ", resultantRelativePosition.x, equalTo(expectedPosition.x)); + // for all stages, the absolute position should equal the relative, because the direct parent is the rocket component (i.e. the Rocket) + Coordinate resultantAbsolutePosition = sustainer.getComponentLocations()[0]; + assertThat(" 'setAxialPosition(double)' failed:\n" + rocketTree + " Absolute position: ", resultantAbsolutePosition.x, equalTo(expectedPosition.x)); + + } + + @Test + public void testBoosterInitializationFREERadius() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage parallelBoosterSet = (ParallelStage)coreStage.getChild(0).getChild(0); + + // vvvv function under test + parallelBoosterSet.setRadiusMethod( RadiusMethod.FREE ); + parallelBoosterSet.setRadiusOffset(2.0); + // ^^ function under test + + assertThat(" 'setInstancecount(int)' failed: ", 2, equalTo(parallelBoosterSet.getInstanceCount())); + + assertFalse( RadiusMethod.FREE.clampToZero()); + assertEquals(" error while setting radius method: ", RadiusMethod.FREE, parallelBoosterSet.getRadiusMethod() ); + assertEquals(" error while setting radius offset: ", 2.0, parallelBoosterSet.getRadiusOffset(), EPSILON); + + assertEquals(" error while setting radius offset: ", 2.0, parallelBoosterSet.getInstanceLocations()[0].y, EPSILON); + } + + @Test + public void testBoosterInitializationSURFACERadius() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage parallelBoosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + final BodyTube coreBody = (BodyTube)coreStage.getChild(0); + final BodyTube boosterBody = (BodyTube)parallelBoosterStage.getChild(1); + + // vvvv function under test + parallelBoosterStage.setRadiusMethod( RadiusMethod.SURFACE ); + + // for the 'SURFACE' method, above, this call should have no effect. + parallelBoosterStage.setRadiusOffset(4.0); + // ^^^^ function under test + + assertThat(" 'setInstancecount(int)' failed: ", 2, equalTo(parallelBoosterStage.getInstanceCount())); + + assertTrue( RadiusMethod.SURFACE.clampToZero()); + assertEquals(" error while setting radius method: ", RadiusMethod.SURFACE, parallelBoosterStage.getRadiusMethod() ); + assertEquals(" error while setting radius offset: ", 0.0, parallelBoosterStage.getRadiusOffset(), EPSILON); + + final double expectedRadius = coreBody.getOuterRadius() + boosterBody.getOuterRadius(); + { + final Coordinate actualInstanceOffsets[] = parallelBoosterStage.getInstanceOffsets(); + + assertEquals(" error while setting radius offset: ", 0, actualInstanceOffsets[0].x, EPSILON); + assertEquals(" error while setting radius offset: ", expectedRadius, actualInstanceOffsets[0].y, EPSILON); + + assertEquals(" error while setting radius offset: ", 0, actualInstanceOffsets[1].x, EPSILON); + assertEquals(" error while setting radius offset: ", -expectedRadius, actualInstanceOffsets[1].y, EPSILON); + }{ + final Coordinate actualLocations[] = parallelBoosterStage.getComponentLocations(); + + assertEquals(" error while setting radius offset: ", 0.484, actualLocations[0].x, EPSILON); + assertEquals(" error while setting radius offset: ", expectedRadius, actualLocations[0].y, EPSILON); + + assertEquals(" error while setting radius offset: ", 0.484, actualLocations[1].x, EPSILON); + assertEquals(" error while setting radius offset: ", -expectedRadius, actualLocations[1].y, EPSILON); + } + } + + + @Test + public void testBoosterInitializationRELATIVERadius() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage parallelBoosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + final BodyTube coreBody = (BodyTube)coreStage.getChild(0); + final BodyTube boosterBody = (BodyTube)parallelBoosterStage.getChild(1); + + // vv function under test + parallelBoosterStage.setAxialOffset( AxialMethod.BOTTOM, 0.0 ); + final double targetRadiusOffset = 0.01; + parallelBoosterStage.setRadius( RadiusMethod.RELATIVE, targetRadiusOffset ); + // ^^ function under test + + assertFalse(RadiusMethod.RELATIVE.clampToZero()); + assertEquals(" error while setting radius method: ", RadiusMethod.RELATIVE, parallelBoosterStage.getRadiusMethod() ); + assertEquals(" error while setting radius offset: ", targetRadiusOffset, parallelBoosterStage.getRadiusOffset() , EPSILON); + + final double expectedRadius = targetRadiusOffset + coreBody.getOuterRadius() + boosterBody.getOuterRadius(); + { + final Coordinate actualInstanceOffsets[] = parallelBoosterStage.getInstanceOffsets(); + + assertEquals(" error while setting radius offset: ", 0, actualInstanceOffsets[0].x, EPSILON); + assertEquals(" error while setting radius offset: ", expectedRadius, actualInstanceOffsets[0].y, EPSILON); + + assertEquals(" error while setting radius offset: ", 0, actualInstanceOffsets[1].x, EPSILON); + assertEquals(" error while setting radius offset: ", -expectedRadius, actualInstanceOffsets[1].y, EPSILON); + }{ + final Coordinate actualLocations[] = parallelBoosterStage.getComponentLocations(); + + assertEquals(" error while setting radius offset: ", 0.484, actualLocations[0].x, EPSILON); + assertEquals(" error while setting radius offset: ", expectedRadius, actualLocations[0].y, EPSILON); + + assertEquals(" error while setting radius offset: ", 0.484, actualLocations[1].x, EPSILON); + assertEquals(" error while setting radius offset: ", -expectedRadius, actualLocations[1].y, EPSILON); + } + } + + // because even though this is an "outside" stage, it's relative to itself -- i.e. an error. + // also an error with a well-defined failure result (i.e. just failover to AFTER placement as the first stage of a rocket. + @Test + public void testBoosterInstanceLocation_BOTTOM() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final BodyTube coreBody = (BodyTube)coreStage.getChild(0); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + final BodyTube boosterBody = (BodyTube)boosterStage.getChild(1); + + // vv function under test + int targetInstanceCount = 3; + boosterStage.setInstanceCount(targetInstanceCount); + boosterStage.setRadiusMethod( RadiusMethod.SURFACE ); + // ^^ function under test + + assertEquals( targetInstanceCount, boosterStage.getInstanceCount() ); + + final double expectedX = 0.484; + final double expectedRadiusOffset = coreBody.getOuterRadius() + boosterBody.getOuterRadius(); + final double angleIncr = Math.PI * 2 / targetInstanceCount; + + Coordinate[] instanceAbsoluteCoords = boosterStage.getComponentLocations(); + + for( int index = 0; index < targetInstanceCount; ++index ) { + final Coordinate actualPosition = instanceAbsoluteCoords[index]; + assertEquals(String.format("At index=%d, radius=%.6g, angle=%.6g",index, expectedRadiusOffset, angleIncr*index), expectedX, actualPosition.x, EPSILON ); + + final double expectedY = expectedRadiusOffset * Math.cos(angleIncr * index); + assertEquals(String.format("At index=%d, radius=%.6g, angle=%.6g",index, expectedRadiusOffset, angleIncr*index), expectedY, actualPosition.y, EPSILON ); + + final double expectedZ = expectedRadiusOffset * Math.sin(angleIncr * index); + assertEquals(String.format("At index=%d, radius=%.6g, angle=%.6g",index, expectedRadiusOffset, angleIncr*index), expectedZ, actualPosition.z, EPSILON ); + } + + } + + // because even though this is an "outside" stage, it's relative to itself -- i.e. an error. + // also an error with a well-defined failure result (i.e. just failover to AFTER placement as the first stage of a rocket. + @Test + public void testSetStagePosition_outsideABSOLUTE() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final BodyTube coreBody= (BodyTube) rocket.getChild(1).getChild(0); + final ParallelStage boosterStage = (ParallelStage)coreBody.getChild(0); + + double targetAbsoluteX = 0.8; + double expectedRelativeX = 0.236; + double expectedAbsoluteX = 0.8; + + // when substages should be freely movable + // vv function under test + boosterStage.setAxialOffset(AxialMethod.ABSOLUTE, targetAbsoluteX); + // ^^ function under test + + assertEquals("setAxialOffset( method, double) failed: ", AxialMethod.ABSOLUTE, boosterStage.getAxialMethod() ); + assertEquals("setAxialOffset( method, double) failed: ", targetAbsoluteX, boosterStage.getAxialOffset(), EPSILON ); + + double actualRelativeX = boosterStage.getAxialOffset(AxialMethod.TOP); + assertEquals(" 'setAxialPosition(double)' failed: Relative position: ", expectedRelativeX, actualRelativeX, EPSILON ); + + double actualAbsoluteX = boosterStage.getComponentLocations()[0].x; + assertEquals(" 'setAxialPosition(double)' failed: Absolute position: ", expectedAbsoluteX, actualAbsoluteX, EPSILON); + + } + + @Test + public void testSetStagePosition_centerline() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage payloadStage = (AxialStage) rocket.getChild(0); + + int expectedRelativeIndex = -1; + int resultantRelativeIndex = payloadStage.getRelativeToStage(); + assertThat(" 'setRelativeToStage(int)' failed. Relative stage index:", expectedRelativeIndex, equalTo(resultantRelativeIndex)); + + // vv function under test + // a centerline stage is not freely movable + payloadStage.setAxialOffset(AxialMethod.TOP, 4.0 ); + // ^^ function under test + + assertEquals("setAxialPosition( Method, double) ", AxialMethod.AFTER, payloadStage.getAxialMethod() ); + assertEquals("setAxialPosition( Method, double) ", 0.0, payloadStage.getAxialOffset(), EPSILON ); + + assertEquals("setAxialPosition( Method, double) ", 0.0, payloadStage.getPosition().x, EPSILON ); + + assertEquals("setAxialPosition( Method, double) ", RadiusMethod.COAXIAL, payloadStage.getRadiusMethod() ); + assertEquals("setAxialPosition( Method, double) ", 0.0, payloadStage.getRadiusOffset(), EPSILON ); + + assertEquals("setAxialPosition( Method, double) ", 0.0, payloadStage.getComponentLocations()[0].x, EPSILON ); + } + + @Test + public void testSetStagePosition_outsideTOP() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + double targetOffset = 0.2; + + // vv function under test + boosterStage.setAxialOffset(AxialMethod.TOP, targetOffset); + // ^^ function under test + + String treeDump = rocket.toDebugTree(); + + double expectedRelativeX = 0.2; + double expectedAbsoluteX = 0.764; + Coordinate resultantRelativePosition = boosterStage.getPosition(); + assertThat(" 'setAxialPosition(double)' failed: \n" + treeDump + " Relative position: ", resultantRelativePosition.x, equalTo(expectedRelativeX)); + // for all stages, the absolute position should equal the relative, because the direct parent is the rocket component (i.e. the Rocket) + + Coordinate resultantAbsolutePosition = boosterStage.getComponentLocations()[0]; + + assertThat(" 'setAxialPosition(double)' failed: \n" + treeDump + " Absolute position: ", resultantAbsolutePosition.x, equalTo(expectedAbsoluteX)); + + double resultantAxialOffset = boosterStage.getAxialOffset(); + assertThat(" 'getAxialPosition()' failed: \n" + treeDump + " Axial Offset: ", resultantAxialOffset, equalTo(targetOffset)); + + double resultantPositionValue = boosterStage.getAxialOffset(); + assertThat(" 'setPositionValue()' failed: \n" + treeDump + " Position Value: ", resultantPositionValue, equalTo(targetOffset)); + } + + @Test + public void testSetMIDDLE() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + // when 'external' the stage should be freely movable + // vv function under test + double targetOffset = 0.2; + boosterStage.setAxialOffset(AxialMethod.MIDDLE, targetOffset); + // ^^ function under test + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON ); + + Assert.assertEquals( 0.16, boosterStage.getPosition().x, EPSILON ); + + Assert.assertEquals( 0.724, boosterStage.getComponentLocations()[0].x, EPSILON ); + } + + @Test + public void testSetBOTTOM() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + // vv function under test + double targetOffset = 0.2; + boosterStage.setAxialOffset(AxialMethod.BOTTOM, targetOffset); + // ^^ function under test + + Assert.assertEquals( 0.120, boosterStage.getPosition().x, EPSILON); + + Assert.assertEquals( 0.684, boosterStage.getComponentLocations()[0].x, EPSILON); + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON); + } + + @Test + public void testSetTOP_getABSOLUTE() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + double targetOffset = 0.2; + + // vv function under test + boosterStage.setAxialOffset(AxialMethod.TOP, targetOffset); + // ^^ function under test + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON ); + Assert.assertEquals( targetOffset, boosterStage.getPosition().x, EPSILON ); + + final double expectedRelativePositionX = 0.2; + final double resultantRelativePosition = boosterStage.getPosition().x; + Assert.assertEquals(expectedRelativePositionX, resultantRelativePosition, EPSILON); + + // vv function under test + final double actualAbsoluteX = boosterStage.getAxialOffset(AxialMethod.ABSOLUTE); + // ^^ function under test + + Assert.assertEquals( 0.764, actualAbsoluteX, EPSILON ); + } + + @Test + public void testSetTOP_getAFTER() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + double targetOffset = 0.2; + + // vv function under test + boosterStage.setAxialOffset(AxialMethod.TOP, targetOffset); + // ^^ function under test + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON ); + Assert.assertEquals( 0.2, boosterStage.getPosition().x, EPSILON ); + + + // vv function under test + double actualPositionXAfter = boosterStage.getAxialOffset(AxialMethod.AFTER); + // ^^ function under test + + Assert.assertEquals( -0.6, actualPositionXAfter, EPSILON ); + } + + @Test + public void testSetTOP_getMIDDLE() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + double targetOffset = 0.2; + + // vv function under test + boosterStage.setAxialOffset(AxialMethod.TOP, targetOffset); + // ^^ function under test + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON ); + Assert.assertEquals( 0.2, boosterStage.getPosition().x, EPSILON ); + + // vv function under test + final double actualAxialPosition = boosterStage.getAxialOffset(AxialMethod.MIDDLE); + // ^^ function under test + + Assert.assertEquals( 0.24, actualAxialPosition, EPSILON ); + } + + @Test + public void testSetTOP_getBOTTOM() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + double targetOffset = 0.2; + + // vv function under test + boosterStage.setAxialOffset(AxialMethod.TOP, targetOffset); + // ^^ function under test + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON ); + Assert.assertEquals( 0.2, boosterStage.getPosition().x, EPSILON ); + + // vv function under test + double actualAxialBottomOffset = boosterStage.getAxialOffset(AxialMethod.BOTTOM); + // ^^ function under test + + Assert.assertEquals( 0.28, actualAxialBottomOffset, EPSILON ); + } + + + @Test + public void testSetBOTTOM_getTOP() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + // vv function under test + double targetOffset = 0.2; + boosterStage.setAxialOffset(AxialMethod.BOTTOM, targetOffset); + // ^^ function under test + + Assert.assertEquals( targetOffset, boosterStage.getAxialOffset(), EPSILON); + Assert.assertEquals( 0.120, boosterStage.getPosition().x, EPSILON); + + // vv function under test + double actualAxialTopOffset = boosterStage.getAxialOffset(AxialMethod.TOP); + // ^^ function under test + + Assert.assertEquals( 0.12, actualAxialTopOffset, EPSILON); + } + + @Test + public void testOutsideStageRepositionTOPAfterAdd() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final ParallelStage boosterStage = (ParallelStage)coreStage.getChild(0).getChild(0); + + final double targetOffset = +2.50; + final AxialMethod targetMethod = AxialMethod.TOP; + boosterStage.setAxialOffset(targetMethod, targetOffset); + String treeDumpBefore = rocket.toDebugTree(); + + // requirement: regardless of initialization order (which we cannot control) + // a booster should retain it's positioning method and offset while adding on children + double expectedRelativeX = 2.5; + double resultantOffset = boosterStage.getPosition().x; + assertEquals(" init order error: Booster: " + treeDumpBefore + " initial relative X: ", expectedRelativeX, resultantOffset, EPSILON); + double expectedAxialOffset = targetOffset; + resultantOffset = boosterStage.getAxialOffset(); + assertEquals(" init order error: Booster: " + treeDumpBefore + " Initial axial offset: ", expectedAxialOffset, resultantOffset, EPSILON); + + String treeDumpAfter = rocket.toDebugTree(); + + expectedRelativeX = 2.5; // no change + resultantOffset = boosterStage.getPosition().x; + assertEquals(" init order error: Booster: " + treeDumpBefore + " =======> " + treeDumpAfter + " populated relative X: ", expectedRelativeX, resultantOffset, EPSILON); + expectedAxialOffset = targetOffset; // again, no change + resultantOffset = boosterStage.getAxialOffset(); + assertEquals(" init order error: Booster: " + treeDumpBefore + " =======> " + treeDumpAfter + " populated axial offset: ", expectedAxialOffset, resultantOffset, EPSILON); + } + + @Test + public void testStageInitializationMethodValueOrder() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final BodyTube coreBody = (BodyTube)coreStage.getChild(0); + + + ParallelStage boosterA = createExtraBooster(); + boosterA.setName("Booster A Stage"); + coreBody.addChild(boosterA); + ParallelStage boosterB = createExtraBooster(); + boosterB.setName("Booster B Stage"); + coreBody.addChild(boosterB); + + double targetOffset = +4.5; + double expectedOffset = +4.5; + // requirement: regardless of initialization order (which we cannot control) + // two boosters with identical initialization commands should end up at the same place. + + boosterA.setAxialOffset(AxialMethod.TOP, targetOffset); + + boosterB.setAxialMethod(AxialMethod.TOP); + boosterB.setAxialOffset(targetOffset); + String treeDump = rocket.toDebugTree(); + + double resultantOffsetA = boosterA.getPosition().x; + double resultantOffsetB = boosterB.getPosition().x; + + assertEquals(" init order error: " + treeDump + " Booster A: resultant positions: ", expectedOffset, resultantOffsetA, EPSILON); + assertEquals(" init order error: " + treeDump + " Booster B: resultant positions: ", expectedOffset, resultantOffsetB, EPSILON); + } + + @Test + public void testStageNumbering() { + final Rocket rocket = TestRockets.makeFalcon9Heavy(); + final FlightConfiguration config = rocket.getSelectedConfiguration(); + final AxialStage payloadStage = (AxialStage) rocket.getChild(0); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + final BodyTube coreBody = (BodyTube) coreStage.getChild(0); + + ParallelStage boosterA = (ParallelStage)coreBody.getChild(0); + + ParallelStage boosterB = createExtraBooster(); + boosterB.setName("Booster A Stage"); + coreBody.addChild(boosterB); + boosterB.setAxialOffset(AxialMethod.BOTTOM, 0.0); + + ParallelStage boosterC = createExtraBooster(); + boosterC.setName("Booster B Stage"); + coreBody.addChild(boosterC); + boosterC.setAxialOffset(AxialMethod.BOTTOM, 0); + + + int expectedStageNumber = 0; + int actualStageNumber = payloadStage.getStageNumber(); + assertEquals(" init order error: sustainer: resultant positions: ", expectedStageNumber, actualStageNumber); + + expectedStageNumber = 1; + actualStageNumber = coreStage.getStageNumber(); + assertEquals(" init order error: core: resultant positions: ", expectedStageNumber, actualStageNumber); + + expectedStageNumber = 2; + actualStageNumber = boosterA.getStageNumber(); + assertEquals(" init order error: core: resultant positions: ", expectedStageNumber, actualStageNumber); + + expectedStageNumber = 3; + actualStageNumber = boosterB.getStageNumber(); + assertEquals(" init order error: Booster A: resultant positions: ", expectedStageNumber, actualStageNumber); + + expectedStageNumber = 4; + actualStageNumber = boosterC.getStageNumber(); + assertEquals(" init order error: Booster B: resultant positions: ", expectedStageNumber, actualStageNumber); + + // remove Booster B + coreBody.removeChild(1); + + String treedump = rocket.toDebugTree(); + int expectedStageCount = 4; + int actualStageCount = config.getStageCount(); + + assertEquals(" Stage tracking error: removed booster A, but count not updated: " + treedump, expectedStageCount, actualStageCount); + actualStageCount = rocket.getSelectedConfiguration().getStageCount(); + assertEquals(" Stage tracking error: removed booster A, but configuration not updated: " + treedump, expectedStageCount, actualStageCount); + + ParallelStage boosterD = createExtraBooster(); + boosterC.setName("Booster D Stage"); + coreBody.addChild(boosterD); + boosterC.setAxialOffset(AxialMethod.BOTTOM, 0); + + expectedStageNumber = 3; + actualStageNumber = boosterD.getStageNumber(); + assertEquals(" init order error: Booster D: resultant positions: ", expectedStageNumber, actualStageNumber); + + //rocket.getDefaultConfiguration().dumpConfig(); + } + + @Test + public void testToAbsolute() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage coreStage = (AxialStage) rocket.getChild(1); + String treeDump = rocket.toDebugTree(); + + Coordinate input = new Coordinate(3, 0, 0); + Coordinate[] actual = coreStage.toAbsolute(input); + + double expectedX = 3.564; + assertEquals(treeDump + " coordinate transform through 'core.toAbsolute(c)' failed: ", expectedX, actual[0].x, EPSILON); + } + + @Test + public void testToRelative() { + final RocketComponent rocket = TestRockets.makeFalcon9Heavy(); + final AxialStage payloadStage = (AxialStage) rocket.getChild(0); + + RocketComponent payloadNose = payloadStage.getChild(1); + RocketComponent payloadBody = payloadStage.getChild(3); + + String treeDump = rocket.toDebugTree(); + + Coordinate input = new Coordinate(1, 0, 0); + Coordinate actual = payloadStage.toAbsolute(input)[0]; + + double expectedX = 1.0; + assertEquals(treeDump + " coordinate transform through 'core.toAbsolute(c)' failed: ", expectedX, actual.x, EPSILON); + + input = new Coordinate(1, 0, 0); + actual = payloadNose.toRelative(input, payloadBody)[0]; + + expectedX = 0.853999; + assertEquals(treeDump + " coordinate transform through 'core.toAbsolute(c)' failed: ", expectedX, actual.x, EPSILON); + + + + } + + + +} diff --git a/core/test/net/sf/openrocket/rocketcomponent/ParameterSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/ParameterSetTest.java new file mode 100644 index 0000000000..2039ebd28f --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/ParameterSetTest.java @@ -0,0 +1,246 @@ +package net.sf.openrocket.rocketcomponent; + +//import static org.hamcrest.CoreMatchers.equalTo; +//import static org.junit.Assert.assertEquals; +//import static org.junit.Assert.assertThat; +//import static org.junit.Assert.assertTrue; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; + +import java.util.Collections; + +import org.junit.Before; +import org.junit.Test; + +import net.sf.openrocket.util.ArrayList; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + + +public class ParameterSetTest extends BaseTestCase { + + + static int gid=0; + FlightConfigurableParameterSet<TestParameter> testSet = null; + + private class TestParameter implements FlightConfigurableParameter<TestParameter> { + public final int id; + + public TestParameter(){ + id = gid++; + } + + @Override + public void update(){} + + @Override + public boolean equals( Object other ){ + if( other instanceof TestParameter){ + return (this.id == ((TestParameter)other).id); + } + return false; + } + + @Override + public int hashCode(){ + return this.id; + } + + @Override + public String toString(){ + return "tp#:"+id; + } + + @Override + public TestParameter clone(){ + return new TestParameter(); + } + + @Override + public TestParameter copy( final FlightConfigurationId copyId){ + return new TestParameter(); + } + }; + + @Before + public void localSetUp() { + gid=0; + TestParameter defaultParam = new TestParameter(); + testSet = new FlightConfigurableParameterSet<TestParameter>( defaultParam ); + } + + // ================ Actual Tests ================ + + @Test + public void testEmptySet() { + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + TestParameter dtp = new TestParameter(); + testSet.setDefault( dtp); + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + assertThat("set stores default value correctly: ", testSet.getDefault(), equalTo( dtp )); + } + + @Test + public void testRetrieveDefault(){ + FlightConfigurationId fcid2 = new FlightConfigurationId(); + // i.e. requesting the value for a non-existent config id should return the default + assertThat("set stores id-value pair correctly : ", testSet.get(fcid2), equalTo( testSet.getDefault() )); + assertThat("set contains wrong number of overrides: ", testSet.size(), equalTo( 0 )); + + FlightConfigurationId fcid_def = FlightConfigurationId.DEFAULT_VALUE_FCID; + assertThat("retrieving the via the special default key should produce the default value: ", testSet.get(fcid_def), equalTo( testSet.getDefault() )); + assertThat("set should still contain zero overrides: ", testSet.size(), equalTo( 0 )); + } + + @Test + public void testSetGetSecond(){ + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + // fcid <=> tp2 should be stored.... + assertThat("set stores default value correctly: ", testSet.get(fcid2), equalTo( tp2 )); + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 1 )); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testGetByNegativeIndex() { + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + + //assertThat + testSet.get(-1); + } + + + @Test(expected=IndexOutOfBoundsException.class) + public void testGetByTooHighIndex() { + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + assertThat("set should contain one override: ", testSet.size(), equalTo( 1 )); + + //assertThat + testSet.get(1); // this should be off-by-one (too high) + } + + @Test + public void testGetIdsLength(){ + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + + TestParameter tp3 = new TestParameter(); + FlightConfigurationId fcid3 = new FlightConfigurationId(); + testSet.set(fcid3, tp3); + + assertThat("set should contain two overrides: ", testSet.size(), equalTo( 2 )); + + // testSet.getSortedConfigurationIDs() + // >> this function should ONLY return ids for the overrides + assertThat("getIds() broken!\n"+testSet.toDebug(), testSet.getIds().size(), equalTo( testSet.size())); + assertThat("getIds() broken!\n"+testSet.toDebug(), testSet.getIds().size(), equalTo( testSet.getIds().size() ) ); + } + + @Test + public void testGetByIndex(){ + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + + + TestParameter tp1 = new TestParameter(); + FlightConfigurationId fcid1 = new FlightConfigurationId(); + testSet.set(fcid1, tp1); + + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + + TestParameter tp3 = new TestParameter(); + FlightConfigurationId fcid3 = new FlightConfigurationId(); + testSet.set(fcid3, tp3); + + TestParameter tp4 = new TestParameter(); + FlightConfigurationId fcid4 = new FlightConfigurationId(); + testSet.set(fcid4, tp4); + + assertThat("set should contain two overrides: ", testSet.size(), equalTo( 4 )); + + ArrayList<FlightConfigurationId> refList = new ArrayList<FlightConfigurationId>(); + refList.add(fcid1); + refList.add(fcid2); + refList.add(fcid3); + refList.add(fcid4); + Collections.sort(refList); // Java 1.7: + + //assertThat + assertThat("retrieve-by-index broken!\n"+testSet.toDebug(), testSet.get(0), equalTo( testSet.get( refList.get(0)))); + assertThat("retrieve-by-index broken!\n"+testSet.toDebug(), testSet.get(1), equalTo( testSet.get( refList.get(1)))); + assertThat("retrieve-by-index broken!\n"+testSet.toDebug(), testSet.get(2), equalTo( testSet.get( refList.get(2)))); + assertThat("retrieve-by-index broken!\n"+testSet.toDebug(), testSet.get(3), equalTo( testSet.get( refList.get(3)))); + } + + + @Test + public void testRemoveSecond(){ + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + // fcid <=> tp2 should be stored.... + assertThat("set stores default value correctly: ", testSet.get(fcid2), equalTo( tp2 )); + assertThat("set should contain one override: ", testSet.size(), equalTo( 1 )); + + testSet.set(fcid2, null); + // fcid <=> tp2 should be stored.... + assertThat("set stores default value correctly: ", testSet.get(fcid2), equalTo( testSet.getDefault() )); + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + } + + + @Test + public void testGetByValue(){ + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + assertThat("retrieving the default value should produce the special default key: ", + testSet.getId(testSet.getDefault()), equalTo( FlightConfigurationId.DEFAULT_VALUE_FCID)); + + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + // fcid <=> tp2 should be stored.... + assertThat("set should contain one override: ", testSet.size(), equalTo( 1 )); + assertThat("set stores default value correctly: ", testSet.get(fcid2), equalTo( tp2 )); + + // now retrieve that same parameter by value + FlightConfigurationId fcid3 = testSet.getId(tp2); + assertThat("set should contain one override: ", testSet.size(), equalTo( 1 )); + assertThat("set stores default value correctly: ", fcid2, equalTo( fcid3 )); + assertThat("set stores default value correctly: ", testSet.get( fcid3), equalTo( tp2 )); + } + + + @Test + public void testCloneSecond(){ + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 0 )); + + TestParameter tp2 = new TestParameter(); + FlightConfigurationId fcid2 = new FlightConfigurationId(); + testSet.set(fcid2, tp2); + // fcid <=> tp2 should be stored.... + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 1 )); + assertThat("set stores default value correctly: ", testSet.get(fcid2), equalTo( tp2 )); + + FlightConfigurationId fcid3 = new FlightConfigurationId(); + testSet.copyFlightConfiguration(fcid2, fcid3); + // fcid <=> tp2 should be stored.... + assertThat("set should contain zero overrides: ", testSet.size(), equalTo( 2 )); + assertThat("set stores default value correctly: ", testSet.get(fcid3), not( testSet.getDefault() )); + } + + + +} diff --git a/core/test/net/sf/openrocket/rocketcomponent/RocketTest.java b/core/test/net/sf/openrocket/rocketcomponent/RocketTest.java index 16b5ca5df0..33dbd276f5 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/RocketTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/RocketTest.java @@ -1,23 +1,318 @@ package net.sf.openrocket.rocketcomponent; -import net.sf.openrocket.util.BaseTestCase.BaseTestCase; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import org.junit.Test; +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + public class RocketTest extends BaseTestCase { + final double EPSILON = MathUtil.EPSILON; + + @Test + public void testCopyIndependence() { + Rocket rkt1 = TestRockets.makeEstesAlphaIII(); + FlightConfiguration config1 = new FlightConfiguration(rkt1, null); + rkt1.setFlightConfiguration( config1.getId(), config1); + rkt1.setSelectedConfiguration( config1.getId()); + FlightConfiguration config2 = new FlightConfiguration(rkt1, null); + rkt1.setFlightConfiguration( config2.getId(), config2); + + // vvvv test target vvvv + Rocket rkt2 = rkt1.copyWithOriginalID(); + // ^^^^ test target ^^^^ + + FlightConfiguration config4 = rkt2.getSelectedConfiguration(); + FlightConfigurationId fcid4 = config4.getId(); + + assertThat("fcids should match: ", config1.getId().key, equalTo(fcid4.key)); + assertThat("Configurations should be different: "+config1.toDebug()+"=?="+config4.toDebug(), config1.configurationInstanceId, not( config4.configurationInstanceId)); + + FlightConfiguration config5 = rkt2.getFlightConfiguration(config2.getId()); + FlightConfigurationId fcid5 = config5.getId(); + assertThat("fcids should match: ", config2.getId(), equalTo(fcid5)); + assertThat("Configurations should bef different match: "+config2.toDebug()+"=?="+config5.toDebug(), config2.configurationInstanceId, not( config5.configurationInstanceId)); + } + + @Test - public void testCopyFrom() { - Rocket r1 = net.sf.openrocket.util.TestRockets.makeIsoHaisu(); - Rocket r2 = net.sf.openrocket.util.TestRockets.makeBigBlue(); + public void testCopyRocketFrom() { + //Rocket r1 = net.sf.openrocket.util.TestRockets.makeBigBlue(); + //Rocket r2 = new Rocket(); - Rocket copy = (Rocket) r2.copy(); + // this method fails, but I'm not sure what this is testing, or why. + // therefore, I'm not convinced it's valuable enough to keep around. + //r2.copyFrom(r1); + //ComponentCompare.assertDeepEquality(r1, r2); + } + + @Test + public void testEstesAlphaIII(){ + Rocket rocket = TestRockets.makeEstesAlphaIII(); + + AxialStage stage= (AxialStage)rocket.getChild(0); - ComponentCompare.assertDeepEquality(r2, copy); + Coordinate expLoc; + Coordinate actLoc; + { + NoseCone nose = (NoseCone)stage.getChild(0); + expLoc = new Coordinate(0,0,0); + actLoc = nose.getComponentLocations()[0]; + assertThat(nose.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + + BodyTube body = (BodyTube)stage.getChild(1); + expLoc = new Coordinate(0.07,0,0); + actLoc = body.getComponentLocations()[0]; + assertThat(body.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + + { + FinSet fins = (FinSet)body.getChild(0); + Coordinate actLocs[] = fins.getComponentLocations(); + assertThat(fins.getName()+" have incorrect count: ", fins.getInstanceCount(), equalTo(3)); + { // fin #1 + expLoc = new Coordinate(0.22,0.012,0); + assertThat(fins.getName()+" not positioned correctly: ", actLocs[0], equalTo(expLoc)); + } + + LaunchLug lugs = (LaunchLug)body.getChild(1); + expLoc = new Coordinate(0.181, 0.015, 0); + assertThat(lugs.getName()+" have incorrect count: ", lugs.getInstanceCount(), equalTo(1)); + actLocs = lugs.getComponentLocations(); + { // singular instance: + assertThat(lugs.getName()+" not positioned correctly: ", actLocs[0], equalTo(expLoc)); + } + + InnerTube mmt = (InnerTube)body.getChild(2); + expLoc = new Coordinate(0.203,0,0); + actLoc = mmt.getComponentLocations()[0]; + assertThat(mmt.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + { + EngineBlock block = (EngineBlock)mmt.getChild(0); + expLoc = new Coordinate(0.203,0,0); + actLoc = block.getComponentLocations()[0]; + assertThat(block.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + } + + } + + Parachute chute = (Parachute)body.getChild(3); + expLoc = new Coordinate(0.098,0,0); + actLoc = chute.getComponentLocations()[0]; + assertThat(chute.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + + CenteringRing ring = (CenteringRing)body.getChild(4); + assertThat(ring.getName()+" not instanced correctly: ", ring.getInstanceCount(), equalTo(2)); + // singleton instances follow different code paths + ring.setInstanceCount(1); + expLoc = new Coordinate(0.21,0,0); + actLoc = ring.getComponentLocations()[0]; + assertEquals(" position x fail: ", expLoc.x, actLoc.x, EPSILON); + assertEquals(" position y fail: ", expLoc.y, actLoc.y, EPSILON); + assertEquals(" position z fail: ", expLoc.z, actLoc.z, EPSILON); + assertThat(ring.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + + ring.setInstanceCount(2); + Coordinate actLocs[] = ring.getComponentLocations(); + { // first instance + expLoc = new Coordinate(0.21, 0, 0); + actLoc = actLocs[0]; + assertThat(ring.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + } + { // second instance + assertThat(ring.getName()+" not instanced correctly: ", ring.getInstanceCount(), equalTo(2)); + expLoc = new Coordinate(0.245, 0, 0); + actLoc = actLocs[1]; + assertThat(ring.getName()+" not positioned correctly: ", actLoc, equalTo(expLoc)); + } + + } + } + + @Test + public void testRemoveReadjustLocation() { + final Rocket rocket = TestRockets.makeEstesAlphaIII(); - r1.copyFrom(copy); + { + BodyTube bodyPrior = (BodyTube)rocket.getChild(0).getChild(1); + Coordinate locPrior = bodyPrior.getComponentLocations()[0]; + assertThat(locPrior.x, equalTo(0.07)); + } - ComponentCompare.assertDeepEquality(r1, r2); + // remove the nose cone, causing the bodytube to reposition: + rocket.getChild(0).removeChild(0); + + { + BodyTube tubePost = (BodyTube)rocket.getChild(0).getChild(0); + Coordinate locPost = tubePost.getComponentLocations()[0]; + assertThat(locPost.x, equalTo(0.0)); + } } + @Test + public void testBeta(){ + Rocket rocket = TestRockets.makeBeta(); + + AxialStage boosterStage= (AxialStage)rocket.getChild(1); + + Coordinate expLoc; + Coordinate actLoc; + Coordinate actLocs[]; + { + BodyTube body = (BodyTube)boosterStage.getChild(0); + Coordinate[] bodyLocs = body.getComponentLocations(); + expLoc = new Coordinate(0.27, 0, 0); + assertThat(body.getName()+" not positioned correctly: ", bodyLocs[0], equalTo(expLoc)); + + { + TubeCoupler coupler = (TubeCoupler)body.getChild(0); + actLocs = coupler.getComponentLocations(); + expLoc = new Coordinate(0.255, 0, 0); + assertThat(coupler.getName()+" not positioned correctly: ", actLocs[0], equalTo(expLoc) ); + + FinSet fins = (FinSet)body.getChild(1); + actLocs = fins.getComponentLocations(); + assertThat(fins.getName()+" have incorrect count: ", fins.getInstanceCount(), equalTo(3)); + { // fin #1 + expLoc = new Coordinate(0.28, 0.012, 0); + assertThat(fins.getName()+" not positioned correctly: ", actLocs[0], equalTo(expLoc)); + } + + InnerTube mmt = (InnerTube)body.getChild(2); + actLoc = mmt.getComponentLocations()[0]; + expLoc = new Coordinate(0.285, 0, 0); + assertThat(mmt.getName()+" not positioned correctly: ", actLoc, equalTo( expLoc )); + } + } + } + + @Test + public void testFalcon9HComponentLocations() { + Rocket rocket = TestRockets.makeFalcon9Heavy(); + rocket.setName("TestRocket."+Thread.currentThread().getStackTrace()[1].getMethodName()); + + Coordinate offset; + Coordinate loc; + + // ====== Payload Stage ====== + // ====== ====== ====== ====== + AxialStage payloadStage = (AxialStage)rocket.getChild(0); + { + NoseCone nc = (NoseCone)payloadStage.getChild(0); + offset = nc.getPosition(); + loc = nc.getComponentLocations()[0]; + assertEquals("P/L NoseCone offset is incorrect: ", 0.0, offset.x, EPSILON); + assertEquals("P/L NoseCone location is incorrect: ", 0.0, loc.x, EPSILON); + + BodyTube plbody = (BodyTube)payloadStage.getChild(1); + offset = plbody.getPosition(); + loc = plbody.getComponentLocations()[0]; + assertEquals("P/L Body offset calculated incorrectly: ", 0.118, offset.x, EPSILON); + assertEquals("P/L Body location calculated incorrectly: ", 0.118, loc.x, EPSILON); + + + Transition tr= (Transition)payloadStage.getChild(2); + offset = tr.getPosition(); + loc = tr.getComponentLocations()[0]; + assertEquals(tr.getName()+" offset is incorrect: ", 0.250, offset.x, EPSILON); + assertEquals(tr.getName()+" location is incorrect: ", 0.250, loc.x, EPSILON); + + BodyTube upperBody = (BodyTube)payloadStage.getChild(3); + offset = upperBody.getPosition(); + loc = upperBody.getComponentLocations()[0]; + assertEquals(upperBody.getName()+" offset is incorrect: ", 0.264, offset.x, EPSILON); + assertEquals(upperBody.getName()+" location is incorrect: ", 0.264, loc.x, EPSILON); + { + Parachute chute = (Parachute)payloadStage.getChild(3).getChild(0); + offset = chute.getPosition(); + loc = chute.getComponentLocations()[0]; + assertEquals(chute.getName()+" offset is incorrect: ", 0.0775, offset.x, EPSILON); + assertEquals(chute.getName()+" location is incorrect: ", 0.3415, loc.x, EPSILON); + + ShockCord cord= (ShockCord)payloadStage.getChild(3).getChild(1); + offset = cord.getPosition(); + loc = cord.getComponentLocations()[0]; + assertEquals(cord.getName()+" offset is incorrect: ", 0.155, offset.x, EPSILON); + assertEquals(cord.getName()+" location is incorrect: ", 0.419, loc.x, EPSILON); + } + + BodyTube interstage = (BodyTube)payloadStage.getChild(4); + offset = interstage.getPosition(); + loc = interstage.getComponentLocations()[0]; + assertEquals(interstage.getName()+" offset is incorrect: ", 0.444, offset.x, EPSILON); + assertEquals(interstage.getName()+" location is incorrect: ", 0.444, loc.x, EPSILON); + } + + // ====== Core Stage ====== + // ====== ====== ====== + { + BodyTube coreBody = (BodyTube)rocket.getChild(1).getChild(0); + offset = coreBody.getPosition(); + loc = coreBody.getComponentLocations()[0]; + assertEquals(coreBody.getName()+" offset is incorrect: ", 0.0, offset.x, EPSILON); + assertEquals(coreBody.getName()+" location is incorrect: ", 0.564, loc.x, EPSILON); + + // ====== Booster Set Stage ====== + // ====== ====== ====== + ParallelStage boosters = (ParallelStage) coreBody.getChild(0); + { + assertEquals( RadiusMethod.SURFACE, boosters.getRadiusMethod() ); + assertEquals( AngleMethod.RELATIVE, boosters.getAngleMethod() ); + + Coordinate boosterPosition = boosters.getPosition(); + assertEquals( boosters.getName()+" position is incorrect: ", -0.08, boosterPosition.x, EPSILON); + assertEquals( boosters.getName()+" position is incorrect: ", 0.0, boosterPosition.y, EPSILON); + assertEquals( boosters.getName()+" position is incorrect: ", 0.0, boosterPosition.z, EPSILON); + + Coordinate boosterInstanceOffsets[] = boosters.getInstanceOffsets(); + assertEquals( boosters.getName()+" location is incorrect: ", 0.0, boosterInstanceOffsets[0].x, EPSILON); + assertEquals( boosters.getName()+" location is incorrect: ", 0.077, boosterInstanceOffsets[0].y, EPSILON); + assertEquals( boosters.getName()+" location is incorrect: ", -0.077, boosterInstanceOffsets[1].y, EPSILON); + assertEquals( boosters.getName()+" location is incorrect: ", 0.0, boosterInstanceOffsets[0].z, EPSILON); + + + Coordinate boosterLocations[] = boosters.getComponentLocations(); + assertEquals( boosters.getName()+" location is incorrect: ", 0.484, boosterLocations[0].x, EPSILON); + assertEquals( boosters.getName()+" location is incorrect: ", 0.077, boosterLocations[0].y, EPSILON); + assertEquals( boosters.getName()+" location is incorrect: ", -0.077, boosterLocations[1].y, EPSILON); + assertEquals( boosters.getName()+" location is incorrect: ", 0.0, boosterLocations[0].z, EPSILON); + + // think of the casts as an assert that ( child instanceof NoseCone) == true + NoseCone nose = (NoseCone) boosters.getChild(0); + offset = nose.getPosition(); + loc = nose.getComponentLocations()[0]; + assertEquals(nose.getName()+" offset is incorrect: ", 0.0, offset.x, EPSILON); + assertEquals(nose.getName()+" location is incorrect: ", 0.484, loc.x, EPSILON); + + BodyTube boosterBody= (BodyTube) boosters.getChild(1); + offset = boosterBody.getPosition(); + loc = boosterBody.getComponentLocations()[0]; + assertEquals(boosterBody.getName()+" offset is incorrect: ", 0.08, offset.x, EPSILON); + assertEquals(boosterBody.getName()+" location is incorrect: ", 0.564, loc.x, EPSILON); + { + InnerTube mmt = (InnerTube)boosterBody.getChild(0); + offset = mmt.getPosition(); + loc = mmt.getComponentLocations()[0]; + assertEquals(mmt.getName()+" offset is incorrect: ", 0.65, offset.x, EPSILON); + assertEquals(mmt.getName()+" location is incorrect: ", 1.214, loc.x, EPSILON); + + final FinSet coreFins = (FinSet)boosterBody.getChild(1); + offset = coreFins.getPosition(); + loc = coreFins.getComponentLocations()[0]; + assertEquals(coreFins.getName()+" offset is incorrect: ", 0.480, offset.x, EPSILON); + assertEquals(coreFins.getName()+" location is incorrect: ", 1.044, loc.x, EPSILON); + } + } + + } + } + } diff --git a/core/test/net/sf/openrocket/rocketcomponent/TransitionTest.java b/core/test/net/sf/openrocket/rocketcomponent/TransitionTest.java new file mode 100644 index 0000000000..5e709f0775 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/TransitionTest.java @@ -0,0 +1,173 @@ +package net.sf.openrocket.rocketcomponent; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import org.junit.Test; + +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.TestRockets; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class TransitionTest extends BaseTestCase { + protected final double EPSILON = MathUtil.EPSILON*1000; + + @Test + public void testVerifyConicNose(){ + NoseCone nose = new NoseCone(Transition.Shape.CONICAL, 0.06, 0.01); + assertEquals("nose cone length is wrong ", 0.06, nose.getLength(), EPSILON ); + assertEquals("nose cone fore radius is wrong ", 0.00, nose.getForeRadius(), EPSILON ); + assertEquals("nose cone aft radius is wrong ", 0.01, nose.getAftRadius(), EPSILON ); + assertThat("nose cone shape type is wrong ", Transition.Shape.CONICAL, equalTo(nose.getType())); + assertEquals("nose cone shape parameter is wrong ", 0.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("bad shape - conical forward ", 0.0, nose.getRadius(0.00), EPSILON ); + assertEquals("bad shape - conical forward ", 0.0025, nose.getRadius(0.015), EPSILON ); + assertEquals("bad shape - conical forward ", 0.005, nose.getRadius(0.03), EPSILON ); + assertEquals("bad shape - conical forward ", 0.0075, nose.getRadius(0.045), EPSILON ); + assertEquals("bad shape - conical forward ", 0.01, nose.getRadius(0.06), EPSILON ); + + } + + @Test + public void testVerifyForwardConicTransition(){ + Transition nose = new Transition(); + nose.setType( Transition.Shape.CONICAL); + nose.setForeRadius( 0.5); + nose.setAftRadius( 1.0); + nose.setLength( 5.0); + + assertEquals("nose cone length is wrong ", 5.0, nose.getLength(), EPSILON ); + assertEquals("nose cone fore radius is wrong ", 0.5, nose.getForeRadius(), EPSILON ); + assertEquals("nose cone aft radius is wrong ", 1.0, nose.getAftRadius(), EPSILON ); + assertThat("nose cone shape type is wrong ", Transition.Shape.CONICAL, equalTo(nose.getType())); + assertEquals("nose cone shape parameter is wrong ", 0.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("bad shape - conical forward transition", 0.5, nose.getRadius(0.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.6, nose.getRadius(1.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.7, nose.getRadius(2.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.8, nose.getRadius(3.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.9, nose.getRadius(4.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 1.0, nose.getRadius(5.0), EPSILON ); + + } + + + @Test + public void testVerifyBackwardConicTransition(){ + Transition nose = new Transition(); + nose.setType( Transition.Shape.CONICAL); + nose.setForeRadius( 1.0); + nose.setAftRadius( 0.5); + nose.setLength( 5.0); + + assertEquals("nose cone length is wrong ", 5.0, nose.getLength(), EPSILON ); + assertEquals("nose cone fore radius is wrong ", 1.0, nose.getForeRadius(), EPSILON ); + assertEquals("nose cone aft radius is wrong ", 0.5, nose.getAftRadius(), EPSILON ); + assertThat("nose cone shape type is wrong ", Transition.Shape.CONICAL, equalTo(nose.getType())); + assertEquals("nose cone shape parameter is wrong ", 0.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("bad shape - conical forward transition", 1.0, nose.getRadius(0.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.9, nose.getRadius(1.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.8, nose.getRadius(2.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.7, nose.getRadius(3.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.6, nose.getRadius(4.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.5, nose.getRadius(5.0), EPSILON ); + + } + + + @Test + public void testVerifyOgiveNoseCone(){ + Transition nose = new Transition(); + nose.setType( Transition.Shape.OGIVE); + nose.setForeRadius( 0.0); + nose.setAftRadius( 1.0); + nose.setLength( 8.0); + + assertEquals("nose cone length is wrong ", 8.0, nose.getLength(), EPSILON ); + assertEquals("nose cone fore radius is wrong ", 0.0, nose.getForeRadius(), EPSILON ); + assertEquals("nose cone aft radius is wrong ", 1.0, nose.getAftRadius(), EPSILON ); + assertThat("nose cone shape type is wrong ", Transition.Shape.OGIVE, equalTo(nose.getType())); + assertEquals("nose cone shape parameter is wrong ", 1.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("bad shape - conical forward transition", 0.0, nose.getRadius(0.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.23720214511, nose.getRadius(1.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.44135250736, nose.getRadius(2.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.61308144666, nose.getRadius(3.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.75290684574, nose.getRadius(4.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.86124225056, nose.getRadius(5.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.93840316661, nose.getRadius(6.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.98461174156, nose.getRadius(7.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 1.0, nose.getRadius(8.0), EPSILON ); + + } + + @Test + public void testVerifyForwardOgiveTransition(){ + Transition nose = new Transition(); + nose.setType( Transition.Shape.OGIVE); + nose.setForeRadius( 0.44135); + nose.setAftRadius( 1.0); + nose.setLength( 6.0); + + assertEquals("nose cone length is wrong ", 6.0, nose.getLength(), EPSILON ); + assertEquals("nose cone fore radius is wrong ", 0.44135, nose.getForeRadius(), EPSILON ); + assertEquals("nose cone aft radius is wrong ", 1.0, nose.getAftRadius(), EPSILON ); + assertThat("nose cone shape type is wrong ", Transition.Shape.OGIVE, equalTo(nose.getType())); + assertEquals("nose cone shape parameter is wrong ", 1.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("bad shape - conical forward transition", 0.44135250736, nose.getRadius(0.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.61308144666, nose.getRadius(1.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.75290684574, nose.getRadius(2.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.86124225056, nose.getRadius(3.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.93840316661, nose.getRadius(4.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.98461174156, nose.getRadius(5.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 1.0, nose.getRadius(6.0), EPSILON ); + + } + + @Test + public void testVerifyBackwardOgiveTransition(){ + Transition nose = new Transition(); + nose.setType( Transition.Shape.OGIVE); + nose.setForeRadius( 1.0); + nose.setAftRadius( 0.44135); + nose.setLength( 6.0); + + assertEquals("nose cone length is wrong ", 6.0, nose.getLength(), EPSILON ); + assertEquals("nose cone fore radius is wrong ", 1.0, nose.getForeRadius(), EPSILON ); + assertEquals("nose cone aft radius is wrong ", 0.44135, nose.getAftRadius(), EPSILON ); + assertThat("nose cone shape type is wrong ", Transition.Shape.OGIVE, equalTo(nose.getType())); + assertEquals("nose cone shape parameter is wrong ",1.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("bad shape - conical forward transition", 1.0, nose.getRadius(0.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.98461174156, nose.getRadius(1.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.93840316661, nose.getRadius(2.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.86124225056, nose.getRadius(3.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.75290684574, nose.getRadius(4.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.61308144666, nose.getRadius(5.0), EPSILON ); + assertEquals("bad shape - conical forward transition", 0.44135250736, nose.getRadius(6.0), EPSILON ); + + + + } + + @Test + public void testStockIntegration(){ + Rocket rocket = TestRockets.makeEstesAlphaIII(); + NoseCone nose = (NoseCone)rocket.getChild(0).getChild(0); + + assertEquals("Alpha3 nose cone length is wrong ", 0.07, nose.getLength(), EPSILON ); + assertEquals("Alpha3 nose cone fore radius is wrong ", 0.00, nose.getForeRadius(), EPSILON ); + assertEquals("Alpha3 nose cone aft radius is wrong ", 0.012, nose.getAftRadius(), EPSILON ); + assertThat("Alpha3 nose cone shape type is wrong ", Transition.Shape.OGIVE, equalTo(nose.getType())); + assertEquals("Alpha3 nose cone shape parameter is wrong ", 1.0, nose.getShapeParameter(), EPSILON ); + + assertEquals("Alpha3 nose cone aft shoulder length is wrong ", 0.02, nose.getAftShoulderLength(), EPSILON ); + assertEquals("Alpha3 nose cone aft shoulder radius is wrong ", 0.011, nose.getAftShoulderRadius(), EPSILON ); + + } + +} diff --git a/core/test/net/sf/openrocket/rocketcomponent/TrapezoidFinSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/TrapezoidFinSetTest.java new file mode 100644 index 0000000000..ae2635a764 --- /dev/null +++ b/core/test/net/sf/openrocket/rocketcomponent/TrapezoidFinSetTest.java @@ -0,0 +1,368 @@ +package net.sf.openrocket.rocketcomponent; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import net.sf.openrocket.material.Material; +import net.sf.openrocket.rocketcomponent.position.*; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class TrapezoidFinSetTest extends BaseTestCase { + + private static final double EPSILON = 1E-8; + + private Rocket createSimpleTrapezoidalFin() { + final Rocket rkt = new Rocket(); + final AxialStage stg = new AxialStage(); + rkt.addChild(stg); + BodyTube body = new BodyTube(0.2, 0.1); + stg.addChild(body); + TrapezoidFinSet fins = new TrapezoidFinSet(1, 0.06, 0.02, 0.02, 0.05); + // + // sweep= 0.02 | tipChord = 0.02 + // | | | + // | +------+ ---------- + // | / \ + // | / \ height = 0.05 + // | / \ + // / \ + // __________/________________\_____ length == rootChord == 0.06 + // | | + // | | tab height = 0.02 + // | | + // +--------+ tab length = 0.02 + // position = 0.0 via middle + // + // Fin Area = 0.05 * ( (0.2 + 0.06)/2) = 0.0 + // + fins.setAxialOffset(AxialMethod.MIDDLE, 0.0); + fins.setMaterial(Material.newMaterial(Material.Type.BULK, "Fin-Test-Material", 1.0, true)); + fins.setThickness(0.005); // == 5 mm + + body.addChild(fins); + + fins.setTabLength(0.00); + + fins.setFilletRadius(0.0); + + rkt.enableEvents(); + return rkt; + } + + @Test + public void testMultiplicity() { + final TrapezoidFinSet trapFins = new TrapezoidFinSet(); + assertEquals(1, trapFins.getFinCount()); + } + + @Test + public void testGenerateTrapezoidalPoints() { + final Rocket rkt = createSimpleTrapezoidalFin(); + FinSet fins = (FinSet) rkt.getChild(0).getChild(0).getChild(0); + + // Fin length = 0.05 + // Tab Length = 0.01 + // +--+ + // / \ + // / \ + // +---+--------+---+ + // + Coordinate[] actPoints = fins.getFinPoints(); + + Coordinate[] expPoints = { new Coordinate(0.00, 0.0), + new Coordinate(0.02, 0.05), + new Coordinate(0.04, 0.05), + new Coordinate(0.06, 0.0), + new Coordinate(0.00, 0.0) }; + + for (int index = 0; index < actPoints.length; ++index) { + assertEquals(" generated fin point [" + index + "] doesn't match! ", expPoints[index].x, actPoints[index].x, EPSILON); + assertEquals(" generated fin point [" + index + "] doesn't match!", expPoints[index].x, actPoints[index].x, EPSILON); + assertEquals(" generated fin point [" + index + "] doesn't match!", expPoints[index].x, actPoints[index].x, EPSILON); + } + } + + @Test + public void testCGCalculation_simpleSquareFin() { + final Rocket rkt = createSimpleTrapezoidalFin(); + final TrapezoidFinSet fins = (TrapezoidFinSet)rkt.getChild(0).getChild(0).getChild(0); + + // This is a simple square fin with sides of 0.1. + fins.setFinShape(0.1, 0.1, 0.0, 0.1, .005); + + // should return a single-fin-planform area + assertEquals("area calculation doesn't match: ", 0.01, fins.getPlanformArea(), 0.00001); + + final double expSingleMass = 0.00005; + final Coordinate singleCG = fins.getComponentCG(); + assertEquals("Fin mass is wrong! ", expSingleMass, singleCG.weight, EPSILON); + assertEquals("Centroid x coordinate is wrong! ", 0.05, singleCG.x, EPSILON); + assertEquals("Centroid y coordinate is wrong! ", 0.15, singleCG.y, EPSILON); + + // should still return a single-fin-wetted area + assertEquals(0.00005, fins.getComponentVolume(), 0.0000001); + + { // test instancing code + // this should also trigger a recalculation + fins.setFinCount(2); + + // should still return a single-fin-planform area + assertEquals(0.01, fins.getPlanformArea(), 0.00001); + + Coordinate doubleCG = fins.getComponentCG(); + final double expDoubleMass = expSingleMass*2; + assertEquals("Fin x2 mass does not change from single fin instance! ", expDoubleMass, doubleCG.weight, EPSILON); + assertEquals(0.05, doubleCG.x, EPSILON); + assertEquals(0.0, doubleCG.y, EPSILON); + } + } + + + @Test + public void testCGCalculations_finWithTab() throws IllegalFinPointException { + final Rocket rkt = createSimpleTrapezoidalFin(); + FinSet fins = (FinSet) rkt.getChild(0).getChild(0).getChild(0); + + fins.setTabLength(0.02); + fins.setTabHeight(0.02); + fins.setTabOffsetMethod(AxialMethod.MIDDLE); + fins.setTabOffset(0.0); + + assertEquals("Wetted Area does not match!", 0.0020, fins.getPlanformArea(), EPSILON); + + final double expVol1 = 0.00001200; + final double actVol1 = fins.getComponentVolume(); + assertEquals(" fin volume is incorrect", expVol1, actVol1, EPSILON); + + Coordinate actCentroid1 = fins.getCG(); + assertEquals(" basic centroid x doesn't match: ", 0.03000, actCentroid1.x, EPSILON); + assertEquals(" basic centroid y doesn't match: ", 0.11569444, actCentroid1.y, EPSILON); + + { + fins.setFinCount(2); + final double expVol2 = expVol1 * 2; + final double actVol2 = fins.getComponentVolume(); + assertEquals(" fin volume is incorrect", expVol2, actVol2, EPSILON); + + Coordinate actCentroid2 = fins.getCG(); + // x coordinate will be the same.... + assertEquals(" basic centroid y doesn't match: ", 0.0, actCentroid2.y, EPSILON); + } + } + + + @Test + public void testFilletCalculations() { + final Rocket rkt = createSimpleTrapezoidalFin(); + BodyTube body = (BodyTube) rkt.getChild(0).getChild(0); + FinSet fins = (FinSet) rkt.getChild(0).getChild(0).getChild(0); + + fins.setFilletRadius(0.005); + fins.setFilletMaterial(Material.newMaterial(Material.Type.BULK, "Fillet-Test-Material", 1.0, true)); + + // used for fillet and edge calculations: + // + // [1] +--+ [2] + // / \ + // / \ + // [0] +--------+ [3] + // + assertEquals(0.06, fins.getLength(), EPSILON); + assertEquals("Body radius doesn't match: ", 0.1, body.getOuterRadius(), EPSILON); + + final Coordinate actVolume = fins.calculateFilletVolumeCentroid(); + + assertEquals("Fin volume doesn't match: ", 5.973e-07, actVolume.weight, EPSILON); + assertEquals("Fin mass center.x doesn't match: ", 0.03, actVolume.x, EPSILON); + assertEquals("Fin mass center.y doesn't match: ", 0.101, actVolume.y, EPSILON); + + + { // and then, check that the fillet volume feeds into a correct overall CG: + Coordinate actCentroid = fins.getCG(); + assertEquals("Complete centroid x doesn't match: ", 0.03000, actCentroid.x, EPSILON); + assertEquals("Complete centroid y doesn't match: ", 0.11971548, actCentroid.y, EPSILON); + } + } + + @Test + public void testTrapezoidCGComputation() { + { + // This is a simple square fin with sides of 1.0. + TrapezoidFinSet fins = new TrapezoidFinSet(); + fins.setFinCount(1); + fins.setFinShape(1.0, 1.0, 0.0, 1.0, .005); + + Coordinate coords = fins.getCG(); + assertEquals(1.0, fins.getPlanformArea(), 0.001); + assertEquals(0.5, coords.x, 0.001); + assertEquals(0.5, coords.y, 0.001); + }{ + // This is a trapezoid. Height 1, root 1, tip 1/2 no sweep. + // It can be decomposed into a rectangle followed by a triangle + // +---+ + // | \ + // | \ + // +------+ + TrapezoidFinSet fins = new TrapezoidFinSet(); + fins.setFinCount(1); + fins.setFinShape(1.0, 0.5, 0.0, 1.0, .005); + + Coordinate coords = fins.getCG(); + assertEquals(0.75, fins.getPlanformArea(), 0.001); + assertEquals(0.3889, coords.x, 0.001); + assertEquals(0.4444, coords.y, 0.001); + } + } + + @Test + public void testGetBodyPoints_phantomMount() { + final Rocket rkt = createSimpleTrapezoidalFin(); + + // set mount to have zero-dimensions: + final BodyTube mount = (BodyTube)rkt.getChild(0).getChild(0); + mount.setLength(0.0); + mount.setOuterRadius(0.0); + assertEquals( 0, mount.getLength(), 0.00001); + assertEquals( 0, mount.getOuterRadius(), 0.00001); + assertEquals( 0, mount.getInnerRadius(), 0.00001); + + final TrapezoidFinSet fins = (TrapezoidFinSet)mount.getChild(0); + final Coordinate[] mountPoints = fins.getMountPoints(); + + assertEquals(2, mountPoints.length ); + assertEquals( 0.00, mountPoints[0].x, 0.00001); + assertEquals( 0.00, mountPoints[0].y, 0.00001); + assertEquals( 0.00, mountPoints[1].x, 0.00001); + assertEquals( 0.00, mountPoints[1].y, 0.00001); + } + + @Test + public void testGetBodyPoints_zeroLengthMount() { + final Rocket rkt = createSimpleTrapezoidalFin(); + + // set mount to have zero-dimensions: + final BodyTube mount = (BodyTube)rkt.getChild(0).getChild(0); + mount.setLength(0.0); + mount.setOuterRadius(0.1); + mount.setInnerRadius(0.08); + assertEquals( 0, mount.getLength(), 0.00001); + assertEquals( 0.1, mount.getOuterRadius(), 0.00001); + assertEquals( 0.08, mount.getInnerRadius(), 0.00001); + + final TrapezoidFinSet fins = (TrapezoidFinSet)mount.getChild(0); + final Coordinate[] mountPoints = fins.getMountPoints(); + + assertEquals(2, mountPoints.length ); + assertEquals( 0.0, mountPoints[0].x, 0.00001); + assertEquals( 0.1, mountPoints[0].y, 0.00001); + assertEquals( 0.0, mountPoints[1].x, 0.00001); + assertEquals( 0.1, mountPoints[1].y, 0.00001); + } + + @Test + public void testTrapezoidCGComputation_phantomMount() { + final Rocket rkt = createSimpleTrapezoidalFin(); + + // set mount to have zero-dimensions: + final BodyTube mount = (BodyTube)rkt.getChild(0).getChild(0); + mount.setLength(0.0); + mount.setOuterRadius(0.0); + + assertEquals( 0, mount.getLength(), 0.00001); + assertEquals( 0, mount.getOuterRadius(), 0.00001); + assertEquals( 0, mount.getInnerRadius(), 0.00001); + + final TrapezoidFinSet fins = (TrapezoidFinSet)mount.getChild(0); + + assertEquals( 0.06, fins.getLength(), 0.00001); + assertEquals( 0.05, fins.getHeight(), 0.00001); + assertEquals( 0.06, fins.getRootChord(), 0.00001); + assertEquals( 0.02, fins.getTipChord(), 0.00001); + + final Coordinate coords = fins.getCG(); + assertEquals(0.002, fins.getPlanformArea(), 0.001); + assertEquals(0.03, coords.x, 0.001); + assertEquals(0.02, coords.y, 0.001); + } + + @Test + public void testInstancePoints_PI_2_BaseRotation() { + // This is a simple square fin with sides of 1.0. + TrapezoidFinSet fins = new TrapezoidFinSet(); + fins.setFinCount(4); + fins.setFinShape(1.0, 1.0, 0.0, 1.0, .005); + fins.setBaseRotation( Math.PI/2 ); + + BodyTube body = new BodyTube(1.0, 0.05 ); + body.addChild( fins ); + + Coordinate[] points = fins.getInstanceOffsets(); + + assertEquals( 0, points[0].x, 0.00001); + assertEquals( 0, points[0].y, 0.00001); + assertEquals( 0.05, points[0].z, 0.00001); + + assertEquals( 0, points[1].x, 0.00001); + assertEquals( -0.05, points[1].y, 0.00001); + assertEquals( 0, points[1].z, 0.00001); + } + + @Test + public void testInstancePoints_PI_4_BaseRotation() { + // This is a simple square fin with sides of 1.0. + TrapezoidFinSet fins = new TrapezoidFinSet(); + fins.setFinCount(4); + fins.setFinShape(1.0, 1.0, 0.0, 1.0, .005); + fins.setBaseRotation( Math.PI/4 ); + + BodyTube body = new BodyTube(1.0, 0.05 ); + body.addChild( fins ); + + Coordinate[] points = fins.getInstanceOffsets(); + + assertEquals( 0, points[0].x, 0.0001); + assertEquals( 0.03535, points[0].y, 0.0001); + assertEquals( 0.03535, points[0].z, 0.0001); + + assertEquals( 0, points[1].x, 0.0001); + assertEquals( -0.03535, points[1].y, 0.0001); + assertEquals( 0.03535, points[1].z, 0.0001); + } + + + @Test + public void testInstanceAngles_zeroBaseRotation() { + // This is a simple square fin with sides of 1.0. + TrapezoidFinSet fins = new TrapezoidFinSet(); + fins.setFinCount(4); + fins.setFinShape(1.0, 1.0, 0.0, 1.0, .005); + fins.setBaseRotation( 0.0 ); + + double[] angles = fins.getInstanceAngles(); + + assertEquals( angles[0], 0, 0.000001 ); + assertEquals( angles[1], Math.PI/2, 0.000001 ); + assertEquals( angles[2], Math.PI, 0.000001 ); + assertEquals( angles[3], 1.5*Math.PI, 0.000001 ); + } + + @Test + public void testInstanceAngles_90_BaseRotation() { + // This is a simple square fin with sides of 1.0. + TrapezoidFinSet fins = new TrapezoidFinSet(); + fins.setFinCount(4); + fins.setFinShape(1.0, 1.0, 0.0, 1.0, .005); + fins.setBaseRotation( Math.PI/2 ); + + double[] angles = fins.getInstanceAngles(); + + assertEquals( angles[0], Math.PI/2, 0.000001 ); + assertEquals( angles[1], Math.PI, 0.000001 ); + assertEquals( angles[2], 1.5*Math.PI, 0.000001 ); + assertEquals( angles[3], 0, 0.000001 ); + } + +} diff --git a/core/test/net/sf/openrocket/thrustcurve/SampleSearchResponse.xml b/core/test/net/sf/openrocket/thrustcurve/SampleSearchResponse.xml new file mode 100644 index 0000000000..5fe7b95ffd --- /dev/null +++ b/core/test/net/sf/openrocket/thrustcurve/SampleSearchResponse.xml @@ -0,0 +1,6387 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<search-response xmlns="http://www.thrustcurve.org/2015/SearchResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.thrustcurve.org/2015/SearchResponse http://www.thrustcurve.org/2015/search-response.xsd"> + <criteria> + <criterion> + <name>manufacturer</name> + <value>AeroTech</value> + <matches>252</matches> + </criterion> + <matches>252</matches> + </criteria> + <results> + <result> + <motor-id>1036</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>C3.4T</designation> + <brand-name>C3.4</brand-name> + <common-name>C3</common-name> + <impulse-class>C</impulse-class> + <diameter>18.0</diameter> + <length>72.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>3.14</avg-thrust-n> + <max-thrust-n>9.08</max-thrust-n> + <tot-impulse-ns>8.96</tot-impulse-ns> + <burn-time-s>2.86</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1036</info-url> + <total-weight-g>23.9</total-weight-g> + <prop-weight-g>5.2</prop-weight-g> + <delays>P</delays> + <case-info>RMS-R/C-18/70</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>739</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D10W</designation> + <brand-name>D10</brand-name> + <common-name>D10</common-name> + <impulse-class>D</impulse-class> + <diameter>18.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>13.39</avg-thrust-n> + <max-thrust-n>25.13</max-thrust-n> + <tot-impulse-ns>18.75</tot-impulse-ns> + <burn-time-s>1.4</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=739</info-url> + <total-weight-g>25.9</total-weight-g> + <prop-weight-g>9.8</prop-weight-g> + <delays>3,5,7</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>33</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D13W</designation> + <brand-name>D13</brand-name> + <common-name>D13</common-name> + <impulse-class>D</impulse-class> + <diameter>18.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>12.67</avg-thrust-n> + <max-thrust-n>23.61</max-thrust-n> + <tot-impulse-ns>19.26</tot-impulse-ns> + <burn-time-s>1.52</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=33</info-url> + <prop-weight-g>9.8</prop-weight-g> + <delays>4,7,10</delays> + <case-info>RMS-R/C-18/70</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>34</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D15T</designation> + <brand-name>D15</brand-name> + <common-name>D15</common-name> + <impulse-class>D</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>16.49</avg-thrust-n> + <max-thrust-n>31.36</max-thrust-n> + <tot-impulse-ns>18.96</tot-impulse-ns> + <burn-time-s>1.15</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=34</info-url> + <prop-weight-g>8.9</prop-weight-g> + <delays>4,7</delays> + <case-info>RMS-24/40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1037</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D2.3T</designation> + <brand-name>D2.3</brand-name> + <common-name>D2</common-name> + <impulse-class>D</impulse-class> + <diameter>18.0</diameter> + <length>72.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>2.12</avg-thrust-n> + <max-thrust-n>10.14</max-thrust-n> + <tot-impulse-ns>17.21</tot-impulse-ns> + <burn-time-s>8.14</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1037</info-url> + <total-weight-g>29.3</total-weight-g> + <prop-weight-g>10.7</prop-weight-g> + <delays>P</delays> + <case-info>RMS-R/C-18/70</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>35</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D21T</designation> + <brand-name>D21</brand-name> + <common-name>D21</common-name> + <impulse-class>D</impulse-class> + <diameter>18.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>20.84</avg-thrust-n> + <max-thrust-n>32.12</max-thrust-n> + <tot-impulse-ns>19.59</tot-impulse-ns> + <burn-time-s>0.94</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=35</info-url> + <prop-weight-g>9.6</prop-weight-g> + <delays>4,7</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>36</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D24T</designation> + <brand-name>D24</brand-name> + <common-name>D24</common-name> + <impulse-class>D</impulse-class> + <diameter>18.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>14.77</avg-thrust-n> + <max-thrust-n>25.52</max-thrust-n> + <tot-impulse-ns>18.02</tot-impulse-ns> + <burn-time-s>1.22</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=36</info-url> + <total-weight-g>32.0</total-weight-g> + <prop-weight-g>8.7</prop-weight-g> + <delays>4,7,10</delays> + <case-info>RMS-R/C-18/70</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>28</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D7-RCT</designation> + <brand-name>D7</brand-name> + <common-name>D7</common-name> + <impulse-class>D</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>6.46</avg-thrust-n> + <max-thrust-n>10.99</max-thrust-n> + <tot-impulse-ns>18.53</tot-impulse-ns> + <burn-time-s>2.87</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=28</info-url> + <prop-weight-g>10.5</prop-weight-g> + <case-info>RMS-R/C-24/20-40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>29</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>D9W</designation> + <brand-name>D9</brand-name> + <common-name>D9</common-name> + <impulse-class>D</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>9.98</avg-thrust-n> + <max-thrust-n>20.0</max-thrust-n> + <tot-impulse-ns>18.76</tot-impulse-ns> + <burn-time-s>1.88</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=29</info-url> + <prop-weight-g>10.1</prop-weight-g> + <delays>4,7</delays> + <case-info>RMS-24/40</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>505</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E11J</designation> + <brand-name>E11J</brand-name> + <common-name>E11</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>11.5689045936396</avg-thrust-n> + <max-thrust-n>19.85</max-thrust-n> + <tot-impulse-ns>32.74</tot-impulse-ns> + <burn-time-s>2.83</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=505</info-url> + <total-weight-g>62.4</total-weight-g> + <prop-weight-g>25.0</prop-weight-g> + <delays>3</delays> + <case-info>RMS-24/40</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>44</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E12-RCJ</designation> + <brand-name>E12J</brand-name> + <common-name>E12</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>11.22</avg-thrust-n> + <max-thrust-n>18.33</max-thrust-n> + <tot-impulse-ns>34.22</tot-impulse-ns> + <burn-time-s>3.05</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=44</info-url> + <prop-weight-g>30.3</prop-weight-g> + <case-info>RMS-R/C-24/20-40</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>45</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E15W</designation> + <brand-name>E15</brand-name> + <common-name>E15</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>15.0</avg-thrust-n> + <tot-impulse-ns>40.0</tot-impulse-ns> + <burn-time-s>2.66666666666667</burn-time-s> + <data-files>3</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=45</info-url> + <prop-weight-g>20.1</prop-weight-g> + <delays>4,7,P</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>48</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E16W</designation> + <brand-name>E16</brand-name> + <common-name>E16</common-name> + <impulse-class>E</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>18.84</avg-thrust-n> + <max-thrust-n>37.2</max-thrust-n> + <tot-impulse-ns>37.67</tot-impulse-ns> + <burn-time-s>2.0</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=48</info-url> + <prop-weight-g>19.0</prop-weight-g> + <delays>4,7</delays> + <case-info>RMS-29/40</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>49</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E18W</designation> + <brand-name>E18</brand-name> + <common-name>E18</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>17.07</avg-thrust-n> + <max-thrust-n>30.08</max-thrust-n> + <tot-impulse-ns>36.54</tot-impulse-ns> + <burn-time-s>2.14</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=49</info-url> + <prop-weight-g>20.7</prop-weight-g> + <delays>4,7</delays> + <case-info>RMS-24/40</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>782</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E20W</designation> + <brand-name>E20W</brand-name> + <common-name>E20</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>21.8</avg-thrust-n> + <max-thrust-n>34.9</max-thrust-n> + <tot-impulse-ns>35.0</tot-impulse-ns> + <burn-time-s>1.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=782</info-url> + <total-weight-g>49.0</total-weight-g> + <prop-weight-g>16.2</prop-weight-g> + <delays>4,7</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>50</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E23T</designation> + <brand-name>E23</brand-name> + <common-name>E23</common-name> + <impulse-class>E</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>22.5</avg-thrust-n> + <max-thrust-n>38.22</max-thrust-n> + <tot-impulse-ns>35.32</tot-impulse-ns> + <burn-time-s>1.57</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=50</info-url> + <prop-weight-g>17.4</prop-weight-g> + <delays>5,8</delays> + <case-info>RMS-29/40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>51</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E28T</designation> + <brand-name>E28</brand-name> + <common-name>E28</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>32.53</avg-thrust-n> + <max-thrust-n>50.52</max-thrust-n> + <tot-impulse-ns>39.69</tot-impulse-ns> + <burn-time-s>1.22</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=51</info-url> + <prop-weight-g>18.4</prop-weight-g> + <delays>4,7</delays> + <case-info>RMS-24/40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>52</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E30T</designation> + <brand-name>E30</brand-name> + <common-name>E30</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>32.38</avg-thrust-n> + <max-thrust-n>48.27</max-thrust-n> + <tot-impulse-ns>39.51</tot-impulse-ns> + <burn-time-s>1.22</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=52</info-url> + <prop-weight-g>19.3</prop-weight-g> + <delays>4,7</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>37</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E6</designation> + <brand-name>E6</brand-name> + <common-name>E6</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>6.0</avg-thrust-n> + <tot-impulse-ns>40.0</tot-impulse-ns> + <burn-time-s>6.66666666666667</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=37</info-url> + <prop-weight-g>21.5</prop-weight-g> + <delays>4,6,8,P</delays> + <case-info>RMS 24/20-40 R/C</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>38</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E6-RCT</designation> + <brand-name>E6-RC</brand-name> + <common-name>E6</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>5.27</avg-thrust-n> + <max-thrust-n>11.9</max-thrust-n> + <tot-impulse-ns>37.5</tot-impulse-ns> + <burn-time-s>7.12</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=38</info-url> + <total-weight-g>50.0</total-weight-g> + <prop-weight-g>21.5</prop-weight-g> + <case-info>RMS-R/C-24/20-40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>39</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>E7-RCT</designation> + <brand-name>E7</brand-name> + <common-name>E7</common-name> + <impulse-class>E</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>5.41</avg-thrust-n> + <max-thrust-n>11.58</max-thrust-n> + <tot-impulse-ns>29.35</tot-impulse-ns> + <burn-time-s>5.43</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=39</info-url> + <prop-weight-g>17.1</prop-weight-g> + <case-info>RMS-R/C-24/20-40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>53</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F10</designation> + <brand-name>F10</brand-name> + <common-name>F10</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>85.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>10.71</avg-thrust-n> + <max-thrust-n>28.22</max-thrust-n> + <tot-impulse-ns>76.33</tot-impulse-ns> + <burn-time-s>7.13</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=53</info-url> + <prop-weight-g>40.7</prop-weight-g> + <delays>4,6,8</delays> + <case-info>SU 29x85</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>54</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F12J</designation> + <brand-name>F12</brand-name> + <common-name>F12</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>14.74</avg-thrust-n> + <max-thrust-n>23.54</max-thrust-n> + <tot-impulse-ns>43.2</tot-impulse-ns> + <burn-time-s>2.93</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=54</info-url> + <prop-weight-g>30.3</prop-weight-g> + <delays>3,5</delays> + <case-info>RMS-24/40</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>55</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F13-RCT</designation> + <brand-name>F13-RC</brand-name> + <common-name>F13</common-name> + <impulse-class>F</impulse-class> + <diameter>32.0</diameter> + <length>107.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>12.17</avg-thrust-n> + <max-thrust-n>19.98</max-thrust-n> + <tot-impulse-ns>62.07</tot-impulse-ns> + <burn-time-s>5.1</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=55</info-url> + <prop-weight-g>32.3</prop-weight-g> + <case-info>RMS-R/C-32/60-100</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>56</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F16-RCJ</designation> + <brand-name>F16-RC</brand-name> + <common-name>F16</common-name> + <impulse-class>F</impulse-class> + <diameter>32.0</diameter> + <length>107.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>13.27</avg-thrust-n> + <max-thrust-n>26.35</max-thrust-n> + <tot-impulse-ns>75.48</tot-impulse-ns> + <burn-time-s>5.69</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=56</info-url> + <prop-weight-g>62.5</prop-weight-g> + <case-info>RMS-R/C-32/60-100</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>57</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F20W/L</designation> + <brand-name>F20</brand-name> + <common-name>F20</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>83.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>20.8</avg-thrust-n> + <max-thrust-n>40.33</max-thrust-n> + <tot-impulse-ns>51.75</tot-impulse-ns> + <burn-time-s>2.49</burn-time-s> + <data-files>3</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=57</info-url> + <total-weight-g>80.2</total-weight-g> + <prop-weight-g>30.0</prop-weight-g> + <delays>4,7</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-09-23</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>58</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F21W</designation> + <brand-name>F21W</brand-name> + <common-name>F21</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>95.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>21.0</avg-thrust-n> + <max-thrust-n>42.0</max-thrust-n> + <tot-impulse-ns>55.0</tot-impulse-ns> + <burn-time-s>2.5</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=58</info-url> + <total-weight-g>64.0</total-weight-g> + <prop-weight-g>30.0</prop-weight-g> + <delays>4,6,8</delays> + <case-info>SU 24x95</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>59</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F22J</designation> + <brand-name>F22</brand-name> + <common-name>F22</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>19.64</avg-thrust-n> + <max-thrust-n>31.15</max-thrust-n> + <tot-impulse-ns>65.0</tot-impulse-ns> + <burn-time-s>3.31</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=59</info-url> + <prop-weight-g>46.3</prop-weight-g> + <delays>5,7</delays> + <case-info>RMS-29/40</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>61</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F23-RCW-SK</designation> + <brand-name>F23-RC-SK</brand-name> + <common-name>F23</common-name> + <impulse-class>F</impulse-class> + <diameter>32.0</diameter> + <length>107.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>23.0</avg-thrust-n> + <tot-impulse-ns>70.0</tot-impulse-ns> + <burn-time-s>3.47</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=61</info-url> + <prop-weight-g>37.8</prop-weight-g> + <case-info>RMS-R/C-32/60-100</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>60</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F23FJ/L</designation> + <brand-name>F23FJ</brand-name> + <common-name>F23</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>83.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>18.58</avg-thrust-n> + <max-thrust-n>29.8</max-thrust-n> + <tot-impulse-ns>41.2</tot-impulse-ns> + <burn-time-s>2.21</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=60</info-url> + <total-weight-g>82.3</total-weight-g> + <prop-weight-g>30.0</prop-weight-g> + <delays>4,7</delays> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>63</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F24W</designation> + <brand-name>F24</brand-name> + <common-name>F24</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>22.21</avg-thrust-n> + <max-thrust-n>40.95</max-thrust-n> + <tot-impulse-ns>47.31</tot-impulse-ns> + <burn-time-s>2.13</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=63</info-url> + <prop-weight-g>19.0</prop-weight-g> + <delays>4,7</delays> + <case-info>RMS-24/40</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>64</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F25W</designation> + <brand-name>F25W</brand-name> + <common-name>F25</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>98.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>25.55</avg-thrust-n> + <max-thrust-n>46.79</max-thrust-n> + <tot-impulse-ns>77.92</tot-impulse-ns> + <burn-time-s>3.05</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=64</info-url> + <prop-weight-g>35.6</prop-weight-g> + <delays>4,6,9</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>65</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F26FJ</designation> + <brand-name>F26FJ</brand-name> + <common-name>F26</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>98.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>26.0</avg-thrust-n> + <tot-impulse-ns>62.2</tot-impulse-ns> + <burn-time-s>2.39230769230769</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=65</info-url> + <prop-weight-g>43.1</prop-weight-g> + <delays>6,9</delays> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>468</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F27R/L</designation> + <brand-name>F27R</brand-name> + <common-name>F27</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>83.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>24.4</avg-thrust-n> + <max-thrust-n>37.7</max-thrust-n> + <tot-impulse-ns>49.6</tot-impulse-ns> + <burn-time-s>2.03</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=468</info-url> + <prop-weight-g>28.4</prop-weight-g> + <delays>4,8</delays> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>944</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F30FJ</designation> + <brand-name>F30FJ</brand-name> + <common-name>F30</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>95.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>30.4</avg-thrust-n> + <max-thrust-n>40.6</max-thrust-n> + <tot-impulse-ns>47.0</tot-impulse-ns> + <burn-time-s>1.54605263157895</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=944</info-url> + <prop-weight-g>31.2</prop-weight-g> + <delays>4,6,8</delays> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>593</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F32T</designation> + <brand-name>F32T</brand-name> + <common-name>F32</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>95.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>34.1</avg-thrust-n> + <max-thrust-n>61.3</max-thrust-n> + <tot-impulse-ns>56.9</tot-impulse-ns> + <burn-time-s>1.659</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=593</info-url> + <total-weight-g>64.0</total-weight-g> + <prop-weight-g>31.0</prop-weight-g> + <delays>4,6,8</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>66</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F32W</designation> + <brand-name>F32W</brand-name> + <common-name>F32</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>95.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>29.12</avg-thrust-n> + <max-thrust-n>55.64</max-thrust-n> + <tot-impulse-ns>79.2</tot-impulse-ns> + <burn-time-s>2.72</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=66</info-url> + <prop-weight-g>37.7</prop-weight-g> + <delays>5,10,15</delays> + <case-info>SU 24x95</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>559</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F35W</designation> + <brand-name>F35W</brand-name> + <common-name>F35</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>95.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>34.9</avg-thrust-n> + <max-thrust-n>55.2</max-thrust-n> + <tot-impulse-ns>57.1</tot-impulse-ns> + <burn-time-s>1.63</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=559</info-url> + <total-weight-g>85.0</total-weight-g> + <prop-weight-g>30.0</prop-weight-g> + <delays>5,8,11</delays> + <case-info>RMS-24/60</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>69</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F37W</designation> + <brand-name>F37</brand-name> + <common-name>F37</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>99.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>31.67</avg-thrust-n> + <max-thrust-n>46.47</max-thrust-n> + <tot-impulse-ns>50.67</tot-impulse-ns> + <burn-time-s>1.6</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=69</info-url> + <prop-weight-g>28.2</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/60</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>70</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F39T</designation> + <brand-name>F39</brand-name> + <common-name>F39</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>37.34</avg-thrust-n> + <max-thrust-n>59.47</max-thrust-n> + <tot-impulse-ns>49.66</tot-impulse-ns> + <burn-time-s>1.33</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=70</info-url> + <prop-weight-g>22.7</prop-weight-g> + <delays>6,9</delays> + <case-info>RMS-24/40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>71</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F40W</designation> + <brand-name>F40</brand-name> + <common-name>F40</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>37.91</avg-thrust-n> + <max-thrust-n>68.07</max-thrust-n> + <tot-impulse-ns>78.09</tot-impulse-ns> + <burn-time-s>2.06</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=71</info-url> + <prop-weight-g>40.0</prop-weight-g> + <delays>4,7,10</delays> + <case-info>RMS-29/40</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>72</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F42T/L</designation> + <brand-name>F42T</brand-name> + <common-name>F42</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>83.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>42.0</avg-thrust-n> + <tot-impulse-ns>52.9</tot-impulse-ns> + <burn-time-s>1.25952380952381</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=72</info-url> + <prop-weight-g>27.0</prop-weight-g> + <delays>4,8</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1023</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F44W</designation> + <brand-name>AT</brand-name> + <common-name>F44</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>70.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>44.0</avg-thrust-n> + <max-thrust-n>50.0</max-thrust-n> + <tot-impulse-ns>41.5</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1023</info-url> + <total-weight-g>48.0</total-weight-g> + <prop-weight-g>19.7</prop-weight-g> + <delays>4,8</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>73</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F50T</designation> + <brand-name>F50</brand-name> + <common-name>F50</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>98.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>53.73</avg-thrust-n> + <max-thrust-n>79.59</max-thrust-n> + <tot-impulse-ns>76.83</tot-impulse-ns> + <burn-time-s>1.43</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=73</info-url> + <prop-weight-g>37.9</prop-weight-g> + <delays>4,6,9</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>75</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F52T</designation> + <brand-name>F52</brand-name> + <common-name>F52</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>51.37</avg-thrust-n> + <max-thrust-n>78.95</max-thrust-n> + <tot-impulse-ns>72.95</tot-impulse-ns> + <burn-time-s>1.42</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=75</info-url> + <prop-weight-g>36.6</prop-weight-g> + <delays>5,8,11</delays> + <case-info>RMS-29/40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>77</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F62T</designation> + <brand-name>F62T</brand-name> + <common-name>F62</common-name> + <impulse-class>F</impulse-class> + <diameter>29.0</diameter> + <length>89.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>62.0</avg-thrust-n> + <max-thrust-n>56.5</max-thrust-n> + <tot-impulse-ns>51.0</tot-impulse-ns> + <burn-time-s>1.13</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=77</info-url> + <total-weight-g>109.0</total-weight-g> + <prop-weight-g>30.5</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/60</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>78</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>F72</designation> + <brand-name>F72</brand-name> + <common-name>F72</common-name> + <impulse-class>F</impulse-class> + <diameter>24.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>61.92</avg-thrust-n> + <max-thrust-n>98.78</max-thrust-n> + <tot-impulse-ns>74.92</tot-impulse-ns> + <burn-time-s>1.21</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=78</info-url> + <prop-weight-g>36.8</prop-weight-g> + <delays>5,10,15</delays> + <case-info>SU 24x124</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>108</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G101T</designation> + <brand-name>G101T</brand-name> + <common-name>G101</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>125.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>101.0</avg-thrust-n> + <max-thrust-n>102.3</max-thrust-n> + <tot-impulse-ns>85.0</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=108</info-url> + <prop-weight-g>46.0</prop-weight-g> + <delays>S,M,L</delays> + <case-info>RMS-29/100</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>109</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G104T</designation> + <brand-name>G104T</brand-name> + <common-name>G104</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>125.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>104.0</avg-thrust-n> + <max-thrust-n>113.8</max-thrust-n> + <tot-impulse-ns>81.5</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=109</info-url> + <total-weight-g>136.0</total-weight-g> + <prop-weight-g>43.9</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/100</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>80</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G12-RCT</designation> + <brand-name>G12-RC</brand-name> + <common-name>G12</common-name> + <impulse-class>G</impulse-class> + <diameter>32.0</diameter> + <length>107.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>10.2</avg-thrust-n> + <max-thrust-n>20.64</max-thrust-n> + <tot-impulse-ns>87.22</tot-impulse-ns> + <burn-time-s>8.55</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=80</info-url> + <prop-weight-g>51.1</prop-weight-g> + <case-info>RMS-R/C-32/60-100</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1017</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G125T</designation> + <brand-name>G125T</brand-name> + <common-name>G125</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>125.0</avg-thrust-n> + <max-thrust-n>160.0</max-thrust-n> + <tot-impulse-ns>128.0</tot-impulse-ns> + <burn-time-s>0.95</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1017</info-url> + <total-weight-g>125.0</total-weight-g> + <prop-weight-g>59.6</prop-weight-g> + <delays>0-14</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>583</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G142T</designation> + <brand-name>G142</brand-name> + <common-name>G142</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>113.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>135.9</avg-thrust-n> + <max-thrust-n>173.9</max-thrust-n> + <tot-impulse-ns>84.3</tot-impulse-ns> + <burn-time-s>0.618</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=583</info-url> + <total-weight-g>98.0</total-weight-g> + <prop-weight-g>44.0</prop-weight-g> + <delays>6,10,14</delays> + <case-info>SU 29x113</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>82</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G25W</designation> + <brand-name>G25</brand-name> + <common-name>G25</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>22.17</avg-thrust-n> + <max-thrust-n>41.18</max-thrust-n> + <tot-impulse-ns>117.5</tot-impulse-ns> + <burn-time-s>5.3</burn-time-s> + <data-files>3</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=82</info-url> + <prop-weight-g>62.5</prop-weight-g> + <delays>0-10</delays> + <case-info>RMS-29/120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>83</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G33</designation> + <brand-name>G33</brand-name> + <common-name>G33</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>30.09</avg-thrust-n> + <max-thrust-n>50.92</max-thrust-n> + <tot-impulse-ns>98.39</tot-impulse-ns> + <burn-time-s>3.27</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=83</info-url> + <prop-weight-g>72.2</prop-weight-g> + <delays>5,7</delays> + <case-info>RMS-29/40-120</case-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>459</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G339N</designation> + <brand-name>G339N-P</brand-name> + <common-name>G339</common-name> + <impulse-class>G</impulse-class> + <diameter>38.0</diameter> + <length>97.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>307.53</avg-thrust-n> + <max-thrust-n>503.51</max-thrust-n> + <tot-impulse-ns>108.9</tot-impulse-ns> + <burn-time-s>0.35</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=459</info-url> + <prop-weight-g>49.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-38/120</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>84</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G35</designation> + <brand-name>G35</brand-name> + <common-name>G35</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>98.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>34.65</avg-thrust-n> + <max-thrust-n>76.22</max-thrust-n> + <tot-impulse-ns>100.82</tot-impulse-ns> + <burn-time-s>2.91</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=84</info-url> + <prop-weight-g>50.0</prop-weight-g> + <delays>4,7</delays> + <case-info>SU 29x98</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>87</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G38FJ</designation> + <brand-name>G38FJ</brand-name> + <common-name>G38</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>40.22</avg-thrust-n> + <max-thrust-n>78.19</max-thrust-n> + <tot-impulse-ns>87.68</tot-impulse-ns> + <burn-time-s>2.18</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=87</info-url> + <prop-weight-g>55.0</prop-weight-g> + <delays>4,7</delays> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>89</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G40W</designation> + <brand-name>G40W</brand-name> + <common-name>G40</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>37.17</avg-thrust-n> + <max-thrust-n>66.85</max-thrust-n> + <tot-impulse-ns>113.74</tot-impulse-ns> + <burn-time-s>3.06</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=89</info-url> + <prop-weight-g>62.4</prop-weight-g> + <delays>4,7,10</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>482</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G53FJ</designation> + <brand-name>G53FJ</brand-name> + <common-name>G53</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>53.1</avg-thrust-n> + <max-thrust-n>87.3</max-thrust-n> + <tot-impulse-ns>90.9</tot-impulse-ns> + <burn-time-s>1.71</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=482</info-url> + <total-weight-g>146.0</total-weight-g> + <prop-weight-g>60.0</prop-weight-g> + <delays>5,7,10</delays> + <case-info>RMS-29/40</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>90</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G54W</designation> + <brand-name>G54</brand-name> + <common-name>G54</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>53.68</avg-thrust-n> + <max-thrust-n>81.64</max-thrust-n> + <tot-impulse-ns>81.05</tot-impulse-ns> + <burn-time-s>1.51</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=90</info-url> + <prop-weight-g>46.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/100</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>91</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G55</designation> + <brand-name>G55</brand-name> + <common-name>G55</common-name> + <impulse-class>G</impulse-class> + <diameter>24.0</diameter> + <length>177.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>49.0</avg-thrust-n> + <max-thrust-n>84.65</max-thrust-n> + <tot-impulse-ns>119.57</tot-impulse-ns> + <burn-time-s>2.44</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=91</info-url> + <prop-weight-g>62.5</prop-weight-g> + <delays>5,10,15</delays> + <case-info>SU 24x177</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>94</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G61W</designation> + <brand-name>G61W</brand-name> + <common-name>G61</common-name> + <impulse-class>G</impulse-class> + <diameter>38.0</diameter> + <length>106.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>61.0</avg-thrust-n> + <max-thrust-n>63.2</max-thrust-n> + <tot-impulse-ns>110.5</tot-impulse-ns> + <burn-time-s>2.04</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=94</info-url> + <total-weight-g>194.0</total-weight-g> + <prop-weight-g>62.3</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>96</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G64W</designation> + <brand-name>G64</brand-name> + <common-name>G64</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>56.84</avg-thrust-n> + <max-thrust-n>98.31</max-thrust-n> + <tot-impulse-ns>118.8</tot-impulse-ns> + <burn-time-s>2.09</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=96</info-url> + <total-weight-g>151.0</total-weight-g> + <prop-weight-g>62.5</prop-weight-g> + <delays>4,7,10</delays> + <case-info>RMS-29/40</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>97</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G67R</designation> + <brand-name>G67R</brand-name> + <common-name>G67</common-name> + <impulse-class>G</impulse-class> + <diameter>38.0</diameter> + <length>106.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>67.0</avg-thrust-n> + <tot-impulse-ns>110.0</tot-impulse-ns> + <burn-time-s>1.64179104477612</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=97</info-url> + <total-weight-g>201.0</total-weight-g> + <prop-weight-g>60.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/120</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>469</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G69N</designation> + <brand-name>G69N</brand-name> + <common-name>G69</common-name> + <impulse-class>G</impulse-class> + <diameter>38.0</diameter> + <length>106.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>72.3</avg-thrust-n> + <max-thrust-n>87.3</max-thrust-n> + <tot-impulse-ns>136.7</tot-impulse-ns> + <burn-time-s>1.88</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=469</info-url> + <total-weight-g>62.2</total-weight-g> + <delays>P</delays> + <case-info>RMS-38/120</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>464</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G71R</designation> + <brand-name>G71R</brand-name> + <common-name>G71</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>71.0</avg-thrust-n> + <max-thrust-n>117.0</max-thrust-n> + <tot-impulse-ns>107.0</tot-impulse-ns> + <burn-time-s>1.51</burn-time-s> + <data-files>3</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=464</info-url> + <total-weight-g>147.0</total-weight-g> + <prop-weight-g>64.0</prop-weight-g> + <delays>4, 7, 10</delays> + <case-info>RMS-29/40-120</case-info> + <prop-info>Redline</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>1024</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G74W</designation> + <brand-name>AT</brand-name> + <common-name>G74</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>93.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>74.0</avg-thrust-n> + <max-thrust-n>95.0</max-thrust-n> + <tot-impulse-ns>82.75</tot-impulse-ns> + <burn-time-s>1.1</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1024</info-url> + <total-weight-g>87.0</total-weight-g> + <prop-weight-g>39.3</prop-weight-g> + <delays>6,8</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-09-02</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>100</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G75J</designation> + <brand-name>G75J</brand-name> + <common-name>G75</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>194.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>75.0</avg-thrust-n> + <max-thrust-n>70.3</max-thrust-n> + <tot-impulse-ns>135.6</tot-impulse-ns> + <burn-time-s>2.43</burn-time-s> + <data-files>5</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=100</info-url> + <total-weight-g>232.96</total-weight-g> + <prop-weight-g>104.3</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/180</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>532</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G76G</designation> + <brand-name>G76G</brand-name> + <common-name>G76</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>76.0</avg-thrust-n> + <max-thrust-n>196.0</max-thrust-n> + <tot-impulse-ns>118.0</tot-impulse-ns> + <burn-time-s>1.5</burn-time-s> + <data-files>3</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=532</info-url> + <total-weight-g>147.0</total-weight-g> + <prop-weight-g>60.0</prop-weight-g> + <delays>4,7,10</delays> + <case-info>RMS-29/40</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>101</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G77R</designation> + <brand-name>G77R</brand-name> + <common-name>G77</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>150.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>77.0</avg-thrust-n> + <tot-impulse-ns>105.0</tot-impulse-ns> + <burn-time-s>1.36363636363636</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=101</info-url> + <total-weight-g>165.0</total-weight-g> + <prop-weight-g>58.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/120</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>582</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G77R/L</designation> + <brand-name>G77R</brand-name> + <common-name>G77</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>80.12</avg-thrust-n> + <max-thrust-n>100.5</max-thrust-n> + <tot-impulse-ns>102.86</tot-impulse-ns> + <burn-time-s>1.28</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=582</info-url> + <total-weight-g>122.5</total-weight-g> + <prop-weight-g>64.0</prop-weight-g> + <delays>4,7,10</delays> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>560</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G78G/L</designation> + <brand-name>G78G</brand-name> + <common-name>G78</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>79.9</avg-thrust-n> + <max-thrust-n>101.9</max-thrust-n> + <tot-impulse-ns>109.94</tot-impulse-ns> + <burn-time-s>1.378</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=560</info-url> + <total-weight-g>125.0</total-weight-g> + <prop-weight-g>59.7</prop-weight-g> + <delays>4,7,10</delays> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>103</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G79W</designation> + <brand-name>G79W</brand-name> + <common-name>G79</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>150.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>79.0</avg-thrust-n> + <max-thrust-n>100.74</max-thrust-n> + <tot-impulse-ns>108.56</tot-impulse-ns> + <burn-time-s>1.42</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=103</info-url> + <total-weight-g>157.0</total-weight-g> + <prop-weight-g>62.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>581</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G79W/L</designation> + <brand-name>G79W</brand-name> + <common-name>G79</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>72.6</avg-thrust-n> + <max-thrust-n>93.9</max-thrust-n> + <tot-impulse-ns>108.3</tot-impulse-ns> + <burn-time-s>1.5</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=581</info-url> + <total-weight-g>124.0</total-weight-g> + <prop-weight-g>65.0</prop-weight-g> + <delays>4,7,10</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>104</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>G80T</designation> + <brand-name>G80</brand-name> + <common-name>G80</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>86.71</avg-thrust-n> + <max-thrust-n>117.945</max-thrust-n> + <tot-impulse-ns>132.17</tot-impulse-ns> + <burn-time-s>1.53</burn-time-s> + <data-files>5</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=104</info-url> + <total-weight-g>127.9</total-weight-g> + <prop-weight-g>62.5</prop-weight-g> + <delays>7,10,13,0-14</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1088</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H100W DMS</designation> + <brand-name/> + <common-name>H100</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>153.1</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>97.7</avg-thrust-n> + <max-thrust-n>137.75</max-thrust-n> + <tot-impulse-ns>226.8</tot-impulse-ns> + <burn-time-s>2.32</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1088</info-url> + <total-weight-g>261.0</total-weight-g> + <prop-weight-g>121.0</prop-weight-g> + <delays>10</delays> + <case-info>DMS</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2015-08-07</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>126</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H112J</designation> + <brand-name>H112J</brand-name> + <common-name>H112</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>191.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>112.0</avg-thrust-n> + <max-thrust-n>121.7</max-thrust-n> + <tot-impulse-ns>261.1</tot-impulse-ns> + <burn-time-s>2.92</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=126</info-url> + <total-weight-g>379.456</total-weight-g> + <prop-weight-g>191.2</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>128</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H123W</designation> + <brand-name>H123W</brand-name> + <common-name>H123</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>152.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>123.0</avg-thrust-n> + <max-thrust-n>174.2</max-thrust-n> + <tot-impulse-ns>223.6</tot-impulse-ns> + <burn-time-s>1.76</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=128</info-url> + <total-weight-g>275.0</total-weight-g> + <prop-weight-g>128.7</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/240</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>130</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H125W</designation> + <brand-name>H125W</brand-name> + <common-name>H125</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>330.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>125.0</avg-thrust-n> + <max-thrust-n>307.0</max-thrust-n> + <tot-impulse-ns>299.4</tot-impulse-ns> + <burn-time-s>2.6</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=130</info-url> + <total-weight-g>322.56</total-weight-g> + <prop-weight-g>187.9</prop-weight-g> + <delays>S,M,L</delays> + <case-info>SU 29x330</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>131</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H128W</designation> + <brand-name>H128W</brand-name> + <common-name>H128</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>194.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>128.0</avg-thrust-n> + <max-thrust-n>168.7</max-thrust-n> + <tot-impulse-ns>172.9</tot-impulse-ns> + <burn-time-s>1.27</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=131</info-url> + <total-weight-g>206.0</total-weight-g> + <prop-weight-g>94.2</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/180</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1090</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H130W</designation> + <brand-name/> + <common-name>H130</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>152.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>130.0</avg-thrust-n> + <max-thrust-n>260.0</max-thrust-n> + <tot-impulse-ns>210.0</tot-impulse-ns> + <burn-time-s>1.65</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1090</info-url> + <total-weight-g>237.0</total-weight-g> + <prop-weight-g>120.0</prop-weight-g> + <delays>6-8-10-12-14</delays> + <case-info>28/240</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2016-03-20</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>135</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H148R</designation> + <brand-name>H148R</brand-name> + <common-name>H148</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>152.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>148.0</avg-thrust-n> + <tot-impulse-ns>206.0</tot-impulse-ns> + <burn-time-s>1.39189189189189</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=135</info-url> + <total-weight-g>309.12</total-weight-g> + <prop-weight-g>122.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/240</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>138</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H165R</designation> + <brand-name>H165R</brand-name> + <common-name>H165</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>194.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>165.0</avg-thrust-n> + <tot-impulse-ns>165.0</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=138</info-url> + <total-weight-g>201.6</total-weight-g> + <prop-weight-g>90.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/180</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>903</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H170M</designation> + <brand-name>AT, Aerotech, ISP, RCS</brand-name> + <common-name>H170</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>191.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>166.8</avg-thrust-n> + <max-thrust-n>208.0</max-thrust-n> + <tot-impulse-ns>319.9</tot-impulse-ns> + <burn-time-s>1.91</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=903</info-url> + <total-weight-g>330.0</total-weight-g> + <prop-weight-g>182.5</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Metalstorm</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>965</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H178DM</designation> + <brand-name>H178DM-14A</brand-name> + <common-name>H178</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>191.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>162.0</avg-thrust-n> + <max-thrust-n>202.0</max-thrust-n> + <tot-impulse-ns>283.0</tot-impulse-ns> + <burn-time-s>1.74</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=965</info-url> + <total-weight-g>324.0</total-weight-g> + <prop-weight-g>177.0</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>139</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H180W</designation> + <brand-name>H180W</brand-name> + <common-name>H180</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>238.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>180.0</avg-thrust-n> + <max-thrust-n>228.5</max-thrust-n> + <tot-impulse-ns>217.7</tot-impulse-ns> + <burn-time-s>1.3</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=139</info-url> + <total-weight-g>252.0</total-weight-g> + <prop-weight-g>123.9</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/240</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>140</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H210R</designation> + <brand-name>H210R</brand-name> + <common-name>H210</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>238.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>215.41</avg-thrust-n> + <max-thrust-n>275.73</max-thrust-n> + <tot-impulse-ns>215.41</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=140</info-url> + <total-weight-g>246.4</total-weight-g> + <prop-weight-g>106.4</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/240</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>142</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H220T</designation> + <brand-name>H220T</brand-name> + <common-name>H220</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>238.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>220.0</avg-thrust-n> + <tot-impulse-ns>220.0</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=142</info-url> + <prop-weight-g>106.4</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/240</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>144</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H238T</designation> + <brand-name>H238T</brand-name> + <common-name>H238</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>194.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>238.0</avg-thrust-n> + <max-thrust-n>263.4</max-thrust-n> + <tot-impulse-ns>165.5</tot-impulse-ns> + <burn-time-s>0.71</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=144</info-url> + <total-weight-g>196.0</total-weight-g> + <prop-weight-g>83.4</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/180</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>145</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H242T</designation> + <brand-name>H242T</brand-name> + <common-name>H242</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>152.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>242.0</avg-thrust-n> + <max-thrust-n>276.6</max-thrust-n> + <tot-impulse-ns>231.7</tot-impulse-ns> + <burn-time-s>1.06</burn-time-s> + <data-files>7</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=145</info-url> + <total-weight-g>264.0</total-weight-g> + <prop-weight-g>114.7</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/240</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>483</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H250G</designation> + <brand-name>H250G</brand-name> + <common-name>H250</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>238.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>250.0</avg-thrust-n> + <tot-impulse-ns>231.0</tot-impulse-ns> + <burn-time-s>0.9</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=483</info-url> + <total-weight-g>256.0</total-weight-g> + <prop-weight-g>116.3</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/240</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>147</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H268R</designation> + <brand-name>H268R</brand-name> + <common-name>H268</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>333.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>268.0</avg-thrust-n> + <tot-impulse-ns>320.0</tot-impulse-ns> + <burn-time-s>1.19402985074627</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=147</info-url> + <total-weight-g>358.4</total-weight-g> + <prop-weight-g>166.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/360</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>115</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H45W</designation> + <brand-name>H45W</brand-name> + <common-name>H45</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>194.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>45.0</avg-thrust-n> + <max-thrust-n>102.0</max-thrust-n> + <tot-impulse-ns>289.0</tot-impulse-ns> + <burn-time-s>6.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=115</info-url> + <total-weight-g>294.784</total-weight-g> + <prop-weight-g>197.4</prop-weight-g> + <delays>10,15</delays> + <case-info>SU 38x194</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>118</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H55W</designation> + <brand-name>H55W</brand-name> + <common-name>H55</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>191.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>55.0</avg-thrust-n> + <max-thrust-n>113.3</max-thrust-n> + <tot-impulse-ns>162.3</tot-impulse-ns> + <burn-time-s>2.45</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=118</info-url> + <total-weight-g>188.16</total-weight-g> + <prop-weight-g>99.7</prop-weight-g> + <delays>6,10,14</delays> + <case-info>SU 29x191</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>155</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H669N</designation> + <brand-name>H669N</brand-name> + <common-name>H669</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>152.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>651.4</avg-thrust-n> + <max-thrust-n>961.5</max-thrust-n> + <tot-impulse-ns>221.0</tot-impulse-ns> + <burn-time-s>0.339</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=155</info-url> + <prop-weight-g>98.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-38/240</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>121</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H70W</designation> + <brand-name>H70W</brand-name> + <common-name>H70</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>229.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>70.0</avg-thrust-n> + <max-thrust-n>174.0</max-thrust-n> + <tot-impulse-ns>215.0</tot-impulse-ns> + <burn-time-s>2.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=121</info-url> + <total-weight-g>224.0</total-weight-g> + <prop-weight-g>126.0</prop-weight-g> + <delays>6,10,14</delays> + <case-info>SU 29x229</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>122</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H73J</designation> + <brand-name>H73J</brand-name> + <common-name>H73</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>152.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>73.0</avg-thrust-n> + <max-thrust-n>97.1</max-thrust-n> + <tot-impulse-ns>185.6</tot-impulse-ns> + <burn-time-s>2.55</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=122</info-url> + <total-weight-g>309.12</total-weight-g> + <prop-weight-g>142.7</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/240</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>124</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H97J</designation> + <brand-name>H97J</brand-name> + <common-name>H97</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>238.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>97.0</avg-thrust-n> + <max-thrust-n>111.5</max-thrust-n> + <tot-impulse-ns>177.3</tot-impulse-ns> + <burn-time-s>2.23</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=124</info-url> + <total-weight-g>277.76</total-weight-g> + <prop-weight-g>137.1</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/240</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>156</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>H999N</designation> + <brand-name>H999</brand-name> + <common-name>H999</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>203.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>999.0</avg-thrust-n> + <tot-impulse-ns>319.9</tot-impulse-ns> + <burn-time-s>0.32022022022022</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=156</info-url> + <prop-weight-g>147.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>945</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-G138T</designation> + <brand-name>G138T</brand-name> + <common-name>G138</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>124.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>138.0</avg-thrust-n> + <max-thrust-n>190.1</max-thrust-n> + <tot-impulse-ns>157.1</tot-impulse-ns> + <burn-time-s>1.13840579710145</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=945</info-url> + <prop-weight-g>70.0</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-29/40</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>902</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-G75M</designation> + <brand-name>Aerotech, AT, ISP</brand-name> + <common-name>G75</common-name> + <impulse-class>G</impulse-class> + <diameter>29.0</diameter> + <length>123.9</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>74.74</avg-thrust-n> + <max-thrust-n>102.0</max-thrust-n> + <tot-impulse-ns>120.39</tot-impulse-ns> + <burn-time-s>1.61</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=902</info-url> + <total-weight-g>131.0</total-weight-g> + <prop-weight-g>66.8</prop-weight-g> + <delays>4,7,10</delays> + <prop-info>Metalstorm</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1018</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-H115DM</designation> + <brand-name>H115DM</brand-name> + <common-name>H115</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>203.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>115.0</avg-thrust-n> + <max-thrust-n>126.0</max-thrust-n> + <tot-impulse-ns>172.0</tot-impulse-ns> + <burn-time-s>1.5</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1018</info-url> + <total-weight-g>205.0</total-weight-g> + <prop-weight-g>113.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1009</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-H135W</designation> + <brand-name>H135W</brand-name> + <common-name>H135</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>216.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>115.86</avg-thrust-n> + <max-thrust-n>159.88</max-thrust-n> + <tot-impulse-ns>225.84</tot-impulse-ns> + <burn-time-s>1.95</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1009</info-url> + <total-weight-g>212.0</total-weight-g> + <prop-weight-g>82.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1029</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-H182R</designation> + <brand-name>H182R-14A</brand-name> + <common-name>H182</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>203.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>182.0</avg-thrust-n> + <max-thrust-n>192.0</max-thrust-n> + <tot-impulse-ns>218.0</tot-impulse-ns> + <burn-time-s>1.2</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1029</info-url> + <total-weight-g>207.0</total-weight-g> + <prop-weight-g>115.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1011</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-H195NT</designation> + <brand-name>H195NT</brand-name> + <common-name>H195</common-name> + <impulse-class>H</impulse-class> + <diameter>29.0</diameter> + <length>203.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>206.676</avg-thrust-n> + <max-thrust-n>247.1561</max-thrust-n> + <tot-impulse-ns>236.0919</tot-impulse-ns> + <burn-time-s>1.14</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1011</info-url> + <total-weight-g>197.0</total-weight-g> + <prop-weight-g>115.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1031</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-H45W</designation> + <brand-name>H45W-10A</brand-name> + <common-name>H45</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>203.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>45.0</avg-thrust-n> + <max-thrust-n>87.0</max-thrust-n> + <tot-impulse-ns>320.0</tot-impulse-ns> + <burn-time-s>6.0</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1031</info-url> + <total-weight-g>365.0</total-weight-g> + <prop-weight-g>180.0</prop-weight-g> + <delays>0-10</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1074</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-H550ST</designation> + <brand-name/> + <common-name>H550</common-name> + <impulse-class>H</impulse-class> + <diameter>38.0</diameter> + <length>206.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>552.0</avg-thrust-n> + <max-thrust-n>640.0</max-thrust-n> + <tot-impulse-ns>312.0</tot-impulse-ns> + <burn-time-s>0.56</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1074</info-url> + <total-weight-g>316.0</total-weight-g> + <prop-weight-g>176.0</prop-weight-g> + <delays>14</delays> + <case-info>38 DMS</case-info> + <prop-info>Super Thunder</prop-info> + <updated-on>2014-08-02</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1013</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-I140W</designation> + <brand-name>I140W</brand-name> + <common-name>I140</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>202.7</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>140.0</avg-thrust-n> + <max-thrust-n>181.0</max-thrust-n> + <tot-impulse-ns>336.0</tot-impulse-ns> + <burn-time-s>2.4</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1013</info-url> + <total-weight-g>356.0</total-weight-g> + <prop-weight-g>183.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1030</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-I205W</designation> + <brand-name>I205W-14A</brand-name> + <common-name>I205</common-name> + <impulse-class>I</impulse-class> + <diameter>29.0</diameter> + <length>305.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>205.0</avg-thrust-n> + <max-thrust-n>253.0</max-thrust-n> + <tot-impulse-ns>345.0</tot-impulse-ns> + <burn-time-s>1.7</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1030</info-url> + <total-weight-g>315.0</total-weight-g> + <prop-weight-g>188.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1014</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-I280DM</designation> + <brand-name>AT</brand-name> + <common-name>I280</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>356.4</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>280.0</avg-thrust-n> + <max-thrust-n>386.0</max-thrust-n> + <tot-impulse-ns>561.0</tot-impulse-ns> + <burn-time-s>1.9</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1014</info-url> + <total-weight-g>616.0</total-weight-g> + <prop-weight-g>355.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1019</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-I500T</designation> + <brand-name>I500T</brand-name> + <common-name>I500</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>356.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>500.0</avg-thrust-n> + <max-thrust-n>138.0</max-thrust-n> + <tot-impulse-ns>620.0</tot-impulse-ns> + <burn-time-s>1.24</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1019</info-url> + <total-weight-g>576.0</total-weight-g> + <prop-weight-g>312.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1033</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-I65W</designation> + <brand-name>I65W-10A</brand-name> + <common-name>I65</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>218.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>65.0</avg-thrust-n> + <max-thrust-n>178.0</max-thrust-n> + <tot-impulse-ns>640.0</tot-impulse-ns> + <burn-time-s>9.0</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1033</info-url> + <total-weight-g>752.0</total-weight-g> + <prop-weight-g>377.0</prop-weight-g> + <delays>0-10</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1015</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-J270W</designation> + <brand-name>AT</brand-name> + <common-name>J270</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>356.4</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>270.0</avg-thrust-n> + <max-thrust-n>356.0</max-thrust-n> + <tot-impulse-ns>703.0</tot-impulse-ns> + <burn-time-s>2.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1015</info-url> + <total-weight-g>642.0</total-weight-g> + <prop-weight-g>381.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1032</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-J425R</designation> + <brand-name>J425R-14A</brand-name> + <common-name>J425</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>356.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>425.0</avg-thrust-n> + <max-thrust-n>452.0</max-thrust-n> + <tot-impulse-ns>676.0</tot-impulse-ns> + <burn-time-s>1.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1032</info-url> + <total-weight-g>631.0</total-weight-g> + <prop-weight-g>364.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>Redline</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1034</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-K535W</designation> + <brand-name>K535W-14A</brand-name> + <common-name>K535</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>358.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>535.0</avg-thrust-n> + <max-thrust-n>655.0</max-thrust-n> + <tot-impulse-ns>1434.0</tot-impulse-ns> + <burn-time-s>2.8</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1034</info-url> + <total-weight-g>1264.0</total-weight-g> + <prop-weight-g>745.0</prop-weight-g> + <delays>0-14</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1035</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>HP-L1000W</designation> + <brand-name>L1000W-18A</brand-name> + <common-name>L1000</common-name> + <impulse-class>L</impulse-class> + <diameter>54.0</diameter> + <length>635.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1000.0</avg-thrust-n> + <max-thrust-n>1261.0</max-thrust-n> + <tot-impulse-ns>2714.0</tot-impulse-ns> + <burn-time-s>2.7</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1035</info-url> + <total-weight-g>2194.0</total-weight-g> + <prop-weight-g>1400.0</prop-weight-g> + <delays>0-18</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>487</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I115W</designation> + <brand-name>I115W</brand-name> + <common-name>I115</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>156.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>115.0</avg-thrust-n> + <tot-impulse-ns>412.0</tot-impulse-ns> + <burn-time-s>3.58260869565217</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=487</info-url> + <total-weight-g>545.0</total-weight-g> + <prop-weight-g>219.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-54/426</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>491</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I117FJ</designation> + <brand-name>I117FJ</brand-name> + <common-name>I117</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>156.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>117.0</avg-thrust-n> + <tot-impulse-ns>361.0</tot-impulse-ns> + <burn-time-s>3.1</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=491</info-url> + <total-weight-g>566.0</total-weight-g> + <prop-weight-g>243.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-54/426</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>453</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I1299N</designation> + <brand-name>I1299N</brand-name> + <common-name>I1299</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>249.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1335.0</avg-thrust-n> + <max-thrust-n>1851.42</max-thrust-n> + <tot-impulse-ns>422.95</tot-impulse-ns> + <burn-time-s>0.316</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=453</info-url> + <total-weight-g>422.0</total-weight-g> + <prop-weight-g>192.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-38/480</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>167</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I132W</designation> + <brand-name>I132W</brand-name> + <common-name>I132</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>335.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>132.0</avg-thrust-n> + <max-thrust-n>512.9</max-thrust-n> + <tot-impulse-ns>610.7</tot-impulse-ns> + <burn-time-s>4.83</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=167</info-url> + <total-weight-g>512.064</total-weight-g> + <prop-weight-g>376.4</prop-weight-g> + <delays>M,L</delays> + <case-info>SU 38x335</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>173</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I154J</designation> + <brand-name>I154J</brand-name> + <common-name>I154</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>241.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>154.0</avg-thrust-n> + <max-thrust-n>170.5</max-thrust-n> + <tot-impulse-ns>378.0</tot-impulse-ns> + <burn-time-s>2.99</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=173</info-url> + <total-weight-g>491.904</total-weight-g> + <prop-weight-g>252.8</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/480</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>177</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I161W</designation> + <brand-name>I161W</brand-name> + <common-name>I161</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>191.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>161.0</avg-thrust-n> + <max-thrust-n>266.6</max-thrust-n> + <tot-impulse-ns>328.7</tot-impulse-ns> + <burn-time-s>1.82</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=177</info-url> + <total-weight-g>366.0</total-weight-g> + <prop-weight-g>193.2</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/360</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>911</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I170G</designation> + <brand-name>I170G</brand-name> + <common-name>I170</common-name> + <impulse-class>I </impulse-class> + <diameter>54.0</diameter> + <length>147.1</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>171.78</avg-thrust-n> + <max-thrust-n>207.35</max-thrust-n> + <tot-impulse-ns>418.54</tot-impulse-ns> + <burn-time-s>2.4</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=911</info-url> + <total-weight-g>528.0</total-weight-g> + <prop-weight-g>227.0</prop-weight-g> + <delays>0-10</delays> + <case-info>RMS-54/426</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1091</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I180W</designation> + <brand-name/> + <common-name>I180</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>191.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>180.0</avg-thrust-n> + <max-thrust-n>362.0</max-thrust-n> + <tot-impulse-ns>326.0</tot-impulse-ns> + <burn-time-s>1.8</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1091</info-url> + <total-weight-g>385.0</total-weight-g> + <prop-weight-g>180.0</prop-weight-g> + <delays>6,8,10,12,14</delays> + <case-info>38/360</case-info> + <prop-info>While Lighting</prop-info> + <updated-on>2016-03-20</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>180</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I195J</designation> + <brand-name>I195J</brand-name> + <common-name>I195</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>299.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>195.0</avg-thrust-n> + <max-thrust-n>216.3</max-thrust-n> + <tot-impulse-ns>426.1</tot-impulse-ns> + <burn-time-s>2.1</burn-time-s> + <data-files>7</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=180</info-url> + <total-weight-g>572.0</total-weight-g> + <prop-weight-g>301.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/600</case-info> + <prop-info>Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>181</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I200W</designation> + <brand-name>I200W</brand-name> + <common-name>I200</common-name> + <impulse-class>I</impulse-class> + <diameter>29.0</diameter> + <length>333.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>200.0</avg-thrust-n> + <max-thrust-n>463.3</max-thrust-n> + <tot-impulse-ns>324.5</tot-impulse-ns> + <burn-time-s>1.65</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=181</info-url> + <total-weight-g>357.504</total-weight-g> + <prop-weight-g>187.3</prop-weight-g> + <delays>M</delays> + <case-info>RMS-29/360</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>185</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I211W</designation> + <brand-name>I211W</brand-name> + <common-name>I211</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>248.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>211.0</avg-thrust-n> + <max-thrust-n>399.5</max-thrust-n> + <tot-impulse-ns>441.6</tot-impulse-ns> + <burn-time-s>1.72</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=185</info-url> + <total-weight-g>455.0</total-weight-g> + <prop-weight-g>251.3</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/480</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>489</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I215R</designation> + <brand-name>I215R</brand-name> + <common-name>I215</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>156.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>215.0</avg-thrust-n> + <tot-impulse-ns>399.0</tot-impulse-ns> + <burn-time-s>1.85581395348837</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=489</info-url> + <total-weight-g>527.0</total-weight-g> + <prop-weight-g>208.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-54/426</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>187</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I218R</designation> + <brand-name>I218R</brand-name> + <common-name>I218</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>203.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>218.0</avg-thrust-n> + <tot-impulse-ns>330.0</tot-impulse-ns> + <burn-time-s>1.51376146788991</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=187</info-url> + <total-weight-g>371.84</total-weight-g> + <prop-weight-g>172.7</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>456</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I225FJ</designation> + <brand-name>I225FJ</brand-name> + <common-name>I225</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>240.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>230.5</avg-thrust-n> + <max-thrust-n>276.6</max-thrust-n> + <tot-impulse-ns>367.89</tot-impulse-ns> + <burn-time-s>1.59</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=456</info-url> + <prop-weight-g>264.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/480</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>488</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I229T</designation> + <brand-name>I229T</brand-name> + <common-name>I229</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>156.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>229.0</avg-thrust-n> + <tot-impulse-ns>407.0</tot-impulse-ns> + <burn-time-s>1.77729257641921</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=488</info-url> + <total-weight-g>514.0</total-weight-g> + <prop-weight-g>196.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-54/426</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>484</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I245G</designation> + <brand-name>I245G</brand-name> + <common-name>I245</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>202.0</length> + <type>reload</type> + <cert-org/> + <avg-thrust-n>245.0</avg-thrust-n> + <tot-impulse-ns>351.0</tot-impulse-ns> + <burn-time-s>1.4</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=484</info-url> + <total-weight-g>365.0</total-weight-g> + <prop-weight-g>181.3</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>197</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I284W</designation> + <brand-name>I284W</brand-name> + <common-name>I284</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>299.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>284.0</avg-thrust-n> + <max-thrust-n>570.6</max-thrust-n> + <tot-impulse-ns>607.3</tot-impulse-ns> + <burn-time-s>1.94</burn-time-s> + <data-files>7</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=197</info-url> + <total-weight-g>555.52</total-weight-g> + <prop-weight-g>315.9</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/600</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>199</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I285R</designation> + <brand-name>I285R</brand-name> + <common-name>I285</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>250.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>285.0</avg-thrust-n> + <tot-impulse-ns>420.0</tot-impulse-ns> + <burn-time-s>1.47368421052632</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=199</info-url> + <total-weight-g>492.8</total-weight-g> + <prop-weight-g>230.2</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/480</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>203</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I300T</designation> + <brand-name>I300T</brand-name> + <common-name>I300</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>250.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>300.36</avg-thrust-n> + <max-thrust-n>474.43</max-thrust-n> + <tot-impulse-ns>426.51</tot-impulse-ns> + <burn-time-s>1.42</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=203</info-url> + <prop-weight-g>221.6</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/480</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>457</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I305FJ</designation> + <brand-name>I305FJ</brand-name> + <common-name>I305</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>288.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>313.5</avg-thrust-n> + <max-thrust-n>418.2</max-thrust-n> + <tot-impulse-ns>452.1</tot-impulse-ns> + <burn-time-s>1.44</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=457</info-url> + <prop-weight-g>330.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/600</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>966</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I327DM</designation> + <brand-name>I327DM</brand-name> + <common-name>I327</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>337.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>327.0</avg-thrust-n> + <max-thrust-n>400.0</max-thrust-n> + <tot-impulse-ns>539.0</tot-impulse-ns> + <burn-time-s>1.72</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=966</info-url> + <total-weight-g>628.0</total-weight-g> + <prop-weight-g>354.0</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/720</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>951</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I350R</designation> + <brand-name>I350R</brand-name> + <common-name>I350</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>355.6</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>340.0</avg-thrust-n> + <max-thrust-n>473.0</max-thrust-n> + <tot-impulse-ns>634.6</tot-impulse-ns> + <burn-time-s>1.86</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=951</info-url> + <total-weight-g>616.0</total-weight-g> + <prop-weight-g>348.0</prop-weight-g> + <delays>10</delays> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>211</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I357T</designation> + <brand-name>I357T</brand-name> + <common-name>I357</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>203.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>357.0</avg-thrust-n> + <max-thrust-n>432.8</max-thrust-n> + <tot-impulse-ns>342.0</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=211</info-url> + <total-weight-g>343.0</total-weight-g> + <prop-weight-g>174.4</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>455</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I364FJ</designation> + <brand-name>I364FJ</brand-name> + <common-name>I364</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>335.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>373.8</avg-thrust-n> + <max-thrust-n>487.3</max-thrust-n> + <tot-impulse-ns>570.13</tot-impulse-ns> + <burn-time-s>1.52</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=455</info-url> + <prop-weight-g>396.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/720</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>213</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I366R</designation> + <brand-name>I366R</brand-name> + <common-name>I366</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>299.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>366.0</avg-thrust-n> + <max-thrust-n>507.0</max-thrust-n> + <tot-impulse-ns>539.0</tot-impulse-ns> + <burn-time-s>1.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=213</info-url> + <total-weight-g>555.52</total-weight-g> + <prop-weight-g>300.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/600</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>218</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I435T</designation> + <brand-name>I435T</brand-name> + <common-name>I435</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>299.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>435.0</avg-thrust-n> + <max-thrust-n>785.6</max-thrust-n> + <tot-impulse-ns>568.9</tot-impulse-ns> + <burn-time-s>1.1</burn-time-s> + <data-files>7</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=218</info-url> + <total-weight-g>518.0</total-weight-g> + <prop-weight-g>269.9</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/600</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>719</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I49N</designation> + <brand-name>I49N</brand-name> + <common-name>I49</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>184.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>49.4</avg-thrust-n> + <max-thrust-n>63.7</max-thrust-n> + <tot-impulse-ns>383.0</tot-impulse-ns> + <burn-time-s>7.68</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=719</info-url> + <total-weight-g>398.0</total-weight-g> + <prop-weight-g>205.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-38/360</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>490</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I599N</designation> + <brand-name>I599N</brand-name> + <common-name>I599</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>156.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>667.82</avg-thrust-n> + <max-thrust-n>763.46</max-thrust-n> + <tot-impulse-ns>404.87</tot-impulse-ns> + <burn-time-s>0.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=490</info-url> + <total-weight-g>512.0</total-weight-g> + <prop-weight-g>195.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/426</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>720</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I59WN</designation> + <brand-name>I59WN</brand-name> + <common-name>I59</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>232.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>60.8</avg-thrust-n> + <max-thrust-n>172.9</max-thrust-n> + <tot-impulse-ns>486.0</tot-impulse-ns> + <burn-time-s>7.99</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=720</info-url> + <total-weight-g>487.0</total-weight-g> + <prop-weight-g>272.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-38/480</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>506</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I600R</designation> + <brand-name>I600R</brand-name> + <common-name>I600</common-name> + <impulse-class>I</impulse-class> + <diameter>38.0</diameter> + <length>345.4</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>612.0</avg-thrust-n> + <max-thrust-n>811.7</max-thrust-n> + <tot-impulse-ns>597.3</tot-impulse-ns> + <burn-time-s>1.09</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=506</info-url> + <total-weight-g>602.0</total-weight-g> + <prop-weight-g>324.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/720</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>157</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>I65W</designation> + <brand-name>I65W</brand-name> + <common-name>I65</common-name> + <impulse-class>I</impulse-class> + <diameter>54.0</diameter> + <length>235.0</length> + <type>SU</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>76.33</avg-thrust-n> + <max-thrust-n>150.07</max-thrust-n> + <tot-impulse-ns>630.5</tot-impulse-ns> + <burn-time-s>8.26</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=157</info-url> + <total-weight-g>761.6</total-weight-g> + <prop-weight-g>369.7</prop-weight-g> + <case-info>SU 54x235</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>227</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J125W</designation> + <brand-name>J125W</brand-name> + <common-name>J125</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>368.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>125.0</avg-thrust-n> + <max-thrust-n>338.9</max-thrust-n> + <tot-impulse-ns>1202.4</tot-impulse-ns> + <burn-time-s>7.75</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=227</info-url> + <total-weight-g>1288.0</total-weight-g> + <prop-weight-g>638.7</prop-weight-g> + <case-info>SU 54x368</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>462</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J1299N</designation> + <brand-name>J1299N-P</brand-name> + <common-name>J1299</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>231.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1291.58</avg-thrust-n> + <max-thrust-n>1468.28</max-thrust-n> + <tot-impulse-ns>843.4</tot-impulse-ns> + <burn-time-s>0.653</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=462</info-url> + <total-weight-g>834.0</total-weight-g> + <prop-weight-g>371.6</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/852</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>228</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J135W</designation> + <brand-name>J135W</brand-name> + <common-name>J135</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>368.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>157.0</avg-thrust-n> + <max-thrust-n>274.0</max-thrust-n> + <tot-impulse-ns>1069.0</tot-impulse-ns> + <burn-time-s>6.83</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=228</info-url> + <total-weight-g>1141.06</total-weight-g> + <prop-weight-g>633.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1280</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>231</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J145H 2-jet std.</designation> + <brand-name>J145H 2-jet std.</brand-name> + <common-name>J145</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>709.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>145.0</avg-thrust-n> + <max-thrust-n>303.3</max-thrust-n> + <tot-impulse-ns>825.7</tot-impulse-ns> + <burn-time-s>5.65</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=231</info-url> + <total-weight-g>1797.38</total-weight-g> + <prop-weight-g>409.5</prop-weight-g> + <case-info>RMS 54/1280</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>237</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J170H 3-jet std.</designation> + <brand-name>J170H 3-jet std.</brand-name> + <common-name>J170</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>709.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>170.0</avg-thrust-n> + <tot-impulse-ns>739.0</tot-impulse-ns> + <burn-time-s>4.4</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=237</info-url> + <prop-weight-g>409.5</prop-weight-g> + <case-info>RMS 54/1280</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>463</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J1799N</designation> + <brand-name>J1799N-P</brand-name> + <common-name>J1799</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>316.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1963.39</avg-thrust-n> + <max-thrust-n>2965.88</max-thrust-n> + <tot-impulse-ns>1214.8</tot-impulse-ns> + <burn-time-s>0.61</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=463</info-url> + <prop-weight-g>591.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/1280</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>238</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J180T</designation> + <brand-name>J180T</brand-name> + <common-name>J180</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>230.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>180.0</avg-thrust-n> + <max-thrust-n>392.0</max-thrust-n> + <tot-impulse-ns>764.0</tot-impulse-ns> + <burn-time-s>4.5</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=238</info-url> + <total-weight-g>809.088</total-weight-g> + <prop-weight-g>437.1</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/852</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>241</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J210H 4-jet std.</designation> + <brand-name>J210H 4-jet std.</brand-name> + <common-name>J210</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>709.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>213.46</avg-thrust-n> + <max-thrust-n>651.819</max-thrust-n> + <tot-impulse-ns>853.842</tot-impulse-ns> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=241</info-url> + <total-weight-g>1497.0</total-weight-g> + <prop-weight-g>471.0</prop-weight-g> + <case-info>RMS 54/1280</case-info> + <updated-on>2016-01-23</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>492</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J250FJ</designation> + <brand-name>J250FJ</brand-name> + <common-name>J250</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>241.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>250.0</avg-thrust-n> + <tot-impulse-ns>731.0</tot-impulse-ns> + <burn-time-s>2.9</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=492</info-url> + <total-weight-g>907.0</total-weight-g> + <prop-weight-g>487.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/852</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1087</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J250W</designation> + <brand-name/> + <common-name>J250</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>218.2</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>260.0</avg-thrust-n> + <max-thrust-n>338.0</max-thrust-n> + <tot-impulse-ns>704.0</tot-impulse-ns> + <burn-time-s>2.7</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1087</info-url> + <total-weight-g>708.0</total-weight-g> + <prop-weight-g>363.0</prop-weight-g> + <delays>14</delays> + <case-info>DMS</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2015-08-07</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>251</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J260HW 3-jet EFX</designation> + <brand-name>J260HW 3-jet EFX</brand-name> + <common-name>J260</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>709.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>260.049</avg-thrust-n> + <max-thrust-n>598.969</max-thrust-n> + <tot-impulse-ns>1170.22</tot-impulse-ns> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=251</info-url> + <total-weight-g>1574.0</total-weight-g> + <prop-weight-g>558.0</prop-weight-g> + <case-info>RMS 54/1280</case-info> + <updated-on>2016-01-23</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>255</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J275W</designation> + <brand-name>J275W</brand-name> + <common-name>J275</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>230.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>275.0</avg-thrust-n> + <max-thrust-n>370.0</max-thrust-n> + <tot-impulse-ns>774.0</tot-impulse-ns> + <burn-time-s>3.3</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=255</info-url> + <total-weight-g>864.192</total-weight-g> + <prop-weight-g>472.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/852</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>262</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J315R</designation> + <brand-name>J315R</brand-name> + <common-name>J315</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>230.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>315.0</avg-thrust-n> + <tot-impulse-ns>763.3</tot-impulse-ns> + <burn-time-s>2.4231746031746</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=262</info-url> + <total-weight-g>851.2</total-weight-g> + <prop-weight-g>438.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/852</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>904</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J340M</designation> + <brand-name>AT, Aerotech, ISP, RCS</brand-name> + <common-name>J340</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>337.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>354.1</avg-thrust-n> + <max-thrust-n>605.0</max-thrust-n> + <tot-impulse-ns>651.68</tot-impulse-ns> + <burn-time-s>1.836</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=904</info-url> + <total-weight-g>577.3</total-weight-g> + <prop-weight-g>365.0</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-38/720</case-info> + <prop-info>Metalstorm</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>269</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J350W</designation> + <brand-name>J350W-L</brand-name> + <common-name>J350</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>337.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>445.0</avg-thrust-n> + <max-thrust-n>822.5</max-thrust-n> + <tot-impulse-ns>670.1</tot-impulse-ns> + <burn-time-s>1.5</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=269</info-url> + <prop-weight-g>361.1</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/720</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>270</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J350W-OLD</designation> + <brand-name>J350W</brand-name> + <common-name>J350</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>337.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>394.2</avg-thrust-n> + <max-thrust-n>890.4</max-thrust-n> + <tot-impulse-ns>697.4</tot-impulse-ns> + <burn-time-s>1.78</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=270</info-url> + <prop-weight-g>381.1</prop-weight-g> + <delays>S,M,L</delays> + <case-info>RMS-38/720</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>278</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J390H-turbo</designation> + <brand-name>J390H-turbo</brand-name> + <common-name>J390</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>709.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>390.0</avg-thrust-n> + <tot-impulse-ns>1280.0</tot-impulse-ns> + <burn-time-s>3.28205128205128</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=278</info-url> + <prop-weight-g>391.0</prop-weight-g> + <case-info>RMS 54/1280</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>586</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J401FJ</designation> + <brand-name>J401FJ</brand-name> + <common-name>J401</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>325.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>408.88</avg-thrust-n> + <max-thrust-n>479.99</max-thrust-n> + <tot-impulse-ns>1115.38</tot-impulse-ns> + <burn-time-s>2.8</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=586</info-url> + <total-weight-g>912.0</total-weight-g> + <prop-weight-g>511.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1280</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>282</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J415W</designation> + <brand-name>J415W</brand-name> + <common-name>J415</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>314.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>415.0</avg-thrust-n> + <max-thrust-n>732.8</max-thrust-n> + <tot-impulse-ns>1231.7</tot-impulse-ns> + <burn-time-s>2.88</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=282</info-url> + <total-weight-g>1168.0</total-weight-g> + <prop-weight-g>693.3</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1280</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>284</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J420R</designation> + <brand-name>J420R</brand-name> + <common-name>J420</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>337.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>420.0</avg-thrust-n> + <tot-impulse-ns>658.0</tot-impulse-ns> + <burn-time-s>1.56666666666667</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=284</info-url> + <total-weight-g>649.6</total-weight-g> + <prop-weight-g>345.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/720</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>287</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J460T</designation> + <brand-name>J460T</brand-name> + <common-name>J460</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>230.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>460.0</avg-thrust-n> + <max-thrust-n>870.5</max-thrust-n> + <tot-impulse-ns>805.5</tot-impulse-ns> + <burn-time-s>1.81</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=287</info-url> + <total-weight-g>789.0</total-weight-g> + <prop-weight-g>415.4</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/852</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>485</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J500G</designation> + <brand-name>J500G</brand-name> + <common-name>J500</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>345.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>500.0</avg-thrust-n> + <tot-impulse-ns>723.0</tot-impulse-ns> + <burn-time-s>1.4</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=485</info-url> + <total-weight-g>654.0</total-weight-g> + <prop-weight-g>362.6</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/720</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>778</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J510W</designation> + <brand-name>Aerotech</brand-name> + <common-name>J510</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>584.2</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>509.9</avg-thrust-n> + <max-thrust-n>1041.7</max-thrust-n> + <tot-impulse-ns>1162.0</tot-impulse-ns> + <burn-time-s>2.27</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=778</info-url> + <total-weight-g>1080.0</total-weight-g> + <prop-weight-g>662.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-38/1320</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2016-06-01</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>292</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J540R</designation> + <brand-name>J540R</brand-name> + <common-name>J540</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>314.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>540.0</avg-thrust-n> + <tot-impulse-ns>1161.0</tot-impulse-ns> + <burn-time-s>2.15</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=292</info-url> + <total-weight-g>1084.16</total-weight-g> + <prop-weight-g>679.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1280</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>294</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J570W</designation> + <brand-name>J570W</brand-name> + <common-name>J570</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>479.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>509.3</avg-thrust-n> + <max-thrust-n>1142.5</max-thrust-n> + <tot-impulse-ns>973.1</tot-impulse-ns> + <burn-time-s>1.91</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=294</info-url> + <total-weight-g>902.0</total-weight-g> + <prop-weight-g>535.8</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/1080</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>460</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J575FJ</designation> + <brand-name>J575FJ</brand-name> + <common-name>J575</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>478.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>593.95</avg-thrust-n> + <max-thrust-n>839.5</max-thrust-n> + <tot-impulse-ns>798.116</tot-impulse-ns> + <burn-time-s>1.34</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=460</info-url> + <prop-weight-g>576.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/1080</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>297</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J800T</designation> + <brand-name>J800T</brand-name> + <common-name>J800</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>316.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>696.5</avg-thrust-n> + <max-thrust-n>1001.0</max-thrust-n> + <tot-impulse-ns>1229.11</tot-impulse-ns> + <burn-time-s>1.76</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=297</info-url> + <total-weight-g>1085.95</total-weight-g> + <prop-weight-g>618.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1280</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>470</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J825R</designation> + <brand-name>J825R</brand-name> + <common-name>J825</common-name> + <impulse-class>J</impulse-class> + <diameter>38.0</diameter> + <length>478.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>892.9</avg-thrust-n> + <max-thrust-n>1244.3</max-thrust-n> + <tot-impulse-ns>974.9</tot-impulse-ns> + <burn-time-s>1.15</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=470</info-url> + <prop-weight-g>500.0</prop-weight-g> + <delays>M</delays> + <case-info>RMS-38/1080</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>223</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J90W</designation> + <brand-name>J90W</brand-name> + <common-name>J90</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>243.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>90.0</avg-thrust-n> + <max-thrust-n>188.0</max-thrust-n> + <tot-impulse-ns>707.0</tot-impulse-ns> + <burn-time-s>6.85</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=223</info-url> + <total-weight-g>852.544</total-weight-g> + <prop-weight-g>426.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/852</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>777</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>J99N</designation> + <brand-name>J99N</brand-name> + <common-name>J99</common-name> + <impulse-class>J</impulse-class> + <diameter>54.0</diameter> + <length>231.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>92.4</avg-thrust-n> + <max-thrust-n>151.95</max-thrust-n> + <tot-impulse-ns>945.2</tot-impulse-ns> + <burn-time-s>10.2</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=777</info-url> + <total-weight-g>899.0</total-weight-g> + <prop-weight-g>556.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/852</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>887</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1000T</designation> + <brand-name>K1000NT</brand-name> + <common-name>K1000</common-name> + <impulse-class>K</impulse-class> + <diameter>75.0</diameter> + <length>382.9</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1066.0</avg-thrust-n> + <max-thrust-n>1674.0</max-thrust-n> + <tot-impulse-ns>2511.5</tot-impulse-ns> + <burn-time-s>2.35</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=887</info-url> + <total-weight-g>2602.0</total-weight-g> + <prop-weight-g>1234.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/2560</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>590</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1050W</designation> + <brand-name>K1050W</brand-name> + <common-name>K1050</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>627.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1132.92</avg-thrust-n> + <max-thrust-n>2172.0</max-thrust-n> + <tot-impulse-ns>2426.35</tot-impulse-ns> + <burn-time-s>2.14</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=590</info-url> + <total-weight-g>2203.0</total-weight-g> + <prop-weight-g>1265.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2800</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>356</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1050W-SU</designation> + <brand-name>K1050W</brand-name> + <common-name>K1050</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>676.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1050.0</avg-thrust-n> + <max-thrust-n>2164.0</max-thrust-n> + <tot-impulse-ns>2530.0</tot-impulse-ns> + <burn-time-s>2.28</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=356</info-url> + <total-weight-g>2128.45</total-weight-g> + <prop-weight-g>1362.2</prop-weight-g> + <case-info>SU 54x676</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>358</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1100T</designation> + <brand-name>K1100T</brand-name> + <common-name>K1100</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>398.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1100.0</avg-thrust-n> + <max-thrust-n>2004.0</max-thrust-n> + <tot-impulse-ns>1472.0</tot-impulse-ns> + <burn-time-s>1.61</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=358</info-url> + <total-weight-g>1336.0</total-weight-g> + <prop-weight-g>773.3</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>969</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1103X</designation> + <brand-name>K1103X</brand-name> + <common-name>K1103</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>401.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1103.0</avg-thrust-n> + <max-thrust-n>1780.0</max-thrust-n> + <tot-impulse-ns>1789.0</tot-impulse-ns> + <burn-time-s>1.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=969</info-url> + <total-weight-g>1459.0</total-weight-g> + <prop-weight-g>830.0</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Propellant X</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>359</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1275R</designation> + <brand-name>K1275R</brand-name> + <common-name>K1275</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>568.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1275.0</avg-thrust-n> + <max-thrust-n>1554.0</max-thrust-n> + <tot-impulse-ns>2224.9</tot-impulse-ns> + <burn-time-s>1.75</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=359</info-url> + <total-weight-g>1986.0</total-weight-g> + <prop-weight-g>1222.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2560</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>454</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1499N</designation> + <brand-name>K1499N</brand-name> + <common-name>K1499</common-name> + <impulse-class>K</impulse-class> + <diameter>75.0</diameter> + <length>260.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1499.8</avg-thrust-n> + <max-thrust-n>1720.12</max-thrust-n> + <tot-impulse-ns>1321.7</tot-impulse-ns> + <burn-time-s>0.88</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=454</info-url> + <total-weight-g>1741.0</total-weight-g> + <prop-weight-g>604.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/1280</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>301</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K185W</designation> + <brand-name>K185W</brand-name> + <common-name>K185</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>437.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>185.0</avg-thrust-n> + <max-thrust-n>404.7</max-thrust-n> + <tot-impulse-ns>1417.2</tot-impulse-ns> + <burn-time-s>6.87</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=301</info-url> + <total-weight-g>1434.05</total-weight-g> + <prop-weight-g>836.8</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>458</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K1999N</designation> + <brand-name>K1999N</brand-name> + <common-name>K1999</common-name> + <impulse-class>K</impulse-class> + <diameter>98.0</diameter> + <length>289.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1887.37</avg-thrust-n> + <max-thrust-n>2159.6</max-thrust-n> + <tot-impulse-ns>2540.0</tot-impulse-ns> + <burn-time-s>1.34</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=458</info-url> + <prop-weight-g>1225.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/2560</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-26</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>306</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K250W</designation> + <brand-name>K250W</brand-name> + <common-name>K250</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>673.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>250.0</avg-thrust-n> + <max-thrust-n>545.8</max-thrust-n> + <tot-impulse-ns>2353.0</tot-impulse-ns> + <burn-time-s>9.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=306</info-url> + <total-weight-g>2211.33</total-weight-g> + <prop-weight-g>1434.0</prop-weight-g> + <delays>P</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>486</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K270W</designation> + <brand-name>K270W</brand-name> + <common-name>K270</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>579.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>249.76</avg-thrust-n> + <max-thrust-n>438.38</max-thrust-n> + <tot-impulse-ns>1967.955</tot-impulse-ns> + <burn-time-s>7.87</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=486</info-url> + <total-weight-g>2100.0</total-weight-g> + <prop-weight-g>1188.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2560</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>898</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K375NW</designation> + <brand-name>K375NW</brand-name> + <common-name>K375</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>579.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>430.58</avg-thrust-n> + <max-thrust-n>1371.77</max-thrust-n> + <tot-impulse-ns>2228.136</tot-impulse-ns> + <burn-time-s>5.78</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=898</info-url> + <total-weight-g>2106.0</total-weight-g> + <prop-weight-g>1318.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2560</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>967</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K456DM</designation> + <brand-name>K456DM</brand-name> + <common-name>K456</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>401.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>438.0</avg-thrust-n> + <max-thrust-n>534.0</max-thrust-n> + <tot-impulse-ns>1281.0</tot-impulse-ns> + <burn-time-s>2.89</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=967</info-url> + <total-weight-g>1484.0</total-weight-g> + <prop-weight-g>866.0</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>318</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K458W</designation> + <brand-name>K458W</brand-name> + <common-name>K458</common-name> + <impulse-class>K</impulse-class> + <diameter>98.0</diameter> + <length>275.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>458.0</avg-thrust-n> + <max-thrust-n>585.8</max-thrust-n> + <tot-impulse-ns>2464.6</tot-impulse-ns> + <burn-time-s>6.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=318</info-url> + <total-weight-g>3163.78</total-weight-g> + <prop-weight-g>1425.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/2560</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-26</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>899</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K480W</designation> + <brand-name>K480W</brand-name> + <common-name>K480</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>579.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>545.27</avg-thrust-n> + <max-thrust-n>1017.79</max-thrust-n> + <tot-impulse-ns>2273.26</tot-impulse-ns> + <burn-time-s>4.26</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=899</info-url> + <total-weight-g>2078.0</total-weight-g> + <prop-weight-g>1292.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2560</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>322</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K485H (3 jet)</designation> + <brand-name>K485H (3 jet)</brand-name> + <common-name>K485</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>699.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>485.0</avg-thrust-n> + <max-thrust-n>851.1</max-thrust-n> + <tot-impulse-ns>1686.8</tot-impulse-ns> + <burn-time-s>3.5</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=322</info-url> + <total-weight-g>2220.29</total-weight-g> + <prop-weight-g>923.4</prop-weight-g> + <case-info>RMS 54/1280</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>494</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K513FJ</designation> + <brand-name>K513FJ</brand-name> + <common-name>K513</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>410.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>556.84</avg-thrust-n> + <max-thrust-n>658.25</max-thrust-n> + <tot-impulse-ns>1496.27</tot-impulse-ns> + <burn-time-s>2.79</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=494</info-url> + <total-weight-g>1647.0</total-weight-g> + <prop-weight-g>974.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>905</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K540M</designation> + <brand-name>AT,Aerotech,ISP,RCS</brand-name> + <common-name>K540</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>401.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>557.4</avg-thrust-n> + <max-thrust-n>854.0</max-thrust-n> + <tot-impulse-ns>1596.33</tot-impulse-ns> + <burn-time-s>2.85</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=905</info-url> + <total-weight-g>1275.0</total-weight-g> + <prop-weight-g>876.7</prop-weight-g> + <delays>0-14</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Metalstorm</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>326</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K550W</designation> + <brand-name>K550W</brand-name> + <common-name>K550</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>410.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>396.8</avg-thrust-n> + <max-thrust-n>655.3</max-thrust-n> + <tot-impulse-ns>1539.118</tot-impulse-ns> + <burn-time-s>3.879</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=326</info-url> + <total-weight-g>1487.36</total-weight-g> + <prop-weight-g>889.1</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>329</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K560W</designation> + <brand-name>K560W</brand-name> + <common-name>K560</common-name> + <impulse-class>K</impulse-class> + <diameter>75.0</diameter> + <length>396.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>560.0</avg-thrust-n> + <max-thrust-n>753.7</max-thrust-n> + <tot-impulse-ns>2417.0</tot-impulse-ns> + <burn-time-s>4.09</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=329</info-url> + <total-weight-g>2744.0</total-weight-g> + <prop-weight-g>1424.9</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/2560</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>339</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K650T</designation> + <brand-name>K650T</brand-name> + <common-name>K650</common-name> + <impulse-class>K</impulse-class> + <diameter>98.0</diameter> + <length>289.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>650.0</avg-thrust-n> + <max-thrust-n>752.8</max-thrust-n> + <tot-impulse-ns>2405.7</tot-impulse-ns> + <burn-time-s>3.67</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=339</info-url> + <total-weight-g>2935.3</total-weight-g> + <prop-weight-g>1280.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/2560</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-26</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>343</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K680R</designation> + <brand-name>K680R</brand-name> + <common-name>K680</common-name> + <impulse-class>K</impulse-class> + <diameter>98.0</diameter> + <length>289.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>680.0</avg-thrust-n> + <max-thrust-n>835.0</max-thrust-n> + <tot-impulse-ns>2358.0</tot-impulse-ns> + <burn-time-s>3.49</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=343</info-url> + <prop-weight-g>1316.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/2560</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-26</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>344</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K695R</designation> + <brand-name>K695R</brand-name> + <common-name>K695</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>410.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>695.0</avg-thrust-n> + <tot-impulse-ns>1514.0</tot-impulse-ns> + <burn-time-s>2.17841726618705</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=344</info-url> + <total-weight-g>1487.36</total-weight-g> + <prop-weight-g>903.0</prop-weight-g> + <delays>L</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>346</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K700W</designation> + <brand-name>K700W</brand-name> + <common-name>K700</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>568.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>700.0</avg-thrust-n> + <max-thrust-n>1617.0</max-thrust-n> + <tot-impulse-ns>2261.0</tot-impulse-ns> + <burn-time-s>3.51</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=346</info-url> + <total-weight-g>2035.26</total-weight-g> + <prop-weight-g>1303.3</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2560</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>349</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K780R</designation> + <brand-name>K780R</brand-name> + <common-name>K780</common-name> + <impulse-class>K</impulse-class> + <diameter>75.0</diameter> + <length>395.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>780.0</avg-thrust-n> + <max-thrust-n>965.0</max-thrust-n> + <tot-impulse-ns>2371.0</tot-impulse-ns> + <burn-time-s>2.98</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=349</info-url> + <total-weight-g>2934.4</total-weight-g> + <prop-weight-g>1268.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/2560</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>529</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K805G</designation> + <brand-name>K805G</brand-name> + <common-name>K805</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>401.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>805.0</avg-thrust-n> + <tot-impulse-ns>1762.0</tot-impulse-ns> + <burn-time-s>2.2</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=529</info-url> + <total-weight-g>1543.0</total-weight-g> + <prop-weight-g>871.1</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/1706</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>495</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>K828FJ</designation> + <brand-name>K828FJ</brand-name> + <common-name>K828</common-name> + <impulse-class>K</impulse-class> + <diameter>54.0</diameter> + <length>579.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>828.0</avg-thrust-n> + <tot-impulse-ns>2120.0</tot-impulse-ns> + <burn-time-s>2.5</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=495</info-url> + <total-weight-g>2223.0</total-weight-g> + <prop-weight-g>1373.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2560</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>974</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1040DM</designation> + <brand-name>L1040DM</brand-name> + <common-name>L1040</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>681.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>992.0</avg-thrust-n> + <max-thrust-n>1255.0</max-thrust-n> + <tot-impulse-ns>3769.0</tot-impulse-ns> + <burn-time-s>3.79</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=974</info-url> + <total-weight-g>4717.0</total-weight-g> + <prop-weight-g>2602.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1089</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1090W</designation> + <brand-name/> + <common-name>L1090</common-name> + <impulse-class>L</impulse-class> + <diameter>54.0</diameter> + <length>625.8</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1090.0</avg-thrust-n> + <max-thrust-n>1487.0</max-thrust-n> + <tot-impulse-ns>2671.0</tot-impulse-ns> + <burn-time-s>2.45</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1089</info-url> + <total-weight-g>2432.0</total-weight-g> + <prop-weight-g>1400.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-54/2800</case-info> + <prop-info>White Thunder</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>398</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1120W</designation> + <brand-name>L1120W</brand-name> + <common-name>L1120</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1120.0</avg-thrust-n> + <max-thrust-n>1794.0</max-thrust-n> + <tot-impulse-ns>4947.0</tot-impulse-ns> + <burn-time-s>4.43</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=398</info-url> + <total-weight-g>4657.86</total-weight-g> + <prop-weight-g>2777.8</prop-weight-g> + <case-info>RMS-75/5120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>399</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1150R</designation> + <brand-name>L1150R</brand-name> + <common-name>L1150</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>530.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1150.0</avg-thrust-n> + <max-thrust-n>1346.0</max-thrust-n> + <tot-impulse-ns>3517.0</tot-impulse-ns> + <burn-time-s>3.07</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=399</info-url> + <total-weight-g>3673.6</total-weight-g> + <prop-weight-g>1902.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/3840</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>740</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1170FJ</designation> + <brand-name>L1170 FJ</brand-name> + <common-name>L1170</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1141.0</avg-thrust-n> + <max-thrust-n>1489.0</max-thrust-n> + <tot-impulse-ns>4232.0</tot-impulse-ns> + <burn-time-s>3.7</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=740</info-url> + <total-weight-g>4990.0</total-weight-g> + <prop-weight-g>2800.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1021</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1250DM</designation> + <brand-name>AT</brand-name> + <common-name>L1250</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>801.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2042.0</avg-thrust-n> + <max-thrust-n>1254.0</max-thrust-n> + <tot-impulse-ns>4374.0</tot-impulse-ns> + <burn-time-s>3.7</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1021</info-url> + <total-weight-g>5647.0</total-weight-g> + <prop-weight-g>2565.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/6400</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>402</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1300R</designation> + <brand-name>L1300R</brand-name> + <common-name>L1300</common-name> + <impulse-class>L</impulse-class> + <diameter>98.0</diameter> + <length>443.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1300.0</avg-thrust-n> + <tot-impulse-ns>4567.0</tot-impulse-ns> + <burn-time-s>3.51307692307692</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=402</info-url> + <prop-weight-g>2632.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/5120</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1020</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1365M</designation> + <brand-name>AT</brand-name> + <common-name>L1365</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1365.0</avg-thrust-n> + <max-thrust-n>1735.0</max-thrust-n> + <tot-impulse-ns>4780.0</tot-impulse-ns> + <burn-time-s>3.5</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1020</info-url> + <total-weight-g>4908.0</total-weight-g> + <prop-weight-g>2648.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Metalstorm</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>600</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1390G</designation> + <brand-name>L1390G</brand-name> + <common-name>L1390</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>530.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1390.0</avg-thrust-n> + <tot-impulse-ns>3949.0</tot-impulse-ns> + <burn-time-s>2.63</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=600</info-url> + <total-weight-g>3879.0</total-weight-g> + <prop-weight-g>1973.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/3840</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>405</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1420R</designation> + <brand-name>L1420R</brand-name> + <common-name>L1420</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1420.0</avg-thrust-n> + <max-thrust-n>1814.0</max-thrust-n> + <tot-impulse-ns>4603.0</tot-impulse-ns> + <burn-time-s>3.24</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=405</info-url> + <total-weight-g>4562.0</total-weight-g> + <prop-weight-g>2560.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>406</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1500T</designation> + <brand-name>L1500T</brand-name> + <common-name>L1500</common-name> + <impulse-class>L</impulse-class> + <diameter>98.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1500.0</avg-thrust-n> + <max-thrust-n>1752.0</max-thrust-n> + <tot-impulse-ns>5089.3</tot-impulse-ns> + <burn-time-s>3.47</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=406</info-url> + <total-weight-g>4659.2</total-weight-g> + <prop-weight-g>2490.9</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/5120</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>910</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L1520T</designation> + <brand-name>L1520T</brand-name> + <common-name>L1520</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>517.9</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1567.8</avg-thrust-n> + <max-thrust-n>1765.25</max-thrust-n> + <tot-impulse-ns>3715.9</tot-impulse-ns> + <burn-time-s>2.36</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=910</info-url> + <total-weight-g>3651.4</total-weight-g> + <prop-weight-g>1854.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-75/3840</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>587</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L2200G</designation> + <brand-name>L2200G</brand-name> + <common-name>L2200</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>681.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2200.0</avg-thrust-n> + <tot-impulse-ns>5104.0</tot-impulse-ns> + <burn-time-s>2.32</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=587</info-url> + <total-weight-g>4783.0</total-weight-g> + <prop-weight-g>2518.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1092</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L2500ST</designation> + <brand-name/> + <common-name>L2500</common-name> + <impulse-class>L</impulse-class> + <diameter>98.0</diameter> + <length>443.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2504.0</avg-thrust-n> + <max-thrust-n>2830.0</max-thrust-n> + <tot-impulse-ns>4668.0</tot-impulse-ns> + <burn-time-s>1.86</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1092</info-url> + <total-weight-g>4989.0</total-weight-g> + <prop-weight-g>2313.0</prop-weight-g> + <delays>P</delays> + <case-info>98/5120</case-info> + <prop-info>Super Thunder</prop-info> + <updated-on>2016-06-24</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>589</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L339N</designation> + <brand-name>L339N</brand-name> + <common-name>L339</common-name> + <impulse-class>L</impulse-class> + <diameter>98.0</diameter> + <length>302.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>316.5</avg-thrust-n> + <max-thrust-n>445.5</max-thrust-n> + <tot-impulse-ns>3042.9</tot-impulse-ns> + <burn-time-s>8.82</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=589</info-url> + <total-weight-g>3210.0</total-weight-g> + <prop-weight-g>1796.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/2560</case-info> + <prop-info>Warp-9</prop-info> + <updated-on>2014-07-31</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>909</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L400W</designation> + <brand-name>L400W</brand-name> + <common-name>L400</common-name> + <impulse-class>L</impulse-class> + <diameter>98.0</diameter> + <length>443.9</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>379.15</avg-thrust-n> + <max-thrust-n>770.24</max-thrust-n> + <tot-impulse-ns>4641.58</tot-impulse-ns> + <burn-time-s>12.24</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=909</info-url> + <total-weight-g>5170.0</total-weight-g> + <prop-weight-g>2696.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-98/5120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>385</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L850W</designation> + <brand-name>L850W</brand-name> + <common-name>L850</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>531.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>850.0</avg-thrust-n> + <max-thrust-n>1866.2</max-thrust-n> + <tot-impulse-ns>3646.2</tot-impulse-ns> + <burn-time-s>4.42</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=385</info-url> + <total-weight-g>3742.0</total-weight-g> + <prop-weight-g>2094.8</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/3840</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>968</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L900DM</designation> + <brand-name>L900DM</brand-name> + <common-name>L900</common-name> + <impulse-class>L</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>900.0</avg-thrust-n> + <tot-impulse-ns>3868.0</tot-impulse-ns> + <burn-time-s>4.4</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=968</info-url> + <total-weight-g>4724.0</total-weight-g> + <prop-weight-g>2472.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>389</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>L952W</designation> + <brand-name>L952W</brand-name> + <common-name>L952</common-name> + <impulse-class>L</impulse-class> + <diameter>98.0</diameter> + <length>427.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>952.0</avg-thrust-n> + <max-thrust-n>1021.5</max-thrust-n> + <tot-impulse-ns>4656.0</tot-impulse-ns> + <burn-time-s>6.15</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=389</info-url> + <total-weight-g>5012.22</total-weight-g> + <prop-weight-g>2749.7</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/5120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>973</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1075DM</designation> + <brand-name>M1075DM</brand-name> + <common-name>M1075</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>597.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1070.0</avg-thrust-n> + <max-thrust-n>1330.0</max-thrust-n> + <tot-impulse-ns>5571.0</tot-impulse-ns> + <burn-time-s>5.2</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=973</info-url> + <total-weight-g>6971.0</total-weight-g> + <prop-weight-g>3846.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>420</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1297W</designation> + <brand-name>M1297W</brand-name> + <common-name>M1297</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1297.0</avg-thrust-n> + <max-thrust-n>2048.98</max-thrust-n> + <tot-impulse-ns>5416.6</tot-impulse-ns> + <burn-time-s>4.17</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=420</info-url> + <total-weight-g>4637.0</total-weight-g> + <prop-weight-g>2722.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>972</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1305M</designation> + <brand-name>M1305M</brand-name> + <common-name>M1305</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>597.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1406.0</avg-thrust-n> + <max-thrust-n>2098.0</max-thrust-n> + <tot-impulse-ns>6891.0</tot-impulse-ns> + <burn-time-s>4.8</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=972</info-url> + <total-weight-g>7098.0</total-weight-g> + <prop-weight-g>4080.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>Metalstorm</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>421</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1315W</designation> + <brand-name>M1315W</brand-name> + <common-name>M1315</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>801.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1315.0</avg-thrust-n> + <max-thrust-n>2362.5</max-thrust-n> + <tot-impulse-ns>6713.5</tot-impulse-ns> + <burn-time-s>5.4</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=421</info-url> + <total-weight-g>5644.8</total-weight-g> + <prop-weight-g>3499.4</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/6400</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1073</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1350W</designation> + <brand-name/> + <common-name>M1350</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>622.0</length> + <type>SU</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1356.725</avg-thrust-n> + <max-thrust-n>1765.489</max-thrust-n> + <tot-impulse-ns>5178.154</tot-impulse-ns> + <burn-time-s>3.8166</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1073</info-url> + <total-weight-g>4808.0</total-weight-g> + <prop-weight-g>1970.0</prop-weight-g> + <delays>P</delays> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-25</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>424</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1419W</designation> + <brand-name>M1419W</brand-name> + <common-name>M1419</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>579.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1419.0</avg-thrust-n> + <max-thrust-n>1590.9</max-thrust-n> + <tot-impulse-ns>7755.5</tot-impulse-ns> + <burn-time-s>7.1</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=424</info-url> + <total-weight-g>6916.22</total-weight-g> + <prop-weight-g>4077.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>588</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1500G</designation> + <brand-name>M1500G</brand-name> + <common-name>M1500</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>681.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1508.67052023121</avg-thrust-n> + <tot-impulse-ns>5220.0</tot-impulse-ns> + <burn-time-s>3.46</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=588</info-url> + <total-weight-g>4896.0</total-weight-g> + <prop-weight-g>2631.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>426</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1550R</designation> + <brand-name>M1550R</brand-name> + <common-name>M1550</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>801.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1550.0</avg-thrust-n> + <max-thrust-n>2180.0</max-thrust-n> + <tot-impulse-ns>5600.0</tot-impulse-ns> + <burn-time-s>3.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=426</info-url> + <total-weight-g>5644.8</total-weight-g> + <prop-weight-g>3170.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/6400</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>428</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1600R</designation> + <brand-name>M1600R</brand-name> + <common-name>M1600</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>579.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1600.0</avg-thrust-n> + <max-thrust-n>1917.0</max-thrust-n> + <tot-impulse-ns>7084.0</tot-impulse-ns> + <burn-time-s>4.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=428</info-url> + <total-weight-g>6917.12</total-weight-g> + <prop-weight-g>4026.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>779</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1780NT</designation> + <brand-name>M1780T</brand-name> + <common-name>M1780</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>665.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1859.0</avg-thrust-n> + <max-thrust-n>3056.0</max-thrust-n> + <tot-impulse-ns>5783.0</tot-impulse-ns> + <burn-time-s>3.1</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=779</info-url> + <total-weight-g>4715.0</total-weight-g> + <prop-weight-g>2560.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-75/5120</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>584</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1800FJ</designation> + <brand-name>M1800FJ</brand-name> + <common-name>M1800</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>751.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1833.29</avg-thrust-n> + <max-thrust-n>3956.0</max-thrust-n> + <tot-impulse-ns>8207.7</tot-impulse-ns> + <burn-time-s>4.5</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=584</info-url> + <total-weight-g>9162.0</total-weight-g> + <prop-weight-g>5599.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/10240</case-info> + <prop-info>Fast Blackjack</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>780</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1845NT</designation> + <brand-name>M1845T</brand-name> + <common-name>M1845</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>597.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1875.0</avg-thrust-n> + <max-thrust-n>3081.0</max-thrust-n> + <tot-impulse-ns>8307.0</tot-impulse-ns> + <burn-time-s>4.43</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=780</info-url> + <total-weight-g>6682.0</total-weight-g> + <prop-weight-g>3772.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>461</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1850W</designation> + <brand-name>M1850W-PS</brand-name> + <common-name>M1850</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>923.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1909.6</avg-thrust-n> + <max-thrust-n>4489.4</max-thrust-n> + <tot-impulse-ns>7658.6</tot-impulse-ns> + <burn-time-s>4.01</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=461</info-url> + <prop-weight-g>4122.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/7680</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>433</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M1939W</designation> + <brand-name>M1939W</brand-name> + <common-name>M1939</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>732.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>1939.0</avg-thrust-n> + <max-thrust-n>2429.7</max-thrust-n> + <tot-impulse-ns>10481.5</tot-impulse-ns> + <burn-time-s>6.2</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=433</info-url> + <total-weight-g>8988.22</total-weight-g> + <prop-weight-g>5719.1</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/10240</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>434</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M2000R</designation> + <brand-name>M2000R</brand-name> + <common-name>M2000</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>732.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2000.0</avg-thrust-n> + <max-thrust-n>2327.0</max-thrust-n> + <tot-impulse-ns>9218.0</tot-impulse-ns> + <burn-time-s>4.0</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=434</info-url> + <total-weight-g>8986.88</total-weight-g> + <prop-weight-g>5368.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/10240</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>530</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M2030G-P</designation> + <brand-name>M2030G</brand-name> + <common-name>M2030</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>653.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2030.0</avg-thrust-n> + <tot-impulse-ns>5485.0</tot-impulse-ns> + <burn-time-s>2.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=530</info-url> + <total-weight-g>4906.0</total-weight-g> + <prop-weight-g>2663.0</prop-weight-g> + <case-info>RMS-75/5120</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>531</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M2100G</designation> + <brand-name>M2100G</brand-name> + <common-name>M2100</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>598.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2100.0</avg-thrust-n> + <tot-impulse-ns>7802.0</tot-impulse-ns> + <burn-time-s>3.7</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=531</info-url> + <total-weight-g>6918.0</total-weight-g> + <prop-weight-g>3948.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>Mojave Green</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>438</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M2400T</designation> + <brand-name>M2400T</brand-name> + <common-name>M2400</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>597.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2400.0</avg-thrust-n> + <max-thrust-n>3401.6</max-thrust-n> + <tot-impulse-ns>7716.5</tot-impulse-ns> + <burn-time-s>3.2</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=438</info-url> + <total-weight-g>6451.2</total-weight-g> + <prop-weight-g>3692.6</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/7680</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>440</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M2500T</designation> + <brand-name>M2500T</brand-name> + <common-name>M2500</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>751.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2500.0</avg-thrust-n> + <max-thrust-n>3710.9</max-thrust-n> + <tot-impulse-ns>9671.0</tot-impulse-ns> + <burn-time-s>3.85</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=440</info-url> + <total-weight-g>8064.0</total-weight-g> + <prop-weight-g>4711.2</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/10240</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1093</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M4500ST</designation> + <brand-name/> + <common-name>M4500</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>597.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>4533.0</avg-thrust-n> + <max-thrust-n>5549.0</max-thrust-n> + <tot-impulse-ns>7301.0</tot-impulse-ns> + <burn-time-s>1.6</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1093</info-url> + <total-weight-g>6622.0</total-weight-g> + <prop-weight-g>3425.0</prop-weight-g> + <delays>P</delays> + <case-info>98/7840</case-info> + <prop-info>Super Thunder</prop-info> + <updated-on>2016-06-24</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>471</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M650W</designation> + <brand-name>M650W</brand-name> + <common-name>M650</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>801.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>656.0</avg-thrust-n> + <max-thrust-n>1475.0</max-thrust-n> + <tot-impulse-ns>5964.0</tot-impulse-ns> + <burn-time-s>9.13</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=471</info-url> + <total-weight-g>5125.0</total-weight-g> + <prop-weight-g>2893.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/6400</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1008</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M685W</designation> + <brand-name> </brand-name> + <common-name>M685</common-name> + <impulse-class>M</impulse-class> + <diameter>75.0</diameter> + <length>935.9</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>657.0</avg-thrust-n> + <max-thrust-n>1517.0</max-thrust-n> + <tot-impulse-ns>7561.0</tot-impulse-ns> + <burn-time-s>11.5</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1008</info-url> + <total-weight-g>7008.0</total-weight-g> + <prop-weight-g>4320.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-75/7680</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>472</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M750W</designation> + <brand-name>M750W</brand-name> + <common-name>M750</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>732.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>744.0</avg-thrust-n> + <max-thrust-n>1454.0</max-thrust-n> + <tot-impulse-ns>9325.0</tot-impulse-ns> + <burn-time-s>12.65</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=472</info-url> + <total-weight-g>8776.0</total-weight-g> + <prop-weight-g>5540.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/10240</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>410</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>M845H</designation> + <brand-name>M845</brand-name> + <common-name>M845</common-name> + <impulse-class>M</impulse-class> + <diameter>98.0</diameter> + <length>782.0</length> + <type>hybrid</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>845.0</avg-thrust-n> + <tot-impulse-ns>6159.0</tot-impulse-ns> + <burn-time-s>7.2887573964497</burn-time-s> + <data-files>2</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=410</info-url> + <prop-weight-g>3433.0</prop-weight-g> + <case-info>RMS 98/5120</case-info> + <updated-on>2014-07-22</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>638</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>N1000W</designation> + <brand-name>N1000W</brand-name> + <common-name>N1000</common-name> + <impulse-class>N</impulse-class> + <diameter>98.0</diameter> + <length>1046.0</length> + <type>reload</type> + <cert-org>National Association of Rocketry</cert-org> + <avg-thrust-n>1079.0</avg-thrust-n> + <max-thrust-n>2262.0</max-thrust-n> + <tot-impulse-ns>14126.0</tot-impulse-ns> + <burn-time-s>13.05</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=638</info-url> + <total-weight-g>12771.0</total-weight-g> + <prop-weight-g>8293.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/15360</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>447</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>N2000W</designation> + <brand-name>N2000W</brand-name> + <common-name>N2000</common-name> + <impulse-class>N</impulse-class> + <diameter>98.0</diameter> + <length>1046.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2000.0</avg-thrust-n> + <max-thrust-n>3140.8</max-thrust-n> + <tot-impulse-ns>13347.1</tot-impulse-ns> + <burn-time-s>6.9</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=447</info-url> + <total-weight-g>12282.8</total-weight-g> + <prop-weight-g>7752.6</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/15360</case-info> + <prop-info>White Lightning</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>1022</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>N2220DM</designation> + <brand-name>AT</brand-name> + <common-name>N2220</common-name> + <impulse-class>N</impulse-class> + <diameter>98.0</diameter> + <length>1046.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>2199.0</avg-thrust-n> + <max-thrust-n>4472.0</max-thrust-n> + <tot-impulse-ns>10657.0</tot-impulse-ns> + <burn-time-s>5.4</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=1022</info-url> + <total-weight-g>11997.0</total-weight-g> + <prop-weight-g>7183.0</prop-weight-g> + <delays>P</delays> + <case-info>RMS-98/15360</case-info> + <prop-info>Dark Matter</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + <result> + <motor-id>781</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>N3300R</designation> + <brand-name>N3300R</brand-name> + <common-name>N3300</common-name> + <impulse-class>N</impulse-class> + <diameter>98.0</diameter> + <length>1046.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>3168.0</avg-thrust-n> + <max-thrust-n>4301.0</max-thrust-n> + <tot-impulse-ns>14041.0</tot-impulse-ns> + <burn-time-s>4.37</burn-time-s> + <data-files>1</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=781</info-url> + <total-weight-g>12054.0</total-weight-g> + <prop-weight-g>7512.0</prop-weight-g> + <delays>PS</delays> + <case-info>RMS-98/15360</case-info> + <prop-info>Redline</prop-info> + <updated-on>2014-07-22</updated-on> + <availability>regular</availability> + </result> + <result> + <motor-id>450</motor-id> + <manufacturer>AeroTech</manufacturer> + <manufacturer-abbrev>AeroTech</manufacturer-abbrev> + <designation>N4800T</designation> + <brand-name>N4800T</brand-name> + <common-name>N4800</common-name> + <impulse-class>N</impulse-class> + <diameter>98.0</diameter> + <length>1201.0</length> + <type>reload</type> + <cert-org>Tripoli Rocketry Association, Inc.</cert-org> + <avg-thrust-n>4800.0</avg-thrust-n> + <max-thrust-n>6599.35</max-thrust-n> + <tot-impulse-ns>19361.0</tot-impulse-ns> + <burn-time-s>4.44</burn-time-s> + <data-files>4</data-files> + <info-url>http://www.thrustcurve.org/motorsearch.jsp?id=450</info-url> + <total-weight-g>14784.0</total-weight-g> + <prop-weight-g>9570.8</prop-weight-g> + <case-info>RMS-98/18000</case-info> + <prop-info>Blue Thunder</prop-info> + <updated-on>2016-01-17</updated-on> + <availability>OOP</availability> + </result> + </results> +</search-response> \ No newline at end of file diff --git a/core/test/net/sf/openrocket/thrustcurve/SearchResponseParserTest.java b/core/test/net/sf/openrocket/thrustcurve/SearchResponseParserTest.java new file mode 100644 index 0000000000..a1c4236790 --- /dev/null +++ b/core/test/net/sf/openrocket/thrustcurve/SearchResponseParserTest.java @@ -0,0 +1,19 @@ +package net.sf.openrocket.thrustcurve; + +import static org.junit.Assert.assertEquals; + +import java.io.InputStream; + +import org.junit.Test; + +import net.sf.openrocket.util.BaseTestCase.BaseTestCase; + +public class SearchResponseParserTest extends BaseTestCase { + + @Test + public void simpleParseTest() throws Exception { + InputStream is = SearchResponseParserTest.class.getResourceAsStream("SampleSearchResponse.xml"); + SearchResponse response = SearchResponseParser.parse(is); + assertEquals(252, response.getMatches()); + } +} diff --git a/core/test/net/sf/openrocket/util/SimpleStackTest.java b/core/test/net/sf/openrocket/util/SimpleStackTest.java deleted file mode 100644 index 16cd312bed..0000000000 --- a/core/test/net/sf/openrocket/util/SimpleStackTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.sf.openrocket.util; - -import java.util.NoSuchElementException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import org.junit.Test; - -public class SimpleStackTest { - - @Test(expected=NoSuchElementException.class) - public void testEmptyStack() { - SimpleStack<Integer> s = new SimpleStack<Integer>(); - - assertNull(s.peek()); - - s.pop(); - } - - @Test - public void testPushAndPop() { - - SimpleStack<Integer> s = new SimpleStack<Integer>(); - - for( int i = 0; i< 10; i++ ) { - s.push(i); - assertEquals(i+1, s.size()); - } - - for( int i=9; i>= 0; i-- ) { - assertEquals( i, s.peek().intValue() ); - Integer val = s.pop(); - assertEquals( i, val.intValue() ); - assertEquals( i, s.size() ); - } - - assertNull( s.peek() ); - assertEquals( 0, s.size() ); - - } - -} diff --git a/core/test/net/sf/openrocket/util/TestTransformation.java b/core/test/net/sf/openrocket/util/TestTransformation.java new file mode 100644 index 0000000000..a9f9149850 --- /dev/null +++ b/core/test/net/sf/openrocket/util/TestTransformation.java @@ -0,0 +1,206 @@ +package net.sf.openrocket.util; + +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +import java.nio.DoubleBuffer; + +public class TestTransformation { + static final Coordinate x_unit = Coordinate.X_UNIT; + static final Coordinate y_unit = Coordinate.Y_UNIT; + static final Coordinate z_unit = Coordinate.Z_UNIT; + + static final double M_PI = Math.PI; + static final double M_2PI = 2*Math.PI; + static final double M_PI_2 = Math.PI/2.0; + + + @Test + public void testTransformIdentity() { + Transformation t = Transformation.IDENTITY; + assertEquals( x_unit, t.transform(x_unit) ); + assertEquals( y_unit, t.transform(y_unit) ); + assertEquals( z_unit, t.transform(z_unit) ); + } + + @Test + public void testTransformIdentityToOpenGL() { + Transformation t = Transformation.IDENTITY; + DoubleBuffer buf = t.getGLMatrix(); + + assertEquals( 1.0, buf.get(0), 1e-6); + assertEquals( 0.0, buf.get(1), 1e-6); + assertEquals( 0.0, buf.get(2), 1e-6); + assertEquals( 0.0, buf.get(3), 1e-6); + + assertEquals( 0.0, buf.get(4), 1e-6); + assertEquals( 1.0, buf.get(5), 1e-6); + assertEquals( 0.0, buf.get(6), 1e-6); + assertEquals( 0.0, buf.get(7), 1e-6); + + assertEquals( 0.0, buf.get( 8), 1e-6); + assertEquals( 0.0, buf.get( 9), 1e-6); + assertEquals( 1.0, buf.get(10), 1e-6); + assertEquals( 0.0, buf.get(11), 1e-6); + + assertEquals( 0.0, buf.get(12), 1e-6); + assertEquals( 0.0, buf.get(13), 1e-6); + assertEquals( 0.0, buf.get(14), 1e-6); + assertEquals( 1.0, buf.get(15), 1e-6); + } + + @Test + public void testTransformTranslationToOpenGL() { + Transformation translate = new Transformation( 1,2,3 ); + DoubleBuffer buf = translate.getGLMatrix(); + + assertEquals( 1.0, buf.get(0), 1e-6); + assertEquals( 0.0, buf.get(1), 1e-6); + assertEquals( 0.0, buf.get(2), 1e-6); + assertEquals( 0.0, buf.get(3), 1e-6); + + assertEquals( 0.0, buf.get(4), 1e-6); + assertEquals( 1.0, buf.get(5), 1e-6); + assertEquals( 0.0, buf.get(6), 1e-6); + assertEquals( 0.0, buf.get(7), 1e-6); + + assertEquals( 0.0, buf.get( 8), 1e-6); + assertEquals( 0.0, buf.get( 9), 1e-6); + assertEquals( 1.0, buf.get(10), 1e-6); + assertEquals( 0.0, buf.get(11), 1e-6); + + assertEquals( 1.0, buf.get(12), 1e-6); + assertEquals( 2.0, buf.get(13), 1e-6); + assertEquals( 3.0, buf.get(14), 1e-6); + assertEquals( 1.0, buf.get(15), 1e-6); + } + + + @Test + public void testTransformRotateByPI2ToOpenGL() { + Transformation translate = Transformation.getAxialRotation(M_PI_2); + DoubleBuffer buf = translate.getGLMatrix(); + + assertEquals( 1.0, buf.get(0), 1e-6); + assertEquals( 0.0, buf.get(1), 1e-6); + assertEquals( 0.0, buf.get(2), 1e-6); + assertEquals( 0.0, buf.get(3), 1e-6); + + assertEquals( 0.0, buf.get(4), 1e-6); + assertEquals( 0.0, buf.get(5), 1e-6); + assertEquals( 1.0, buf.get(6), 1e-6); + assertEquals( 0.0, buf.get(7), 1e-6); + + assertEquals( 0.0, buf.get( 8), 1e-6); + assertEquals( -1.0, buf.get( 9), 1e-6); + assertEquals( 0.0, buf.get(10), 1e-6); + assertEquals( 0.0, buf.get(11), 1e-6); + + assertEquals( 0.0, buf.get(12), 1e-6); + assertEquals( 0.0, buf.get(13), 1e-6); + assertEquals( 0.0, buf.get(14), 1e-6); + assertEquals( 1.0, buf.get(15), 1e-6); + } + + @Test + public void testTransformTranslationIndividual() { + Transformation translate = new Transformation( 1,2,3 ); + + assertEquals( new Coordinate(2,2,3), translate.transform( x_unit )); + assertEquals( new Coordinate(1,3,3), translate.transform( y_unit )); + assertEquals( new Coordinate(1,2,4), translate.transform( z_unit )); + } + + @Test + public void testTransformTranslationCoordinate() { + Transformation translate = new Transformation( new Coordinate( 2,3,4)); + + assertEquals( new Coordinate(3,3,4), translate.transform( x_unit )); + assertEquals( new Coordinate(2,4,4), translate.transform( y_unit )); + assertEquals( new Coordinate(2,3,5), translate.transform( z_unit )); + } + + @Test + public void testTransformTranslationConvenience() { + Transformation translate = Transformation.getTranslationTransform( 2,3,4); + + assertEquals( new Coordinate(3,3,4), translate.transform( x_unit )); + assertEquals( new Coordinate(2,4,4), translate.transform( y_unit )); + assertEquals( new Coordinate(2,3,5), translate.transform( z_unit )); + } + + @Test + public void testTransformSmallYRotation() { + Transformation t = Transformation.rotate_y(0.01); + + Coordinate v1 = t.transform( x_unit ); + // we need to test individual coordinates due to error. + assertEquals( 1, v1.x, .001); + assertEquals( 0, v1.y, .001); + assertEquals( -.01, v1.z, .001); + + assertEquals( y_unit, t.transform( y_unit )); + + Coordinate v2 = t.transform( z_unit ); + // we need to test individual coordinates due to error. + assertEquals( .01, v2.x, .001); + assertEquals( 0, v2.y, .001); + assertEquals( 1, v2.z, .001); + } + + @Test + public void testTransformRotateXByPI2() { + Transformation t = Transformation.getAxialRotation(M_PI_2); + + assertEquals( x_unit, t.transform(x_unit)); + assertEquals( z_unit, t.transform( y_unit )); + assertEquals( y_unit.multiply(-1), t.transform( z_unit )); + } + + + @Test + public void testTransformEuler313Transform() { + { + Transformation r313 = Transformation.getEulerAngle313Transform(0.0, 0.0, M_PI_2); + assertEquals( y_unit, r313.transform( x_unit )); + assertEquals( x_unit.multiply(-1), r313.transform( y_unit )); + assertEquals( z_unit, r313.transform( z_unit )); + }{ + Transformation r313 = Transformation.getEulerAngle313Transform(M_PI/4.0, 0.0, M_PI/4.0); + // precision = 8 decimal places + assertEquals( y_unit, r313.transform( x_unit )); + assertEquals( x_unit.multiply(-1), r313.transform( y_unit )); + assertEquals( z_unit, r313.transform( z_unit )); + }{ + Transformation r313 = Transformation.getEulerAngle313Transform(M_PI/4.0, M_PI_2, M_PI/4.0); + // precision = 8 decimal places + assertEquals( new Coordinate(+0.500000, +0.500000, 0.707106781), r313.transform( x_unit )); + assertEquals( new Coordinate(-0.500000, -0.5000000, 0.707106781), r313.transform( y_unit )); + assertEquals( new Coordinate(+0.707106781, -0.707106781, 0.0), r313.transform( z_unit )); + } + } + + @Test + public void testTransformEuler121Transform() { + Transformation r123 = Transformation.rotate_x(-1.0) + .applyTransformation(Transformation.rotate_y(0.01)) + .applyTransformation(Transformation.rotate_z(1.0)); + + + assertEquals( new Coordinate(+0.540275291, +0.450102302, -0.710992634), r123.transform( x_unit )); + assertEquals( new Coordinate(-0.841428912, +0.299007198, -0.450102302), r123.transform( y_unit )); + assertEquals( new Coordinate(+0.009999833334, +0.841428911609, +0.540275290977), r123.transform( z_unit )); + + } + + @Test + public void testTransformRotateTranslate() { + Transformation r = Transformation.getTranslationTransform( 2,3,4) + .applyTransformation(Transformation.getAxialRotation( M_PI_2 )); + + assertEquals( new Coordinate( 3,3,4), r.transform( x_unit )); + assertEquals( new Coordinate( 2,3,5), r.transform( y_unit )); + assertEquals( new Coordinate( 2,2,4), r.transform( z_unit )); + } + +} diff --git a/core/test/net/sf/openrocket/util/TransformationTest.java b/core/test/net/sf/openrocket/util/TransformationTest.java deleted file mode 100644 index cb63b3f275..0000000000 --- a/core/test/net/sf/openrocket/util/TransformationTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.sf.openrocket.util; - -import org.junit.Test; -import static org.junit.Assert.assertEquals; - - -public class TransformationTest { - @Test - public void oldMainTest() { - Transformation t; - - t = new Transformation(); - { - Coordinate a = t.transform( new Coordinate(1,0,0) ); - assertEquals( new Coordinate(1,0,0), a ); - a = t.transform( new Coordinate(0,1,0) ); - assertEquals( new Coordinate(0,1,0), a ); - a = t.transform( new Coordinate(0,0,1) ); - assertEquals( new Coordinate(0,0,1), a ); - } - - t = new Transformation(1,2,3); - { - Coordinate a = t.transform( new Coordinate(1,0,0) ); - assertEquals( new Coordinate(2,2,3), a ); - a = t.transform( new Coordinate(0,1,0) ); - assertEquals( new Coordinate(1,3,3), a ); - a = t.transform( new Coordinate(0,0,1) ); - assertEquals( new Coordinate(1,2,4), a ); - } - - - t = new Transformation(new Coordinate(2,3,4)); - { - Coordinate a = t.transform( new Coordinate(1,0,0) ); - assertEquals( new Coordinate(3,3,4), a ); - a = t.transform( new Coordinate(0,1,0) ); - assertEquals( new Coordinate(2,4,4), a ); - a = t.transform( new Coordinate(0,0,1) ); - assertEquals( new Coordinate(2,3,5), a ); - } - - t = Transformation.rotate_y(0.01); - { - Coordinate a = t.transform( new Coordinate(1,0,0) ); - // we need to test individual coordinates due to error. - assertEquals( 1, a.x, .001); - assertEquals( 0, a.y, .001); - assertEquals( -.01, a.z, .001); - a = t.transform( new Coordinate(0,1,0) ); - assertEquals( new Coordinate(0,1,0), a ); - a = t.transform( new Coordinate(0,0,1) ); - // we need to test individual coordinates due to error. - assertEquals( .01, a.x, .001); - assertEquals( 0, a.y, .001); - assertEquals( 1, a.z, .001); - } - - t = new Transformation(-1,0,0); - t = t.applyTransformation(Transformation.rotate_y(0.01)); - t = t.applyTransformation(new Transformation(1,0,0)); - { - Coordinate a = t.transform( new Coordinate(1,0,0) ); - // we need to test individual coordinates due to error. - assertEquals( 1, a.x, .001); - assertEquals( 0, a.y, .001); - assertEquals( -.02, a.z, .001); - a = t.transform( new Coordinate(0,1,0) ); - assertEquals( 0, a.x, .001); - assertEquals( 1, a.y, .001); - assertEquals( -.01, a.z, .001); - a = t.transform( new Coordinate(0,0,1) ); - // we need to test individual coordinates due to error. - assertEquals( .01, a.x, .001); - assertEquals( 0, a.y, .001); - assertEquals( .99, a.z, .001); - } - } - - -} diff --git a/core/web/html/techdoc.pdf b/core/web/html/techdoc.pdf deleted file mode 100644 index 86a85a5332..0000000000 Binary files a/core/web/html/techdoc.pdf and /dev/null differ diff --git a/lib-test/OpenRocket Test Libraries.iml b/lib-test/OpenRocket Test Libraries.iml index 82b2558c03..b9af6028ca 100644 --- a/lib-test/OpenRocket Test Libraries.iml +++ b/lib-test/OpenRocket Test Libraries.iml @@ -10,11 +10,12 @@ <libelement value="jar://$MODULE_DIR$/uispec4j-2.3-jdk16.jar!/" /> <src_description expected_position="0" /> </component> - <component name="NewModuleRootManager" inherit-compiler-output="false"> + <component name="NewModuleRootManager"> <output url="file://$MODULE_DIR$/bin" /> <exclude-output /> <content url="file://$MODULE_DIR$" /> <orderEntry type="sourceFolder" forTests="false" /> + <orderEntry type="inheritedJdk" /> <orderEntry type="module-library"> <library name="hamcrest-core-1.3.0RC1.jar"> <CLASSES> @@ -78,6 +79,5 @@ <SOURCES /> </library> </orderEntry> - <orderEntry type="inheritedJdk" /> </component> </module> \ No newline at end of file diff --git a/swing/.classpath b/swing/.classpath index 8305c734ce..4eb2bf8e27 100644 --- a/swing/.classpath +++ b/swing/.classpath @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="test"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="lib" path="lib/jogl/jogl-all.jar"/> <classpathentry kind="lib" path="lib/iText-5.0.2.jar"/> @@ -22,5 +23,12 @@ <classpathentry kind="lib" path="/OpenRocket Core/lib/annotation-detector-3.0.2.jar"/> <classpathentry kind="lib" path="lib/miglayout-4.0-swing.jar" sourcepath="reference/miglayout-4.0-sources.jar"/> <classpathentry kind="lib" path="lib/rsyntaxtextarea-2.5.6.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/hamcrest-core-1.3.0RC1.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/hamcrest-library-1.3.0RC1.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/jmock-2.6.0-RC2.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/jmock-junit4-2.6.0-RC2.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/junit-dep-4.8.2.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/test-plugin.jar"/> + <classpathentry kind="lib" path="/OpenRocket Test Libraries/uispec4j-2.3-jdk16.jar"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/swing/.settings/org.eclipse.jdt.core.prefs b/swing/.settings/org.eclipse.jdt.core.prefs index 790bdcb1e2..92ecaad14b 100644 --- a/swing/.settings/org.eclipse.jdt.core.prefs +++ b/swing/.settings/org.eclipse.jdt.core.prefs @@ -7,9 +7,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -97,4 +97,4 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/swing/OpenRocket Swing.iml b/swing/OpenRocket Swing.iml index 045ebe7be4..95b144e5ff 100644 --- a/swing/OpenRocket Swing.iml +++ b/swing/OpenRocket Swing.iml @@ -24,11 +24,12 @@ <src_folder value="file://$MODULE_DIR$/src" expected_position="0" /> </src_description> </component> - <component name="NewModuleRootManager" inherit-compiler-output="false"> + <component name="NewModuleRootManager"> <output url="file://$MODULE_DIR$/bin" /> <exclude-output /> <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" /> </content> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="inheritedJdk" /> @@ -206,5 +207,76 @@ <SOURCES /> </library> </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/hamcrest-core-1.3.0RC1.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/../lib-test/hamcrest-core-1.3.0RC1.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/hamcrest-library-1.3.0RC1.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/../lib-test/hamcrest-library-1.3.0RC1.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/jmock-2.6.0-RC2.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/../lib-test/jmock-2.6.0-RC2.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/jmock-junit4-2.6.0-RC2.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$MODULE_DIR$/../lib-test/jmock-junit4-2.6.0-RC2.jar!/" /> + </SOURCES> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/junit-dep-4.8.2.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/test-plugin.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> + <orderEntry type="module-library"> + <library> + <CLASSES> + <root url="jar://$MODULE_DIR$/../lib-test/uispec4j-2.3-jdk16.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES /> + </library> + </orderEntry> </component> </module> \ No newline at end of file diff --git a/swing/build.xml b/swing/build.xml index d6c4f9d10b..f31835fcc6 100644 --- a/swing/build.xml +++ b/swing/build.xml @@ -71,7 +71,7 @@ <target name="build"> <mkdir dir="${classes.dir}"/> <echo level="info">Compiling main classes</echo> - <javac debug="true" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" source="1.7" target="1.7"/> + <javac debug="true" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" source="1.8" target="1.8"/> </target> <!-- Executible Eclipse-Jar-In-Jar style JAR --> diff --git a/swing/resources/datafiles/examples/Parallel Staging Example.ork b/swing/resources/datafiles/examples/Parallel Staging Example.ork new file mode 100644 index 0000000000..0059881914 Binary files /dev/null and b/swing/resources/datafiles/examples/Parallel Staging Example.ork differ diff --git a/swing/resources/datafiles/examples/Pods Example.ork b/swing/resources/datafiles/examples/Pods Example.ork new file mode 100644 index 0000000000..e8192d1087 Binary files /dev/null and b/swing/resources/datafiles/examples/Pods Example.ork differ diff --git a/swing/resources/datafiles/presets/system.ser b/swing/resources/datafiles/presets/system.ser index 5342b5a8df..28a7bbe93e 100644 Binary files a/swing/resources/datafiles/presets/system.ser and b/swing/resources/datafiles/presets/system.ser differ diff --git a/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java b/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java index 2d1deb444a..4ab2f4b15b 100644 --- a/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java +++ b/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java @@ -19,6 +19,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * + * Loader that gets all component preset from the database in directory datafiles/preset + * + */ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader { private final static Logger log = LoggerFactory.getLogger(ComponentPresetDatabaseLoader.class); @@ -27,6 +32,7 @@ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader { private int fileCount = 0; private int presetCount = 0; + /** the database is immutable*/ private final ComponentPresetDatabase componentPresetDao = new ComponentPresetDatabase(); public ComponentPresetDatabaseLoader() { @@ -47,51 +53,72 @@ public ComponentPresetDatabase getDatabase() { @Override protected void loadDatabase() { long startTime = System.currentTimeMillis(); + loadPresetComponents(); + loadUserComponents(); + long end = System.currentTimeMillis(); + log.debug("Time to load presets: " + (end - startTime) + "ms " + presetCount + " loaded from " + fileCount + " files"); - log.info("Loading component presets from " + SYSTEM_PRESET_DIR); - - FileIterator iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR, new SimpleFileFilter("", false, "ser")); - - if (iterator != null) { - while (iterator.hasNext()) { - Pair<String, InputStream> f = iterator.next(); - try { - ObjectInputStream ois = new ObjectInputStream(f.getV()); - List<ComponentPreset> list = (List<ComponentPreset>) ois.readObject(); - componentPresetDao.addAll(list); - fileCount++; - presetCount += list.size(); - } catch (Exception ex) { - throw new BugException(ex); - } - } - } - + } + + /** + * loads the user defined defined components into the database + * uses the directory defined in the preferences + */ + private void loadUserComponents() { SimpleFileFilter orcFilter = new SimpleFileFilter("", false, "orc"); + FileIterator iterator; try { iterator = new DirectoryIterator( ((SwingPreferences) Application.getPreferences()).getDefaultUserComponentDirectory(), orcFilter, true); } catch (IOException ioex) { - iterator = null; log.debug("Error opening UserComponentDirectory", ioex); + return; } - if (iterator != null) { - while (iterator.hasNext()) { - Pair<String, InputStream> f = iterator.next(); - Collection<ComponentPreset> presets = loadFile(f.getU(), f.getV()); - componentPresetDao.addAll(presets); - fileCount++; - presetCount += presets.size(); - } + while (iterator.hasNext()) { + Pair<String, InputStream> f = iterator.next(); + Collection<ComponentPreset> presets = loadFile(f.getU(), f.getV()); + componentPresetDao.addAll(presets); + fileCount++; + presetCount += presets.size(); } + } + + /** + * loads the default preset components into the database + * uses the file directory from "datafiles/presets" + */ + private void loadPresetComponents() { + log.info("Loading component presets from " + SYSTEM_PRESET_DIR); + FileIterator iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR, new SimpleFileFilter("", false, "ser")); - long end = System.currentTimeMillis(); - log.debug("Time to load presets: " + (end - startTime) + "ms " + presetCount + " loaded from " + fileCount + " files"); + if(iterator == null) + return; + while (iterator.hasNext()) { + Pair<String, InputStream> f = iterator.next(); + try { + ObjectInputStream ois = new ObjectInputStream(f.getV()); + @SuppressWarnings("unchecked") + List<ComponentPreset> list = (List<ComponentPreset>) ois.readObject(); + componentPresetDao.addAll(list); + fileCount++; + presetCount += list.size(); + } catch (Exception ex) { + throw new BugException(ex); + } + } } + /** + * load components from a custom component file + * uses an OpenRocketComponentLoader for the job + * + * @param fileName name of the file to be + * @param stream the input stream to the file + * @return a collection of components preset from the file + */ private Collection<ComponentPreset> loadFile(String fileName, InputStream stream) { log.debug("loading from file: " + fileName); OpenRocketComponentLoader loader = new OpenRocketComponentLoader(); diff --git a/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java b/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java index 97f36f60bf..47b1f3f28d 100644 --- a/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java +++ b/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java @@ -8,21 +8,20 @@ import java.io.ObjectInputStream; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.database.motor.ThrustCurveMotorSetDatabase; import net.sf.openrocket.file.iterator.DirectoryIterator; import net.sf.openrocket.file.iterator.FileIterator; import net.sf.openrocket.file.motor.GeneralMotorLoader; import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SwingPreferences; -import net.sf.openrocket.motor.Motor; import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Pair; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * An asynchronous database loader that loads the internal thrust curves * and external user-supplied thrust curves to a ThrustCurveMotorSetDatabase. @@ -40,7 +39,9 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { private final ThrustCurveMotorSetDatabase database = new ThrustCurveMotorSetDatabase(); private int motorCount = 0; - + /** + * sole constructor, default startup delay = 0 + */ public MotorDatabaseLoader() { super(STARTUP_DELAY); } @@ -48,19 +49,18 @@ public MotorDatabaseLoader() { @Override protected void loadDatabase() { - + loadSerializedMotorDatabase(); + loadUserDefinedMotors(); + } + + + /** + * Loads the user defined motors + * the directories are defined in the preferences + */ + private void loadUserDefinedMotors() { GeneralMotorLoader loader = new GeneralMotorLoader(); SimpleFileFilter fileFilter = new SimpleFileFilter("", loader.getSupportedExtensions()); - - log.info("Starting reading serialized motor database"); - FileIterator iterator = DirectoryIterator.findDirectory(THRUSTCURVE_DIRECTORY, new SimpleFileFilter("", false, "ser")); - while (iterator.hasNext()) { - Pair<String, InputStream> f = iterator.next(); - loadSerialized(f); - } - log.info("Ending reading serialized motor database, motorCount=" + motorCount); - - log.info("Starting reading user-defined motors"); for (File file : ((SwingPreferences) Application.getPreferences()).getUserThrustCurveFiles()) { if (file.isFile()) { @@ -72,44 +72,87 @@ protected void loadDatabase() { } } log.info("Ending reading user-defined motors, motorCount=" + motorCount); - + } + + + /** + * Loads the default, with established serialized manufacturing and data + * uses directory "datafiles/thrustcurves" for data + */ + private void loadSerializedMotorDatabase() { + log.info("Starting reading serialized motor database"); + FileIterator iterator = DirectoryIterator.findDirectory(THRUSTCURVE_DIRECTORY, new SimpleFileFilter("", false, "ser")); + while (iterator.hasNext()) { + Pair<String, InputStream> f = iterator.next(); + loadSerialized(f); + } + log.info("Ending reading serialized motor database, motorCount=" + motorCount); } - + /** + * loads a serailized motor data from an stream + * + * @param f the pair of a String with the filename (for logging) and the input stream + */ @SuppressWarnings("unchecked") private void loadSerialized(Pair<String, InputStream> f) { try { log.debug("Reading motors from file " + f.getU()); ObjectInputStream ois = new ObjectInputStream(f.getV()); - List<Motor> motors = (List<Motor>) ois.readObject(); + List<ThrustCurveMotor> motors = (List<ThrustCurveMotor>) ois.readObject(); addMotors(motors); } catch (Exception ex) { throw new BugException(ex); } } - + /** + * loads a single motor file into the database using a simple file handler object + * + * @param loader the motor loading handler object + * @param file the File to the file itself + */ private void loadFile(GeneralMotorLoader loader, File file) { - BufferedInputStream bis = null; try { log.debug("Loading motors from file " + file); - bis = new BufferedInputStream(new FileInputStream(file)); - List<Motor> motors = loader.load(bis, file.getName()); - addMotors(motors); - bis.close(); + loadFile( + loader, + new Pair<String,InputStream>( + file.getName(), + new BufferedInputStream(new FileInputStream(file)))); } catch (IOException e) { log.warn("IOException while reading " + file + ": " + e, e); - if (bis != null) { - try { - bis.close(); - } catch (IOException e1) { - - } + } + } + + /** + * loads a single motor file into the database using inputStream instead of file object + * + * @param loader an object to handle the loading + * @param f the pair of File name and its input stream + */ + private void loadFile(GeneralMotorLoader loader, Pair<String, InputStream> f) { + try { + List<ThrustCurveMotor.Builder> motors = loader.load(f.getV(), f.getU()); + addMotorsFromBuilders(motors); + f.getV().close(); + } catch (IOException e) { + log.warn("IOException while loading file " + f.getU() + ": " + e, e); + try { + f.getV().close(); + } catch (IOException e1) { } } } + /** + * loads an entire directory of motor files + * + * @param loader a motor loading handler object + * @param fileFilter the supported extensions of files + * @param file the directory file object + */ private void loadDirectory(GeneralMotorLoader loader, SimpleFileFilter fileFilter, File file) { FileIterator iterator; try { @@ -119,25 +162,33 @@ private void loadDirectory(GeneralMotorLoader loader, SimpleFileFilter fileFilte return; } while (iterator.hasNext()) { - Pair<String, InputStream> f = iterator.next(); - try { - List<Motor> motors = loader.load(f.getV(), f.getU()); - addMotors(motors); - f.getV().close(); - } catch (IOException e) { - log.warn("IOException while loading file " + f.getU() + ": " + e, e); - try { - f.getV().close(); - } catch (IOException e1) { - } - } + loadFile(loader, iterator.next()); } } + + - private synchronized void addMotors(List<Motor> motors) { - for (Motor m : motors) { + + /** + * adds a motor list into the database + * @param motors the list of motors to be added + */ + private synchronized void addMotors(List<ThrustCurveMotor> motors) { + for (ThrustCurveMotor m : motors) { + motorCount++; + database.addMotor(m); + } + } + + /** + * builds the motors while building them + * + * @param motorBuilders List of motor builders to be used for adding motor into the database + */ + private synchronized void addMotorsFromBuilders(List<ThrustCurveMotor.Builder> motorBuilders) { + for (ThrustCurveMotor.Builder m : motorBuilders) { motorCount++; - database.addMotor((ThrustCurveMotor) m); + database.addMotor(m.build()); } } diff --git a/swing/src/net/sf/openrocket/file/motor/MotorLoaderHelper.java b/swing/src/net/sf/openrocket/file/motor/MotorLoaderHelper.java index a8ebf97803..deacaad41f 100644 --- a/swing/src/net/sf/openrocket/file/motor/MotorLoaderHelper.java +++ b/swing/src/net/sf/openrocket/file/motor/MotorLoaderHelper.java @@ -34,7 +34,7 @@ private MotorLoaderHelper() { * @param target the file or directory to load. * @return a list of all motors in the file/directory. */ - public static List<Motor> load(File target) { + public static List<ThrustCurveMotor.Builder> load(File target) { GeneralMotorLoader loader = new GeneralMotorLoader(); if (target.isDirectory()) { @@ -68,10 +68,10 @@ public static List<Motor> load(File target) { } } - public static List<Motor> load( InputStream is, String fileName ) { + public static List<ThrustCurveMotor.Builder> load( InputStream is, String fileName ) { GeneralMotorLoader loader = new GeneralMotorLoader(); try { - List<Motor> motors = loader.load(is, fileName); + List<ThrustCurveMotor.Builder> motors = loader.load(is, fileName); if (motors.size() == 0) { log.warn("No motors found in file " + fileName); } @@ -79,7 +79,7 @@ public static List<Motor> load( InputStream is, String fileName ) { } catch (IOException e) { log.warn("IOException when loading motor file " + fileName, e); } - return Collections.<Motor>emptyList(); + return Collections.<ThrustCurveMotor.Builder>emptyList(); } /** @@ -91,16 +91,16 @@ public static List<Motor> load( InputStream is, String fileName ) { * @param iterator the FileIterator that iterates of the files to load. * @return a list of all motors loaded. */ - public static List<Motor> load(FileIterator iterator) { - List<Motor> list = new ArrayList<Motor>(); + public static List<ThrustCurveMotor.Builder> load(FileIterator iterator) { + List<ThrustCurveMotor.Builder> list = new ArrayList<ThrustCurveMotor.Builder>(); while (iterator.hasNext()) { final Pair<String, InputStream> input = iterator.next(); log.debug("Loading motors from file " + input.getU()); try { - List<Motor> motors = load(input.getV(), input.getU()); - for (Motor m : motors) { - list.add((ThrustCurveMotor) m); + List<ThrustCurveMotor.Builder> motors = load(input.getV(), input.getU()); + for (ThrustCurveMotor.Builder m : motors) { + list.add(m); } } finally { try { diff --git a/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java b/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java index 8c30c74760..2f631058aa 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java @@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory; import net.sf.openrocket.logging.Markers; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.Invalidatable; @@ -40,6 +41,7 @@ * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class BooleanModel extends AbstractAction implements StateChangeListener, Invalidatable { + private static final long serialVersionUID = -7299680391506320196L; private static final Logger log = LoggerFactory.getLogger(BooleanModel.class); private final ChangeSource source; @@ -100,8 +102,11 @@ public BooleanModel(ChangeSource source, String valueName) { this.valueName = valueName; Method getter = null, setter = null; - - + + if(RocketComponent.class.isAssignableFrom(source.getClass())) { + ((RocketComponent)source).addChangeListener(this); + } + // Try get/is and set try { getter = source.getClass().getMethod("is" + valueName); diff --git a/swing/src/net/sf/openrocket/gui/adaptors/Column.java b/swing/src/net/sf/openrocket/gui/adaptors/Column.java index 1c51f98afa..92df4b54f0 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/Column.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/Column.java @@ -96,7 +96,7 @@ public void setValueAt(int row, Object value ) { * * @return */ - public Comparator getComparator() { + public Comparator<?> getComparator() { return null; } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/ColumnTable.java b/swing/src/net/sf/openrocket/gui/adaptors/ColumnTable.java index f0e9373450..5e8f430ab1 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/ColumnTable.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/ColumnTable.java @@ -5,6 +5,7 @@ import javax.swing.JTable; import javax.swing.table.JTableHeader; +@SuppressWarnings("serial") public class ColumnTable extends JTable { public ColumnTable( ColumnTableModel model ) { diff --git a/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableModel.java b/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableModel.java index 31827b6f7d..38f915bcba 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableModel.java @@ -6,6 +6,7 @@ import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public abstract class ColumnTableModel extends AbstractTableModel { private final Column[] columns; diff --git a/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableRowSorter.java b/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableRowSorter.java index bf424bfeec..e3c336beac 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableRowSorter.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/ColumnTableRowSorter.java @@ -4,7 +4,7 @@ import javax.swing.table.TableRowSorter; -public class ColumnTableRowSorter extends TableRowSorter { +public class ColumnTableRowSorter extends TableRowSorter<ColumnTableModel> { private final ColumnTableModel columnTableModel; @@ -14,8 +14,8 @@ public ColumnTableRowSorter(ColumnTableModel model) { } @Override - public Comparator getComparator(int column) { - Comparator c = columnTableModel.getColumn(column).getComparator(); + public Comparator<?> getComparator(int column) { + Comparator<?> c = columnTableModel.getColumn(column).getComparator(); return (c!= null) ? c : super.getComparator(column); } @@ -30,7 +30,7 @@ public Comparator getComparator(int column) { */ @Override protected boolean useToString(int column) { - Comparator c = columnTableModel.getColumn(column).getComparator(); + Comparator<?> c = columnTableModel.getColumn(column).getComparator(); return ( c != null ) ? false : super.useToString(column); } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/DecalModel.java b/swing/src/net/sf/openrocket/gui/adaptors/DecalModel.java index 28bf50aad0..5880d564db 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/DecalModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/DecalModel.java @@ -16,13 +16,15 @@ import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; +import net.sf.openrocket.appearance.defaults.ResourceDecalImage; -public class DecalModel extends AbstractListModel implements ComboBoxModel { - +public class DecalModel extends AbstractListModel<DecalImage> implements ComboBoxModel<DecalImage> { + private static final long serialVersionUID = -3922419344990421156L; private static final Translator trans = Application.getTranslator(); - private static final String NONE_SELECTED = trans.get("lbl.select"); - private static final String SELECT_FILE = trans.get("lbl.choose"); + private static final ResourceDecalImage NONE_SELECTED = new ResourceDecalImage(trans.get("lbl.select")); + + private static final ResourceDecalImage SELECT_FILE = new ResourceDecalImage(trans.get("lbl.choose")); private final OpenRocketDocument document; private final Component parent; @@ -45,7 +47,7 @@ public int getSize() { } @Override - public Object getElementAt(int index) { + public DecalImage getElementAt(int index) { if (index <= 0) { return NONE_SELECTED; } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java b/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java index 893cc331ce..6fb903c53d 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/DoubleModel.java @@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory; import net.sf.openrocket.logging.Markers; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.BugException; @@ -64,6 +65,7 @@ public class DoubleModel implements StateChangeListener, ChangeSource, Invalidat * This is still the design, but now extends AbstractSpinnerModel to allow other characters * to be entered so that fractional units and expressions can be used. */ + @SuppressWarnings("serial") public class ValueSpinnerModel extends AbstractSpinnerModel implements Invalidatable { private ExpressionParser parser = new ExpressionParser(); @@ -443,6 +445,7 @@ public BoundedRangeModel getSliderModel(double min, double pos, double mid, doub //////////// Action model //////////// + @SuppressWarnings("serial") private class AutomaticActionModel extends AbstractAction implements StateChangeListener, Invalidatable { private boolean oldValue = false; @@ -548,7 +551,7 @@ public Action getAutomaticAction() { * The main model handles all values in SI units, i.e. no conversion is made within the model. */ - private final ChangeSource source; + private final Object source; private final String valueName; private final double multiplier; @@ -643,7 +646,7 @@ public DoubleModel(double value, UnitGroup unit, double min, double max) { * @param min Minimum value allowed (in SI units) * @param max Maximum value allowed (in SI units) */ - public DoubleModel(ChangeSource source, String valueName, double multiplier, UnitGroup unit, + public DoubleModel(Object source, String valueName, double multiplier, UnitGroup unit, double min, double max) { this.source = source; this.valueName = valueName; @@ -655,6 +658,10 @@ public DoubleModel(ChangeSource source, String valueName, double multiplier, Uni this.minValue = min; this.maxValue = max; + if(RocketComponent.class.isAssignableFrom(source.getClass())) { + ((RocketComponent)source).addChangeListener(this); + } + try { getMethod = source.getClass().getMethod("get" + valueName); } catch (NoSuchMethodException e) { @@ -689,43 +696,42 @@ public DoubleModel(ChangeSource source, String valueName, double multiplier, Uni } - public DoubleModel(ChangeSource source, String valueName, double multiplier, UnitGroup unit, + public DoubleModel(Object source, String valueName, double multiplier, UnitGroup unit, double min) { this(source, valueName, multiplier, unit, min, Double.POSITIVE_INFINITY); } - public DoubleModel(ChangeSource source, String valueName, double multiplier, UnitGroup unit) { + public DoubleModel(Object source, String valueName, double multiplier, UnitGroup unit) { this(source, valueName, multiplier, unit, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); } - public DoubleModel(ChangeSource source, String valueName, UnitGroup unit, + public DoubleModel(Object source, String valueName, UnitGroup unit, double min, double max) { this(source, valueName, 1.0, unit, min, max); } - public DoubleModel(ChangeSource source, String valueName, UnitGroup unit, double min) { + public DoubleModel(Object source, String valueName, UnitGroup unit, double min) { this(source, valueName, 1.0, unit, min, Double.POSITIVE_INFINITY); } - public DoubleModel(ChangeSource source, String valueName, UnitGroup unit) { + public DoubleModel(Object source, String valueName, UnitGroup unit) { this(source, valueName, 1.0, unit, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); } - public DoubleModel(ChangeSource source, String valueName) { + public DoubleModel(Object source, String valueName) { this(source, valueName, 1.0, UnitGroup.UNITS_NONE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); } - public DoubleModel(ChangeSource source, String valueName, double min) { + public DoubleModel(Object source, String valueName, double min) { this(source, valueName, 1.0, UnitGroup.UNITS_NONE, min, Double.POSITIVE_INFINITY); } - public DoubleModel(ChangeSource source, String valueName, double min, double max) { + public DoubleModel(Object source, String valueName, double min, double max) { this(source, valueName, 1.0, UnitGroup.UNITS_NONE, min, max); } - /** * Returns the value of the variable (in SI units). */ @@ -880,7 +886,6 @@ public void addChangeListener(EventListener l) { if (listeners.isEmpty()) { if (source != null) { - source.addChangeListener(this); lastValue = getValue(); lastAutomatic = isAutomatic(); } @@ -909,9 +914,6 @@ public void removeChangeListener(EventListener l) { checkState(false); listeners.remove(l); - if (listeners.isEmpty() && source != null) { - source.removeChangeListener(this); - } log.trace(this + " removing listener (total " + listeners.size() + "): " + l); } @@ -930,9 +932,6 @@ public void invalidate() { log.warn("Invalidating " + this + " while still having listeners " + listeners); } listeners.clear(); - if (source != null) { - source.removeChangeListener(this); - } MemoryManagement.collectable(this); } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/EnumModel.java b/swing/src/net/sf/openrocket/gui/adaptors/EnumModel.java index 4a7b49f98e..3b5fda722f 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/EnumModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/EnumModel.java @@ -7,40 +7,37 @@ import javax.swing.ComboBoxModel; import javax.swing.MutableComboBoxModel; -import org.jfree.util.Log; - -import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.Reflection; import net.sf.openrocket.util.StateChangeListener; -public class EnumModel<T extends Enum<T>> extends AbstractListModel - implements ComboBoxModel, MutableComboBoxModel, StateChangeListener { - - private final ChangeSource source; +public class EnumModel<T extends Enum<T>> extends AbstractListModel<T> + implements ComboBoxModel<T>, MutableComboBoxModel<T>, StateChangeListener { + private static final long serialVersionUID = 7766446027840316797L; + private final Object source; private final String valueName; private final String nullText; - private final Enum<T>[] values; - private Enum<T> currentValue = null; + private final T[] values; + private T currentValue = null; - ArrayList<Enum<T>> displayedValues = new ArrayList<Enum<T>>(); + ArrayList<T> displayedValues = new ArrayList<T>(); private final Reflection.Method getMethod; private final Reflection.Method setMethod; - public EnumModel(ChangeSource source, String valueName) { + public EnumModel(Object source, String valueName) { this(source,valueName,null,null); } - public EnumModel(ChangeSource source, String valueName, Enum<T>[] values) { + public EnumModel(Object source, String valueName, T[] values) { this(source, valueName, values, null); } @SuppressWarnings("unchecked") - public EnumModel(ChangeSource source, String valueName, Enum<T>[] values, String nullText) { + public EnumModel(Object source, String valueName, T[] values, String nullText) { Class<? extends Enum<T>> enumClass; this.source = source; this.valueName = valueName; @@ -64,15 +61,14 @@ public EnumModel(ChangeSource source, String valueName, Enum<T>[] values, String if (values != null) this.values = values; else - this.values = enumClass.getEnumConstants(); + this.values = (T[]) enumClass.getEnumConstants(); - for (Enum<T> e : this.values){ + for (T e : this.values){ this.displayedValues.add( e ); } this.nullText = nullText; stateChanged(null); // Update current value - source.addChangeListener(this); } @@ -84,6 +80,7 @@ public Object getSelectedItem() { return currentValue; } + @SuppressWarnings("unchecked") @Override public void setSelectedItem(Object item) { if (item == null) { @@ -103,17 +100,19 @@ public void setSelectedItem(Object item) { // Comparison with == ok, since both are enums if (currentValue == item) return; + + this.currentValue = (T) item; setMethod.invoke(source, item); } @Override - public Object getElementAt(int index) { + public T getElementAt(int index) { if( ( index < 0 ) || ( index >= this.displayedValues.size())){ - return nullText; // bad parameter + return null; // bad parameter } if (values[index] == null) - return nullText; + return null; return displayedValues.get( index); } @@ -125,14 +124,12 @@ public int getSize() { @SuppressWarnings("unchecked") @Override public void stateChanged(EventObject e) { - Enum<T> value = (Enum<T>) getMethod.invoke(source); + T value = (T) getMethod.invoke(source); if (value != currentValue) { currentValue = value; this.fireContentsChanged(this, 0, values.length); } } - - @Override public String toString() { @@ -140,7 +137,7 @@ public String toString() { } @Override - public void addElement(Object item) { + public void addElement(T item) { // Not actually allowed. The model starts out with all the enums, and only allows hiding some. } @@ -153,7 +150,7 @@ public void removeElement(Object obj) { } @Override - public void insertElementAt(Object item, int index) { + public void insertElementAt(T item, int index) { // Not actually allowed. The model starts out with all the enums, and only allows hiding some. } diff --git a/swing/src/net/sf/openrocket/gui/adaptors/FlightConfigurationModel.java b/swing/src/net/sf/openrocket/gui/adaptors/FlightConfigurationModel.java deleted file mode 100644 index a0717117cb..0000000000 --- a/swing/src/net/sf/openrocket/gui/adaptors/FlightConfigurationModel.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.sf.openrocket.gui.adaptors; - - -import java.util.EventObject; -import java.util.HashMap; -import java.util.Map; - -import javax.swing.ComboBoxModel; -import javax.swing.event.EventListenerList; -import javax.swing.event.ListDataEvent; -import javax.swing.event.ListDataListener; - -import net.sf.openrocket.formatting.RocketDescriptor; -import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.StateChangeListener; - -/** - * A ComboBoxModel that contains a list of flight configurations. The list can - * optionally contain a last element that opens up the configuration edit dialog. - */ -public class FlightConfigurationModel implements ComboBoxModel, StateChangeListener { - private static final Translator trans = Application.getTranslator(); - - private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); - - - private EventListenerList listenerList = new EventListenerList(); - - private final Configuration config; - private final Rocket rocket; - - private Map<String, ID> map = new HashMap<String, ID>(); - - - public FlightConfigurationModel(Configuration config) { - this.config = config; - this.rocket = config.getRocket(); - config.addChangeListener(this); - } - - - @Override - public Object getElementAt(int index) { - String[] ids = rocket.getFlightConfigurationIDs(); - - if (index < 0) - return null; - if ( index >= ids.length) - return null; - - return get(ids[index]); - } - - @Override - public int getSize() { - return rocket.getFlightConfigurationIDs().length; - } - - @Override - public Object getSelectedItem() { - return get(config.getFlightConfigurationID()); - } - - @Override - public void setSelectedItem(Object item) { - if (item == null) { - // Clear selection - huh? - return; - } - if (!(item instanceof ID)) { - throw new IllegalArgumentException("MotorConfigurationModel item=" + item); - } - - ID idObject = (ID) item; - config.setFlightConfigurationID(idObject.getID()); - } - - - - //////////////// Event/listener handling //////////////// - - - @Override - public void addListDataListener(ListDataListener l) { - listenerList.add(ListDataListener.class, l); - } - - @Override - public void removeListDataListener(ListDataListener l) { - listenerList.remove(ListDataListener.class, l); - } - - protected void fireListDataEvent() { - Object[] listeners = listenerList.getListenerList(); - ListDataEvent e = null; - - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == ListDataListener.class) { - if (e == null) - e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, getSize()); - ((ListDataListener) listeners[i + 1]).contentsChanged(e); - } - } - } - - - @Override - public void stateChanged(EventObject e) { - if (e instanceof ComponentChangeEvent) { - // Ignore unnecessary changes - if (!((ComponentChangeEvent) e).isMotorChange()) - return; - } - fireListDataEvent(); - } - - - - /* - * The ID class is an adapter, that contains the actual configuration ID, - * but gives the configuration description as its String representation. - * The get(id) method retrieves ID objects and caches them for reuse. - */ - - private ID get(String id) { - ID idObject = map.get(id); - if (idObject != null) - return idObject; - - idObject = new ID(id); - map.put(id, idObject); - return idObject; - } - - - private class ID { - private final String id; - - public ID(String id) { - this.id = id; - } - - public String getID() { - return id; - } - - @Override - public String toString() { - return descriptor.format(rocket, id); - } - } - -} diff --git a/swing/src/net/sf/openrocket/gui/adaptors/MaterialModel.java b/swing/src/net/sf/openrocket/gui/adaptors/MaterialModel.java index f4f6ba95f4..0ed7fe5cc8 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/MaterialModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/MaterialModel.java @@ -19,10 +19,12 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Reflection; -public class MaterialModel extends AbstractListModel implements - ComboBoxModel, ComponentChangeListener, DatabaseListener<Material> { - - private final String custom; +public class MaterialModel extends AbstractListModel<Material> implements + ComboBoxModel<Material>, ComponentChangeListener, DatabaseListener<Material> { + private static final long serialVersionUID = 4552478532933113655L; + + + private final Material custom; private final Component parentUIComponent; @@ -47,7 +49,7 @@ public MaterialModel(Component parent, RocketComponent component, Material.Type this.parentUIComponent = parent; this.rocketComponent = component; this.type = type; - this.custom = trans.get ("Material.CUSTOM"); + this.custom = Material.newMaterial( Material.Type.CUSTOM, trans.get ("Material.CUSTOM"), 1.0, true ); switch (type) { case LINE: @@ -128,7 +130,7 @@ public void run() { } @Override - public Object getElementAt(int index) { + public Material getElementAt(int index) { if (index == database.size()) { return custom; } else if (index >= database.size()+1) { diff --git a/swing/src/net/sf/openrocket/gui/adaptors/ParameterSetModel.java b/swing/src/net/sf/openrocket/gui/adaptors/ParameterSetModel.java new file mode 100644 index 0000000000..d417b853c0 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/adaptors/ParameterSetModel.java @@ -0,0 +1,115 @@ +package net.sf.openrocket.gui.adaptors; + + +import java.util.EventObject; +import java.util.List; +import java.util.Vector; + +import javax.swing.ComboBoxModel; +import javax.swing.event.EventListenerList; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; + +import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameter; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.FlightConfigurableParameterSet; +import net.sf.openrocket.util.StateChangeListener; + +/** + * A ComboBoxModel that contains a list of flight configurations. The list can + * optionally contain a last element that opens up the configuration edit dialog. + */ +public class ParameterSetModel<T extends FlightConfigurableParameter<T>> implements ComboBoxModel<T>, StateChangeListener { + //private static final Translator trans = Application.getTranslator(); + //private static final Logger log = LoggerFactory.getLogger(ParameterSetModel.class); + //private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); + + private EventListenerList listenerList = new EventListenerList(); + + private Object selected; + private final FlightConfigurableParameterSet<T> sourceSet; + List<FlightConfigurationId> idList= new Vector<FlightConfigurationId>(); + + public ParameterSetModel(FlightConfigurableParameterSet<T> set ) { + this.sourceSet = set; + this.selected = this.sourceSet.getDefault(); + } + + @Override + public T getElementAt(int index) { + if((index < 0)||( index >= this.idList.size())){ + return sourceSet.getDefault(); + } + FlightConfigurationId fcid = this.idList.get(index); + return this.sourceSet.get( fcid); + } + + @Override + public int getSize() { + this.idList = this.sourceSet.getIds(); + return this.idList.size(); + } + + @Override + public Object getSelectedItem() { + return this.selected; + } + + @Override + public void setSelectedItem(Object item) { + if (item == null) { + // Clear selection - huh? + return; + } + + if( item.getClass().isAssignableFrom(this.selected.getClass())){ + this.selected = item; + return; + }else{ + throw new IllegalArgumentException("attempted to set selected item (oftype "+item.getClass().getSimpleName() + +") when this generic contains a type: "+this.selected.getClass().getSimpleName()); + } + } + + + + //////////////// Event/listener handling //////////////// + + + @Override + public void addListDataListener(ListDataListener l) { + listenerList.add(ListDataListener.class, l); + } + + @Override + public void removeListDataListener(ListDataListener l) { + listenerList.remove(ListDataListener.class, l); + } + + protected void fireListDataEvent() { + Object[] listeners = listenerList.getListenerList(); + ListDataEvent e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ListDataListener.class) { + if (e == null) + e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, getSize()); + ((ListDataListener) listeners[i + 1]).contentsChanged(e); + } + } + } + + + @Override + public void stateChanged(EventObject e) { + if (e instanceof ComponentChangeEvent) { + // Ignore unnecessary changes + if (!((ComponentChangeEvent) e).isMotorChange()) + return; + } + fireListDataEvent(); + this.idList = this.sourceSet.getIds(); + } + +} diff --git a/swing/src/net/sf/openrocket/gui/components/BasicSlider.java b/swing/src/net/sf/openrocket/gui/components/BasicSlider.java index 0ac92e790e..6b182a45da 100644 --- a/swing/src/net/sf/openrocket/gui/components/BasicSlider.java +++ b/swing/src/net/sf/openrocket/gui/components/BasicSlider.java @@ -11,6 +11,7 @@ * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class BasicSlider extends JSlider { public BasicSlider(BoundedRangeModel brm) { diff --git a/swing/src/net/sf/openrocket/gui/components/BasicTree.java b/swing/src/net/sf/openrocket/gui/components/BasicTree.java index 6ec8804e75..09d8b3d727 100644 --- a/swing/src/net/sf/openrocket/gui/components/BasicTree.java +++ b/swing/src/net/sf/openrocket/gui/components/BasicTree.java @@ -12,8 +12,8 @@ import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; +@SuppressWarnings("serial") public class BasicTree extends JTree { - public BasicTree() { super(); diff --git a/swing/src/net/sf/openrocket/gui/components/CollectionTable.java b/swing/src/net/sf/openrocket/gui/components/CollectionTable.java index ef14dc6196..7e31e6cdea 100644 --- a/swing/src/net/sf/openrocket/gui/components/CollectionTable.java +++ b/swing/src/net/sf/openrocket/gui/components/CollectionTable.java @@ -7,6 +7,7 @@ /* * TODO: LOW: This is currently unused. */ +@SuppressWarnings("serial") public abstract class CollectionTable<T> extends JTable { private final String[] columnNames; diff --git a/swing/src/net/sf/openrocket/gui/components/ColorChooser.java b/swing/src/net/sf/openrocket/gui/components/ColorChooser.java index 3165e79969..3cc76dd416 100644 --- a/swing/src/net/sf/openrocket/gui/components/ColorChooser.java +++ b/swing/src/net/sf/openrocket/gui/components/ColorChooser.java @@ -24,6 +24,7 @@ * * The chosen color may be retrieved via a call to getCurrentColor. */ +@SuppressWarnings("serial") public class ColorChooser extends JPanel { private static final String COLOR_CHOOSER_BUTTON_LABEL = "Color"; diff --git a/swing/src/net/sf/openrocket/gui/components/ColorChooserButton.java b/swing/src/net/sf/openrocket/gui/components/ColorChooserButton.java index e0472b1ab5..573f3b7eca 100644 --- a/swing/src/net/sf/openrocket/gui/components/ColorChooserButton.java +++ b/swing/src/net/sf/openrocket/gui/components/ColorChooserButton.java @@ -22,6 +22,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class ColorChooserButton extends JButton { private static final Logger log = LoggerFactory.getLogger(ColorChooserButton.class); diff --git a/swing/src/net/sf/openrocket/gui/components/ConfigurationComboBox.java b/swing/src/net/sf/openrocket/gui/components/ConfigurationComboBox.java new file mode 100644 index 0000000000..16eed7a4cd --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/components/ConfigurationComboBox.java @@ -0,0 +1,96 @@ +package net.sf.openrocket.gui.components; + +import javax.swing.JComboBox; +import javax.swing.MutableComboBoxModel; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.ListDataListener; +import javax.swing.event.PopupMenuListener; + +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; + +// combobox for flight configurations +// this is insane -- it appears the only way to reconstruct a +// JComboBox properly after adding a new entry (when added to the +// underlying data structure being displayed, not when added directly +// to the combobox or to its model) is to reconstruct the model. This +// is done quickly enough I might as well just do it every time the +// combobox is opened, rather than trying to watch and see if it's needed. +public class ConfigurationComboBox extends JComboBox<FlightConfiguration> { + public class ConfigurationModel implements MutableComboBoxModel<FlightConfiguration> { + + private final Rocket rkt; + + public ConfigurationModel(final Rocket _rkt) { + this.rkt = _rkt; + } + + @Override + public FlightConfiguration getSelectedItem() { + return rkt.getSelectedConfiguration(); + } + + @Override + public void setSelectedItem(Object nextItem) { + if( nextItem instanceof FlightConfiguration ){ + FlightConfigurationId selectedId = ((FlightConfiguration)nextItem).getId(); + rkt.setSelectedConfiguration(selectedId); + } + } + + @Override + public FlightConfiguration getElementAt( final int configIndex) { + return rkt.getFlightConfigurationByIndex(configIndex, true); + } + + @Override + public int getSize() { + // plus the default config + return rkt.getConfigurationCount()+1; + } + + // ====== MutableComboBoxModel Functions ====== + // these functions don't need to do anything, just being a 'mutable' version of the combo box + // is enough to allow updating the UI + + @Override + public void addListDataListener(ListDataListener l) {} + + @Override + public void removeListDataListener(ListDataListener l) {} + + @Override + public void addElement(FlightConfiguration arg0) {} + + @Override + public void insertElementAt(FlightConfiguration arg0, int arg1) {} + + @Override + public void removeElement(Object arg0) {} + + @Override + public void removeElementAt(int arg0) {} + + } + + private final Rocket rkt; + + public ConfigurationComboBox(Rocket _rkt) { + rkt = _rkt; + setModel(new ConfigurationModel(rkt)); + + addPopupMenuListener(new PopupMenuListener() + { + public void popupMenuCanceled(PopupMenuEvent e) {} + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {} + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) + { + setModel(new ConfigurationModel(rkt)); + } + + }); + + } +} diff --git a/swing/src/net/sf/openrocket/gui/components/CsvOptionPanel.java b/swing/src/net/sf/openrocket/gui/components/CsvOptionPanel.java index cd979e16a1..5a121d9ad5 100644 --- a/swing/src/net/sf/openrocket/gui/components/CsvOptionPanel.java +++ b/swing/src/net/sf/openrocket/gui/components/CsvOptionPanel.java @@ -16,6 +16,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class CsvOptionPanel extends JPanel { private static final Translator trans = Application.getTranslator(); @@ -25,9 +26,9 @@ public class CsvOptionPanel extends JPanel { private final String baseClassName; - private final JComboBox fieldSeparator; + private final JComboBox<String> fieldSeparator; private final JCheckBox[] options; - private final JComboBox commentCharacter; + private final JComboBox<String> commentCharacter; /** * Sole constructor. @@ -57,7 +58,7 @@ public CsvOptionPanel(Class<?> baseClass, String... includeComments) { label.setToolTipText(tip); panel.add(label, "gapright unrel"); - fieldSeparator = new JComboBox(new String[] { ",", ";", SPACE, TAB }); + fieldSeparator = new JComboBox<String>(new String[] { ",", ";", SPACE, TAB }); fieldSeparator.setEditable(true); fieldSeparator.setSelectedItem(Application.getPreferences().getString(Preferences.EXPORT_FIELD_SEPARATOR, ",")); fieldSeparator.setToolTipText(tip); @@ -90,7 +91,7 @@ public CsvOptionPanel(Class<?> baseClass, String... includeComments) { label.setToolTipText(tip); panel.add(label, "split 2, gapright unrel"); - commentCharacter = new JComboBox(new String[] { "#", "%", ";" }); + commentCharacter = new JComboBox<String>(new String[] { "#", "%", ";" }); commentCharacter.setEditable(true); commentCharacter.setSelectedItem(Application.getPreferences().getString(Preferences.EXPORT_COMMENT_CHARACTER, "#")); commentCharacter.setToolTipText(tip); diff --git a/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java b/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java index 1e37bb6f2a..2c68b129c5 100644 --- a/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java +++ b/swing/src/net/sf/openrocket/gui/components/DescriptionArea.java @@ -11,6 +11,7 @@ import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; +@SuppressWarnings("serial") public class DescriptionArea extends JScrollPane { private final JEditorPane editorPane; diff --git a/swing/src/net/sf/openrocket/gui/components/DoubleCellEditor.java b/swing/src/net/sf/openrocket/gui/components/DoubleCellEditor.java index 1602350acd..1ace761df7 100644 --- a/swing/src/net/sf/openrocket/gui/components/DoubleCellEditor.java +++ b/swing/src/net/sf/openrocket/gui/components/DoubleCellEditor.java @@ -11,6 +11,7 @@ import net.sf.openrocket.gui.SpinnerEditor; import net.sf.openrocket.gui.adaptors.DoubleModel; +@SuppressWarnings("serial") public class DoubleCellEditor extends AbstractCellEditor implements TableCellEditor { private final JSpinner editor; diff --git a/swing/src/net/sf/openrocket/gui/components/FlatButton.java b/swing/src/net/sf/openrocket/gui/components/FlatButton.java index d4c39ef409..e4ee356429 100644 --- a/swing/src/net/sf/openrocket/gui/components/FlatButton.java +++ b/swing/src/net/sf/openrocket/gui/components/FlatButton.java @@ -12,6 +12,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class FlatButton extends JButton { public FlatButton() { diff --git a/swing/src/net/sf/openrocket/gui/components/HtmlLabel.java b/swing/src/net/sf/openrocket/gui/components/HtmlLabel.java index 59fdbfa72a..d4c48f5927 100644 --- a/swing/src/net/sf/openrocket/gui/components/HtmlLabel.java +++ b/swing/src/net/sf/openrocket/gui/components/HtmlLabel.java @@ -11,6 +11,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class HtmlLabel extends JLabel { public HtmlLabel() { diff --git a/swing/src/net/sf/openrocket/gui/components/SimulationExportPanel.java b/swing/src/net/sf/openrocket/gui/components/SimulationExportPanel.java index 957dc2a5d2..b3ed295b00 100644 --- a/swing/src/net/sf/openrocket/gui/components/SimulationExportPanel.java +++ b/swing/src/net/sf/openrocket/gui/components/SimulationExportPanel.java @@ -33,6 +33,7 @@ import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class SimulationExportPanel extends JPanel { private static final String SPACE = "SPACE"; diff --git a/swing/src/net/sf/openrocket/gui/components/StageSelector.java b/swing/src/net/sf/openrocket/gui/components/StageSelector.java index 9479279120..81accf8b80 100644 --- a/swing/src/net/sf/openrocket/gui/components/StageSelector.java +++ b/swing/src/net/sf/openrocket/gui/components/StageSelector.java @@ -11,42 +11,37 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.StateChangeListener; +@SuppressWarnings("serial") public class StageSelector extends JPanel implements StateChangeListener { + private static final Translator trans = Application.getTranslator(); - private final Configuration configuration; + private final Rocket rocket; private List<JToggleButton> buttons = new ArrayList<JToggleButton>(); - public StageSelector(Configuration configuration) { + public StageSelector(Rocket _rkt) { super(new MigLayout("gap 0!")); - this.configuration = configuration; - - JToggleButton button = new JToggleButton(new StageAction(0)); - this.add(button); - buttons.add(button); + this.rocket = _rkt; - updateButtons(); - configuration.addChangeListener(this); + updateButtons( this.rocket.getSelectedConfiguration() ); } - private void updateButtons() { - int stages = configuration.getStageCount(); - if (buttons.size() == stages) - return; - - while (buttons.size() > stages) { - JToggleButton button = buttons.remove(buttons.size() - 1); - this.remove(button); - } - - while (buttons.size() < stages) { - JToggleButton button = new JToggleButton(new StageAction(buttons.size())); + private void updateButtons( final FlightConfiguration configuration ) { + buttons.clear(); + this.removeAll(); + for(AxialStage stage : configuration.getRocket().getStageList()){ + JToggleButton button = new JToggleButton(new StageAction(stage)); + button.setSelected(true); this.add(button); buttons.add(button); } @@ -54,58 +49,36 @@ private void updateButtons() { this.revalidate(); } - - - @Override - public void stateChanged(EventObject e) { - updateButtons(); + public void stateChanged(EventObject eo) { + Object source = eo.getSource(); + if ((source instanceof Rocket) || (source instanceof AxialStage)) { + Rocket rkt = (Rocket) ((RocketComponent) source).getRoot(); + updateButtons( rkt.getSelectedConfiguration() ); + } } - - private class StageAction extends AbstractAction implements StateChangeListener { - private final int stage; + private class StageAction extends AbstractAction { + private final AxialStage stage; - public StageAction(final int stage) { + public StageAction(final AxialStage stage) { this.stage = stage; - configuration.addChangeListener(this); - stateChanged(null); } @Override public Object getValue(String key) { if (key.equals(NAME)) { - //// Stage - return trans.get("StageAction.Stage") + " " + (stage + 1); + // Stage + return stage.getName(); } return super.getValue(key); } @Override public void actionPerformed(ActionEvent e) { - configuration.setToStage(stage); - - // boolean state = (Boolean)getValue(SELECTED_KEY); - // if (state == true) { - // // Was disabled, now enabled - // configuration.setToStage(stage); - // } else { - // // Was enabled, check what to do - // if (configuration.isStageActive(stage + 1)) { - // configuration.setToStage(stage); - // } else { - // if (stage == 0) - // configuration.setAllStages(); - // else - // configuration.setToStage(stage-1); - // } - // } - // stateChanged(null); + rocket.getSelectedConfiguration().toggleStage(stage.getStageNumber()); + rocket.fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE | ComponentChangeEvent.MOTOR_CHANGE ); } - @Override - public void stateChanged(EventObject e) { - this.putValue(SELECTED_KEY, configuration.isStageActive(stage)); - } } } diff --git a/swing/src/net/sf/openrocket/gui/components/UnitCellEditor.java b/swing/src/net/sf/openrocket/gui/components/UnitCellEditor.java index 2ff47abc02..328af39fc0 100644 --- a/swing/src/net/sf/openrocket/gui/components/UnitCellEditor.java +++ b/swing/src/net/sf/openrocket/gui/components/UnitCellEditor.java @@ -23,10 +23,11 @@ public abstract class UnitCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { - private final JComboBox editor; + private static final long serialVersionUID = 8319509695751912662L; + private final JComboBox<Unit> editor; public UnitCellEditor() { - editor = new JComboBox(); + editor = new JComboBox<Unit>(); editor.setEditable(false); editor.addActionListener(this); } diff --git a/swing/src/net/sf/openrocket/gui/components/compass/CompassPointer.java b/swing/src/net/sf/openrocket/gui/components/compass/CompassPointer.java index 37fdad42e5..315bc85506 100644 --- a/swing/src/net/sf/openrocket/gui/components/compass/CompassPointer.java +++ b/swing/src/net/sf/openrocket/gui/components/compass/CompassPointer.java @@ -17,6 +17,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class CompassPointer extends CompassRose implements Resettable { private static final Color PRIMARY_POINTER_COLOR = new Color(1.0f, 0.2f, 0.2f); diff --git a/swing/src/net/sf/openrocket/gui/components/compass/CompassRose.java b/swing/src/net/sf/openrocket/gui/components/compass/CompassRose.java index 49f1d059ed..68ed185359 100644 --- a/swing/src/net/sf/openrocket/gui/components/compass/CompassRose.java +++ b/swing/src/net/sf/openrocket/gui/components/compass/CompassRose.java @@ -20,6 +20,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class CompassRose extends JComponent { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/components/compass/CompassSelectionButton.java b/swing/src/net/sf/openrocket/gui/components/compass/CompassSelectionButton.java index 87d7ab1a1c..097af46bdc 100644 --- a/swing/src/net/sf/openrocket/gui/components/compass/CompassSelectionButton.java +++ b/swing/src/net/sf/openrocket/gui/components/compass/CompassSelectionButton.java @@ -31,6 +31,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class CompassSelectionButton extends FlatButton implements Resettable { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/components/compass/CompassSelector.java b/swing/src/net/sf/openrocket/gui/components/compass/CompassSelector.java index deed9cf7e6..fb77f2f4d5 100644 --- a/swing/src/net/sf/openrocket/gui/components/compass/CompassSelector.java +++ b/swing/src/net/sf/openrocket/gui/components/compass/CompassSelector.java @@ -11,6 +11,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class CompassSelector extends CompassPointer { private final DoubleModel model; diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java b/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java index 2794e08cd6..c6d2182433 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java @@ -51,6 +51,8 @@ import net.sf.openrocket.util.StateChangeListener; public class AppearancePanel extends JPanel { + private static final long serialVersionUID = 2709187552673202019L; + private static final Translator trans = Application.getTranslator(); private EditDecalHelper editDecalHelper = Application.getInjector() @@ -159,7 +161,7 @@ public AppearancePanel(final OpenRocketDocument document, final JButton colorButton = new JButton(new ColorIcon(ab.getPaint())); final DecalModel decalModel = new DecalModel(this, document, ab); - final JComboBox textureDropDown = new JComboBox(decalModel); + final JComboBox<DecalImage> textureDropDown = new JComboBox<DecalImage>(decalModel); ab.addChangeListener(new StateChangeListener() { @Override @@ -248,7 +250,7 @@ public void actionPerformed(ActionEvent e) { System.arraycopy(LineStyle.values(), 0, list, 1, LineStyle.values().length); - JComboBox combo = new JComboBox(new EnumModel<LineStyle>(c, + final JComboBox<LineStyle> combo = new JComboBox<LineStyle>(new EnumModel<LineStyle>(c, "LineStyle", // // Default style list, trans.get("LineStyle.Defaultstyle"))); @@ -382,7 +384,7 @@ public void actionPerformed(ActionEvent e) { EdgeMode[] list = new EdgeMode[EdgeMode.values().length]; System.arraycopy(EdgeMode.values(), 0, list, 0, EdgeMode.values().length); - JComboBox combo = new JComboBox(new EnumModel<EdgeMode>(ab, + JComboBox<EdgeMode> combo = new JComboBox<EdgeMode>(new EnumModel<EdgeMode>(ab, "EdgeMode", list)); mDefault.addEnableComponent(combo, false); add(combo); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java new file mode 100644 index 0000000000..e932bda520 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java @@ -0,0 +1,76 @@ +package net.sf.openrocket.gui.configdialog; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSpinner; + +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.DoubleModel; +import net.sf.openrocket.gui.adaptors.EnumModel; +import net.sf.openrocket.gui.components.StyledLabel; +import net.sf.openrocket.gui.components.StyledLabel.Style; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; +import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration.SeparationEvent; +import net.sf.openrocket.startup.Application; + +public class AxialStageConfig extends ComponentAssemblyConfig { + private static final long serialVersionUID = -944969957186522471L; + private static final Translator trans = Application.getTranslator(); + + public AxialStageConfig(OpenRocketDocument document, RocketComponent component) { + super(document, component); + + // Stage separation config (for non-first stage) + if (component.getStageNumber() > 0) { + JPanel tab = separationTab((AxialStage) component); + tabbedPane.insertTab(trans.get("StageConfig.tab.Separation"), null, tab, + trans.get("StageConfig.tab.Separation.ttip"), 2); + } + } + + + private JPanel separationTab(AxialStage stage) { + JPanel panel = new JPanel(new MigLayout("fill")); + + // Select separation event + panel.add(new StyledLabel(trans.get("StageConfig.separation.lbl.title") + " " + CommonStrings.dagger, Style.BOLD), "spanx, wrap rel"); + + FlightConfiguration flConfig = stage.getRocket().getSelectedConfiguration(); + StageSeparationConfiguration sepConfig = stage.getSeparationConfigurations().get(flConfig.getId()); + // to ensure the configuration is distinct, and we're not modifying the default + if( sepConfig == stage.getSeparationConfigurations().getDefault() ){ + sepConfig = new StageSeparationConfiguration(); + stage.getSeparationConfigurations().set( flConfig.getId(), sepConfig ); + } + + JComboBox<?> combo = new JComboBox<StageSeparationConfiguration.SeparationEvent>( + new EnumModel<StageSeparationConfiguration.SeparationEvent>( sepConfig, "SeparationEvent", SeparationEvent.values())); + + //combo.setSelectedItem(sepConfig); + panel.add(combo, ""); + + // ... and delay + panel.add(new JLabel(trans.get("StageConfig.separation.lbl.plus")), ""); + + DoubleModel dm = new DoubleModel( sepConfig, "SeparationDelay", 0); + JSpinner spin = new JSpinner(dm.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "width 45"); + + //// seconds + panel.add(new JLabel(trans.get("StageConfig.separation.lbl.seconds")), "wrap unrel"); + + panel.add(new StyledLabel(CommonStrings.override_description, -1), "spanx, wrap para"); + + return panel; + } + + +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 51bf75e938..e0949a142c 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -20,6 +20,7 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class BodyTubeConfig extends RocketComponentConfig { private DoubleModel maxLength; @@ -30,8 +31,6 @@ public BodyTubeConfig(OpenRocketDocument d, RocketComponent c) { JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", "")); - - //// Body tube length panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Bodytubelength"))); @@ -45,13 +44,11 @@ public BodyTubeConfig(OpenRocketDocument d, RocketComponent c) { panel.add(new UnitSelector(length), "growx"); panel.add(new BasicSlider(length.getSliderModel(0, 0.5, maxLength)), "w 100lp, wrap"); - //// Body tube diameter panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Outerdiameter"))); - DoubleModel od = new DoubleModel(component, "OuterRadius", 2, UnitGroup.UNITS_LENGTH, 0); // Diameter = 2*Radius - + final DoubleModel od = new DoubleModel(component, "OuterRadius", 2, UnitGroup.UNITS_LENGTH, 0); spin = new JSpinner(od.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -59,38 +56,35 @@ public BodyTubeConfig(OpenRocketDocument d, RocketComponent c) { panel.add(new UnitSelector(od), "growx"); panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); - JCheckBox check = new JCheckBox(od.getAutomaticAction()); //// Automatic + javax.swing.Action outerAutoAction = od.getAutomaticAction(); + JCheckBox check = new JCheckBox(outerAutoAction); check.setText(trans.get("BodyTubecfg.checkbox.Automatic")); panel.add(check, "skip, span 2, wrap"); - //// Inner diameter panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Innerdiameter"))); // Diameter = 2*Radius - DoubleModel m = new DoubleModel(component, "InnerRadius", 2, UnitGroup.UNITS_LENGTH, 0); - - - spin = new JSpinner(m.getSpinnerModel()); + final DoubleModel innerRadiusModel = new DoubleModel(component, "InnerRadius", 2, UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(innerRadiusModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap"); + panel.add(new UnitSelector(innerRadiusModel), "growx"); + panel.add(new BasicSlider(innerRadiusModel.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap"); //// Wall thickness panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Wallthickness"))); - m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); + final DoubleModel thicknessModel = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(thicknessModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); + panel.add(new UnitSelector(thicknessModel), "growx"); + panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); //// Filled check = new JCheckBox(new BooleanModel(component, "Filled")); @@ -112,7 +106,6 @@ public BodyTubeConfig(OpenRocketDocument d, RocketComponent c) { tabbedPane.insertTab(trans.get("BodyTubecfg.tab.Motor"), null, motorConfig, trans.get("BodyTubecfg.tab.Motormountconf"), 1); - } @Override diff --git a/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java index 135ec94e63..2af7d1d370 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/BulkheadConfig.java @@ -10,6 +10,7 @@ +@SuppressWarnings("serial") public class BulkheadConfig extends RingComponentConfig { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java index dfe6a35264..c274edaf6c 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/CenteringRingConfig.java @@ -10,6 +10,7 @@ +@SuppressWarnings("serial") public class CenteringRingConfig extends RingComponentConfig { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java new file mode 100644 index 0000000000..eaea5a57f9 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/configdialog/ComponentAssemblyConfig.java @@ -0,0 +1,117 @@ +package net.sf.openrocket.gui.configdialog; + +import javax.swing.ComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSpinner; + +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.DoubleModel; +import net.sf.openrocket.gui.adaptors.EnumModel; +import net.sf.openrocket.gui.adaptors.IntegerModel; +import net.sf.openrocket.gui.components.UnitSelector; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.ComponentAssembly; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.PodSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AngleMethod; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.rocketcomponent.position.RadiusMethod; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; + + +@SuppressWarnings("serial") +public class ComponentAssemblyConfig extends RocketComponentConfig { + private static final Translator trans = Application.getTranslator(); + + public ComponentAssemblyConfig(OpenRocketDocument document, RocketComponent component) { + super(document, component); + + // only stages which are actually off-centerline will get the dialog here: + if( ParallelStage.class.isAssignableFrom( component.getClass()) || PodSet.class.isAssignableFrom( component.getClass())){ + tabbedPane.insertTab( trans.get("RocketCompCfg.tab.Assembly"), null, parallelTab( (ComponentAssembly)component ), trans.get("RocketCompCfg.tab.AssemblyComment"), 0); + tabbedPane.setSelectedIndex(0); + } + } + + + private JPanel parallelTab( final ComponentAssembly boosters ){ + JPanel motherPanel = new JPanel( new MigLayout("fill")); + + // radial distance method + JLabel radiusMethodLabel = new JLabel(trans.get("RocketComponent.Position.Method.Radius.Label")); + motherPanel.add( radiusMethodLabel, "align left"); + final EnumModel<RadiusMethod> radiusMethodModel = new EnumModel<RadiusMethod>( boosters, "RadiusMethod", RadiusMethod.choices()); + final JComboBox<RadiusMethod> radiusMethodCombo = new JComboBox<RadiusMethod>( radiusMethodModel ); + motherPanel.add( radiusMethodCombo, "align left, wrap"); + + // set radial distance + JLabel radiusLabel = new JLabel(trans.get("StageConfig.parallel.radius")); + motherPanel.add( radiusLabel , "align left"); + //radiusMethodModel.addEnableComponent(radiusLabel, false); + DoubleModel radiusModel = new DoubleModel( boosters, "RadiusOffset", UnitGroup.UNITS_LENGTH, 0); + + JSpinner radiusSpinner = new JSpinner( radiusModel.getSpinnerModel()); + radiusSpinner.setEditor(new SpinnerEditor(radiusSpinner )); + motherPanel.add(radiusSpinner , "growx 1, align right"); +// autoRadOffsModel.addEnableComponent(radiusSpinner, false); + UnitSelector radiusUnitSelector = new UnitSelector(radiusModel); + motherPanel.add(radiusUnitSelector, "growx 1, wrap"); +// autoRadOffsModel.addEnableComponent(radiusUnitSelector, false); + +// // set location angle around the primary stage +// JLabel angleMethodLabel = new JLabel(trans.get("RocketComponent.Position.Method.Angle.Label")); +// motherPanel.add( angleMethodLabel, "align left"); +// EnumModel<AngleMethod> angleMethodModel = new EnumModel<AngleMethod>( boosters, "AngleMethod", AngleMethod.choices() ); +// final JComboBox<AngleMethod> angleMethodCombo = new JComboBox<AngleMethod>( angleMethodModel ); +// motherPanel.add( angleMethodCombo, "align left, wrap"); + + JLabel angleLabel = new JLabel(trans.get("StageConfig.parallel.angle")); + motherPanel.add( angleLabel, "align left"); + DoubleModel angleModel = new DoubleModel( boosters, "AngleOffset", 1.0, UnitGroup.UNITS_ANGLE, 0.0, Math.PI*2); + + JSpinner angleSpinner = new JSpinner(angleModel.getSpinnerModel()); + angleSpinner.setEditor(new SpinnerEditor(angleSpinner)); + motherPanel.add(angleSpinner, "growx 1"); + UnitSelector angleUnitSelector = new UnitSelector(angleModel); + motherPanel.add( angleUnitSelector, "growx 1, wrap"); + + // set multiplicity + JLabel countLabel = new JLabel(trans.get("StageConfig.parallel.count")); + motherPanel.add( countLabel, "align left"); + + IntegerModel countModel = new IntegerModel( boosters, "InstanceCount", 2); + JSpinner countSpinner = new JSpinner(countModel.getSpinnerModel()); + countSpinner.setEditor(new SpinnerEditor(countSpinner)); + motherPanel.add(countSpinner, "growx 1, wrap"); + + // setPositions relative to parent component + JLabel positionLabel = new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto")); + motherPanel.add( positionLabel); + + ComboBoxModel<AxialMethod> axialPositionMethodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + JComboBox<?> positionMethodCombo = new JComboBox<AxialMethod>( axialPositionMethodModel ); + motherPanel.add(positionMethodCombo, "spanx 2, growx, wrap"); + + // relative offset labels + JLabel positionPlusLabel = new JLabel(trans.get("StageConfig.parallel.offset")); + motherPanel.add( positionPlusLabel ); + DoubleModel axialOffsetModel = new DoubleModel( boosters, "AxialOffset", UnitGroup.UNITS_LENGTH); + + JSpinner axPosSpin= new JSpinner( axialOffsetModel.getSpinnerModel()); + axPosSpin.setEditor(new SpinnerEditor(axPosSpin)); + motherPanel.add(axPosSpin, "growx"); + UnitSelector axialOffsetUnitSelector = new UnitSelector(axialOffsetModel); + motherPanel.add(axialOffsetUnitSelector, "growx 1, wrap"); + + // For DEBUG purposes + //System.err.println(assembly.getRocket().toDebugTree()); + + return motherPanel; + } +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java index 509ba867ef..e37ffa0585 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/EllipticalFinSetConfig.java @@ -20,9 +20,11 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class EllipticalFinSetConfig extends FinSetConfig { private static final Translator trans = Application.getTranslator(); @@ -31,12 +33,10 @@ public EllipticalFinSetConfig(OpenRocketDocument d, final RocketComponent compon DoubleModel m; JSpinner spin; - JComboBox combo; JPanel mainPanel = new JPanel(new MigLayout()); - JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); //// Number of fins @@ -111,20 +111,13 @@ public EllipticalFinSetConfig(OpenRocketDocument d, final RocketComponent compon //// Position relative to: panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Positionrelativeto"))); - combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); + JComboBox<AxialMethod> positionCombo= new JComboBox<AxialMethod>( new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods )); + panel.add(positionCombo, "spanx, growx, wrap"); //// plus panel.add(new JLabel(trans.get("EllipticalFinSetCfg.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -150,9 +143,9 @@ public EllipticalFinSetConfig(OpenRocketDocument d, final RocketComponent compon //// Cross section //// Fin cross section: panel.add(new JLabel(trans.get("EllipticalFinSetCfg.FincrossSection")), "span, split"); - combo = new JComboBox( + JComboBox<FinSet.CrossSection> sectionCombo = new JComboBox<FinSet.CrossSection>( new EnumModel<FinSet.CrossSection>(component, "CrossSection")); - panel.add(combo, "growx, wrap unrel"); + panel.add( sectionCombo, "growx, wrap unrel"); //// Thickness: diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java index 91a1a751f0..1c3821b469 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java @@ -35,6 +35,7 @@ import net.sf.openrocket.rocketcomponent.FreeformFinSet; import net.sf.openrocket.rocketcomponent.InnerTube; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; @@ -42,6 +43,7 @@ import org.slf4j.LoggerFactory; +@SuppressWarnings("serial") public abstract class FinSetConfig extends RocketComponentConfig { private static final Logger log = LoggerFactory.getLogger(FinSetConfig.class); private static final Translator trans = Application.getTranslator(); @@ -133,7 +135,7 @@ public void run() { } - public JPanel finTabPanel() { + private JPanel finTabPanel() { JPanel panel = new JPanel( new MigLayout("align 50% 20%, fillx, gap rel unrel, ins 20lp 10% 20lp 10%", "[150lp::][65lp::][30lp::][200lp::]", "")); @@ -177,21 +179,20 @@ public JPanel finTabPanel() { "w 100lp, growx 5, wrap"); - //// Tab length //// Tab height: label = new JLabel(trans.get("FinSetConfig.lbl.Tabheight")); - //// The spanwise height of the fin tab. + //// The span-wise height of the fin tab. label.setToolTipText(trans.get("FinSetConfig.ttip.Tabheight")); panel.add(label, "gapleft para"); - final DoubleModel mth = new DoubleModel(component, "TabHeight", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(mth.getSpinnerModel()); + final DoubleModel tabHeightModel = new DoubleModel(component, "TabHeight", UnitGroup.UNITS_LENGTH, 0); + component.addChangeListener( tabHeightModel ); + spin = new JSpinner(tabHeightModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - panel.add(new UnitSelector(mth), "growx"); - panel.add(new BasicSlider(mth.getSliderModel(DoubleModel.ZERO, length2)), + panel.add(new UnitSelector(tabHeightModel), "growx"); + panel.add(new BasicSlider(tabHeightModel.getSliderModel(DoubleModel.ZERO, length2)), "w 100lp, growx 5, wrap"); //// Tab position: @@ -200,8 +201,8 @@ public JPanel finTabPanel() { label.setToolTipText(trans.get("FinSetConfig.ttip.Tabposition")); panel.add(label, "gapleft para"); - final DoubleModel mts = new DoubleModel(component, "TabShift", UnitGroup.UNITS_LENGTH); - + final DoubleModel mts = new DoubleModel(component, "TabOffset", UnitGroup.UNITS_LENGTH); + component.addChangeListener( mts); spin = new JSpinner(mts.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -209,16 +210,16 @@ public JPanel finTabPanel() { panel.add(new UnitSelector(mts), "growx"); panel.add(new BasicSlider(mts.getSliderModel(length_2, length2)), "w 100lp, growx 5, wrap"); - //// relative to label = new JLabel(trans.get("FinSetConfig.lbl.relativeto")); panel.add(label, "right, gapright unrel"); - final EnumModel<FinSet.TabRelativePosition> em = - new EnumModel<FinSet.TabRelativePosition>(component, "TabRelativePosition"); + + final EnumModel<AxialMethod> em = new EnumModel<>(component, "TabOffsetMethod"); - panel.add(new JComboBox(em), "spanx 3, growx, wrap para"); + JComboBox<AxialMethod> enumCombo = new JComboBox<>(em); + panel.add( enumCombo, "spanx 3, growx, wrap para"); // Calculate fin tab height, length, and position autoCalc = new JButton(trans.get("FinSetConfig.but.AutoCalc")); @@ -233,7 +234,7 @@ public void actionPerformed(ActionEvent e) { try { document.startUndo("Compute fin tabs"); - List<CenteringRing> rings = new ArrayList<CenteringRing>(); + List<CenteringRing> rings = new ArrayList<>(); //Do deep recursive iteration Iterator<RocketComponent> iter = parent.iterator(false); while (iter.hasNext()) { @@ -244,8 +245,8 @@ public void actionPerformed(ActionEvent e) { double depth = ((Coaxial) parent).getOuterRadius() - it.getOuterRadius(); //Set fin tab depth if (depth >= 0.0d) { - mth.setValue(depth); - mth.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); + tabHeightModel.setValue(depth); + tabHeightModel.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); } } } else if (rocketComponent instanceof CenteringRing) { @@ -254,9 +255,9 @@ public void actionPerformed(ActionEvent e) { } //Figure out position and length of the fin tab if (!rings.isEmpty()) { - FinSet.TabRelativePosition temp = (FinSet.TabRelativePosition) em.getSelectedItem(); - em.setSelectedItem(FinSet.TabRelativePosition.FRONT); - double len = computeFinTabLength(rings, component.asPositionValue(RocketComponent.Position.TOP, parent), + AxialMethod temp = (AxialMethod) em.getSelectedItem(); + em.setSelectedItem(AxialMethod.TOP); + double len = computeFinTabLength(rings, component.getAxialOffset(AxialMethod.TOP), component.getLength(), mts, parent); mtl.setValue(len); //Be nice to the user and set the tab relative position enum back the way they had it. @@ -305,8 +306,8 @@ private static double computeFinTabLength(List<CenteringRing> rings, Double finP Collections.sort(rings, new Comparator<CenteringRing>() { @Override public int compare(CenteringRing centeringRing, CenteringRing centeringRing1) { - return (int) (1000d * (centeringRing.asPositionValue(RocketComponent.Position.TOP, relativeTo) - - centeringRing1.asPositionValue(RocketComponent.Position.TOP, relativeTo))); + return (int) (1000d * (centeringRing.getAxialOffset(AxialMethod.TOP) - + centeringRing1.getAxialOffset(AxialMethod.TOP))); } }); @@ -315,7 +316,7 @@ public int compare(CenteringRing centeringRing, CenteringRing centeringRing1) { //Handle centering rings that overlap or are adjacent by synthetically merging them into one virtual ring. if (!positionsFromTop.isEmpty() && positionsFromTop.get(positionsFromTop.size() - 1).bottomSidePositionFromTop() >= - centeringRing.asPositionValue(RocketComponent.Position.TOP, relativeTo)) { + centeringRing.getAxialOffset(AxialMethod.TOP)) { SortableRing adjacent = positionsFromTop.get(positionsFromTop.size() - 1); adjacent.merge(centeringRing, relativeTo); } else { @@ -440,7 +441,7 @@ static class SortableRing { */ SortableRing(CenteringRing r, RocketComponent relativeTo) { thickness = r.getLength(); - positionFromTop = r.asPositionValue(RocketComponent.Position.TOP, relativeTo); + positionFromTop = r.getAxialOffset(AxialMethod.TOP); } /** @@ -449,7 +450,7 @@ static class SortableRing { * @param adjacent the adjacent ring */ public void merge(CenteringRing adjacent, RocketComponent relativeTo) { - double v = adjacent.asPositionValue(RocketComponent.Position.TOP, relativeTo); + double v = adjacent.getAxialOffset(AxialMethod.TOP); if (positionFromTop < v) { thickness = (v + adjacent.getLength()) - positionFromTop; } else { @@ -506,10 +507,11 @@ protected JPanel filletMaterialPanel(){ label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects")); filletPanel.add(label, "spanx 4, wrap rel"); - JComboBox combo = new JComboBox(new MaterialModel(filletPanel, component, Material.Type.BULK, "FilletMaterial")); + JComboBox<Material> materialCombo = new JComboBox<Material>(new MaterialModel(filletPanel, component, Material.Type.BULK, "FilletMaterial")); + //// The component material affects the weight of the component. - combo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); - filletPanel.add(combo, "spanx 4, growx, wrap paragraph"); + materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); + filletPanel.add( materialCombo, "spanx 4, growx, wrap paragraph"); filletPanel.setToolTipText(tip); return filletPanel; } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index 1fd28b2ffa..37ccc61186 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -1,12 +1,19 @@ package net.sf.openrocket.gui.configdialog; - import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; + +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.ArrayList; import java.util.List; import javax.swing.JButton; @@ -24,6 +31,9 @@ import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; @@ -48,15 +58,14 @@ import net.sf.openrocket.rocketcomponent.FreeformFinSet; import net.sf.openrocket.rocketcomponent.IllegalFinPointException; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Coordinate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +@SuppressWarnings("serial") public class FreeformFinSetConfig extends FinSetConfig { - + private static final Logger log = LoggerFactory.getLogger(FreeformFinSetConfig.class); private static final Translator trans = Application.getTranslator(); @@ -64,6 +73,8 @@ public class FreeformFinSetConfig extends FinSetConfig { private JTable table = null; private FinPointTableModel tableModel = null; + private int dragIndex = -1; + private FinPointFigure figure = null; @@ -86,7 +97,6 @@ private JPanel generalPane() { DoubleModel m; JSpinner spin; - JComboBox combo; JPanel mainPanel = new JPanel(new MigLayout("fill")); @@ -139,13 +149,12 @@ private JPanel generalPane() { //// Position relative to: panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Posrelativeto"))); - combo = new JComboBox(new EnumModel<RocketComponent.Position>(component, "RelativePosition", new RocketComponent.Position[] { RocketComponent.Position.TOP, RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, RocketComponent.Position.ABSOLUTE })); - panel.add(combo, "spanx 3, growx, wrap"); + JComboBox<AxialMethod> positionCombo = new JComboBox<>( new EnumModel<>(component, "AxialMethod", AxialMethod.axialOffsetMethods )); + panel.add(positionCombo, "spanx 3, growx, wrap"); //// plus panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -153,10 +162,7 @@ private JPanel generalPane() { panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), new DoubleModel(component.getParent(), "Length"))), "w 100lp, wrap"); - - - - + mainPanel.add(panel, "aligny 20%"); mainPanel.add(new JSeparator(SwingConstants.VERTICAL), "growy, height 150lp"); @@ -164,13 +170,11 @@ private JPanel generalPane() { panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); - - //// Cross section //// Fin cross section: panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.FincrossSection")), "span, split"); - combo = new JComboBox(new EnumModel<FinSet.CrossSection>(component, "CrossSection")); - panel.add(combo, "growx, wrap unrel"); + JComboBox<FinSet.CrossSection> sectionCombo = new JComboBox<>(new EnumModel<FinSet.CrossSection>(component, "CrossSection")); + panel.add(sectionCombo, "growx, wrap unrel"); //// Thickness: @@ -198,16 +202,14 @@ private JPanel generalPane() { } - + // edit fin points directly here private JPanel shapePane() { - JPanel panel = new JPanel(new MigLayout("fill")); + JPanel panel = new JPanel(null); // Create the figure figure = new FinPointFigure(finset); - ScaleScrollPane figurePane = new FinPointScrollPane(); - figurePane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); - figurePane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + ScaleScrollPane figurePane = new FinPointScrollPane( figure); // Create the table tableModel = new FinPointTableModel(); @@ -216,6 +218,14 @@ private JPanel shapePane() { for (int i = 0; i < Columns.values().length; i++) { table.getColumnModel().getColumn(i).setPreferredWidth(Columns.values()[i].getWidth()); } + table.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent ev) { + figure.setSelectedIndex(table.getSelectedRow()); + figure.updateFigure(); + } + + }); JScrollPane tablePane = new JScrollPane(table); JButton scaleButton = new JButton(trans.get("FreeformFinSetConfig.lbl.scaleFin")); @@ -232,36 +242,87 @@ public void actionPerformed(ActionEvent e) { // panel.add(new JLabel("Coordinates:"), "aligny bottom, alignx 50%"); // panel.add(new JLabel(" View:"), "wrap, aligny bottom"); - - panel.add(tablePane, "growy, width 100lp:100lp:, height 100lp:250lp:"); - panel.add(figurePane, "gap unrel, spanx, spany 3, growx, growy 1000, height 100lp:250lp:, wrap"); - - panel.add(new StyledLabel(trans.get("lbl.doubleClick1"), -2), "alignx 50%, wrap"); - panel.add(new StyledLabel(trans.get("FreeformFinSetConfig.lbl.doubleClick2"), -2), "alignx 50%, wrap"); - - panel.add(scaleButton, "spany 2, alignx 50%, aligny 50%"); - panel.add(new ScaleSelector(figurePane), "spany 2, aligny 50%"); - - JButton importButton = new JButton(trans.get("CustomFinImport.button.label")); - importButton.addActionListener(new ActionListener() { + JButton exportCsvButton = new JButton("Export CSV"); + exportCsvButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - importImage(); + log.info(Markers.USER_MARKER, "Export CSV free-form fin"); + + JFileChooser chooser = new JFileChooser(); + // Demonstrate "Save" dialog: + + if (JFileChooser.APPROVE_OPTION == chooser.showSaveDialog(FreeformFinSetConfig.this)){ + File selectedFile= chooser.getSelectedFile(); + + FreeformFinSetConfig.writeCSVFile(table, selectedFile); + } } }); - panel.add(importButton, "spany 2, bottom"); + JButton importButton = new JButton(trans.get("CustomFinImport.button.label")); + importButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + importImage(); + } + }); + ScaleSelector selector = new ScaleSelector(figurePane); + // fit on first start-up + figurePane.setFitting(true); + + panel.setLayout(new MigLayout("fill, gap 5!","", "[nogrid, fill, sizegroup display, growprio 200]5![sizegroup text, growprio 5]5![sizegroup buttons, align top, growprio 5]0!")); + + // first row: main display + panel.add(tablePane, "width 100lp:100lp:, growy"); + panel.add(figurePane, "width 200lp:400lp:, gap unrel, grow, height 100lp:250lp:, wrap"); + + // row of text directly below figure + panel.add(new StyledLabel(trans.get("lbl.doubleClick1")+" "+trans.get("FreeformFinSetConfig.lbl.doubleClick2"), -2), "spanx 3"); + panel.add(new StyledLabel(trans.get("FreeformFinSetConfig.lbl.clickDrag"), -2), "spanx 3"); + panel.add(new StyledLabel(trans.get("FreeformFinSetConfig.lbl.ctrlClick"), -2), "spanx 3, wrap"); + + // row of controls at the bottom of the tab: + panel.add(selector, "aligny bottom, gap unrel"); + panel.add(scaleButton, ""); + panel.add(importButton, ""); + panel.add(exportCsvButton, ""); // panel.add(new CustomFinBmpImporter(finset), "spany 2, bottom"); - panel.add(new StyledLabel(trans.get("FreeformFinSetConfig.lbl.clickDrag"), -2), "right, wrap"); - panel.add(new StyledLabel(trans.get("FreeformFinSetConfig.lbl.ctrlClick"), -2), "right"); return panel; } - - - - - + + private static void writeCSVFile(JTable table, final File outputFile){ + int nRow = table.getRowCount(); + int nCol = table.getColumnCount(); + + try { + final Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "utf-8")); + + //write the header information + StringBuilder bufferHeader = new StringBuilder(); + for (int j = 0; j < nCol; j++) { + bufferHeader.append(table.getColumnName(j)); + bufferHeader.append(", "); + } + writer.write(bufferHeader.toString() + "\r\n"); + + //write row information + for (int i = 0; i < nRow; i++) { + StringBuilder buffer = new StringBuilder(); + for (int j = 0; j < nCol; j++) { + buffer.append(table.getValueAt(i, j)); + buffer.append(", "); + } + writer.write(buffer.toString() + "\r\n"); + } + writer.close(); + + } catch (IOException e1) { + e1.printStackTrace(); + } + } + + private void importImage() { JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(FileHelper.getImageFileFilter()); @@ -277,13 +338,9 @@ private void importImage() { if (option == JFileChooser.APPROVE_OPTION) { try { CustomFinImporter importer = new CustomFinImporter(); - List<Coordinate> points = importer.getPoints(chooser.getSelectedFile()); + ArrayList<Coordinate> points = importer.getPoints(chooser.getSelectedFile()); document.startUndo(trans.get("CustomFinImport.undo")); - finset.setPoints(points); - } catch (IllegalFinPointException e) { - log.warn("Error storing fin points", e); - JOptionPane.showMessageDialog(this, trans.get("CustomFinImport.error.badimage"), - trans.get("CustomFinImport.error.title"), JOptionPane.ERROR_MESSAGE); + finset.setPoints( points); } catch (IOException e) { log.warn("Error loading file", e); JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), @@ -291,8 +348,7 @@ private void importImage() { } finally { document.stopUndo(); } - } - + } } @@ -302,73 +358,76 @@ public void updateFields() { if (tableModel != null) { tableModel.fireTableDataChanged(); + + // make sure to do this *after* the table data is updated. + if( 0 <= this.dragIndex ) { + table.setRowSelectionInterval(dragIndex, dragIndex); + }else { + table.clearSelection(); + } } + if (figure != null) { - figure.updateFigure(); + if( 0 <= this.dragIndex ) { + figure.setSelectedIndex(dragIndex); + }else{ + figure.resetSelectedIndex(); + } + figure.updateFigure(); } + + revalidate(); + repaint(); } - - - private class FinPointScrollPane extends ScaleScrollPane { + private static final int ANY_MASK = (MouseEvent.ALT_DOWN_MASK | MouseEvent.ALT_GRAPH_DOWN_MASK | MouseEvent.META_DOWN_MASK | MouseEvent.CTRL_DOWN_MASK | MouseEvent.SHIFT_DOWN_MASK); - private int dragIndex = -1; - public FinPointScrollPane() { - super(figure, false); // Disallow fitting as it's buggy + + private FinPointScrollPane( final FinPointFigure _figure) { + super( _figure); } @Override public void mousePressed(MouseEvent event) { int mods = event.getModifiersEx(); - if (event.getButton() != MouseEvent.BUTTON1 || (mods & ANY_MASK) != 0) { - super.mousePressed(event); + final int pressIndex = getPoint(event); + if ( pressIndex >= 0) { + dragIndex = pressIndex; + updateFields(); return; } - int index = getPoint(event); - if (index >= 0) { - dragIndex = index; - return; - } - index = getSegment(event); - if (index >= 0) { + final int segmentIndex = getSegment(event); + if (segmentIndex >= 0) { Point2D.Double point = getCoordinates(event); - finset.addPoint(index); - try { - finset.setPoint(index, point.x, point.y); - } catch (IllegalFinPointException ignore) { - } - dragIndex = index; - + finset.addPoint(segmentIndex, point); + + dragIndex = segmentIndex; + updateFields(); return; } super.mousePressed(event); - return; } - @Override public void mouseDragged(MouseEvent event) { - int mods = event.getModifiersEx(); + int mods = event.getModifiersEx(); if (dragIndex < 0 || (mods & (ANY_MASK | MouseEvent.BUTTON1_DOWN_MASK)) != MouseEvent.BUTTON1_DOWN_MASK) { super.mouseDragged(event); return; } + Point2D.Double point = getCoordinates(event); + finset.setPoint(dragIndex, point.x, point.y); - try { - finset.setPoint(dragIndex, point.x, point.y); - } catch (IllegalFinPointException ignore) { - log.debug("Ignoring IllegalFinPointException while dragging, dragIndex=" + dragIndex + " x=" + point.x + " y=" + point.y); - } + updateFields(); } - @Override public void mouseReleased(MouseEvent event) { dragIndex = -1; @@ -377,24 +436,23 @@ public void mouseReleased(MouseEvent event) { @Override public void mouseClicked(MouseEvent event) { - int mods = event.getModifiersEx(); - if (event.getButton() != MouseEvent.BUTTON1 || (mods & ANY_MASK) != MouseEvent.CTRL_DOWN_MASK) { - super.mouseClicked(event); - return; - } - - int index = getPoint(event); - if (index < 0) { - super.mouseClicked(event); - return; - } - - try { - finset.removePoint(index); - } catch (IllegalFinPointException ignore) { - } - } - + int mods = event.getModifiersEx(); + if(( event.getButton() == MouseEvent.BUTTON1) && (0 < (MouseEvent.CTRL_DOWN_MASK & mods))) { + int clickIndex = getPoint(event); + if ( 0 < clickIndex) { + // if ctrl+click, delete point + try { + Point2D.Double point = getCoordinates(event); + finset.removePoint(clickIndex); + } catch (IllegalFinPointException ignore) { + log.error("Ignoring IllegalFinPointException while dragging, dragIndex=" + dragIndex + ". This is likely an internal error."); + } + return; + } + } + + super.mouseClicked(event); + } private int getPoint(MouseEvent event) { Point p0 = event.getPoint(); @@ -423,28 +481,10 @@ private Point2D.Double getCoordinates(MouseEvent event) { return figure.convertPoint(x, y); } - } - - - private enum Columns { - // NUMBER { - // @Override - // public String toString() { - // return "#"; - // } - // @Override - // public String getValue(FreeformFinSet finset, int row) { - // return "" + (row+1) + "."; - // } - // @Override - // public int getWidth() { - // return 10; - // } - // }, X { @Override public String toString() { @@ -479,7 +519,7 @@ public int getWidth() { } private class FinPointTableModel extends AbstractTableModel { - + @Override public int getColumnCount() { return Columns.values().length; @@ -514,6 +554,7 @@ public void setValueAt(Object o, int rowIndex, int columnIndex) { if (!(o instanceof String)) return; + // bounds check that indices are valid if (rowIndex < 0 || rowIndex >= finset.getFinPoints().length || columnIndex < 0 || columnIndex >= Columns.values().length) { throw new IllegalArgumentException("Index out of bounds, row=" + rowIndex + " column=" + columnIndex + " fin point count=" + finset.getFinPoints().length); } @@ -523,15 +564,17 @@ public void setValueAt(Object o, int rowIndex, int columnIndex) { double value = UnitGroup.UNITS_LENGTH.fromString(str); Coordinate c = finset.getFinPoints()[rowIndex]; - if (columnIndex == Columns.X.ordinal()) + if (columnIndex == Columns.X.ordinal()){ c = c.setX(value); - else + }else{ c = c.setY(value); - + } + finset.setPoint(rowIndex, c.x, c.y); + updateFields(); } catch (NumberFormatException ignore) { - } catch (IllegalFinPointException ignore) { + log.warn("ignoring NumberFormatException while editing a Freeform Fin"); } } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FuelTankConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FuelTankConfig.java new file mode 100644 index 0000000000..8bafa42bd6 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/configdialog/FuelTankConfig.java @@ -0,0 +1,164 @@ +package net.sf.openrocket.gui.configdialog; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSpinner; +import net.miginfocom.swing.MigLayout; + +import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.DoubleModel; +import net.sf.openrocket.gui.adaptors.EnumModel; +import net.sf.openrocket.gui.components.BasicSlider; +import net.sf.openrocket.gui.components.UnitSelector; + +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.rocketcomponent.FuelTank; +import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import org.jfree.ui.Spinner; + +public class FuelTankConfig extends RocketComponentConfig { + private static final Translator trans = Application.getTranslator(); + + public FuelTankConfig(OpenRocketDocument d, RocketComponent component) { + super(d, component); + + JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", + "")); + + // Fuel tank type + panel.add(new JLabel(trans.get("FuelTank.lbl.type"))); + + final JComboBox<?> typecombo = new JComboBox<FuelTank.FuelType>( + new EnumModel<FuelTank.FuelType>(component, "FuelType", + new FuelTank.FuelType[] { + FuelTank.FuelType.FUEL, + FuelTank.FuelType.LOX, + FuelTank.FuelType.KEROSENE, + FuelTank.FuelType.RP1})); + panel.add(typecombo, "spanx, growx, wrap"); + + // Length + panel.add(new JLabel(trans.get("FuelTank.lbl.length"))); + DoubleModel l = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); + JSpinner spin = new JSpinner(l.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + panel.add(new UnitSelector(l), "growx"); + panel.add(new BasicSlider(l.getSliderModel(0, 0.05, 0.5)), "w 100lp, wrap"); + + // Diameter + panel.add(new JLabel(trans.get("FuelTank.lbl.diameter"))); + DoubleModel diameter = new DoubleModel(component, "Radius", UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(diameter.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + panel.add(new UnitSelector(diameter), "growx"); + panel.add(new BasicSlider(diameter.getSliderModel(0, 0.05, 0.5)), "w 100lp, wrap"); + + // Tank mass + panel.add(new JLabel(trans.get("FuelTank.lbl.tankmass"))); + DoubleModel m = new DoubleModel(component, "ComponentMass", UnitGroup.UNITS_MASS, 0); + spin = new JSpinner(m.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + panel.add(new UnitSelector(m), "growx"); + panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.5)), "w 100lp, wrap"); + + // Fuel quantity (mass) + panel.add(new JLabel(trans.get("FuelTank.lbl.fuelqty"))); + DoubleModel fq = new DoubleModel(component, "FuelQty", UnitGroup.UNITS_MASS, 0); + spin = new JSpinner(fq.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + panel.add(new UnitSelector(fq), "growx"); + panel.add(new BasicSlider(fq.getSliderModel(0, 0.05, 0.5)), "w 100lp, wrap"); + + // Fuel drain rate (mass / second) + panel.add(new JLabel(trans.get("FuelTank.lbl.drainrate"))); + DoubleModel dr = new DoubleModel(component, "BurnRate", UnitGroup.UNITS_MASS, 0); + spin = new JSpinner(dr.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + panel.add(new UnitSelector(dr), "growx"); + panel.add(new BasicSlider(dr.getSliderModel(0, 0.05, 0.5)), "w 100lp, wrap"); + + // Positioning + panel.add(new JLabel(trans.get("MassComponentCfg.lbl.PosRelativeto"))); + + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods); + final JComboBox<?> methodCombo = new JComboBox<AxialMethod>(methodModel); + panel.add(methodCombo, "spanx, growx, wrap"); + panel.add(new JLabel(trans.get("MassComponentCfg.lbl.plus")), "right"); + DoubleModel q = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); + spin = new JSpinner(q.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + + panel.add(new UnitSelector(q), "growx"); + panel.add(new BasicSlider(q.getSliderModel( + new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), + new DoubleModel(component.getParent(), "Length"))), + "w 100lp, wrap"); + + // Add other tabs + // Radial position + tabbedPane.insertTab(trans.get("FuelTank.tab.Radialpos"), null, positionTab(), + trans.get("FuelTank.tab.ttip.Radialpos"), 1); + tabbedPane.insertTab(trans.get("FuelTank.tab.General"), null, panel, + trans.get("FuelTank.tab.ttip.General"), 0); + } + + protected JPanel positionTab() { + JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][651p::][301p::]", "")); + + //// Radial position + //// Radial distance: + panel.add(new JLabel(trans.get("FuelTank.lbl.Radialdistance"))); + + DoubleModel rp = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0); + + JSpinner spin = new JSpinner(rp.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + + panel.add(new UnitSelector(rp), "growx"); + panel.add(new BasicSlider(rp.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap"); + + + //// Radial direction: + panel.add(new JLabel(trans.get("FuelTank.lbl.Radialdirection"))); + + rp = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE); + + spin = new JSpinner(rp.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + + panel.add(new UnitSelector(rp), "growx"); + panel.add(new BasicSlider(rp.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); + + + //// Reset button + JButton button = new JButton(trans.get("MassComponentCfg.but.Reset")); + button.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + ((FuelTank) component).setRadialDirection(0.0); + ((FuelTank) component).setRadialPosition(0.0); + } + }); + panel.add(button, "spanx, right"); + + return panel; + } + +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java index 614785ef41..69a5d2bc56 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/InnerTubeConfig.java @@ -43,6 +43,7 @@ import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RingComponent; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.BugException; @@ -51,6 +52,7 @@ public class InnerTubeConfig extends RocketComponentConfig { + private static final long serialVersionUID = 7900041420864324470L; private static final Translator trans = Application.getTranslator(); @@ -95,11 +97,7 @@ public InnerTubeConfig(OpenRocketDocument d, RocketComponent c) { panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); - if (od == null) - panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap"); - else - panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), - "w 100lp, wrap"); + panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap"); if (m.isAutomaticAvailable()) { JCheckBox check = new JCheckBox(m.getAutomaticAction()); @@ -142,21 +140,14 @@ public InnerTubeConfig(OpenRocketDocument d, RocketComponent c) { //// Position relative to: panel.add(new JLabel(trans.get("ringcompcfg.Positionrelativeto"))); - JComboBox combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); + JComboBox<?> combo = new JComboBox<AxialMethod>( new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods )); panel.add(combo, "spanx 3, growx, wrap"); //// plus panel.add(new JLabel(trans.get("ringcompcfg.plus")), "right"); //// PositionValue - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -343,13 +334,14 @@ public void run() { } InnerTube tube = (InnerTube) component; - if (tube.getClusterCount() <= 1) + if (tube.getInstanceCount() <= 1) return; document.addUndoPosition("Split cluster"); - Coordinate[] coords = { Coordinate.NUL }; - coords = component.shiftCoordinates(coords); + Coordinate[] coords = new Coordinate[]{Coordinate.ZERO }; + // coords = component.shiftCoordinates( coords); // old version + coords = component.getComponentLocations(); parent.removeChild(index); for (int i = 0; i < coords.length; i++) { InnerTube copy = InnerTube.makeIndividualClusterComponent(coords[i], component.getName() + " #" + (i + 1), component); @@ -388,6 +380,10 @@ public void actionPerformed(ActionEvent arg0) { class ClusterSelectionPanel extends JPanel { + /** + * + */ + private static final long serialVersionUID = 1804786106133398810L; private static final int BUTTON_SIZE = 50; private static final int MOTOR_DIAMETER = 10; @@ -416,6 +412,10 @@ public ClusterSelectionPanel(Clusterable component) { private class ClusterButton extends JPanel implements StateChangeListener, MouseListener, Resettable { + /** + * + */ + private static final long serialVersionUID = 3626386642481889629L; private Clusterable component; private ClusterConfiguration config; diff --git a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java index 3f482f2f40..7083121a41 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/LaunchLugConfig.java @@ -16,12 +16,13 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class LaunchLugConfig extends RocketComponentConfig { - private MotorConfig motorConfigPane = null; private static final Translator trans = Application.getTranslator(); public LaunchLugConfig(OpenRocketDocument d, RocketComponent c) { @@ -93,16 +94,14 @@ public LaunchLugConfig(OpenRocketDocument d, RocketComponent c) { //// Radial position: panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Radialpos"))); - m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE); - + m = new DoubleModel(component, "AngularOffset", UnitGroup.UNITS_ANGLE, -180, 180); + spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); - - + panel.add(new BasicSlider(m.getSliderModel(-180, 180) ), "w 100lp, wrap"); primary.add(panel, "grow, gapright 20lp"); @@ -111,22 +110,15 @@ public LaunchLugConfig(OpenRocketDocument d, RocketComponent c) { //// Position relative to: - panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto"))); - - JComboBox combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); + panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto"))); + EnumModel<AxialMethod> positionModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + JComboBox<AxialMethod> positionCombo = new JComboBox<AxialMethod>( positionModel ); + panel.add( positionCombo, "spanx, growx, wrap"); //// plus panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java index b4e2771923..49e869b406 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MassComponentConfig.java @@ -19,10 +19,12 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.MassComponent; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class MassComponentConfig extends RocketComponentConfig { private static final Translator trans = Application.getTranslator(); @@ -34,8 +36,8 @@ public MassComponentConfig(OpenRocketDocument d, RocketComponent component) { //// Mass component type panel.add(new JLabel(trans.get("MassComponentCfg.lbl.type"))); - @SuppressWarnings("unchecked") - JComboBox typecombo = new JComboBox( + + final JComboBox<?> typecombo = new JComboBox<MassComponent.MassComponentType>( new EnumModel<MassComponent.MassComponentType>(component, "MassComponentType", new MassComponent.MassComponentType[] { MassComponent.MassComponentType.MASSCOMPONENT, @@ -108,19 +110,13 @@ public MassComponentConfig(OpenRocketDocument d, RocketComponent component) { //// Position relative to: panel.add(new JLabel(trans.get("MassComponentCfg.lbl.PosRelativeto"))); - JComboBox combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + final JComboBox<?> methodCombo = new JComboBox<AxialMethod>( methodModel ); + panel.add(methodCombo, "spanx, growx, wrap"); //// plus panel.add(new JLabel(trans.get("MassComponentCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java index eaa449245c..a1f4192ca3 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/MotorConfig.java @@ -1,11 +1,9 @@ package net.sf.openrocket.gui.configdialog; -import java.awt.Color; import java.awt.Component; import java.awt.Container; -import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; @@ -23,7 +21,8 @@ import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; +import net.sf.openrocket.motor.IgnitionEvent; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -31,6 +30,7 @@ public class MotorConfig extends JPanel { + private static final long serialVersionUID = -4974509134239867067L; private final MotorMount mount; private static final Translator trans = Application.getTranslator(); @@ -65,20 +65,21 @@ public MotorConfig(MotorMount motorMount) { panel.add(new BasicSlider(dm.getSliderModel(-0.02, 0.06)), "w 100lp, wrap unrel"); - // Select ignition event //// Ignition at: panel.add(new JLabel(trans.get("MotorCfg.lbl.Ignitionat") + " " + CommonStrings.dagger), ""); - IgnitionConfiguration ignitionConfig = mount.getIgnitionConfiguration().getDefault(); - JComboBox combo = new JComboBox(new EnumModel<IgnitionConfiguration.IgnitionEvent>(ignitionConfig, "IgnitionEvent")); - panel.add(combo, "growx, wrap"); + MotorConfiguration motorInstance = mount.getDefaultMotorConfig(); + + final EnumModel<IgnitionEvent> igEvModel = new EnumModel<IgnitionEvent>(motorInstance, "IgnitionEvent", IgnitionEvent.values()); + final JComboBox<IgnitionEvent> eventBox = new JComboBox<IgnitionEvent>( igEvModel); + panel.add(eventBox , "growx, wrap"); // ... and delay //// plus panel.add(new JLabel(trans.get("MotorCfg.lbl.plus")), "gap indent, skip 1, span, split"); - dm = new DoubleModel(ignitionConfig, "IgnitionDelay", 0); + dm = new DoubleModel(motorInstance, "IgnitionDelay", 0); spin = new JSpinner(dm.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin, 3)); panel.add(spin, "gap rel rel"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java index e57fdd9008..f4c174c79e 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/NoseConeConfig.java @@ -27,9 +27,9 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class NoseConeConfig extends RocketComponentConfig { - private JComboBox typeBox; private DescriptionArea description; @@ -44,104 +44,96 @@ public class NoseConeConfig extends RocketComponentConfig { public NoseConeConfig(OpenRocketDocument d, RocketComponent c) { super(d, c); - DoubleModel m; - JPanel panel = new JPanel(new MigLayout("", "[][65lp::][30lp::]")); + final JPanel panel = new JPanel(new MigLayout("", "[][65lp::][30lp::]")); //// Shape selection - //// Nose cone shape: - panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconeshape"))); - - Transition.Shape selected = ((NoseCone) component).getType(); - Transition.Shape[] typeList = Transition.Shape.values(); - - typeBox = new JComboBox(typeList); - typeBox.setEditable(false); - typeBox.setSelectedItem(selected); - typeBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Transition.Shape s = (Transition.Shape) typeBox.getSelectedItem(); - ((NoseCone) component).setType(s); - description.setText(PREDESC + s.getNoseConeDescription()); - updateEnabled(); - } - }); - panel.add(typeBox, "span, wrap rel"); - - - - - //// Shape parameter - //// Shape parameter: - shapeLabel = new JLabel(trans.get("NoseConeCfg.lbl.Shapeparam")); - panel.add(shapeLabel); - - m = new DoubleModel(component, "ShapeParameter"); - - shapeSpinner = new JSpinner(m.getSpinnerModel()); - shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner)); - panel.add(shapeSpinner, "growx"); - - DoubleModel min = new DoubleModel(component, "ShapeParameterMin"); - DoubleModel max = new DoubleModel(component, "ShapeParameterMax"); - shapeSlider = new BasicSlider(m.getSliderModel(min, max)); - panel.add(shapeSlider, "skip, w 100lp, wrap para"); - - updateEnabled(); - - - //// Length - //// Nose cone length: - panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconelength"))); - - m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); - JSpinner spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.7)), "w 100lp, wrap"); - - //// Diameter - //// Base diameter: - panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Basediam"))); - - m = new DoubleModel(component, "AftRadius", 2.0, UnitGroup.UNITS_LENGTH, 0); // Diameter = 2*Radius - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); - - JCheckBox check = new JCheckBox(m.getAutomaticAction()); - //// Automatic - check.setText(trans.get("NoseConeCfg.checkbox.Automatic")); - panel.add(check, "skip, span 2, wrap"); - - - //// Wall thickness: - panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Wallthickness"))); - - m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); - - - check = new JCheckBox(new BooleanModel(component, "Filled")); - //// Filled - check.setText(trans.get("NoseConeCfg.checkbox.Filled")); - panel.add(check, "skip, span 2, wrap"); - + {//// Nose cone shape: + panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconeshape"))); + + Transition.Shape selected = ((NoseCone) component).getType(); + Transition.Shape[] typeList = Transition.Shape.values(); + + final JComboBox<Transition.Shape> typeBox = new JComboBox<Transition.Shape>(typeList); + typeBox.setEditable(false); + typeBox.setSelectedItem(selected); + typeBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Transition.Shape s = (Transition.Shape) typeBox.getSelectedItem(); + ((NoseCone) component).setType(s); + description.setText(PREDESC + s.getNoseConeDescription()); + updateEnabled(); + } + }); + panel.add(typeBox, "span, wrap rel"); + + //// Shape parameter: + this.shapeLabel = new JLabel(trans.get("NoseConeCfg.lbl.Shapeparam")); + panel.add(shapeLabel); + + final DoubleModel parameterModel = new DoubleModel(component, "ShapeParameter"); + + this.shapeSpinner = new JSpinner(parameterModel.getSpinnerModel()); + shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner)); + panel.add(shapeSpinner, "growx"); + + DoubleModel min = new DoubleModel(component, "ShapeParameterMin"); + DoubleModel max = new DoubleModel(component, "ShapeParameterMax"); + this.shapeSlider = new BasicSlider(parameterModel.getSliderModel(min, max)); + panel.add(shapeSlider, "skip, w 100lp, wrap para"); + + updateEnabled(); + } + + { /// Nose cone length: + panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconelength"))); + + final DoubleModel lengthModel = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); + JSpinner spin = new JSpinner(lengthModel.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + panel.add(spin, "growx"); + + panel.add(new UnitSelector(lengthModel), "growx"); + panel.add(new BasicSlider(lengthModel.getSliderModel(0, 0.1, 0.7)), "w 100lp, wrap"); + } + { + /// Base diameter: + + panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Basediam"))); + + final DoubleModel aftRadiusModel = new DoubleModel(component, "AftRadius", 2.0, UnitGroup.UNITS_LENGTH, 0); // Diameter = 2*Radius + final JSpinner radiusSpinner = new JSpinner(aftRadiusModel.getSpinnerModel()); + radiusSpinner.setEditor(new SpinnerEditor(radiusSpinner)); + panel.add(radiusSpinner, "growx"); + + panel.add(new UnitSelector(aftRadiusModel), "growx"); + panel.add(new BasicSlider(aftRadiusModel.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); + + JCheckBox check = new JCheckBox(aftRadiusModel.getAutomaticAction()); + //// Automatic + check.setText(trans.get("NoseConeCfg.checkbox.Automatic")); + panel.add(check, "skip, span 2, wrap"); + } + + {//// Wall thickness: + panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Wallthickness"))); + + final DoubleModel thicknessModel = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); + final JSpinner thicknessSpinner = new JSpinner(thicknessModel.getSpinnerModel()); + thicknessSpinner.setEditor(new SpinnerEditor(thicknessSpinner)); + panel.add(thicknessSpinner, "growx"); + + panel.add(new UnitSelector(thicknessModel), "growx"); + panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); + + + final JCheckBox filledCheckbox = new JCheckBox(new BooleanModel(component, "Filled")); + //// Filled + filledCheckbox .setText(trans.get("NoseConeCfg.checkbox.Filled")); + panel.add(filledCheckbox, "skip, span 2, wrap"); + } panel.add(new JLabel(""), "growy"); - - //// Description @@ -153,8 +145,6 @@ public void actionPerformed(ActionEvent e) { //// Material - - panel2.add(materialPanel( Material.Type.BULK), "span, wrap"); panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java index 107fca930c..b53b0a6c88 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ParachuteConfig.java @@ -29,10 +29,13 @@ import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; import net.sf.openrocket.rocketcomponent.Parachute; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; public class ParachuteConfig extends RecoveryDeviceConfig { + + private static final long serialVersionUID = 6108892447949958115L; private static final Translator trans = Application.getTranslator(); public ParachuteConfig(OpenRocketDocument d, final RocketComponent component) { @@ -87,10 +90,10 @@ public void actionPerformed(ActionEvent e) { //// Material: panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material"))); - JComboBox<?> combo = new JComboBox(new MaterialModel(panel, component, + JComboBox<Material> surfaceMaterialCombo = new JComboBox<Material>(new MaterialModel(panel, component, Material.Type.SURFACE)); - combo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel")); - panel.add(combo, "spanx 3, growx, wrap 30lp"); + surfaceMaterialCombo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel")); + panel.add( surfaceMaterialCombo, "spanx 3, growx, wrap 30lp"); @@ -120,9 +123,9 @@ public void actionPerformed(ActionEvent e) { //// Material: panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material"))); - combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE, + JComboBox<Material> shroudMaterialCombo = new JComboBox<Material>(new MaterialModel(panel, component, Material.Type.LINE, "LineMaterial")); - panel.add(combo, "spanx 3, growx, wrap"); + panel.add( shroudMaterialCombo, "spanx 3, growx, wrap"); @@ -136,20 +139,14 @@ public void actionPerformed(ActionEvent e) { //// Position relative to: panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto"))); - combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + JComboBox<AxialMethod> positionCombo = new JComboBox<AxialMethod>( methodModel ); + panel.add( positionCombo, "spanx, growx, wrap"); //// plus panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -194,15 +191,15 @@ public void actionPerformed(ActionEvent e) { //// Deploys at: panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat") + " " + CommonStrings.dagger), ""); - DeploymentConfiguration deploymentConfig = parachute.getDeploymentConfiguration().getDefault(); + DeploymentConfiguration deploymentConfig = parachute.getDeploymentConfigurations().getDefault(); // this issues a warning because EnumModel ipmlements ComboBoxModel without a parameter... ComboBoxModel<DeploymentConfiguration.DeployEvent> deployOptionsModel = new EnumModel<DeploymentConfiguration.DeployEvent>(deploymentConfig, "DeployEvent"); - combo = new JComboBox<DeploymentConfiguration.DeployEvent>( deployOptionsModel ); + JComboBox<DeploymentConfiguration.DeployEvent> eventCombo = new JComboBox<DeploymentConfiguration.DeployEvent>( deployOptionsModel ); if( (component.getStageNumber() + 1 ) == d.getRocket().getStageCount() ){ // This is the bottom stage: Restrict deployment options. - combo.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); + eventCombo.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); } - panel.add(combo, "spanx 3, growx, wrap"); + panel.add(eventCombo, "spanx 3, growx, wrap"); // ... and delay //// plus diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java new file mode 100644 index 0000000000..7db26103c0 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/configdialog/RailButtonConfig.java @@ -0,0 +1,114 @@ +package net.sf.openrocket.gui.configdialog; + +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSpinner; + +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.DoubleModel; +import net.sf.openrocket.gui.adaptors.EnumModel; +import net.sf.openrocket.gui.components.BasicSlider; +import net.sf.openrocket.gui.components.UnitSelector; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.RailButton; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; + +@SuppressWarnings("serial") +public class RailButtonConfig extends RocketComponentConfig { + + private static final Translator trans = Application.getTranslator(); + + public RailButtonConfig( OpenRocketDocument document, RocketComponent component) { + super(document, component); + + // For DEBUG purposes +// if( component instanceof AxialStage ){ +// System.err.println(" Dumping AxialStage tree info for devel / debugging."); +// System.err.println(component.toDebugTree()); +// } + + + //// General and General properties + tabbedPane.insertTab( trans.get("RailBtnCfg.tab.General"), null, buttonTab( (RailButton)component ), trans.get("RailBtnCfg.tab.GeneralProp"), 0); + tabbedPane.setSelectedIndex(0); + + } + + private JPanel buttonTab( final RailButton rbc ){ + JPanel panel = new JPanel( new MigLayout()); + + + { //// Outer Diameter + panel.add(new JLabel(trans.get("RailBtnCfg.lbl.OuterDiam"))); + DoubleModel ODModel = new DoubleModel(component, "OuterDiameter", UnitGroup.UNITS_LENGTH, 0); + JSpinner ODSpinner = new JSpinner( ODModel.getSpinnerModel()); + ODSpinner.setEditor(new SpinnerEditor(ODSpinner)); + panel.add(ODSpinner, "growx"); + panel.add(new UnitSelector(ODModel), "growx"); + panel.add(new BasicSlider(ODModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); + } + { //// Height + panel.add(new JLabel(trans.get("RailBtnCfg.lbl.TotalHeight"))); + DoubleModel heightModel = new DoubleModel(component, "TotalHeight", UnitGroup.UNITS_LENGTH, 0); + JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); + heightSpinner.setEditor(new SpinnerEditor(heightSpinner)); + panel.add(heightSpinner, "growx"); + panel.add(new UnitSelector(heightModel), "growx"); + panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap"); + } + + { //// Angular Position: + panel.add(new JLabel(trans.get("RailBtnCfg.lbl.Angle"))); + DoubleModel angleModel = new DoubleModel(component, "AngleOffset", UnitGroup.UNITS_ANGLE, -180, +180); + JSpinner angleSpinner = new JSpinner( angleModel.getSpinnerModel()); + angleSpinner.setEditor(new SpinnerEditor(angleSpinner)); + panel.add(angleSpinner, "growx"); + panel.add(new UnitSelector( angleModel), "growx"); + panel.add(new BasicSlider( angleModel.getSliderModel(-180, 180)), "w 100lp, wrap"); + } + + { //// Position relative to: + panel.add(new JLabel(trans.get("RailBtnCfg.lbl.PosRelativeTo"))); + + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + JComboBox<AxialMethod> relToCombo = new JComboBox<AxialMethod>( methodModel ); + panel.add( relToCombo, "growx, wrap rel"); + } + + { //// plus + final double parentLength = ((BodyTube)rbc.getParent()).getLength(); + panel.add(new JLabel(trans.get("RailBtnCfg.lbl.Plus")), "right"); + DoubleModel offsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); + JSpinner offsetSpinner = new JSpinner(offsetModel.getSpinnerModel()); + offsetSpinner.setEditor(new SpinnerEditor(offsetSpinner)); + panel.add(offsetSpinner, "growx"); + panel.add(new UnitSelector( offsetModel), "growx"); + panel.add(new BasicSlider( offsetModel.getSliderModel(0, parentLength)), "w 100lp, wrap para"); + + } + + //// Material + panel.add( instanceablePanel(rbc), "cell 4 0, spany 3, wrap para"); + + + //// Material + panel.add(materialPanel(Material.Type.BULK),"cell 4 2, spany 2, gapleft paragraph, aligny 0%, growy"); + // ... spany"); + + return panel; + } + + @Override + public void updateFields() { + super.updateFields(); + } + +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RecoveryDeviceConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RecoveryDeviceConfig.java index ea5a71438f..931102cfbb 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RecoveryDeviceConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RecoveryDeviceConfig.java @@ -30,7 +30,7 @@ public void updateFields() { if (altitudeComponents == null) return; - boolean enabled = (((RecoveryDevice) component).getDeploymentConfiguration().getDefault().getDeployEvent() == DeployEvent.ALTITUDE); + boolean enabled = (((RecoveryDevice) component).getDeploymentConfigurations().getDefault().getDeployEvent() == DeployEvent.ALTITUDE); for (JComponent c : altitudeComponents) { c.setEnabled(enabled); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java index df52674057..0c838a2371 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RingComponentConfig.java @@ -19,9 +19,11 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.EngineBlock; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class RingComponentConfig extends RocketComponentConfig { private static final Translator trans = Application.getTranslator(); @@ -125,21 +127,15 @@ protected JPanel generalTab(String outer, String inner, String thickness, String //// Position relative to: panel.add(new JLabel(trans.get("ringcompcfg.Positionrelativeto"))); - JComboBox combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx 3, growx, wrap"); + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + final JComboBox<AxialMethod> positionCombo = new JComboBox<AxialMethod>( methodModel ); + panel.add( positionCombo, "spanx 3, growx, wrap"); //// plus panel.add(new JLabel(trans.get("ringcompcfg.plus")), "right"); //// PositionValue - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 30142f4cc8..69dd029664 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -1,6 +1,8 @@ package net.sf.openrocket.gui.configdialog; +import java.awt.Component; +import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; @@ -29,6 +31,7 @@ import net.sf.openrocket.gui.adaptors.BooleanModel; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; +import net.sf.openrocket.gui.adaptors.IntegerModel; import net.sf.openrocket.gui.adaptors.MaterialModel; import net.sf.openrocket.gui.adaptors.PresetModel; import net.sf.openrocket.gui.components.BasicSlider; @@ -42,14 +45,17 @@ import net.sf.openrocket.rocketcomponent.ComponentAssembly; import net.sf.openrocket.rocketcomponent.ExternalComponent; import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.rocketcomponent.Instanceable; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Invalidatable; public class RocketComponentConfig extends JPanel { - + private static final long serialVersionUID = -2925484062132243982L; + private static final Translator trans = Application.getTranslator(); protected final OpenRocketDocument document; @@ -58,7 +64,7 @@ public class RocketComponentConfig extends JPanel { private final List<Invalidatable> invalidatables = new ArrayList<Invalidatable>(); - private JComboBox presetComboBox; + private JComboBox<?> presetComboBox; private PresetModel presetModel; protected final JTextField componentNameField; @@ -71,7 +77,7 @@ public class RocketComponentConfig extends JPanel { public RocketComponentConfig(OpenRocketDocument document, RocketComponent component) { - setLayout(new MigLayout("fill", "[min,align right]:10[fill, grow]")); + setLayout(new MigLayout("fill, gap 5!, ins panel", "[]:5[]", "[growprio 10]10![fill, grow, growprio 500]10![growprio 10]")); this.document = document; this.component = component; @@ -79,7 +85,7 @@ public RocketComponentConfig(OpenRocketDocument document, RocketComponent compon JLabel label = new JLabel(trans.get("RocketCompCfg.lbl.Componentname")); //// The component name. label.setToolTipText(trans.get("RocketCompCfg.ttip.Thecomponentname")); - this.add(label, "spanx, split"); + this.add(label, "spanx, height 50!, split"); componentNameField = new JTextField(15); textFieldListener = new TextFieldListener(); @@ -100,7 +106,7 @@ public RocketComponentConfig(OpenRocketDocument document, RocketComponent compon tabbedPane = new JTabbedPane(); - this.add(tabbedPane, "newline, span, growx, growy 1, wrap"); + this.add(tabbedPane, "newline, span, growx, growy 100, wrap"); //// Override and Mass and CG override options tabbedPane.addTab(trans.get("RocketCompCfg.tab.Override"), null, overrideTab(), @@ -126,7 +132,7 @@ protected void addButtons(JButton... buttons) { this.remove(buttonPanel); } - buttonPanel = new JPanel(new MigLayout("fill, ins 0")); + buttonPanel = new JPanel(new MigLayout("fillx, ins 0")); //// Mass: infoLabel = new StyledLabel(" ", -1); @@ -148,7 +154,7 @@ public void actionPerformed(ActionEvent arg0) { updateFields(); - this.add(buttonPanel, "spanx, growx"); + this.add(buttonPanel, "newline, spanx, growx, height 50!"); } @@ -220,10 +226,10 @@ protected JPanel materialPanel(Material.Type type, label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects")); subPanel.add(label, "spanx 4, wrap rel"); - JComboBox combo = new JComboBox(new MaterialModel(subPanel, component, type, partName)); + JComboBox<Material> materialCombo = new JComboBox<Material>(new MaterialModel(subPanel, component, type, partName)); //// The component material affects the weight of the component. - combo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); - subPanel.add(combo, "spanx 4, growx, wrap paragraph"); + materialCombo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects")); + subPanel.add(materialCombo, "spanx 4, growx, wrap paragraph"); if (component instanceof ExternalComponent) { @@ -235,9 +241,10 @@ protected JPanel materialPanel(Material.Type type, label.setToolTipText(tip); subPanel.add(label, "spanx 4, wmin 220lp, wrap rel"); - combo = new JComboBox(new EnumModel<ExternalComponent.Finish>(component, "Finish")); - combo.setToolTipText(tip); - subPanel.add(combo, "spanx 4, growx, split"); + JComboBox<ExternalComponent.Finish> finishCombo = new JComboBox<ExternalComponent.Finish>( + new EnumModel<ExternalComponent.Finish>(component, "Finish")); + finishCombo.setToolTipText(tip); + subPanel.add( finishCombo, "spanx 4, growx, split"); //// Set for all JButton button = new JButton(trans.get("RocketCompCfg.but.Setforall")); @@ -268,6 +275,27 @@ public void actionPerformed(ActionEvent e) { return subPanel; } + protected JPanel instanceablePanel( Instanceable inst ){ + JPanel panel = new JPanel( new MigLayout("fill")); + { // Instance Count + panel.add(new JLabel(trans.get("RocketCompCfg.lbl.InstanceCount"))); + IntegerModel countModel = new IntegerModel(component, "InstanceCount", 1); + JSpinner countSpinner = new JSpinner( countModel.getSpinnerModel()); + countSpinner.setEditor(new SpinnerEditor(countSpinner)); + panel.add(countSpinner, "w 100lp, wrap rel"); + } + + { // Instance separation + panel.add(new JLabel(trans.get("RocketCompCfg.lbl.InstanceSeparation"))); + DoubleModel separationModel = new DoubleModel(component, "InstanceSeparation", UnitGroup.UNITS_LENGTH); + JSpinner separationSpinner = new JSpinner( separationModel.getSpinnerModel()); + separationSpinner.setEditor(new SpinnerEditor(separationSpinner)); + panel.add(separationSpinner, "growx"); + panel.add(new UnitSelector(separationModel), "growx"); + panel.add(new BasicSlider(separationModel.getSliderModel(0, 0.001, 0.02)), "w 100lp, wrap para"); + } + return panel; + } private JPanel overrideTab() { JPanel panel = new JPanel(new MigLayout("align 50% 20%, fillx, gap rel unrel", @@ -303,7 +331,9 @@ private JPanel overrideTab() { bm.addEnableComponent(bs); panel.add(bs, "growx 5, w 100lp, wrap"); - + + //OVERRIDES CG ---------------------------------- + //// CG override bm = new BooleanModel(component, "CGOverridden"); check = new JCheckBox(bm); @@ -320,7 +350,7 @@ private JPanel overrideTab() { Iterator<RocketComponent> iterator = component.iterator(false); while (iterator.hasNext()) { RocketComponent c = iterator.next(); - if (c.getRelativePosition() == RocketComponent.Position.AFTER) + if (c.getAxialMethod() == AxialMethod.AFTER) l += c.getLength(); } length = new DoubleModel(l); @@ -341,6 +371,37 @@ private JPanel overrideTab() { bm.addEnableComponent(bs); panel.add(bs, "growx 5, w 100lp, wrap 35lp"); + + //END OVERRIDES CG --------------------------------------------------- + + + //BEGIN OVERRIDES CD --------------------------------------------------- + + + bm = new BooleanModel(component, "CDOverridden"); + check = new JCheckBox(bm); + //// Override mass: + check.setText("Set coefficient of drag:"); + panel.add(check, "growx 1, gapright 20lp"); + + m = new DoubleModel(component, "OverrideCD", UnitGroup.UNITS_NONE, 0); + + spin = new JSpinner(m.getSpinnerModel()); + + spin.setEditor(new SpinnerEditor(spin)); + bm.addEnableComponent(spin, true); + panel.add(spin, "growx 1"); + + + bs = new BasicSlider(m.getSliderModel(0, 0.01, 1.0)); + bm.addEnableComponent(bs); + panel.add(bs, "growx 5, w 100lp, wrap"); + + + //END OVERRIDES CP -------------------------------------------------- + + + // Override subcomponents checkbox bm = new BooleanModel(component, "OverrideSubcomponents"); @@ -569,4 +630,13 @@ public void invalidateModels() { } -} \ No newline at end of file + + protected static void setDeepEnabled(Component component, boolean enabled) { + component.setEnabled(enabled); + if (component instanceof Container) { + for (Component c : ((Container) component).getComponents()) { + setDeepEnabled(c, enabled); + } + } + } +} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java index 3fc5d68417..113381cdc9 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ShockCordConfig.java @@ -16,9 +16,11 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class ShockCordConfig extends RocketComponentConfig { private static final Translator trans = Application.getTranslator(); @@ -62,20 +64,14 @@ public ShockCordConfig(OpenRocketDocument d, RocketComponent component) { //// Position relative to: panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.Posrelativeto"))); - JComboBox combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + final JComboBox<AxialMethod> combo = new JComboBox<AxialMethod>( methodModel ); panel2.add(combo, "spanx, growx, wrap"); //// plus panel2.add(new JLabel(trans.get("ShockCordCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel2.add(spin, "growx"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/StageConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/StageConfig.java deleted file mode 100644 index 70ce149b23..0000000000 --- a/swing/src/net/sf/openrocket/gui/configdialog/StageConfig.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.sf.openrocket.gui.configdialog; - -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JSpinner; - -import net.miginfocom.swing.MigLayout; -import net.sf.openrocket.document.OpenRocketDocument; -import net.sf.openrocket.gui.SpinnerEditor; -import net.sf.openrocket.gui.adaptors.DoubleModel; -import net.sf.openrocket.gui.adaptors.EnumModel; -import net.sf.openrocket.gui.components.StyledLabel; -import net.sf.openrocket.gui.components.StyledLabel.Style; -import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; -import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; -import net.sf.openrocket.startup.Application; - -public class StageConfig extends RocketComponentConfig { - private static final Translator trans = Application.getTranslator(); - - public StageConfig(OpenRocketDocument document, RocketComponent component) { - super(document, component); - - // Stage separation config (for non-first stage) - if (component.getStageNumber() > 0) { - JPanel tab = separationTab((Stage) component); - tabbedPane.insertTab(trans.get("tab.Separation"), null, tab, - trans.get("tab.Separation.ttip"), 1); - } - - } - - - private JPanel separationTab(Stage stage) { - JPanel panel = new JPanel(new MigLayout("fill")); - - // Select separation event - panel.add(new StyledLabel(trans.get("separation.lbl.title") + " " + CommonStrings.dagger, Style.BOLD), "spanx, wrap rel"); - - StageSeparationConfiguration config = stage.getStageSeparationConfiguration().getDefault(); - JComboBox combo = new JComboBox(new EnumModel<StageSeparationConfiguration.SeparationEvent>(config, "SeparationEvent")); - panel.add(combo, ""); - - // ... and delay - panel.add(new JLabel(trans.get("separation.lbl.plus")), ""); - - DoubleModel dm = new DoubleModel(config, "SeparationDelay", 0); - JSpinner spin = new JSpinner(dm.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "width 45"); - - //// seconds - panel.add(new JLabel(trans.get("separation.lbl.seconds")), "wrap unrel"); - - panel.add(new StyledLabel(CommonStrings.override_description, -1), "spanx, wrap para"); - - return panel; - } - -} diff --git a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java index 68ad60ccf2..c5ffcdec6f 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/StreamerConfig.java @@ -4,7 +4,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.ComboBoxModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; @@ -25,13 +24,15 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; +import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Streamer; -import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; public class StreamerConfig extends RecoveryDeviceConfig { + private static final long serialVersionUID = -4445736703470494588L; private static final Translator trans = Application.getTranslator(); public StreamerConfig(OpenRocketDocument d, final RocketComponent component) { @@ -93,11 +94,11 @@ public StreamerConfig(OpenRocketDocument d, final RocketComponent component) { //// Material: panel.add(new JLabel(trans.get("StreamerCfg.lbl.Material"))); - JComboBox combo = new JComboBox(new MaterialModel(panel, component, + JComboBox<Material> streamerMaterialCombo = new JComboBox<Material>(new MaterialModel(panel, component, Material.Type.SURFACE)); //// The component material affects the weight of the component. - combo.setToolTipText(trans.get("StreamerCfg.combo.ttip.MaterialModel")); - panel.add(combo, "spanx 3, growx, wrap 20lp"); + streamerMaterialCombo.setToolTipText(trans.get("StreamerCfg.combo.ttip.MaterialModel")); + panel.add(streamerMaterialCombo, "spanx 3, growx, wrap 20lp"); @@ -139,20 +140,14 @@ public StreamerConfig(OpenRocketDocument d, final RocketComponent component) { //// Position relative to: panel.add(new JLabel(trans.get("StreamerCfg.lbl.Posrelativeto"))); - combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + final JComboBox<AxialMethod> positionCombo = new JComboBox<AxialMethod>( methodModel ); + panel.add( positionCombo, "spanx, growx, wrap"); //// plus panel.add(new JLabel(trans.get("StreamerCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); @@ -196,13 +191,13 @@ public StreamerConfig(OpenRocketDocument d, final RocketComponent component) { //// Deploys at: panel.add(new JLabel(trans.get("StreamerCfg.lbl.Deploysat") + " " + CommonStrings.dagger), ""); - DeploymentConfiguration deploymentConfig = streamer.getDeploymentConfiguration().getDefault(); - combo = new JComboBox(new EnumModel<DeploymentConfiguration.DeployEvent>(deploymentConfig, "DeployEvent")); + DeploymentConfiguration deploymentConfig = streamer.getDeploymentConfigurations().getDefault(); + JComboBox<DeploymentConfiguration.DeployEvent> eventCombo = new JComboBox<DeploymentConfiguration.DeployEvent>(new EnumModel<DeploymentConfiguration.DeployEvent>(deploymentConfig, "DeployEvent")); if( (component.getStageNumber() + 1 ) == d.getRocket().getStageCount() ){ // This is the bottom stage. restrict deployment options. - combo.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); + eventCombo.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); } - panel.add(combo, "spanx 3, growx, wrap"); + panel.add( eventCombo, "spanx 3, growx, wrap"); // ... and delay //// plus diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java index 8823647223..5b2b11c9ce 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TransitionConfig.java @@ -26,9 +26,10 @@ import net.sf.openrocket.unit.UnitGroup; public class TransitionConfig extends RocketComponentConfig { + private static final long serialVersionUID = -1851275950604625741L; private static final Translator trans = Application.getTranslator(); - private JComboBox typeBox; + private JComboBox<Transition.Shape> typeBox; //private JLabel description; private JLabel shapeLabel; @@ -44,13 +45,7 @@ public class TransitionConfig extends RocketComponentConfig { public TransitionConfig(OpenRocketDocument d, RocketComponent c) { super(d, c); - DoubleModel m; - JSpinner spin; - JCheckBox checkbox; - - JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); - - + final JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); //// Shape selection //// Transition shape: @@ -59,7 +54,7 @@ public TransitionConfig(OpenRocketDocument d, RocketComponent c) { Transition.Shape selected = ((Transition) component).getType(); Transition.Shape[] typeList = Transition.Shape.values(); - typeBox = new JComboBox(typeList); + typeBox = new JComboBox<Transition.Shape>(typeList); typeBox.setEditable(false); typeBox.setSelectedItem(selected); typeBox.addActionListener(new ActionListener() { @@ -72,108 +67,104 @@ public void actionPerformed(ActionEvent e) { } }); panel.add(typeBox, "span, split 2"); - - //// Clipped - checkbox = new JCheckBox(new BooleanModel(component, "Clipped")); - //// Clipped - checkbox.setText(trans.get("TransitionCfg.checkbox.Clipped")); - panel.add(checkbox, "wrap"); - - //// Shape parameter: - shapeLabel = new JLabel(trans.get("TransitionCfg.lbl.Shapeparam")); - panel.add(shapeLabel); - - m = new DoubleModel(component, "ShapeParameter"); - - shapeSpinner = new JSpinner(m.getSpinnerModel()); - shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner)); - panel.add(shapeSpinner, "growx"); - - DoubleModel min = new DoubleModel(component, "ShapeParameterMin"); - DoubleModel max = new DoubleModel(component, "ShapeParameterMax"); - shapeSlider = new BasicSlider(m.getSliderModel(min, max)); - panel.add(shapeSlider, "skip, w 100lp, wrap"); - - updateEnabled(); - + {//// Clipped + final JCheckBox checkbox = new JCheckBox(new BooleanModel(component, "Clipped")); + checkbox.setText(trans.get("TransitionCfg.checkbox.Clipped")); + panel.add(checkbox, "wrap"); - //// Length - //// Transition length: - panel.add(new JLabel(trans.get("TransitionCfg.lbl.Transitionlength"))); - - m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.3)), "w 100lp, wrap"); - + //// Shape parameter: + this.shapeLabel = new JLabel(trans.get("TransitionCfg.lbl.Shapeparam")); + panel.add(shapeLabel); + } - //// Transition diameter 1 - //// Fore diameter: - panel.add(new JLabel(trans.get("TransitionCfg.lbl.Forediam"))); - - DoubleModel od = new DoubleModel(component, "ForeRadius", 2, UnitGroup.UNITS_LENGTH, 0); - // Diameter = 2*Radius - - spin = new JSpinner(od.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(od), "growx"); - panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); - - checkbox = new JCheckBox(od.getAutomaticAction()); - //// Automatic - checkbox.setText(trans.get("TransitionCfg.checkbox.Automatic")); - panel.add(checkbox, "skip, span 2, wrap"); - + { + final DoubleModel shapeModel = new DoubleModel(component, "ShapeParameter"); - //// Transition diameter 2 - //// Aft diameter: - panel.add(new JLabel(trans.get("TransitionCfg.lbl.Aftdiam"))); - - od = new DoubleModel(component, "AftRadius", 2, UnitGroup.UNITS_LENGTH, 0); - // Diameter = 2*Radius - - spin = new JSpinner(od.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(od), "growx"); - panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); - - checkbox = new JCheckBox(od.getAutomaticAction()); - //// Automatic - checkbox.setText(trans.get("TransitionCfg.checkbox.Automatic")); - panel.add(checkbox, "skip, span 2, wrap"); - + this.shapeSpinner = new JSpinner(shapeModel.getSpinnerModel()); + shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner)); + panel.add(shapeSpinner, "growx"); - //// Wall thickness: - panel.add(new JLabel(trans.get("TransitionCfg.lbl.Wallthickness"))); - - m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); - - //// Filled - checkbox = new JCheckBox(new BooleanModel(component, "Filled")); - //// Filled - checkbox.setText(trans.get("TransitionCfg.checkbox.Filled")); - panel.add(checkbox, "skip, span 2, wrap"); - + DoubleModel min = new DoubleModel(component, "ShapeParameterMin"); + DoubleModel max = new DoubleModel(component, "ShapeParameterMax"); + this.shapeSlider = new BasicSlider(shapeModel.getSliderModel(min, max)); + panel.add(shapeSlider, "skip, w 100lp, wrap"); + + updateEnabled(); + } + + {/// Transition length: + + panel.add(new JLabel(trans.get("TransitionCfg.lbl.Transitionlength"))); + + final DoubleModel lengthModel = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); + + final JSpinner lengthSpinner = new JSpinner(lengthModel.getSpinnerModel()); + lengthSpinner.setEditor(new SpinnerEditor(lengthSpinner)); + panel.add(lengthSpinner, "growx"); + + panel.add(new UnitSelector(lengthModel), "growx"); + panel.add(new BasicSlider(lengthModel.getSliderModel(0, 0.05, 0.3)), "w 100lp, wrap"); + } + + { /// Fore diameter: + panel.add(new JLabel(trans.get("TransitionCfg.lbl.Forediam"))); + + // Diameter = 2*Radius + final DoubleModel foreRadiusModel = new DoubleModel(component, "ForeRadius", 2, UnitGroup.UNITS_LENGTH, 0); + + final JSpinner foreRadiusSpinner = new JSpinner(foreRadiusModel.getSpinnerModel()); + foreRadiusSpinner.setEditor(new SpinnerEditor(foreRadiusSpinner)); + panel.add(foreRadiusSpinner, "growx"); + + panel.add(new UnitSelector(foreRadiusModel), "growx"); + panel.add(new BasicSlider(foreRadiusModel.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); + final JCheckBox checkbox = new JCheckBox(foreRadiusModel.getAutomaticAction()); + //// Automatic + checkbox.setText(trans.get("TransitionCfg.checkbox.Automatic")); + panel.add(checkbox, "skip, span 2, wrap"); + } + + { //// Aft diameter: + panel.add(new JLabel(trans.get("TransitionCfg.lbl.Aftdiam"))); + + // Diameter = 2*Radius + final DoubleModel aftRadiusModel = new DoubleModel(component, "AftRadius", 2, UnitGroup.UNITS_LENGTH, 0); + + final JSpinner aftRadiusSpinner = new JSpinner(aftRadiusModel .getSpinnerModel()); + aftRadiusSpinner.setEditor(new SpinnerEditor(aftRadiusSpinner)); + panel.add(aftRadiusSpinner, "growx"); + + panel.add(new UnitSelector(aftRadiusModel), "growx"); + panel.add(new BasicSlider(aftRadiusModel.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); + + final JCheckBox aftRadiusCheckbox = new JCheckBox(aftRadiusModel.getAutomaticAction()); + //// Automatic + aftRadiusCheckbox.setText(trans.get("TransitionCfg.checkbox.Automatic")); + panel.add(aftRadiusCheckbox, "skip, span 2, wrap"); + } + + { /// Wall thickness: + panel.add(new JLabel(trans.get("TransitionCfg.lbl.Wallthickness"))); + + final DoubleModel thicknessModel = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); + + final JSpinner thicknessSpinner = new JSpinner(thicknessModel.getSpinnerModel()); + thicknessSpinner.setEditor(new SpinnerEditor(thicknessSpinner)); + panel.add(thicknessSpinner, "growx"); + + panel.add(new UnitSelector(thicknessModel), "growx"); + panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); + + //// Filled + final JCheckBox thicknessCheckbox = new JCheckBox(new BooleanModel(component, "Filled")); + //// Filled + thicknessCheckbox.setText(trans.get("TransitionCfg.checkbox.Filled")); + panel.add(thicknessCheckbox, "skip, span 2, wrap"); + } //// Description - JPanel panel2 = new JPanel(new MigLayout("ins 0")); description = new DescriptionArea(5); @@ -183,8 +174,6 @@ public void actionPerformed(ActionEvent e) { //// Material - - panel2.add(materialPanel(Material.Type.BULK), "span, wrap"); panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany"); diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java index a3611299bc..1035009c16 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TrapezoidFinSetConfig.java @@ -21,208 +21,193 @@ import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; public class TrapezoidFinSetConfig extends FinSetConfig { + private static final long serialVersionUID = -4870745241749769842L; private static final Translator trans = Application.getTranslator(); public TrapezoidFinSetConfig(OpenRocketDocument d, final RocketComponent component) { super(d, component); - - DoubleModel m; - JSpinner spin; - JComboBox combo; - + JPanel mainPanel = new JPanel(new MigLayout()); - - + + JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); - + //// Number of fins: JLabel label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Nbroffins")); //// The number of fins in the fin set. label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Nbroffins")); panel.add(label); - - IntegerModel im = new IntegerModel(component, "FinCount", 1, 8); - - spin = new JSpinner(im.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); + + final IntegerModel finCountModel = new IntegerModel(component, "FinCount", 1, 8); + + final JSpinner finCountSpinner = new JSpinner(finCountModel.getSpinnerModel()); + finCountSpinner.setEditor(new SpinnerEditor(finCountSpinner)); //// The number of fins in the fin set. - spin.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Nbroffins")); - panel.add(spin, "growx, wrap"); - - - //// Base rotation - //// Fin rotation: - label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Finrotation")); - //// The angle of the first fin in the fin set. - label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Finrotation")); - panel.add(label); - - m = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); - - - //// Fin cant: - label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Fincant")); - //// The angle that the fins are canted with respect to the rocket - label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Fincant")); - panel.add(label); - - m = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE, - -FinSet.MAX_CANT, FinSet.MAX_CANT); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(-FinSet.MAX_CANT, FinSet.MAX_CANT)), - "w 100lp, wrap"); - - - //// Root chord: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Rootchord"))); - - m = new DoubleModel(component, "RootChord", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); - - - - //// Tip chord: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Tipchord"))); - - m = new DoubleModel(component, "TipChord", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); - - - //// Height: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Height"))); - - m = new DoubleModel(component, "Height", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); - - - - //// Sweep length: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Sweeplength"))); - - m = new DoubleModel(component, "Sweep", UnitGroup.UNITS_LENGTH); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - - // sweep slider from -1.1*TipChord to 1.1*RootChord - DoubleModel tc = new DoubleModel(component, "TipChord", -1.1, UnitGroup.UNITS_LENGTH); - DoubleModel rc = new DoubleModel(component, "RootChord", 1.1, UnitGroup.UNITS_LENGTH); - panel.add(new BasicSlider(m.getSliderModel(tc, rc)), "w 100lp, wrap"); - - - //// Sweep angle: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Sweepangle"))); - - m = new DoubleModel(component, "SweepAngle", UnitGroup.UNITS_ANGLE, - -TrapezoidFinSet.MAX_SWEEP_ANGLE, TrapezoidFinSet.MAX_SWEEP_ANGLE); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(-Math.PI / 4, Math.PI / 4)), - "w 100lp, wrap paragraph"); - - - //// Position - //// Position relative to: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Posrelativeto"))); - - combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); - //// plus - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.plus")), "right"); - - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel( - new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), - new DoubleModel(component.getParent(), "Length"))), - "w 100lp, wrap para"); - + finCountSpinner.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Nbroffins")); + panel.add(finCountSpinner, "growx, wrap"); - - - - mainPanel.add(panel, "aligny 20%"); - - mainPanel.add(new JSeparator(SwingConstants.VERTICAL), "growy"); - + + { /// Base rotation + label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Finrotation")); + //// The angle of the first fin in the fin set. + label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Finrotation")); + panel.add(label); + + final DoubleModel baseRotationModel = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE); + + final JSpinner baseRotationSpinner = new JSpinner(baseRotationModel.getSpinnerModel()); + baseRotationSpinner.setEditor(new SpinnerEditor(baseRotationSpinner)); + panel.add(baseRotationSpinner, "growx"); + + panel.add(new UnitSelector(baseRotationModel), "growx"); + panel.add(new BasicSlider(baseRotationModel.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap"); + } + + {//// Fin cant: + label = new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Fincant")); + //// The angle that the fins are canted with respect to the rocket + label.setToolTipText(trans.get("TrapezoidFinSetCfg.lbl.ttip.Fincant")); + panel.add(label); + + final DoubleModel cantModel = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE, -FinSet.MAX_CANT, FinSet.MAX_CANT); + + final JSpinner cantSpinner = new JSpinner(cantModel.getSpinnerModel()); + cantSpinner.setEditor(new SpinnerEditor(cantSpinner)); + panel.add(cantSpinner, "growx"); + + panel.add(new UnitSelector(cantModel), "growx"); + panel.add(new BasicSlider(cantModel.getSliderModel(-FinSet.MAX_CANT, FinSet.MAX_CANT)), + "w 100lp, wrap"); + } + + {//// Root chord: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Rootchord"))); + + final DoubleModel rootChordModel = new DoubleModel(component, "RootChord", UnitGroup.UNITS_LENGTH, 0); + + final JSpinner rootChordSpinner = new JSpinner(rootChordModel.getSpinnerModel()); + rootChordSpinner.setEditor(new SpinnerEditor(rootChordSpinner)); + panel.add(rootChordSpinner, "growx"); + + panel.add(new UnitSelector(rootChordModel), "growx"); + panel.add(new BasicSlider(rootChordModel.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); + } + + {//// Tip chord: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Tipchord"))); + + final DoubleModel tipChordModel = new DoubleModel(component, "TipChord", UnitGroup.UNITS_LENGTH, 0); + + final JSpinner tipChordSpinner = new JSpinner(tipChordModel.getSpinnerModel()); + tipChordSpinner.setEditor(new SpinnerEditor(tipChordSpinner)); + panel.add(tipChordSpinner, "growx"); + + panel.add(new UnitSelector(tipChordModel), "growx"); + panel.add(new BasicSlider(tipChordModel.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); + } + + {//// Height: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Height"))); + + final DoubleModel heightModel = new DoubleModel(component, "Height", UnitGroup.UNITS_LENGTH, 0); + + final JSpinner heightSpinner = new JSpinner(heightModel.getSpinnerModel()); + heightSpinner.setEditor(new SpinnerEditor(heightSpinner)); + panel.add(heightSpinner, "growx"); + + panel.add(new UnitSelector(heightModel), "growx"); + panel.add(new BasicSlider(heightModel.getSliderModel(0, 0.05, 0.2)), "w 100lp, wrap"); + } + + {//// Sweep length: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Sweeplength"))); + + final DoubleModel sweepDistanceModel = new DoubleModel(component, "Sweep", UnitGroup.UNITS_LENGTH); + component.addChangeListener(sweepDistanceModel); + final JSpinner sweepDistanceSpinner = new JSpinner(sweepDistanceModel.getSpinnerModel()); + sweepDistanceSpinner.setEditor(new SpinnerEditor(sweepDistanceSpinner)); + panel.add(sweepDistanceSpinner, "growx"); + + panel.add(new UnitSelector(sweepDistanceModel), "growx"); + + // sweep slider from -1.1*TipChord to 1.1*RootChord + DoubleModel tc = new DoubleModel(component, "TipChord", -1.1, UnitGroup.UNITS_LENGTH); + DoubleModel rc = new DoubleModel(component, "RootChord", 1.1, UnitGroup.UNITS_LENGTH); + panel.add(new BasicSlider(sweepDistanceModel.getSliderModel(tc, rc)), "w 100lp, wrap"); + } + + {//// Sweep angle: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Sweepangle"))); + + final DoubleModel sweepAngleModel = new DoubleModel(component, "SweepAngle", UnitGroup.UNITS_ANGLE, + -TrapezoidFinSet.MAX_SWEEP_ANGLE, TrapezoidFinSet.MAX_SWEEP_ANGLE); + component.addChangeListener(sweepAngleModel); + + final JSpinner sweepAngleSpinner = new JSpinner(sweepAngleModel.getSpinnerModel()); + sweepAngleSpinner.setEditor(new SpinnerEditor(sweepAngleSpinner)); + panel.add(sweepAngleSpinner, "growx"); + + panel.add(new UnitSelector(sweepAngleModel), "growx"); + panel.add(new BasicSlider(sweepAngleModel.getSliderModel(-Math.PI / 4, Math.PI / 4)), + "w 100lp, wrap paragraph"); + } + + {//// Position relative to: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Posrelativeto"))); + + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods); + final JComboBox<AxialMethod> positionCombo = new JComboBox<AxialMethod>(methodModel); + + panel.add(positionCombo, "spanx, growx, wrap"); + //// plus + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.plus")), "right"); + + final DoubleModel axialOffsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); + final JSpinner axialOffsetSpinner = new JSpinner(axialOffsetModel.getSpinnerModel()); + axialOffsetSpinner.setEditor(new SpinnerEditor(axialOffsetSpinner)); + panel.add(axialOffsetSpinner, "growx"); + + panel.add(new UnitSelector(axialOffsetModel), "growx"); + panel.add(new BasicSlider(axialOffsetModel.getSliderModel( + new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), + new DoubleModel(component.getParent(), "Length"))), + "w 100lp, wrap para"); + + + mainPanel.add(panel, "aligny 20%"); + + mainPanel.add(new JSeparator(SwingConstants.VERTICAL), "growy"); + } panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", "")); - - - - //// Fin cross section: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.FincrossSection"))); - combo = new JComboBox( - new EnumModel<FinSet.CrossSection>(component, "CrossSection")); - panel.add(combo, "span, growx, wrap"); - - - //// Thickness: - panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Thickness"))); - - m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); - - spin = new JSpinner(m.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - panel.add(spin, "growx"); - - panel.add(new UnitSelector(m), "growx"); - panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap para"); - + + + {//// Fin cross section: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.FincrossSection"))); + JComboBox<FinSet.CrossSection> sectionCombo = new JComboBox<FinSet.CrossSection>( + new EnumModel<FinSet.CrossSection>(component, "CrossSection")); + panel.add(sectionCombo, "span, growx, wrap"); + + + //// Thickness: + panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Thickness"))); + + final DoubleModel thicknessModel = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); + + final JSpinner thicknessSpinner = new JSpinner(thicknessModel.getSpinnerModel()); + thicknessSpinner.setEditor(new SpinnerEditor(thicknessSpinner)); + panel.add(thicknessSpinner, "growx"); + + panel.add(new UnitSelector(thicknessModel), "growx"); + panel.add(new BasicSlider(thicknessModel.getSliderModel(0, 0.01)), "w 100lp, wrap para"); + } //// Material diff --git a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java index bf12fb16fe..f036ca4526 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/TubeFinSetConfig.java @@ -18,12 +18,12 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; public class TubeFinSetConfig extends RocketComponentConfig { - - private MotorConfig motorConfigPane = null; + private static final long serialVersionUID = 508482875624928676L; private static final Translator trans = Application.getTranslator(); public TubeFinSetConfig(OpenRocketDocument d, RocketComponent c) { @@ -125,20 +125,14 @@ public TubeFinSetConfig(OpenRocketDocument d, RocketComponent c) { //// Position relative to: panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto"))); - JComboBox combo = new JComboBox( - new EnumModel<RocketComponent.Position>(component, "RelativePosition", - new RocketComponent.Position[] { - RocketComponent.Position.TOP, - RocketComponent.Position.MIDDLE, - RocketComponent.Position.BOTTOM, - RocketComponent.Position.ABSOLUTE - })); - panel.add(combo, "spanx, growx, wrap"); + final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ); + final JComboBox<AxialMethod> methodCombo = new JComboBox<AxialMethod>( methodModel ); + panel.add(methodCombo, "spanx, growx, wrap"); //// plus panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.plus")), "right"); - m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH); + m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); diff --git a/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionDialog.java b/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionDialog.java index 30970e7e8a..967a1afd98 100644 --- a/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionDialog.java +++ b/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionDialog.java @@ -10,12 +10,10 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +@SuppressWarnings("serial") public class CustomExpressionDialog extends JDialog { private static final Translator trans = Application.getTranslator(); - private static final Logger log = LoggerFactory.getLogger(CustomExpressionDialog.class); @SuppressWarnings("unused") private final Window parentWindow; diff --git a/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java b/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java index 18cd5e9884..4cb2e8d43e 100644 --- a/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java +++ b/swing/src/net/sf/openrocket/gui/customexpression/CustomExpressionPanel.java @@ -32,6 +32,7 @@ import net.sf.openrocket.simulation.customexpression.CustomExpression; import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public class CustomExpressionPanel extends JPanel { private static final Logger log = LoggerFactory.getLogger(CustomExpressionPanel.class); diff --git a/swing/src/net/sf/openrocket/gui/customexpression/OperatorSelector.java b/swing/src/net/sf/openrocket/gui/customexpression/OperatorSelector.java index 8ccdcd4fd7..b7ce59bf5b 100644 --- a/swing/src/net/sf/openrocket/gui/customexpression/OperatorSelector.java +++ b/swing/src/net/sf/openrocket/gui/customexpression/OperatorSelector.java @@ -29,6 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@SuppressWarnings("serial") public class OperatorSelector extends JDialog { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/customexpression/VariableSelector.java b/swing/src/net/sf/openrocket/gui/customexpression/VariableSelector.java index 833427eb43..67b051dac2 100644 --- a/swing/src/net/sf/openrocket/gui/customexpression/VariableSelector.java +++ b/swing/src/net/sf/openrocket/gui/customexpression/VariableSelector.java @@ -34,6 +34,7 @@ * */ +@SuppressWarnings("serial") public class VariableSelector extends JDialog { private static final Translator trans = Application.getTranslator(); @@ -43,6 +44,7 @@ public class VariableSelector extends JDialog { private final VariableTableModel tableModel; private final ExpressionBuilderDialog parentBuilder; + @SuppressWarnings("serial") public VariableSelector(Window parent, final ExpressionBuilderDialog parentBuilder, final OpenRocketDocument doc){ super(parent, trans.get("CustomVariableSelector.title"), JDialog.ModalityType.DOCUMENT_MODAL); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java index d5e9e4ff0b..a74ea82e63 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/AboutDialog.java @@ -21,6 +21,7 @@ import net.sf.openrocket.util.BuildProperties; import net.sf.openrocket.util.Chars; +@SuppressWarnings("serial") public class AboutDialog extends JDialog { public static final String OPENROCKET_URL = "http://openrocket.sourceforge.net/"; diff --git a/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java index c895c88ded..59601bc095 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/BugReportDialog.java @@ -42,6 +42,7 @@ import com.jogamp.opengl.JoglVersion; +@SuppressWarnings("serial") public class BugReportDialog extends JDialog { private static final String REPORT_EMAIL = "openrocket-bugs@lists.sourceforge.net"; diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java index 5f2d90b3a6..d6b90b6baa 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java @@ -46,19 +46,19 @@ import net.sf.openrocket.gui.adaptors.ColumnTable; import net.sf.openrocket.gui.adaptors.ColumnTableModel; import net.sf.openrocket.gui.adaptors.DoubleModel; -import net.sf.openrocket.gui.adaptors.FlightConfigurationModel; import net.sf.openrocket.gui.components.BasicSlider; +import net.sf.openrocket.gui.components.ConfigurationComboBox; import net.sf.openrocket.gui.components.StageSelector; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.scalefigure.RocketPanel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -69,49 +69,48 @@ import net.sf.openrocket.util.StateChangeListener; public class ComponentAnalysisDialog extends JDialog implements StateChangeListener { - + private static final long serialVersionUID = 9131240570600307935L; private static ComponentAnalysisDialog singletonDialog = null; private static final Translator trans = Application.getTranslator(); - - + + private final FlightConditions conditions; - private final Configuration configuration; + private final Rocket rkt; private final DoubleModel theta, aoa, mach, roll; private final JToggleButton worstToggle; private boolean fakeChange = false; private AerodynamicCalculator aerodynamicCalculator; - private final MassCalculator massCalculator = new BasicMassCalculator(); - + private final MassCalculator massCalculator = new MassCalculator(); + private final ColumnTableModel cpTableModel; private final ColumnTableModel dragTableModel; private final ColumnTableModel rollTableModel; - - private final JList warningList; - - - private final List<AerodynamicForces> cpData = new ArrayList<AerodynamicForces>(); - private final List<Coordinate> cgData = new ArrayList<Coordinate>(); + + private final JList<Object> warningList; + + + private final List<Object[]> cgData = new ArrayList<Object[]>(); private final List<AerodynamicForces> dragData = new ArrayList<AerodynamicForces>(); private double totalCD = 0; private final List<AerodynamicForces> rollData = new ArrayList<AerodynamicForces>(); - - + + public ComponentAnalysisDialog(final RocketPanel rocketPanel) { ////Component analysis super(SwingUtilities.getWindowAncestor(rocketPanel), trans.get("componentanalysisdlg.componentanalysis")); - + JTable table; - - JPanel panel = new JPanel(new MigLayout("fill", "[][35lp::][fill][fill]")); + + JPanel panel = new JPanel(new MigLayout("fill")); add(panel); - - this.configuration = rocketPanel.getConfiguration(); + + rkt = rocketPanel.getDocument().getRocket(); this.aerodynamicCalculator = rocketPanel.getAerodynamicCalculator().newInstance(); - - - conditions = new FlightConditions(configuration); - + + + conditions = new FlightConditions(rkt.getSelectedConfiguration()); + rocketPanel.setCPAOA(0); aoa = new DoubleModel(rocketPanel, "CPAOA", UnitGroup.UNITS_ANGLE, 0, Math.PI); rocketPanel.setCPMach(Application.getPreferences().getDefaultMach()); @@ -120,7 +119,7 @@ public ComponentAnalysisDialog(final RocketPanel rocketPanel) { theta = new DoubleModel(rocketPanel, "CPTheta", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI); rocketPanel.setCPRoll(0); roll = new DoubleModel(rocketPanel, "CPRoll", UnitGroup.UNITS_ROLL); - + //// Wind direction: panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.winddir")), "width 120lp!"); panel.add(new UnitSelector(theta, true), "width 50lp!"); @@ -143,58 +142,58 @@ public void stateChanged(ChangeEvent e) { } }); panel.add(worstToggle, ""); - - - warningList = new JList(); + + + warningList = new JList<>(); JScrollPane scrollPane = new JScrollPane(warningList); ////Warnings: scrollPane.setBorder(BorderFactory.createTitledBorder(trans.get("componentanalysisdlg.TitledBorder.warnings"))); panel.add(scrollPane, "gap paragraph, spany 4, width 300lp!, growy 1, height :100lp:, wrap"); - + ////Angle of attack: panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.angleofattack")), "width 120lp!"); panel.add(new UnitSelector(aoa, true), "width 50lp!"); panel.add(new BasicSlider(aoa.getSliderModel(0, Math.PI)), "growx, wrap"); - + //// Mach number: panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.machnumber")), "width 120lp!"); panel.add(new UnitSelector(mach, true), "width 50lp!"); panel.add(new BasicSlider(mach.getSliderModel(0, 3)), "growx, wrap"); - + //// Roll rate: panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.rollrate")), "width 120lp!"); panel.add(new UnitSelector(roll, true), "width 50lp!"); panel.add(new BasicSlider(roll.getSliderModel(-20 * 2 * Math.PI, 20 * 2 * Math.PI)), - "growx, wrap paragraph"); - - + "growx, wrap"); + // Stage and motor selection: //// Active stages: panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.activestages")), "spanx, split, gapafter rel"); - panel.add(new StageSelector(configuration), "gapafter paragraph"); - + panel.add(new StageSelector( rkt), "gapafter paragraph"); + //// Motor configuration: JLabel label = new JLabel(trans.get("componentanalysisdlg.lbl.motorconf")); label.setHorizontalAlignment(JLabel.RIGHT); panel.add(label, "growx, right"); - panel.add(new JComboBox(new FlightConfigurationModel(configuration)), "wrap"); - - - + + final ConfigurationComboBox configComboBox = new ConfigurationComboBox(rkt); + panel.add( configComboBox, "wrap"); + + // Tabbed pane - + JTabbedPane tabbedPane = new JTabbedPane(); panel.add(tabbedPane, "spanx, growx, growy"); - - + + // Create the CP data table cpTableModel = new ColumnTableModel( - + //// Component new Column(trans.get("componentanalysisdlg.TabStability.Col.Component")) { @Override public Object getValueAt(int row) { - RocketComponent c = cpData.get(row).getComponent(); + Object c = cgData.get(row)[0]; if (c instanceof Rocket) { return trans.get("componentanalysisdlg.TOTAL"); } @@ -211,7 +210,11 @@ public int getDefaultWidth() { @Override public Object getValueAt(int row) { - return unit.toString(cgData.get(row).x); + Coordinate cg = (Coordinate) cgData.get(row)[1]; + if ( cg == null ) { + return null; + } + return unit.toString(cg.x); } }, new Column(trans.get("componentanalysisdlg.TabStability.Col.Mass") + " / " + UnitGroup.UNITS_MASS.getDefaultUnit().getUnit()) { @@ -219,7 +222,11 @@ public Object getValueAt(int row) { @Override public Object getValueAt(int row) { - return unit.toString(cgData.get(row).weight); + Coordinate cg = (Coordinate) cgData.get(row)[1]; + if ( cg == null ) { + return null; + } + return unit.toString(cg.weight); } }, new Column(trans.get("componentanalysisdlg.TabStability.Col.CP") + " / " + UnitGroup.UNITS_LENGTH.getDefaultUnit().getUnit()) { @@ -227,42 +234,56 @@ public Object getValueAt(int row) { @Override public Object getValueAt(int row) { - return unit.toString(cpData.get(row).getCP().x); + AerodynamicForces forces = (AerodynamicForces) cgData.get(row)[2]; + if ( forces == null ) { + return null; + } + return unit.toString(forces.getCP().x); } }, new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") { @Override public Object getValueAt(int row) { - return NOUNIT.toString(cpData.get(row).getCP().weight); + AerodynamicForces forces = (AerodynamicForces) cgData.get(row)[2]; + if ( forces == null ) { + return null; + } + return NOUNIT.toString(forces.getCP().weight); } } - + ) { - @Override - public int getRowCount() { - return cpData.size(); - } - }; - + /** + * + */ + private static final long serialVersionUID = 1L; + + + @Override + public int getRowCount() { + return cgData.size(); + } + }; + table = new ColumnTable(cpTableModel); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setSelectionBackground(Color.LIGHT_GRAY); table.setSelectionForeground(Color.BLACK); cpTableModel.setColumnWidths(table.getColumnModel()); - + table.setDefaultRenderer(Object.class, new CustomCellRenderer()); // table.setShowHorizontalLines(false); // table.setShowVerticalLines(true); - + JScrollPane scrollpane = new JScrollPane(table); scrollpane.setPreferredSize(new Dimension(600, 200)); - + //// Stability and Stability information tabbedPane.addTab(trans.get("componentanalysisdlg.TabStability"), null, scrollpane, trans.get("componentanalysisdlg.TabStability.ttip")); - - - + + + // Create the drag data table dragTableModel = new ColumnTableModel( //// Component @@ -275,7 +296,7 @@ public Object getValueAt(int row) { } return c.toString(); } - + @Override public int getDefaultWidth() { return 200; @@ -310,33 +331,38 @@ public Object getValueAt(int row) { } } ) { - @Override - public int getRowCount() { - return dragData.size(); - } - }; - - + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public int getRowCount() { + return dragData.size(); + } + }; + + table = new JTable(dragTableModel); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setSelectionBackground(Color.LIGHT_GRAY); table.setSelectionForeground(Color.BLACK); dragTableModel.setColumnWidths(table.getColumnModel()); - + table.setDefaultRenderer(Object.class, new DragCellRenderer(new Color(0.5f, 1.0f, 0.5f))); // table.setShowHorizontalLines(false); // table.setShowVerticalLines(true); - + scrollpane = new JScrollPane(table); scrollpane.setPreferredSize(new Dimension(600, 200)); - + //// Drag characteristics and Drag characteristics tooltip tabbedPane.addTab(trans.get("componentanalysisdlg.dragTabchar"), null, scrollpane, trans.get("componentanalysisdlg.dragTabchar.ttip")); - - - - + + + + // Create the roll data table rollTableModel = new ColumnTableModel( //// Component @@ -372,40 +398,44 @@ public Object getValueAt(int row) { } } ) { - @Override - public int getRowCount() { - return rollData.size(); - } - }; - - + /** + * + */ + private static final long serialVersionUID = 1L; + + @Override + public int getRowCount() { + return rollData.size(); + } + }; + + table = new JTable(rollTableModel); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setSelectionBackground(Color.LIGHT_GRAY); table.setSelectionForeground(Color.BLACK); - rollTableModel.setColumnWidths(table.getColumnModel()); - + table.setDefaultRenderer(Object.class, new CustomCellRenderer()); + scrollpane = new JScrollPane(table); scrollpane.setPreferredSize(new Dimension(600, 200)); - + //// Roll dynamics and Roll dynamics tooltip tabbedPane.addTab(trans.get("componentanalysisdlg.rollTableModel"), null, scrollpane, trans.get("componentanalysisdlg.rollTableModel.ttip")); - - - - - + + + + + // Add the data updater to listen to changes in aoa and theta mach.addChangeListener(this); theta.addChangeListener(this); aoa.addChangeListener(this); roll.addChangeListener(this); - configuration.addChangeListener(this); this.stateChanged(null); - - - + + + // Remove listeners when closing window this.addWindowListener(new WindowAdapter() { @Override @@ -415,7 +445,6 @@ public void windowClosed(WindowEvent e) { aoa.removeChangeListener(ComponentAnalysisDialog.this); mach.removeChangeListener(ComponentAnalysisDialog.this); roll.removeChangeListener(ComponentAnalysisDialog.this); - configuration.removeChangeListener(ComponentAnalysisDialog.this); //System.out.println("SETTING NAN VALUES"); rocketPanel.setCPAOA(Double.NaN); rocketPanel.setCPTheta(Double.NaN); @@ -424,7 +453,7 @@ public void windowClosed(WindowEvent e) { singletonDialog = null; } }); - + //// Reference length: panel.add(new StyledLabel(trans.get("componentanalysisdlg.lbl.reflenght"), -1), "span, split, gapleft para, gapright rel"); @@ -432,19 +461,19 @@ public void windowClosed(WindowEvent e) { UnitSelector sel = new UnitSelector(dm, true); sel.resizeFont(-1); panel.add(sel, "gapright para"); - + //// Reference area: panel.add(new StyledLabel(trans.get("componentanalysisdlg.lbl.refarea"), -1), "gapright rel"); dm = new DoubleModel(conditions, "RefArea", UnitGroup.UNITS_AREA); sel = new UnitSelector(dm, true); sel.resizeFont(-1); panel.add(sel, "wrap"); - - - + + + // Buttons JButton button; - + // TODO: LOW: printing // button = new JButton("Print"); // button.addActionListener(new ActionListener() { @@ -459,7 +488,7 @@ public void windowClosed(WindowEvent e) { // } // }); // panel.add(button,"tag ok"); - + //button = new JButton("Close"); //Close button button = new JButton(trans.get("dlg.but.close")); @@ -469,23 +498,24 @@ public void actionPerformed(ActionEvent e) { ComponentAnalysisDialog.this.dispose(); } }); - panel.add(button, "span, split, tag cancel"); - - + panel.add(button, "span, tag cancel"); + + this.setLocationByPlatform(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); pack(); - + GUIUtil.setDisposableDialogOptions(this, null); } - - - + + + /** * Updates the data in the table and fires a table data change event. */ @Override public void stateChanged(EventObject e) { + final FlightConfiguration configuration = rkt.getSelectedConfiguration(); AerodynamicForces forces; WarningSet set = new WarningSet(); conditions.setAOA(aoa.getValue()); @@ -493,7 +523,7 @@ public void stateChanged(EventObject e) { conditions.setMach(mach.getValue()); conditions.setRollRate(roll.getValue()); conditions.setReference(configuration); - + if (worstToggle.isSelected()) { aerodynamicCalculator.getWorstCP(configuration, conditions, null); if (!MathUtil.equals(conditions.getTheta(), theta.getValue())) { @@ -503,27 +533,35 @@ public void stateChanged(EventObject e) { return; } } - + Map<RocketComponent, AerodynamicForces> aeroData = aerodynamicCalculator.getForceAnalysis(configuration, conditions, set); Map<RocketComponent, Coordinate> massData = - massCalculator.getCGAnalysis(configuration, MassCalcType.LAUNCH_MASS); - - - cpData.clear(); + massCalculator.getCGAnalysis(configuration); + + cgData.clear(); dragData.clear(); rollData.clear(); - for (RocketComponent c : configuration) { - forces = aeroData.get(c); + for (RocketComponent c : configuration.getActiveComponents()) { + if ( c instanceof AxialStage ) { + continue; + } + Object[] data = new Object[3]; + cgData.add(data); + data[0] = c; + Coordinate cg = massData.get(c); + data[1] = cg; - if (forces == null) + forces = aeroData.get(c); + if (forces == null) { continue; + } if (forces.getCP() != null) { - cpData.add(forces); - cgData.add(cg); + data[2] = forces; } + if (!Double.isNaN(forces.getCD())) { dragData.add(forces); } @@ -531,17 +569,30 @@ public void stateChanged(EventObject e) { rollData.add(forces); } } - forces = aeroData.get(configuration.getRocket()); + + for ( MotorConfiguration motorConfig : configuration.getActiveMotors()) { + + Object [] data = new Object[3]; + cgData.add(data); + + data[0] = motorConfig.getMotor().getDesignation(); + data[1] = motorConfig.getMotor().getLaunchMass(); + } + + forces = aeroData.get(rkt); if (forces != null) { - cpData.add(forces); - cgData.add(massData.get(configuration.getRocket())); + Object[] data = new Object[3]; + cgData.add(data); + data[0] = rkt; + data[1] = massData.get(rkt); + data[2] = forces; dragData.add(forces); rollData.add(forces); totalCD = forces.getCD(); } else { totalCD = 0; } - + // Set warnings if (set.isEmpty()) { warningList.setListData(new String[] { @@ -550,33 +601,37 @@ public void stateChanged(EventObject e) { } else { warningList.setListData(new Vector<Warning>(set)); } - + cpTableModel.fireTableDataChanged(); dragTableModel.fireTableDataChanged(); rollTableModel.fireTableDataChanged(); } - - + + private class CustomCellRenderer extends JLabel implements TableCellRenderer { + /** + * + */ + private static final long serialVersionUID = 1L; private final Font normalFont; private final Font boldFont; - + public CustomCellRenderer() { super(); normalFont = getFont(); boldFont = normalFont.deriveFont(Font.BOLD); } - + @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - - this.setText(value.toString()); - - if ((row < 0) || (row >= cpData.size())) + + this.setText(value == null ? null : value.toString()); + + if ((row < 0) || (row >= cgData.size())) return this; - - if (cpData.get(row).getComponent() instanceof Rocket) { + + if (cgData.get(row)[0] instanceof Rocket) { this.setFont(boldFont); } else { this.setFont(normalFont); @@ -584,52 +639,56 @@ public Component getTableCellRendererComponent(JTable table, Object value, return this; } } - - - + + + private class DragCellRenderer extends JLabel implements TableCellRenderer { + /** + * + */ + private static final long serialVersionUID = 1L; private final Font normalFont; private final Font boldFont; - - + + public DragCellRenderer(Color baseColor) { super(); normalFont = getFont(); boldFont = normalFont.deriveFont(Font.BOLD); } - + @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - + if (value instanceof Double) { - + // A drag coefficient double cd = (Double) value; this.setText(String.format("%.2f (%.0f%%)", cd, 100 * cd / totalCD)); - + float r = (float) (cd / 1.5); - + float hue = MathUtil.clamp(0.3333f * (1 - 2.0f * r), 0, 0.3333f); float sat = MathUtil.clamp(0.8f * r + 0.1f * (1 - r), 0, 1); float val = 1.0f; - + this.setBackground(Color.getHSBColor(hue, sat, val)); this.setOpaque(true); this.setHorizontalAlignment(SwingConstants.CENTER); - + } else { - + // Other this.setText(value.toString()); this.setOpaque(false); this.setHorizontalAlignment(SwingConstants.LEFT); - + } - + if ((row < 0) || (row >= dragData.size())) return this; - + if ((dragData.get(row).getComponent() instanceof Rocket) || (column == 4)) { this.setFont(boldFont); } else { @@ -638,20 +697,20 @@ public Component getTableCellRendererComponent(JTable table, Object value, return this; } } - - + + ///////// Singleton implementation - + public static void showDialog(RocketPanel rocketpanel) { if (singletonDialog != null) singletonDialog.dispose(); singletonDialog = new ComponentAnalysisDialog(rocketpanel); singletonDialog.setVisible(true); } - + public static void hideDialog() { if (singletonDialog != null) singletonDialog.dispose(); } - + } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java index c90f299401..065956619b 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/CustomMaterialDialog.java @@ -25,13 +25,14 @@ import net.sf.openrocket.material.Material; import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public class CustomMaterialDialog extends JDialog { private static final Translator trans = Application.getTranslator(); private final Material originalMaterial; private boolean okClicked = false; - private JComboBox typeBox; + private JComboBox<Material.Type> typeBox; private JTextField nameField; private DoubleModel density; private JSpinner densitySpinner; @@ -76,7 +77,7 @@ public CustomMaterialDialog(Window parent, Material material, boolean saveOption // Material type (if not known) panel.add(new JLabel(trans.get("custmatdlg.lbl.Materialtype"))); if (material == null) { - typeBox = new JComboBox(Material.Type.values()); + typeBox = new JComboBox<Material.Type>(Material.Type.values()); typeBox.setSelectedItem(Material.Type.BULK); typeBox.setEditable(false); typeBox.addActionListener(new ActionListener() { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java index b39d683bbc..6ee7a95bc7 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/DebugLogDialog.java @@ -38,6 +38,9 @@ import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.adaptors.Column; import net.sf.openrocket.gui.adaptors.ColumnTable; @@ -56,9 +59,7 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.NumericComparator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +@SuppressWarnings("serial") public class DebugLogDialog extends JDialog { private static final Logger log = LoggerFactory.getLogger(DebugLogDialog.class); @@ -95,7 +96,8 @@ public class DebugLogDialog extends JDialog { private final JCheckBox followBox; private final Timer timer; - + private final JSplitPane split; + private final JPanel bottomPanel; private final JTable table; private final ColumnTableModel model; private final TableRowSorter<TableModel> sorter; @@ -133,20 +135,18 @@ public DebugLogDialog(Window parent) { // Create the UI - JPanel mainPanel = new JPanel(new MigLayout("fill")); - this.add(mainPanel); + this.setLayout( new MigLayout("fill")); - - JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + split = new JSplitPane(JSplitPane.VERTICAL_SPLIT); split.setDividerLocation(0.7); - mainPanel.add(split, "grow"); + this.add(split, "grow, pushy 200, growprioy 200"); // Top panel - JPanel panel = new JPanel(new MigLayout("fill")); - split.add(panel); + JPanel topPanel = new JPanel(new MigLayout("fill")); + split.add(topPanel); //// Display log lines: - panel.add(new JLabel(trans.get("debuglogdlg.Displayloglines")), "gapright para, split"); + topPanel.add(new JLabel(trans.get("debuglogdlg.Displayloglines")), "gapright para, split"); for (LogLevel l : LogLevel.values()) { JCheckBox box = new JCheckBox(l.toString()); // By default display DEBUG and above @@ -157,14 +157,26 @@ public void actionPerformed(ActionEvent e) { sorter.setRowFilter(new LogFilter()); } }); - panel.add(box, "gapright unrel"); + topPanel.add(box, "gapright unrel"); filterButtons.put(l, box); } - + + //// Toggle Bottom Details Pane + JCheckBox toggleDetailsBox = new JCheckBox(trans.get("debuglogdlg.ToggleDetails")); + toggleDetailsBox.setSelected(true); + topPanel.add(toggleDetailsBox, "gapright unrel"); + toggleDetailsBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + boolean isActive = ((JCheckBox)e.getSource()).isSelected(); + enableDetailsPanel( isActive); + } + }); + //// Follow followBox = new JCheckBox(trans.get("debuglogdlg.Follow")); followBox.setSelected(true); - panel.add(followBox, "skip, gapright para, right"); + topPanel.add(followBox, "skip, gapright para, right"); //// Clear button JButton clear = new JButton(trans.get("debuglogdlg.but.clear")); @@ -177,7 +189,7 @@ public void actionPerformed(ActionEvent e) { model.fireTableDataChanged(); } }); - panel.add(clear, "right, wrap"); + topPanel.add(clear, "right, wrap"); @@ -293,45 +305,45 @@ public void valueChanged(ListSelectionEvent e) { sorter.setRowFilter(new LogFilter()); - panel.add(new JScrollPane(table), "span, grow, width " + + topPanel.add(new JScrollPane(table), "span, grow, width " + (Toolkit.getDefaultToolkit().getScreenSize().width * 8 / 10) + - "px, height 400px"); + "px, height 400px, growy, pushy 200, growprioy 200"); - panel = new JPanel(new MigLayout("fill")); - split.add(panel); + bottomPanel = new JPanel(new MigLayout("fill")); + split.add(bottomPanel); //// Log line number: - panel.add(new JLabel(trans.get("debuglogdlg.lbl.Loglinenbr")), "split, gapright rel"); + bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Loglinenbr")), "split, gapright rel"); numberLabel = new SelectableLabel(); - panel.add(numberLabel, "width 70lp, gapright para"); + bottomPanel.add(numberLabel, "width 70lp, gapright para"); //// Time: - panel.add(new JLabel(trans.get("debuglogdlg.lbl.Time")), "split, gapright rel"); + bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Time")), "split, gapright rel"); timeLabel = new SelectableLabel(); - panel.add(timeLabel, "width 70lp, gapright para"); + bottomPanel.add(timeLabel, "width 70lp, gapright para"); //// Level: - panel.add(new JLabel(trans.get("debuglogdlg.lbl.Level")), "split, gapright rel"); + bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Level")), "split, gapright rel"); levelLabel = new SelectableLabel(); - panel.add(levelLabel, "width 70lp, gapright para"); + bottomPanel.add(levelLabel, "width 70lp, gapright para"); //// Location: - panel.add(new JLabel(trans.get("debuglogdlg.lbl.Location")), "split, gapright rel"); + bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Location")), "split, gapright rel"); locationLabel = new SelectableLabel(); - panel.add(locationLabel, "growx, wrap unrel"); + bottomPanel.add(locationLabel, "growx, wrap unrel"); //// Log message: - panel.add(new JLabel(trans.get("debuglogdlg.lbl.Logmessage")), "split, gapright rel"); + bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Logmessage")), "split, gapright rel"); messageLabel = new SelectableLabel(); - panel.add(messageLabel, "growx, wrap para"); + bottomPanel.add(messageLabel, "growx, wrap para"); //// Stack trace: - panel.add(new JLabel(trans.get("debuglogdlg.lbl.Stacktrace")), "wrap rel"); + bottomPanel.add(new JLabel(trans.get("debuglogdlg.lbl.Stacktrace")), "wrap rel"); stackTraceLabel = new JTextArea(8, 80); stackTraceLabel.setEditable(false); GUIUtil.changeFontSize(stackTraceLabel, -2); - panel.add(new JScrollPane(stackTraceLabel), "grow"); + bottomPanel.add(new JScrollPane(stackTraceLabel), "grow, pushy 200, growprioy 200"); //Close button @@ -342,7 +354,7 @@ public void actionPerformed(ActionEvent e) { DebugLogDialog.this.dispose(); } }); - mainPanel.add(close, "newline para, right, tag ok"); + this.add(close, "newline para, right, tag ok"); // Use timer to purge the queue so as not to overwhelm the EDT with events @@ -442,6 +454,17 @@ public void run() { } } } + + private void enableDetailsPanel(final boolean isActive){ + bottomPanel.setEnabled(isActive); + if(isActive){ + split.setDividerLocation(0.5); + split.setBottomComponent(bottomPanel); + }else { + split.setBottomComponent(null); + split.setDividerLocation(1.0); + } + } /** diff --git a/swing/src/net/sf/openrocket/gui/dialogs/EditDecalDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/EditDecalDialog.java index 8a2214410f..63bf9ac7ef 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/EditDecalDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/EditDecalDialog.java @@ -23,6 +23,7 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public class EditDecalDialog extends JDialog { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/PrintSettingsDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/PrintSettingsDialog.java index 3271c8c9f9..eefc5960aa 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/PrintSettingsDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/PrintSettingsDialog.java @@ -30,6 +30,7 @@ /** * This class is a dialog for displaying advanced settings for printing rocket related info. */ +@SuppressWarnings("serial") public class PrintSettingsDialog extends JDialog { private static final Logger log = LoggerFactory.getLogger(PrintSettingsDialog.class); private static final Translator trans = Application.getTranslator(); @@ -75,16 +76,16 @@ public void propertyChange(PropertyChangeEvent evt) { - JComboBox combo = new JComboBox(new EnumModel<PaperSize>(settings, "PaperSize")); + final JComboBox<PaperSize> sizeCombo = new JComboBox<PaperSize>(new EnumModel<PaperSize>(settings, "PaperSize")); ////Paper size: panel.add(new JLabel(trans.get("lbl.Papersize"))); - panel.add(combo, "growx, wrap para"); + panel.add( sizeCombo, "growx, wrap para"); - combo = new JComboBox(new EnumModel<PaperOrientation>(settings, "PaperOrientation")); + final JComboBox<PaperOrientation> orientCombo = new JComboBox<PaperOrientation>(new EnumModel<PaperOrientation>(settings, "PaperOrientation")); //// Paper orientation: panel.add(new JLabel(trans.get("lbl.Paperorientation"))); - panel.add(combo, "growx, wrap para*2"); + panel.add( orientCombo, "growx, wrap para*2"); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java index 52800955e8..4fc60db939 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java @@ -33,6 +33,7 @@ import net.sf.openrocket.logging.Markers; import net.sf.openrocket.rocketcomponent.BodyComponent; import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.EllipticalFinSet; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.FreeformFinSet; @@ -66,7 +67,7 @@ * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class ScaleDialog extends JDialog { - + private static final long serialVersionUID = -8558418577377862794L; private static final Logger log = LoggerFactory.getLogger(ScaleDialog.class); private static final Translator trans = Application.getTranslator(); @@ -82,7 +83,7 @@ public class ScaleDialog extends JDialog { List<Scaler> list; // RocketComponent - addScaler(RocketComponent.class, "PositionValue"); + addScaler(RocketComponent.class, "AxialOffset"); SCALERS.get(RocketComponent.class).add(new OverrideScaler()); // BodyComponent @@ -114,7 +115,7 @@ public class ScaleDialog extends JDialog { addScaler(FinSet.class, "Thickness"); addScaler(FinSet.class, "TabHeight"); addScaler(FinSet.class, "TabLength"); - addScaler(FinSet.class, "TabShift"); + addScaler(FinSet.class, "TabOffset"); // TrapezoidFinSet addScaler(TrapezoidFinSet.class, "Sweep"); @@ -204,7 +205,7 @@ private static void addScaler(Class<? extends RocketComponent> componentClass, S private final RocketComponent selection; private final boolean onlySelection; - private JComboBox selectionOption; + private JComboBox<String> selectionOption; private JCheckBox scaleMassValues; private boolean changing = false; @@ -330,7 +331,7 @@ public void stateChanged(ChangeEvent e) { label.setToolTipText(tip); panel.add(label, "span, split, gapright unrel"); - selectionOption = new JComboBox(options.toArray()); + selectionOption = new JComboBox<String>(options.toArray(new String[0])); selectionOption.setEditable(false); selectionOption.setToolTipText(tip); panel.add(selectionOption, "growx, wrap para*2"); @@ -400,18 +401,22 @@ public void stateChanged(ChangeEvent e) { panel.add(scaleMassValues, "span, wrap para*3"); - // Buttons - + // Scale / Accept Buttons JButton scale = new JButton(trans.get("button.scale")); scale.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { doScale(); + + ScaleDialog.this.document.getRocket().fireComponentChangeEvent( ComponentChangeEvent.AEROMASS_CHANGE); + ScaleDialog.this.setVisible(false); } }); + panel.add(scale, "span, split, right, gap para"); - + + // Cancel Button JButton cancel = new JButton(trans.get("button.cancel")); cancel.addActionListener(new ActionListener() { @Override @@ -589,6 +594,8 @@ public void scale(RocketComponent component, double multiplier, boolean scaleMas mass = mass * MathUtil.pow3(multiplier); component.setOverrideMass(mass); } + + //TODO: Fix overridden pressure! } } @@ -616,11 +623,9 @@ public void scale(RocketComponent component, double multiplier, boolean scaleMas for (int i = 0; i < points.length; i++) { points[i] = points[i].multiply(multiplier); } - try { - finset.setPoints(points); - } catch (IllegalFinPointException e) { - throw new BugException("Failed to set points after scaling, original=" + Arrays.toString(finset.getFinPoints()) + " scaled=" + Arrays.toString(points), e); - } + + finset.setPoints(points); + } } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java index 30ab240f70..bb6a89a1b5 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/WarningDialog.java @@ -10,13 +10,13 @@ import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; +@SuppressWarnings("serial") public class WarningDialog extends JDialog { - public static void showWarnings(Component parent, Object message, String title, - WarningSet warnings) { + public static void showWarnings(Component parent, Object message, String title, WarningSet warnings) { Warning[] w = warnings.toArray(new Warning[0]); - JList list = new JList(w); + final JList<Warning> list = new JList<Warning>(w); JScrollPane pane = new JScrollPane(list); JOptionPane.showMessageDialog(parent, new Object[] { message, pane }, diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/DeploymentSelectionDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/DeploymentSelectionDialog.java index 3b84301535..d22ea65238 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/DeploymentSelectionDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/DeploymentSelectionDialog.java @@ -26,11 +26,13 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class DeploymentSelectionDialog extends JDialog { private static final Translator trans = Application.getTranslator(); @@ -47,9 +49,9 @@ public class DeploymentSelectionDialog extends JDialog { public DeploymentSelectionDialog(Window parent, final Rocket rocket, final RecoveryDevice component) { super(parent, trans.get("edtmotorconfdlg.title.Selectdeploymentconf"), Dialog.ModalityType.APPLICATION_MODAL); - final String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); + final FlightConfigurationId id = rocket.getSelectedConfiguration().getFlightConfigurationID(); - newConfiguration = component.getDeploymentConfiguration().get(id).clone(); + newConfiguration = component.getDeploymentConfigurations().get(id).clone(); JPanel panel = new JPanel(new MigLayout("fill")); @@ -67,7 +69,7 @@ public DeploymentSelectionDialog(Window parent, final Rocket rocket, final Recov // Select the button based on current configuration. If the configuration is overridden // The the overrideButton is selected. - boolean isOverridden = !component.getDeploymentConfiguration().isDefault(id); + boolean isOverridden = !component.getDeploymentConfigurations().isDefault(id); if (isOverridden) { overrideButton.setSelected(true); } @@ -76,12 +78,12 @@ public DeploymentSelectionDialog(Window parent, final Rocket rocket, final Recov //// Deploys at: panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")), ""); - final JComboBox<?> event = new JComboBox(new EnumModel<DeployEvent>(newConfiguration, "DeployEvent")); + final JComboBox<DeployEvent> deployEvent = new JComboBox<DeployEvent>(new EnumModel<DeployEvent>(newConfiguration, "DeployEvent")); if( (component.getStageNumber() + 1 ) == rocket.getStageCount() ){ // This is the bottom stage: Restrict deployment options. - event.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); + deployEvent.removeItem( DeployEvent.LOWER_STAGE_SEPARATION ); } - panel.add(event, "spanx 3, growx, wrap"); + panel.add( deployEvent, "spanx 3, growx, wrap"); // ... and delay //// plus @@ -109,7 +111,7 @@ public DeploymentSelectionDialog(Window parent, final Rocket rocket, final Recov altSlider = new BasicSlider(alt.getSliderModel(100, 1000)); panel.add(altSlider, "w 100lp, wrap"); - event.addActionListener(new ActionListener() { + deployEvent.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateState(); @@ -124,9 +126,9 @@ public void actionPerformed(ActionEvent e) { @Override public void actionPerformed(ActionEvent e) { if (defaultButton.isSelected()) { - component.getDeploymentConfiguration().setDefault(newConfiguration); + component.getDeploymentConfigurations().setDefault(newConfiguration); } else { - component.getDeploymentConfiguration().set(id, newConfiguration); + component.getDeploymentConfigurations().set(id, newConfiguration); } DeploymentSelectionDialog.this.setVisible(false); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/IgnitionSelectionDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/IgnitionSelectionDialog.java index 8093deb344..d6a850aba9 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/IgnitionSelectionDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/IgnitionSelectionDialog.java @@ -4,6 +4,7 @@ import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Iterator; import javax.swing.ButtonGroup; import javax.swing.JButton; @@ -21,37 +22,45 @@ import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration.IgnitionEvent; +import net.sf.openrocket.motor.IgnitionEvent; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; public class IgnitionSelectionDialog extends JDialog { - + private static final long serialVersionUID = -3399966098520607837L; + private static final Translator trans = Application.getTranslator(); private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); + private MotorMount curMount; + private MotorConfiguration curMotorInstance; - private IgnitionConfiguration newConfiguration; + private IgnitionEvent startIgnitionEvent; + private double startIgnitionDelay; - public IgnitionSelectionDialog(Window parent, final Rocket rocket, final MotorMount component) { + public IgnitionSelectionDialog(Window parent, final FlightConfigurationId curFCID, MotorMount _mount) { super(parent, trans.get("edtmotorconfdlg.title.Selectignitionconf"), Dialog.ModalityType.APPLICATION_MODAL); - final String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); - - newConfiguration = component.getIgnitionConfiguration().get(id).clone(); - + curMount = _mount; + curMotorInstance = curMount.getMotorConfig(curFCID); + startIgnitionEvent = curMotorInstance.getIgnitionEvent(); + startIgnitionDelay = curMotorInstance.getIgnitionDelay(); JPanel panel = new JPanel(new MigLayout("fill")); // Edit default or override option - boolean isDefault = component.getIgnitionConfiguration().isDefault(id); + boolean isDefault = curMotorInstance.isEmpty(); panel.add(new JLabel(trans.get("IgnitionSelectionDialog.opt.title")), "span, wrap rel"); final JRadioButton defaultButton = new JRadioButton(trans.get("IgnitionSelectionDialog.opt.default"), isDefault); panel.add(defaultButton, "span, gapleft para, wrap rel"); String str = trans.get("IgnitionSelectionDialog.opt.override"); - str = str.replace("{0}", descriptor.format(rocket, id)); + Rocket rkt = ((RocketComponent)_mount).getRocket(); + str = str.replace("{0}", descriptor.format(rkt, curFCID)); + final JRadioButton overrideButton = new JRadioButton(str, !isDefault); panel.add(overrideButton, "span, gapleft para, wrap para"); @@ -61,23 +70,22 @@ public IgnitionSelectionDialog(Window parent, final Rocket rocket, final MotorMo // Select the button based on current configuration. If the configuration is overridden // The the overrideButton is selected. - boolean isOverridden = !component.getIgnitionConfiguration().isDefault(id); + boolean isOverridden = !isDefault; if (isOverridden) { overrideButton.setSelected(true); } // Select ignition event - //// Ignition at: panel.add(new JLabel(trans.get("MotorCfg.lbl.Ignitionat")), ""); + final EnumModel<IgnitionEvent> igEvModel = new EnumModel<IgnitionEvent>(curMotorInstance, "IgnitionEvent", IgnitionEvent.values()); + final JComboBox<IgnitionEvent> eventBox = new JComboBox<IgnitionEvent>( igEvModel); + panel.add(eventBox, "growx, wrap"); - final JComboBox event = new JComboBox(new EnumModel<IgnitionEvent>(newConfiguration, "IgnitionEvent")); - panel.add(event, "growx, wrap"); - - // ... and delay + // ... and delay //// plus panel.add(new JLabel(trans.get("MotorCfg.lbl.plus")), "gap indent, skip 1, span, split"); - DoubleModel delay = new DoubleModel(newConfiguration, "IgnitionDelay", UnitGroup.UNITS_SHORT_TIME, 0); + DoubleModel delay = new DoubleModel(curMotorInstance, "IgnitionDelay", UnitGroup.UNITS_SHORT_TIME, 0); JSpinner spin = new JSpinner(delay.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin, 3)); panel.add(spin, "gap rel rel"); @@ -85,17 +93,38 @@ public IgnitionSelectionDialog(Window parent, final Rocket rocket, final MotorMo //// seconds panel.add(new JLabel(trans.get("MotorCfg.lbl.seconds")), "wrap unrel"); - panel.add(new JPanel(), "span, split, growx"); JButton okButton = new JButton(trans.get("button.ok")); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + if (defaultButton.isSelected()) { - component.getIgnitionConfiguration().setDefault(newConfiguration); - } else { - component.getIgnitionConfiguration().set(id, newConfiguration); + // retrieve our just-set values + double cid = curMotorInstance.getIgnitionDelay(); + IgnitionEvent cie = curMotorInstance.getIgnitionEvent(); + + // update the default instance + final MotorConfiguration defaultMotorInstance = curMount.getDefaultMotorConfig(); + defaultMotorInstance.setIgnitionDelay( cid); + defaultMotorInstance.setIgnitionEvent( cie); + + // and change all remaining configs + // this seems like odd behavior to me, but it matches the text on the UI dialog popup. -teyrana (equipoise@gmail.com) + Iterator<MotorConfiguration> iter = curMount.getMotorIterator(); + while( iter.hasNext() ){ + MotorConfiguration next = iter.next(); + next.setIgnitionDelay( cid); + next.setIgnitionEvent( cie); + } + +// System.err.println("setting default motor ignition ("+defaultMotorInstance.getMotorID().toString()+") to: "); +// System.err.println(" event: "+defaultMotorInstance.getIgnitionEvent().name+" w/delay: "+defaultMotorInstance.getIgnitionDelay()); +// }else { +// System.err.println("setting motor ignition to.... new values: "); +// //destMotorInstance.setIgnitionEvent((IgnitionEvent)eventBox.getSelectedItem()); +// System.err.println(" "+curMotorInstance.getIgnitionEvent()+" w/ "+curMotorInstance.getIgnitionDelay()); } IgnitionSelectionDialog.this.setVisible(false); } @@ -109,6 +138,9 @@ public void actionPerformed(ActionEvent e) { @Override public void actionPerformed(ActionEvent e) { IgnitionSelectionDialog.this.setVisible(false); + // if cancelled, reset to starting values + curMotorInstance.setIgnitionEvent( startIgnitionEvent ); + curMotorInstance.setIgnitionDelay( startIgnitionDelay ); } }); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountConfigurationPanel.java index 2dc0501e11..527fe69fcd 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountConfigurationPanel.java @@ -12,20 +12,15 @@ import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.rocketcomponent.Rocket; -public abstract class MotorMountConfigurationPanel extends JPanel { - - - private final Rocket rocket; - private final Component parent; +@SuppressWarnings("serial") +public class MotorMountConfigurationPanel extends JPanel { public MotorMountConfigurationPanel( Component parent, Rocket rocket ) { super(new MigLayout("") ); - this.parent = parent; - this.rocket = rocket; - - //// Motor Mount selection - JTable table = new JTable(new MotorMountTableModel(this, rocket)); + //// Motor Mount selection + MotorMountTableModel model = new MotorMountTableModel( rocket); + JTable table = new JTable( model ); table.setTableHeader(null); table.setShowVerticalLines(false); table.setRowSelectionAllowed(false); @@ -43,6 +38,4 @@ public MotorMountConfigurationPanel( Component parent, Rocket rocket ) { this.add(scroll, "w 200lp, h 150lp, grow"); } - - public abstract void onDataChanged(); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountTableModel.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountTableModel.java index a449f804e6..4dd515e48f 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountTableModel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/MotorMountTableModel.java @@ -4,6 +4,8 @@ import javax.swing.table.AbstractTableModel; +import org.jfree.util.Log; + import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; import net.sf.openrocket.rocketcomponent.MotorMount; @@ -15,18 +17,16 @@ * The table model for selecting whether components are motor mounts or not. */ class MotorMountTableModel extends AbstractTableModel implements ComponentChangeListener { - - private final MotorMountConfigurationPanel motorConfigurationPanel; - - private final List<MotorMount> potentialMounts = new ArrayList<MotorMount>(); + private static final long serialVersionUID = 1956400848559941228L; + + private final List<MotorMount> potentialMounts = new ArrayList<MotorMount>(); private final Rocket rocket; /** * @param motorConfigurationPanel */ - MotorMountTableModel(MotorMountConfigurationPanel motorConfigurationPanel, Rocket rocket) { - this.motorConfigurationPanel = motorConfigurationPanel; + MotorMountTableModel( Rocket rocket) { this.rocket = rocket; initialize(); @@ -99,8 +99,7 @@ public void setValueAt(Object value, int row, int column) { throw new IllegalArgumentException("column=" + column + ", value=" + value); } - MotorMount mount = potentialMounts.get(row); - mount.setMotorMount((Boolean) value); - this.motorConfigurationPanel.onDataChanged(); + MotorMount mount = potentialMounts.get(row); + mount.setMotorMount((Boolean) value); } } \ No newline at end of file diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java index 1b26bc5d81..e8ff878667 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/RenameConfigDialog.java @@ -14,22 +14,22 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.startup.Application; public class RenameConfigDialog extends JDialog { - + private static final long serialVersionUID = -5423008694485357248L; private static final Translator trans = Application.getTranslator(); - public RenameConfigDialog(final Window parent, final Rocket rocket) { + public RenameConfigDialog(final Window parent, final Rocket rocket, final FlightConfigurationId fcid) { super(parent, trans.get("RenameConfigDialog.title"), Dialog.ModalityType.APPLICATION_MODAL); - final String configId = rocket.getDefaultConfiguration().getFlightConfigurationID(); JPanel panel = new JPanel(new MigLayout("fill")); panel.add(new JLabel(trans.get("RenameConfigDialog.lbl.name")), "span, wrap rel"); - final JTextField textbox = new JTextField(rocket.getFlightConfigurationName(configId)); + final JTextField textbox = new JTextField(rocket.getFlightConfiguration(fcid).getName()); panel.add(textbox, "span, w 200lp, growx, wrap para"); panel.add(new JPanel(), "growx"); @@ -39,21 +39,21 @@ public RenameConfigDialog(final Window parent, final Rocket rocket) { @Override public void actionPerformed(ActionEvent e) { String newName = textbox.getText(); - rocket.setFlightConfigurationName(configId, newName); + rocket.getFlightConfiguration(fcid).setName( newName); RenameConfigDialog.this.setVisible(false); } }); panel.add(okButton); - JButton defaultButton = new JButton(trans.get("RenameConfigDialog.but.reset")); - defaultButton.addActionListener(new ActionListener() { + JButton renameToDefaultButton = new JButton(trans.get("RenameConfigDialog.but.reset")); + renameToDefaultButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - rocket.setFlightConfigurationName(configId, null); + rocket.getFlightConfiguration(fcid).setName(null); RenameConfigDialog.this.setVisible(false); } }); - panel.add(defaultButton); + panel.add(renameToDefaultButton); JButton cancel = new JButton(trans.get("button.cancel")); cancel.addActionListener(new ActionListener() { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/SeparationSelectionDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/SeparationSelectionDialog.java index 2456d16940..1409d1fbfd 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/SeparationSelectionDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/flightconfiguration/SeparationSelectionDialog.java @@ -21,26 +21,31 @@ import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration.SeparationEvent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public class SeparationSelectionDialog extends JDialog { - + private static final Translator trans = Application.getTranslator(); private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); private StageSeparationConfiguration newConfiguration; - public SeparationSelectionDialog(Window parent, final Rocket rocket, final Stage component) { + public SeparationSelectionDialog(Window parent, final Rocket rocket, final AxialStage stage) { super(parent, trans.get("edtmotorconfdlg.title.Selectseparationconf"), Dialog.ModalityType.APPLICATION_MODAL); - final String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); + final FlightConfigurationId id = rocket.getSelectedConfiguration().getFlightConfigurationID(); - newConfiguration = component.getStageSeparationConfiguration().get(id).clone(); + newConfiguration = stage.getSeparationConfigurations().get(id); + if( stage.getSeparationConfigurations().isDefault( newConfiguration )){ + newConfiguration = newConfiguration.clone(); + } JPanel panel = new JPanel(new MigLayout("fill")); @@ -48,7 +53,7 @@ public SeparationSelectionDialog(Window parent, final Rocket rocket, final Stage // Select separation event panel.add(new JLabel(trans.get("SeparationSelectionDialog.opt.title")), "span, wrap rel"); - boolean isDefault = component.getStageSeparationConfiguration().isDefault(id); + boolean isDefault = stage.getSeparationConfigurations().isDefault(id); final JRadioButton defaultButton = new JRadioButton(trans.get("SeparationSelectionDialog.opt.default"), isDefault); panel.add(defaultButton, "span, gapleft para, wrap rel"); String str = trans.get("SeparationSelectionDialog.opt.override"); @@ -62,12 +67,12 @@ public SeparationSelectionDialog(Window parent, final Rocket rocket, final Stage // Select the button based on current configuration. If the configuration is overridden // The the overrideButton is selected. - boolean isOverridden = !component.getStageSeparationConfiguration().isDefault(id); + boolean isOverridden = !stage.getSeparationConfigurations().isDefault(id); if (isOverridden) { overrideButton.setSelected(true); } - final JComboBox event = new JComboBox(new EnumModel<SeparationEvent>(newConfiguration, "SeparationEvent")); + final JComboBox<SeparationEvent> event = new JComboBox<SeparationEvent>(new EnumModel<SeparationEvent>(newConfiguration, "SeparationEvent")); event.setSelectedItem(newConfiguration.getSeparationEvent()); panel.add(event, "wrap rel"); @@ -89,10 +94,14 @@ public SeparationSelectionDialog(Window parent, final Rocket rocket, final Stage okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + if( newConfiguration.getSeparationEvent() == StageSeparationConfiguration.SeparationEvent.NEVER ){ + newConfiguration.setSeparationDelay(0); + } if (defaultButton.isSelected()) { - component.getStageSeparationConfiguration().setDefault(newConfiguration); + stage.getSeparationConfigurations().reset(); + stage.getSeparationConfigurations().setDefault( newConfiguration); } else { - component.getStageSeparationConfiguration().set(id, newConfiguration); + stage.getSeparationConfigurations().set(id, newConfiguration); } SeparationSelectionDialog.this.setVisible(false); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/MotorChooserDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/MotorChooserDialog.java index d7c31c6f76..613c9359f7 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/MotorChooserDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/MotorChooserDialog.java @@ -17,19 +17,21 @@ import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public class MotorChooserDialog extends JDialog implements CloseableDialog { - + private final ThrustCurveMotorSelectionPanel selectionPanel; private boolean okClicked = false; private static final Translator trans = Application.getTranslator(); - public MotorChooserDialog(MotorMount mount, String currentConfig, Window owner) { + public MotorChooserDialog(MotorMount mount, FlightConfigurationId currentConfigID, Window owner) { this(owner); - setMotorMountAndConfig(mount, currentConfig); + setMotorMountAndConfig( currentConfigID, mount); } public MotorChooserDialog(Window owner) { @@ -81,8 +83,8 @@ public void actionPerformed(ActionEvent e) { selectionPanel.setCloseableDialog(this); } - public void setMotorMountAndConfig( MotorMount mount, String currentConfig ) { - selectionPanel.setMotorMountAndConfig(mount, currentConfig); + public void setMotorMountAndConfig( FlightConfigurationId _fcid, MotorMount _mount ) { + selectionPanel.setMotorMountAndConfig( _fcid, _mount ); } /** diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java index e54f686ce7..6bc77039c4 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorFilterPanel.java @@ -22,8 +22,11 @@ import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; +import com.itextpdf.text.Font; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.BooleanModel; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.CheckList; @@ -37,13 +40,12 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; -import com.itextpdf.text.Font; - public abstract class MotorFilterPanel extends JPanel { + private static final long serialVersionUID = -2068101000195158181L; private static final Translator trans = Application.getTranslator(); - private static Hashtable diameterLabels = new Hashtable(); + private static Hashtable<Integer,JLabel> diameterLabels = new Hashtable<Integer,JLabel>(); private static double[] diameterValues = new double[] { 0, .013, @@ -66,7 +68,7 @@ public abstract class MotorFilterPanel extends JPanel { } } - private static Hashtable impulseLabels = new Hashtable(); + private static Hashtable<Integer,JLabel> impulseLabels = new Hashtable<Integer,JLabel>(); static { int i =0; for( ImpulseClass impulseClass : ImpulseClass.values() ) { @@ -79,8 +81,9 @@ public abstract class MotorFilterPanel extends JPanel { private final MotorRowFilter filter; - private final JCheckBox limitLengthCheckBox; - private boolean limitLength = false; + private final JCheckBox limitByLengthCheckBox; + //private final BooleanModel limitByLengthModel; + //private boolean limitLength = false; private Double mountLength = null; private final JCheckBox limitDiameterCheckBox; @@ -99,7 +102,7 @@ public MotorFilterPanel(Collection<Manufacturer> allManufacturers, MotorRowFilte List<Manufacturer> unselectedManusFromPreferences = ((SwingPreferences) Application.getPreferences()).getExcludedMotorManufacturers(); filter.setExcludedManufacturers(unselectedManusFromPreferences); - limitLength = ((SwingPreferences) Application.getPreferences()).getBoolean("motorFilterLimitLength", false); + boolean limitByLengthPref = ((SwingPreferences) Application.getPreferences()).getBoolean("motorFilterLimitLength", false); limitDiameter = ((SwingPreferences) Application.getPreferences()).getBoolean("motorFilterLimitDiameter", false); //// Hide used motor files @@ -261,21 +264,24 @@ public void stateChanged(ChangeEvent e) { sub.add( diameterSlider, "growx, wrap"); } - { + { // length selection + sub.add( new JLabel(trans.get("TCMotorSelPan.Length")), "split 2, wrap"); - limitLengthCheckBox = new JCheckBox( trans.get("TCMotorSelPan.checkbox.limitlength")); - GUIUtil.changeFontSize(limitLengthCheckBox, -1); - limitLengthCheckBox.setSelected(limitLength); - limitLengthCheckBox.addActionListener(new ActionListener() { + final BooleanModel limitByLengthModel = new BooleanModel(limitByLengthPref); + limitByLengthCheckBox = new JCheckBox( limitByLengthModel ); + limitByLengthCheckBox.setText( trans.get("TCMotorSelPan.checkbox.limitlength")); + GUIUtil.changeFontSize(limitByLengthCheckBox, -1); + + limitByLengthCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - limitLength = limitLengthCheckBox.isSelected(); + //boolean limitByLength = limitByLengthCheckBox.isSelected(); MotorFilterPanel.this.setLimitLength(); onSelectionChanged(); } }); - sub.add( limitLengthCheckBox, "gapleft para, spanx, growx, wrap" ); + sub.add( limitByLengthCheckBox, "gapleft para, spanx, growx, wrap" ); final DoubleModel minimumLength = new DoubleModel(filter, "MinimumLength", UnitGroup.UNITS_MOTOR_DIMENSIONS, 0); @@ -283,10 +289,28 @@ public void actionPerformed(ActionEvent e) { JSpinner spin = new JSpinner(minimumLength.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); + minimumLength.addChangeListener( new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + lengthSlider.setValueAt(0, (int)(1000* minimumLength.getValue())); + } + }); sub.add(spin, "split 5, growx"); - + limitByLengthModel.addEnableComponent(spin,false); sub.add(new UnitSelector(minimumLength), ""); - + + spin = new JSpinner(maximumLength.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + maximumLength.addChangeListener( new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + lengthSlider.setValueAt(1, (int) (1000* maximumLength.getValue())); + } + }); + sub.add(spin, "growx"); + limitByLengthModel.addEnableComponent(spin,false); + sub.add(new UnitSelector(maximumLength), "wrap"); + lengthSlider = new MultiSlider(MultiSlider.HORIZONTAL,0, 1000, 0, 1000); lengthSlider.setBounded(true); // thumbs cannot cross lengthSlider.setMajorTickSpacing(100); @@ -295,6 +319,7 @@ public void actionPerformed(ActionEvent e) { lengthSlider.addChangeListener( new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { + int minLength = lengthSlider.getValueAt(0); minimumLength.setValue(minLength/1000.0); int maxLength = lengthSlider.getValueAt(1); @@ -303,22 +328,9 @@ public void stateChanged(ChangeEvent e) { } }); - minimumLength.addChangeListener( new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - lengthSlider.setValueAt(0, (int)(1000* minimumLength.getValue())); - lengthSlider.setValueAt(1, (int) (1000* maximumLength.getValue())); - } - - }); - - sub.add( lengthSlider, "growx"); - - spin = new JSpinner(maximumLength.getSpinnerModel()); - spin.setEditor(new SpinnerEditor(spin)); - sub.add(spin, "growx"); - - sub.add(new UnitSelector(maximumLength), "wrap"); + sub.add( lengthSlider, "growx,wrap"); + limitByLengthModel.addEnableComponent(lengthSlider,false); + } this.add(sub, "grow,wrap"); @@ -343,8 +355,9 @@ public void setMotorMount( MotorMount mount ) { } private void setLimitLength( ) { - ((SwingPreferences) Application.getPreferences()).putBoolean("motorFilterLimitLength", limitLength); - if ( mountLength != null & limitLength ) { + boolean limitByLength = limitByLengthCheckBox.isSelected(); + ((SwingPreferences) Application.getPreferences()).putBoolean("motorFilterLimitLength", limitByLength); + if ( mountLength != null & limitByLength ) { lengthSlider.setValueAt(1, (int) Math.min(1000,Math.round(1000*mountLength))); } } @@ -366,6 +379,11 @@ private void setLimitDiameter( ) { } } + void setHideUnavailable( boolean hideUnavailable ) { + this.filter.setHideUnavailable(hideUnavailable); + onSelectionChanged(); + } + public abstract void onSelectionChanged(); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java index 187a996bf7..ed7c77aa82 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorInformationPanel.java @@ -16,14 +16,6 @@ import javax.swing.JTextArea; import javax.swing.SwingUtilities; -import net.miginfocom.swing.MigLayout; -import net.sf.openrocket.gui.util.GUIUtil; -import net.sf.openrocket.gui.util.Icons; -import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.motor.ThrustCurveMotor; -import net.sf.openrocket.startup.Application; -import net.sf.openrocket.unit.UnitGroup; - import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; @@ -34,6 +26,16 @@ import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.gui.util.Icons; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.motor.ThrustCurveMotor; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.utils.StringUtils; + +@SuppressWarnings("serial") class MotorInformationPanel extends JPanel { private static final int ZOOM_ICON_POSITION_NEGATIVE_X = 50; @@ -56,7 +58,10 @@ class MotorInformationPanel extends JPanel { private final JLabel burnTimeLabel; private final JLabel launchMassLabel; private final JLabel emptyMassLabel; + private final JLabel caseInfoLabel; + private final JLabel propInfoLabel; private final JLabel dataPointsLabel; + private final JLabel compatibleCasesLabel; private final JLabel digestLabel; private final JTextArea comment; @@ -106,11 +111,26 @@ public MotorInformationPanel() { emptyMassLabel = new JLabel(); this.add(emptyMassLabel, "wrap"); + //// case info: + this.add(new JLabel(trans.get("TCMotorSelPan.lbl.Caseinfo"))); + caseInfoLabel = new JLabel(); + this.add(caseInfoLabel, "wrap"); + + //// prop info: + this.add(new JLabel(trans.get("TCMotorSelPan.lbl.Propinfo"))); + propInfoLabel = new JLabel(); + this.add(propInfoLabel, "wrap"); + + //// compatible cases: + this.add(new JLabel(trans.get("TCMotorSelPan.lbl.CompatibleCases"))); + compatibleCasesLabel = new JLabel(); + this.add(compatibleCasesLabel, "wrap"); + //// Data points: this.add(new JLabel(trans.get("TCMotorSelPan.lbl.Datapoints"))); dataPointsLabel = new JLabel(); this.add(dataPointsLabel, "wrap para"); - + if (System.getProperty("openrocket.debug.motordigest") != null) { //// Digest: this.add(new JLabel(trans.get("TCMotorSelPan.lbl.Digest"))); @@ -212,6 +232,9 @@ public void clearData() { burnTimeLabel.setText(""); launchMassLabel.setText(""); emptyMassLabel.setText(""); + caseInfoLabel.setText(""); + propInfoLabel.setText(""); + compatibleCasesLabel.setText(""); dataPointsLabel.setText(""); if (digestLabel != null) { digestLabel.setText(""); @@ -229,7 +252,7 @@ public void updateData( List<ThrustCurveMotor> motors, ThrustCurveMotor selected this.selectedMotorSet = motors; this.selectedMotor = selectedMotor; - + // Update thrust curve data double impulse = selectedMotor.getTotalImpulseEstimate(); MotorClass mc = MotorClass.getMotorClass(impulse); @@ -245,10 +268,14 @@ public void updateData( List<ThrustCurveMotor> motors, ThrustCurveMotor selected burnTimeLabel.setText(UnitGroup.UNITS_SHORT_TIME.getDefaultUnit().toStringUnit( selectedMotor.getBurnTimeEstimate())); launchMassLabel.setText(UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit( - selectedMotor.getLaunchCG().weight)); + selectedMotor.getLaunchMass())); emptyMassLabel.setText(UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit( - selectedMotor.getEmptyCG().weight)); + selectedMotor.getBurnoutMass())); + caseInfoLabel.setText(selectedMotor.getCaseInfo()); + propInfoLabel.setText(selectedMotor.getPropellantInfo()); + compatibleCasesLabel.setText( StringUtils.join(",",selectedMotor.getCompatibleCases())); dataPointsLabel.setText("" + (selectedMotor.getTimePoints().length - 1)); + if (digestLabel != null) { digestLabel.setText(selectedMotor.getDigest()); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorRowFilter.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorRowFilter.java index febe014b44..66dd955869 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorRowFilter.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/MotorRowFilter.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -11,8 +12,8 @@ import net.sf.openrocket.database.motor.ThrustCurveMotorSet; import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.motor.ThrustCurveMotor; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.util.AbstractChangeSource; import net.sf.openrocket.util.ChangeSource; @@ -54,6 +55,9 @@ public class MotorRowFilter extends RowFilter<TableModel, Integer> implements Ch // Impulse class filtering private ImpulseClass minimumImpulse; private ImpulseClass maximumImpulse; + + // Show only available motors + private boolean hideUnavailable = false; public MotorRowFilter(ThrustCurveMotorDatabaseModel model) { @@ -63,8 +67,12 @@ public MotorRowFilter(ThrustCurveMotorDatabaseModel model) { public void setMotorMount( MotorMount mount ) { if (mount != null) { - for (MotorConfiguration m : mount.getMotorConfiguration()) { - this.usedMotors.add((ThrustCurveMotor) m.getMotor()); + Iterator<MotorConfiguration> iter = mount.getMotorIterator(); + while( iter.hasNext()){ + MotorConfiguration mi = iter.next(); + if( !mi.isEmpty()){ + this.usedMotors.add((ThrustCurveMotor) mi.getMotor()); + } } } } @@ -146,11 +154,19 @@ void setMaximumImpulse(ImpulseClass maximumImpulse) { this.maximumImpulse = maximumImpulse; } + public boolean isHideUnavailable() { + return hideUnavailable; + } + + public void setHideUnavailable(boolean hideUnavailable) { + this.hideUnavailable = hideUnavailable; + } + @Override public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) { int index = entry.getIdentifier(); ThrustCurveMotorSet m = model.getMotorSet(index); - return filterManufacturers(m) && filterUsed(m) && filterBySize(m) && filterByString(m) && filterByImpulseClass(m); + return filterManufacturers(m) && filterUsed(m) && filterBySize(m) && filterByString(m) && filterByImpulseClass(m) && filterUnavailable(m); } private boolean filterManufacturers(ThrustCurveMotorSet m) { @@ -227,6 +243,14 @@ private boolean filterByImpulseClass(ThrustCurveMotorSet m) { return true; } + private boolean filterUnavailable(ThrustCurveMotorSet m) { + if (!hideUnavailable) { + return true; + } + return m.isAvailable(); + } + + public final void addChangeListener(StateChangeListener listener) { changeSourceDelegate.addChangeListener(listener); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorColumns.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorColumns.java index 47d931dd95..243a5d564e 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorColumns.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorColumns.java @@ -58,11 +58,10 @@ public int compare(Long o1, Long o2) { }; } }, - //// Type - TYPE("TCurveMotorCol.TYPE") { + CASEINFO("TCurveMotorCol.CASEINFO") { @Override public String getValue(ThrustCurveMotorSet m) { - return m.getType().getName(); + return m.getCaseInfo(); } @Override @@ -151,11 +150,11 @@ public String getToolTipText(ThrustCurveMotor m) { UnitGroup.UNITS_IMPULSE.getDefaultUnit() .toStringUnit(m.getTotalImpulseEstimate()) + "<br>"); tip += (trans.get("TCurveMotor.ttip.launchMass") + " " + - UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit(m.getLaunchCG().weight) + + UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit(m.getLaunchMass()) + "<br>"); tip += (trans.get("TCurveMotor.ttip.emptyMass") + " " + UnitGroup.UNITS_MASS.getDefaultUnit() - .toStringUnit(m.getEmptyCG().weight)); + .toStringUnit(m.getBurnoutMass())); return tip; } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java index 7ea640b548..f3f466b6a0 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java @@ -39,6 +39,10 @@ import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; +import org.jfree.chart.ChartColor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.database.motor.ThrustCurveMotorSet; import net.sf.openrocket.gui.components.StyledLabel; @@ -50,18 +54,17 @@ import net.sf.openrocket.logging.Markers; import net.sf.openrocket.motor.Manufacturer; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.motor.MotorConfiguration; import net.sf.openrocket.motor.ThrustCurveMotor; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; import net.sf.openrocket.utils.MotorCorrelation; -import org.jfree.chart.ChartColor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelector { + private static final long serialVersionUID = -8737784181512143155L; + private static final Logger log = LoggerFactory.getLogger(ThrustCurveMotorSelectionPanel.class); private static final Translator trans = Application.getTranslator(); @@ -82,13 +85,14 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec private final MotorRowFilter rowFilter; private final JCheckBox hideSimilarBox; + private final JCheckBox hideUnavailableBox; private final JTextField searchField; private final JLabel curveSelectionLabel; - private final JComboBox curveSelectionBox; - private final DefaultComboBoxModel curveSelectionModel; - private final JComboBox delayBox; + private final JComboBox<MotorHolder> curveSelectionBox; + private final DefaultComboBoxModel<MotorHolder> curveSelectionModel; + private final JComboBox<String> delayBox; private final MotorInformationPanel motorInformationPanel; private final MotorFilterPanel motorFilterPanel; @@ -97,11 +101,12 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec private ThrustCurveMotorSet selectedMotorSet; private double selectedDelay; - public ThrustCurveMotorSelectionPanel(MotorMount mount, String currentConfig) { + public ThrustCurveMotorSelectionPanel( final FlightConfigurationId fcid, MotorMount mount ) { this(); - setMotorMountAndConfig( mount, currentConfig ); + setMotorMountAndConfig( fcid, mount ); } + /** * Sole constructor. * @@ -128,6 +133,8 @@ public ThrustCurveMotorSelectionPanel() { } motorFilterPanel = new MotorFilterPanel(allManufacturers, rowFilter) { + private static final long serialVersionUID = 8441555209804602238L; + @Override public void onSelectionChanged() { sorter.sort(); @@ -145,13 +152,15 @@ public void onSelectionChanged() { curveSelectionLabel = new JLabel(trans.get("TCMotorSelPan.lbl.Selectthrustcurve")); panel.add(curveSelectionLabel); - curveSelectionModel = new DefaultComboBoxModel(); - curveSelectionBox = new JComboBox(curveSelectionModel); - curveSelectionBox.setRenderer(new CurveSelectionRenderer(curveSelectionBox.getRenderer())); + curveSelectionModel = new DefaultComboBoxModel<MotorHolder>(); + curveSelectionBox = new JComboBox<MotorHolder>(curveSelectionModel); + @SuppressWarnings("unchecked") + ListCellRenderer<MotorHolder> lcr = (ListCellRenderer<MotorHolder>) curveSelectionBox.getRenderer(); + curveSelectionBox.setRenderer(new CurveSelectionRenderer(lcr)); curveSelectionBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - Object value = curveSelectionBox.getSelectedItem(); + MotorHolder value = (MotorHolder)curveSelectionBox.getSelectedItem(); if (value != null) { select(((MotorHolder) value).getMotor()); } @@ -164,16 +173,16 @@ public void actionPerformed(ActionEvent e) { { panel.add(new JLabel(trans.get("TCMotorSelPan.lbl.Ejectionchargedelay"))); - delayBox = new JComboBox(); + delayBox = new JComboBox<String>(); delayBox.setEditable(true); delayBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - JComboBox cb = (JComboBox) e.getSource(); - String sel = (String) cb.getSelectedItem(); + + String sel = (String) delayBox.getSelectedItem(); //// None if (sel.equalsIgnoreCase(trans.get("TCMotorSelPan.equalsIgnoreCase.None"))) { - selectedDelay = Motor.PLUGGED; + selectedDelay = Motor.PLUGGED_DELAY; } else { try { selectedDelay = Double.parseDouble(sel); @@ -203,6 +212,22 @@ public void actionPerformed(ActionEvent e) { }); panel.add(hideSimilarBox, "gapleft para, spanx, growx, wrap"); } + + //// Hide unavailable motors + { + hideUnavailableBox = new JCheckBox(trans.get("TCMotorSelPan.checkbox.hideUnavailable")); + GUIUtil.changeFontSize(hideUnavailableBox, -1); + hideUnavailableBox.setSelected(Application.getPreferences().getBoolean(net.sf.openrocket.startup.Preferences.MOTOR_HIDE_UNAVAILABLE, true)); + hideUnavailableBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Application.getPreferences().putBoolean(net.sf.openrocket.startup.Preferences.MOTOR_HIDE_UNAVAILABLE, hideUnavailableBox.isSelected()); + motorFilterPanel.setHideUnavailable(hideUnavailableBox.isSelected()); + } + }); + panel.add(hideUnavailableBox, "gapleft para, spanx, growx, wrap"); + + } //// Motor selection table { @@ -309,18 +334,24 @@ private void update() { } - public void setMotorMountAndConfig( MotorMount mount, String currentConfig ) { + public void setMotorMountAndConfig( final FlightConfigurationId _fcid, MotorMount mountToEdit ) { + if ( null == _fcid ){ + throw new NullPointerException(" attempted to set mount with a null FCID. bug. "); + }else if ( null == mountToEdit ){ + throw new NullPointerException(" attempted to set mount with a null mount. bug. "); + } + motorFilterPanel.setMotorMount(mountToEdit); + + MotorConfiguration curMotorInstance = mountToEdit.getMotorConfig(_fcid); selectedMotor = null; selectedMotorSet = null; selectedDelay = 0; - ThrustCurveMotor motorToSelect = null; - if (currentConfig != null && mount != null) { - MotorConfiguration motorConf = mount.getMotorConfiguration().get(currentConfig); - motorToSelect = (ThrustCurveMotor) motorConf.getMotor(); - selectedDelay = motorConf.getEjectionDelay(); + if ( curMotorInstance.hasMotor()){ + motorToSelect = (ThrustCurveMotor) curMotorInstance.getMotor(); + selectedDelay = curMotorInstance.getEjectionDelay(); } - + // If current motor is not found in db, add a new ThrustCurveMotorSet containing it if (motorToSelect != null) { ThrustCurveMotorSet motorSetToSelect = null; @@ -332,13 +363,12 @@ public void setMotorMountAndConfig( MotorMount mount, String currentConfig ) { database.add(extra); Collections.sort(database); } - } + + select(motorToSelect); - select(motorToSelect); - - motorFilterPanel.setMotorMount(mount); + } + motorFilterPanel.setMotorMount(mountToEdit); scrollSelectionVisible(); - } @Override @@ -547,7 +577,7 @@ private void setDelays(boolean reset) { if (selectedMotor == null) { //// None - delayBox.setModel(new DefaultComboBoxModel(new String[] { trans.get("TCMotorSelPan.delayBox.None") })); + delayBox.setModel(new DefaultComboBoxModel<String>(new String[] { trans.get("TCMotorSelPan.delayBox.None") })); delayBox.setSelectedIndex(0); } else { @@ -560,7 +590,7 @@ private void setDelays(boolean reset) { //// None delayStrings[i] = ThrustCurveMotor.getDelayString(delays.get(i), trans.get("TCMotorSelPan.delayBox.None")); } - delayBox.setModel(new DefaultComboBoxModel(delayStrings)); + delayBox.setModel(new DefaultComboBoxModel<String>(delayStrings)); if (reset) { @@ -594,16 +624,16 @@ private void setDelays(boolean reset) { ////////////////////// - private class CurveSelectionRenderer implements ListCellRenderer { + private class CurveSelectionRenderer implements ListCellRenderer<MotorHolder> { - private final ListCellRenderer renderer; + private final ListCellRenderer<MotorHolder> renderer; - public CurveSelectionRenderer(ListCellRenderer renderer) { + public CurveSelectionRenderer(ListCellRenderer<MotorHolder> renderer) { this.renderer = renderer; } @Override - public Component getListCellRendererComponent(JList list, Object value, int index, + public Component getListCellRendererComponent(JList<? extends MotorHolder> list, MotorHolder value, int index, boolean isSelected, boolean cellHasFocus) { Component c = renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java index a8f1169e3b..14cda1d8d9 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java @@ -11,7 +11,6 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Writer; -import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -20,6 +19,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; @@ -54,6 +54,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.itextpdf.text.Font; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; @@ -86,6 +88,7 @@ import net.sf.openrocket.optimization.rocketoptimization.goals.MinimizationGoal; import net.sf.openrocket.optimization.rocketoptimization.goals.ValueSeekGoal; import net.sf.openrocket.optimization.services.OptimizationServiceHelper; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; @@ -98,19 +101,16 @@ import net.sf.openrocket.util.Named; import net.sf.openrocket.util.TextUtil; -import com.itextpdf.text.Font; - /** * General rocket optimization dialog. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class GeneralOptimizationDialog extends JDialog { + private static final long serialVersionUID = -355058777898063291L; private static final Logger log = LoggerFactory.getLogger(GeneralOptimizationDialog.class); private static final Translator trans = Application.getTranslator(); - - private static final Collator collator = Collator.getInstance(); - + private static final String GOAL_MAXIMIZE = trans.get("goal.maximize"); private static final String GOAL_MINIMIZE = trans.get("goal.minimize"); private static final String GOAL_SEEK = trans.get("goal.seek"); @@ -138,10 +138,10 @@ public class GeneralOptimizationDialog extends JDialog { private final DescriptionArea selectedModifierDescription; private final SimulationModifierTree availableModifierTree; - private final JComboBox simulationSelectionCombo; - private final JComboBox optimizationParameterCombo; + private final JComboBox<String> simulationSelectionCombo; + private final JComboBox<Named<OptimizableParameter>> optimizationParameterCombo; - private final JComboBox optimizationGoalCombo; + private final JComboBox<?> optimizationGoalCombo; private final JSpinner optimizationGoalSpinner; private final UnitSelector optimizationGoalUnitSelector; private final DoubleModel optimizationSeekValue; @@ -239,6 +239,11 @@ public void actionPerformed(ActionEvent e) { selectedModifierTable.setDefaultEditor(Double.class, new DoubleCellEditor()); selectedModifierTable.setDefaultEditor(Unit.class, new UnitCellEditor() { + /** + * + */ + private static final long serialVersionUID = -2316208862654205128L; + @Override protected UnitGroup getUnitGroup(Unit value, int row, int column) { return selectedModifiers.get(row).getUnitGroup(); @@ -373,7 +378,7 @@ public void mousePressed(MouseEvent e) { disableComponents.add(label); sub.add(label, ""); - simulationSelectionCombo = new JComboBox(); + simulationSelectionCombo = new JComboBox<String>(); simulationSelectionCombo.setToolTipText(tip); populateSimulations(); simulationSelectionCombo.addActionListener(clearHistoryActionListener); @@ -387,7 +392,7 @@ public void mousePressed(MouseEvent e) { disableComponents.add(label); sub.add(label, ""); - optimizationParameterCombo = new JComboBox(); + optimizationParameterCombo = new JComboBox<Named<OptimizableParameter>>(); optimizationParameterCombo.setToolTipText(tip); populateParameters(); optimizationParameterCombo.addActionListener(clearHistoryActionListener); @@ -401,7 +406,7 @@ public void mousePressed(MouseEvent e) { disableComponents.add(label); sub.add(label, ""); - optimizationGoalCombo = new JComboBox(new String[] { GOAL_MAXIMIZE, GOAL_MINIMIZE, GOAL_SEEK }); + optimizationGoalCombo = new JComboBox<String>(new String[] { GOAL_MAXIMIZE, GOAL_MINIMIZE, GOAL_SEEK }); optimizationGoalCombo.setToolTipText(tip); optimizationGoalCombo.setEditable(false); optimizationGoalCombo.addActionListener(clearHistoryActionListener); @@ -500,8 +505,7 @@ public void actionPerformed(ActionEvent e) { panel.add(sub, "span 2, grow, wrap para*2"); // // Rocket figure - figure = new RocketFigure(getSelectedSimulation().getConfiguration()); - figure.setBorderPixels(1, 1); + figure = new RocketFigure( getSelectedSimulation().getRocket() ); ScaleScrollPane figureScrollPane = new ScaleScrollPane(figure); figureScrollPane.setFitting(true); panel.add(figureScrollPane, "span, split, height 200lp, grow"); @@ -951,28 +955,30 @@ private void populateSimulations() { Rocket rocket = documentCopy.getRocket(); for (Simulation s : documentCopy.getSimulations()) { - String id = s.getConfiguration().getFlightConfigurationID(); + //FlightConfigurationID id = s.getConfiguration().getFlightConfigurationID(); + FlightConfigurationId id = new FlightConfigurationId( "stub id value - General Optimizer"); + String name = createSimulationName(s.getName(), descriptor.format(rocket, id)); simulations.add(new Named<Simulation>(s, name)); } - for (String id : rocket.getFlightConfigurationIDs()) { - if (id == null) { - continue; + for (FlightConfigurationId curId: rocket.getIds() ){ + if ( curId== null) { + // this is now *extremely* unlikely + throw new NullPointerException(" flightconfiguration has a null id... bug."); } + Simulation sim = new Simulation(rocket); - sim.getConfiguration().setFlightConfigurationID(id); - String name = createSimulationName(trans.get("basicSimulationName"), descriptor.format(rocket, id)); + String name = createSimulationName(trans.get("basicSimulationName"), descriptor.format(rocket, curId)); simulations.add(new Named<Simulation>(sim, name)); } Simulation sim = new Simulation(rocket); - sim.getConfiguration().setFlightConfigurationID(null); String name = createSimulationName(trans.get("noSimulationName"), descriptor.format(rocket, null)); simulations.add(new Named<Simulation>(sim, name)); - simulationSelectionCombo.setModel(new DefaultComboBoxModel(simulations.toArray())); + simulationSelectionCombo.setModel(new DefaultComboBoxModel<String>((String[])simulations.toArray())); simulationSelectionCombo.setSelectedIndex(0); if (current != null) { for (int i = 0; i < simulations.size(); i++) { @@ -994,12 +1000,12 @@ private void populateParameters() { current = trans.get("MaximumAltitudeParameter.name"); } - List<Named<OptimizableParameter>> parameters = new ArrayList<Named<OptimizableParameter>>(); + Vector<Named<OptimizableParameter>> parameters = new Vector<Named<OptimizableParameter>>(); for (OptimizableParameter p : optimizationParameters) { parameters.add(new Named<OptimizableParameter>(p, p.getName())); } - optimizationParameterCombo.setModel(new DefaultComboBoxModel(parameters.toArray())); + optimizationParameterCombo.setModel(new DefaultComboBoxModel<Named<OptimizableParameter>>( parameters )); for (int i = 0; i < parameters.size(); i++) { if (parameters.get(i).toString().equals(current)) { @@ -1158,10 +1164,7 @@ private void updateComponents() { } else { selectedModifierDescription.setText(""); } - - // Update the figure - figure.setConfiguration(getSelectedSimulation().getConfiguration()); - + updating = false; } @@ -1335,6 +1338,10 @@ private String createSimulationName(String simulationName, String motorConfigura */ private class ParameterSelectionTableModel extends AbstractTableModel { + /** + * + */ + private static final long serialVersionUID = -8724716503904686656L; private static final int PARAMETER = 0; private static final int CURRENT = 1; private static final int MIN = 2; @@ -1462,6 +1469,8 @@ public boolean isCellEditable(int row, int column) { } private class DoubleCellRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 448529130732718803L; + @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { @@ -1479,51 +1488,51 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole } - private static class SimulationModifierComparator implements Comparator<SimulationModifier> { - - @Override - public int compare(SimulationModifier mod1, SimulationModifier mod2) { - Object rel1 = mod1.getRelatedObject(); - Object rel2 = mod2.getRelatedObject(); - - /* - * Primarily order by related object: - * - * - RocketComponents first - * - Two RocketComponents are ordered based on their position in the rocket - */ - if (!rel1.equals(rel2)) { - - if (rel1 instanceof RocketComponent) { - if (rel2 instanceof RocketComponent) { - - RocketComponent root = ((RocketComponent) rel1).getRoot(); - for (RocketComponent c : root) { - if (c.equals(rel1)) { - return -1; - } - if (c.equals(rel2)) { - return 1; - } - } - - throw new BugException("Error sorting modifiers, mod1=" + mod1 + " rel1=" + rel1 + - " mod2=" + mod2 + " rel2=" + rel2); - - } else { - return -1; - } - } else { - if (rel2 instanceof RocketComponent) { - return 1; - } - } - - } - - // Secondarily sort by name - return collator.compare(mod1.getName(), mod2.getName()); - } - } +// private static class SimulationModifierComparator implements Comparator<SimulationModifier> { +// +// @Override +// public int compare(SimulationModifier mod1, SimulationModifier mod2) { +// Object rel1 = mod1.getRelatedObject(); +// Object rel2 = mod2.getRelatedObject(); +// +// /* +// * Primarily order by related object: +// * +// * - RocketComponents first +// * - Two RocketComponents are ordered based on their position in the rocket +// */ +// if (!rel1.equals(rel2)) { +// +// if (rel1 instanceof RocketComponent) { +// if (rel2 instanceof RocketComponent) { +// +// RocketComponent root = ((RocketComponent) rel1).getRoot(); +// for (RocketComponent c : root) { +// if (c.equals(rel1)) { +// return -1; +// } +// if (c.equals(rel2)) { +// return 1; +// } +// } +// +// throw new BugException("Error sorting modifiers, mod1=" + mod1 + " rel1=" + rel1 + +// " mod2=" + mod2 + " rel2=" + rel2); +// +// } else { +// return -1; +// } +// } else { +// if (rel2 instanceof RocketComponent) { +// return 1; +// } +// } +// +// } +// +// // Secondarily sort by name +// return collator.compare(mod1.getName(), mod2.getName()); +// } +// } } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java index c18c980601..f2657ca909 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java @@ -31,6 +31,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class SimulationModifierTree extends BasicTree { private final List<SimulationModifier> selectedModifiers; diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/DisplayPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/DisplayPreferencesPanel.java index e4883b49c8..a49def63a8 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/DisplayPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/DisplayPreferencesPanel.java @@ -13,6 +13,7 @@ * @author cpearls * */ +@SuppressWarnings("serial") public class DisplayPreferencesPanel extends PreferencesPanel { public DisplayPreferencesPanel() { super(new MigLayout("fillx")); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java index 43183f5376..b198b18853 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java @@ -40,6 +40,7 @@ import net.sf.openrocket.util.Named; import net.sf.openrocket.util.Utils; +@SuppressWarnings("serial") public class GeneralPreferencesPanel extends PreferencesPanel { public GeneralPreferencesPanel(JDialog parent) { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GraphicsPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GraphicsPreferencesPanel.java index c51c7b16a9..ad5b3e964a 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GraphicsPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GraphicsPreferencesPanel.java @@ -31,6 +31,7 @@ import com.itextpdf.text.Font; +@SuppressWarnings("serial") public class GraphicsPreferencesPanel extends PreferencesPanel { public GraphicsPreferencesPanel(JDialog parent) { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/MaterialEditPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/MaterialEditPanel.java index e3b1d1278f..7225c04aa7 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/MaterialEditPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/MaterialEditPanel.java @@ -34,6 +34,7 @@ import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.unit.Value; +@SuppressWarnings("serial") public class MaterialEditPanel extends JPanel { private final JTable table; diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesPanel.java index 4b92bcd1ef..baae04b163 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesPanel.java @@ -19,6 +19,7 @@ import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; +@SuppressWarnings("serial") public abstract class PreferencesPanel extends JPanel { protected static final Logger log = LoggerFactory.getLogger(PreferencesDialog.class); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java index d6005ba7fd..5527e4ce5f 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/SimulationPreferencesPanel.java @@ -1,6 +1,5 @@ package net.sf.openrocket.gui.dialogs.preferences; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -9,30 +8,27 @@ import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; -import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JSpinner; -import javax.swing.ListCellRenderer; - import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.SpinnerEditor; import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.gui.adaptors.EnumModel; import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.UnitSelector; -import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.simulation.RK4SimulationStepper; -import net.sf.openrocket.simulation.listeners.SimulationListener; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.GeodeticComputationStrategy; public class SimulationPreferencesPanel extends PreferencesPanel { - + private static final long serialVersionUID = 7983195730016979888L; + /* * private GeodeticComputationStrategy geodeticComputation = * GeodeticComputationStrategy.SPHERICAL; */ + public SimulationPreferencesPanel() { super(new MigLayout("fill")); @@ -62,7 +58,7 @@ public void actionPerformed(ActionEvent e) { }); this.add(automaticallyRunSimsBox, "wrap, growx, sg combos "); - GeodeticComputationStrategy geodeticComputation = GeodeticComputationStrategy.SPHERICAL; + //GeodeticComputationStrategy geodeticComputation = GeodeticComputationStrategy.SPHERICAL; JPanel sub, subsub; String tip; @@ -112,7 +108,7 @@ public void actionPerformed(ActionEvent e) { EnumModel<GeodeticComputationStrategy> gcsModel = new EnumModel<GeodeticComputationStrategy>( preferences, "GeodeticComputation"); - final JComboBox gcsCombo = new JComboBox(gcsModel); + final JComboBox<GeodeticComputationStrategy> gcsCombo = new JComboBox<GeodeticComputationStrategy>(gcsModel); ActionListener gcsTTipListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -233,47 +229,47 @@ public void actionPerformed(ActionEvent e) { */ } - private class ListenerCellRenderer extends JLabel implements - ListCellRenderer { - - @Override - public Component getListCellRendererComponent(JList list, Object value, - int index, boolean isSelected, boolean cellHasFocus) { - String s = value.toString(); - setText(s); - - // Attempt instantiating, catch any exceptions - Exception ex = null; - try { - Class<?> c = Class.forName(s); - @SuppressWarnings("unused") - SimulationListener l = (SimulationListener) c.newInstance(); - } catch (Exception e) { - ex = e; - } - - if (ex == null) { - setIcon(Icons.SIMULATION_LISTENER_OK); - // // Listener instantiated successfully. - setToolTipText("Listener instantiated successfully."); - } else { - setIcon(Icons.SIMULATION_LISTENER_ERROR); - // // <html>Unable to instantiate listener due to exception:<br> - setToolTipText("<html>Unable to instantiate listener due to exception:<br>" - + ex.toString()); - } - - if (isSelected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - setOpaque(true); - return this; - } - } +// private class ListenerCellRenderer extends JLabel implements +// ListCellRenderer { +// +// @Override +// public Component getListCellRendererComponent(JList list, Object value, +// int index, boolean isSelected, boolean cellHasFocus) { +// String s = value.toString(); +// setText(s); +// +// // Attempt instantiating, catch any exceptions +// Exception ex = null; +// try { +// Class<?> c = Class.forName(s); +// @SuppressWarnings("unused") +// SimulationListener l = (SimulationListener) c.newInstance(); +// } catch (Exception e) { +// ex = e; +// } +// +// if (ex == null) { +// setIcon(Icons.SIMULATION_LISTENER_OK); +// // // Listener instantiated successfully. +// setToolTipText("Listener instantiated successfully."); +// } else { +// setIcon(Icons.SIMULATION_LISTENER_ERROR); +// // // <html>Unable to instantiate listener due to exception:<br> +// setToolTipText("<html>Unable to instantiate listener due to exception:<br>" +// + ex.toString()); +// } +// +// if (isSelected) { +// setBackground(list.getSelectionBackground()); +// setForeground(list.getSelectionForeground()); +// } else { +// setBackground(list.getBackground()); +// setForeground(list.getForeground()); +// } +// setOpaque(true); +// return this; +// } +// } /* * private class ListenerListModel extends AbstractListModel { diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java index 9cf2be02ba..31b16d9565 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -37,6 +37,7 @@ /** * Dialog shown for selecting a preset component. */ +@SuppressWarnings("serial") public class ComponentPresetChooserDialog extends JDialog { private static final Translator trans = Application.getTranslator(); @@ -105,7 +106,7 @@ public ComponentPresetChooserDialog(Window owner, RocketComponent component) { sub.add(filterLabel, "gapright para"); filterText = new JTextField(); - sub.add(filterText, "growx"); + sub.add(filterText, "width 50:320, growx"); filterText.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { @@ -173,7 +174,7 @@ public void actionPerformed(ActionEvent e) { private JPanel getFilterCheckboxes() { SymmetricComponent sc; - JPanel panel = new JPanel(new MigLayout("fill, ins 0")); + JPanel panel = new JPanel(new MigLayout("ins 0")); /* * Add show all compatible check box. diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java index 5731917505..5a3be9ed58 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTable.java @@ -33,6 +33,7 @@ import net.sf.openrocket.unit.Value; import net.sf.openrocket.util.AlphanumComparator; +@SuppressWarnings("serial") public class ComponentPresetTable extends JTable { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTableColumn.java b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTableColumn.java index 5d5d12d6a5..6bf137b286 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTableColumn.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetTableColumn.java @@ -12,6 +12,7 @@ import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.unit.Value; +@SuppressWarnings("serial") public abstract class ComponentPresetTableColumn extends TableColumn { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/FigureRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/FigureRenderer.java index 61e0dc9937..2a3adc9c88 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/FigureRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/FigureRenderer.java @@ -8,6 +8,7 @@ import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.fixedfunc.GLLightingFunc; +import net.sf.openrocket.gui.figure3d.geometry.Geometry; import net.sf.openrocket.gui.figure3d.geometry.Geometry.Surface; import net.sf.openrocket.motor.Motor; import net.sf.openrocket.rocketcomponent.BodyTube; @@ -51,13 +52,6 @@ public void init(GLAutoDrawable drawable) { gl.glEnable(GLLightingFunc.GL_NORMALIZE); } - - - @Override - public boolean isDrawn(RocketComponent c) { - return true; - } - @Override public boolean isDrawnTransparent(RocketComponent c) { if (c instanceof BodyTube) @@ -78,8 +72,8 @@ public boolean isDrawnTransparent(RocketComponent c) { private static final HashMap<Class<?>, Color> defaultColorCache = new HashMap<Class<?>, Color>(); @Override - public void renderComponent(GL2 gl, RocketComponent c, float alpha) { - + public void renderComponent(GL2 gl, Geometry geom, float alpha) { + RocketComponent c = geom.getComponent(); gl.glLightModeli(GL2ES1.GL_LIGHT_MODEL_TWO_SIDE, 1); Color figureColor = c.getColor(); if (figureColor == null) { @@ -100,9 +94,9 @@ public void renderComponent(GL2 gl, RocketComponent c, float alpha) { gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, color, 0); gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, color, 0); - cr.getGeometry(c, Surface.INSIDE).render(gl); + geom.render(gl,Surface.INSIDE); - //OUtside + //Outside // Set up the front A&D color convertColor(figureColor, color); color[3] = alpha; @@ -120,8 +114,8 @@ public void renderComponent(GL2 gl, RocketComponent c, float alpha) { gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, color, 0); gl.glMateriali(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, getShine(c)); - cr.getGeometry(c, Surface.OUTSIDE).render(gl); - cr.getGeometry(c, Surface.EDGES).render(gl); + geom.render(gl, Surface.OUTSIDE); + geom.render(gl, Surface.EDGES); color[0] = color[1] = color[2] = 0; gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_SPECULAR, color, 0); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java index 363c36e2bd..f842e4ba19 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java @@ -74,11 +74,6 @@ public void dispose(GLAutoDrawable drawable) { textures.dispose(drawable); } - @Override - public boolean isDrawn(RocketComponent c) { - return true; - } - @Override public boolean isDrawnTransparent(RocketComponent c) { // if there is any degree of transparency, then... @@ -90,30 +85,31 @@ public boolean isDrawnTransparent(RocketComponent c) { @Override protected void renderMotor(final GL2 gl, final Motor motor) { - render(gl, cr.getGeometry(motor, Surface.OUTSIDE), DefaultAppearance.getDefaultAppearance(motor), true, 1); + render(gl, cr.getMotorGeometry(motor), Surface.OUTSIDE, DefaultAppearance.getDefaultAppearance(motor), true, 1); } @Override - public void renderComponent(final GL2 gl, final RocketComponent c, final float alpha) { - if (isDrawnTransparent(c)){ + public void renderComponent(final GL2 gl, Geometry geom, final float alpha) { + Appearance app = getAppearance( geom.getComponent() ); + if (app.getPaint().getAlpha()<255){ // if transparent, draw inside the same as the outside so we dont get a cardboard interior on a clear payload bay - render(gl, cr.getGeometry(c, Surface.INSIDE), getAppearance(c), true, alpha); + render(gl, geom, Surface.INSIDE, app, true, alpha); }else{ - render(gl, cr.getGeometry(c, Surface.INSIDE), DefaultAppearance.getDefaultAppearance(c), true, 1.0f); + render(gl, geom, Surface.INSIDE, DefaultAppearance.getDefaultAppearance(geom.getComponent()), true, 1.0f); } - render(gl, cr.getGeometry(c, Surface.OUTSIDE), getAppearance(c), true, alpha); - render(gl, cr.getGeometry(c, Surface.EDGES), getAppearance(c), false, alpha); + render(gl, geom, Surface.OUTSIDE, app, true, alpha); + render(gl, geom, Surface.EDGES, app, false, alpha); } - private void render(GL2 gl, Geometry g, Appearance a, boolean decals, float alpha) { + private void render(GL2 gl, Geometry g, Surface which, Appearance a, boolean decals, float alpha) { final Decal t = a.getTexture(); final Texture tex = textures.getTexture(t); gl.glLightModeli(GL2.GL_LIGHT_MODEL_COLOR_CONTROL, GL2.GL_SEPARATE_SPECULAR_COLOR); - convertColor(a.getPaint(), color);//color now contains alpha value - + convertColor(a.getPaint(), color); + color[3] = alpha;//re-set to "alpha" so that Unfinished renderer will show interior parts. gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, color, 0); gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, color, 0); @@ -123,7 +119,7 @@ private void render(GL2 gl, Geometry g, Appearance a, boolean decals, float alph gl.glMateriali(GL.GL_FRONT, GLLightingFunc.GL_SHININESS, (int) (100 * a.getShine())); - g.render(gl); + g.render(gl,which); if (decals && t != null && tex != null) { @@ -161,7 +157,7 @@ private void render(GL2 gl, Geometry g, Appearance a, boolean decals, float alph gl.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotrophy); } - g.render(gl); + g.render(gl,which); if (t.getEdgeMode() == Decal.EdgeMode.STICKER) { gl.glDepthFunc(GL.GL_LESS); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java b/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java index fd2e9eac6b..8b01b734ed 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/RocketFigure3d.java @@ -34,31 +34,32 @@ import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.jogamp.opengl.util.awt.Overlay; + import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.figureelements.CGCaret; import net.sf.openrocket.gui.figureelements.CPCaret; import net.sf.openrocket.gui.figureelements.FigureElement; import net.sf.openrocket.gui.main.Splash; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.jogamp.opengl.util.awt.Overlay; - /* * @author Bill Kuker <bkuker@billkuker.com> */ public class RocketFigure3d extends JPanel implements GLEventListener { - public static final int TYPE_FIGURE = 0; - public static final int TYPE_UNFINISHED = 1; - public static final int TYPE_FINISHED = 2; + public static final int TYPE_FIGURE = 2; + public static final int TYPE_UNFINISHED = 3; + public static final int TYPE_FINISHED = 4; private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(RocketFigure3d.class); @@ -74,7 +75,7 @@ public class RocketFigure3d extends JPanel implements GLEventListener { private static final int CARET_SIZE = 20; private final OpenRocketDocument document; - private final Configuration configuration; + private final Rocket rkt; private Component canvas; @@ -95,9 +96,9 @@ public class RocketFigure3d extends JPanel implements GLEventListener { RocketRenderer rr = new FigureRenderer(); - public RocketFigure3d(final OpenRocketDocument document, final Configuration config) { + public RocketFigure3d(final OpenRocketDocument document) { this.document = document; - this.configuration = config; + this.rkt = document.getRocket(); this.setLayout(new BorderLayout()); //Only initizlize GL if 3d is enabled. @@ -292,8 +293,10 @@ public void display(final GLAutoDrawable drawable) { setupView(gl, glu); + final FlightConfiguration configuration = rkt.getSelectedConfiguration(); if (pickPoint != null) { gl.glDisable(GLLightingFunc.GL_LIGHTING); + final RocketComponent picked = rr.pick(drawable, configuration, pickPoint, pickEvent.isShiftDown() ? selection : null); if (csl != null) { @@ -485,6 +488,7 @@ private Bounds calculateBounds() { return cachedBounds; } else { final Bounds b = new Bounds(); + final FlightConfiguration configuration = rkt.getSelectedConfiguration(); final Collection<Coordinate> bounds = configuration.getBounds(); for (Coordinate c : bounds) { b.xMax = Math.max(b.xMax, c.x); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java index 413cf0961c..d4f6f54eae 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java @@ -2,7 +2,9 @@ import java.awt.Point; import java.nio.ByteBuffer; -import java.util.Iterator; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; import java.util.Set; import java.util.Vector; @@ -12,20 +14,26 @@ import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.fixedfunc.GLLightingFunc; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.gui.figure3d.geometry.ComponentRenderer; import net.sf.openrocket.gui.figure3d.geometry.DisplayListComponentRenderer; +import net.sf.openrocket.gui.figure3d.geometry.Geometry; import net.sf.openrocket.gui.figure3d.geometry.Geometry.Surface; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.InstanceContext; +import net.sf.openrocket.rocketcomponent.InstanceMap; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import net.sf.openrocket.util.Transformation; /* * @author Bill Kuker <bkuker@billkuker.com> + * @author Daniel Williams <equipoise@gmail.com> */ public abstract class RocketRenderer { protected static final Logger log = LoggerFactory.getLogger(RocketRenderer.class); @@ -46,15 +54,13 @@ public void updateFigure(GLAutoDrawable drawable) { cr.updateFigure(drawable); } - public abstract void renderComponent(GL2 gl, RocketComponent c, float alpha); - - public abstract boolean isDrawn(RocketComponent c); - + public abstract void renderComponent(GL2 gl, Geometry geom, float alpha); + public abstract boolean isDrawnTransparent(RocketComponent c); public abstract void flushTextureCache(GLAutoDrawable drawable); - public RocketComponent pick(GLAutoDrawable drawable, Configuration configuration, Point p, + public RocketComponent pick(GLAutoDrawable drawable, FlightConfiguration configuration, Point p, Set<RocketComponent> ignore) { final GL2 gl = drawable.getGL().getGL2(); gl.glEnable(GL.GL_DEPTH_TEST); @@ -62,7 +68,7 @@ public RocketComponent pick(GLAutoDrawable drawable, Configuration configuration // Store a vector of pickable parts. final Vector<RocketComponent> pickParts = new Vector<RocketComponent>(); - for (RocketComponent c : configuration) { + for (RocketComponent c : configuration.getActiveComponents()) { if (ignore != null && ignore.contains(c)) continue; @@ -75,9 +81,9 @@ public RocketComponent pick(GLAutoDrawable drawable, Configuration configuration pickParts.add(c); if (isDrawnTransparent(c)) { - cr.getGeometry(c, Surface.INSIDE).render(gl); + cr.getComponentGeometry(c).render(gl, Surface.INSIDE); } else { - cr.getGeometry(c, Surface.ALL).render(gl); + cr.getComponentGeometry(c).render(gl, Surface.ALL); } } @@ -99,11 +105,14 @@ public RocketComponent pick(GLAutoDrawable drawable, Configuration configuration return pickParts.get(pickIndex); } - public void render(GLAutoDrawable drawable, Configuration configuration, Set<RocketComponent> selection) { + public void render(GLAutoDrawable drawable, FlightConfiguration configuration, Set<RocketComponent> selection) { if (cr == null) throw new IllegalStateException(this + " Not Initialized"); + + Collection<Geometry> geometry = getTreeGeometry( configuration); + GL2 gl = drawable.getGL().getGL2(); gl.glEnable(GL.GL_DEPTH_TEST); // enables depth testing @@ -116,19 +125,20 @@ public void render(GLAutoDrawable drawable, Configuration configuration, Set<Roc gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GLLightingFunc.GL_SPECULAR, colorBlack, 0); gl.glLineWidth(5.0f); - for (RocketComponent c : configuration) { - if (selection.contains(c)) { + for (Geometry geom : geometry) { + RocketComponent rc = geom.getComponent(); + if (selection.contains( rc)) { // Draw as lines, set Z to nearest gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_LINE); gl.glDepthRange(0, 0); - cr.getGeometry(c, Surface.ALL).render(gl); + geom.render(gl, Surface.ALL); // Draw polygons, always passing depth test, // setting Z to farthest gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_FILL); gl.glDepthRange(1, 1); gl.glDepthFunc(GL.GL_ALWAYS); - cr.getGeometry(c, Surface.ALL).render(gl); + geom.render(gl, Surface.ALL); gl.glDepthFunc(GL.GL_LESS); gl.glDepthRange(0, 1); } @@ -139,54 +149,114 @@ public void render(GLAutoDrawable drawable, Configuration configuration, Set<Roc gl.glEnable(GL.GL_CULL_FACE); gl.glCullFace(GL.GL_BACK); + gl.glEnable( GL.GL_BLEND ); + + // needs to be rendered before the components + renderMotors(gl, configuration); + + // render all components + renderTree( gl, geometry ); - // Draw all inner components - for (RocketComponent c : configuration) { - if (isDrawn(c)) { - if (!isDrawnTransparent(c)) { - renderComponent(gl, c, 1.0f); - } - } - } - - renderMotors(gl, configuration); - - // Draw T&T front faces blended, without depth test - gl.glEnable(GL.GL_BLEND); - for (RocketComponent c : configuration) { - if (isDrawn(c)) { - if (isDrawnTransparent(c)) { - renderComponent(gl, c, 0.2f); - } + gl.glDisable( GL.GL_BLEND ); + } + + private Collection<Geometry> getTreeGeometry( FlightConfiguration config){ + System.err.println(String.format("==== Building tree geometry ====")); + + // input + final InstanceMap imap = config.getActiveInstances(); + + // output buffer + final Collection<Geometry> treeGeometry = new ArrayList<Geometry>(); + + for(Map.Entry<RocketComponent, ArrayList<InstanceContext>> entry: imap.entrySet() ) { + final RocketComponent comp = entry.getKey(); + + final ArrayList<InstanceContext> contextList = entry.getValue(); + System.err.println(String.format("....[%s]", comp.getName())); + + for(InstanceContext context: contextList ) { + System.err.println(String.format("........[% 2d] %s", context.instanceNumber, context.getLocation().toPreciseString())); + +// System.err.println( String.format("%s[ %s ]", indent, comp.getName())); +// System.err.println( String.format("%s :: %12.8g / %12.8g / %12.8g (m) @ %8.4g (rads) ", indent, currentLocation.x, currentLocation.y, currentLocation.z, currentAngle )); + + Geometry instanceGeometry = cr.getComponentGeometry( comp, context.transform ); + instanceGeometry.active = context.active; + treeGeometry.add( instanceGeometry ); } - } - gl.glDisable(GL.GL_BLEND); - + } + return treeGeometry; } - private void renderMotors(GL2 gl, Configuration configuration) { - String motorID = configuration.getFlightConfigurationID(); - Iterator<MotorMount> iterator = configuration.motorIterator(); - while (iterator.hasNext()) { - MotorMount mount = iterator.next(); - Motor motor = mount.getMotorConfiguration().get(motorID).getMotor(); - double length = motor.getLength(); + private void renderTree( GL2 gl, final Collection<Geometry> geometryList){ + //cycle through opaque components first, then transparent to preserve proper depth testing + for(Geometry geom: geometryList ) { + if( geom.active ) { + //if not transparent + if( !isDrawnTransparent( (RocketComponent)geom.obj) ){ + renderComponent(gl, geom, 1.0f); + } + } + } + for(Geometry geom: geometryList ) { + if( geom.active ) { + if( isDrawnTransparent( (RocketComponent)geom.obj) ){ + // Draw T&T front faces blended, without depth test + renderComponent(gl, geom, 0.2f); + } + } + } + } + + private void renderMotors(GL2 gl, FlightConfiguration configuration) { +// FlightConfigurationId motorID = configuration.getFlightConfigurationID(); +// +// for( RocketComponent comp : configuration.getActiveComponents()){ +// if( comp instanceof MotorMount){ +// +// MotorMount mount = (MotorMount) comp; +// Motor motor = mount.getMotorInstance(motorID).getMotor(); +// if( null == motor )???; +// double length = motor.getLength(); +// +// Coordinate[] position = ((RocketComponent) mount).toAbsolute(new Coordinate(((RocketComponent) mount) +// .getLength() + mount.getMotorOverhang() - length)); +// +// for (int i = 0; i < position.length; i++) { +// gl.glPushMatrix(); +// gl.glTranslated(position[i].x, position[i].y, position[i].z); +// renderMotor(gl, motor); +// gl.glPopMatrix(); +// } +// } +// } + + for( MotorConfiguration curMotor : configuration.getActiveMotors()){ + MotorMount mount = curMotor.getMount(); + Motor motor = curMotor.getMotor(); + + if( null == motor ){ + throw new NullPointerException(" null motor from configuration.getActiveMotors... this is a bug."); + } + double length = motor.getLength(); + Coordinate[] position = ((RocketComponent) mount).toAbsolute(new Coordinate(((RocketComponent) mount) .getLength() + mount.getMotorOverhang() - length)); - + for (int i = 0; i < position.length; i++) { gl.glPushMatrix(); gl.glTranslated(position[i].x, position[i].y, position[i].z); renderMotor(gl, motor); gl.glPopMatrix(); } + } - } protected void renderMotor(GL2 gl, Motor motor) { - cr.getGeometry(motor, Surface.ALL).render(gl); + cr.getMotorGeometry(motor).render(gl, Surface.ALL); } } diff --git a/swing/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java index 055cfc7a30..a0f44b54d2 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java @@ -7,24 +7,30 @@ import javax.media.opengl.glu.GLU; import javax.media.opengl.glu.GLUquadric; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.gui.figure3d.geometry.Geometry.Surface; import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.MassObject; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.PodSet; +import net.sf.openrocket.rocketcomponent.RailButton; import net.sf.openrocket.rocketcomponent.RingComponent; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.rocketcomponent.Transition.Shape; import net.sf.openrocket.rocketcomponent.TubeFinSet; import net.sf.openrocket.util.Coordinate; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import net.sf.openrocket.util.Transformation; /* * @author Bill Kuker <bkuker@billkuker.com> + * @author Daniel Williams <equipoise@gmail.com> */ public class ComponentRenderer { @SuppressWarnings("unused") @@ -51,65 +57,73 @@ public void updateFigure(GLAutoDrawable drawable) { } - public Geometry getGeometry(final RocketComponent c, final Surface which) { - return new Geometry() { + public Geometry getComponentGeometry(final RocketComponent comp) { + return getComponentGeometry(comp, Transformation.IDENTITY); + } + + public Geometry getComponentGeometry(final RocketComponent comp, final Transformation transform ) { + return new Geometry(comp, transform) { @Override - public void render(GL2 gl) { + public void render(GL2 gl, final Surface which) { + gl.glPushMatrix(); + + gl.glMultMatrixd( transform.getGLMatrix() ); + if (which == Surface.ALL) { - renderGeometry(gl, c, Surface.INSIDE); - renderGeometry(gl, c, Surface.EDGES); - renderGeometry(gl, c, Surface.OUTSIDE); + renderInstance(gl, comp, Surface.INSIDE); + renderInstance(gl, comp, Surface.EDGES); + renderInstance(gl, comp, Surface.OUTSIDE); } else { - renderGeometry(gl, c, which); + renderInstance(gl, comp, which); } + gl.glPopMatrix(); } }; } - public Geometry getGeometry(final Motor motor, Surface which) { - return new Geometry() { + public Geometry getMotorGeometry(final Motor motor) { + return new Geometry(motor, Transformation.IDENTITY) { @Override - public void render(GL2 gl) { + public void render(GL2 gl, final Surface which) { renderMotor(gl, motor); } }; } - protected void renderGeometry(GL2 gl, RocketComponent c, Surface which) { + protected void renderInstance(GL2 gl, RocketComponent c, Surface which) { if (glu == null) throw new IllegalStateException(this + " Not Initialized"); glu.gluQuadricNormals(q, GLU.GLU_SMOOTH); - Coordinate[] oo = c.toAbsolute(new Coordinate(0, 0, 0)); - - for (Coordinate o : oo) { - gl.glPushMatrix(); - - gl.glTranslated(o.x, o.y, o.z); - - if (c instanceof BodyTube) { - renderTube(gl, (BodyTube) c, which); - } else if (c instanceof LaunchLug) { - renderLug(gl, (LaunchLug) c, which); - } else if (c instanceof RingComponent) { - if (which == Surface.OUTSIDE) - renderRing(gl, (RingComponent) c); - } else if (c instanceof Transition) { - renderTransition(gl, (Transition) c, which); - } else if (c instanceof MassObject) { - if (which == Surface.OUTSIDE) - renderMassObject(gl, (MassObject) c); - } else if (c instanceof FinSet) { - if (which == Surface.OUTSIDE) - fr.renderFinSet(gl, (FinSet) c); - } else if (c instanceof TubeFinSet) { - renderTubeFins( gl, (TubeFinSet) c, which); - } else { - renderOther(gl, c); + if (c instanceof BodyTube) { + renderTube(gl, (BodyTube) c, which); + } else if (c instanceof LaunchLug) { + renderLug(gl, (LaunchLug) c, which); + } else if ( c instanceof RailButton ){ + renderRailButton(gl, (RailButton) c, which); + } else if (c instanceof RingComponent) { + if (which == Surface.OUTSIDE) + renderRing(gl, (RingComponent) c); + } else if (c instanceof Transition) { + renderTransition(gl, (Transition) c, which); + } else if (c instanceof MassObject) { + if (which == Surface.OUTSIDE) + renderMassObject(gl, (MassObject) c); + } else if (c instanceof FinSet) { + FinSet fins = (FinSet) c; + if (which == Surface.OUTSIDE) { + fr.renderFinSet(gl, fins); } - gl.glPopMatrix(); + } else if (c instanceof TubeFinSet) { + renderTubeFins( gl, (TubeFinSet) c, which); + } else if ( c instanceof AxialStage ) { + } else if ( c instanceof ParallelStage ) { + } else if ( c instanceof PodSet ) { + } else { + renderOther(gl, c); } + } @@ -268,7 +282,38 @@ private void renderRing(GL2 gl, RingComponent r) { private void renderLug(GL2 gl, LaunchLug t, Surface which) { renderTube(gl, which, t.getOuterRadius(), t.getInnerRadius(), t.getLength()); } + + private void renderRailButton(GL2 gl, RailButton r, Surface which) { + if ( which == Surface.OUTSIDE ){ + //renderOther(gl, r); + final double or = r.getOuterDiameter() / 2.0; + final double ir = r.getInnerDiameter() / 2.0; + gl.glRotated(r.getAngleOffset()*180/Math.PI -90 , 1, 0, 0); + + //Inner Diameter + glu.gluCylinder(q, ir, ir, r.getTotalHeight(), LOD, 1); + + //Bottom Disc + glu.gluCylinder(q, or, or, r.getBaseHeight(), LOD, 1); + glu.gluQuadricOrientation(q, GLU.GLU_INSIDE); + glu.gluDisk(q, 0, or, LOD, 2); + glu.gluQuadricOrientation(q, GLU.GLU_OUTSIDE); + gl.glTranslated(0,0,r.getBaseHeight()); + glu.gluDisk(q, 0, or, LOD, 2); + + + //Upper Disc + gl.glTranslated(0,0,r.getTotalHeight() - r.getFlangeHeight() * 2.0); + glu.gluCylinder(q, or, or, r.getFlangeHeight(), LOD, 1); + glu.gluQuadricOrientation(q, GLU.GLU_INSIDE); + glu.gluDisk(q, 0, or, LOD, 2); + glu.gluQuadricOrientation(q, GLU.GLU_OUTSIDE); + gl.glTranslated(0,0,r.getFlangeHeight()); + glu.gluDisk(q, 0, or, LOD, 2); + } + } + private void renderTubeFins(GL2 gl, TubeFinSet fs, Surface which) { gl.glPushMatrix(); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java index c27c81d95c..a274beb0d7 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java @@ -24,14 +24,14 @@ public void updateFigure(GLAutoDrawable drawable) { } @Override - protected void renderGeometry(GL2 gl, RocketComponent c, Surface which) { + protected void renderInstance(GL2 gl, RocketComponent c, Surface which) { Key k = new Key(c, which); if (lists.containsKey(k)) { gl.glCallList(lists.get(k)); } else { int list = gl.glGenLists(1); gl.glNewList(list, GL2.GL_COMPILE_AND_EXECUTE); - super.renderGeometry(gl, c, which); + super.renderInstance(gl, c, which); gl.glEndList(); lists.put(k, list); } diff --git a/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java index 783bdc1cf3..1f3f7557e6 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/geometry/FinRenderer.java @@ -11,45 +11,33 @@ import net.sf.openrocket.rocketcomponent.EllipticalFinSet; import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.util.BoundingBox; import net.sf.openrocket.util.Coordinate; public class FinRenderer { private GLUtessellator tobj = GLU.gluNewTess(); - public void renderFinSet(final GL2 gl, FinSet fs) { - - Coordinate finPoints[] = fs.getFinPointsWithTab(); - - double minX = Double.MAX_VALUE; - double minY = Double.MAX_VALUE; - double maxX = Double.MIN_VALUE; - double maxY = Double.MIN_VALUE; - - for (int i = 0; i < finPoints.length; i++) { - Coordinate c = finPoints[i]; - minX = Math.min(c.x, minX); - minY = Math.min(c.y, minY); - maxX = Math.max(c.x, maxX); - maxY = Math.max(c.y, maxY); - } + public void renderFinSet(final GL2 gl, FinSet finSet ) { + BoundingBox bounds = finSet.getBoundingBox(); gl.glMatrixMode(GL.GL_TEXTURE); gl.glPushMatrix(); - gl.glScaled(1 / (maxX - minX), 1 / (maxY - minY), 0); - gl.glTranslated(-minX, -minY - fs.getBodyRadius(), 0); + gl.glScaled(1 / (bounds.max.x - bounds.min.x), 1 / (bounds.max.y - bounds.min.y), 0); + gl.glTranslated(-bounds.min.x, -bounds.min.y - finSet.getBodyRadius(), 0); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); - - gl.glRotated(fs.getBaseRotation() * (180.0 / Math.PI), 1, 0, 0); - - for (int fin = 0; fin < fs.getFinCount(); fin++) { - - gl.glPushMatrix(); - - gl.glTranslated(fs.getLength() / 2, 0, 0); - gl.glRotated(fs.getCantAngle() * (180.0 / Math.PI), 0, 1, 0); - gl.glTranslated(-fs.getLength() / 2, 0, 0); - - GLUtessellatorCallback cb = new GLUtessellatorCallbackAdapter() { + + Coordinate finPoints[] = finSet.getFinPointsWithTab(); + { + gl.glPushMatrix(); + + gl.glTranslated(finSet.getLength() / 2, 0, 0); + + gl.glTranslated(0, - finSet.getBodyRadius(), 0); + + gl.glRotated( Math.toDegrees(finSet.getCantAngle()), 0, 1, 0); + gl.glTranslated(-finSet.getLength() / 2, 0, 0); + + GLUtessellatorCallback cb = new GLUtessellatorCallbackAdapter() { @Override public void vertex(Object vertexData) { double d[] = (double[]) vertexData; @@ -72,26 +60,28 @@ public void end() { GLU.gluTessCallback(tobj, GLU.GLU_TESS_BEGIN, cb); GLU.gluTessCallback(tobj, GLU.GLU_TESS_END, cb); + // fin side: +z GLU.gluTessBeginPolygon(tobj, null); GLU.gluTessBeginContour(tobj); gl.glNormal3f(0, 0, 1); for (int i = finPoints.length - 1; i >= 0; i--) { Coordinate c = finPoints[i]; - double[] p = new double[] { c.x, c.y + fs.getBodyRadius(), - c.z + fs.getThickness() / 2.0 }; + double[] p = new double[] { c.x, c.y + finSet.getBodyRadius(), + c.z + finSet.getThickness() / 2.0 }; GLU.gluTessVertex(tobj, p, 0, p); } GLU.gluTessEndContour(tobj); GLU.gluTessEndPolygon(tobj); + // fin side: -z GLU.gluTessBeginPolygon(tobj, null); GLU.gluTessBeginContour(tobj); gl.glNormal3f(0, 0, -1); for (int i = 0; i < finPoints.length; i++) { Coordinate c = finPoints[i]; - double[] p = new double[] { c.x, c.y + fs.getBodyRadius(), - c.z - fs.getThickness() / 2.0 }; + double[] p = new double[] { c.x, c.y + finSet.getBodyRadius(), + c.z - finSet.getThickness() / 2.0 }; GLU.gluTessVertex(tobj, p, 0, p); } @@ -99,7 +89,7 @@ public void end() { GLU.gluTessEndPolygon(tobj); // Strip around the edge - if (!(fs instanceof EllipticalFinSet)) + if (!(finSet instanceof EllipticalFinSet)) gl.glShadeModel(GLLightingFunc.GL_FLAT); gl.glBegin(GL.GL_TRIANGLE_STRIP); for (int i = 0; i <= finPoints.length; i++) { @@ -109,19 +99,17 @@ public void end() { % finPoints.length]; gl.glNormal3d(c2.y - c.y, c.x - c2.x, 0); // } - gl.glTexCoord2d(c.x, c.y + fs.getBodyRadius()); - gl.glVertex3d(c.x, c.y + fs.getBodyRadius(), - c.z - fs.getThickness() / 2.0); - gl.glVertex3d(c.x, c.y + fs.getBodyRadius(), - c.z + fs.getThickness() / 2.0); + gl.glTexCoord2d(c.x, c.y + finSet.getBodyRadius()); + gl.glVertex3d(c.x, c.y + finSet.getBodyRadius(), + c.z - finSet.getThickness() / 2.0); + gl.glVertex3d(c.x, c.y + finSet.getBodyRadius(), + c.z + finSet.getThickness() / 2.0); } gl.glEnd(); - if (!(fs instanceof EllipticalFinSet)) + if (!(finSet instanceof EllipticalFinSet)) gl.glShadeModel(GLLightingFunc.GL_SMOOTH); gl.glPopMatrix(); - - gl.glRotated(360.0 / fs.getFinCount(), 1, 0, 0); } gl.glMatrixMode(GL.GL_TEXTURE); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/geometry/Geometry.java b/swing/src/net/sf/openrocket/gui/figure3d/geometry/Geometry.java index f67e224625..2946f7704c 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/geometry/Geometry.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/geometry/Geometry.java @@ -1,11 +1,56 @@ + package net.sf.openrocket.gui.figure3d.geometry; +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.util.Transformation; + import javax.media.opengl.GL2; -public interface Geometry { - public static enum Surface { - ALL, OUTSIDE, INSIDE, EDGES; + +/* + * @author Daniel Williams <equipoise@gmail.com> + */ +public abstract class Geometry { + public static enum Surface { + ALL, OUTSIDE, INSIDE, EDGES; + } + + public static final Geometry EMPTY = new Geometry(){ + @Override + public void render(GL2 Gl, Surface which){} + }; + + public final Object obj; + public final Transformation transform; + + public boolean active; + + public abstract void render(GL2 gl, Surface which ); + + private Geometry() { + // seriously, don't call this. + this.obj = null; + this.transform = null; } - public void render(GL2 gl); + public Geometry( Rocket rocket ) { + this.obj = rocket; + this.transform = Transformation.IDENTITY; + } + + public Geometry( RocketComponent component, Transformation transform) { + this.obj = component; + this.transform = transform; + } + + public Geometry( Motor motor, Transformation transform ) { + this.obj = motor; + this.transform = transform; + } + + public RocketComponent getComponent() { + return (RocketComponent)this.obj; + } } diff --git a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java index e6bba6cdae..7cc1caacd0 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java @@ -206,7 +206,7 @@ public void run() { menu = new JMenu(trans.get("main.menu.edit")); menu.setMnemonic(KeyEvent.VK_E); // // Rocket editing - menu.getAccessibleContext().setAccessibleDescription(trans.get("BasicFrame.menu.Rocketedt")); + menu.getAccessibleContext().setAccessibleDescription(trans.get("PhotoFrame.menu.edit.unk")); menubar.add(menu); Action action = new AbstractAction(trans.get("PhotoFrame.menu.edit.copy")) { diff --git a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoPanel.java b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoPanel.java index 279bee3595..7e92db8b48 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoPanel.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoPanel.java @@ -14,7 +14,6 @@ import java.util.List; import java.util.Vector; -import javax.media.opengl.DebugGL2; import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; @@ -32,6 +31,11 @@ import javax.swing.JPopupMenu; import javax.swing.event.MouseInputAdapter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.jogamp.opengl.util.awt.AWTGLReadBufferUtil; + import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.events.DocumentChangeEvent; import net.sf.openrocket.document.events.DocumentChangeListener; @@ -41,10 +45,11 @@ import net.sf.openrocket.gui.figure3d.photo.exhaust.FlameRenderer; import net.sf.openrocket.gui.main.Splash; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.util.Color; @@ -52,11 +57,6 @@ import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.StateChangeListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.jogamp.opengl.util.awt.AWTGLReadBufferUtil; - public class PhotoPanel extends JPanel implements GLEventListener { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(PhotoPanel.class); @@ -67,7 +67,7 @@ public class PhotoPanel extends JPanel implements GLEventListener { JPopupMenu.setDefaultLightWeightPopupEnabled(false); } - private Configuration configuration; + private FlightConfiguration configuration; private Component canvas; private TextureCache textureCache = new TextureCache(); private double ratio; @@ -91,21 +91,11 @@ void setDoc(final OpenRocketDocument doc) { ((GLAutoDrawable) canvas).invoke(false, new GLRunnable() { @Override public boolean run(final GLAutoDrawable drawable) { - PhotoPanel.this.configuration = doc.getDefaultConfiguration(); + PhotoPanel.this.configuration = doc.getSelectedConfiguration(); cachedBounds = null; rr = new RealisticRenderer(doc); rr.init(drawable); - doc.getDefaultConfiguration().addChangeListener( - new StateChangeListener() { - @Override - public void stateChanged(EventObject e) { - log.debug("Repainting on config state change"); - needUpdate = true; - PhotoPanel.this.repaint(); - } - }); - doc.addDocumentChangeListener(new DocumentChangeListener() { @Override public void documentChanged(DocumentChangeEvent event) { @@ -416,27 +406,28 @@ private void draw(final GLAutoDrawable drawable, float dx) { rr.render(drawable, configuration, new HashSet<RocketComponent>()); //Figure out the lowest stage shown - final int currentStageNumber = configuration.getActiveStages()[configuration.getActiveStages().length-1]; - final Stage currentStage = (Stage)configuration.getRocket().getChild(currentStageNumber); + final int bottomStageNumber = configuration.getBottomStage().getStageNumber(); + //final int currentStageNumber = configuration.getActiveStages()[configuration.getActiveStages().length-1]; + //final AxialStage currentStage = (AxialStage)configuration.getRocket().getChild( bottomStageNumber); + + final FlightConfigurationId motorID = configuration.getFlightConfigurationID(); - final String motorID = configuration.getFlightConfigurationID(); - final Iterator<MotorMount> iterator = configuration.motorIterator(); - motor: while (iterator.hasNext()) { - final MotorMount mount = iterator.next(); + + + final Iterator<MotorConfiguration> iter = configuration.getActiveMotors().iterator(); + while( iter.hasNext()){ + MotorConfiguration curConfig = iter.next(); + final MotorMount mount = curConfig.getMount(); + int curStageNumber = ((RocketComponent)mount).getStageNumber(); //If this mount is not in currentStage continue on to the next one. - RocketComponent parent = ((RocketComponent)mount); - while ( null != (parent = parent.getParent()) ){ - if ( parent instanceof Stage ){ - if ( parent != currentStage ) - continue motor; - break; - } + if( curStageNumber != bottomStageNumber ){ + continue; } - final Motor motor = mount.getMotorConfiguration().get(motorID).getMotor(); + final Motor motor = mount.getMotorConfig(motorID).getMotor(); final double length = motor.getLength(); - + Coordinate[] position = ((RocketComponent) mount) .toAbsolute(new Coordinate(((RocketComponent) mount) .getLength() + mount.getMotorOverhang() - length)); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java index 91cff98077..dac63d28c2 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoSettingsConfig.java @@ -200,14 +200,15 @@ public void stateChanged(EventObject e) { add(new JLabel(trans.get("PhotoSettingsConfig.lbl.skyImage"))); - add(new JComboBox(new DefaultComboBoxModel(new Object[] { null, Mountains.instance, Meadow.instance, + add(new JComboBox<Sky>(new DefaultComboBoxModel<Sky>(new Sky[] { null, Mountains.instance, Meadow.instance, Storm.instance, Lake.instance, Orbit.instance, Miramar.instance }) { }) { { addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - Object s = ((JComboBox) e.getSource()).getSelectedItem(); + @SuppressWarnings("unchecked") + Object s = ((JComboBox<Sky>) e.getSource()).getSelectedItem(); if (s instanceof Sky) { p.setSky((Sky) s); skyColorButton.setEnabled(false); diff --git a/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java b/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java index f12d0ee2cd..212d50ef5b 100644 --- a/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java +++ b/swing/src/net/sf/openrocket/gui/figureelements/RocketInfo.java @@ -13,7 +13,7 @@ import net.sf.openrocket.aerodynamics.Warning; import net.sf.openrocket.aerodynamics.WarningSet; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.Unit; @@ -41,14 +41,16 @@ public class RocketInfo implements FigureElement { private final Caret cpCaret = new CPCaret(0,0); private final Caret cgCaret = new CGCaret(0,0); - private final Configuration configuration; + private final FlightConfiguration configuration; private final UnitGroup stabilityUnits; private double cg = 0, cp = 0; private double length = 0, diameter = 0; private double mass = 0; + private double aoa = Double.NaN; + private double theta = Double.NaN; + private double mach = Application.getPreferences().getDefaultMach(); private double massWithoutMotors = 0; - private double aoa = Double.NaN, theta = Double.NaN, mach = Application.getPreferences().getDefaultMach(); private WarningSet warnings = null; @@ -63,7 +65,7 @@ public class RocketInfo implements FigureElement { - public RocketInfo(Configuration configuration) { + public RocketInfo(FlightConfiguration configuration) { this.configuration = configuration; this.stabilityUnits = UnitGroup.stabilityUnits(configuration); } diff --git a/swing/src/net/sf/openrocket/gui/help/tours/GuidedTourSelectionDialog.java b/swing/src/net/sf/openrocket/gui/help/tours/GuidedTourSelectionDialog.java index d3a74a3d4a..2d97d841b2 100644 --- a/swing/src/net/sf/openrocket/gui/help/tours/GuidedTourSelectionDialog.java +++ b/swing/src/net/sf/openrocket/gui/help/tours/GuidedTourSelectionDialog.java @@ -30,7 +30,8 @@ import net.sf.openrocket.util.Named; public class GuidedTourSelectionDialog extends JDialog { - + private static final long serialVersionUID = -3643116444821710259L; + private static final Translator trans = Application.getTranslator(); private static GuidedTourSelectionDialog instance = null; @@ -41,7 +42,7 @@ public class GuidedTourSelectionDialog extends JDialog { private SlideShowDialog slideShowDialog; - private JList tourList; + private JList<Named<SlideSet>> tourList; private JEditorPane tourDescription; private JLabel tourLength; @@ -56,7 +57,7 @@ public GuidedTourSelectionDialog(Window parent) { panel.add(new StyledLabel(trans.get("lbl.selectTour"), Style.BOLD), "spanx, wrap rel"); - tourList = new JList(new TourListModel()); + tourList = new JList<Named<SlideSet>>(new TourListModel()); tourList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tourList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -157,15 +158,15 @@ private void updateText() { } - @SuppressWarnings("unchecked") private SlideSet getSelectedSlideSet() { - return ((Named<SlideSet>) tourList.getSelectedValue()).get(); + return tourList.getSelectedValue().get(); } - private class TourListModel extends AbstractListModel { - + private class TourListModel extends AbstractListModel<Named<SlideSet>> { + private static final long serialVersionUID = -4031709944507449410L; + @Override - public Object getElementAt(int index) { + public Named<SlideSet> getElementAt(int index) { String name = tourNames.get(index); SlideSet set = slideSetManager.getSlideSet(name); return new Named<SlideSet>(set, set.getTitle()); diff --git a/swing/src/net/sf/openrocket/gui/help/tours/SlideShowDialog.java b/swing/src/net/sf/openrocket/gui/help/tours/SlideShowDialog.java index 89c0dd9793..fc76ed038d 100644 --- a/swing/src/net/sf/openrocket/gui/help/tours/SlideShowDialog.java +++ b/swing/src/net/sf/openrocket/gui/help/tours/SlideShowDialog.java @@ -25,6 +25,7 @@ import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Chars; +@SuppressWarnings("serial") public class SlideShowDialog extends JDialog { private static final Logger log = LoggerFactory.getLogger(SlideShowDialog.class); diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index ddfd3dcef0..b4b100f2c0 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -113,7 +113,10 @@ import net.sf.openrocket.util.TestRockets; import net.sf.openrocket.utils.ComponentPresetEditor; + public class BasicFrame extends JFrame { + private static final long serialVersionUID = 948877655223365313L; + private static final Logger log = LoggerFactory.getLogger(BasicFrame.class); private static final GeneralRocketSaver ROCKET_SAVER = new GeneralRocketSaver(); @@ -169,7 +172,7 @@ public BasicFrame(OpenRocketDocument document) { this.document = document; this.rocket = document.getRocket(); - this.rocket.getDefaultConfiguration().setAllStages(); + this.rocket.getSelectedConfiguration().setAllStages(); // Create the component tree selection model that will be used componentSelectionModel = new DefaultTreeSelectionModel(); @@ -681,30 +684,33 @@ public void actionPerformed(ActionEvent e) { menu.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.desc")); menubar.add(menu); - //// Component analysis - item = new JMenuItem(trans.get("main.menu.analyze.componentAnalysis"), KeyEvent.VK_C); - //// Analyze the rocket components separately - item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.componentAnalysis.desc")); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - log.info(Markers.USER_MARKER, "Component analysis selected"); - ComponentAnalysisDialog.showDialog(rocketpanel); - } - }); - menu.add(item); - //// Optimize - item = new JMenuItem(trans.get("main.menu.analyze.optimization"), KeyEvent.VK_O); - item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.optimization.desc")); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - log.info(Markers.USER_MARKER, "Rocket optimization selected"); - new GeneralOptimizationDialog(document, BasicFrame.this).setVisible(true); - } - }); - menu.add(item); +// TODO: reimplement this +// //// Component analysis +// item = new JMenuItem(trans.get("main.menu.analyze.componentAnalysis"), KeyEvent.VK_C); +// //// Analyze the rocket components separately +// item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.componentAnalysis.desc")); +// item.addActionListener(new ActionListener() { +// @Override +// public void actionPerformed(ActionEvent e) { +// log.info(Markers.USER_MARKER, "Component analysis selected"); +// ComponentAnalysisDialog.showDialog(rocketpanel); +// } +// }); +// menu.add(item); + +// TODO: reimplement this dialog +// //// Optimize +// item = new JMenuItem(trans.get("main.menu.analyze.optimization"), KeyEvent.VK_O); +// item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.analyze.optimization.desc")); +// item.addActionListener(new ActionListener() { +// @Override +// public void actionPerformed(ActionEvent e) { +// log.info(Markers.USER_MARKER, "Rocket optimization selected"); +// new GeneralOptimizationDialog(document, BasicFrame.this).setVisible(true); +// } +// }); +// menu.add(item); //// Custom expressions item = new JMenuItem(trans.get("main.menu.analyze.customExpressions"), KeyEvent.VK_E); @@ -776,8 +782,9 @@ public void actionPerformed(ActionEvent e) { menu.add(item); //// Debug log - item = new JMenuItem(trans.get("main.menu.help.debugLog")); - item.setIcon(Icons.HELP_DEBUG_LOG); + item = new JMenuItem(trans.get("main.menu.help.debugLog"), KeyEvent.VK_D); + item.setIcon(Icons.HELP_DEBUG_LOG); + item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, SHORTCUT_KEY)); item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.help.debugLog.desc")); item.addActionListener(new ActionListener() { @Override diff --git a/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java b/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java index 447b7e4c83..a87255c1dc 100644 --- a/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java +++ b/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java @@ -25,6 +25,9 @@ import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.components.StyledLabel; @@ -32,6 +35,7 @@ import net.sf.openrocket.gui.main.componenttree.ComponentTreeModel; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.logging.Markers; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.BodyComponent; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.Bulkhead; @@ -44,6 +48,9 @@ import net.sf.openrocket.rocketcomponent.MassComponent; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.Parachute; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.PodSet; +import net.sf.openrocket.rocketcomponent.RailButton; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.ShockCord; @@ -52,15 +59,13 @@ import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; import net.sf.openrocket.rocketcomponent.TubeCoupler; import net.sf.openrocket.rocketcomponent.TubeFinSet; +import net.sf.openrocket.rocketcomponent.FuelTank; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Pair; import net.sf.openrocket.util.Reflection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * A component that contains addition buttons to add different types of rocket components * to a rocket. It enables and disables buttons according to the current selection of a @@ -70,6 +75,8 @@ */ public class ComponentAddButtons extends JPanel implements Scrollable { + private static final long serialVersionUID = 4315680855765544950L; + private static final Logger log = LoggerFactory.getLogger(ComponentAddButtons.class); private static final Translator trans = Application.getTranslator(); @@ -105,12 +112,16 @@ public ComponentAddButtons(OpenRocketDocument document, TreeSelectionModel model this.viewport = viewport; buttons = new ComponentButton[ROWS][]; + for( int rowCur = 0; rowCur < ROWS; rowCur++){ + buttons[rowCur]=null; + } int row = 0; - + int col = 0; //////////////////////////////////////////// //// Body components and fin sets - addButtonRow(trans.get("compaddbuttons.Bodycompandfinsets"), row, + add(new JLabel(trans.get("compaddbuttons.Bodycompandfinsets")), "span, gaptop 0, wrap"); + addButtonGroup(row, //// Nose cone new BodyComponentButton(NoseCone.class, trans.get("compaddbuttons.Nosecone")), //// Body tube @@ -118,23 +129,24 @@ public ComponentAddButtons(OpenRocketDocument document, TreeSelectionModel model //// Transition new BodyComponentButton(Transition.class, trans.get("compaddbuttons.Transition")), //// Trapezoidal - new FinButton(TrapezoidFinSet.class, trans.get("compaddbuttons.Trapezoidal")), // TODO: MEDIUM: freer fin placing + new ComponentButton(TrapezoidFinSet.class, trans.get("compaddbuttons.Trapezoidal")), // TODO: MEDIUM: freer fin placing //// Elliptical - new FinButton(EllipticalFinSet.class, trans.get("compaddbuttons.Elliptical")), + new ComponentButton(EllipticalFinSet.class, trans.get("compaddbuttons.Elliptical")), //// Freeform - new FinButton(FreeformFinSet.class, trans.get("compaddbuttons.Freeform")), + new ComponentButton(FreeformFinSet.class, trans.get("compaddbuttons.Freeform")), //// Freeform - new FinButton(TubeFinSet.class, trans.get("compaddbuttons.Tubefin")), + new ComponentButton(TubeFinSet.class, trans.get("compaddbuttons.Tubefin")), + //// Rail Button + new ComponentButton( RailButton.class, trans.get("compaddbuttons.RailButton")), //// Launch lug - new FinButton(LaunchLug.class, trans.get("compaddbuttons.Launchlug"))); - - row++; + new ComponentButton(LaunchLug.class, trans.get("compaddbuttons.Launchlug"))); + row++; - ///////////////////////////////////////////// //// Inner component - addButtonRow(trans.get("compaddbuttons.Innercomponent"), row, + add(new JLabel(trans.get("compaddbuttons.Innercomponent")), "span, gaptop unrel, wrap"); + addButtonGroup(row, //// Inner tube new ComponentButton(InnerTube.class, trans.get("compaddbuttons.Innertube")), //// Coupler @@ -144,14 +156,30 @@ public ComponentAddButtons(OpenRocketDocument document, TreeSelectionModel model //// Bulkhead new ComponentButton(Bulkhead.class, trans.get("compaddbuttons.Bulkhead")), //// Engine\nblock - new ComponentButton(EngineBlock.class, trans.get("compaddbuttons.Engineblock"))); + new ComponentButton(EngineBlock.class, trans.get("compaddbuttons.Engineblock")), + //// Fuel\ntank + new ComponentButton(FuelTank.class, trans.get("compaddbuttons.Fueltank"))); row++; //////////////////////////////////////////// + add(new JLabel(trans.get("compaddbuttons.assembly")), "span 3"); + add(new JLabel(trans.get("compaddbuttons.Massobjects")), "span, gaptop unrel, wrap"); + +// RocketActions.NewStageAct.ttip.Newstage = Add a new stage to the rocket design. +// RocketActions.NewStageAct.ttip.newBooster = Add a new set booster stage to the rocket design. +// RocketActions.NewStageAct.ttip.newPods = Add a new set of pods to the rocket design. + + //// Component Assembly Components: + ComponentButton[] buttonsToAdd = { + new ComponentButton(AxialStage.class, trans.get("RocketActions.NewStageAct.Newstage")), + new ComponentButton(ParallelStage.class, trans.get("compaddbuttons.newBooster.lbl")), + new ComponentButton(PodSet.class, trans.get("compaddbuttons.newPods.lbl"))}; + addButtonGroup(row, buttonsToAdd); //// Mass objects - addButtonRow(trans.get("compaddbuttons.Massobjects"), row, + // NOTE: These are on the same line as the assemblies above + addButtonGroup(row, //// Parachute new ComponentButton(Parachute.class, trans.get("compaddbuttons.Parachute")), //// Streamer @@ -160,7 +188,7 @@ public ComponentAddButtons(OpenRocketDocument document, TreeSelectionModel model new ComponentButton(ShockCord.class, trans.get("compaddbuttons.Shockcord")), // new ComponentButton("Motor clip"), // new ComponentButton("Payload"), - //// Mass\ncomponent + //// Mass component new ComponentButton(MassComponent.class, trans.get("compaddbuttons.Masscomponent"))); @@ -168,7 +196,7 @@ public ComponentAddButtons(OpenRocketDocument document, TreeSelectionModel model int w = 0, h = 0; for (row = 0; row < buttons.length; row++) { - for (int col = 0; col < buttons[row].length; col++) { + for (col = 0; col < buttons[row].length; col++) { Dimension d = buttons[row][col].getPreferredSize(); if (d.width > w) w = d.width; @@ -182,7 +210,7 @@ public ComponentAddButtons(OpenRocketDocument document, TreeSelectionModel model height = h; Dimension d = new Dimension(width, height); for (row = 0; row < buttons.length; row++) { - for (int col = 0; col < buttons[row].length; col++) { + for (col = 0; col < buttons[row].length; col++) { buttons[row][col].setMinimumSize(d); buttons[row][col].setPreferredSize(d); buttons[row][col].getComponent(0).validate(); @@ -210,27 +238,32 @@ public void stateChanged(ChangeEvent e) { /** - * Adds a row of buttons to the panel. + * Adds a buttons to the panel in a row. Assumes. + * * @param label Label placed before the row * @param row Row number * @param b List of ComponentButtons to place on the row */ - private void addButtonRow(String label, int row, ComponentButton... b) { - if (row > 0) - add(new JLabel(label), "span, gaptop unrel, wrap"); - else - add(new JLabel(label), "span, gaptop 0, wrap"); - - int col = 0; - buttons[row] = new ComponentButton[b.length]; + private void addButtonGroup(int row, ComponentButton... b) { + + int oldLen=0; + if( null == buttons[row] ){ + buttons[row] = new ComponentButton[b.length]; + }else{ + ComponentButton[] oldArr = buttons[row]; + oldLen = oldArr.length; + ComponentButton[] newArr = new ComponentButton[oldLen + b.length]; + System.arraycopy(oldArr, 0, newArr, 0, oldLen); + buttons[row] = newArr; + } - for (int i = 0; i < b.length; i++) { - buttons[row][col] = b[i]; - if (i < b.length - 1) - add(b[i], BUTTONPARAM); - else - add(b[i], BUTTONPARAM + ", wrap"); - col++; + int dstCol = oldLen; + int srcCol=0; + while( srcCol < b.length) { + buttons[row][dstCol] = b[srcCol]; + add(b[srcCol], BUTTONPARAM); + dstCol++; + srcCol++; } } @@ -272,6 +305,7 @@ private void flowButtons() { * Class for a component button. */ private class ComponentButton extends JButton implements TreeSelectionListener { + private static final long serialVersionUID = 4510127994205259083L; protected Class<? extends RocketComponent> componentClass = null; private Constructor<? extends RocketComponent> constructor = null; @@ -466,7 +500,8 @@ protected void fireActionPerformed(ActionEvent event) { * A class suitable for BodyComponents. Addition is allowed ... */ private class BodyComponentButton extends ComponentButton { - + private static final long serialVersionUID = 1574998068156786363L; + public BodyComponentButton(Class<? extends RocketComponent> c, String text) { super(c, text); } @@ -480,14 +515,17 @@ public BodyComponentButton(String text) { } @Override - public boolean isAddable(RocketComponent c) { - if (super.isAddable(c)) - return true; - // Handled separately: - if (c instanceof BodyComponent) + public boolean isAddable(RocketComponent selectedComponent) { + if (super.isAddable(selectedComponent)) { return true; - if (c == null || c instanceof Rocket) + }else if (selectedComponent instanceof BodyComponent) { + // Handled separately: return true; + }else if (selectedComponent == null) { + return false; + }else if( selectedComponent instanceof Rocket) { + return false; + } return false; } @@ -592,33 +630,7 @@ private int askPosition() { } } - - - /** - * Class for fin sets, that attach only to BodyTubes. - */ - private class FinButton extends ComponentButton { - public FinButton(Class<? extends RocketComponent> c, String text) { - super(c, text); - } - - public FinButton(String text, Icon enabled, Icon disabled) { - super(text, enabled, disabled); - } - - public FinButton(String text) { - super(text); - } - - @Override - public boolean isAddable(RocketComponent c) { - if (c == null) - return false; - return (c.getClass().equals(BodyTube.class)); - } - } - ///////// Scrolling functionality diff --git a/swing/src/net/sf/openrocket/gui/main/ComponentIcons.java b/swing/src/net/sf/openrocket/gui/main/ComponentIcons.java index 168b611333..26bf657018 100644 --- a/swing/src/net/sf/openrocket/gui/main/ComponentIcons.java +++ b/swing/src/net/sf/openrocket/gui/main/ComponentIcons.java @@ -10,6 +10,7 @@ import javax.swing.ImageIcon; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.Bulkhead; import net.sf.openrocket.rocketcomponent.CenteringRing; @@ -22,6 +23,9 @@ import net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.Parachute; +import net.sf.openrocket.rocketcomponent.ParallelStage; +import net.sf.openrocket.rocketcomponent.PodSet; +import net.sf.openrocket.rocketcomponent.RailButton; import net.sf.openrocket.rocketcomponent.ShockCord; import net.sf.openrocket.rocketcomponent.Streamer; import net.sf.openrocket.rocketcomponent.Transition; @@ -58,6 +62,8 @@ public class ComponentIcons { load("tubefin", trans.get("ComponentIcons.Tubefinset"), TubeFinSet.class); //// Launch lug load("launchlug", trans.get("ComponentIcons.Launchlug"), LaunchLug.class); + //// Rail Button + load("railbutton", trans.get("ComponentIcons.RailButton"), RailButton.class); //// Inner tube load("innertube", trans.get("ComponentIcons.Innertube"), InnerTube.class); //// Tube coupler @@ -79,6 +85,13 @@ public class ComponentIcons { ShockCord.class); load("mass", trans.get("ComponentIcons.Masscomponent"), MassComponent.class); + // // Component Assemblies + load("stage", trans.get("ComponentIcons.Stage"), + AxialStage.class); + load("boosters", trans.get("ComponentIcons.Boosters"), + ParallelStage.class); + load("pods", trans.get("ComponentIcons.Pods"), + PodSet.class); // // Mass components loadMassTypeIcon("mass", trans.get("ComponentIcons.Masscomponent"), MassComponentType.MASSCOMPONENT); diff --git a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFile.java b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFile.java index d697f042b1..e7fa03d337 100644 --- a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFile.java +++ b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFile.java @@ -50,11 +50,14 @@ public static ExampleDesignFile[] getExampleDesigns() { logger.debug("Cannot find jar file, trying to load from directory"); designs = getDirFileNames(); } - if (designs == null || designs.length == 0) { - return null; + + if (designs == null ){ + return new ExampleDesignFile[0]; + } + + if( 0 < designs.length ) { + Arrays.sort(designs); } - - Arrays.sort(designs); return designs; } diff --git a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java index d1ea61b5ef..6fc0f39a2c 100644 --- a/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java +++ b/swing/src/net/sf/openrocket/gui/main/ExampleDesignFileAction.java @@ -10,6 +10,7 @@ /** * Implements a menu for the example Open Rocket design files. */ +@SuppressWarnings("serial") public final class ExampleDesignFileAction extends JMenu { /** diff --git a/swing/src/net/sf/openrocket/gui/main/ExportDecalDialog.java b/swing/src/net/sf/openrocket/gui/main/ExportDecalDialog.java index b3505784d3..bb7afe25a1 100644 --- a/swing/src/net/sf/openrocket/gui/main/ExportDecalDialog.java +++ b/swing/src/net/sf/openrocket/gui/main/ExportDecalDialog.java @@ -25,13 +25,14 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public class ExportDecalDialog extends JDialog { private final static Translator trans = Application.getTranslator(); private final OpenRocketDocument document; - private final JComboBox decalComboBox; + private final JComboBox<DecalImage> decalComboBox; private final JFileChooser chooser; public ExportDecalDialog(Window parent, OpenRocketDocument doc) { @@ -47,7 +48,7 @@ public ExportDecalDialog(Window parent, OpenRocketDocument doc) { Collection<DecalImage> exportableDecals = document.getDecalList(); - decalComboBox = new JComboBox(exportableDecals.toArray(new DecalImage[0])); + decalComboBox = new JComboBox<DecalImage>(exportableDecals.toArray(new DecalImage[0])); decalComboBox.setEditable(false); panel.add(decalComboBox, "growx, wrap"); diff --git a/swing/src/net/sf/openrocket/gui/main/MRUDesignFileAction.java b/swing/src/net/sf/openrocket/gui/main/MRUDesignFileAction.java index 0055f938f7..5582e4fca8 100644 --- a/swing/src/net/sf/openrocket/gui/main/MRUDesignFileAction.java +++ b/swing/src/net/sf/openrocket/gui/main/MRUDesignFileAction.java @@ -14,6 +14,7 @@ /** * Implements a menu for the Most-Recently-Used Open Rocket design files. */ +@SuppressWarnings("serial") public final class MRUDesignFileAction extends JMenu { /** diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index a702c2839d..828c8ceae9 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -24,7 +24,7 @@ import net.sf.openrocket.rocketcomponent.ComponentChangeListener; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.util.Pair; @@ -174,7 +174,7 @@ private boolean isDeletable(RocketComponent c) { return false; // Cannot remove last stage - if ((c instanceof Stage) && (c.getParent().getChildCount() == 1)) { + if ((c instanceof AxialStage) && (c.getParent().getChildCount() == 1)) { return false; } @@ -277,6 +277,11 @@ private Pair<RocketComponent, Integer> getPastePosition(RocketComponent clipboar /////// Action classes private abstract class RocketAction extends AbstractAction implements ClipboardListener { + /** + * + */ + private static final long serialVersionUID = 1L; + @Override public abstract void clipboardChanged(); } @@ -286,6 +291,8 @@ private abstract class RocketAction extends AbstractAction implements ClipboardL * Action that deletes the selected component. */ private class DeleteComponentAction extends RocketAction { + private static final long serialVersionUID = 1L; + public DeleteComponentAction() { //// Delete this.putValue(NAME, trans.get("RocketActions.DelCompAct.Delete")); @@ -321,6 +328,8 @@ public void clipboardChanged() { * Action that deletes the selected component. */ private class DeleteSimulationAction extends RocketAction { + private static final long serialVersionUID = 1L; + public DeleteSimulationAction() { //// Delete this.putValue(NAME, trans.get("RocketActions.DelSimuAct.Delete")); @@ -356,6 +365,8 @@ public void clipboardChanged() { * Action that deletes the selected component. */ private class DeleteAction extends RocketAction { + private static final long serialVersionUID = 1L; + public DeleteAction() { //// Delete this.putValue(NAME, trans.get("RocketActions.DelAct.Delete")); @@ -391,6 +402,8 @@ public void clipboardChanged() { * Action the cuts the selected component (copies to clipboard and deletes). */ private class CutAction extends RocketAction { + private static final long serialVersionUID = 1L; + public CutAction() { //// Cut this.putValue(NAME, trans.get("RocketActions.CutAction.Cut")); @@ -442,6 +455,8 @@ public void clipboardChanged() { * Action that copies the selected component to the clipboard. */ private class CopyAction extends RocketAction { + private static final long serialVersionUID = 1L; + public CopyAction() { //// Copy this.putValue(NAME, trans.get("RocketActions.CopyAct.Copy")); @@ -488,6 +503,8 @@ public void clipboardChanged() { * as a child, and after that as a sibling after the selected component. */ private class PasteAction extends RocketAction { + private static final long serialVersionUID = 1L; + public PasteAction() { //// Paste this.putValue(NAME, trans.get("RocketActions.PasteAct.Paste")); @@ -551,6 +568,8 @@ public void clipboardChanged() { * Action to edit the currently selected component. */ private class EditAction extends RocketAction { + private static final long serialVersionUID = 1L; + public EditAction() { //// Edit this.putValue(NAME, trans.get("RocketActions.EditAct.Edit")); @@ -584,6 +603,8 @@ public void clipboardChanged() { * Action to add a new stage to the rocket. */ private class NewStageAction extends RocketAction { + private static final long serialVersionUID = 1L; + public NewStageAction() { //// New stage this.putValue(NAME, trans.get("RocketActions.NewStageAct.Newstage")); @@ -597,13 +618,12 @@ public void actionPerformed(ActionEvent e) { ComponentConfigDialog.hideDialog(); - RocketComponent stage = new Stage(); - //// Booster stage - stage.setName(trans.get("RocketActions.ActBoosterstage")); + RocketComponent stage = new AxialStage(); + //// Add stage document.addUndoPosition("Add stage"); rocket.addChild(stage); - rocket.getDefaultConfiguration().setAllStages(); + rocket.getSelectedConfiguration().setAllStages(); selectionModel.setSelectedComponent(stage); ComponentConfigDialog.showDialog(parentFrame, document, stage); @@ -622,6 +642,8 @@ public void clipboardChanged() { * Action to move the selected component upwards in the parent's child list. */ private class MoveUpAction extends RocketAction { + private static final long serialVersionUID = 1L; + public MoveUpAction() { //// Move up this.putValue(NAME, trans.get("RocketActions.MoveUpAct.Moveup")); @@ -641,6 +663,7 @@ public void actionPerformed(ActionEvent e) { RocketComponent parent = selected.getParent(); document.addUndoPosition("Move "+selected.getComponentName()); parent.moveChild(selected, parent.getChildPosition(selected)-1); + rocket.fireComponentChangeEvent( ComponentChangeEvent.TREE_CHANGE ); selectionModel.setSelectedComponent(selected); } @@ -665,6 +688,8 @@ private boolean canMove(RocketComponent c) { * Action to move the selected component down in the parent's child list. */ private class MoveDownAction extends RocketAction { + private static final long serialVersionUID = 1L; + public MoveDownAction() { //// Move down this.putValue(NAME, trans.get("RocketActions.MoveDownAct.Movedown")); @@ -684,6 +709,7 @@ public void actionPerformed(ActionEvent e) { RocketComponent parent = selected.getParent(); document.addUndoPosition("Move "+selected.getComponentName()); parent.moveChild(selected, parent.getChildPosition(selected)+1); + rocket.fireComponentChangeEvent( ComponentChangeEvent.TREE_CHANGE ); selectionModel.setSelectedComponent(selected); } diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index a814369950..e65467ec4f 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -3,26 +3,43 @@ import java.awt.Color; import java.awt.Component; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.FlavorEvent; +import java.awt.datatransfer.FlavorListener; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.io.IOException; import java.util.Arrays; import java.util.Comparator; +import javax.swing.AbstractAction; +import javax.swing.Action; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.text.DefaultEditorKit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.aerodynamics.Warning; @@ -44,22 +61,20 @@ import net.sf.openrocket.gui.simulation.SimulationRunDialog; import net.sf.openrocket.gui.simulation.SimulationWarningDialog; import net.sf.openrocket.gui.util.Icons; -import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; -import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.simulation.FlightData; -import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.AlphanumComparator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +@SuppressWarnings("serial") public class SimulationPanel extends JPanel { + private static final Logger log = LoggerFactory.getLogger(SimulationPanel.class); private static final Translator trans = Application.getTranslator(); @@ -83,6 +98,7 @@ public class SimulationPanel extends JPanel { private final JButton runButton; private final JButton deleteButton; private final JButton plotButton; + private final JPopupMenu pm; public SimulationPanel(OpenRocketDocument doc) { super(new MigLayout("fill", "[grow][][][][][][grow]")); @@ -127,6 +143,7 @@ public void actionPerformed(ActionEvent e) { if (selection.length == 0) { return; } + Simulation[] sims = new Simulation[selection.length]; for (int i = 0; i < selection.length; i++) { selection[i] = simulationTable.convertRowIndexToModel(selection[i]); @@ -325,7 +342,7 @@ public int getDefaultWidth() { } @Override - public Comparator getComparator() { + public Comparator<String> getComparator() { return new AlphanumComparator(); } }, @@ -334,10 +351,13 @@ public Comparator getComparator() { new Column(trans.get("simpanel.col.Configuration")) { @Override public Object getValueAt(int row) { - if (row < 0 || row >= document.getSimulationCount()) + if (row < 0 || row >= document.getSimulationCount()){ return null; - Configuration c = document.getSimulation(row).getConfiguration(); - return descriptor.format(c.getRocket(), c.getFlightConfigurationID()); + } + + Rocket rkt = document.getRocket(); + FlightConfigurationId fcid = document.getSimulation(row).getId(); + return descriptor.format( rkt, fcid); } @Override @@ -489,6 +509,9 @@ public Double valueAt(int row) { } ) { + + private static final long serialVersionUID = 8686456963492628476L; + @Override public int getRowCount() { return document.getSimulationCount(); @@ -498,6 +521,9 @@ public int getRowCount() { // Override processKeyBinding so that the JTable does not catch // key bindings used in menu accelerators simulationTable = new ColumnTable(simulationTableModel) { + + private static final long serialVersionUID = -5799340181229735630L; + @Override protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, @@ -511,7 +537,9 @@ protected boolean processKeyBinding(KeyStroke ks, simulationTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); simulationTable.setDefaultRenderer(Object.class, new JLabelRenderer()); simulationTableModel.setColumnWidths(simulationTable.getColumnModel()); - + + pm = new JPopupMenu(); + pm.add(new CopyAction(simulationTable)); // Mouse listener to act on double-clicks simulationTable.addMouseListener(new MouseAdapter() { @@ -534,6 +562,8 @@ public void mouseClicked(MouseEvent e) { openDialog(document.getSimulations().get(selected)); } + } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1){ + doPopup(e); } else { updateButtonStates(); } @@ -567,6 +597,10 @@ public void componentChanged(ComponentChangeEvent e) { updateButtonStates(); } + protected void doPopup(MouseEvent e) { + pm.show(e.getComponent(), e.getX(), e.getY()); + } + private void updateButtonStates() { int[] selection = simulationTable.getSelectedRows(); if (selection.length == 0) { @@ -601,7 +635,7 @@ public void activating(){ if((s==Simulation.Status.NOT_SIMULATED) || (s==Simulation.Status.OUTDATED)){ outdated++; - } + } } if(outdated>0){ Simulation[] sims = new Simulation[outdated]; @@ -655,11 +689,85 @@ private void fireMaintainSelection() { simulationTable.addRowSelectionInterval(row, row); } } + + class CopyAction extends AbstractAction { + + private JTable table; + + public CopyAction(JTable table) { + this.table = table; + putValue(NAME, "Copy"); + } + + @Override + public void actionPerformed(ActionEvent e) { + + int numCols=table.getColumnCount(); + int numRows=table.getSelectedRowCount(); + int[] rowsSelected=table.getSelectedRows(); + + if (numRows!=rowsSelected[rowsSelected.length-1]-rowsSelected[0]+1 || numRows!=rowsSelected.length ) { + + JOptionPane.showMessageDialog(null, "Invalid Copy Selection", "Invalid Copy Selection", JOptionPane.ERROR_MESSAGE); + return; + } + + StringBuffer excelStr=new StringBuffer(); + for (int k=1; k<numCols; k++) { + excelStr.append(table.getColumnName(k)); + if (k<numCols-1) { + excelStr.append("\t"); + } + } + excelStr.append("\n"); + for (int i=0; i<numRows; i++) { + for (int j=1; j<numCols; j++) { + excelStr.append(table.getValueAt(rowsSelected[i], j)); + if (j<numCols-1) { + excelStr.append("\t"); + } + } + excelStr.append("\n"); + } + + StringSelection sel = new StringSelection(excelStr.toString()); + + Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); + cb.setContents(sel, sel); + } + + } + + public static class CellTransferable implements Transferable { - private enum SimulationTableColumns { + public static final DataFlavor CELL_DATA_FLAVOR = new DataFlavor(Object.class, "application/x-cell-value"); - } + private Object cellValue; + public CellTransferable(Object cellValue) { + this.cellValue = cellValue; + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[]{CELL_DATA_FLAVOR}; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + return CELL_DATA_FLAVOR.equals(flavor); + } + + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + if (!isDataFlavorSupported(flavor)) { + throw new UnsupportedFlavorException(flavor); + } + return cellValue; + } + + } + private class JLabelRenderer extends DefaultTableCellRenderer { @Override @@ -702,6 +810,9 @@ private String getSimulationToolTip(Simulation sim) { tip = "<html><b>" + sim.getName() + "</b><br>"; switch (sim.getStatus()) { + case CANT_RUN: + tip += trans.get("simpanel.ttip.noData")+"<br>"; + break; case UPTODATE: tip += trans.get("simpanel.ttip.uptodate") + "<br>"; break; diff --git a/swing/src/net/sf/openrocket/gui/main/StorageOptionChooser.java b/swing/src/net/sf/openrocket/gui/main/StorageOptionChooser.java index ad836c8826..4e1d690adf 100644 --- a/swing/src/net/sf/openrocket/gui/main/StorageOptionChooser.java +++ b/swing/src/net/sf/openrocket/gui/main/StorageOptionChooser.java @@ -5,7 +5,6 @@ import javax.swing.BorderFactory; import javax.swing.ButtonGroup; -import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -27,6 +26,7 @@ import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.startup.Application; +@SuppressWarnings("serial") public class StorageOptionChooser extends JPanel { public static final double DEFAULT_SAVE_TIME_SKIP = 0.20; diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTree.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTree.java index f78bfd0057..a02e626f94 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTree.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTree.java @@ -7,6 +7,7 @@ import net.sf.openrocket.gui.components.BasicTree; +@SuppressWarnings("serial") public class ComponentTree extends BasicTree { public ComponentTree(OpenRocketDocument document) { diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java index c80b735613..ccf6ed8c40 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java @@ -147,7 +147,7 @@ public void componentChanged(ComponentChangeEvent e) { // TODO: LOW: Could this be performed better? expandAll(); } - } else if (e.isOtherChange()) { + } else { fireTreeNodeChanged(e.getSource()); } } diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java index b73f7cec1e..8c66f25c72 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java @@ -19,6 +19,7 @@ import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.TextUtil; +@SuppressWarnings("serial") public class ComponentTreeRenderer extends DefaultTreeCellRenderer { private static final Translator trans = Application.getTranslator(); diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java index 9484ce5490..4431725e7b 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeTransferHandler.java @@ -29,6 +29,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class ComponentTreeTransferHandler extends TransferHandler { private static final Logger log = LoggerFactory.getLogger(ComponentTreeTransferHandler.class); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java index 7360b41e5d..1d46fcc462 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java @@ -3,13 +3,11 @@ import java.awt.Color; import java.awt.Component; import java.awt.Font; -import java.util.EventObject; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTable; -import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; @@ -18,70 +16,72 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.formatting.RocketDescriptor; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Pair; -import net.sf.openrocket.util.StateChangeListener; + +@SuppressWarnings("serial") public abstract class FlightConfigurablePanel<T extends FlightConfigurableComponent> extends JPanel { protected static final Translator trans = Application.getTranslator(); + private static final Logger log = LoggerFactory.getLogger(FlightConfigurablePanel.class); protected RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); protected final FlightConfigurationPanel flightConfigurationPanel; protected final Rocket rocket; protected final JTable table; - + public FlightConfigurablePanel(final FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) { super(new MigLayout("fill")); this.flightConfigurationPanel = flightConfigurationPanel; this.rocket = rocket; table = initializeTable(); - rocket.getDefaultConfiguration().addChangeListener( new StateChangeListener() { - @Override - public void stateChanged(EventObject e) { - FlightConfigurablePanel.this.synchronizeConfigurationSelection(); - } - }); + installTableListener(); synchronizeConfigurationSelection(); } public void fireTableDataChanged() { int selectedRow = table.getSelectedRow(); - int selectedColumn = table.getSelectedColumn(); + int selectedColumn = table.getSelectedColumn(); + this.rocket.fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); ((AbstractTableModel)table.getModel()).fireTableDataChanged(); restoreSelection(selectedRow,selectedColumn); updateButtonState(); } protected abstract void updateButtonState(); - - protected final void synchronizeConfigurationSelection() { - String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); - String selectedId = getSelectedConfigurationId(); - if ( id == null && selectedId == null ) { - // Nothing to do - } else if ( id == null ) { + protected final void synchronizeConfigurationSelection() { + FlightConfigurationId defaultFCID = rocket.getSelectedConfiguration().getFlightConfigurationID(); + FlightConfigurationId selectedFCID = getSelectedConfigurationId(); + + if ( selectedFCID == null ) { // need to unselect table.clearSelection(); - } else if ( !id.equals(selectedId)){ + } else if ( !defaultFCID.equals(selectedFCID)){ // Need to change selection // We'll select the correct row, in the currently selected column. int col = table.getSelectedColumn(); if ( col < 0 ) { col = (table.getColumnCount() > 1) ? 1 : 0; } - for( int row = 0; row < table.getRowCount(); row++ ) { - String rowId = rocket.getFlightConfigurationIDs()[row + 1]; - if ( rowId.equals(id) ) { - table.changeSelection(row, col, true, false); + + for( int rowNum = 0; rowNum < table.getRowCount(); rowNum++ ) { + FlightConfigurationId rowFCID = rocket.getId(rowNum ); + if ( rowFCID.equals(selectedFCID) ) { + table.changeSelection(rowNum, col, true, false); break; } } @@ -99,7 +99,7 @@ protected void restoreSelection( int row, int col ) { } table.changeSelection(row, col, true, false); } - + private final void installTableListener() { table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @@ -108,16 +108,16 @@ public void valueChanged(ListSelectionEvent e) { if ( e.getValueIsAdjusting() ) { return; } - int firstrow = e.getFirstIndex(); - int lastrow = e.getLastIndex(); - ListSelectionModel model = (ListSelectionModel) e.getSource(); - for( int row = firstrow; row <= lastrow; row ++) { - if ( model.isSelectedIndex(row) ) { - String id = (String) table.getValueAt(row, table.convertColumnIndexToView(0)); - rocket.getDefaultConfiguration().setFlightConfigurationID(id); - return; - } - } +// int firstrow = e.getFirstIndex(); +// int lastrow = e.getLastIndex(); +// ListSelectionModel model = (ListSelectionModel) e.getSource(); +// for( int row = firstrow; row <= lastrow; row ++) { +// if ( model.isSelectedIndex(row) ) { +// FlightConfigurationID fcid = (FlightConfigurationID) table.getValueAt(row, table.convertColumnIndexToView(0)); +// FlightConfiguration config = rocket.getConfigurationSet().get(fcid); +// return; +// } +// } } }); @@ -139,13 +139,14 @@ protected T getSelectedComponent() { } Object tableValue = table.getModel().getValueAt(row, col); if ( tableValue instanceof Pair ) { + @SuppressWarnings("unchecked") Pair<String,T> selectedComponent = (Pair<String,T>) tableValue; return selectedComponent.getV(); } return null; } - protected String getSelectedConfigurationId() { + protected FlightConfigurationId getSelectedConfigurationId() { int col = table.convertColumnIndexToModel(table.getSelectedColumn()); int row = table.convertRowIndexToModel(table.getSelectedRow()); if ( row < 0 || col < 0 || row >= table.getRowCount() || col >= table.getColumnCount() ) { @@ -153,38 +154,51 @@ protected String getSelectedConfigurationId() { } Object tableValue = table.getModel().getValueAt(row, col); if ( tableValue instanceof Pair ) { - Pair<String,T> selectedComponent = (Pair<String,T>) tableValue; - return selectedComponent.getU(); - } else if ( tableValue instanceof String ){ - return (String) tableValue; + @SuppressWarnings("unchecked") + Pair<FlightConfigurationId,T> selectedComponent = (Pair<FlightConfigurationId,T>) tableValue; + FlightConfigurationId fcid = selectedComponent.getU(); + return fcid; + } else if ( tableValue instanceof FlightConfigurationId ){ + return (FlightConfigurationId) tableValue; } - return null; + return FlightConfigurationId.ERROR_FCID; } protected abstract class FlightConfigurableCellRenderer extends DefaultTableCellRenderer { - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - JLabel label = (JLabel) c; - column = table.convertColumnIndexToModel(column); + @Override + public Component getTableCellRendererComponent(JTable table, Object newValue, boolean isSelected, boolean hasFocus, int row, int column) { + JLabel label = (JLabel) super.getTableCellRendererComponent(table, newValue, isSelected, hasFocus, row, column); + Object oldValue = table.getModel().getValueAt(row, column); + + // this block is more for the benefit of the reader than the computer -- + // this assignment is technically redundant, but useful to point out that the new value here is often null, + // while the old value seems to always be valid. + if( null == newValue ){ + log.warn("Detected null newValue to render... (oldValue: "+oldValue+")"); + newValue = oldValue; + } + + column = table.convertColumnIndexToModel(column); switch (column) { - case 0: { - label.setText(descriptor.format(rocket, (String) value)); - regular(label); - setSelected(label, table, isSelected, hasFocus); - return label; - } - default: { - Pair<String, T> v = (Pair<String, T>) value; - if(v!=null){ - String id = v.getU(); - T component = v.getV(); - label = format(component, id, label ); - } - setSelected(label, table, isSelected, hasFocus); - return label; + case 0: { + label.setText(descriptor.format(rocket, (FlightConfigurationId) oldValue)); + regular(label); + setSelected(label, table, isSelected, hasFocus); + return label; + } + default: { + @SuppressWarnings("unchecked") + Pair<FlightConfigurationId, T> v = (Pair<FlightConfigurationId, T>) oldValue; + + if(v!=null){ + FlightConfigurationId fcid = v.getU(); + T component = v.getV(); + label = format(component, fcid, label ); } + setSelected(label, table, isSelected, hasFocus); + return label; + } } } @@ -218,7 +232,7 @@ protected final void regular(JLabel label) { label.setForeground(Color.BLACK); } - protected abstract JLabel format( T component, String configId, JLabel label ); + protected abstract JLabel format( T component, FlightConfigurationId configId, JLabel label ); } diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurableTableModel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurableTableModel.java index 14c31fd67f..71541494a8 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurableTableModel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurableTableModel.java @@ -10,20 +10,21 @@ import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.Pair; -public class FlightConfigurableTableModel<T extends FlightConfigurableComponent> extends AbstractTableModel implements ComponentChangeListener{ - +public class FlightConfigurableTableModel<T extends FlightConfigurableComponent> extends AbstractTableModel implements ComponentChangeListener{ + private static final long serialVersionUID = 3168465083803936363L; private static final Translator trans = Application.getTranslator(); private static final String CONFIGURATION = trans.get("edtmotorconfdlg.col.configuration"); protected final Rocket rocket; protected final Class<T> clazz; private final List<T> components = new ArrayList<T>(); - + public FlightConfigurableTableModel(Class<T> clazz, Rocket rocket) { super(); this.rocket = rocket; @@ -33,8 +34,8 @@ public FlightConfigurableTableModel(Class<T> clazz, Rocket rocket) { } @Override - public void componentChanged(ComponentChangeEvent e) { - if ( e.isMotorChange() || e.isTreeChange() ) { + public void componentChanged(ComponentChangeEvent cce) { + if ( cce.isMotorChange() || cce.isTreeChange() ) { initialize(); fireTableStructureChanged(); } @@ -49,6 +50,7 @@ protected boolean includeComponent( T component ) { return true; } + @SuppressWarnings("unchecked") protected void initialize() { components.clear(); Iterator<RocketComponent> it = rocket.iterator(); @@ -62,7 +64,7 @@ protected void initialize() { @Override public int getRowCount() { - return rocket.getFlightConfigurationIDs().length - 1; + return rocket.getConfigurationCount(); } @Override @@ -72,15 +74,16 @@ public int getColumnCount() { @Override public Object getValueAt(int row, int column) { - String id = getConfiguration(row); + FlightConfigurationId fcid = rocket.getId( row); + switch (column) { case 0: { - return id; + return fcid; } default: { int index = column - 1; T d = components.get(index); - return new Pair<String, T>(id, d); + return new Pair<FlightConfigurationId, T>(fcid, d); } } } @@ -100,9 +103,4 @@ public String getColumnName(int column) { } } - private String getConfiguration(int row) { - String id = rocket.getFlightConfigurationIDs()[row + 1]; - return id; - } - } \ No newline at end of file diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java index dd3e022d63..f5cb45ed30 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java @@ -16,6 +16,8 @@ import net.sf.openrocket.gui.main.BasicFrame; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; @@ -24,12 +26,8 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.StateChangeListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +@SuppressWarnings("serial") public class FlightConfigurationPanel extends JPanel implements StateChangeListener { - - private static final Logger log = LoggerFactory.getLogger(FlightConfigurationPanel.class); private static final Translator trans = Application.getTranslator(); private final OpenRocketDocument document; @@ -56,6 +54,7 @@ public FlightConfigurationPanel(OpenRocketDocument doc) { this.document = doc; this.rocket = doc.getRocket(); + this.rocket.addChangeListener(this); //JPanel panel = new JPanel(new MigLayout("fill","[grow][][][][][grow]")); @@ -65,6 +64,7 @@ public FlightConfigurationPanel(OpenRocketDocument doc) { //// Motor tabs motorConfigurationPanel = new MotorConfigurationPanel(this, rocket); tabs.add(trans.get("edtmotorconfdlg.lbl.Motortab"), motorConfigurationPanel); + //// Recovery tab recoveryConfigurationPanel = new RecoveryConfigurationPanel(this, rocket); tabs.add(trans.get("edtmotorconfdlg.lbl.Recoverytab"), recoveryConfigurationPanel); @@ -77,7 +77,7 @@ public FlightConfigurationPanel(OpenRocketDocument doc) { newConfButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - addConfiguration(); + addOrCopyConfiguration(false); configurationChanged(); } @@ -109,7 +109,7 @@ public void actionPerformed(ActionEvent e) { copyConfButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - copyConfiguration(); + addOrCopyConfiguration(true); configurationChanged(); } }); @@ -118,88 +118,85 @@ public void actionPerformed(ActionEvent e) { updateButtonState(); this.add(tabs, "spanx, grow, wrap rel"); - - - this.rocket.getDefaultConfiguration().addChangeListener(this); - } - - private void addConfiguration() { - String newId = rocket.newFlightConfigurationID(); - rocket.getDefaultConfiguration().setFlightConfigurationID(newId); - - // Create a new simulation for this configuration. - createSimulationForNewConfiguration(); - - configurationChanged(); } - - private void copyConfiguration() { - String currentId = rocket.getDefaultConfiguration().getFlightConfigurationID(); - - // currentID is the currently selected configuration. - String newConfigId = rocket.newFlightConfigurationID(); - String oldName = rocket.getFlightConfigurationName(currentId); - - for (RocketComponent c : rocket) { - if (c instanceof FlightConfigurableComponent) { - ((FlightConfigurableComponent) c).cloneFlightConfiguration(currentId, newConfigId); + + /** + * either create or copy configuration + * set new configuration as current + * create simulation for new configuration + */ + private void addOrCopyConfiguration(boolean copy) { + FlightConfiguration newConfig; + FlightConfigurationId newId; + + // create or copy configuration + if (copy) { + FlightConfigurationId oldId = this.motorConfigurationPanel.getSelectedConfigurationId(); + FlightConfiguration oldConfig = rocket.getFlightConfiguration(oldId); + + newConfig = oldConfig.copy(null); + newId = newConfig.getId(); + + for (RocketComponent c : rocket) { + if (c instanceof FlightConfigurableComponent) { + ((FlightConfigurableComponent) c).copyFlightConfiguration(oldId, newId); + } } + } else { + newConfig = new FlightConfiguration(rocket, null); + newId = newConfig.getId(); } - rocket.setFlightConfigurationName(currentId, oldName); - rocket.getDefaultConfiguration().setFlightConfigurationID(newConfigId); - - // Create a new simulation for this configuration. - createSimulationForNewConfiguration(); + + // associate configuration with Id and select it + rocket.setFlightConfiguration(newId, newConfig); + rocket.setSelectedConfiguration(newId); + + // create simulation for configuration + Simulation newSim = new Simulation(rocket); - configurationChanged(); + OpenRocketDocument doc = BasicFrame.findDocument(rocket); + if (doc != null) { + newSim.setName(doc.getNextSimulationName()); + doc.addSimulation(newSim); + } } private void renameConfiguration() { - new RenameConfigDialog(SwingUtilities.getWindowAncestor(this), rocket).setVisible(true); + FlightConfigurationId currentId = this.motorConfigurationPanel.getSelectedConfigurationId(); + new RenameConfigDialog(SwingUtilities.getWindowAncestor(this), rocket, currentId).setVisible(true); } private void removeConfiguration() { - String currentId = rocket.getDefaultConfiguration().getFlightConfigurationID(); + FlightConfigurationId currentId = this.motorConfigurationPanel.getSelectedConfigurationId(); if (currentId == null) return; document.removeFlightConfigurationAndSimulations(currentId); configurationChanged(); } - /** - * prereq - assumes that the new configuration has been set as the default configuration. - */ - private void createSimulationForNewConfiguration() { - Simulation newSim = new Simulation(rocket); - OpenRocketDocument doc = BasicFrame.findDocument(rocket); - newSim.setName(doc.getNextSimulationName()); - doc.addSimulation(newSim); - } - private void configurationChanged() { motorConfigurationPanel.fireTableDataChanged(); recoveryConfigurationPanel.fireTableDataChanged(); separationConfigurationPanel.fireTableDataChanged(); - updateButtonState(); } private void updateButtonState() { - String currentId = rocket.getDefaultConfiguration().getFlightConfigurationID(); + FlightConfigurationId currentId = rocket.getSelectedConfiguration().getFlightConfigurationID(); // Enable the remove/rename/copy buttons only when a configuration is selected. - removeConfButton.setEnabled(currentId != null); - renameConfButton.setEnabled(currentId != null); - copyConfButton.setEnabled(currentId != null); + removeConfButton.setEnabled(currentId.isValid()); + renameConfButton.setEnabled(currentId.isValid()); + copyConfButton.setEnabled(currentId.isValid()); // Count the number of motor mounts int motorMountCount = rocket.accept(new ListMotorMounts()).size(); // Count the number of recovery devices - int recoveryDeviceCount = rocket.accept(new ListComponents<RecoveryDevice>(RecoveryDevice.class)).size(); + int recoveryDeviceCount = rocket.accept(new ListComponents<>(RecoveryDevice.class)).size(); // Count the number of stages int stageCount = rocket.getStageCount(); - // Enable the new configuration button only when a motor mount is defined. + // Enable the new configuration button only when a motor mount is defined. newConfButton.setEnabled(motorMountCount > 0); // Only enable the recovery tab if there is a motor mount and there is a recovery device diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java index e964e4e0c5..83ddfb1f96 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -1,10 +1,7 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.CardLayout; -import java.awt.Color; -import java.awt.Component; import java.awt.Dimension; -import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -13,19 +10,14 @@ import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; -import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; -import javax.swing.table.TableCellRenderer; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.gui.components.StyledLabel; @@ -33,21 +25,19 @@ import net.sf.openrocket.gui.dialogs.flightconfiguration.IgnitionSelectionDialog; import net.sf.openrocket.gui.dialogs.flightconfiguration.MotorMountConfigurationPanel; import net.sf.openrocket.gui.dialogs.motor.MotorChooserDialog; -import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.motor.IgnitionEvent; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration.IgnitionEvent; -import net.sf.openrocket.rocketcomponent.MotorConfiguration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Chars; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.Pair; +@SuppressWarnings("serial") public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount> { - + private static final String NONE = trans.get("edtmotorconfdlg.tbl.None"); private final JButton selectMotorButton, removeMotorButton, selectIgnitionButton, resetIgnitionButton; @@ -70,13 +60,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel<MotorMount> JLabel label = new StyledLabel(trans.get("lbl.motorMounts"), Style.BOLD); subpanel.add(label, "wrap"); - MotorMountConfigurationPanel mountConfigPanel = new MotorMountConfigurationPanel(this,rocket) { - @Override - public void onDataChanged() { - MotorConfigurationPanel.this.fireTableDataChanged(); - - } - }; + MotorMountConfigurationPanel mountConfigPanel = new MotorMountConfigurationPanel(this,rocket); subpanel.add(mountConfigPanel, "grow"); this.add(subpanel, "split, w 200lp, growy"); } @@ -148,23 +132,23 @@ protected void showContent() { protected JTable initializeTable() { //// Motor selection table. configurationTableModel = new FlightConfigurableTableModel<MotorMount>(MotorMount.class,rocket) { - @Override protected boolean includeComponent(MotorMount component) { return component.isMotorMount(); } - }; + // Listen to changes to the table so we can disable the help text when a // motor mount is added through the edit body tube dialog. configurationTableModel.addTableModelListener( new TableModelListener() { @Override - public void tableChanged(TableModelEvent e) { + public void tableChanged(TableModelEvent tme) { MotorConfigurationPanel.this.updateButtonState(); } }); + JTable configurationTable = new JTable(configurationTableModel); configurationTable.getTableHeader().setReorderingAllowed(false); configurationTable.setCellSelectionEnabled(true); @@ -190,12 +174,12 @@ public void mouseClicked(MouseEvent e) { protected void updateButtonState() { if( configurationTableModel.getColumnCount() > 1 ) { showContent(); - String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID(); - MotorMount currentMount = getSelectedComponent(); - selectMotorButton.setEnabled(currentMount != null && currentID != null); - removeMotorButton.setEnabled(currentMount != null && currentID != null); - selectIgnitionButton.setEnabled(currentMount != null && currentID != null); - resetIgnitionButton.setEnabled(currentMount != null && currentID != null); + + boolean haveSelection = (null != getSelectedComponent()); + selectMotorButton.setEnabled( haveSelection ); + removeMotorButton.setEnabled( haveSelection ); + selectIgnitionButton.setEnabled( haveSelection ); + resetIgnitionButton.setEnabled( haveSelection ); } else { showEmptyText(); selectMotorButton.setEnabled(false); @@ -205,66 +189,72 @@ protected void updateButtonState() { } } - private void selectMotor() { - String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); - MotorMount mount = getSelectedComponent(); - if (id == null || mount == null) - return; - - MotorConfiguration config = mount.getMotorConfiguration().get(id); + MotorMount curMount = getSelectedComponent(); + FlightConfigurationId fcid= getSelectedConfigurationId(); + if ( (null == fcid )||( null == curMount )){ + return; + } - motorChooserDialog.setMotorMountAndConfig(mount, id); + if( fcid.equals( FlightConfigurationId.DEFAULT_VALUE_FCID)){ + throw new IllegalStateException("Attempting to set a motor on the default FCID."); + } + motorChooserDialog.setMotorMountAndConfig( fcid, curMount ); motorChooserDialog.setVisible(true); - Motor m = motorChooserDialog.getSelectedMotor(); + Motor mtr = motorChooserDialog.getSelectedMotor(); double d = motorChooserDialog.getSelectedDelay(); - - if (m != null) { - config = new MotorConfiguration(); - config.setMotor(m); - config.setEjectionDelay(d); - mount.getMotorConfiguration().set(id, config); + if (mtr != null) { + final MotorConfiguration templateConfig = curMount.getMotorConfig(fcid); + final MotorConfiguration newConfig = new MotorConfiguration( curMount, fcid, templateConfig); + newConfig.setMotor(mtr); + newConfig.setEjectionDelay(d); + curMount.setMotorConfig( newConfig, fcid); } fireTableDataChanged(); } private void removeMotor() { - String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); - MotorMount mount = getSelectedComponent(); - if (id == null || mount == null) - return; - - mount.getMotorConfiguration().resetDefault(id); - + MotorMount curMount = getSelectedComponent(); + FlightConfigurationId fcid= getSelectedConfigurationId(); + if ( (null == fcid )||( null == curMount )){ + return; + } + + curMount.setMotorConfig( null, fcid); + fireTableDataChanged(); } private void selectIgnition() { - String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID(); - MotorMount currentMount = getSelectedComponent(); - if (currentID == null || currentMount == null) - return; - - IgnitionSelectionDialog dialog = new IgnitionSelectionDialog( + MotorMount curMount = getSelectedComponent(); + FlightConfigurationId fcid= getSelectedConfigurationId(); + if ( (null == fcid )||( null == curMount )){ + return; + } + + // this call also performs the update changes + IgnitionSelectionDialog ignitionDialog = new IgnitionSelectionDialog( SwingUtilities.getWindowAncestor(this.flightConfigurationPanel), - rocket, - currentMount); - dialog.setVisible(true); - + fcid, + curMount); + ignitionDialog.setVisible(true); + fireTableDataChanged(); } private void resetIgnition() { - String currentID = rocket.getDefaultConfiguration().getFlightConfigurationID(); - MotorMount currentMount = getSelectedComponent(); - if (currentID == null || currentMount == null) - return; - - currentMount.getIgnitionConfiguration().resetDefault(currentID); + MotorMount curMount = getSelectedComponent(); + FlightConfigurationId fcid= getSelectedConfigurationId(); + if ( (null == fcid )||( null == curMount )){ + return; + } + MotorConfiguration curInstance = curMount.getMotorConfig(fcid); + + curInstance.useDefaultIgnition(); fireTableDataChanged(); } @@ -273,11 +263,13 @@ private void resetIgnition() { private class MotorTableCellRenderer extends FlightConfigurablePanel<MotorMount>.FlightConfigurableCellRenderer { @Override - protected JLabel format( MotorMount mount, String configId, JLabel l ) { + protected JLabel format( MotorMount mount, FlightConfigurationId configId, JLabel l ) { JLabel label = new JLabel(); label.setLayout(new BoxLayout(label, BoxLayout.X_AXIS)); - MotorConfiguration motorConfig = mount.getMotorConfiguration().get(configId); - String motorString = getMotorSpecification(mount, motorConfig); + + MotorConfiguration curMotor = mount.getMotorConfig( configId); + String motorString = getMotorSpecification( curMotor ); + JLabel motorDescriptionLabel = new JLabel(motorString); label.add(motorDescriptionLabel); label.add( Box.createRigidArea(new Dimension(10,0))); @@ -287,38 +279,44 @@ protected JLabel format( MotorMount mount, String configId, JLabel l ) { return label; } - private String getMotorSpecification(MotorMount mount, MotorConfiguration motorConfig) { - Motor motor = motorConfig.getMotor(); - - if (motor == null) + private String getMotorSpecification(MotorConfiguration curMotorInstance ) { + if( curMotorInstance.isEmpty()){ return NONE; + } + + MotorMount mount = curMotorInstance.getMount(); + Motor motor = curMotorInstance.getMotor(); + if( null == mount){ + throw new NullPointerException("Motor has a null mount... this should never happen: "+curMotorInstance.getID()); + } - String str = motor.getDesignation(motorConfig.getEjectionDelay()); - int count = getMountMultiplicity(mount); + String str = motor.getDesignation(curMotorInstance.getEjectionDelay()); + int count = mount.getInstanceCount(); if (count > 1) { str = "" + count + Chars.TIMES + " " + str; } return str; } - private int getMountMultiplicity(MotorMount mount) { - RocketComponent c = (RocketComponent) mount; - return c.toAbsolute(Coordinate.NUL).length; - } - - private JLabel getIgnitionEventString(String id, MotorMount mount) { - IgnitionConfiguration ignitionConfig = mount.getIgnitionConfiguration().get(id); - IgnitionConfiguration.IgnitionEvent ignitionEvent = ignitionConfig.getIgnitionEvent(); - - Double ignitionDelay = ignitionConfig.getIgnitionDelay(); - boolean isDefault = mount.getIgnitionConfiguration().isDefault(id); - + private JLabel getIgnitionEventString(FlightConfigurationId id, MotorMount mount) { + MotorConfiguration defInstance = mount.getDefaultMotorConfig(); + MotorConfiguration curInstance = mount.getMotorConfig(id); + + IgnitionEvent ignitionEvent = curInstance.getIgnitionEvent(); + Double ignitionDelay = curInstance.getIgnitionDelay(); + boolean useDefault = !curInstance.hasIgnitionOverride(); + + if ( useDefault ) { + ignitionEvent = defInstance.getIgnitionEvent(); + ignitionDelay = defInstance.getIgnitionDelay(); + } + JLabel label = new JLabel(); String str = trans.get("MotorMount.IgnitionEvent.short." + ignitionEvent.name()); if (ignitionEvent != IgnitionEvent.NEVER && ignitionDelay > 0.001) { str = str + " + " + UnitGroup.UNITS_SHORT_TIME.toStringUnit(ignitionDelay); } - if (isDefault) { + if (useDefault) { shaded(label); String def = trans.get("MotorConfigurationTableModel.table.ignition.default"); str = def.replace("{0}", str); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index 33d973782b..14e512c581 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -18,6 +18,7 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration.DeployEvent; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.startup.Application; @@ -101,8 +102,8 @@ private void resetDeployment() { if (c == null) { return; } - String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); - c.getDeploymentConfiguration().resetDefault(id); + FlightConfigurationId id = rocket.getSelectedConfiguration().getFlightConfigurationID(); + c.getDeploymentConfigurations().reset(id); fireTableDataChanged(); } @@ -115,11 +116,11 @@ public void updateButtonState() { class RecoveryTableCellRenderer extends FlightConfigurablePanel<RecoveryDevice>.FlightConfigurableCellRenderer { @Override - protected JLabel format(RecoveryDevice recovery, String configId, JLabel label) { - DeploymentConfiguration deployConfig = recovery.getDeploymentConfiguration().get(configId); + protected JLabel format(RecoveryDevice recovery, FlightConfigurationId configId, JLabel label) { + DeploymentConfiguration deployConfig = recovery.getDeploymentConfigurations().get(configId); String spec = getDeploymentSpecification(deployConfig); label.setText(spec); - if (recovery.getDeploymentConfiguration().isDefault(configId)) { + if (recovery.getDeploymentConfigurations().isDefault(configId)) { shaded(label); } else { regular(label); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java index 9f6ed064b3..bee359ed11 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java @@ -16,18 +16,19 @@ import net.sf.openrocket.formatting.RocketDescriptor; import net.sf.openrocket.gui.dialogs.flightconfiguration.SeparationSelectionDialog; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; -public class SeparationConfigurationPanel extends FlightConfigurablePanel<Stage> { - +public class SeparationConfigurationPanel extends FlightConfigurablePanel<AxialStage> { + private static final long serialVersionUID = -1556652925279847316L; static final Translator trans = Application.getTranslator(); private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class); - private FlightConfigurableTableModel<Stage> separationTableModel; + private FlightConfigurableTableModel<AxialStage> separationTableModel; private final JButton selectSeparationButton; private final JButton resetDeploymentButton; @@ -65,9 +66,11 @@ public void actionPerformed(ActionEvent e) { @Override protected JTable initializeTable() { //// Separation selection - separationTableModel = new FlightConfigurableTableModel<Stage>(Stage.class, rocket) { + separationTableModel = new FlightConfigurableTableModel<AxialStage>(AxialStage.class, rocket) { + private static final long serialVersionUID = 7979648984099308970L; + @Override - protected boolean includeComponent(Stage component) { + protected boolean includeComponent(AxialStage component) { return component.getStageNumber() > 0; } @@ -92,7 +95,7 @@ public void mouseClicked(MouseEvent e) { } private void selectDeployment() { - Stage stage = getSelectedComponent(); + AxialStage stage = getSelectedComponent(); if (stage == null) { return; } @@ -102,12 +105,15 @@ private void selectDeployment() { } private void resetDeployment() { - Stage stage = getSelectedComponent(); + AxialStage stage = getSelectedComponent(); if (stage == null) { return; } - String id = rocket.getDefaultConfiguration().getFlightConfigurationID(); - stage.getStageSeparationConfiguration().resetDefault(id); + + // why? + FlightConfigurationId id = rocket.getSelectedConfiguration().getFlightConfigurationID(); + stage.getSeparationConfigurations().reset(id); + fireTableDataChanged(); } public void updateButtonState() { @@ -116,14 +122,15 @@ public void updateButtonState() { resetDeploymentButton.setEnabled(componentSelected); } - private class SeparationTableCellRenderer extends FlightConfigurablePanel<Stage>.FlightConfigurableCellRenderer { - + private class SeparationTableCellRenderer extends FlightConfigurablePanel<AxialStage>.FlightConfigurableCellRenderer { + private static final long serialVersionUID = -7066580803931938686L; + @Override - protected JLabel format(Stage stage, String configId, JLabel label) { - StageSeparationConfiguration sepConfig = stage.getStageSeparationConfiguration().get(configId); + protected JLabel format(AxialStage stage, FlightConfigurationId configId, JLabel label) { + StageSeparationConfiguration sepConfig = stage.getSeparationConfigurations().get(configId); String spec = getSeparationSpecification(sepConfig); label.setText(spec); - if (stage.getStageSeparationConfiguration().isDefault(configId)) { + if (stage.getSeparationConfigurations().isDefault(configId)) { shaded(label); } else { regular(label); diff --git a/swing/src/net/sf/openrocket/gui/plot/SimulationPlot.java b/swing/src/net/sf/openrocket/gui/plot/SimulationPlot.java index 1079bdce48..00a92addb5 100644 --- a/swing/src/net/sf/openrocket/gui/plot/SimulationPlot.java +++ b/swing/src/net/sf/openrocket/gui/plot/SimulationPlot.java @@ -61,6 +61,7 @@ * both datasets and the legend. But for now, the renderers are queried for the line color information * and this is held in the Legend. */ +@SuppressWarnings("serial") public class SimulationPlot { private static final float PLOT_STROKE_WIDTH = 1.5f; diff --git a/swing/src/net/sf/openrocket/gui/preset/ButtonColumn.java b/swing/src/net/sf/openrocket/gui/preset/ButtonColumn.java index 8852c55b01..b610e35d92 100644 --- a/swing/src/net/sf/openrocket/gui/preset/ButtonColumn.java +++ b/swing/src/net/sf/openrocket/gui/preset/ButtonColumn.java @@ -32,6 +32,7 @@ * * Credits: A post by Rob Camick http://tips4java.wordpress.com/2009/07/12/table-button-column/ */ +@SuppressWarnings("serial") public class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener { diff --git a/swing/src/net/sf/openrocket/gui/preset/DeselectableComboBox.java b/swing/src/net/sf/openrocket/gui/preset/DeselectableComboBox.java index bc5dcbe01f..c92efd61d1 100644 --- a/swing/src/net/sf/openrocket/gui/preset/DeselectableComboBox.java +++ b/swing/src/net/sf/openrocket/gui/preset/DeselectableComboBox.java @@ -9,16 +9,18 @@ /** * A combo box that allows for items to be deselected. */ -public class DeselectableComboBox extends JComboBox { +public class DeselectableComboBox<T> extends JComboBox<T> { + private static final long serialVersionUID = 1803702330221425938L; - public DeselectableComboBox() { + @SuppressWarnings("unchecked") + public DeselectableComboBox() { super(); - super.setRenderer(new DeselectedtemsRenderer()); + super.setRenderer(new DeselectedItemsRenderer()); } private Set<Integer> disabled_items = new HashSet<Integer>(); - public void addItem(Object anObject, boolean disabled) { + public void addItem(T anObject, boolean disabled) { super.addItem(anObject); if (disabled) { disabled_items.add(getItemCount() - 1); @@ -54,9 +56,12 @@ public void setSelectedIndex(int index) { } } - private class DeselectedtemsRenderer extends BasicComboBoxRenderer { + private class DeselectedItemsRenderer extends BasicComboBoxRenderer { + private static final long serialVersionUID = 6149806777306976399L; - @Override + // is raw because its super-method-signature is also a raw generic + @SuppressWarnings("rawtypes") + @Override public Component getListCellRendererComponent(JList list, Object value, int index, diff --git a/swing/src/net/sf/openrocket/gui/preset/MaterialModel.java b/swing/src/net/sf/openrocket/gui/preset/MaterialModel.java index eac4440cb9..2c0677e587 100644 --- a/swing/src/net/sf/openrocket/gui/preset/MaterialModel.java +++ b/swing/src/net/sf/openrocket/gui/preset/MaterialModel.java @@ -6,6 +6,7 @@ import net.sf.openrocket.gui.dialogs.CustomMaterialDialog; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; +import net.sf.openrocket.material.Material.Type; import net.sf.openrocket.startup.Application; import javax.swing.DefaultComboBoxModel; @@ -15,9 +16,10 @@ /** * A material model specifically for presets. */ -public class MaterialModel extends DefaultComboBoxModel implements DatabaseListener<Material> { +public class MaterialModel extends DefaultComboBoxModel<Material> implements DatabaseListener<Material> { + private static final long serialVersionUID = -8850670173491660708L; - private static final String CUSTOM = "Custom"; + private static final Material CUSTOM_MATERIAL = Material.newMaterial(Type.CUSTOM, "Custom", 1.0, true); private final Database<Material> database; @@ -65,7 +67,7 @@ public void setSelectedItem(Object item) { return; } - if (item == CUSTOM) { + if (item == CUSTOM_MATERIAL) { // Open custom material dialog in the future, after combo box has closed SwingUtilities.invokeLater(new Runnable() { @@ -100,9 +102,9 @@ else if (item instanceof Material) { } @Override - public Object getElementAt(int index) { + public Material getElementAt(int index) { if (index == database.size()) { - return CUSTOM; + return CUSTOM_MATERIAL; } else if (index >= database.size() + 1) { return null; diff --git a/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java b/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java index dcbbc62fb2..1689c08df4 100644 --- a/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java +++ b/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java @@ -68,7 +68,9 @@ * Preset editor for creating new preset components. */ public class PresetEditorDialog extends JDialog implements ItemListener { - + + private static final long serialVersionUID = -3298642844886682536L; + private static Translator trans = Application.getTranslator(); private static final Logger log = LoggerFactory.getLogger(PresetEditorDialog.class); @@ -81,7 +83,7 @@ public class PresetEditorDialog extends JDialog implements ItemListener { final PresetInputVerifier NON_NEGATIVE_INTEGER = new PresetInputVerifier(Pattern.compile(NON_NEGATIVE_INTEGER_FIELD)); private final JPanel contentPanel = new JPanel(); - private DeselectableComboBox typeCombo; + private DeselectableComboBox<String> typeCombo; private JTextField mfgTextField; private MaterialChooser materialChooser; private MaterialHolder holder = null; @@ -90,7 +92,7 @@ public class PresetEditorDialog extends JDialog implements ItemListener { private JTextField ncDescTextField; private DoubleModel ncLength; private JCheckBox ncFilledCB; - private JComboBox ncShapeCB; + private JComboBox<String> ncShapeCB; private DoubleModel ncAftDia; private DoubleModel ncAftShoulderDia; private DoubleModel ncAftShoulderLen; @@ -110,7 +112,7 @@ public class PresetEditorDialog extends JDialog implements ItemListener { private DoubleModel trMass; private ImageIcon trImage; private JCheckBox trFilledCB; - private JComboBox trShapeCB; + private JComboBox<String> trShapeCB; private JButton trImageBtn; private JTextField btPartNoTextField; @@ -257,9 +259,9 @@ public PresetEditorDialog(PresetResultListener theCallback, ComponentPreset toEd contentPanel.add(componentOverlayPanel, "cell 1 3 5 2,grow"); componentOverlayPanel.setLayout(new CardLayout(0, 0)); - typeCombo = new DeselectableComboBox(); + typeCombo = new DeselectableComboBox<String>(); typeCombo.addItemListener(this); - typeCombo.setModel(new DefaultComboBoxModel()); + typeCombo.setModel(new DefaultComboBoxModel<String>()); setItems(typeCombo, toEdit); contentPanel.add(typeCombo, "cell 3 1,growx"); @@ -306,8 +308,8 @@ public PresetEditorDialog(PresetResultListener theCallback, ComponentPreset toEd JLabel ncShapeLabel = new JLabel(trans.get("NoseConeCfg.lbl.Noseconeshape")); ncPanel.add(ncShapeLabel, "cell 0 2,alignx left"); - ncShapeCB = new JComboBox(); - ncShapeCB.setModel(new DefaultComboBoxModel(new String[] { Transition.Shape.OGIVE.getName(), Transition.Shape.CONICAL.getName(), Transition.Shape.PARABOLIC.getName(), + ncShapeCB = new JComboBox<String>(); + ncShapeCB.setModel(new DefaultComboBoxModel<String>(new String[] { Transition.Shape.OGIVE.getName(), Transition.Shape.CONICAL.getName(), Transition.Shape.PARABOLIC.getName(), Transition.Shape.ELLIPSOID.getName(), Transition.Shape.HAACK.getName() })); ncPanel.add(ncShapeCB, "cell 1 2,growx"); @@ -405,8 +407,8 @@ public void actionPerformed(final ActionEvent e) { JLabel trShapeLabel = new JLabel("Shape:"); trPanel.add(trShapeLabel, "cell 0 2,alignx left"); - trShapeCB = new JComboBox(); - trShapeCB.setModel(new DefaultComboBoxModel(new String[] { Transition.Shape.OGIVE.getName(), Transition.Shape.CONICAL.getName(), Transition.Shape.PARABOLIC.getName(), + trShapeCB = new JComboBox<String>(); + trShapeCB.setModel(new DefaultComboBoxModel<String>(new String[] { Transition.Shape.OGIVE.getName(), Transition.Shape.CONICAL.getName(), Transition.Shape.PARABOLIC.getName(), Transition.Shape.ELLIPSOID.getName(), Transition.Shape.HAACK.getName() })); trPanel.add(trShapeCB, "cell 1 2,growx"); @@ -1177,7 +1179,7 @@ public void actionPerformed(ActionEvent event) { * @param cb the combo box component * @param preset the preset being edited */ - private void setItems(DeselectableComboBox cb, ComponentPreset preset) { + private void setItems(DeselectableComboBox<String> cb, ComponentPreset preset) { cb.addItem(trans.get(NOSE_CONE_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.NOSE_CONE)); cb.addItem(trans.get(BODY_TUBE_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.BODY_TUBE)); cb.addItem(trans.get(BULKHEAD_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.BULK_HEAD)); @@ -1507,7 +1509,7 @@ private void fillEditor(ComponentPreset preset, MaterialHolder matHolder) { } } - private void setMaterial(final JComboBox chooser, final ComponentPreset preset, final MaterialHolder holder, + private void setMaterial(final JComboBox<Material> chooser, final ComponentPreset preset, final MaterialHolder holder, final Material.Type theType, final TypedKey<Material> key) { if (holder == null) { chooser.setModel(new MaterialModel(PresetEditorDialog.this, theType)); @@ -2190,8 +2192,9 @@ public boolean shouldYieldFocus(JComponent aComponent) { } } - class MaterialChooser extends JComboBox { - + class MaterialChooser extends JComboBox<Material> { + private static final long serialVersionUID = -6066457077483291319L; + public MaterialChooser() { } @@ -2207,7 +2210,7 @@ public MaterialChooser(MaterialModel model) { * @beaninfo bound: true description: Model that the combo box uses to get data to display. */ @Override - public void setModel(final ComboBoxModel aModel) { + public void setModel(final ComboBoxModel<Material> aModel) { if (getModel() instanceof MaterialModel) { MaterialModel old = (MaterialModel) getModel(); old.removeListener(); diff --git a/swing/src/net/sf/openrocket/gui/print/AbstractPrintable.java b/swing/src/net/sf/openrocket/gui/print/AbstractPrintable.java index 1e9f0c1f87..f32eeeadaf 100644 --- a/swing/src/net/sf/openrocket/gui/print/AbstractPrintable.java +++ b/swing/src/net/sf/openrocket/gui/print/AbstractPrintable.java @@ -8,6 +8,7 @@ import java.awt.RenderingHints; import java.awt.image.BufferedImage; +@SuppressWarnings("serial") public abstract class AbstractPrintable<T> extends PrintableComponent { /** * A thin stroke. diff --git a/swing/src/net/sf/openrocket/gui/print/DesignReport.java b/swing/src/net/sf/openrocket/gui/print/DesignReport.java index 550381a1c0..d95f9fb8f4 100644 --- a/swing/src/net/sf/openrocket/gui/print/DesignReport.java +++ b/swing/src/net/sf/openrocket/gui/print/DesignReport.java @@ -7,44 +7,42 @@ import java.text.DecimalFormat; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.DefaultFontMapper; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.formatting.RocketDescriptor; import net.sf.openrocket.gui.figureelements.FigureElement; import net.sf.openrocket.gui.figureelements.RocketInfo; import net.sf.openrocket.gui.scalefigure.RocketPanel; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.AxialStage; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Chars; -import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.itextpdf.text.Document; -import com.itextpdf.text.DocumentException; -import com.itextpdf.text.Element; -import com.itextpdf.text.Paragraph; -import com.itextpdf.text.Rectangle; -import com.itextpdf.text.pdf.DefaultFontMapper; -import com.itextpdf.text.pdf.PdfContentByte; -import com.itextpdf.text.pdf.PdfPCell; -import com.itextpdf.text.pdf.PdfPTable; -import com.itextpdf.text.pdf.PdfWriter; - /** * <pre> * # Title # Section describing the rocket in general without motors @@ -164,11 +162,11 @@ public void writeToDocument(PdfWriter writer) { PrintUtilities.addText(document, PrintUtilities.BIG_BOLD, ROCKET_DESIGN); Rocket rocket = rocketDocument.getRocket(); - final Configuration configuration = rocket.getDefaultConfiguration().clone(); + final FlightConfiguration configuration = rocket.getSelectedConfiguration();//.clone(); configuration.setAllStages(); PdfContentByte canvas = writer.getDirectContent(); - final PrintFigure figure = new PrintFigure(configuration); + final PrintFigure figure = new PrintFigure(rocket); figure.setRotation(rotation); FigureElement cp = panel.getExtraCP(); @@ -179,7 +177,7 @@ public void writeToDocument(PdfWriter writer) { canvas.beginText(); canvas.setFontAndSize(ITextHelper.getBaseFont(), PrintUtilities.NORMAL_FONT_SIZE); - int figHeightPts = (int) (PrintUnit.METERS.toPoints(figure.getFigureHeight()) * 0.4 * (scale / PrintUnit.METERS + int figHeightPts = (int) (PrintUnit.METERS.toPoints(figure.getHeight()) * 0.4 * (scale / PrintUnit.METERS .toPoints(1))); final int diagramHeight = pageImageableHeight * 2 - 70 - (figHeightPts); canvas.moveText(document.leftMargin() + pageSize.getBorderWidthLeft(), diagramHeight); @@ -193,7 +191,7 @@ public void writeToDocument(PdfWriter writer) { canvas.showText("" + rocket.getStageCount()); - if (configuration.hasMotors()) { + if ( configuration.hasMotors()){ if (configuration.getStageCount() > 1) { canvas.newlineShowText(MASS_WITH_MOTORS); } else { @@ -223,27 +221,30 @@ public void writeToDocument(PdfWriter writer) { paragraph.setSpacingAfter(heightOfDiagramAndText); document.add(paragraph); - String[] motorIds = rocket.getFlightConfigurationIDs(); List<Simulation> simulations = rocketDocument.getSimulations(); - for (int j = 0; j < motorIds.length; j++) { - String motorId = motorIds[j]; - if (motorId != null) { - PdfPTable parent = new PdfPTable(2); - parent.setWidthPercentage(100); - parent.setHorizontalAlignment(Element.ALIGN_LEFT); - parent.setSpacingBefore(0); - parent.setWidths(new int[] { 1, 3 }); - int leading = 0; - //The first motor config is always null. Skip it and the top-most motor, then set the leading. - if (j > 1) { - leading = 25; - } - FlightData flight = findSimulation(motorId, simulations); - addFlightData(flight, rocket, motorId, parent, leading); - addMotorData(rocket, motorId, parent); - document.add(parent); + int motorNumber = 0; + for( FlightConfigurationId fcid : rocket.getIds()){ + + PdfPTable parent = new PdfPTable(2); + parent.setWidthPercentage(100); + parent.setHorizontalAlignment(Element.ALIGN_LEFT); + parent.setSpacingBefore(0); + parent.setWidths(new int[] { 1, 3 }); + + + int leading = 0; + //The first motor config is always null. Skip it and the top-most motor, then set the leading. + if ( motorNumber > 1) { + leading = 25; } + + FlightData flight = findSimulation( fcid, simulations); + addFlightData(flight, rocket, fcid, parent, leading); + addMotorData(rocket, fcid, parent); + document.add(parent); + + motorNumber++; } } catch (DocumentException e) { log.error("Could not modify document.", e); @@ -273,7 +274,7 @@ private double paintRocketDiagram(final int thePageImageableWidth, final int the theFigure.updateFigure(); double scale = - (thePageImageableWidth * 2.2) / theFigure.getFigureWidth(); + (thePageImageableWidth * 2.2) / theFigure.getWidth(); theFigure.setScale(scale); /* * page dimensions are in points-per-inch, which, in Java2D, are the same as pixels-per-inch; thus we don't need any conversion @@ -287,7 +288,7 @@ private double paintRocketDiagram(final int thePageImageableWidth, final int the int y = PrintUnit.POINTS_PER_INCH; //If the y dimension is negative, then it will potentially be drawn off the top of the page. Move the origin //to allow for this. - if (theFigure.getDimensions().getY() < 0.0d) { + if (theFigure.getHeight() < 0.0d) { y += (int) halfFigureHeight; } g2d.translate(20, y); @@ -305,7 +306,7 @@ private double paintRocketDiagram(final int thePageImageableWidth, final int the * @param motorId the motor ID to output * @param parent the parent to which the motor data will be added */ - private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) { + private void addMotorData(Rocket rocket, FlightConfigurationId motorId, final PdfPTable parent) { PdfPTable motorTable = new PdfPTable(8); motorTable.setWidthPercentage(68); @@ -325,10 +326,13 @@ private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) DecimalFormat ttwFormat = new DecimalFormat("0.00"); - MassCalculator massCalc = new BasicMassCalculator(); + MassCalculator massCalc = new MassCalculator(); - Configuration config = new Configuration(rocket); - config.setFlightConfigurationID(motorId); + if( !motorId.hasError() ){ + throw new IllegalStateException("Attempted to add motor data with an invalid fcid"); + } + rocket.createFlightConfiguration(motorId); + FlightConfiguration config = rocket.getFlightConfiguration( motorId); int totalMotorCount = 0; double totalPropMass = 0; @@ -341,10 +345,11 @@ private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) boolean topBorder = false; for (RocketComponent c : rocket) { - if (c instanceof Stage) { - config.setToStage(stage); + if (c instanceof AxialStage) { + config.clearAllStages(); + config.setOnlyStage(stage); stage++; - stageMass = massCalc.getCG(config, MassCalcType.LAUNCH_MASS).weight; + stageMass = massCalc.getCGAnalysis( config).get(stage).weight; // Calculate total thrust-to-weight from only lowest stage motors totalTTW = 0; topBorder = true; @@ -353,9 +358,10 @@ private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) if (c instanceof MotorMount && ((MotorMount) c).isMotorMount()) { MotorMount mount = (MotorMount) c; - if (mount.isMotorMount() && mount.getMotor(motorId) != null) { - Motor motor = mount.getMotor(motorId); - int motorCount = c.toAbsolute(Coordinate.NUL).length; + // TODO: refactor this... it's redundant with containing if, and could probably be simplified + if (mount.isMotorMount() && (mount.getMotorConfig(motorId) != null) &&(null != mount.getMotorConfig(motorId).getMotor())) { + Motor motor = mount.getMotorConfig(motorId).getMotor(); + int motorCount = mount.getMotorCount(); int border = Rectangle.NO_BORDER; @@ -385,7 +391,7 @@ private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) motorTable.addCell(ITextHelper.createCell( ttwFormat.format(ttw) + ":1", border)); - double propMass = (motor.getLaunchCG().weight - motor.getEmptyCG().weight); + double propMass = (motor.getLaunchMass() - motor.getBurnoutMass()); motorTable.addCell(ITextHelper.createCell( UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit(propMass), border)); @@ -426,7 +432,6 @@ private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) c.setBorder(PdfPCell.LEFT); c.setBorderWidthTop(0f); parent.addCell(c); - config.release(); } @@ -439,7 +444,7 @@ private void addMotorData(Rocket rocket, String motorId, final PdfPTable parent) * @param parent the parent to which the simulation flight data will be added * @param leading the number of points for the leading */ - private void addFlightData(final FlightData flight, final Rocket theRocket, final String motorId, final PdfPTable parent, int leading) { + private void addFlightData(final FlightData flight, final Rocket theRocket, final FlightConfigurationId motorId, final PdfPTable parent, int leading) { // Output the flight data if (flight != null) { @@ -505,13 +510,13 @@ private void addFlightData(final FlightData flight, final Rocket theRocket, fina * * @return the flight data from the simulation for the specified motor id, or null if not found */ - private FlightData findSimulation(final String motorId, List<Simulation> simulations) { + private FlightData findSimulation(final FlightConfigurationId motorId, List<Simulation> simulations) { // Perform flight simulation FlightData flight = null; try { for (int i = 0; i < simulations.size(); i++) { Simulation simulation = simulations.get(i); - if (Utils.equals(simulation.getOptions().getMotorConfigurationID(), motorId)) { + if (Utils.equals(simulation.getId(), motorId)) { simulation = simulation.copy(); simulation.simulate(); flight = simulation.getSimulatedData(); diff --git a/swing/src/net/sf/openrocket/gui/print/FinMarkingGuide.java b/swing/src/net/sf/openrocket/gui/print/FinMarkingGuide.java index d2509c1450..413d52cf4a 100644 --- a/swing/src/net/sf/openrocket/gui/print/FinMarkingGuide.java +++ b/swing/src/net/sf/openrocket/gui/print/FinMarkingGuide.java @@ -35,6 +35,7 @@ * give orientation. * <p/> */ +@SuppressWarnings("serial") public class FinMarkingGuide extends JPanel { /** @@ -286,7 +287,7 @@ private void paintFinMarkingGuide(Graphics2D g2) { } else if (externalComponent instanceof LaunchLug) { LaunchLug lug = (LaunchLug) externalComponent; - double angle = lug.getRadialDirection() - radialOrigin; + double angle = lug.getAngularOffset() - radialOrigin; while (angle < 0) { angle += TWO_PI; } @@ -330,7 +331,7 @@ private double findRadialOrigin(List<ExternalComponent> components) { for (ExternalComponent component : components) { if (component instanceof LaunchLug) { - double componentPosition = ((LaunchLug) component).getRadialDirection(); + double componentPosition = ((LaunchLug) component).getAngularOffset(); positions.add(makeZeroTwoPi(componentPosition)); } diff --git a/swing/src/net/sf/openrocket/gui/print/PrintFigure.java b/swing/src/net/sf/openrocket/gui/print/PrintFigure.java index 648e7231ba..3447135059 100644 --- a/swing/src/net/sf/openrocket/gui/print/PrintFigure.java +++ b/swing/src/net/sf/openrocket/gui/print/PrintFigure.java @@ -4,27 +4,22 @@ package net.sf.openrocket.gui.print; import net.sf.openrocket.gui.scalefigure.RocketFigure; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.Rocket; /** * A figure used to override the scale factor in RocketFigure. This allows pinpoint scaling to allow a diagram * to fit in the width of the chosen page size. */ public class PrintFigure extends RocketFigure { - + private static final long serialVersionUID = -3843219909502782607L; + /** * Constructor. * * @param configuration the configuration */ - public PrintFigure(final Configuration configuration) { - super(configuration); - } - - @Override - protected double computeTy(int heightPx) { - super.computeTy(heightPx); - return 0; + public PrintFigure(final Rocket rkt) { + super(rkt); } public void setScale(final double theScale) { @@ -33,6 +28,6 @@ public void setScale(final double theScale) { } public double getFigureHeightPx() { - return this.figureHeightPx; + return this.getSize().height; } } diff --git a/swing/src/net/sf/openrocket/gui/print/PrintableCenteringRing.java b/swing/src/net/sf/openrocket/gui/print/PrintableCenteringRing.java index 4bd361bc10..2b2d29d3fe 100644 --- a/swing/src/net/sf/openrocket/gui/print/PrintableCenteringRing.java +++ b/swing/src/net/sf/openrocket/gui/print/PrintableCenteringRing.java @@ -20,6 +20,7 @@ * This class creates a renderable centering ring. It depends only on AWT/Swing and can be called from other actors * (like iText handlers) to render the centering ring on different graphics contexts. */ +@SuppressWarnings("serial") public class PrintableCenteringRing extends AbstractPrintable<CenteringRing> { /** * If the component to be drawn is a centering ring, save a reference to it. @@ -74,7 +75,7 @@ private PrintableCenteringRing(CenteringRing theRing, List<InnerTube> theMotorMo List<Coordinate> points = new ArrayList<Coordinate>(); //Transform the radial positions of the tubes. for (InnerTube it : theMotorMounts) { - if (it.getClusterCount() > 1) { + if (it.getInstanceCount() > 1) { List<Coordinate> c = it.getClusterPoints(); for (Coordinate coordinate : c) { points.add(coordinate.setX(it.getOuterRadius())); diff --git a/swing/src/net/sf/openrocket/gui/print/PrintableNoseCone.java b/swing/src/net/sf/openrocket/gui/print/PrintableNoseCone.java index dd68471084..903506af71 100644 --- a/swing/src/net/sf/openrocket/gui/print/PrintableNoseCone.java +++ b/swing/src/net/sf/openrocket/gui/print/PrintableNoseCone.java @@ -1,14 +1,16 @@ package net.sf.openrocket.gui.print; import net.sf.openrocket.gui.print.visitor.PageFitPrintStrategy; +import net.sf.openrocket.gui.rocketfigure.RocketComponentShape; import net.sf.openrocket.gui.rocketfigure.TransitionShapes; import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; import java.awt.Graphics2D; import java.awt.Rectangle; -import java.awt.Shape; +@SuppressWarnings("serial") public class PrintableNoseCone extends AbstractPrintable<NoseCone> { /** @@ -56,14 +58,14 @@ protected void init(NoseCone component) { */ @Override protected void draw(Graphics2D g2) { - Shape[] shapes = TransitionShapes.getShapesSide(target, Transformation.rotate_x(0d), PrintUnit.METERS.toPoints(1)); + RocketComponentShape[] compShapes = TransitionShapes.getShapesSide(target, Transformation.IDENTITY, PrintUnit.METERS.toPoints(1)); - if (shapes != null && shapes.length > 0) { - Rectangle r = shapes[0].getBounds(); + if (compShapes != null && compShapes.length > 0) { + Rectangle r = compShapes[0].shape.getBounds(); g2.translate(r.getHeight() / 2, 0); g2.rotate(Math.PI / 2); - for (Shape shape : shapes) { - g2.draw(shape); + for (RocketComponentShape shape : compShapes) { + g2.draw(shape.shape); } g2.rotate(-Math.PI / 2); } diff --git a/swing/src/net/sf/openrocket/gui/print/components/CheckTreeCellRenderer.java b/swing/src/net/sf/openrocket/gui/print/components/CheckTreeCellRenderer.java index e4a933738a..dd6fbd3f65 100644 --- a/swing/src/net/sf/openrocket/gui/print/components/CheckTreeCellRenderer.java +++ b/swing/src/net/sf/openrocket/gui/print/components/CheckTreeCellRenderer.java @@ -18,6 +18,7 @@ * <p/> * Based in part on a blog by Santhosh Kumar. http://www.jroller.com/santhosh/date/20050610 */ +@SuppressWarnings("serial") public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer { /** diff --git a/swing/src/net/sf/openrocket/gui/print/components/CheckTreeSelectionModel.java b/swing/src/net/sf/openrocket/gui/print/components/CheckTreeSelectionModel.java index 71f05bb8c0..a00e30a4e3 100644 --- a/swing/src/net/sf/openrocket/gui/print/components/CheckTreeSelectionModel.java +++ b/swing/src/net/sf/openrocket/gui/print/components/CheckTreeSelectionModel.java @@ -14,6 +14,7 @@ * This class implements the selection model for the checkbox tree. This specifically is used to keep * track of the TreePaths that have a selected CheckBox. */ +@SuppressWarnings("serial") public class CheckTreeSelectionModel extends DefaultTreeSelectionModel { /** diff --git a/swing/src/net/sf/openrocket/gui/print/components/RocketPrintTree.java b/swing/src/net/sf/openrocket/gui/print/components/RocketPrintTree.java index 5296ea478d..dd87045114 100644 --- a/swing/src/net/sf/openrocket/gui/print/components/RocketPrintTree.java +++ b/swing/src/net/sf/openrocket/gui/print/components/RocketPrintTree.java @@ -6,7 +6,7 @@ import net.sf.openrocket.gui.print.OpenRocketPrintable; import net.sf.openrocket.gui.print.PrintableContext; import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import javax.swing.*; import javax.swing.event.TreeExpansionEvent; @@ -23,6 +23,7 @@ /** * A specialized JTree for displaying various rocket items that can be printed. */ +@SuppressWarnings("serial") public class RocketPrintTree extends JTree { /** @@ -70,7 +71,7 @@ public static RocketPrintTree create(String rocketName, List<RocketComponent> st toAddTo = parent; } for (RocketComponent stage : stages) { - if (stage instanceof Stage) { + if (stage instanceof AxialStage) { toAddTo.add(createNamedVector(stage.getName(), createPrintTreeNode(true), stage.getStageNumber())); } } diff --git a/swing/src/net/sf/openrocket/gui/print/visitor/CenteringRingStrategy.java b/swing/src/net/sf/openrocket/gui/print/visitor/CenteringRingStrategy.java index e1f69e1407..c8691a4563 100644 --- a/swing/src/net/sf/openrocket/gui/print/visitor/CenteringRingStrategy.java +++ b/swing/src/net/sf/openrocket/gui/print/visitor/CenteringRingStrategy.java @@ -8,6 +8,7 @@ import net.sf.openrocket.rocketcomponent.CenteringRing; import net.sf.openrocket.rocketcomponent.InnerTube; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.util.ArrayList; import java.util.List; @@ -86,8 +87,8 @@ private List<InnerTube> findMotorMount(CenteringRing rc) { * @return true if the two physically intersect, from which we infer that the centering ring supports the tube */ private boolean overlaps(CenteringRing one, InnerTube two) { - final double crTopPosition = one.asPositionValue(RocketComponent.Position.ABSOLUTE, one.getParent()); - final double mmTopPosition = two.asPositionValue(RocketComponent.Position.ABSOLUTE, two.getParent()); + final double crTopPosition = one.getAxialOffset( AxialMethod.ABSOLUTE); + final double mmTopPosition = two.getAxialOffset( AxialMethod.ABSOLUTE); final double crBottomPosition = one.getLength() + crTopPosition; final double mmBottomPosition = two.getLength() + mmTopPosition; @@ -108,8 +109,7 @@ private boolean overlaps(CenteringRing one, InnerTube two) { */ private void render(final CenteringRing component) { try { - AbstractPrintable pfs; - pfs = PrintableCenteringRing.create(component, findMotorMount(component)); + AbstractPrintable<CenteringRing> pfs = PrintableCenteringRing.create(component, findMotorMount(component)); render(pfs); } diff --git a/swing/src/net/sf/openrocket/gui/print/visitor/PartsDetailVisitorStrategy.java b/swing/src/net/sf/openrocket/gui/print/visitor/PartsDetailVisitorStrategy.java index 08df0cc556..fbc56feb66 100644 --- a/swing/src/net/sf/openrocket/gui/print/visitor/PartsDetailVisitorStrategy.java +++ b/swing/src/net/sf/openrocket/gui/print/visitor/PartsDetailVisitorStrategy.java @@ -33,7 +33,7 @@ import net.sf.openrocket.rocketcomponent.RingComponent; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.ShockCord; -import net.sf.openrocket.rocketcomponent.Stage; +import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.rocketcomponent.Streamer; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.unit.Unit; @@ -150,7 +150,7 @@ protected void goDeep (final List<RocketComponent> theRc) { private void handle (RocketComponent component) { //This ugly if-then-else construct is not object oriented. Originally it was an elegant, and very OO savy, design //using the Visitor pattern. Unfortunately, it was misunderstood and was removed. - if (component instanceof Stage) { + if (component instanceof AxialStage) { try { if (grid != null) { document.add(grid); diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/BodyTubeShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/BodyTubeShapes.java index aa299490d1..09bb9d93ec 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/BodyTubeShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/BodyTubeShapes.java @@ -1,45 +1,37 @@ package net.sf.openrocket.gui.rocketfigure; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.Transformation; - import java.awt.Shape; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Rectangle2D; +import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.util.Transformation; -public class BodyTubeShapes extends RocketComponentShapes { +public class BodyTubeShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.BodyTube tube = (net.sf.openrocket.rocketcomponent.BodyTube)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + BodyTube tube = (BodyTube)component; + double length = tube.getLength(); double radius = tube.getOuterRadius(); - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[1]; + s[0] = TubeShapes.getShapesSide( transformation, length, radius ); - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Rectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S); - } - return s; + return RocketComponentShape.toArray(s, component); } + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.BodyTube tube = (net.sf.openrocket.rocketcomponent.BodyTube)component; - - double or = tube.getOuterRadius(); - - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + BodyTube tube = (BodyTube)component; + + double radius = tube.getOuterRadius(); - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - return s; + Shape[] s = new Shape[1]; + s[0] = TubeShapes.getShapesBack( transformation, radius); + + return RocketComponentShape.toArray(s, component); } diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/FinSetShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/FinSetShapes.java index 0eb856f55f..4fb738e9ab 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/FinSetShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/FinSetShapes.java @@ -2,138 +2,129 @@ import java.awt.Shape; import java.awt.geom.Path2D; +import java.util.ArrayList; +import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; -public class FinSetShapes extends RocketComponentShapes { +public class FinSetShapes extends RocketComponentShape { - // TODO: LOW: Clustering is ignored (FinSet cannot currently be clustered) - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.FinSet finset = (net.sf.openrocket.rocketcomponent.FinSet)component; - - - int fins = finset.getFinCount(); - Transformation cantRotation = finset.getCantRotation(); - Transformation baseRotation = finset.getBaseRotationTransformation(); - Transformation finRotation = finset.getFinRotationTransformation(); - - Coordinate finPoints[] = finset.getFinPointsWithTab(); - - - // TODO: MEDIUM: sloping radius - double radius = finset.getBodyRadius(); - - // Translate & rotate the coordinates - for (int i=0; i<finPoints.length; i++) { - finPoints[i] = cantRotation.transform(finPoints[i]); - finPoints[i] = baseRotation.transform(finPoints[i].add(0,radius,0)); - } + public static RocketComponentShape[] getShapesSide( final RocketComponent component, + final Transformation transformation){ + final FinSet finset = (FinSet) component; + // this supplied transformation includes: + // - baseRotationTransformation + // - mount-radius transformtion + // - component-center offset transformation + // - component-instance offset transformation + + /** + * this supplied location contains the *instance* location... but is expected to contain the *component* location. (?) + * also, this requires changing machinery beyond this class. :( + */ + final Transformation cantRotation = finset.getCantRotation(); + + final Transformation compositeTransform = cantRotation.applyTransformation( transformation); + Coordinate finPoints[] = finset.getFinPoints(); + Coordinate tabPoints[] = finset.getTabPoints(); + Coordinate rootPoints[] = finset.getRootPoints(); + + // Translate & rotate points into place + finPoints = compositeTransform.transform( finPoints ); + tabPoints = compositeTransform.transform( tabPoints); + rootPoints = compositeTransform.transform( rootPoints ); + // Generate shapes - Shape[] s = new Shape[fins]; - for (int fin=0; fin<fins; fin++) { - Coordinate a; - Path2D.Float p; + ArrayList<RocketComponentShape> shapeList = new ArrayList<>(); + + // Make fin polygon + shapeList.add(new RocketComponentShape(generatePath(finPoints), finset)); - // Make polygon - p = new Path2D.Float(); - for (int i=0; i<finPoints.length; i++) { - a = transformation.transform(finset.toAbsolute(finPoints[i])[0]); - if (i==0) - p.moveTo(a.x*S, a.y*S); - else - p.lineTo(a.x*S, a.y*S); - } - - p.closePath(); - s[fin] = p; + // Make fin polygon + shapeList.add(new RocketComponentShape(generatePath(tabPoints), finset)); - // Rotate fin coordinates - for (int i=0; i<finPoints.length; i++) - finPoints[i] = finRotation.transform(finPoints[i]); - } - - return s; + // Make fin polygon + shapeList.add(new RocketComponentShape(generatePath(rootPoints), finset)); + + return shapeList.toArray(new RocketComponentShape[0]); } - - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.FinSet finset = (net.sf.openrocket.rocketcomponent.FinSet)component; + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { - if (MathUtil.equals(finset.getCantAngle(),0)) - return uncantedShapesBack(finset, transformation); - else - return cantedShapesBack(finset, transformation); + FinSet finset = (FinSet) component; + Shape[] toReturn; + + if (MathUtil.equals(finset.getCantAngle(), 0)) { + toReturn = uncantedShapesBack(finset, transformation); + } else { + toReturn = cantedShapesBack(finset, transformation); + } + + + return RocketComponentShape.toArray(toReturn, finset); + } + + private static Path2D.Float generatePath(final Coordinate[] points){ + Path2D.Float finShape = new Path2D.Float(); + for( int i = 0; i < points.length; i++){ + Coordinate curPoint = points[i]; + if (i == 0) + finShape.moveTo(curPoint.x, curPoint.y); + else + finShape.lineTo(curPoint.x, curPoint.y); + } + return finShape; } - - private static Shape[] uncantedShapesBack(net.sf.openrocket.rocketcomponent.FinSet finset, + private static Shape[] uncantedShapesBack(FinSet finset, Transformation transformation) { - int fins = finset.getFinCount(); - double radius = finset.getBodyRadius(); double thickness = finset.getThickness(); double height = finset.getSpan(); - Transformation baseRotation = finset.getBaseRotationTransformation(); - Transformation finRotation = finset.getFinRotationTransformation(); - - // Generate base coordinates for a single fin Coordinate c[] = new Coordinate[4]; - c[0]=new Coordinate(0,radius,-thickness/2); - c[1]=new Coordinate(0,radius,thickness/2); - c[2]=new Coordinate(0,height+radius,thickness/2); - c[3]=new Coordinate(0,height+radius,-thickness/2); + c[0]=new Coordinate(0, 0,-thickness/2); + c[1]=new Coordinate(0, 0,thickness/2); + c[2]=new Coordinate(0,height,thickness/2); + c[3]=new Coordinate(0,height,-thickness/2); // Apply base rotation - transformPoints(c,baseRotation); + c = transformation.transform(c); + + // Make polygon + Coordinate a; + Path2D.Double p = new Path2D.Double(); - // Generate shapes - Shape[] s = new Shape[fins]; - for (int fin=0; fin<fins; fin++) { - Coordinate a; - Path2D.Double p; - - // Make polygon - p = new Path2D.Double(); - a = transformation.transform(finset.toAbsolute(c[0])[0]); - p.moveTo(a.z*S, a.y*S); - a = transformation.transform(finset.toAbsolute(c[1])[0]); - p.lineTo(a.z*S, a.y*S); - a = transformation.transform(finset.toAbsolute(c[2])[0]); - p.lineTo(a.z*S, a.y*S); - a = transformation.transform(finset.toAbsolute(c[3])[0]); - p.lineTo(a.z*S, a.y*S); - p.closePath(); - s[fin] = p; - - // Rotate fin coordinates - transformPoints(c,finRotation); - } + a = c[0]; + p.moveTo(a.z, a.y); + a = c[1]; + p.lineTo(a.z, a.y); + a = c[2]; + p.lineTo(a.z, a.y); + a = c[3]; + p.lineTo(a.z, a.y); + p.closePath(); - return s; + return new Shape[]{p}; } // TODO: LOW: Jagged shapes from back draw incorrectly. - private static Shape[] cantedShapesBack(net.sf.openrocket.rocketcomponent.FinSet finset, + private static Shape[] cantedShapesBack(FinSet finset, Transformation transformation) { int i; int fins = finset.getFinCount(); - double radius = finset.getBodyRadius(); double thickness = finset.getThickness(); - Transformation baseRotation = finset.getBaseRotationTransformation(); - Transformation finRotation = finset.getFinRotationTransformation(); Transformation cantRotation = finset.getCantRotation(); Coordinate[] sidePoints; @@ -146,9 +137,9 @@ private static Shape[] cantedShapesBack(net.sf.openrocket.rocketcomponent.FinSet break; } - transformPoints(points,cantRotation); - transformPoints(points,new Transformation(0,radius,0)); - transformPoints(points,baseRotation); + points = cantRotation.transform( points ); +// transformPoints(points,new Transformation(0,radius,0)); + points = transformation.transform( points ); sidePoints = new Coordinate[points.length]; @@ -183,10 +174,6 @@ private static Shape[] cantedShapesBack(net.sf.openrocket.rocketcomponent.FinSet s[2*fin] = makePolygonBack(sidePoints,finset,transformation); s[2*fin+1] = makePolygonBack(backPoints,finset,transformation); - - // Rotate fin coordinates - transformPoints(sidePoints,finRotation); - transformPoints(backPoints,finRotation); } } else { @@ -194,7 +181,6 @@ private static Shape[] cantedShapesBack(net.sf.openrocket.rocketcomponent.FinSet s = new Shape[fins]; for (int fin=0; fin<fins; fin++) { s[fin] = makePolygonBack(sidePoints,finset,transformation); - transformPoints(sidePoints,finRotation); } } @@ -202,26 +188,19 @@ private static Shape[] cantedShapesBack(net.sf.openrocket.rocketcomponent.FinSet return s; } - - - private static void transformPoints(Coordinate[] array, Transformation t) { - for (int i=0; i < array.length; i++) { - array[i] = t.transform(array[i]); - } - } - - private static Shape makePolygonBack(Coordinate[] array, net.sf.openrocket.rocketcomponent.FinSet finset, - Transformation t) { + private static Shape makePolygonBack(Coordinate[] array, FinSet finset, final Transformation t) { Path2D.Float p; + Coordinate compCenter = t.transform(Coordinate.ZERO); + // Make polygon p = new Path2D.Float(); for (int i=0; i < array.length; i++) { - Coordinate a = t.transform(finset.toAbsolute(array[i])[0]); + Coordinate a = t.transform(compCenter.add( array[i]) ); if (i==0) - p.moveTo(a.z*S, a.y*S); + p.moveTo(a.z, a.y); else - p.lineTo(a.z*S, a.y*S); + p.lineTo(a.z, a.y); } p.closePath(); return p; diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/LaunchLugShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/LaunchLugShapes.java index f7084ee6c4..1b9bd70ce2 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/LaunchLugShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/LaunchLugShapes.java @@ -1,44 +1,36 @@ package net.sf.openrocket.gui.rocketfigure; +import java.awt.Shape; + import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; -import java.awt.Shape; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Rectangle2D; +import net.sf.openrocket.rocketcomponent.LaunchLug; +import net.sf.openrocket.rocketcomponent.RocketComponent; - -public class LaunchLugShapes extends RocketComponentShapes { +public class LaunchLugShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.LaunchLug lug = (net.sf.openrocket.rocketcomponent.LaunchLug)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { - double length = lug.getLength(); + LaunchLug lug = (LaunchLug)component; + double length = lug.getLength(); double radius = lug.getOuterRadius(); - Coordinate[] start = transformation.transform(lug.toAbsolute(new Coordinate(0,0,0))); + + Shape[] s = new Shape[]{ + TubeShapes.getShapesSide( transformation, length, radius ) + }; - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Rectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S); - } - return s; + return RocketComponentShape.toArray(s, component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.LaunchLug lug = (net.sf.openrocket.rocketcomponent.LaunchLug)component; - - double or = lug.getOuterRadius(); - - Coordinate[] start = transformation.transform(lug.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - return s; + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + + LaunchLug lug = (LaunchLug)component; + double radius = lug.getOuterRadius(); + + Shape[] s = new Shape[]{TubeShapes.getShapesBack( transformation, radius)}; + + return RocketComponentShape.toArray(s, component); } } diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java index 20730e33d4..3f8edb5a09 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/MassComponentShapes.java @@ -8,29 +8,29 @@ import java.awt.geom.RoundRectangle2D; import java.util.Random; +import net.sf.openrocket.rocketcomponent.MassComponent; +import net.sf.openrocket.rocketcomponent.MassObject; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; -public class MassComponentShapes extends RocketComponentShapes { +public class MassComponentShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; - net.sf.openrocket.rocketcomponent.MassComponent.MassComponentType type = ((net.sf.openrocket.rocketcomponent.MassComponent)component).getMassComponentType(); + MassComponent.MassComponentType type = ((MassComponent)component).getMassComponentType(); double length = tube.getLength(); double radius = tube.getRadius(); double arc = Math.min(length, 2*radius) * 0.7; - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S,arc*S,arc*S); - } + + final Coordinate start = transformation.transform(Coordinate.ZERO); + + Shape[] s = {new RoundRectangle2D.Double(start.x, (start.y-radius), length, 2*radius, arc, arc)}; switch (type) { case ALTIMETER: @@ -57,23 +57,21 @@ public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComp case MASSCOMPONENT: } - return s; + return RocketComponentShape.toArray(s, component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; double or = tube.getRadius(); - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - return s; + final Coordinate start = transformation.transform(Coordinate.ZERO); + + Shape[] s = {new Ellipse2D.Double((start.z-or),(start.y-or),2*or,2*or)}; + + return RocketComponentShape.toArray(s, component); } private static Shape[] addAltimeterSymbol(Shape[] baseShape){ diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java index 23ab0dee49..4687220ec0 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/MassObjectShapes.java @@ -4,44 +4,41 @@ import java.awt.geom.Ellipse2D; import java.awt.geom.RoundRectangle2D; +import net.sf.openrocket.rocketcomponent.MassObject; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; -public class MassObjectShapes extends RocketComponentShapes { +public class MassObjectShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + MassObject tube = (MassObject)component; double length = tube.getLength(); double radius = tube.getRadius(); double arc = Math.min(length, 2*radius) * 0.7; - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S,arc*S,arc*S); - } - return s; + Coordinate start = transformation.transform(Coordinate.ZERO); + + Shape[] s = {new RoundRectangle2D.Double(start.x, (start.y-radius), length, 2*radius, arc, arc)}; + + return RocketComponentShape.toArray(s, component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + + MassObject tube = (MassObject)component; double or = tube.getRadius(); - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + final Coordinate start = transformation.transform(Coordinate.ZERO); - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - return s; + Shape[] s = {new Ellipse2D.Double((start.z-or), (start.y-or), 2*or, 2*or)}; + + return RocketComponentShape.toArray(s, component); } } diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/ParachuteShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/ParachuteShapes.java index 6a3fed87ef..e8c33d240f 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/ParachuteShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/ParachuteShapes.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.rocketfigure; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; @@ -10,39 +11,39 @@ import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; -public class ParachuteShapes extends RocketComponentShapes { +public class ParachuteShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; double length = tube.getLength(); double radius = tube.getRadius(); double arc = Math.min(length, 2*radius) * 0.7; - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + + Coordinate start = transformation.transform( Coordinate.ZERO); - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S,arc*S,arc*S); - } - return addSymbol(s); + Shape[] s = new Shape[1]; + + s[0] = new RoundRectangle2D.Double(start.x, (start.y-radius), length, 2*radius, arc, arc); + + return RocketComponentShape.toArray( addSymbol(s), component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; double or = tube.getRadius(); - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); + Coordinate[] start = transformation.transform(tube.toAbsolute(Coordinate.ZERO)); Shape[] s = new Shape[start.length]; for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); + s[i] = new Ellipse2D.Double((start[i].z-or),(start[i].y-or),2*or,2*or); } - return s; + return RocketComponentShape.toArray( s, component); } private static Shape[] addSymbol(Shape[] baseShape){ diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/RailButtonShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/RailButtonShapes.java new file mode 100644 index 0000000000..2b15b9a796 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/RailButtonShapes.java @@ -0,0 +1,144 @@ +package net.sf.openrocket.gui.rocketfigure; + +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; +import java.awt.geom.Path2D; +import java.awt.geom.Point2D; + +import net.sf.openrocket.rocketcomponent.RailButton; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Transformation; + + +public class RailButtonShapes extends RocketComponentShape { + + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + RailButton btn = (RailButton)component; + + final double rotation_rad = btn.getAngleOffset(); + final double baseHeight = btn.getStandoff(); + final double innerHeight = btn.getInnerHeight(); + final double flangeHeight = btn.getFlangeHeight(); + final double outerDiameter = btn.getOuterDiameter(); + final double outerRadius = outerDiameter/2; + final double innerDiameter = btn.getInnerDiameter(); + final double innerRadius = innerDiameter/2; + + final double sinr = Math.abs(Math.sin(rotation_rad)); + final double cosr = Math.cos(rotation_rad); + final double baseHeightcos = baseHeight*cosr; + final double innerHeightcos = innerHeight*cosr; + final double flangeHeightcos = flangeHeight*cosr; + + final Coordinate instanceAbsoluteLocation = transformation.transform(Coordinate.ZERO); + + System.err.println(String.format("Generating Shapes for RailButtons...")); + System.err.println(String.format(" @ %s", instanceAbsoluteLocation)); + + + Path2D.Double path = new Path2D.Double(); + {// central pillar + final double drawWidth = outerDiameter; + final double drawHeight = outerDiameter*sinr; + final Point2D.Double center = new Point2D.Double( instanceAbsoluteLocation.x, instanceAbsoluteLocation.y ); + Point2D.Double lowerLeft = new Point2D.Double( center.x - outerRadius, center.y-outerRadius*sinr); + path.append( new Ellipse2D.Double( lowerLeft.x, lowerLeft.y, drawWidth, drawHeight), false); + + path.append( new Line2D.Double( lowerLeft.x, center.y, lowerLeft.x, (center.y+baseHeightcos) ), false); + path.append( new Line2D.Double( (center.x+outerRadius), center.y, (center.x+outerRadius), (center.y+baseHeightcos) ), false); + + path.append( new Ellipse2D.Double( lowerLeft.x, (lowerLeft.y+baseHeightcos), drawWidth, drawHeight), false); + } + + {// inner flange + final double drawWidth = innerDiameter; + final double drawHeight = innerDiameter*sinr; + final Point2D.Double center = new Point2D.Double( instanceAbsoluteLocation.x, instanceAbsoluteLocation.y + baseHeightcos); + final Point2D.Double lowerLeft = new Point2D.Double( center.x - innerRadius, center.y-innerRadius*sinr); + path.append( new Ellipse2D.Double( lowerLeft.x, lowerLeft.y, drawWidth, drawHeight), false); + + path.append( new Line2D.Double( lowerLeft.x, center.y, lowerLeft.x, (center.y+innerHeightcos) ), false); + path.append( new Line2D.Double( (center.x+innerRadius), center.y, (center.x+innerRadius), (center.y+innerHeightcos) ), false); + + path.append( new Ellipse2D.Double( lowerLeft.x, (lowerLeft.y+innerHeightcos), drawWidth, drawHeight), false); + } + {// outer flange + final double drawWidth = outerDiameter; + final double drawHeight = outerDiameter*sinr; + final Point2D.Double center = new Point2D.Double( instanceAbsoluteLocation.x, instanceAbsoluteLocation.y+baseHeightcos+innerHeightcos); + final Point2D.Double lowerLeft = new Point2D.Double( center.x - outerRadius, center.y-outerRadius*sinr); + path.append( new Ellipse2D.Double( lowerLeft.x, lowerLeft.y, drawWidth, drawHeight), false); + + path.append( new Line2D.Double( lowerLeft.x, center.y, lowerLeft.x, (center.y+flangeHeightcos) ), false); + path.append( new Line2D.Double( (center.x+outerRadius), center.y, (center.x+outerRadius), (center.y+flangeHeightcos) ), false); + + path.append( new Ellipse2D.Double( lowerLeft.x, (lowerLeft.y+flangeHeightcos), drawWidth, drawHeight), false); + } + + return RocketComponentShape.toArray( new Shape[]{ path }, component ); + } + + + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + + RailButton btn = (RailButton)component; + + final double rotation_rad = btn.getAngleOffset(); + final double sinr = Math.sin(rotation_rad); + final double cosr = Math.cos(rotation_rad); + final double baseHeight = btn.getStandoff(); + final double innerHeight = btn.getInnerHeight(); + final double flangeHeight = btn.getFlangeHeight(); + + final double outerDiameter = btn.getOuterDiameter(); + final double outerRadius = outerDiameter/2; + final double innerDiameter = btn.getInnerDiameter(); + final double innerRadius = innerDiameter/2; + + Coordinate[] inst = {transformation.transform(Coordinate.ZERO)}; + + Shape[] s = new Shape[inst.length]; + for (int i=0; i < inst.length; i++) { + Path2D.Double compound = new Path2D.Double(); + s[i] = compound; + // base + compound.append( getRotatedRectangle( inst[i].z, inst[i].y, outerRadius, baseHeight, rotation_rad), false ); + + {// inner + final double delta_r = baseHeight; + final double delta_y = delta_r*cosr; + final double delta_z = delta_r*sinr; + compound.append( getRotatedRectangle( inst[i].z+delta_z, inst[i].y+delta_y, innerRadius, innerHeight, rotation_rad ), false); + } + {// outer flange + final double delta_r = baseHeight + innerHeight; + final double delta_y = delta_r*cosr; + final double delta_z = delta_r*sinr; + compound.append( getRotatedRectangle( inst[i].z+delta_z, inst[i].y+delta_y, outerRadius, flangeHeight, rotation_rad ), false); + } + } + + return RocketComponentShape.toArray(s, component); + } + + + + public static Shape getRotatedRectangle( final double x, final double y, final double radius, final double height, final double angle_rad ){ + Path2D.Double rect = new Path2D.Double(); + final double sinr = Math.sin(angle_rad); + final double cosr = Math.cos(angle_rad); + + rect.moveTo( (x-radius*cosr), (y+radius*sinr)); + rect.lineTo( (x-radius*cosr+height*sinr), (y+radius*sinr+height*cosr)); + rect.lineTo( (x+radius*cosr+height*sinr), (y-radius*sinr+height*cosr)); + rect.lineTo( (x+radius*cosr), (y-radius*sinr)); + rect.closePath(); + // add points + + + return rect; + } +} diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/RingComponentShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/RingComponentShapes.java index 6cf6fe3381..503a2d9292 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/RingComponentShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/RingComponentShapes.java @@ -2,76 +2,60 @@ import java.awt.Shape; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Rectangle2D; -import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.rocketcomponent.RingComponent; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Transformation; -public class RingComponentShapes extends RocketComponentShapes { +public class RingComponentShapes extends RocketComponentShape { + + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { net.sf.openrocket.rocketcomponent.RingComponent tube = (net.sf.openrocket.rocketcomponent.RingComponent)component; Shape[] s; double length = tube.getLength(); - double or = tube.getOuterRadius(); - double ir = tube.getInnerRadius(); + double outerRadius = tube.getOuterRadius(); + double innerRadius = tube.getInnerRadius(); - - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - if ((or-ir >= 0.0012) && (ir > 0)) { + if ((outerRadius-innerRadius >= 0.0012) && (innerRadius > 0)) { // Draw outer and inner - s = new Shape[start.length*2]; - for (int i=0; i < start.length; i++) { - s[2*i] = new Rectangle2D.Double(start[i].x*S,(start[i].y-or)*S, - length*S,2*or*S); - s[2*i+1] = new Rectangle2D.Double(start[i].x*S,(start[i].y-ir)*S, - length*S,2*ir*S); - } + s = new Shape[] { + TubeShapes.getShapesSide(transformation, length, outerRadius), + TubeShapes.getShapesSide(transformation, length, innerRadius) + }; } else { // Draw only outer - s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Rectangle2D.Double(start[i].x*S,(start[i].y-or)*S, - length*S,2*or*S); - } + s = new Shape[] { + TubeShapes.getShapesSide(transformation, length, outerRadius) + }; } - return s; + return RocketComponentShape.toArray( s, component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.RingComponent tube = (net.sf.openrocket.rocketcomponent.RingComponent)component; + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + + RingComponent tube = (net.sf.openrocket.rocketcomponent.RingComponent)component; Shape[] s; - double or = tube.getOuterRadius(); - double ir = tube.getInnerRadius(); + double outerRadius = tube.getOuterRadius(); + double innerRadius = tube.getInnerRadius(); + + if ((outerRadius-innerRadius >= 0.0012) && (innerRadius > 0)) { + s = new Shape[] { + TubeShapes.getShapesBack(transformation, outerRadius), + TubeShapes.getShapesBack(transformation, innerRadius) + }; + }else { + s = new Shape[] { + TubeShapes.getShapesBack(transformation, outerRadius) + }; + } - - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - if ((ir < or) && (ir > 0)) { - // Draw inner and outer - s = new Shape[start.length*2]; - for (int i=0; i < start.length; i++) { - s[2*i] = new Ellipse2D.Double((start[i].z-or)*S, (start[i].y-or)*S, - 2*or*S, 2*or*S); - s[2*i+1] = new Ellipse2D.Double((start[i].z-ir)*S, (start[i].y-ir)*S, - 2*ir*S, 2*ir*S); - } - } else { - // Draw only outer - s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - } - return s; + return RocketComponentShape.toArray( s, component); } } diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/RocketComponentShape.java b/swing/src/net/sf/openrocket/gui/rocketfigure/RocketComponentShape.java new file mode 100644 index 0000000000..29603ffc3c --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/RocketComponentShape.java @@ -0,0 +1,76 @@ +package net.sf.openrocket.gui.rocketfigure; + + +import java.awt.Shape; + +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.LineStyle; +import net.sf.openrocket.util.Transformation; + + +/** + * A catch-all, no-operation drawing component. + */ +public class RocketComponentShape { + + final public boolean hasShape; + final public Shape shape; + final public net.sf.openrocket.util.Color color; + final public LineStyle lineStyle; + final public RocketComponent component; + + //fillColor); + //borderColor); + + protected RocketComponentShape(){ + this.hasShape = false; + this.shape = null; + this.color = null; + this.lineStyle = null; + this.component=null; + } + + public RocketComponentShape( final Shape _shape, final RocketComponent _comp){ + this.shape = _shape; + this.color = _comp.getColor(); + this.lineStyle = _comp.getLineStyle(); + this.component = _comp; + + if( null == _shape ){ + this.hasShape = false; + }else{ + this.hasShape = true; + } + } + + public RocketComponent getComponent(){ + return this.component; + } + + + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + // no-op + Application.getExceptionHandler().handleErrorCondition("ERROR: RocketComponent.getShapesSide called with " + + component); + return new RocketComponentShape[0]; + } + + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + // no-op + Application.getExceptionHandler().handleErrorCondition("ERROR: RocketComponent.getShapesBack called with " + +component); + return new RocketComponentShape[0]; + } + + public static RocketComponentShape[] toArray( final Shape[] shapeArray, final RocketComponent rc){ + RocketComponentShape[] toReturn = new RocketComponentShape[ shapeArray.length]; + for ( int curShapeIndex=0;curShapeIndex<shapeArray.length; curShapeIndex++){ + Shape curShape = shapeArray[curShapeIndex ]; + toReturn[curShapeIndex] = new RocketComponentShape( curShape, rc); + } + return toReturn; + } + + +} diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/RocketComponentShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/RocketComponentShapes.java deleted file mode 100644 index 430962738c..0000000000 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/RocketComponentShapes.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.sf.openrocket.gui.rocketfigure; - - -import java.awt.Shape; - -import net.sf.openrocket.gui.scalefigure.RocketFigure; -import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.Transformation; - - -/** - * A catch-all, no-operation drawing component. - */ -public class RocketComponentShapes { - - protected static final double S = RocketFigure.EXTRA_SCALE; - - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation t) { - // no-op - Application.getExceptionHandler().handleErrorCondition("ERROR: RocketComponent.getShapesSide called with " - + component); - return new Shape[0]; - } - - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation t) { - // no-op - Application.getExceptionHandler().handleErrorCondition("ERROR: RocketComponent.getShapesBack called with " - +component); - return new Shape[0]; - } - - -} diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java index 79ffdb89cc..92962bf246 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/ShockCordShapes.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.rocketfigure; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; @@ -9,39 +10,44 @@ import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; -public class ShockCordShapes extends RocketComponentShapes { +public class ShockCordShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + + net.sf.openrocket.rocketcomponent.MassObject massObj = (net.sf.openrocket.rocketcomponent.MassObject)component; - double length = tube.getLength(); - double radius = tube.getRadius(); + double length = massObj.getLength(); + double radius = massObj.getRadius(); double arc = Math.min(length, 2*radius) * 0.7; - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S,arc*S,arc*S); - } - return addSymbol(s); + + Coordinate start = transformation.transform(Coordinate.ZERO); + Shape[] s = new Shape[1]; + s[0] = new RoundRectangle2D.Double(start.x,(start.y-radius), + length,2*radius,arc,arc); + + return RocketComponentShape.toArray( addSymbol(s), component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; double or = tube.getRadius(); - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - return s; + Shape[] s = new Shape[1]; + Coordinate start = transformation.transform(Coordinate.ZERO); + + s[0] = new Ellipse2D.Double((start.z-or),(start.y-or),2*or,2*or); + +// Coordinate[] start = transformation.transform(tube.toAbsolute(instanceOffset)); +// +// Shape[] s = new Shape[start.length]; +// for (int i=0; i < start.length; i++) { +// s[i] = new Ellipse2D.Double((start[i].z-or),(start[i].y-or),2*or,2*or); +// } + return RocketComponentShape.toArray( s, component); } private static Shape[] addSymbol(Shape[] baseShape){ diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java index 7a5f41bd9f..bcd26b7ad4 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/StreamerShapes.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.rocketfigure; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; @@ -9,39 +10,48 @@ import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; -public class StreamerShapes extends RocketComponentShapes { +public class StreamerShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + net.sf.openrocket.rocketcomponent.MassObject massObj = (net.sf.openrocket.rocketcomponent.MassObject)component; - double length = tube.getLength(); - double radius = tube.getRadius(); + double length = massObj.getLength(); + double radius = massObj.getRadius(); double arc = Math.min(length, 2*radius) * 0.7; - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new RoundRectangle2D.Double(start[i].x*S,(start[i].y-radius)*S, - length*S,2*radius*S,arc*S,arc*S); - } - return addSymbol(s); + + Shape[] s = new Shape[1]; + Coordinate frontCenter = transformation.transform(Coordinate.ZERO); + s[0] = new RoundRectangle2D.Double((frontCenter.x),(frontCenter.y-radius), + length,2*radius,arc,arc); + +// Coordinate[] start = transformation.transform(tube.toAbsolute(instanceOffset)); +// Shape[] s = new Shape[start.length]; +// for (int i=0; i < start.length; i++) { +// s[i] = new RoundRectangle2D.Double(start[i].x,(start[i].y-radius), +// length,2*radius,arc,arc); +// } + return RocketComponentShape.toArray(addSymbol(s), component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + net.sf.openrocket.rocketcomponent.MassObject tube = (net.sf.openrocket.rocketcomponent.MassObject)component; double or = tube.getRadius(); + Shape[] s = new Shape[1]; + Coordinate center = transformation.transform(Coordinate.ZERO); - Coordinate[] start = transformation.transform(tube.toAbsolute(new Coordinate(0,0,0))); - - Shape[] s = new Shape[start.length]; - for (int i=0; i < start.length; i++) { - s[i] = new Ellipse2D.Double((start[i].z-or)*S,(start[i].y-or)*S,2*or*S,2*or*S); - } - return s; + s[0] = new Ellipse2D.Double((center.z-or),(center.y-or),2*or,2*or); + +// Coordinate[] start = transformation.transform(tube.toAbsolute(instanceOffset)); +// +// Shape[] s = new Shape[start.length]; +// for (int i=0; i < start.length; i++) { +// s[i] = new Ellipse2D.Double((start[i].z-or),(start[i].y-or),2*or,2*or); +// } + return RocketComponentShape.toArray(s, component); } private static Shape[] addSymbol(Shape[] baseShape){ diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java index 791057c773..11efa0ebc9 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java @@ -1,15 +1,16 @@ package net.sf.openrocket.gui.rocketfigure; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.SymmetricComponent; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; -import java.awt.*; import java.awt.geom.Path2D; import java.util.ArrayList; -public class SymmetricComponentShapes extends RocketComponentShapes { +public class SymmetricComponentShapes extends RocketComponentShape { private static final int MINPOINTS = 91; private static final double ACCEPTABLE_ANGLE = Math.cos(7.0 * Math.PI / 180.0); @@ -17,14 +18,11 @@ public class SymmetricComponentShapes extends RocketComponentShapes { // TODO: LOW: Uses only first component of cluster (not currently clusterable) - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - return getShapesSide(component, transformation, S); - } + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation, final double scaleFactor) { - net.sf.openrocket.rocketcomponent.SymmetricComponent c = (net.sf.openrocket.rocketcomponent.SymmetricComponent) component; + + SymmetricComponent c = (SymmetricComponent) component; + int i; final double delta = 0.0000001; @@ -64,11 +62,10 @@ public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComp //System.out.println("Final points: "+points.size()); - final int len = points.size(); - for (i = 0; i < len; i++) { - points.set(i, c.toAbsolute(points.get(i))[0]); - } +// for (i = 0; i < len; i++) { +// points.set(i, c.toAbsolute(points.get(i))[0]); +// } /* Show points: Shape[] s = new Shape[len+1]; @@ -80,21 +77,24 @@ public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComp //System.out.println("here"); + final int len = points.size(); + Coordinate nose = transformation.transform(Coordinate.ZERO); + // TODO: LOW: curved path instead of linear Path2D.Double path = new Path2D.Double(); - path.moveTo(points.get(len - 1).x * scaleFactor, points.get(len - 1).y * scaleFactor); + path.moveTo((nose.x + points.get(len - 1).x) , (nose.y+points.get(len - 1).y) ); for (i = len - 2; i >= 0; i--) { - path.lineTo(points.get(i).x * scaleFactor, points.get(i).y * scaleFactor); + path.lineTo((nose.x+points.get(i).x), (nose.y+points.get(i).y) ); } for (i = 0; i < len; i++) { - path.lineTo(points.get(i).x * scaleFactor, -points.get(i).y * scaleFactor); + path.lineTo((nose.x+points.get(i).x) , (nose.y-points.get(i).y) ); } - path.lineTo(points.get(len - 1).x * scaleFactor, points.get(len - 1).y * scaleFactor); + path.lineTo((nose.x+points.get(len - 1).x) , (nose.y+points.get(len - 1).y) ); path.closePath(); //s[len] = path; //return s; - return new Shape[] { path }; + return new RocketComponentShape[] { new RocketComponentShape(path, component) }; } private static boolean angleAcceptable(Coordinate v1, Coordinate v2, Coordinate v3) { diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/TransitionShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/TransitionShapes.java index 2312c1bd31..be46b169e7 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/TransitionShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/TransitionShapes.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.rocketfigure; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.Transition; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Transformation; @@ -7,94 +8,100 @@ import java.awt.*; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; -import java.awt.geom.Rectangle2D; -public class TransitionShapes extends RocketComponentShapes { +public class TransitionShapes extends RocketComponentShape { - // TODO: LOW: Uses only first component of cluster (not currently clusterable). - - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - return getShapesSide(component, transformation, S); + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + return getShapesSide(component, transformation, 1.0); } - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation, final double scaleFactor) { - net.sf.openrocket.rocketcomponent.Transition transition = (net.sf.openrocket.rocketcomponent.Transition)component; + public static RocketComponentShape[] getShapesSide( + final RocketComponent component, + final Transformation transformation, + final double scaleFactor) { + + + Transition transition = (Transition)component; - Shape[] mainShapes; + final Coordinate instanceAbsoluteLocation = transformation.transform(Coordinate.ZERO); + + RocketComponentShape[] mainShapes; // Simpler shape for conical transition, others use the method from SymmetricComponent if (transition.getType() == Transition.Shape.CONICAL) { + final Coordinate frontCenter = instanceAbsoluteLocation; + double length = transition.getLength(); double r1 = transition.getForeRadius(); double r2 = transition.getAftRadius(); - Coordinate start = transformation.transform(transition. - toAbsolute(Coordinate.NUL)[0]); - + Path2D.Float path = new Path2D.Float(); - path.moveTo(start.x* scaleFactor, r1* scaleFactor); - path.lineTo((start.x+length)* scaleFactor, r2* scaleFactor); - path.lineTo((start.x+length)* scaleFactor, -r2* scaleFactor); - path.lineTo(start.x* scaleFactor, -r1* scaleFactor); + path.moveTo( (frontCenter.x), (frontCenter.y+ r1)); + path.lineTo( (frontCenter.x+length), (frontCenter.y+r2)); + path.lineTo( (frontCenter.x+length), (frontCenter.y-r2)); + path.lineTo( (frontCenter.x), (frontCenter.y-r1)); path.closePath(); - mainShapes = new Shape[] { path }; + mainShapes = new RocketComponentShape[] { new RocketComponentShape( path, component) }; } else { - mainShapes = SymmetricComponentShapes.getShapesSide(component, transformation, scaleFactor); + mainShapes = SymmetricComponentShapes.getShapesSide(component, transformation); } - Rectangle2D.Double shoulder1=null, shoulder2=null; + Shape foreShoulder=null, aftShoulder=null; int arrayLength = mainShapes.length; if (transition.getForeShoulderLength() > 0.0005) { - Coordinate start = transformation.transform(transition. - toAbsolute(Coordinate.NUL)[0]); - double r = transition.getForeShoulderRadius(); - double l = transition.getForeShoulderLength(); - shoulder1 = new Rectangle2D.Double((start.x-l)* scaleFactor, -r* scaleFactor, l* scaleFactor, 2*r* scaleFactor); + final double shoulderLength = transition.getForeShoulderLength(); + final double shoulderRadius = transition.getForeShoulderRadius(); + final Transformation offsetTransform = Transformation.getTranslationTransform(-transition.getForeShoulderLength(), 0, 0); + final Transformation foreShoulderTransform = transformation.applyTransformation(offsetTransform); + + foreShoulder = TubeShapes.getShapesSide( foreShoulderTransform, shoulderLength, shoulderRadius); arrayLength++; } if (transition.getAftShoulderLength() > 0.0005) { - Coordinate start = transformation.transform(transition. - toAbsolute(new Coordinate(transition.getLength()))[0]); - double r = transition.getAftShoulderRadius(); - double l = transition.getAftShoulderLength(); - shoulder2 = new Rectangle2D.Double(start.x* scaleFactor, -r* scaleFactor, l* scaleFactor, 2*r* scaleFactor); + final double shoulderLength = transition.getAftShoulderLength(); + final double shoulderRadius = transition.getAftShoulderRadius(); + final Transformation offsetTransform = Transformation.getTranslationTransform(transition.getLength(), 0, 0); + final Transformation aftShoulderTransform = transformation.applyTransformation(offsetTransform); + + aftShoulder = TubeShapes.getShapesSide(aftShoulderTransform, shoulderLength, shoulderRadius); arrayLength++; } - if (shoulder1==null && shoulder2==null) + if (foreShoulder==null && aftShoulder==null) return mainShapes; Shape[] shapes = new Shape[arrayLength]; int i; for (i=0; i < mainShapes.length; i++) { - shapes[i] = mainShapes[i]; + shapes[i] = mainShapes[i].shape; } - if (shoulder1 != null) { - shapes[i] = shoulder1; + if (foreShoulder != null) { + shapes[i] = foreShoulder; i++; } - if (shoulder2 != null) { - shapes[i] = shoulder2; + if (aftShoulder != null) { + shapes[i] = aftShoulder; } - return shapes; + return RocketComponentShape.toArray( shapes, component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.Transition transition = (net.sf.openrocket.rocketcomponent.Transition)component; + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + + Transition transition = (net.sf.openrocket.rocketcomponent.Transition)component; double r1 = transition.getForeRadius(); double r2 = transition.getAftRadius(); + + final Coordinate center = transformation.transform(Coordinate.ZERO); Shape[] s = new Shape[2]; - s[0] = new Ellipse2D.Double(-r1*S,-r1*S,2*r1*S,2*r1*S); - s[1] = new Ellipse2D.Double(-r2*S,-r2*S,2*r2*S,2*r2*S); - return s; + s[0] = new Ellipse2D.Double((center.z-r1),(center.y-r1),2*r1,2*r1); + s[1] = new Ellipse2D.Double((center.z-r2),(center.y-r2),2*r2,2*r2); + return RocketComponentShape.toArray(s, component); } diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/TubeFinSetShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/TubeFinSetShapes.java index efe4137319..f3eb9e8d3d 100644 --- a/swing/src/net/sf/openrocket/gui/rocketfigure/TubeFinSetShapes.java +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/TubeFinSetShapes.java @@ -1,54 +1,65 @@ package net.sf.openrocket.gui.rocketfigure; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.Transformation; - import java.awt.Shape; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.TubeFinSet; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Transformation; + -public class TubeFinSetShapes extends RocketComponentShapes { +public class TubeFinSetShapes extends RocketComponentShape { - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.TubeFinSet finset = (net.sf.openrocket.rocketcomponent.TubeFinSet)component; + public static RocketComponentShape[] getShapesSide( final RocketComponent component, final Transformation transformation) { + + TubeFinSet finset = (net.sf.openrocket.rocketcomponent.TubeFinSet)component; int fins = finset.getFinCount(); double length = finset.getLength(); - double outerradius = finset.getOuterRadius(); - double bodyradius = finset.getBodyRadius(); - - Coordinate[] start = finset.toAbsolute(new Coordinate(0,0,0)); + double outerRadius = finset.getOuterRadius(); + double bodyRadius = finset.getBodyRadius(); + // old version - Oct, 19 2015 + //Coordinate[] instanceOffsets = new Coordinate[]{ transformation.transform( componentAbsoluteLocation )}; + //instanceOffsets = component.shiftCoordinates(instanceOffsets); + + // new version + Coordinate[] start = transformation.transform( component.getLocations()); Transformation baseRotation = finset.getBaseRotationTransformation(); Transformation finRotation = finset.getFinRotationTransformation(); // Translate & rotate the coordinates for (int i=0; i<start.length; i++) { - start[i] = baseRotation.transform(transformation.transform(start[i].add(0,bodyradius+outerradius,0))); + start[i] = baseRotation.transform(transformation.transform(start[i].add(0,bodyRadius+outerRadius,0))); } //start = baseRotation.transform(start); Shape[] s = new Shape[fins]; for (int i=0; i<fins; i++) { - s[i] = new Rectangle2D.Double(start[0].x*S,(start[0].y-outerradius)*S,length*S,2*outerradius*S); + s[i] = new Rectangle2D.Double(start[0].x,(start[0].y-outerRadius),length,2*outerRadius); start = finRotation.transform(start); } - return s; + return RocketComponentShape.toArray(s, component); } - public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComponent component, - Transformation transformation) { - net.sf.openrocket.rocketcomponent.TubeFinSet finset = (net.sf.openrocket.rocketcomponent.TubeFinSet)component; + public static RocketComponentShape[] getShapesBack( final RocketComponent component, final Transformation transformation) { + + TubeFinSet finset = (net.sf.openrocket.rocketcomponent.TubeFinSet)component; int fins = finset.getFinCount(); double outerradius = finset.getOuterRadius(); double bodyradius = finset.getBodyRadius(); - Coordinate[] start = finset.toAbsolute(new Coordinate(0,0,0)); + // old version - Oct, 19 2015 + //Coordinate[] instanceOffsets = new Coordinate[]{ transformation.transform( componentAbsoluteLocation )}; + //instanceOffsets = component.shiftCoordinates(instanceOffsets); + + // new version + Coordinate[] start = transformation.transform( component.getLocations()); Transformation baseRotation = finset.getBaseRotationTransformation(); Transformation finRotation = finset.getFinRotationTransformation(); @@ -60,10 +71,10 @@ public static Shape[] getShapesBack(net.sf.openrocket.rocketcomponent.RocketComp Shape[] s = new Shape[fins]; for (int i=0; i < fins; i++) { - s[i] = new Ellipse2D.Double((start[0].z-outerradius)*S,(start[0].y-outerradius)*S,2*outerradius*S,2*outerradius*S); + s[i] = new Ellipse2D.Double((start[0].z-outerradius),(start[0].y-outerradius),2*outerradius,2*outerradius); start = finRotation.transform(start); } - return s; + return RocketComponentShape.toArray(s, component); } diff --git a/swing/src/net/sf/openrocket/gui/rocketfigure/TubeShapes.java b/swing/src/net/sf/openrocket/gui/rocketfigure/TubeShapes.java new file mode 100644 index 0000000000..ebd94cc885 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/rocketfigure/TubeShapes.java @@ -0,0 +1,31 @@ +package net.sf.openrocket.gui.rocketfigure; + +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; + +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.Transformation; + + +public class TubeShapes extends RocketComponentShape { + + public static Shape getShapesSide( final Transformation transformation, final double length, final double radius ){ + + final Coordinate instanceAbsoluteLocation = transformation.transform(Coordinate.ZERO); + + return new Rectangle2D.Double((instanceAbsoluteLocation.x), //x - the X coordinate of the upper-left corner of the newly constructed Rectangle2D + (instanceAbsoluteLocation.y-radius), // y - the Y coordinate of the upper-left corner of the newly constructed Rectangle2D + length, // w - the width of the newly constructed Rectangle2D + 2*radius); // h - the height of the newly constructed Rectangle2D + } + + public static Shape getShapesBack( final Transformation transformation, final double radius ) { + + final Coordinate instanceAbsoluteLocation = transformation.transform(Coordinate.ZERO); + + return new Ellipse2D.Double((instanceAbsoluteLocation.z-radius), (instanceAbsoluteLocation.y-radius), 2*radius, 2*radius); + } + + +} diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java index 09ff97aee5..6412b035ec 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java @@ -2,6 +2,8 @@ import java.awt.Color; import java.awt.Dimension; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; import java.util.EventListener; import java.util.EventObject; import java.util.LinkedList; @@ -9,123 +11,194 @@ import javax.swing.JPanel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.gui.util.GUIUtil; +import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.StateChangeListener; - -public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure { - +@SuppressWarnings("serial") +public abstract class AbstractScaleFigure extends JPanel { + + private final static Logger log = LoggerFactory.getLogger(AbstractScaleFigure.class); + + public static final double INCHES_PER_METER = 39.3701; + public static final double METERS_PER_INCH = 0.0254; + + public static final double MINIMUM_ZOOM = 0.01; // == 1 % + public static final double MAXIMUM_ZOOM = 1000.00; // == 10,000 % + // Number of pixels to leave at edges when fitting figure private static final int DEFAULT_BORDER_PIXELS_WIDTH = 30; private static final int DEFAULT_BORDER_PIXELS_HEIGHT = 20; + // constant factor that scales screen real-estate to rocket-space + private final double baseScale; + private double userScale = 1.0; + protected double scale = -1; - protected final double dpi; + protected static final Dimension borderThickness_px = new Dimension(DEFAULT_BORDER_PIXELS_WIDTH, DEFAULT_BORDER_PIXELS_HEIGHT); + // pixel offset from the the subject's origin to the canvas's upper-left-corner. + protected Dimension originLocation_px = new Dimension(0,0); - protected double scale = 1.0; - protected double scaling = 1.0; - - protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH; - protected int borderPixelsHeight = DEFAULT_BORDER_PIXELS_HEIGHT; + // size of the visible region + protected Dimension visibleBounds_px = new Dimension(0,0); + // ======= whatever this figure is drawing, in real-space coordinates: meters + protected Rectangle2D subjectBounds_m = null; + + // combines the translation and scale in one place: + // which frames does this transform between ? + protected AffineTransform projection = null; + protected final List<EventListener> listeners = new LinkedList<EventListener>(); public AbstractScaleFigure() { - this.dpi = GUIUtil.getDPI(); - this.scaling = 1.0; - this.scale = dpi / 0.0254 * scaling; - + // produces a pixels-per-meter scale factor + // + // dots dots inch + // ---- = ------ * ----- + // meter inch meter + // + this.baseScale = GUIUtil.getDPI() * INCHES_PER_METER; + this.userScale = 1.0; + this.scale = baseScale * userScale; + + this.setPreferredSize(new Dimension(100,100)); + setSize(100,100); + setBackground(Color.WHITE); setOpaque(true); } - - - public abstract void updateFigure(); - - public abstract double getFigureWidth(); - - public abstract double getFigureHeight(); - - - @Override - public double getScaling() { - return scaling; - } - - @Override - public double getAbsoluteScale() { - return scale; - } - - @Override - public void setScaling(double scaling) { - if (Double.isInfinite(scaling) || Double.isNaN(scaling)) - scaling = 1.0; - if (scaling < 0.001) - scaling = 0.001; - if (scaling > 1000) - scaling = 1000; - if (Math.abs(this.scaling - scaling) < 0.01) - return; - this.scaling = scaling; - this.scale = dpi / 0.0254 * scaling; - updateFigure(); + public double getUserScale(){ + return userScale; } - @Override - public void setScaling(Dimension bounds) { - double zh = 1, zv = 1; - int w = bounds.width - 2 * borderPixelsWidth - 20; - int h = bounds.height - 2 * borderPixelsHeight - 20; - - if (w < 10) - w = 10; - if (h < 10) - h = 10; - - zh = (w) / getFigureWidth(); - zv = (h) / getFigureHeight(); - - double s = Math.min(zh, zv) / dpi * 0.0254 - 0.001; - - // Restrict to 100% - if (s > 1.0) { - s = 1.0; - } + public double getAbsoluteScale() { + return scale; + } + + public Dimension getSubjectOrigin() { + return originLocation_px; + } + + /** + * Set the scale level of the figure. A scale value of 1.0 is equivalent to 100 % scale. + * Smaller scales display the subject smaller. + * + * If the figure would be smaller than the 'visibleBounds', then the figure is grown to match, + * and the figures internal contents are centered according to the figure's origin. + * + * @param newScaleRequest the scale level + * @param visibleBounds the visible bounds upon the Figure + */ + public void scaleTo(final double newScaleRequest, final Dimension visibleBounds) { + if (MathUtil.equals(this.userScale, newScaleRequest, 0.01)){ + return;} + if (Double.isInfinite(newScaleRequest) || Double.isNaN(newScaleRequest)) { + return;} - setScaling(s); + log.warn(String.format("scaling Request from %g => %g @%s\n", this.userScale, newScaleRequest, this.getClass().getSimpleName()), new Throwable()); + + this.userScale = MathUtil.clamp( newScaleRequest, MINIMUM_ZOOM, MAXIMUM_ZOOM); + this.scale = baseScale * userScale; + + this.visibleBounds_px = visibleBounds; + + this.fireChangeEvent(); } - - @Override - public Dimension getBorderPixels() { - return new Dimension(borderPixelsWidth, borderPixelsHeight); + /** + * Set the scale level to display newBounds + * + * @param visibleBounds the visible bounds to scale this figure to. + */ + public void scaleTo(Dimension visibleBounds) { + if( 0 == visibleBounds.getWidth() || 0 == visibleBounds.getHeight()) + return; + + updateSubjectDimensions(); + + // dimensions within the viewable area, which are available to draw + final int drawable_width_px = visibleBounds.width - 2 * borderThickness_px.width; + final int drawable_height_px = visibleBounds.height - 2 * borderThickness_px.height; + + if(( 0 < drawable_width_px ) && ( 0 < drawable_height_px)) { + final double width_scale = (drawable_width_px) / ( subjectBounds_m.getWidth() * baseScale); + final double height_scale = (drawable_height_px) / ( subjectBounds_m.getHeight() * baseScale); + final double minScale = Math.min(height_scale, width_scale); + + scaleTo(minScale, visibleBounds); + } } - @Override - public void setBorderPixels(int width, int height) { - this.borderPixelsWidth = width; - this.borderPixelsHeight = height; + /** + * Return the pixel coordinates of the subject's origin. + * + * @return the pixel coordinates of the figure origin. + */ + protected abstract void updateSubjectDimensions(); + + protected abstract void updateCanvasOrigin(); + + /** + * update preferred figure Size + + */ + protected void updateCanvasSize() { + final int desiredWidth = Math.max((int)this.visibleBounds_px.getWidth(), + (int)(subjectBounds_m.getWidth()*scale) + 2*borderThickness_px.width); + final int desiredHeight = Math.max((int)this.visibleBounds_px.getHeight(), + (int)(subjectBounds_m.getHeight()*scale) + 2*borderThickness_px.height); + + Dimension preferredFigureSize_px = new Dimension(desiredWidth, desiredHeight); + + setPreferredSize(preferredFigureSize_px); + setMinimumSize(preferredFigureSize_px); + } + + protected void updateTransform(){ + // Calculate and store the transformation used + // (inverse is used in detecting clicks on objects) + projection = new AffineTransform(); + projection.translate(this.originLocation_px.width, originLocation_px.height); + // Mirror position Y-axis upwards + projection.scale(scale, -scale); + } + + /** + * Updates the figure shapes and figure size. + */ + public void updateFigure() { + log.debug(String.format("____ Updating %s to: %g user scale, %g overall scale", this.getClass().getSimpleName(), this.getAbsoluteScale(), this.scale)); + + updateSubjectDimensions(); + updateCanvasSize(); + updateCanvasOrigin(); + updateTransform(); + + revalidate(); + repaint(); + } + + protected Dimension getBorderPixels() { + return borderThickness_px; } - - - @Override + public void addChangeListener(StateChangeListener listener) { listeners.add(0, listener); } - @Override public void removeChangeListener(StateChangeListener listener) { listeners.remove(listener); } - private EventObject changeEvent = null; - protected void fireChangeEvent() { - if (changeEvent == null) - changeEvent = new EventObject(this); + final EventObject changeEvent = new EventObject(this); + // Copy the list before iterating to prevent concurrent modification exceptions. EventListener[] list = listeners.toArray(new EventListener[0]); for (EventListener l : list) { @@ -134,5 +207,5 @@ protected void fireChangeEvent() { } } } - + } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java index cd5b9490ea..10ffc3841f 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java @@ -7,101 +7,80 @@ import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Path2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; +import java.util.LinkedList; +import java.util.List; +import org.slf4j.*; import net.sf.openrocket.rocketcomponent.FreeformFinSet; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.SymmetricComponent; +import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.unit.Tick; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.util.BoundingBox; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.StateChangeListener; -// TODO: MEDIUM: the figure jumps and bugs when using automatic fitting - +@SuppressWarnings("serial") public class FinPointFigure extends AbstractScaleFigure { - - private static final int BOX_SIZE = 4; - - private final FreeformFinSet finset; + + private final static Logger log = LoggerFactory.getLogger(FinPointFigure.class); + + private static final Color GRID_MAJOR_LINE_COLOR = new Color( 64, 64, 128, 128); + private static final Color GRID_MINOR_LINE_COLOR = new Color( 64, 64, 128, 32); + private static final int GRID_LINE_BASE_WIDTH_PIXELS = 1; + + private static final int LINE_WIDTH_PIXELS = 1; + + // the size of the boxes around each fin point vertex + private static final float BOX_WIDTH_PIXELS = 12; + private static final float SELECTED_BOX_WIDTH_PIXELS = BOX_WIDTH_PIXELS + 4; + private static final Color POINT_COLOR = new Color(100, 100, 100); + private static final Color SELECTED_POINT_COLOR = new Color(200, 0, 0); + private static final double MINOR_TICKS = 0.01; + private static final double MAJOR_TICKS = 0.1; + + private final FreeformFinSet finset; private int modID = -1; - private double minX, maxX, maxY; - private double figureWidth = 0; - private double figureHeight = 0; - private double translateX = 0; - private double translateY = 0; - - private AffineTransform transform; - private Rectangle2D.Double[] handles = null; + protected Rectangle2D finBounds_m = null; + protected Rectangle2D mountBounds_m = null; + protected final List<StateChangeListener> listeners = new LinkedList<StateChangeListener>(); + + private Rectangle2D.Double[] finPointHandles = null; + private int selectedIndex = -1; public FinPointFigure(FreeformFinSet finset) { this.finset = finset; + + // useful for debugging -- shows a contrast against un-drawn space. + setBackground(Color.WHITE); + setOpaque(true); + + updateFigure(); } - - + @Override public void paintComponent(Graphics g) { super.paintComponent(g); - Graphics2D g2 = (Graphics2D) g; - - if (modID != finset.getRocket().getAerodynamicModID()) { - modID = finset.getRocket().getAerodynamicModID(); - calculateDimensions(); - } - - - double tx, ty; - // Calculate translation for figure centering - if (figureWidth * scale + 2 * borderPixelsWidth < getWidth()) { - - // Figure fits in the viewport - tx = (getWidth() - figureWidth * scale) / 2 - minX * scale; - - } else { - - // Figure does not fit in viewport - tx = borderPixelsWidth - minX * scale; - - } - - - if (figureHeight * scale + 2 * borderPixelsHeight < getHeight()) { - ty = getHeight() - borderPixelsHeight; - } else { - ty = borderPixelsHeight + figureHeight * scale; - } - - if (Math.abs(translateX - tx) > 1 || Math.abs(translateY - ty) > 1) { - // Origin has changed, fire event - translateX = tx; - translateY = ty; - fireChangeEvent(); - } - - - if (Math.abs(translateX - tx) > 1 || Math.abs(translateY - ty) > 1) { - // Origin has changed, fire event - translateX = tx; - translateY = ty; - fireChangeEvent(); - } - - - // Calculate and store the transformation used - transform = new AffineTransform(); - transform.translate(translateX, translateY); - transform.scale(scale / EXTRA_SCALE, -scale / EXTRA_SCALE); - - // TODO: HIGH: border Y-scale upwards - - g2.transform(transform); + Graphics2D g2 = (Graphics2D) g.create(); + + if (modID != finset.getRocket().getAerodynamicModID()) { + modID = finset.getRocket().getAerodynamicModID(); + updateTransform(); + } + + g2.transform(projection); // Set rendering hints appropriately g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, @@ -111,132 +90,219 @@ public void paintComponent(Graphics g) { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + paintBackgroundGrid(g2); - - Rectangle visible = g2.getClipBounds(); - double x0 = ((double) visible.x - 3) / EXTRA_SCALE; - double x1 = ((double) visible.x + visible.width + 4) / EXTRA_SCALE; - double y0 = ((double) visible.y - 3) / EXTRA_SCALE; - double y1 = ((double) visible.y + visible.height + 4) / EXTRA_SCALE; + paintRocketBody(g2); + paintFinShape(g2); + paintFinHandles(g2); + } + + public void paintBackgroundGrid( Graphics2D g2) { + Rectangle visible = g2.getClipBounds(); + final double x0 = visible.x - 3; + final double x1 = visible.x + visible.width + 4; + final double y0 = visible.y - 3; + final double y1 = visible.y + visible.height + 4; - // Background grid - - g2.setStroke(new BasicStroke((float) (1.0 * EXTRA_SCALE / scale), - BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(new Color(0, 0, 255, 30)); - - Unit unit; - if (this.getParent() != null && - this.getParent().getParent() instanceof ScaleScrollPane) { - unit = ((ScaleScrollPane) this.getParent().getParent()).getCurrentUnit(); - } else { - unit = UnitGroup.UNITS_LENGTH.getDefaultUnit(); - } - - // vertical - Tick[] ticks = unit.getTicks(x0, x1, - ScaleScrollPane.MINOR_TICKS / scale, - ScaleScrollPane.MAJOR_TICKS / scale); - Line2D.Double line = new Line2D.Double(); - for (Tick t : ticks) { - if (t.major) { - line.setLine(t.value * EXTRA_SCALE, y0 * EXTRA_SCALE, - t.value * EXTRA_SCALE, y1 * EXTRA_SCALE); - g2.draw(line); - } - } - - // horizontal - ticks = unit.getTicks(y0, y1, - ScaleScrollPane.MINOR_TICKS / scale, - ScaleScrollPane.MAJOR_TICKS / scale); - for (Tick t : ticks) { - if (t.major) { - line.setLine(x0 * EXTRA_SCALE, t.value * EXTRA_SCALE, - x1 * EXTRA_SCALE, t.value * EXTRA_SCALE); - g2.draw(line); - } - } - + final float grid_line_width = (float)(GRID_LINE_BASE_WIDTH_PIXELS/this.scale); + g2.setStroke(new BasicStroke( grid_line_width, + BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + Unit unit; + if (this.getParent() != null && this.getParent().getParent() instanceof ScaleScrollPane) { + unit = ((ScaleScrollPane) this.getParent().getParent()).getCurrentUnit(); + } else { + unit = UnitGroup.UNITS_LENGTH.getDefaultUnit(); + } + // vertical + Tick[] verticalTicks = unit.getTicks(x0, x1, MINOR_TICKS, MAJOR_TICKS); + Line2D.Double line = new Line2D.Double(); + for (Tick t : verticalTicks) { + if (t.major) { + g2.setColor(FinPointFigure.GRID_MAJOR_LINE_COLOR); + line.setLine( t.value, y0, t.value, y1); + g2.draw(line); + }else{ + g2.setColor(FinPointFigure.GRID_MINOR_LINE_COLOR); + line.setLine( t.value, y0, t.value, y1); + g2.draw(line); + } + } + // horizontal + Tick[] horizontalTicks = unit.getTicks(y0, y1, MINOR_TICKS, MAJOR_TICKS); + for (Tick t : horizontalTicks) { + if (t.major) { + g2.setColor(FinPointFigure.GRID_MAJOR_LINE_COLOR); + line.setLine( x0, t.value, x1, t.value); + g2.draw(line); + }else{ + g2.setColor(FinPointFigure.GRID_MINOR_LINE_COLOR); + line.setLine( x0, t.value, x1, t.value); + g2.draw(line); + } + } + } - // Base rocket line - g2.setStroke(new BasicStroke((float) (3.0 * EXTRA_SCALE / scale), - BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(Color.GRAY); - - g2.drawLine((int) (x0 * EXTRA_SCALE), 0, (int) (x1 * EXTRA_SCALE), 0); - + private void paintRocketBody( Graphics2D g2){ + RocketComponent comp = finset.getParent(); + if( comp instanceof Transition ){ + paintBodyTransition(g2); + }else{ + paintBodyTube(g2); + } + } - // Fin shape - Coordinate[] points = finset.getFinPoints(); - Path2D.Double shape = new Path2D.Double(); - shape.moveTo(0, 0); - for (int i = 1; i < points.length; i++) { - shape.lineTo(points[i].x * EXTRA_SCALE, points[i].y * EXTRA_SCALE); - } - - g2.setStroke(new BasicStroke((float) (1.0 * EXTRA_SCALE / scale), - BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(Color.BLACK); - g2.draw(shape); - + // NOTE: This function drawns relative to the reference point of the BODY component + // In other words: 0,0 == the front, foreRadius of the body component + private void paintBodyTransition( Graphics2D g2){ + + // setup lines + final float bodyLineWidth = (float) ( LINE_WIDTH_PIXELS / scale ); + g2.setStroke(new BasicStroke( bodyLineWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + g2.setColor(Color.BLACK); - // Fin point boxes - g2.setColor(new Color(150, 0, 0)); - double s = BOX_SIZE * EXTRA_SCALE / scale; - handles = new Rectangle2D.Double[points.length]; - for (int i = 0; i < points.length; i++) { - Coordinate c = points[i]; - handles[i] = new Rectangle2D.Double(c.x * EXTRA_SCALE - s, c.y * EXTRA_SCALE - s, 2 * s, 2 * s); - g2.draw(handles[i]); - } - + Transition body = (Transition) finset.getParent(); + final float xResolution_m = 0.01f; // distance between draw points, in meters + + final double xFinStart = finset.getAxialOffset(AxialMethod.TOP); //<< in body frame + + // vv in fin-frame == draw-frame vv + final double xOffset = -xFinStart; + final double yOffset = -body.getRadius(xFinStart); + + Path2D.Double bodyShape = new Path2D.Double(); + // draw front-cap: + bodyShape.moveTo( xOffset, yOffset); + bodyShape.lineTo( xOffset, yOffset + body.getForeRadius()); + + final float length_m = (float)( body.getLength()); + Point2D.Double cur = new Point2D.Double (); + for( double xBody = xResolution_m ; xBody < length_m; xBody += xResolution_m ){ + // xBody is distance from front of parent body + cur.x = xOffset + xBody; // offset from origin (front of fin) + cur.y = yOffset + body.getRadius( xBody); // offset from origin ( fin-front-point ) + + bodyShape.lineTo( cur.x, cur.y); + } + + // draw end-cap + bodyShape.lineTo( xOffset + length_m, yOffset + body.getAftRadius()); + bodyShape.lineTo( xOffset + length_m, yOffset); + + g2.draw(bodyShape); + } + + private void paintBodyTube( Graphics2D g2){ + // in-figure left extent + final double xFore = mountBounds_m.getMinX(); + // in-figure right extent + final double xAft = mountBounds_m.getMaxX(); + // in-figure right extent + final double yCenter = mountBounds_m.getMinY(); + + Path2D.Double shape = new Path2D.Double(); + shape.moveTo( xFore, yCenter ); + shape.lineTo( xFore, 0); // body tube fore edge + shape.lineTo( xAft, 0); // body tube side + shape.lineTo( xAft, yCenter); // body tube aft edge + + final float bodyLineWidth = (float) ( LINE_WIDTH_PIXELS / scale ); + g2.setStroke(new BasicStroke( bodyLineWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + g2.setColor(Color.BLACK); + g2.draw(shape); + } + + private void paintFinShape(final Graphics2D g2){ + // excludes fin tab points + final Coordinate[] drawPoints = finset.getFinPoints(); + + Path2D.Double shape = new Path2D.Double(); + Coordinate startPoint= drawPoints[0]; + shape.moveTo( startPoint.x, startPoint.y); + for (int i = 1; i < drawPoints.length; i++) { + shape.lineTo( drawPoints[i].x, drawPoints[i].y); + } + + final float finEdgeWidth_m = (float) (LINE_WIDTH_PIXELS / scale ); + g2.setStroke(new BasicStroke( finEdgeWidth_m, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + g2.setColor(Color.BLUE); + g2.draw(shape); } - + private void paintFinHandles(final Graphics2D g2) { + // excludes fin tab points + final Coordinate[] drawPoints = finset.getFinPoints(); + + // Fin point boxes + final float boxWidth = (float) (BOX_WIDTH_PIXELS / scale ); + final float boxHalfWidth = boxWidth/2; + + final float boxEdgeWidth_m = (float) ( LINE_WIDTH_PIXELS / scale ); + g2.setStroke(new BasicStroke( boxEdgeWidth_m, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + g2.setColor(POINT_COLOR); + + finPointHandles = new Rectangle2D.Double[ drawPoints.length]; + for (int currentIndex = 0; currentIndex < drawPoints.length; currentIndex++) { + Coordinate c = drawPoints[currentIndex]; + + if( currentIndex == selectedIndex ) { + final float selBoxWidth = (float) (SELECTED_BOX_WIDTH_PIXELS / scale ); + final float selBoxHalfWidth = selBoxWidth/2; - public int getIndexByPoint(double x, double y) { - if (handles == null) - return -1; - - // Calculate point in shapes' coordinates - Point2D.Double p = new Point2D.Double(x, y); - try { - transform.inverseTransform(p, p); - } catch (NoninvertibleTransformException e) { - return -1; - } - - for (int i = 0; i < handles.length; i++) { - if (handles[i].contains(p)) - return i; - } - return -1; + final Rectangle2D.Double selectedPointHighlight = new Rectangle2D.Double(c.x - selBoxHalfWidth, c.y - selBoxHalfWidth, selBoxWidth, selBoxWidth); + + // switch to the highlight color + g2.setColor(SELECTED_POINT_COLOR); + g2.draw(selectedPointHighlight); + + // reset to the normal color + g2.setColor(POINT_COLOR); + } + + // normal boxes + finPointHandles[currentIndex] = new Rectangle2D.Double(c.x - boxHalfWidth, c.y - boxHalfWidth, boxWidth, boxWidth); + + g2.draw(finPointHandles[currentIndex]); + } + } + + private Point2D.Double getPoint( final int x, final int y){ + if (finPointHandles == null) + return null; + + // Calculate point in shapes' coordinates + Point2D.Double p = new Point2D.Double(x, y); + try { + projection.inverseTransform(p, p); + return p; + } catch (NoninvertibleTransformException e) { + return null; + } } - - public int getSegmentByPoint(double x, double y) { - if (handles == null) - return -1; - - // Calculate point in shapes' coordinates - Point2D.Double p = new Point2D.Double(x, y); - try { - transform.inverseTransform(p, p); - } catch (NoninvertibleTransformException e) { - return -1; - } - - double x0 = p.x / EXTRA_SCALE; - double y0 = p.y / EXTRA_SCALE; - double delta = BOX_SIZE / scale; - - //System.out.println("Point: " + x0 + "," + y0); - //System.out.println("delta: " + (BOX_SIZE / scale)); + public int getIndexByPoint(final int x, final int y) { + final Point2D.Double p = getPoint(x,y); + if (p == null) + return -1; + + for (int i = 0; i < finPointHandles.length; i++) { + if (finPointHandles[i].contains(p)) { + return i; + } + } + + return -1; + } + + public int getSegmentByPoint(final int x, final int y) { + final Point2D.Double p = getPoint(x,y); + if (p == null) + return -1; + + final double threshold = BOX_WIDTH_PIXELS / scale; Coordinate[] points = finset.getFinPoints(); for (int i = 1; i < points.length; i++) { @@ -245,100 +311,91 @@ public int getSegmentByPoint(double x, double y) { double x2 = points[i].x; double y2 = points[i].y; - // System.out.println("point1:"+x1+","+y1+" point2:"+x2+","+y2); - - double u = Math.abs((x2 - x1) * (y1 - y0) - (x1 - x0) * (y2 - y1)) / - MathUtil.hypot(x2 - x1, y2 - y1); - //System.out.println("Distance of segment " + i + " is " + u); - if (u < delta) - return i; + final double segmentLength = MathUtil.hypot(x2 - x1, y2 - y1); + + // Distance to an infinite line, defined by two points: + // (For a more in-depth explanation, see wikipedia: https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line ) + double x0 = p.x; + double y0 = p.y; + final double distanceToLine = Math.abs((y2 - y1)*x0 - (x2-x1)*y0 + x2*y1 - y2*x1)/segmentLength; + + final double distanceToStart = MathUtil.hypot(x1-x0, y1-y0); + final double distanceToEnd = MathUtil.hypot(x2-x0, y2-y0); + final boolean withinSegment = (distanceToStart < segmentLength && distanceToEnd < segmentLength); + + if ( distanceToLine < threshold && withinSegment){ + return i; + } + } return -1; } - - public Point2D.Double convertPoint(double x, double y) { + public Point2D.Double convertPoint(final double x, final double y) { Point2D.Double p = new Point2D.Double(x, y); try { - transform.inverseTransform(p, p); + projection.inverseTransform(p, p); } catch (NoninvertibleTransformException e) { assert (false) : "Should not occur"; return new Point2D.Double(0, 0); } - p.setLocation(p.x / EXTRA_SCALE, p.y / EXTRA_SCALE); + p.setLocation(p.x, p.y); return p; } - - - @Override - public Dimension getOrigin() { + public Dimension getSubjectOrigin() { if (modID != finset.getRocket().getAerodynamicModID()) { modID = finset.getRocket().getAerodynamicModID(); - calculateDimensions(); + updateTransform(); } - return new Dimension((int) translateX, (int) translateY); - } - + return new Dimension(originLocation_px.width, originLocation_px.height); + } + @Override - public double getFigureWidth() { - if (modID != finset.getRocket().getAerodynamicModID()) { - modID = finset.getRocket().getAerodynamicModID(); - calculateDimensions(); - } - return figureWidth; - } - - @Override - public double getFigureHeight() { - if (modID != finset.getRocket().getAerodynamicModID()) { - modID = finset.getRocket().getAerodynamicModID(); - calculateDimensions(); - } - return figureHeight; - } - - - private void calculateDimensions() { - minX = 0; - maxX = 0; - maxY = 0; - - for (Coordinate c : finset.getFinPoints()) { - if (c.x < minX) - minX = c.x; - if (c.x > maxX) - maxX = c.x; - if (c.y > maxY) - maxY = c.y; - } - - if (maxX < 0.01) - maxX = 0.01; - - figureWidth = maxX - minX; - figureHeight = maxY; - + protected void updateSubjectDimensions(){ + + // update subject (i.e. Fin) bounds + finBounds_m = new BoundingBox().update(finset.getFinPoints()).toRectangle(); + + // update to bound the parent body: + SymmetricComponent parent = (SymmetricComponent)this.finset.getParent(); + final double xFinFront = finset.getAxialOffset(AxialMethod.TOP); + final double xParent = -xFinFront; + final double yParent = -parent.getRadius(xParent); // from parent centerline to fin front. + final double rParent = Math.max(parent.getForeRadius(), parent.getAftRadius()); + mountBounds_m = new Rectangle2D.Double( xParent, yParent, parent.getLength(), rParent); - Dimension d = new Dimension((int) (figureWidth * scale + 2 * borderPixelsWidth), - (int) (figureHeight * scale + 2 * borderPixelsHeight)); - - if (!d.equals(getPreferredSize()) || !d.equals(getMinimumSize())) { - setPreferredSize(d); - setMinimumSize(d); - revalidate(); - } + final double xMinBounds = Math.min(xParent, finBounds_m.getMinX()); + final double yMinBounds = Math.min(xParent, finBounds_m.getMinY()); + final double subjectWidth = Math.max( xFinFront + finBounds_m.getWidth(), parent.getLength()); + final double subjectHeight = Math.max( 2*rParent, rParent + finBounds_m.getHeight()); + subjectBounds_m = new Rectangle2D.Double( xMinBounds, yMinBounds, subjectWidth, subjectHeight); } - - @Override - public void updateFigure() { - repaint(); - } - + protected void updateCanvasOrigin() { + final int finHeight = (int)(finBounds_m.getHeight()*scale); + final int mountHeight = (int)(mountBounds_m.getHeight()*scale); + final int finFrontX = (int)(subjectBounds_m.getX()*scale); + final int subjectHeight = (int)(subjectBounds_m.getHeight()*scale); + + originLocation_px.width = borderThickness_px.width - finFrontX; + + if( visibleBounds_px.height > (subjectHeight+ 2*borderThickness_px.height)) { + originLocation_px.height = getHeight() - mountHeight - borderThickness_px.height; + }else { + originLocation_px.height = borderThickness_px.height + finHeight; + } + } + + public void resetSelectedIndex() { + this.selectedIndex = -1; + } + public void setSelectedIndex(final int newIndex) { + this.selectedIndex = newIndex; + } } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java index b864de5455..5775390a15 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java @@ -15,18 +15,26 @@ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.Map.Entry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.sf.openrocket.gui.figureelements.FigureElement; +import net.sf.openrocket.gui.rocketfigure.RocketComponentShape; import net.sf.openrocket.gui.util.ColorConversion; import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.ComponentAssembly; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.InstanceContext; import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.BoundingBox; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.LineStyle; @@ -41,45 +49,36 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class RocketFigure extends AbstractScaleFigure { - private static final long serialVersionUID = 1L; + + private final static Logger log = LoggerFactory.getLogger(FinPointFigure.class); private static final String ROCKET_FIGURE_PACKAGE = "net.sf.openrocket.gui.rocketfigure"; private static final String ROCKET_FIGURE_SUFFIX = "Shapes"; - public static final int TYPE_SIDE = 1; - public static final int TYPE_BACK = 2; + public static final int VIEW_SIDE=0; + public static final int VIEW_BACK=1; // Width for drawing normal and selected components public static final double NORMAL_WIDTH = 1.0; public static final double SELECTED_WIDTH = 2.0; - private Configuration configuration; + private Rocket rocket; + private RocketComponent[] selection = new RocketComponent[0]; - private int type = TYPE_SIDE; + private RocketPanel.VIEW_TYPE currentViewType = RocketPanel.VIEW_TYPE.SideView; private double rotation; - private Transformation transformation; - - private double translateX, translateY; - - - + private Transformation axialRotation; + /* * figureComponents contains the corresponding RocketComponents of the figureShapes */ - private final ArrayList<Shape> figureShapes = new ArrayList<Shape>(); - private final ArrayList<RocketComponent> figureComponents = - new ArrayList<RocketComponent>(); - - private double minX = 0, maxX = 0, maxR = 0; - // Figure width and height in SI-units and pixels - private double figureWidth = 0, figureHeight = 0; - protected int figureWidthPx = 0, figureHeightPx = 0; + private final ArrayList<RocketComponentShape> figureShapes = new ArrayList<RocketComponentShape>(); - private AffineTransform g2transformation = null; private final ArrayList<FigureElement> relativeExtra = new ArrayList<FigureElement>(); private final ArrayList<FigureElement> absoluteExtra = new ArrayList<FigureElement>(); @@ -88,45 +87,16 @@ public class RocketFigure extends AbstractScaleFigure { /** * Creates a new rocket figure. */ - public RocketFigure(Configuration configuration) { + public RocketFigure(Rocket _rkt) { super(); - - this.configuration = configuration; + this.rocket = _rkt; this.rotation = 0.0; - this.transformation = Transformation.rotate_x(0.0); + this.axialRotation = Transformation.rotate_x(0.0); updateFigure(); } - - /** - * Set the configuration displayed by the figure. It may use the same or different rocket. - * - * @param configuration the configuration to display. - */ - public void setConfiguration(Configuration configuration) { - this.configuration = configuration; - updateFigure(); - } - - - @Override - public Dimension getOrigin() { - return new Dimension((int) translateX, (int) translateY); - } - - @Override - public double getFigureHeight() { - return figureHeight; - } - - @Override - public double getFigureWidth() { - return figureWidth; - } - - public RocketComponent[] getSelection() { return selection; } @@ -138,6 +108,7 @@ public void setSelection(RocketComponent[] selection) { this.selection = selection; } updateFigure(); + fireChangeEvent(); } @@ -146,59 +117,34 @@ public double getRotation() { } public Transformation getRotateTransformation() { - return transformation; + return axialRotation; } public void setRotation(double rot) { if (MathUtil.equals(rotation, rot)) return; this.rotation = rot; - this.transformation = Transformation.rotate_x(rotation); + this.axialRotation = Transformation.rotate_x(rotation); updateFigure(); + fireChangeEvent(); } - public int getType() { - return type; + public RocketPanel.VIEW_TYPE getType() { + return currentViewType; } - public void setType(int type) { - if (type != TYPE_BACK && type != TYPE_SIDE) { + public void setType(final RocketPanel.VIEW_TYPE type) { + if (type != RocketPanel.VIEW_TYPE.BackView && type != RocketPanel.VIEW_TYPE.SideView) { throw new IllegalArgumentException("Illegal type: " + type); } - if (this.type == type) + if (this.currentViewType == type) return; - this.type = type; + this.currentViewType = type; updateFigure(); + fireChangeEvent(); } - - - - - - /** - * Updates the figure shapes and figure size. - */ - @Override - public void updateFigure() { - figureShapes.clear(); - figureComponents.clear(); - - calculateSize(); - // Get shapes for all active components - for (RocketComponent c : configuration) { - Shape[] s = getShapes(c); - for (int i = 0; i < s.length; i++) { - figureShapes.add(s[i]); - figureComponents.add(c); - } - } - - repaint(); - fireChangeEvent(); - } - public void addRelativeExtra(FigureElement p) { relativeExtra.add(p); @@ -238,52 +184,16 @@ public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; - AffineTransform baseTransform = g2.getTransform(); - // Update figure shapes if necessary - if (figureShapes == null) - updateFigure(); - + updateSubjectDimensions(); + updateCanvasOrigin(); + updateCanvasSize(); + updateTransform(); + + updateShapes(this.figureShapes); - double tx, ty; - // Calculate translation for figure centering - if (figureWidthPx + 2 * borderPixelsWidth < getWidth()) { - - // Figure fits in the viewport - if (type == TYPE_BACK) - tx = getWidth() / 2; - else - tx = (getWidth() - figureWidthPx) / 2 - minX * scale; - - } else { - - // Figure does not fit in viewport - if (type == TYPE_BACK) - tx = borderPixelsWidth + figureWidthPx / 2; - else - tx = borderPixelsWidth - minX * scale; - - } - - ty = computeTy(figureHeightPx); - - if (Math.abs(translateX - tx) > 1 || Math.abs(translateY - ty) > 1) { - // Origin has changed, fire event - translateX = tx; - translateY = ty; - fireChangeEvent(); - } - - - // Calculate and store the transformation used - // (inverse is used in detecting clicks on objects) - g2transformation = new AffineTransform(); - g2transformation.translate(translateX, translateY); - // Mirror position Y-axis upwards - g2transformation.scale(scale / EXTRA_SCALE, -scale / EXTRA_SCALE); - - g2.transform(g2transformation); + g2.transform(projection); // Set rendering hints appropriately g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, @@ -293,12 +203,11 @@ public void paintComponent(Graphics g) { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - + int shapeCount = figureShapes.size(); // Draw all shapes - - for (int i = 0; i < figureShapes.size(); i++) { - RocketComponent c = figureComponents.get(i); - Shape s = figureShapes.get(i); + for (int i = 0; i < shapeCount; i++) { + RocketComponentShape rcs = figureShapes.get(i); + RocketComponent c = rcs.getComponent(); boolean selected = false; // Check if component is in the selection @@ -310,84 +219,90 @@ public void paintComponent(Graphics g) { } // Set component color and line style - net.sf.openrocket.util.Color color = c.getColor(); + net.sf.openrocket.util.Color color = rcs.color; if (color == null) { color = Application.getPreferences().getDefaultColor(c.getClass()); } g2.setColor(ColorConversion.toAwtColor(color)); - LineStyle style = c.getLineStyle(); + LineStyle style = rcs.lineStyle; if (style == null) style = Application.getPreferences().getDefaultLineStyle(c.getClass()); float[] dashes = style.getDashes(); for (int j = 0; j < dashes.length; j++) { - dashes[j] *= EXTRA_SCALE / scale; + dashes[j] *= 1.0 / scale; } if (selected) { - g2.setStroke(new BasicStroke((float) (SELECTED_WIDTH * EXTRA_SCALE / scale), + g2.setStroke(new BasicStroke((float) (SELECTED_WIDTH / scale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashes, 0)); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); } else { - g2.setStroke(new BasicStroke((float) (NORMAL_WIDTH * EXTRA_SCALE / scale), + g2.setStroke(new BasicStroke((float) (NORMAL_WIDTH / scale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashes, 0)); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); } - g2.draw(s); - + g2.draw(rcs.shape); } - g2.setStroke(new BasicStroke((float) (NORMAL_WIDTH * EXTRA_SCALE / scale), + g2.setStroke(new BasicStroke((float) (NORMAL_WIDTH / scale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - - + // Draw motors - String motorID = configuration.getFlightConfigurationID(); Color fillColor = ((SwingPreferences)Application.getPreferences()).getMotorFillColor(); Color borderColor = ((SwingPreferences)Application.getPreferences()).getMotorBorderColor(); - Iterator<MotorMount> iterator = configuration.motorIterator(); - while (iterator.hasNext()) { - MotorMount mount = iterator.next(); - Motor motor = mount.getMotor(motorID); - double length = motor.getLength(); - double radius = motor.getDiameter() / 2; - - Coordinate[] position = ((RocketComponent) mount).toAbsolute( - new Coordinate(((RocketComponent) mount).getLength() + - mount.getMotorOverhang() - length)); + + FlightConfiguration config = rocket.getSelectedConfiguration(); + for( MotorConfiguration curInstance : config.getActiveMotors()){ + MotorMount mount = curInstance.getMount(); + Motor motor = curInstance.getMotor(); + double motorLength = motor.getLength(); + double motorRadius = motor.getDiameter() / 2; + RocketComponent mountComponent = ((RocketComponent) mount); - for (int i = 0; i < position.length; i++) { - position[i] = transformation.transform(position[i]); - } + // <component>.getLocation() will return all the parent instances of this owning component, AND all of it's own instances as well. + // so, just draw a motor once for each Coordinate returned... + Coordinate[] mountLocations = mount.getLocations(); - for (Coordinate coord : position) { - Shape s; - if (type == TYPE_SIDE) { - s = new Rectangle2D.Double(EXTRA_SCALE * coord.x, - EXTRA_SCALE * (coord.y - radius), EXTRA_SCALE * length, - EXTRA_SCALE * 2 * radius); - } else { - s = new Ellipse2D.Double(EXTRA_SCALE * (coord.z - radius), - EXTRA_SCALE * (coord.y - radius), EXTRA_SCALE * 2 * radius, - EXTRA_SCALE * 2 * radius); + double mountLength = mountComponent.getLength(); +// System.err.println("Drawing Motor: "+motor.getDesignation()+" (x"+mountLocations.length+")"); + for ( Coordinate curMountLocation : mountLocations ){ + Coordinate curMotorLocation = curMountLocation.add( mountLength - motorLength + mount.getMotorOverhang(), 0, 0); +// System.err.println(String.format(" mount instance: %s => %s", curMountLocation.toString(), curMotorLocation.toString() )); + + // rotate by figure's axial rotation: + curMotorLocation = this.axialRotation.transform(curMotorLocation); + + { + Shape s; + if (currentViewType == RocketPanel.VIEW_TYPE.SideView) { + s = new Rectangle2D.Double( curMotorLocation.x, + (curMotorLocation.y - motorRadius), + motorLength, + 2 * motorRadius); + } else { + s = new Ellipse2D.Double((curMotorLocation.z - motorRadius), + (curMotorLocation.y - motorRadius), + 2 * motorRadius, + 2 * motorRadius); + } + g2.setColor(fillColor); + g2.fill(s); + g2.setColor(borderColor); + g2.draw(s); } - g2.setColor(fillColor); - g2.fill(s); - g2.setColor(borderColor); - g2.draw(s); } } - // Draw relative extras for (FigureElement e : relativeExtra) { - e.paint(g2, scale / EXTRA_SCALE); + e.paint(g2, scale); } // Draw absolute extras @@ -400,22 +315,11 @@ public void paintComponent(Graphics g) { } - protected double computeTy(int heightPx) { - final double ty; - if (heightPx + 2 * borderPixelsHeight < getHeight()) { - ty = getHeight() / 2; - } else { - ty = borderPixelsHeight + heightPx / 2; - } - return ty; - } - - public RocketComponent[] getComponentsByPoint(double x, double y) { // Calculate point in shapes' coordinates Point2D.Double p = new Point2D.Double(x, y); try { - g2transformation.inverseTransform(p, p); + projection.inverseTransform(p, p); } catch (NoninvertibleTransformException e) { return new RocketComponent[0]; } @@ -423,139 +327,133 @@ public RocketComponent[] getComponentsByPoint(double x, double y) { LinkedHashSet<RocketComponent> l = new LinkedHashSet<RocketComponent>(); for (int i = 0; i < figureShapes.size(); i++) { - if (figureShapes.get(i).contains(p)) - l.add(figureComponents.get(i)); + RocketComponentShape rcs = this.figureShapes.get(i); + if (rcs.shape.contains(p)) + l.add(rcs.component); } return l.toArray(new RocketComponent[0]); } - + private void updateShapes(ArrayList<RocketComponentShape> allShapes) { + // source input + final FlightConfiguration config = rocket.getSelectedConfiguration(); + + // allShapes is an output buffer -- it stores all the generated shapes + allShapes.clear(); + + for(Entry<RocketComponent, ArrayList<InstanceContext>> entry: config.getActiveInstances().entrySet() ) { + final RocketComponent comp = entry.getKey(); + + final ArrayList<InstanceContext> contextList = entry.getValue(); + for(InstanceContext context: contextList ) { + final Transformation currentTransform = this.axialRotation.applyTransformation(context.transform); + + // generate shape for this component, if active + if( context.active ) { + allShapes = addThisShape( allShapes, this.currentViewType, comp, currentTransform); + } + } + } + } + /** * Gets the shapes required to draw the component. * * @param component * @param params - * @return + * @return the <code>ArrayList</code> containing all the shapes to draw. */ - private Shape[] getShapes(RocketComponent component) { + private static ArrayList<RocketComponentShape> addThisShape( + ArrayList<RocketComponentShape> allShapes, // this is the output parameter + final RocketPanel.VIEW_TYPE viewType, + final RocketComponent component, + final Transformation transformation) { Reflection.Method m; + if(( component instanceof Rocket)||( component instanceof ComponentAssembly )){ + // no-op; no shapes here + return allShapes; + } + // Find the appropriate method - switch (type) { - case TYPE_SIDE: + switch (viewType) { + case SideView: m = Reflection.findMethod(ROCKET_FIGURE_PACKAGE, component, ROCKET_FIGURE_SUFFIX, "getShapesSide", RocketComponent.class, Transformation.class); break; - case TYPE_BACK: + case BackView: m = Reflection.findMethod(ROCKET_FIGURE_PACKAGE, component, ROCKET_FIGURE_SUFFIX, "getShapesBack", RocketComponent.class, Transformation.class); break; default: - throw new BugException("Unknown figure type = " + type); + throw new BugException("Unknown figure type = " + viewType); } if (m == null) { Application.getExceptionHandler().handleErrorCondition("ERROR: Rocket figure paint method not found for " + component); - return new Shape[0]; + return allShapes; } - return (Shape[]) m.invokeStatic(component, transformation); - } - - - /** - * Gets the bounds of the figure, i.e. the maximum extents in the selected dimensions. - * The bounds are stored in the variables minX, maxX and maxR. - */ - private void calculateFigureBounds() { - Collection<Coordinate> bounds = configuration.getBounds(); - - if (bounds.isEmpty()) { - minX = 0; - maxX = 0; - maxR = 0; - return; - } - - minX = Double.MAX_VALUE; - maxX = Double.MIN_VALUE; - maxR = 0; - for (Coordinate c : bounds) { - double x = c.x, r = MathUtil.hypot(c.y, c.z); - if (x < minX) - minX = x; - if (x > maxX) - maxX = x; - if (r > maxR) - maxR = r; + RocketComponentShape[] returnValue = (RocketComponentShape[]) m.invokeStatic(component, transformation); + for ( RocketComponentShape curShape : returnValue ){ + allShapes.add( curShape ); } + return allShapes; } - - public double getBestZoom(Rectangle2D bounds) { - double zh = 1, zv = 1; - if (bounds.getWidth() > 0.0001) - zh = (getWidth() - 2 * borderPixelsWidth) / bounds.getWidth(); - if (bounds.getHeight() > 0.0001) - zv = (getHeight() - 2 * borderPixelsHeight) / bounds.getHeight(); - return Math.min(zh, zv); - } - - + /** + * Gets the bounds of the drawn subject in Model-Space + * + * i.e. the maximum extents in the selected dimensions. + * The bounds are stored in the variables minX, maxX and maxR. + * + * @return + */ + @Override + protected void updateSubjectDimensions() { + // calculate bounds, and store in class variables + final BoundingBox bounds = rocket.getSelectedConfiguration().getBoundingBox(); + + switch (currentViewType) { + case SideView: + subjectBounds_m = new Rectangle2D.Double(bounds.min.x, bounds.min.y, bounds.span().x, bounds.span().y); + break; + case BackView: + final double maxR = Math.max(Math.hypot(bounds.min.y, bounds.min.z), Math.hypot(bounds.max.y, bounds.max.z)); + subjectBounds_m = new Rectangle2D.Double(-maxR, -maxR, 2 * maxR, 2 * maxR); + break; + default: + throw new BugException("Illegal figure type = " + currentViewType); + } + } + /** * Calculates the necessary size of the figure and set the PreferredSize * property accordingly. */ - private void calculateSize() { - calculateFigureBounds(); - - switch (type) { - case TYPE_SIDE: - figureWidth = maxX - minX; - figureHeight = 2 * maxR; - break; - - case TYPE_BACK: - figureWidth = 2 * maxR; - figureHeight = 2 * maxR; - break; - - default: - assert (false) : "Should not occur, type=" + type; - figureWidth = 0; - figureHeight = 0; - } - - figureWidthPx = (int) (figureWidth * scale); - figureHeightPx = (int) (figureHeight * scale); - - Dimension d = new Dimension(figureWidthPx + 2 * borderPixelsWidth, - figureHeightPx + 2 * borderPixelsHeight); - - if (!d.equals(getPreferredSize()) || !d.equals(getMinimumSize())) { - setPreferredSize(d); - setMinimumSize(d); - revalidate(); - } - } - - public Rectangle2D getDimensions() { - switch (type) { - case TYPE_SIDE: - return new Rectangle2D.Double(minX, -maxR, maxX - minX, 2 * maxR); - - case TYPE_BACK: - return new Rectangle2D.Double(-maxR, -maxR, 2 * maxR, 2 * maxR); - - default: - throw new BugException("Illegal figure type = " + type); - } + @Override + protected void updateCanvasOrigin() { + final int subjectFront = (int)(subjectBounds_m.getMinX()*scale); + final int subjectWidth = (int)(subjectBounds_m.getWidth()*scale); + final int subjectHeight = (int)(subjectBounds_m.getHeight()*scale); + + if (currentViewType == RocketPanel.VIEW_TYPE.BackView){ + final int newOriginX = borderThickness_px.width + Math.max(getWidth(), subjectWidth + 2*borderThickness_px.width)/ 2; + final int newOriginY = borderThickness_px.height + getHeight() / 2; + + originLocation_px = new Dimension(newOriginX, newOriginY); + }else if (currentViewType == RocketPanel.VIEW_TYPE.SideView){ + final int newOriginX = borderThickness_px.width - subjectFront; + final int newOriginY = Math.max(getHeight(), subjectHeight + 2*borderThickness_px.height )/ 2; + + originLocation_px = new Dimension(newOriginX, newOriginY); + } } - + } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index fc501dbbef..c5c9f4968b 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -5,7 +5,6 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.Point; -import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -17,8 +16,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; -import javax.swing.AbstractAction; -import javax.swing.Action; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; @@ -40,8 +37,8 @@ import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.adaptors.DoubleModel; -import net.sf.openrocket.gui.adaptors.FlightConfigurationModel; import net.sf.openrocket.gui.components.BasicSlider; +import net.sf.openrocket.gui.components.ConfigurationComboBox; import net.sf.openrocket.gui.components.StageSelector; import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.configdialog.ComponentConfigDialog; @@ -54,12 +51,12 @@ import net.sf.openrocket.gui.simulation.SimulationWorker; import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; -import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; @@ -77,84 +74,78 @@ import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.StateChangeListener; + /** * A JPanel that contains a RocketFigure and buttons to manipulate the figure. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> * @author Bill Kuker <bkuker@billkuker.com> */ +@SuppressWarnings("serial") public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource { - private static final long serialVersionUID = 1L; - + private static final Translator trans = Application.getTranslator(); - - public static enum VIEW_TYPE { - Sideview(false, RocketFigure.TYPE_SIDE), - Backview(false, RocketFigure.TYPE_BACK), + + public enum VIEW_TYPE { + SideView(false, RocketFigure.VIEW_SIDE), + BackView(false, RocketFigure.VIEW_BACK), Figure3D(true, RocketFigure3d.TYPE_FIGURE), Unfinished(true, RocketFigure3d.TYPE_UNFINISHED), Finished(true, RocketFigure3d.TYPE_FINISHED); - + public final boolean is3d; private final int type; - - private VIEW_TYPE(final boolean is3d, final int type) { + + VIEW_TYPE(final boolean is3d, final int type) { this.is3d = is3d; this.type = type; }; - + @Override public String toString() { return trans.get("RocketPanel.FigTypeAct." + super.toString()); } - + } - + private boolean is3d; private final RocketFigure figure; private final RocketFigure3d figure3d; - - + private final ScaleScrollPane scrollPane; - + private final JPanel figureHolder; - + private JLabel infoMessage; - + private TreeSelectionModel selectionModel = null; - + private BasicSlider rotationSlider; private ScaleSelector scaleSelector; - - + /* Calculation of CP and CG */ private AerodynamicCalculator aerodynamicCalculator; - private MassCalculator massCalculator; - private final OpenRocketDocument document; - private final Configuration configuration; - + private Caret extraCP = null; private Caret extraCG = null; private RocketInfo extraText = null; - - + private double cpAOA = Double.NaN; private double cpTheta = Double.NaN; private double cpMach = Double.NaN; private double cpRoll = Double.NaN; - + // The functional ID of the rocket that was simulated private int flightDataFunctionalID = -1; - private String flightDataMotorID = null; - - + private FlightConfigurationId flightDataMotorID = null; + private SimulationWorker backgroundSimulationWorker = null; - + private List<EventListener> listeners = new ArrayList<EventListener>(); - - + + /** * The executor service used for running the background simulations. * This uses a fixed-sized thread pool for all background simulations @@ -164,37 +155,40 @@ public String toString() { static { backgroundSimulationExecutor = Executors.newFixedThreadPool(SwingPreferences.getMaxThreadCount(), new ThreadFactory() { - private ThreadFactory factory = Executors.defaultThreadFactory(); - - @Override - public Thread newThread(Runnable r) { - Thread t = factory.newThread(r); - t.setDaemon(true); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } - }); + private ThreadFactory factory = Executors.defaultThreadFactory(); + + @Override + public Thread newThread(Runnable r) { + Thread t = factory.newThread(r); + t.setDaemon(true); + t.setPriority(Thread.MIN_PRIORITY); + return t; + } + }); } + + public OpenRocketDocument getDocument(){ + return this.document; + } public RocketPanel(OpenRocketDocument document) { - this.document = document; - configuration = document.getDefaultConfiguration(); + Rocket rkt = document.getRocket(); + // TODO: FUTURE: calculator selection aerodynamicCalculator = new BarrowmanCalculator(); - massCalculator = new BasicMassCalculator(); // Create figure and custom scroll pane - figure = new RocketFigure(configuration); - figure3d = new RocketFigure3d(document, configuration); - + figure = new RocketFigure(rkt); + figure3d = new RocketFigure3d(document); + figureHolder = new JPanel(new BorderLayout()); - + scrollPane = new ScaleScrollPane(figure) { private static final long serialVersionUID = 1L; - + @Override public void mouseClicked(MouseEvent event) { handleMouseClick(event); @@ -202,34 +196,32 @@ public void mouseClicked(MouseEvent event) { }; scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); scrollPane.setFitting(true); - + createPanel(); - + is3d = true; go2D(); - - configuration.addChangeListener(new StateChangeListener() { + + rkt.addChangeListener(new StateChangeListener() { @Override public void stateChanged(EventObject e) { updateExtras(); updateFigures(); } }); - - document.getRocket().addComponentChangeListener(new ComponentChangeListener() { + + rkt.addComponentChangeListener(new ComponentChangeListener() { @Override public void componentChanged(ComponentChangeEvent e) { - // System.out.println("Configuration changed, calling updateFigure"); if (is3d) { - if (e instanceof ComponentChangeEvent) { - if (((ComponentChangeEvent) e).isTextureChange()) { - figure3d.flushTextureCaches(); - } + if (e.isTextureChange()) { + figure3d.flushTextureCaches(); } } + updateFigures(); } }); - + figure3d.addComponentSelectionListener(new RocketFigure3d.ComponentSelectionListener() { @Override public void componentClicked(RocketComponent clicked[], MouseEvent event) { @@ -237,14 +229,14 @@ public void componentClicked(RocketComponent clicked[], MouseEvent event) { } }); } - + private void updateFigures() { if (!is3d) figure.updateFigure(); else figure3d.updateFigure(); } - + private void go3D() { if (is3d) return; @@ -253,13 +245,13 @@ private void go3D() { figureHolder.add(figure3d, BorderLayout.CENTER); rotationSlider.setEnabled(false); scaleSelector.setEnabled(false); - + revalidate(); figureHolder.revalidate(); - + figure3d.repaint(); } - + private void go2D() { if (!is3d) return; @@ -272,18 +264,28 @@ private void go2D() { figureHolder.revalidate(); figure.repaint(); } - + /** * Creates the layout and components of the panel. */ private void createPanel() { + final Rocket rkt = document.getRocket(); + + rkt.addChangeListener(new StateChangeListener(){ + @Override + public void stateChanged(EventObject eo) { + updateExtras(); + updateFigures(); + } + }); + setLayout(new MigLayout("", "[shrink][grow]", "[shrink][shrink][grow][shrink]")); - + setPreferredSize(new Dimension(800, 300)); - - - // View Type Dropdown - ComboBoxModel cm = new DefaultComboBoxModel(VIEW_TYPE.values()) { + + // View Type drop-down + ComboBoxModel<VIEW_TYPE> cm = new DefaultComboBoxModel<VIEW_TYPE>(VIEW_TYPE.values()) { + @Override public void setSelectedItem(Object o) { super.setSelectedItem(o); @@ -292,78 +294,67 @@ public void setSelectedItem(Object o) { figure3d.setType(v.type); go3D(); } else { - figure.setType(v.type); + figure.setType(v); updateExtras(); // when switching from side view to back view, need to clear CP & CG markers go2D(); } } }; add(new JLabel(trans.get("RocketPanel.lbl.ViewType")), "spanx, split"); - add(new JComboBox(cm)); - - + add(new JComboBox<VIEW_TYPE>(cm)); + // Zoom level selector scaleSelector = new ScaleSelector(scrollPane); add(scaleSelector); - - - + // Stage selector - StageSelector stageSelector = new StageSelector(configuration); + StageSelector stageSelector = new StageSelector( rkt ); + rkt.addChangeListener(stageSelector); add(stageSelector); - - - + // Flight configuration selector //// Flight configuration: JLabel label = new JLabel(trans.get("RocketPanel.lbl.Flightcfg")); label.setHorizontalAlignment(JLabel.RIGHT); add(label, "growx, right"); - add(new JComboBox(new FlightConfigurationModel(configuration)), "wrap"); - - + + final ConfigurationComboBox configComboBox = new ConfigurationComboBox(rkt); + add(configComboBox, "wrap, width 16%, wmin 100"); + // Create slider and scroll pane - DoubleModel theta = new DoubleModel(figure, "Rotation", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI); UnitSelector us = new UnitSelector(theta, true); us.setHorizontalAlignment(JLabel.CENTER); add(us, "alignx 50%, growx"); - + // Add the rocket figure add(figureHolder, "grow, spany 2, wmin 300lp, hmin 100lp, wrap"); - - + // Add rotation slider // Minimum size to fit "360deg" JLabel l = new JLabel("360" + Chars.DEGREE); Dimension d = l.getPreferredSize(); - + add(rotationSlider = new BasicSlider(theta.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true), "ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy"); - - + //// <html>Click to select    Shift+click to select other    Double-click to edit    Click+drag to move infoMessage = new JLabel(trans.get("RocketPanel.lbl.infoMessage")); infoMessage.setFont(new Font("Sans Serif", Font.PLAIN, 9)); add(infoMessage, "skip, span, gapleft 25, wrap"); - - + addExtras(); } - + public RocketFigure getFigure() { return figure; } - + public AerodynamicCalculator getAerodynamicCalculator() { return aerodynamicCalculator; } - - public Configuration getConfiguration() { - return configuration; - } - + /** * Get the center of pressure figure element. * @@ -372,7 +363,7 @@ public Configuration getConfiguration() { public Caret getExtraCP() { return extraCP; } - + /** * Get the center of gravity figure element. * @@ -381,7 +372,7 @@ public Caret getExtraCP() { public Caret getExtraCG() { return extraCG; } - + /** * Get the extra text figure element. * @@ -390,7 +381,7 @@ public Caret getExtraCG() { public RocketInfo getExtraText() { return extraText; } - + public void setSelectionModel(TreeSelectionModel m) { if (selectionModel != null) { selectionModel.removeTreeSelectionListener(this); @@ -399,9 +390,7 @@ public void setSelectionModel(TreeSelectionModel m) { selectionModel.addTreeSelectionListener(this); valueChanged((TreeSelectionEvent) null); // updates FigureParameters } - - - + /** * Return the angle of attack used in CP calculation. NaN signifies the default value * of zero. @@ -410,7 +399,7 @@ public void setSelectionModel(TreeSelectionModel m) { public double getCPAOA() { return cpAOA; } - + /** * Set the angle of attack to be used in CP calculation. A value of NaN signifies that * the default AOA (zero) should be used. @@ -425,11 +414,11 @@ public void setCPAOA(double aoa) { updateFigures(); fireChangeEvent(); } - + public double getCPTheta() { return cpTheta; } - + public void setCPTheta(double theta) { if (MathUtil.equals(theta, cpTheta) || (Double.isNaN(theta) && Double.isNaN(cpTheta))) @@ -441,11 +430,11 @@ public void setCPTheta(double theta) { updateFigures(); fireChangeEvent(); } - + public double getCPMach() { return cpMach; } - + public void setCPMach(double mach) { if (MathUtil.equals(mach, cpMach) || (Double.isNaN(mach) && Double.isNaN(cpMach))) @@ -455,11 +444,11 @@ public void setCPMach(double mach) { updateFigures(); fireChangeEvent(); } - + public double getCPRoll() { return cpRoll; } - + public void setCPRoll(double roll) { if (MathUtil.equals(roll, cpRoll) || (Double.isNaN(roll) && Double.isNaN(cpRoll))) @@ -469,19 +458,17 @@ public void setCPRoll(double roll) { updateFigures(); fireChangeEvent(); } - - - + @Override public void addChangeListener(StateChangeListener listener) { listeners.add(0, listener); } - + @Override public void removeChangeListener(StateChangeListener listener) { listeners.remove(listener); } - + protected void fireChangeEvent() { EventObject e = new EventObject(this); for (EventListener l : listeners) { @@ -490,10 +477,7 @@ protected void fireChangeEvent() { } } } - - - - + /** * Handle clicking on figure shapes. The functioning is the following: * @@ -504,7 +488,7 @@ protected void fireChangeEvent() { * the next component. Otherwise select the first component in the list. */ public static final int CYCLE_SELECTION_MODIFIER = InputEvent.SHIFT_DOWN_MASK; - + private void handleMouseClick(MouseEvent event) { if (event.getButton() != MouseEvent.BUTTON1) return; @@ -512,20 +496,19 @@ private void handleMouseClick(MouseEvent event) { Point p1 = scrollPane.getViewport().getViewPosition(); int x = p0.x + p1.x; int y = p0.y + p1.y; - + RocketComponent[] clicked = figure.getComponentsByPoint(x, y); - + handleComponentClick(clicked, event); } - + private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { - // If no component is clicked, do nothing if (clicked.length == 0) { selectionModel.setSelectionPath(null); return; } - + // Check whether the currently selected component is in the clicked components. TreePath path = selectionModel.getSelectionPath(); if (path != null) { @@ -542,7 +525,7 @@ private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { } } } - + // Currently selected component not clicked if (path == null) { if (event.isShiftDown() && event.getClickCount() == 1 && clicked.length > 1) { @@ -551,34 +534,32 @@ private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { path = ComponentTreeModel.makeTreePath(clicked[0]); } } - + // Set selection and check for double-click selectionModel.setSelectionPath(path); if (event.getClickCount() == 2) { RocketComponent component = (RocketComponent) path.getLastPathComponent(); - + ComponentConfigDialog.showDialog(SwingUtilities.getWindowAncestor(this), document, component); } } - - - - + /** * Updates the extra data included in the figure. Currently this includes * the CP and CG carets. */ private WarningSet warnings = new WarningSet(); - + private void updateExtras() { Coordinate cp, cg; double cpx, cgx; - + + FlightConfiguration curConfig = document.getSelectedConfiguration(); // TODO: MEDIUM: User-definable conditions - FlightConditions conditions = new FlightConditions(configuration); + FlightConditions conditions = new FlightConditions(curConfig); warnings.clear(); - + if (!Double.isNaN(cpMach)) { conditions.setMach(cpMach); extraText.setMach(cpMach); @@ -586,48 +567,48 @@ private void updateExtras() { conditions.setMach(Application.getPreferences().getDefaultMach()); extraText.setMach(Application.getPreferences().getDefaultMach()); } - + if (!Double.isNaN(cpAOA)) { conditions.setAOA(cpAOA); } else { conditions.setAOA(0); } extraText.setAOA(cpAOA); - + if (!Double.isNaN(cpRoll)) { conditions.setRollRate(cpRoll); } else { conditions.setRollRate(0); } - + if (!Double.isNaN(cpTheta)) { conditions.setTheta(cpTheta); - cp = aerodynamicCalculator.getCP(configuration, conditions, warnings); + cp = aerodynamicCalculator.getCP(curConfig, conditions, warnings); } else { - cp = aerodynamicCalculator.getWorstCP(configuration, conditions, warnings); + cp = aerodynamicCalculator.getWorstCP(curConfig, conditions, warnings); } extraText.setTheta(cpTheta); - - - cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS); - // System.out.println("CG computed as "+cg+ " CP as "+cp); - - if (cp.weight > 0.000001) + + cg = MassCalculator.calculateLaunch( curConfig).getCM(); + + if (cp.weight > MassCalculator.MIN_MASS){ cpx = cp.x; - else + }else{ cpx = Double.NaN; + } - if (cg.weight > 0.000001) + if (cg.weight > MassCalculator.MIN_MASS){ cgx = cg.x; - else + }else{ cgx = Double.NaN; - + } + figure3d.setCG(cg); figure3d.setCP(cp); - + // Length bound is assumed to be tight double length = 0, diameter = 0; - Collection<Coordinate> bounds = configuration.getBounds(); + Collection<Coordinate> bounds = curConfig.getBounds(); if (!bounds.isEmpty()) { double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY; for (Coordinate c : bounds) { @@ -638,40 +619,40 @@ private void updateExtras() { } length = maxX - minX; } - - for (RocketComponent c : configuration) { + + for (RocketComponent c : curConfig.getAllComponents()) { if (c instanceof SymmetricComponent) { double d1 = ((SymmetricComponent) c).getForeRadius() * 2; double d2 = ((SymmetricComponent) c).getAftRadius() * 2; diameter = MathUtil.max(diameter, d1, d2); } } + + RigidBody emptyInfo = MassCalculator.calculateStructure( curConfig ); extraText.setCG(cgx); extraText.setCP(cpx); extraText.setLength(length); extraText.setDiameter(diameter); extraText.setMass(cg.weight); - extraText.setMassWithoutMotors( massCalculator.getCG( configuration, MassCalcType.NO_MOTORS ).weight ); + extraText.setMassWithoutMotors( emptyInfo.getMass() ); extraText.setWarnings(warnings); - - - if (figure.getType() == RocketFigure.TYPE_SIDE && length > 0) { - + + if (figure.getType() == RocketPanel.VIEW_TYPE.SideView && length > 0) { + // TODO: LOW: Y-coordinate and rotation - extraCP.setPosition(cpx * RocketFigure.EXTRA_SCALE, 0); - extraCG.setPosition(cgx * RocketFigure.EXTRA_SCALE, 0); - + extraCP.setPosition(cpx, 0); + extraCG.setPosition(cgx, 0); + } else { - + extraCP.setPosition(Double.NaN, Double.NaN); extraCG.setPosition(Double.NaN, Double.NaN); - + } - - + //////// Flight simulation in background - + // Check whether to compute or not if (!((SwingPreferences) Application.getPreferences()).computeFlightInBackground()) { extraText.setFlightData(null); @@ -679,40 +660,39 @@ private void updateExtras() { stopBackgroundSimulation(); return; } - + // Check whether data is already up to date - if (flightDataFunctionalID == configuration.getRocket().getFunctionalModID() && - flightDataMotorID == configuration.getFlightConfigurationID()) { + if (flightDataFunctionalID == curConfig.getRocket().getFunctionalModID() && + flightDataMotorID == curConfig.getId()) { return; } - - flightDataFunctionalID = configuration.getRocket().getFunctionalModID(); - flightDataMotorID = configuration.getFlightConfigurationID(); - + + flightDataFunctionalID = curConfig.getRocket().getFunctionalModID(); + flightDataMotorID = curConfig.getId(); + // Stop previous computation (if any) stopBackgroundSimulation(); - + // Check that configuration has motors - if (!configuration.hasMotors()) { + if (!curConfig.hasMotors()){ extraText.setFlightData(FlightData.NaN_DATA); extraText.setCalculatingData(false); return; } - + // Start calculation process if(((SwingPreferences) Application.getPreferences()).computeFlightInBackground()){ extraText.setCalculatingData(true); - - Rocket duplicate = (Rocket) configuration.getRocket().copy(); + + Rocket duplicate = (Rocket) document.getRocket().copy(); Simulation simulation = ((SwingPreferences) Application.getPreferences()).getBackgroundSimulation(duplicate); - simulation.getOptions().setMotorConfigurationID( - configuration.getFlightConfigurationID()); - + simulation.setFlightConfigurationId( document.getSelectedConfiguration().getId()); + backgroundSimulationWorker = new BackgroundSimulationWorker(document, simulation); backgroundSimulationExecutor.execute(backgroundSimulationWorker); } } - + /** * Cancels the current background simulation worker, if any. */ @@ -722,26 +702,25 @@ private void stopBackgroundSimulation() { backgroundSimulationWorker = null; } } - - + /** * A SimulationWorker that simulates the rocket flight in the background and * sets the results to the extra text when finished. The worker can be cancelled * if necessary. */ private class BackgroundSimulationWorker extends SimulationWorker { - + private final CustomExpressionSimulationListener exprListener; - + public BackgroundSimulationWorker(OpenRocketDocument doc, Simulation sim) { super(sim); List<CustomExpression> exprs = doc.getCustomExpressions(); exprListener = new CustomExpressionSimulationListener(exprs); } - + @Override protected FlightData doInBackground() { - + // Pause a little while to allow faster UI reaction try { Thread.sleep(300); @@ -749,38 +728,38 @@ protected FlightData doInBackground() { } if (isCancelled() || backgroundSimulationWorker != this) return null; - + return super.doInBackground(); } - + @Override protected void simulationDone() { // Do nothing if cancelled if (isCancelled() || backgroundSimulationWorker != this) return; - + backgroundSimulationWorker = null; extraText.setFlightData(simulation.getSimulatedData()); extraText.setCalculatingData(false); figure.repaint(); figure3d.repaint(); } - + @Override protected SimulationListener[] getExtraListeners() { return new SimulationListener[] { InterruptListener.INSTANCE, ApogeeEndListener.INSTANCE, exprListener }; - + } - + @Override protected void simulationInterrupted(Throwable t) { // Do nothing on cancel, set N/A data otherwise if (isCancelled() || backgroundSimulationWorker != this) // Double-check return; - + backgroundSimulationWorker = null; extraText.setFlightData(FlightData.NaN_DATA); extraText.setCalculatingData(false); @@ -788,32 +767,30 @@ protected void simulationInterrupted(Throwable t) { figure3d.repaint(); } } - - - + /** * Adds the extra data to the figure. Currently this includes the CP and CG carets. */ private void addExtras() { + FlightConfiguration curConfig = document.getSelectedConfiguration(); extraCG = new CGCaret(0, 0); extraCP = new CPCaret(0, 0); - extraText = new RocketInfo(configuration); - updateExtras(); + extraText = new RocketInfo(curConfig); + updateExtras(); + figure.clearRelativeExtra(); figure.addRelativeExtra(extraCP); figure.addRelativeExtra(extraCG); figure.addAbsoluteExtra(extraText); - - + figure3d.clearRelativeExtra(); //figure3d.addRelativeExtra(extraCP); //figure3d.addRelativeExtra(extraCG); figure3d.addAbsoluteExtra(extraText); - + } - - + /** * Updates the selection in the FigureParameters and repaints the figure. * Ignores the event itself. @@ -826,49 +803,49 @@ public void valueChanged(TreeSelectionEvent e) { figure3d.setSelection(null); return; } - + RocketComponent[] components = new RocketComponent[paths.length]; for (int i = 0; i < paths.length; i++) components[i] = (RocketComponent) paths[i].getLastPathComponent(); figure.setSelection(components); - + figure3d.setSelection(components); } - - - - /** - * An <code>Action</code> that shows whether the figure type is the type - * given in the constructor. - * - * @author Sampo Niskanen <sampo.niskanen@iki.fi> - */ - private class FigureTypeAction extends AbstractAction implements StateChangeListener { - private static final long serialVersionUID = 1L; - private final int type; - - public FigureTypeAction(int type) { - this.type = type; - stateChanged(null); - figure.addChangeListener(this); - } - - @Override - public void actionPerformed(ActionEvent e) { - boolean state = (Boolean) getValue(Action.SELECTED_KEY); - if (state == true) { - // This view has been selected - figure.setType(type); - go2D(); - updateExtras(); - } - stateChanged(null); - } - - @Override - public void stateChanged(EventObject e) { - putValue(Action.SELECTED_KEY, figure.getType() == type && !is3d); - } - } + + // /** + // * An <code>Action</code> that shows whether the figure type is the + // type + // * given in the constructor. + // * + // * @author Sampo Niskanen <sampo.niskanen@iki.fi> + // */ + // private class FigureTypeAction extends AbstractAction implements + // StateChangeListener { + // private static final long serialVersionUID = 1L; + // private final VIEW_TYPE type; + // + // public FigureTypeAction(VIEW_TYPE type) { + // this.type = type; + // stateChanged(null); + // figure.addChangeListener(this); + // } + // + // @Override + // public void actionPerformed(ActionEvent e) { + // boolean state = (Boolean) getValue(Action.SELECTED_KEY); + // if (state == true) { + // // This view has been selected + // figure.setType(type); + // go2D(); + // updateExtras(); + // } + // stateChanged(null); + // } + // + // @Override + // public void stateChanged(EventObject e) { + // putValue(Action.SELECTED_KEY, figure.getType() == type && !is3d); + // } + // } } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java deleted file mode 100644 index 48440fe336..0000000000 --- a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.sf.openrocket.gui.scalefigure; - -import java.awt.Dimension; - -import net.sf.openrocket.util.ChangeSource; - - -public interface ScaleFigure extends ChangeSource { - - /** - * Extra scaling applied to the figure. The f***ing Java JRE doesn't know - * how to draw shapes when using very large scaling factors, so this must - * be manually applied to every single shape used. - * <p> - * The scaling factor used is divided by this value, and every coordinate used - * in the figures must be multiplied by this factor. - */ - public static final double EXTRA_SCALE = 1000; - - /** - * Shorthand for {@link #EXTRA_SCALE}. - */ - public static final double S = EXTRA_SCALE; - - - /** - * Set the scale level of the figure. A scale value of 1.0 indicates an original - * size when using the current DPI level. - * - * @param scale the scale level. - */ - public void setScaling(double scale); - - - /** - * Set the scale level so that the figure fits into the given bounds. - * - * @param bounds the bounds of the figure. - */ - public void setScaling(Dimension bounds); - - - /** - * Return the scale level of the figure. A scale value of 1.0 indicates an original - * size when using the current DPI level. - * - * @return the current scale level. - */ - public double getScaling(); - - - /** - * Return the scale of the figure on px/m. - * - * @return the current scale value. - */ - public double getAbsoluteScale(); - - - /** - * Return the pixel coordinates of the figure origin. - * - * @return the pixel coordinates of the figure origin. - */ - public Dimension getOrigin(); - - - /** - * Get the amount of blank space left around the figure. - * - * @return the amount of horizontal and vertical space left on both sides of the figure. - */ - public Dimension getBorderPixels(); - - /** - * Set the amount of blank space left around the figure. - * - * @param width the amount of horizontal space left on both sides of the figure. - * @param height the amount of vertical space left on both sides of the figure. - */ - public void setBorderPixels(int width, int height); -} diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java index a45dd51a8e..3851771ffd 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java @@ -17,7 +17,6 @@ import javax.swing.BorderFactory; import javax.swing.JComponent; -import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.event.ChangeEvent; @@ -29,6 +28,7 @@ import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.StateChangeListener; @@ -44,6 +44,7 @@ * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ +@SuppressWarnings("serial") public class ScaleScrollPane extends JScrollPane implements MouseListener, MouseMotionListener { @@ -51,45 +52,33 @@ public class ScaleScrollPane extends JScrollPane public static final int MINOR_TICKS = 3; public static final int MAJOR_TICKS = 30; + public static final String USER_SCALE_PROPERTY = "UserScale"; - private JComponent component; - private ScaleFigure figure; + private final JComponent component; + private final AbstractScaleFigure figure; private DoubleModel rulerUnit; private Ruler horizontalRuler; private Ruler verticalRuler; - private final boolean allowFit; - + // is the subject *currently* being fitting private boolean fit = false; - - /** - * Create a scale scroll pane that allows fitting. - * - * @param component the component to contain (must implement ScaleFigure) - */ - public ScaleScrollPane(JComponent component) { - this(component, true); - } - /** * Create a scale scroll pane. * * @param component the component to contain (must implement ScaleFigure) * @param allowFit whether automatic fitting of the figure is allowed */ - public ScaleScrollPane(JComponent component, boolean allowFit) { + public ScaleScrollPane(final JComponent component) { super(component); - if (!(component instanceof ScaleFigure)) { + if (!(component instanceof AbstractScaleFigure)) { throw new IllegalArgumentException("component must implement ScaleFigure"); } this.component = component; - this.figure = (ScaleFigure) component; - this.allowFit = allowFit; - + this.figure = (AbstractScaleFigure) component; rulerUnit = new DoubleModel(0.0, UnitGroup.UNITS_LENGTH); rulerUnit.addChangeListener(new ChangeListener() { @@ -106,50 +95,45 @@ public void stateChanged(ChangeEvent e) { UnitSelector selector = new UnitSelector(rulerUnit); selector.setFont(new Font("SansSerif", Font.PLAIN, 8)); this.setCorner(JScrollPane.UPPER_LEFT_CORNER, selector); - this.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new JPanel()); - this.setCorner(JScrollPane.LOWER_LEFT_CORNER, new JPanel()); - this.setCorner(JScrollPane.LOWER_RIGHT_CORNER, new JPanel()); this.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); - + setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + viewport.addMouseListener(this); viewport.addMouseMotionListener(this); figure.addChangeListener(new StateChangeListener() { @Override public void stateChanged(EventObject e) { - horizontalRuler.updateSize(); + horizontalRuler.updateSize(); verticalRuler.updateSize(); - if (fit) { - setFitting(true); - } + if(fit) { + figure.scaleTo(viewport.getExtentSize()); + } } }); viewport.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { - if (fit) { - setFitting(true); - } + if(fit) { + figure.scaleTo(viewport.getExtentSize()); + } + figure.updateFigure(); + + horizontalRuler.updateSize(); + verticalRuler.updateSize(); } }); } - public ScaleFigure getFigure() { + public AbstractScaleFigure getFigure() { return figure; } - - /** - * Return whether automatic fitting of the figure is allowed. - */ - public boolean isFittingAllowed() { - return allowFit; - } - /** * Return whether the figure is currently automatically fitted within the component bounds. */ @@ -159,54 +143,70 @@ public boolean isFitting() { /** * Set whether the figure is automatically fitted within the component bounds. - * - * @throws BugException if automatic fitting is disallowed and <code>fit</code> is <code>true</code> */ - public void setFitting(boolean fit) { - if (fit && !allowFit) { - throw new BugException("Attempting to fit figure not allowing fit."); - } - this.fit = fit; - if (fit) { - setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); + public void setFitting(final boolean shouldFit) { + this.fit = shouldFit; + if (shouldFit) { validate(); - Dimension view = viewport.getExtentSize(); - figure.setScaling(view); - } else { - setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + + Dimension view = viewport.getExtentSize(); + figure.scaleTo(view); + this.firePropertyChange( USER_SCALE_PROPERTY, 1.0, figure.getUserScale()); + + revalidate(); } } - - - public double getScaling() { - return figure.getScaling(); - } - - public double getScale() { - return figure.getAbsoluteScale(); + public double getUserScale() { + return figure.getUserScale(); } - public void setScaling(double scale) { - if (fit) { - setFitting(false); - } - figure.setScaling(scale); - horizontalRuler.repaint(); - verticalRuler.repaint(); + public void setScaling(final double newScale) { + // match if closer than 1%: + if( MathUtil.equals(newScale, figure.getUserScale(), 0.01)){ + return; + } + + // if explicitly setting a zoom level, turn off fitting + this.fit = false; + Dimension view = viewport.getExtentSize(); + figure.scaleTo(newScale, view); + + revalidate(); } public Unit getCurrentUnit() { return rulerUnit.getCurrentUnit(); } - + + public String toViewportString(){ + Rectangle view = this.getViewport().getViewRect(); + return ("Viewport::("+view.getWidth()+","+view.getHeight()+")" + +"@("+view.getX()+", "+view.getY()+")"); + } + + @Override + public void revalidate() { + if( null != component ) { + component.revalidate(); + figure.updateFigure(); + } + + if( null != horizontalRuler ){ + horizontalRuler.revalidate(); + horizontalRuler.repaint(); + } + if( null != verticalRuler ){ + verticalRuler.revalidate(); + verticalRuler.repaint(); + } + + super.revalidate(); + } + //////////////// Mouse handlers //////////////// - - private int dragStartX = 0; private int dragStartY = 0; private Rectangle dragRectangle = null; @@ -266,49 +266,47 @@ private class Ruler extends JComponent { public Ruler(int orientation) { this.orientation = orientation; - updateSize(); rulerUnit.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { + updateSize(); Ruler.this.repaint(); } }); } - - public void updateSize() { - Dimension d = component.getPreferredSize(); + private void updateSize() { if (orientation == HORIZONTAL) { - setPreferredSize(new Dimension(d.width + 10, RULER_SIZE)); + Ruler.this.setMinimumSize(new Dimension(component.getWidth() + 10, RULER_SIZE)); + Ruler.this.setPreferredSize(new Dimension(component.getWidth() + 10, RULER_SIZE)); } else { - setPreferredSize(new Dimension(RULER_SIZE, d.height + 10)); + Ruler.this.setMinimumSize(new Dimension(RULER_SIZE, component.getHeight() + 10)); + Ruler.this.setPreferredSize(new Dimension(RULER_SIZE, component.getHeight() + 10)); } revalidate(); repaint(); } - private double fromPx(int px) { - Dimension origin = figure.getOrigin(); - if (orientation == HORIZONTAL) { - px -= origin.width; - } else { - // px = -(px - origin.height); - px -= origin.height; - } - return px / figure.getAbsoluteScale(); + private double fromPx(final int px) { + Dimension origin = figure.getSubjectOrigin(); + double realValue = Double.NaN; + if (orientation == HORIZONTAL) { + realValue = px - origin.width; + } else { + realValue = origin.height - px; + } + return realValue / figure.getAbsoluteScale(); } - private int toPx(double l) { - Dimension origin = figure.getOrigin(); - int px = (int) (l * figure.getAbsoluteScale() + 0.5); + private int toPx(final double value) { + final Dimension origin = figure.getSubjectOrigin(); + final int px = (int) (value * figure.getAbsoluteScale() + 0.5); if (orientation == HORIZONTAL) { - px += origin.width; + return (px + origin.width); } else { - px = px + origin.height; - // px += origin.height; + return (origin.height - px); } - return px; } @@ -317,13 +315,17 @@ protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; - Rectangle area = g2.getClipBounds(); + updateSize(); + // this function doesn't reliably update all the time, so we'll draw everything for the entire canvas, + // and let the JVM drawing algorithms figure out what should be drawn. + // + Rectangle area = ScaleScrollPane.this.getViewport().getViewRect(); + // Fill area with background color g2.setColor(getBackground()); g2.fillRect(area.x, area.y, area.width, area.height + 100); - - + int startpx, endpx; if (orientation == HORIZONTAL) { startpx = area.x; @@ -333,15 +335,22 @@ protected void paintComponent(Graphics g) { endpx = area.y + area.height; } - Unit unit = rulerUnit.getCurrentUnit(); - double start, end, minor, major; - start = fromPx(startpx); - end = fromPx(endpx); - minor = MINOR_TICKS / figure.getAbsoluteScale(); - major = MAJOR_TICKS / figure.getAbsoluteScale(); - - Tick[] ticks = unit.getTicks(start, end, minor, major); + final double start = fromPx(startpx); + final double end = fromPx(endpx); + final double minor = MINOR_TICKS / figure.getAbsoluteScale(); + final double major = MAJOR_TICKS / figure.getAbsoluteScale(); + + Unit unit = rulerUnit.getCurrentUnit(); + Tick[] ticks = null; + if( VERTICAL == orientation ){ + // the parameters are *intended* to be backwards: because 'getTicks(...)' can only + // create increasing arrays (where the start < end) + ticks = unit.getTicks(end, start, minor, major); + }else if(HORIZONTAL == orientation ){ + // normal parameter order + ticks = unit.getTicks(start, end, minor, major); + } // Set color & hints g2.setColor(Color.BLACK); diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleSelector.java b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleSelector.java index fba7aaa794..a156a544c5 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/ScaleSelector.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/ScaleSelector.java @@ -4,7 +4,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DecimalFormat; -import java.util.Arrays; import java.util.EventObject; import java.util.Locale; @@ -16,71 +15,70 @@ import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.util.StateChangeListener; +@SuppressWarnings("serial") public class ScaleSelector extends JPanel { - + + public static final double MINIMUM_ZOOM = 0.01; // == 1 % + public static final double MAXIMUM_ZOOM = 1000.00; // == 10,000 % + // Ready zoom settings private static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("0.#%"); - - private static final double[] ZOOM_LEVELS = { 0.15, 0.25, 0.5, 0.75, 1.0, 1.5, 2.0 }; - private static final String ZOOM_FIT = "Fit"; - private static final String[] ZOOM_SETTINGS; + + private static final double[] SCALE_LEVELS = { 0.15, 0.25, 0.5, 0.75, 1.0, 1.5, 2.0 }; + private static final String SCALE_FIT = "Fit"; // trans.get("ScaleSelector.something.something"); + private static final String[] SCALE_LABELS; static { - ZOOM_SETTINGS = new String[ZOOM_LEVELS.length + 1]; - for (int i = 0; i < ZOOM_LEVELS.length; i++) - ZOOM_SETTINGS[i] = PERCENT_FORMAT.format(ZOOM_LEVELS[i]); - ZOOM_SETTINGS[ZOOM_SETTINGS.length - 1] = ZOOM_FIT; + SCALE_LABELS = new String[SCALE_LEVELS.length + 1]; + for (int i = 0; i < SCALE_LEVELS.length; i++) + SCALE_LABELS[i] = PERCENT_FORMAT.format(SCALE_LEVELS[i]); + SCALE_LABELS[SCALE_LABELS.length - 1] = SCALE_FIT; } - - + private final ScaleScrollPane scrollPane; - private JComboBox zoomSelector; - - + private JComboBox<String> scaleSelector; + public ScaleSelector(ScaleScrollPane scroll) { super(new MigLayout()); - + this.scrollPane = scroll; - + // Zoom out button JButton button = new JButton(Icons.ZOOM_OUT); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - double scale = scrollPane.getScaling(); - scale = getPreviousScale(scale); - scrollPane.setScaling(scale); + final double oldScale = scrollPane.getUserScale(); + final double newScale = getNextLargerScale(oldScale); + scrollPane.setScaling(newScale); + setZoomText(); } }); add(button, "gap"); - + // Zoom level selector - String[] settings = ZOOM_SETTINGS; - if (!scrollPane.isFittingAllowed()) { - settings = Arrays.copyOf(settings, settings.length - 1); - } + String[] settings = SCALE_LABELS; - zoomSelector = new JComboBox(settings); - zoomSelector.setEditable(true); + scaleSelector = new JComboBox<>(settings); + scaleSelector.setEditable(true); setZoomText(); - zoomSelector.addActionListener(new ActionListener() { + scaleSelector.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { - String text = (String) zoomSelector.getSelectedItem(); + String text = (String) scaleSelector.getSelectedItem(); text = text.replaceAll("%", "").trim(); - - if (text.toLowerCase(Locale.getDefault()).startsWith(ZOOM_FIT.toLowerCase(Locale.getDefault())) && - scrollPane.isFittingAllowed()) { + + if (text.toLowerCase(Locale.getDefault()).startsWith(SCALE_FIT.toLowerCase(Locale.getDefault()))){ scrollPane.setFitting(true); setZoomText(); return; } - + double n = Double.parseDouble(text); n /= 100; if (n <= 0.005) n = 0.005; - + scrollPane.setScaling(n); setZoomText(); } catch (NumberFormatException ignore) { @@ -95,68 +93,62 @@ public void stateChanged(EventObject e) { setZoomText(); } }); - add(zoomSelector, "gap rel"); - - + add(scaleSelector, "gap rel"); + // Zoom in button button = new JButton(Icons.ZOOM_IN); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - double scale = scrollPane.getScaling(); - scale = getNextScale(scale); + double scale = scrollPane.getUserScale(); + scale = getNextSmallerScale(scale); scrollPane.setScaling(scale); + setZoomText(); } }); add(button, "gapleft rel"); - + } - - - + private void setZoomText() { - String text; - double zoom = scrollPane.getScaling(); - text = PERCENT_FORMAT.format(zoom); + final double userScale = scrollPane.getUserScale(); + String text = PERCENT_FORMAT.format(userScale); if (scrollPane.isFitting()) { text = "Fit (" + text + ")"; } - if (!text.equals(zoomSelector.getSelectedItem())) - zoomSelector.setSelectedItem(text); + if (!text.equals(scaleSelector.getSelectedItem())) + scaleSelector.setSelectedItem(text); } - - - - private double getPreviousScale(double scale) { + + private static double getNextLargerScale(final double currentScale) { int i; - for (i = 0; i < ZOOM_LEVELS.length - 1; i++) { - if (scale > ZOOM_LEVELS[i] + 0.05 && scale < ZOOM_LEVELS[i + 1] + 0.05) - return ZOOM_LEVELS[i]; + for (i = 0; i < SCALE_LEVELS.length - 1; i++) { + if (currentScale > SCALE_LEVELS[i] + 0.05 && currentScale < SCALE_LEVELS[i + 1] + 0.05) + return SCALE_LEVELS[i]; } - if (scale > ZOOM_LEVELS[ZOOM_LEVELS.length / 2]) { + if (currentScale > SCALE_LEVELS[SCALE_LEVELS.length / 2]) { // scale is large, drop to next lowest full 100% - scale = Math.ceil(scale - 1.05); - return Math.max(scale, ZOOM_LEVELS[i]); + double nextScale = Math.ceil(currentScale - 1.05); + return Math.max(nextScale, SCALE_LEVELS[i]); } // scale is small - return scale / 1.5; + return currentScale / 1.5; } - - - private double getNextScale(double scale) { + + private static double getNextSmallerScale(final double currentScale) { int i; - for (i = 0; i < ZOOM_LEVELS.length - 1; i++) { - if (scale > ZOOM_LEVELS[i] - 0.05 && scale < ZOOM_LEVELS[i + 1] - 0.05) - return ZOOM_LEVELS[i + 1]; + for (i = 0; i < SCALE_LEVELS.length - 1; i++) { + if (currentScale > SCALE_LEVELS[i] - 0.05 && currentScale < SCALE_LEVELS[i + 1] - 0.05) + return SCALE_LEVELS[i + 1]; } - if (scale > ZOOM_LEVELS[ZOOM_LEVELS.length / 2]) { + if (currentScale > SCALE_LEVELS[SCALE_LEVELS.length / 2]) { // scale is large, give next full 100% - scale = Math.floor(scale + 1.05); - return scale; + double nextScale = Math.floor(currentScale + 1.05); + return nextScale; } - return scale * 1.5; + return currentScale * 1.5; } - + @Override public void setEnabled(boolean b){ for ( Component c : getComponents() ){ @@ -164,5 +156,5 @@ public void setEnabled(boolean b){ } super.setEnabled(b); } - + } diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java index 7f8307225c..a57ae77bba 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationEditDialog.java @@ -21,22 +21,21 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; -import net.sf.openrocket.gui.adaptors.FlightConfigurationModel; +import net.sf.openrocket.gui.components.ConfigurationComboBox; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.simulation.SimulationOptions; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.simulation.extension.SimulationExtension; import net.sf.openrocket.startup.Application; public class SimulationEditDialog extends JDialog { - + private static final long serialVersionUID = -4468157685542912715L; private final Window parentWindow; - private final Simulation[] simulation; + private final Simulation[] simulationList; private final OpenRocketDocument document; - private final SimulationOptions conditions; - private final Configuration configuration; private static final Translator trans = Application.getTranslator(); JPanel cards; @@ -48,9 +47,7 @@ public SimulationEditDialog(Window parent, final OpenRocketDocument document, Si super(parent, trans.get("simedtdlg.title.Editsim"), JDialog.ModalityType.DOCUMENT_MODAL); this.document = document; this.parentWindow = parent; - this.simulation = sims; - this.conditions = simulation[0].getOptions(); - configuration = simulation[0].getConfiguration(); + this.simulationList = sims; this.cards = new JPanel(new CardLayout()); this.add(cards); @@ -66,11 +63,11 @@ public SimulationEditDialog(Window parent, final OpenRocketDocument document, Si } private boolean isSingleEdit() { - return simulation.length == 1; + return simulationList.length == 1; } private boolean allowsPlotMode() { - return simulation.length == 1 && simulation[0].hasSimulationData(); + return simulationList.length == 1 && simulationList[0].hasSimulationData(); } public void setEditMode() { @@ -89,12 +86,12 @@ public void setPlotMode() { } private void copyChangesToAllSims() { - if (simulation.length > 1) { - for (int i = 1; i < simulation.length; i++) { - simulation[i].getOptions().copyConditionsFrom(simulation[0].getOptions()); - simulation[i].getSimulationExtensions().clear(); - for (SimulationExtension c : simulation[0].getSimulationExtensions()) { - simulation[i].getSimulationExtensions().add(c.clone()); + if (simulationList.length > 1) { + for (int i = 1; i < simulationList.length; i++) { + simulationList[i].getOptions().copyConditionsFrom(simulationList[0].getOptions()); + simulationList[i].getSimulationExtensions().clear(); + for (SimulationExtension c : simulationList[0].getSimulationExtensions()) { + simulationList[i].getSimulationExtensions().add(c.clone()); } } } @@ -115,7 +112,7 @@ private void buildEditCard() { //// Simulation name: panel.add(new JLabel(trans.get("simedtdlg.lbl.Simname") + " "), "growx 0, gapright para"); - final JTextField field = new JTextField(simulation[0].getName()); + final JTextField field = new JTextField(simulationList[0].getName()); field.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { @@ -137,7 +134,7 @@ private void setText() { if (name == null || name.equals("")) return; //System.out.println("Setting name:" + name); - simulation[0].setName(name); + simulationList[0].setName(name); } }); @@ -150,16 +147,21 @@ private void setText() { label.setToolTipText(trans.get("simedtdlg.lbl.ttip.Flightcfg")); panel.add(label, "growx 0, gapright para"); - JComboBox combo = new JComboBox(new FlightConfigurationModel(configuration)); + final Rocket rkt = document.getRocket(); + final ConfigurationComboBox configComboBox = new ConfigurationComboBox(rkt); + //// Select the motor configuration to use. - combo.setToolTipText(trans.get("simedtdlg.combo.ttip.Flightcfg")); - combo.addActionListener(new ActionListener() { + configComboBox.setToolTipText(trans.get("simedtdlg.combo.ttip.Flightcfg")); + configComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - conditions.setMotorConfigurationID(configuration.getFlightConfigurationID()); + FlightConfiguration config = (FlightConfiguration)configComboBox.getSelectedItem(); + FlightConfigurationId id = config.getId(); + + simulationList[0].setFlightConfigurationId( id ); } }); - panel.add(combo, "span"); + panel.add(configComboBox, "span"); panel.add(new JPanel(), "growx, wrap"); @@ -168,9 +170,9 @@ public void actionPerformed(ActionEvent e) { JTabbedPane tabbedPane = new JTabbedPane(); //// Launch conditions - tabbedPane.addTab(trans.get("simedtdlg.tab.Launchcond"), new SimulationConditionsPanel(simulation[0])); + tabbedPane.addTab(trans.get("simedtdlg.tab.Launchcond"), new SimulationConditionsPanel(simulationList[0])); //// Simulation options - tabbedPane.addTab(trans.get("simedtdlg.tab.Simopt"), new SimulationOptionsPanel(document, simulation[0])); + tabbedPane.addTab(trans.get("simedtdlg.tab.Simopt"), new SimulationOptionsPanel(document, simulationList[0])); tabbedPane.setSelectedIndex(0); @@ -203,7 +205,7 @@ public void actionPerformed(ActionEvent e) { @Override public void actionPerformed(ActionEvent e) { copyChangesToAllSims(); - SimulationRunDialog.runSimulations(parentWindow, SimulationEditDialog.this.document, simulation); + SimulationRunDialog.runSimulations(parentWindow, SimulationEditDialog.this.document, simulationList); refreshView(); if (allowsPlotMode()) { setPlotMode(); @@ -234,17 +236,17 @@ private void buildPlotCard() { //// Simulation name: plotExportPanel.add(new JLabel(trans.get("simedtdlg.lbl.Simname") + " "), "span, split 2, shrink"); - final JTextField field = new JTextField(simulation[0].getName()); + final JTextField field = new JTextField(simulationList[0].getName()); field.setEditable(false); plotExportPanel.add(field, "shrinky, growx, wrap"); final JTabbedPane tabbedPane = new JTabbedPane(); //// Plot data - final SimulationPlotPanel plotTab = new SimulationPlotPanel(simulation[0]); + final SimulationPlotPanel plotTab = new SimulationPlotPanel(simulationList[0]); tabbedPane.addTab(trans.get("simedtdlg.tab.Plotdata"), plotTab); //// Export data - final SimulationExportPanel exportTab = new SimulationExportPanel(simulation[0]); + final SimulationExportPanel exportTab = new SimulationExportPanel(simulationList[0]); tabbedPane.addTab(trans.get("simedtdlg.tab.Exportdata"), exportTab); plotExportPanel.add(tabbedPane, "grow, wrap"); @@ -284,8 +286,8 @@ public void stateChanged(ChangeEvent e) { @Override public void actionPerformed(ActionEvent e) { // If the simulation is out of date, run the simulation. - if (simulation[0].getStatus() != Simulation.Status.UPTODATE) { - new SimulationRunDialog(SimulationEditDialog.this.parentWindow, document, simulation[0]).setVisible(true); + if (simulationList[0].getStatus() != Simulation.Status.UPTODATE) { + new SimulationRunDialog(SimulationEditDialog.this.parentWindow, document, simulationList[0]).setVisible(true); } if (tabbedPane.getSelectedIndex() == 0) { diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java index 3f97c8e7bb..bcd127bd89 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java @@ -42,6 +42,7 @@ public class SimulationExportPanel extends JPanel { + private static final long serialVersionUID = 3423905472892675964L; private static final String SPACE = "SPACE"; private static final String TAB = "TAB"; private static final Translator trans = Application.getTranslator(); @@ -109,6 +110,8 @@ public SimulationExportPanel(Simulation sim) { table.setColumnSelectionAllowed(false); table.setDefaultEditor(Unit.class, new UnitCellEditor() { + private static final long serialVersionUID = 1088570433902420935L; + @Override protected UnitGroup getUnitGroup(Unit value, int row, int column) { return types[row].getUnitGroup(); @@ -179,7 +182,7 @@ public void actionPerformed(ActionEvent e) { ArrayList<String> stages = new ArrayList<String>(); stages.addAll(Util.generateSeriesLabels(simulation)); - final JComboBox stageSelection = new JComboBox(stages.toArray(new String[0])); + final JComboBox<String> stageSelection = new JComboBox<String>(stages.toArray(new String[0])); stageSelection.addItemListener(new ItemListener() { @Override @@ -337,6 +340,7 @@ public Component getTableCellRendererComponent(JTable myTable, Object value, * The table model for the variable selection. */ private class SelectionTableModel extends AbstractTableModel { + private static final long serialVersionUID = 493067422917621072L; private static final int SELECTED = 0; private static final int NAME = 1; private static final int UNIT = 2; diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java index 6a925edef4..86c61e0c8d 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java @@ -50,7 +50,9 @@ import com.google.inject.Key; class SimulationOptionsPanel extends JPanel { - + + private static final long serialVersionUID = -5251458539346201239L; + private static final Translator trans = Application.getTranslator(); private OpenRocketDocument document; @@ -114,7 +116,7 @@ class SimulationOptionsPanel extends JPanel { EnumModel<GeodeticComputationStrategy> gcsModel = new EnumModel<GeodeticComputationStrategy>( conditions, "GeodeticComputation"); - final JComboBox gcsCombo = new JComboBox(gcsModel); + final JComboBox<GeodeticComputationStrategy> gcsCombo = new JComboBox<GeodeticComputationStrategy>(gcsModel); ActionListener gcsTTipListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -317,6 +319,11 @@ private void updateCurrentExtensions() { private class SimulationExtensionPanel extends JPanel { + /** + * + */ + private static final long serialVersionUID = -3296795614810745035L; + public SimulationExtensionPanel(final SimulationExtension extension) { super(new MigLayout("fillx, gapx 0")); diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java index 40c3ebba26..5ccf7b3e39 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationPlotPanel.java @@ -43,6 +43,8 @@ * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class SimulationPlotPanel extends JPanel { + private static final long serialVersionUID = -2227129713185477998L; + private static final Translator trans = Application.getTranslator(); // TODO: LOW: Should these be somewhere else? @@ -86,9 +88,9 @@ public class SimulationPlotPanel extends JPanel { private PlotConfiguration configuration; - private JComboBox configurationSelector; + private JComboBox<PlotConfiguration> configurationSelector; - private JComboBox domainTypeSelector; + private JComboBox<FlightDataType> domainTypeSelector; private UnitSelector domainUnitSelector; private JPanel typeSelectorPanel; @@ -114,7 +116,7 @@ public SimulationPlotPanel(final Simulation simulation) { //// Configuration selector // Setup the combo box - configurationSelector = new JComboBox(PRESET_ARRAY); + configurationSelector = new JComboBox<PlotConfiguration>(PRESET_ARRAY); for (PlotConfiguration config : PRESET_ARRAY) { if (config.getName().equals(configuration.getName())) { configurationSelector.setSelectedItem(config); @@ -153,7 +155,7 @@ public void itemStateChanged(ItemEvent e) { //// X axis type: this.add(new JLabel(trans.get("simplotpanel.lbl.Xaxistype")), "spanx, split"); - domainTypeSelector = new JComboBox(types); + domainTypeSelector = new JComboBox<FlightDataType>(types); domainTypeSelector.setSelectedItem(configuration.getDomainAxisType()); domainTypeSelector.addItemListener(new ItemListener() { @Override @@ -393,12 +395,14 @@ private void updatePlots() { * A JPanel which configures a single plot of a PlotConfiguration. */ private class PlotTypeSelector extends JPanel { + private static final long serialVersionUID = 9056324972817542570L; + private final String[] POSITIONS = { AUTO_NAME, LEFT_NAME, RIGHT_NAME }; private final int index; - private JComboBox typeSelector; + private JComboBox<FlightDataType> typeSelector; private UnitSelector unitSelector; - private JComboBox axisSelector; + private JComboBox<String> axisSelector; public PlotTypeSelector(int plotIndex, FlightDataType type, Unit unit, int position) { @@ -406,7 +410,7 @@ public PlotTypeSelector(int plotIndex, FlightDataType type, Unit unit, int posit this.index = plotIndex; - typeSelector = new JComboBox(types); + typeSelector = new JComboBox<FlightDataType>(types); typeSelector.setSelectedItem(type); typeSelector.addItemListener(new ItemListener() { @Override @@ -440,7 +444,7 @@ public void itemStateChanged(ItemEvent e) { //// Axis: this.add(new JLabel(trans.get("simplotpanel.lbl.Axis"))); - axisSelector = new JComboBox(POSITIONS); + axisSelector = new JComboBox<String>(POSITIONS); if (position == LEFT) axisSelector.setSelectedIndex(1); else if (position == RIGHT) @@ -478,6 +482,7 @@ public void actionPerformed(ActionEvent e) { private class FlightEventTableModel extends AbstractTableModel { + private static final long serialVersionUID = -1108240805614567627L; private final FlightEvent.Type[] eventTypes; public FlightEventTableModel() { diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java index c770be0dc8..077112d8ca 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java @@ -8,7 +8,7 @@ import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.util.Iterator; +import java.util.Collection; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; @@ -23,6 +23,9 @@ import javax.swing.JPanel; import javax.swing.JProgressBar; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; @@ -30,9 +33,9 @@ import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.rocketcomponent.IgnitionConfiguration; -import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.motor.IgnitionEvent; +import net.sf.openrocket.motor.MotorConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.customexpression.CustomExpression; @@ -47,57 +50,49 @@ import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.MathUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class SimulationRunDialog extends JDialog { + private static final long serialVersionUID = -1593459321777026455L; private static final Logger log = LoggerFactory.getLogger(SimulationRunDialog.class); private static final Translator trans = Application.getTranslator(); - - + /** Update the dialog status every this many ms */ private static final long UPDATE_MS = 200; - + /** Flight progress at motor burnout */ private static final double BURNOUT_PROGRESS = 0.4; - + /** Flight progress at apogee */ private static final double APOGEE_PROGRESS = 0.7; - - + /** - * A single ThreadPoolExecutor that will be used for all simulations. - * This executor must not be shut down. + * A single ThreadPoolExecutor that will be used for all simulations. This + * executor must not be shut down. */ private static final ThreadPoolExecutor executor; + static { int n = SwingPreferences.getMaxThreadCount(); - executor = new ThreadPoolExecutor(n, n, - 0L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue<Runnable>(), + executor = new ThreadPoolExecutor(n, n, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() { - private ThreadFactory factory = Executors.defaultThreadFactory(); - - @Override - public Thread newThread(Runnable r) { - Thread t = factory.newThread(r); - t.setDaemon(true); - return t; - } - }); + private ThreadFactory factory = Executors.defaultThreadFactory(); + + @Override + public Thread newThread(Runnable r) { + Thread t = factory.newThread(r); + t.setDaemon(true); + return t; + } + }); } - - - + private final JLabel simLabel, timeLabel, altLabel, velLabel; private final JProgressBar progressBar; - - + /* - * NOTE: Care must be used when accessing the simulation parameters, since they - * are being run in another thread. Mutexes are used to avoid concurrent usage, which - * will result in an exception being thrown! + * NOTE: Care must be used when accessing the simulation parameters, since + * they are being run in another thread. Mutexes are used to avoid + * concurrent usage, which will result in an exception being thrown! */ private final Simulation[] simulations; @SuppressWarnings("unused") @@ -108,24 +103,23 @@ public Thread newThread(Runnable r) { private final double[] simulationMaxAltitude; private final double[] simulationMaxVelocity; private final boolean[] simulationDone; - + public SimulationRunDialog(Window window, OpenRocketDocument document, Simulation... simulations) { //// Running simulations... super(window, trans.get("SimuRunDlg.title.RunSim"), Dialog.ModalityType.APPLICATION_MODAL); this.document = document; - + if (simulations.length == 0) { throw new IllegalArgumentException("Called with no simulations to run"); } - + this.simulations = simulations; - - + // Randomize the simulation random seeds for (Simulation sim : simulations) { sim.getOptions().randomizeSeed(); } - + // Initialize the simulations int n = simulations.length; simulationNames = new String[n]; @@ -134,38 +128,37 @@ public SimulationRunDialog(Window window, OpenRocketDocument document, Simulatio simulationMaxAltitude = new double[n]; simulationMaxVelocity = new double[n]; simulationDone = new boolean[n]; - + for (int i = 0; i < n; i++) { simulationNames[i] = simulations[i].getName(); simulationWorkers[i] = new InteractiveSimulationWorker(document, simulations[i], i); executor.execute(simulationWorkers[i]); } - + // Build the dialog JPanel panel = new JPanel(new MigLayout("fill", "[][grow]")); - + //// Running ... simLabel = new JLabel(trans.get("SimuRunDlg.lbl.Running")); panel.add(simLabel, "spanx, wrap para"); - //// Simulation time: + //// Simulation time: panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Simutime") + " "), "gapright para"); timeLabel = new JLabel(""); panel.add(timeLabel, "growx, wmin 200lp, wrap rel"); - + //// Altitude: panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Altitude") + " ")); altLabel = new JLabel(""); panel.add(altLabel, "growx, wrap rel"); - + //// Velocity: panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Velocity") + " ")); velLabel = new JLabel(""); panel.add(velLabel, "growx, wrap para"); - + progressBar = new JProgressBar(); panel.add(progressBar, "spanx, growx, wrap para"); - - + // Add cancel button JButton cancel = new JButton(trans.get("dlg.but.cancel")); cancel.addActionListener(new ActionListener() { @@ -175,8 +168,7 @@ public void actionPerformed(ActionEvent e) { } }); panel.add(cancel, "spanx, tag cancel"); - - + // Cancel simulations when user closes the window this.addWindowListener(new WindowAdapter() { @Override @@ -184,22 +176,20 @@ public void windowClosing(WindowEvent e) { cancelSimulations(); } }); - - + this.add(panel); this.setMinimumSize(new Dimension(300, 0)); this.setLocationByPlatform(true); this.validate(); this.pack(); - + GUIUtil.setDisposableDialogOptions(this, null); - + updateProgress(); } - - + /** - * Cancel the currently running simulations. This is equivalent to clicking + * Cancel the currently running simulations. This is equivalent to clicking * the Cancel button on the dialog. */ public void cancelSimulations() { @@ -208,35 +198,33 @@ public void cancelSimulations() { } executor.purge(); } - - + /** * Static helper method to run simulations. * - * @param parent the parent Window of the dialog to use. - * @param simulations the simulations to run. + * @param parent + * the parent Window of the dialog to use. + * @param simulations + * the simulations to run. */ public static void runSimulations(Window parent, OpenRocketDocument document, Simulation... simulations) { new SimulationRunDialog(parent, document, simulations).setVisible(true); } - - - - + private void updateProgress() { int index; for (index = 0; index < simulations.length; index++) { if (!simulationDone[index]) break; } - + if (index >= simulations.length) { // Everything is done, close the dialog log.debug("Everything done."); this.dispose(); return; } - + // Update the progress bar status int progress = 0; for (SimulationWorker s : simulationWorkers) { @@ -245,7 +233,7 @@ private void updateProgress() { progress /= simulationWorkers.length; progressBar.setValue(progress); log.debug("Progressbar value " + progress); - + // Update the simulation fields simLabel.setText("Running " + simulationNames[index]); if (simulationStatuses[index] == null) { @@ -255,137 +243,131 @@ private void updateProgress() { velLabel.setText(""); return; } - + Unit u = UnitGroup.UNITS_FLIGHT_TIME.getDefaultUnit(); timeLabel.setText(u.toStringUnit(simulationStatuses[index].getSimulationTime())); - + u = UnitGroup.UNITS_DISTANCE.getDefaultUnit(); - altLabel.setText(u.toStringUnit(simulationStatuses[index].getRocketPosition().z) + " (max. " + - u.toStringUnit(simulationMaxAltitude[index]) + ")"); - + altLabel.setText(u.toStringUnit(simulationStatuses[index].getRocketPosition().z) + " (max. " + + u.toStringUnit(simulationMaxAltitude[index]) + ")"); + u = UnitGroup.UNITS_VELOCITY.getDefaultUnit(); - velLabel.setText(u.toStringUnit(simulationStatuses[index].getRocketVelocity().z) + " (max. " + - u.toStringUnit(simulationMaxVelocity[index]) + ")"); + velLabel.setText(u.toStringUnit(simulationStatuses[index].getRocketVelocity().z) + " (max. " + + u.toStringUnit(simulationMaxVelocity[index]) + ")"); } - - - + /** - * A SwingWorker that performs a flight simulation. It periodically updates the - * simulation statuses of the parent class and calls updateProgress(). + * A SwingWorker that performs a flight simulation. It periodically updates + * the simulation statuses of the parent class and calls updateProgress(). * The progress of the simulation is stored in the progress property of the * SwingWorker. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ private class InteractiveSimulationWorker extends SimulationWorker { - + private final int index; private final double burnoutTimeEstimate; private volatile double burnoutVelocity; private volatile double apogeeAltitude; - + private final CustomExpressionSimulationListener exprListener; - + /* - * -2 = time from 0 ... burnoutTimeEstimate - * -1 = velocity from v(burnoutTimeEstimate) ... 0 - * 0 ... n = stages from alt(max) ... 0 + * -2 = time from 0 ... burnoutTimeEstimate -1 = velocity from + * v(burnoutTimeEstimate) ... 0 0 ... n = stages from alt(max) ... 0 */ private volatile int simulationStage = -2; - + private int progress = 0; - - + public InteractiveSimulationWorker(OpenRocketDocument doc, Simulation sim, int index) { super(sim); List<CustomExpression> exprs = doc.getCustomExpressions(); exprListener = new CustomExpressionSimulationListener(exprs); this.index = index; - + // Calculate estimate of motor burn time double launchBurn = 0; double otherBurn = 0; - Configuration config = simulation.getConfiguration(); - String id = simulation.getOptions().getMotorConfigurationID(); - Iterator<MotorMount> iterator = config.motorIterator(); - while (iterator.hasNext()) { - MotorMount m = iterator.next(); - if (m.getIgnitionConfiguration().getDefault().getIgnitionEvent() == IgnitionConfiguration.IgnitionEvent.LAUNCH) - launchBurn = MathUtil.max(launchBurn, m.getMotor(id).getBurnTimeEstimate()); + + + FlightConfiguration config = simulation.getRocket().getSelectedConfiguration(); + Collection<MotorConfiguration> activeMotors = config.getActiveMotors(); + + for (MotorConfiguration curInstance : activeMotors) { + if (curInstance.getIgnitionEvent() == IgnitionEvent.LAUNCH) + launchBurn = MathUtil.max(launchBurn, curInstance.getMotor().getBurnTimeEstimate()); else - otherBurn = otherBurn + m.getMotor(id).getBurnTimeEstimate(); + otherBurn = otherBurn + curInstance.getMotor().getBurnTimeEstimate(); } burnoutTimeEstimate = Math.max(launchBurn + otherBurn, 0.1); } - - + /** - * Return the extra listeners to use, a progress listener and cancel listener. + * Return the extra listeners to use, a progress listener and cancel + * listener. */ @Override protected SimulationListener[] getExtraListeners() { return new SimulationListener[] { new SimulationProgressListener(), exprListener }; } - - + /** * Processes simulation statuses published by the simulation listener. - * The statuses of the parent class and the progress property are updated. + * The statuses of the parent class and the progress property are + * updated. */ @Override protected void process(List<SimulationStatus> chunks) { - + // Update max. altitude and velocity for (SimulationStatus s : chunks) { - simulationMaxAltitude[index] = Math.max(simulationMaxAltitude[index], - s.getRocketPosition().z); - simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], - s.getRocketVelocity().length()); + simulationMaxAltitude[index] = Math.max(simulationMaxAltitude[index], s.getRocketPosition().z); + simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().length()); } - + // Calculate the progress SimulationStatus status = chunks.get(chunks.size() - 1); simulationStatuses[index] = status; - + // 1. time = 0 ... burnoutTimeEstimate if (simulationStage == -2 && status.getSimulationTime() < burnoutTimeEstimate) { log.debug("Method 1: t=" + status.getSimulationTime() + " est=" + burnoutTimeEstimate); - setSimulationProgress(MathUtil.map(status.getSimulationTime(), 0, burnoutTimeEstimate, - 0.0, BURNOUT_PROGRESS)); + setSimulationProgress( + MathUtil.map(status.getSimulationTime(), 0, burnoutTimeEstimate, 0.0, BURNOUT_PROGRESS)); updateProgress(); return; } - + if (simulationStage == -2) { simulationStage++; burnoutVelocity = MathUtil.max(status.getRocketVelocity().z, 0.1); log.debug("CHANGING to Method 2, vel=" + burnoutVelocity); } - + // 2. z-velocity from burnout velocity to zero if (simulationStage == -1 && status.getRocketVelocity().z >= 0) { log.debug("Method 2: vel=" + status.getRocketVelocity().z + " burnout=" + burnoutVelocity); - setSimulationProgress(MathUtil.map(status.getRocketVelocity().z, burnoutVelocity, 0, - BURNOUT_PROGRESS, APOGEE_PROGRESS)); + setSimulationProgress(MathUtil.map(status.getRocketVelocity().z, burnoutVelocity, 0, BURNOUT_PROGRESS, + APOGEE_PROGRESS)); updateProgress(); return; } - + if (simulationStage == -1 && status.getRocketVelocity().z < 0) { simulationStage++; apogeeAltitude = MathUtil.max(status.getRocketPosition().z, 1); log.debug("CHANGING to Method 3, apogee=" + apogeeAltitude); } - + // 3. z-position from apogee to zero // TODO: MEDIUM: several stages log.debug("Method 3: alt=" + status.getRocketPosition().z + " apogee=" + apogeeAltitude); - setSimulationProgress(MathUtil.map(status.getRocketPosition().z, - apogeeAltitude, 0, APOGEE_PROGRESS, 1.0)); + setSimulationProgress(MathUtil.map(status.getRocketPosition().z, apogeeAltitude, 0, APOGEE_PROGRESS, 1.0)); updateProgress(); } - + /** * Marks this simulation as done and calls the progress update. */ @@ -396,67 +378,62 @@ protected void simulationDone() { setSimulationProgress(1.0); updateProgress(); } - - + /** - * Marks the simulation as done and shows a dialog presenting - * the error, unless the simulation was cancelled. + * Marks the simulation as done and shows a dialog presenting the error, + * unless the simulation was cancelled. */ @Override protected void simulationInterrupted(Throwable t) { - + if (t instanceof SimulationCancelledException) { simulationDone(); return; // Ignore cancellations } - + // Analyze the exception type if (t instanceof SimulationLaunchException) { - + DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this, new Object[] { //// Unable to simulate: - trans.get("SimuRunDlg.msg.Unabletosim"), - t.getMessage() - }, + trans.get("SimuRunDlg.msg.Unabletosim"), t.getMessage() }, null, simulation.getName(), JOptionPane.ERROR_MESSAGE); - + } else if (t instanceof SimulationException) { - + DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this, new Object[] { //// A error occurred during the simulation: - trans.get("SimuRunDlg.msg.errorOccurred"), - t.getMessage() - }, + trans.get("SimuRunDlg.msg.errorOccurred"), t.getMessage() }, null, simulation.getName(), JOptionPane.ERROR_MESSAGE); - + } else { - - Application.getExceptionHandler().handleErrorCondition("An exception occurred during the simulation", t); - + + Application.getExceptionHandler().handleErrorCondition("An exception occurred during the simulation", + t); + } simulationDone(); } - - + private void setSimulationProgress(double p) { int exact = Math.max(progress, (int) (100 * p + 0.5)); progress = MathUtil.clamp(exact, 0, 100); log.debug("Setting progress to " + progress + " (real " + exact + ")"); super.setProgress(progress); } - - + /** - * A simulation listener that regularly updates the progress property of the - * SimulationWorker and publishes the simulation status for the run dialog to process. + * A simulation listener that regularly updates the progress property of + * the SimulationWorker and publishes the simulation status for the run + * dialog to process. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ private class SimulationProgressListener extends AbstractSimulationListener { private long time = 0; - + @Override public boolean handleFlightEvent(SimulationStatus status, FlightEvent event) { switch (event.getType()) { @@ -467,19 +444,22 @@ public boolean handleFlightEvent(SimulationStatus status, FlightEvent event) { setSimulationProgress(APOGEE_PROGRESS); publish(status); break; - + case LAUNCH: publish(status); break; - + case SIMULATION_END: log.debug("END, setting progress"); setSimulationProgress(1.0); break; + + default: + break; } return true; } - + @Override public void postStep(SimulationStatus status) { if (System.currentTimeMillis() >= time + UPDATE_MS) { diff --git a/swing/src/net/sf/openrocket/gui/util/CheckList.java b/swing/src/net/sf/openrocket/gui/util/CheckList.java index fa7c179483..ce7f7011c3 100644 --- a/swing/src/net/sf/openrocket/gui/util/CheckList.java +++ b/swing/src/net/sf/openrocket/gui/util/CheckList.java @@ -53,23 +53,29 @@ */ public class CheckList<T> { - private final JList list; + private final JList<T> list; private static final MouseAdapter checkBoxEditor = new CheckListEditor(); public static class Builder { - private JList list; + private JList<?> list; - public Builder(JList list) { - this.list = list == null ? new JList() : list; + @SuppressWarnings("rawtypes") + public Builder(JList<?> list) { + if( null == list ){ + this.list = new JList(); + }else{ + this.list = list; + } } public Builder() { this(null); } + @SuppressWarnings("unchecked") public <T> CheckList<T> build() { - return new CheckList<T>(list); + return new CheckList<T>((JList<T>)list); } } @@ -79,7 +85,7 @@ public <T> CheckList<T> build() { * Wraps the standard JList and makes it work like check list * @param list */ - private CheckList(final JList list) { + private CheckList(final JList<T> list) { if (list == null) throw new NullPointerException(); @@ -95,7 +101,7 @@ private CheckList(final JList list) { } @SuppressWarnings("serial") - private void setupKeyboardActions(final JList list) { + private void setupKeyboardActions(final JList<T> list) { String actionKey = "toggle-check"; list.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), actionKey); list.getActionMap().put(actionKey, new AbstractAction() { @@ -117,7 +123,7 @@ private boolean isEditorAttached() { } - public JList getList() { + public JList<T> getList() { return list; } @@ -137,7 +143,6 @@ public void setModel(DefaultCheckListModel<T> model) { list.setModel(model); } - @SuppressWarnings("unchecked") public DefaultCheckListModel<T> getModel() { return (DefaultCheckListModel<T>) list.getModel(); } diff --git a/swing/src/net/sf/openrocket/gui/util/CheckListEditor.java b/swing/src/net/sf/openrocket/gui/util/CheckListEditor.java index 68680670fc..88c8866fe3 100644 --- a/swing/src/net/sf/openrocket/gui/util/CheckListEditor.java +++ b/swing/src/net/sf/openrocket/gui/util/CheckListEditor.java @@ -34,7 +34,6 @@ import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.Arrays; import javax.swing.JList; import javax.swing.SwingUtilities; diff --git a/swing/src/net/sf/openrocket/gui/util/CheckListRenderer.java b/swing/src/net/sf/openrocket/gui/util/CheckListRenderer.java index e0777c4f94..d6f1600de3 100644 --- a/swing/src/net/sf/openrocket/gui/util/CheckListRenderer.java +++ b/swing/src/net/sf/openrocket/gui/util/CheckListRenderer.java @@ -45,10 +45,9 @@ import javax.swing.border.Border; import javax.swing.border.EmptyBorder; +@SuppressWarnings("serial") public class CheckListRenderer extends JCheckBox implements ListCellRenderer, Serializable { - - private static final long serialVersionUID = 1L; - + private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); private static final Border SAFE_NO_FOCUS_BORDER = NO_FOCUS_BORDER; // may change in the feature diff --git a/swing/src/net/sf/openrocket/gui/util/CustomFinImporter.java b/swing/src/net/sf/openrocket/gui/util/CustomFinImporter.java index ae2f7bf422..290cc58922 100644 --- a/swing/src/net/sf/openrocket/gui/util/CustomFinImporter.java +++ b/swing/src/net/sf/openrocket/gui/util/CustomFinImporter.java @@ -24,7 +24,7 @@ private enum FacingDirections { - public List<Coordinate> getPoints(File file) throws IOException { + public ArrayList<Coordinate> getPoints(File file) throws IOException { ArrayList<Coordinate> points = new ArrayList<Coordinate>(); BufferedImage pic = ImageIO.read(file); diff --git a/swing/src/net/sf/openrocket/gui/util/DefaultCheckListModel.java b/swing/src/net/sf/openrocket/gui/util/DefaultCheckListModel.java index cbb4e59192..9438458117 100644 --- a/swing/src/net/sf/openrocket/gui/util/DefaultCheckListModel.java +++ b/swing/src/net/sf/openrocket/gui/util/DefaultCheckListModel.java @@ -32,7 +32,6 @@ package net.sf.openrocket.gui.util; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -49,7 +48,7 @@ * * @param <T> list element type */ -public class DefaultCheckListModel<T> extends AbstractListModel { +public class DefaultCheckListModel<T> extends AbstractListModel<T> { private static final long serialVersionUID = 1L; @@ -65,10 +64,7 @@ public DefaultCheckListModel(Collection<? extends T> data) { checks.clear(); } } - - public DefaultCheckListModel(T... data) { - this(Arrays.asList(data)); - } + /* (non-Javadoc) * @see org.oxbow.swingbits.list.ICheckListModel#getSize() @@ -84,7 +80,7 @@ private List<T> data() { @Override - public Object getElementAt(int index) { + public T getElementAt(int index) { return data().get(index); } diff --git a/swing/src/net/sf/openrocket/gui/util/EditDecalHelper.java b/swing/src/net/sf/openrocket/gui/util/EditDecalHelper.java index 4cb8818b47..6059848d21 100644 --- a/swing/src/net/sf/openrocket/gui/util/EditDecalHelper.java +++ b/swing/src/net/sf/openrocket/gui/util/EditDecalHelper.java @@ -30,6 +30,7 @@ public class EditDecalHelper { private SwingPreferences prefs; public static class EditDecalHelperException extends Exception { + private static final long serialVersionUID = 6434514222471759358L; private String extraMessage = ""; @@ -138,7 +139,7 @@ private void launchEditor(boolean useSystemEditor, String commandTemplate, final try { tmpFile = File.createTempFile("OR_graphics", extension); } catch (IOException ioex) { - String message = MessageFormat.format(trans.get("EditDecalHelper.createFileException"), tmpFile.getAbsoluteFile()); + String message = MessageFormat.format(trans.get("EditDecalHelper.createFileException"), "OR_graphics"+extension); throw new EditDecalHelperException(message, ioex); } diff --git a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java index 80a1e0fac2..d4cf3b3223 100644 --- a/swing/src/net/sf/openrocket/gui/util/GUIUtil.java +++ b/swing/src/net/sf/openrocket/gui/util/GUIUtil.java @@ -166,6 +166,11 @@ public static void setDisposableDialogOptions(JDialog dialog, JButton defaultBut */ public static void installEscapeCloseOperation(final JDialog dialog) { Action dispatchClosing = new AbstractAction() { + /** + * + */ + private static final long serialVersionUID = 9196153713666242274L; + @Override public void actionPerformed(ActionEvent event) { log.info(Markers.USER_MARKER, "Closing dialog " + dialog); @@ -367,7 +372,7 @@ public static void setAutomaticColumnTableWidths(JTable table, int max) { for (int col = 0; col < columns; col++) { - System.err.println("Setting column " + col + " to width " + widths[col]); + //System.err.println("Setting column " + col + " to width " + widths[col]); table.getColumnModel().getColumn(col).setPreferredWidth(Math.min(widths[col], max) * 100); } } @@ -477,13 +482,13 @@ public static void setNullModels(Component c) { } } else if (c instanceof JComboBox) { - - JComboBox combo = (JComboBox) c; + @SuppressWarnings("unchecked") + JComboBox<Object> combo = (JComboBox<Object>) c; for (ActionListener l : combo.getActionListeners()) { combo.removeActionListener(l); } - ComboBoxModel model = combo.getModel(); - combo.setModel(new DefaultComboBoxModel()); + ComboBoxModel<?> model = combo.getModel(); + combo.setModel(new DefaultComboBoxModel<Object>()); if (model instanceof Invalidatable) { ((Invalidatable) model).invalidate(); } @@ -496,6 +501,8 @@ public static void setNullModels(Component c) { } Action model = button.getAction(); button.setAction(new AbstractAction() { + private static final long serialVersionUID = 3499667830135101535L; + @Override public void actionPerformed(ActionEvent e) { } @@ -569,6 +576,7 @@ public void actionPerformed(ActionEvent e) { public static class BooleanTableClickListener extends MouseAdapter { private final JTable table; + // these are different because the MouseEvent and the model use different indexing (0- vs 1-) private final int clickColumn; private final int booleanColumn; @@ -589,34 +597,35 @@ public void mouseClicked(MouseEvent e) { if (e.getButton() != MouseEvent.BUTTON1) return; - Point p = e.getPoint(); - int col = table.columnAtPoint(p); - if (col < 0) + final Point p = e.getPoint(); + final int tableColumn = table.columnAtPoint(p); + if (tableColumn < 0) return; - col = table.convertColumnIndexToModel(col); - if (col != clickColumn) + + final int modelColumn= table.convertColumnIndexToModel(tableColumn); + if (modelColumn != clickColumn) return; - - int row = table.rowAtPoint(p); - if (row < 0) + + final int tableRow = table.rowAtPoint(p); + if (tableRow < 0) return; - row = table.convertRowIndexToModel(row); - if (row < 0) + + final int modelRow = table.convertRowIndexToModel(tableRow); + if ( modelRow < 0) return; - + TableModel model = table.getModel(); - Object value = model.getValueAt(row, booleanColumn); - - if (!(value instanceof Boolean)) { - throw new IllegalStateException("Table value at row=" + row + " col=" + + final Object value = model.getValueAt(modelRow, booleanColumn); + if (!(value instanceof Boolean)) { + throw new IllegalStateException("Table value at row=" + modelRow + " col=" + booleanColumn + " is not a Boolean, value=" + value); } - Boolean b = (Boolean) value; - b = !b; - model.setValueAt(b, row, booleanColumn); + final Boolean oldValue = (Boolean) value; + final Boolean newValue = !oldValue; + model.setValueAt(newValue, tableRow, booleanColumn); if (model instanceof AbstractTableModel) { - ((AbstractTableModel) model).fireTableCellUpdated(row, booleanColumn); + ((AbstractTableModel) model).fireTableCellUpdated(tableRow, booleanColumn); } } diff --git a/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java b/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java index b4bd15cdfc..2755e3c547 100644 --- a/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java +++ b/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java @@ -15,6 +15,9 @@ import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import net.sf.openrocket.arch.SystemInfo; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.material.Material; @@ -29,9 +32,6 @@ import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BuildProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class SwingPreferences extends net.sf.openrocket.startup.Preferences { private static final Logger log = LoggerFactory.getLogger(SwingPreferences.class); @@ -429,9 +429,6 @@ public Simulation getBackgroundSimulation(Rocket rocket) { SimulationOptions cond = s.getOptions(); cond.setTimeStep(RK4SimulationStepper.RECOMMENDED_TIME_STEP * 2); - cond.setWindSpeedAverage(1.0); - cond.setWindSpeedDeviation(0.1); - cond.setLaunchRodLength(5); return s; } diff --git a/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java b/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java index 544b912870..e5449da21f 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java +++ b/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java @@ -47,12 +47,8 @@ * @see JSlider */ +@SuppressWarnings("serial") public class MultiSlider extends JSlider { - /*** - * @see #getUIClassID - * @see #readObject - */ - private static final String uiClassID = "MultiSliderUI"; /*** * An array of data models that handle the numeric maximum values, @@ -212,28 +208,6 @@ private void setNumberOfThumbs(int min, int max, int[] values) { updateUI(); } - /*** - * Sets the number of thumbs. - */ - private void setNumberOfThumbs(int num) { - setNumberOfThumbs(num, false); - } - - /*** - * Sets the number of thumbs. - */ - private void setNumberOfThumbs(int num, boolean useEndPoints) { - if (getNumberOfThumbs() != num) { - setNumberOfThumbs(getMinimum(), getMaximum(), num, useEndPoints); - } - } - - /*** - * Sets the number of thumbs by specifying the initial values. - */ - private void setNumberOfThumbs(int[] values) { - setNumberOfThumbs(getMinimum(), getMaximum(), values); - } /*** * creates evenly spaced values for thumbs. diff --git a/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java b/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java index 135cf2cd97..a2f01c8b10 100644 --- a/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java +++ b/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java @@ -52,6 +52,7 @@ * A UI for editing component presets. Currently this is a standalone application - run the main within this class. * TODO: Full I18n TODO: Save As .csv */ +@SuppressWarnings("serial") public class ComponentPresetEditor extends JPanel implements PresetResultListener { /** diff --git a/swing/src/net/sf/openrocket/utils/GraphicalMotorSelector.java b/swing/src/net/sf/openrocket/utils/GraphicalMotorSelector.java deleted file mode 100644 index 1087c5df57..0000000000 --- a/swing/src/net/sf/openrocket/utils/GraphicalMotorSelector.java +++ /dev/null @@ -1,145 +0,0 @@ -package net.sf.openrocket.utils; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.ThrustCurveMotor; -import net.sf.openrocket.util.Pair; - -public class GraphicalMotorSelector { - - public static void main(String[] args) throws IOException { - - if (args.length == 0) { - System.err.println("MotorPlot <files>"); - System.exit(1); - } - - // Load files - Map<String, List<Pair<String, ThrustCurveMotor>>> map = - new LinkedHashMap<String, List<Pair<String, ThrustCurveMotor>>>(); - - GeneralMotorLoader loader = new GeneralMotorLoader(); - for (String file : args) { - - for (Motor motor : loader.load(new FileInputStream(file), file)) { - ThrustCurveMotor m = (ThrustCurveMotor) motor; - System.out.println("Loaded " + m + " from file " + file); - - Pair<String, ThrustCurveMotor> pair = new Pair<String, ThrustCurveMotor>(file, m); - String key = m.getManufacturer() + ":" + m.getDesignation(); - - List<Pair<String, ThrustCurveMotor>> list = map.get(key); - if (list == null) { - list = new ArrayList<Pair<String, ThrustCurveMotor>>(); - map.put(key, list); - } - - list.add(pair); - } - } - - - // Go through different motors - int count = 0; - for (String key : map.keySet()) { - count++; - List<Pair<String, ThrustCurveMotor>> list = map.get(key); - - - // Select best one of identical motors - List<String> filenames = new ArrayList<String>(); - List<ThrustCurveMotor> motors = new ArrayList<ThrustCurveMotor>(); - for (Pair<String, ThrustCurveMotor> pair : list) { - String file = pair.getU(); - ThrustCurveMotor m = pair.getV(); - - int index = indexOf(motors, m); - if (index >= 0) { - // Replace previous if this has more delays, a known type or longer comment - ThrustCurveMotor m2 = motors.get(index); - if (m.getStandardDelays().length > m2.getStandardDelays().length || - (m2.getMotorType() == Motor.Type.UNKNOWN && - m.getMotorType() != Motor.Type.UNKNOWN) || - (m.getDescription().trim().length() > - m2.getDescription().trim().length())) { - - filenames.set(index, file); - motors.set(index, m); - - } - } else { - filenames.add(file); - motors.add(m); - } - } - - if (filenames.size() == 0) { - - System.out.println("ERROR selecting from " + list); - System.exit(1); - - } else if (filenames.size() == 1) { - - select(filenames.get(0), list, false); - - } else { - - System.out.println("Choosing from " + filenames + - " (" + count + "/" + map.size() + ")"); - MotorPlot plot = new MotorPlot(filenames, motors); - plot.setVisible(true); - plot.dispose(); - int n = plot.getSelected(); - if (n < 0) { - System.out.println("NONE SELECTED from " + filenames); - } else { - select(filenames.get(n), list, true); - } - - } - - } - - } - - private static void select(String selected, List<Pair<String, ThrustCurveMotor>> list, boolean manual) { - System.out.print("SELECT " + selected + " "); - if (manual) { - System.out.println("(manual)"); - } else if (list.size() == 1) { - System.out.println("(only)"); - } else { - System.out.println("(identical)"); - } - - for (Pair<String, ThrustCurveMotor> pair : list) { - String file = pair.getU(); - if (!file.equals(selected)) { - System.out.println("IGNORE " + file); - } - } - } - - - private static int indexOf(List<ThrustCurveMotor> motors, ThrustCurveMotor motor) { - for (int i = 0; i < motors.size(); i++) { - ThrustCurveMotor m = motors.get(i); - // TODO: Similar? - if (m.equals(motor)) { - if (m.getStandardDelays().length == 0 || motor.getStandardDelays().length == 0 || - Arrays.equals(m.getStandardDelays(), motor.getStandardDelays())) { - return i; - } - } - } - return -1; - } -} diff --git a/swing/src/net/sf/openrocket/utils/MotorPlot.java b/swing/src/net/sf/openrocket/utils/MotorPlot.java deleted file mode 100644 index f3b7431055..0000000000 --- a/swing/src/net/sf/openrocket/utils/MotorPlot.java +++ /dev/null @@ -1,178 +0,0 @@ -package net.sf.openrocket.utils; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; - -import net.miginfocom.swing.MigLayout; -import net.sf.openrocket.file.motor.GeneralMotorLoader; -import net.sf.openrocket.gui.util.GUIUtil; -import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.motor.ThrustCurveMotor; -import net.sf.openrocket.startup.Application; - -import org.jfree.chart.ChartFactory; -import org.jfree.chart.ChartPanel; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.plot.PlotOrientation; -import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; -import org.jfree.data.xy.XYSeries; -import org.jfree.data.xy.XYSeriesCollection; - -public class MotorPlot extends JDialog { - - private int selected = -1; - private static final Translator trans = Application.getTranslator(); - - public MotorPlot(List<String> filenames, List<ThrustCurveMotor> motors) { - //// Motor plot - super((JFrame) null, trans.get("MotorPlot.title.Motorplot"), true); - - JTabbedPane tabs = new JTabbedPane(); - for (int i = 0; i < filenames.size(); i++) { - JPanel pane = createPlotPanel((ThrustCurveMotor) motors.get(i)); - - //// Select button - JButton button = new JButton(trans.get("MotorPlot.but.Select")); - final int number = i; - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - selected = number; - MotorPlot.this.setVisible(false); - } - }); - pane.add(button, "wrap", 0); - - tabs.addTab(filenames.get(i), pane); - } - - this.add(tabs); - - this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - this.setLocationByPlatform(true); - this.validate(); - this.pack(); - } - - - private JPanel createPlotPanel(ThrustCurveMotor motor) { - JPanel panel = new JPanel(new MigLayout()); - - - XYSeries series = new XYSeries("", false, true); - double[] time = motor.getTimePoints(); - double[] thrust = motor.getThrustPoints(); - - for (int i = 0; i < time.length; i++) { - series.add(time[i], thrust[i]); - } - - // Create the chart using the factory to get all default settings - JFreeChart chart = ChartFactory.createXYLineChart( - //// Motor thrust curve - trans.get("MotorPlot.Chart.Motorthrustcurve"), - //// Time / s - trans.get("MotorPlot.Chart.Time"), - //// Thrust / N - trans.get("MotorPlot.Chart.Thrust"), - new XYSeriesCollection(series), - PlotOrientation.VERTICAL, - true, - true, - false - ); - - ((XYLineAndShapeRenderer) chart.getXYPlot().getRenderer()).setShapesVisible(true); - - ChartPanel chartPanel = new ChartPanel(chart, - false, // properties - true, // save - false, // print - true, // zoom - true); // tooltips - chartPanel.setMouseWheelEnabled(true); - chartPanel.setEnforceFileExtensions(true); - chartPanel.setInitialDelay(500); - - chartPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1)); - - panel.add(chartPanel, "grow, wrap para"); - - - JTextArea area = new JTextArea(5, 40); - StringBuilder sb = new StringBuilder(); - //// Designation: - sb.append("MotorPlot.txt.Designation" + " ").append(motor.getDesignation()).append(" "); - //// Manufacturer: - sb.append("MotorPlot.txt.Manufacturer" + " ").append(motor.getManufacturer()).append(" "); - //// Type: - sb.append("MotorPlot.txt.Type" + " ").append(motor.getMotorType()).append('\n'); - //// Delays: - sb.append("MotorPlot.txt.Delays" +" ").append(Arrays.toString(motor.getStandardDelays())).append('\n'); - //// Comment:\n - sb.append("MotorPlot.txt.Comment" + " ").append(motor.getDescription()); - area.setText(sb.toString()); - panel.add(area, "grow, wrap"); - - - return panel; - } - - - - public int getSelected() { - return selected; - } - - - public static void main(String[] args) throws IOException { - if (args.length == 0) { - System.err.println("MotorPlot <files>"); - System.exit(1); - } - - final List<String> filenames = new ArrayList<String>(); - final List<ThrustCurveMotor> motors = new ArrayList<ThrustCurveMotor>(); - - GeneralMotorLoader loader = new GeneralMotorLoader(); - for (String file : args) { - for (Motor m : loader.load(new FileInputStream(file), file)) { - filenames.add(file); - motors.add((ThrustCurveMotor) m); - } - } - - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - GUIUtil.setBestLAF(); - - MotorPlot plot = new MotorPlot(filenames, motors); - plot.setVisible(true); - } - - }); - - } - - - - -} diff --git a/swing/src/net/sf/openrocket/utils/StringUtils.java b/swing/src/net/sf/openrocket/utils/StringUtils.java new file mode 100644 index 0000000000..e362252c41 --- /dev/null +++ b/swing/src/net/sf/openrocket/utils/StringUtils.java @@ -0,0 +1,19 @@ +package net.sf.openrocket.utils; + +public class StringUtils { + + public static String join(String sep, Object[] values) { + if ( values == null || values.length == 0 ) { + return ""; + } + StringBuilder value = new StringBuilder(); + for( Object v : values ) { + if( value.length() > 0 ) { + value.append(sep); + } + value.append(String.valueOf(v)); + } + return value.toString(); + } + +} diff --git a/swing/test/net/sf/openrocket/IntegrationTest.java b/swing/test/net/sf/openrocket/IntegrationTest.java index 9bb4ff0d7b..2c0fd17c2d 100644 --- a/swing/test/net/sf/openrocket/IntegrationTest.java +++ b/swing/test/net/sf/openrocket/IntegrationTest.java @@ -13,6 +13,20 @@ import javax.swing.Action; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; +import com.google.inject.Provider; +import com.google.inject.util.Modules; + import net.sf.openrocket.aerodynamics.AerodynamicCalculator; import net.sf.openrocket.aerodynamics.BarrowmanCalculator; import net.sf.openrocket.aerodynamics.FlightConditions; @@ -28,14 +42,14 @@ import net.sf.openrocket.gui.main.UndoRedoAction; import net.sf.openrocket.l10n.DebugTranslator; import net.sf.openrocket.l10n.Translator; -import net.sf.openrocket.masscalc.BasicMassCalculator; import net.sf.openrocket.masscalc.MassCalculator; -import net.sf.openrocket.masscalc.MassCalculator.MassCalcType; -import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.masscalc.RigidBody; import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.plugin.PluginModule; -import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.EngineBlock; +import net.sf.openrocket.rocketcomponent.FlightConfiguration; +import net.sf.openrocket.rocketcomponent.FlightConfigurationId; +import net.sf.openrocket.rocketcomponent.InnerTube; import net.sf.openrocket.rocketcomponent.MassComponent; import net.sf.openrocket.rocketcomponent.NoseCone; import net.sf.openrocket.rocketcomponent.RocketComponent; @@ -45,20 +59,6 @@ import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.utils.CoreServicesModule; -import org.jmock.Mockery; -import org.jmock.integration.junit4.JMock; -import org.jmock.integration.junit4.JUnit4Mockery; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; - -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Module; -import com.google.inject.Provider; -import com.google.inject.util.Modules; - /** * This class contains various integration tests that simulate user actions that * might be performed. @@ -71,8 +71,7 @@ public class IntegrationTest { private Action undoAction, redoAction; private AerodynamicCalculator aeroCalc = new BarrowmanCalculator(); - private MassCalculator massCalc = new BasicMassCalculator(); - private Configuration config; + private FlightConfiguration config; private FlightConditions conditions; private String massComponentID = null; @@ -113,13 +112,17 @@ public void testSimpleRocket() throws SimulationException { undoAction = UndoRedoAction.newUndoAction(document); redoAction = UndoRedoAction.newRedoAction(document); - config = document.getSimulation(0).getConfiguration(); + FlightConfigurationId fcid = document.getSimulation(0).getFlightConfigurationId(); + config = document.getRocket().getFlightConfiguration(fcid); conditions = new FlightConditions(config); // Test undo state checkUndoState(null, null); + InnerTube mmt = (InnerTube)config.getRocket().getChild(0).getChild(1).getChild(2); + // Compute cg+cp + altitude + // double cgx, double mass, double cpx, double cna) checkCgCp(0.248, 0.0645, 0.320, 12.0); checkAlt(48.2); @@ -265,8 +268,8 @@ private static ThrustCurveMotor readMotor() { InputStream is = IntegrationTest.class.getResourceAsStream("Estes_A8.rse"); assertNotNull("Problem in unit test, cannot find Estes_A8.rse", is); try { - for (Motor m : loader.load(is, "Estes_A8.rse")) { - return (ThrustCurveMotor) m; + for (ThrustCurveMotor.Builder m : loader.load(is, "Estes_A8.rse")) { + return m.build(); } is.close(); } catch (IOException e) { @@ -327,13 +330,12 @@ private void checkUndoState(String undoDesc, String redoDesc) { } private void checkCgCp(double cgx, double mass, double cpx, double cna) { - Coordinate cg, cp; - - cg = massCalc.getCG(config, MassCalcType.LAUNCH_MASS); + final RigidBody launchData = MassCalculator.calculateLaunch(config); + final Coordinate cg = launchData.getCenterOfMass(); assertEquals(cgx, cg.x, 0.001); assertEquals(mass, cg.weight, 0.0005); - cp = aeroCalc.getWorstCP(config, conditions, null); + final Coordinate cp = aeroCalc.getWorstCP(config, conditions, null); assertEquals(cpx, cp.x, 0.001); assertEquals(cna, cp.weight, 0.1); } diff --git a/swing/test/net/sf/openrocket/gui/configdialog/FinSetConfigTest.java b/swing/test/net/sf/openrocket/gui/configdialog/FinSetConfigTest.java index 65edf71fe1..2a8394e7b4 100644 --- a/swing/test/net/sf/openrocket/gui/configdialog/FinSetConfigTest.java +++ b/swing/test/net/sf/openrocket/gui/configdialog/FinSetConfigTest.java @@ -4,16 +4,17 @@ import java.util.ArrayList; import java.util.List; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + import net.sf.openrocket.gui.adaptors.DoubleModel; import net.sf.openrocket.rocketcomponent.BodyTube; import net.sf.openrocket.rocketcomponent.CenteringRing; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.util.BaseTestCase.BaseTestCase; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - public class FinSetConfigTest extends BaseTestCase { static Method method; @@ -55,12 +56,12 @@ public void testCompute2LeadingRings() throws Exception { CenteringRing ring1 = new CenteringRing(); ring1.setLength(0.004); - ring1.setRelativePosition(RocketComponent.Position.TOP); - ring1.setPositionValue(0.43); + ring1.setAxialMethod(AxialMethod.TOP); + ring1.setAxialOffset(0.43); CenteringRing ring2 = new CenteringRing(); ring2.setLength(0.004); - ring2.setRelativePosition(RocketComponent.Position.TOP); - ring2.setPositionValue(0.45); + ring2.setAxialMethod(AxialMethod.TOP); + ring2.setAxialOffset(0.45); rings.add(ring1); rings.add(ring2); parent.addChild(ring1); @@ -81,8 +82,8 @@ public void testCompute1Ring() throws Exception { CenteringRing ring1 = new CenteringRing(); ring1.setLength(0.004); - ring1.setRelativePosition(RocketComponent.Position.TOP); - ring1.setPositionValue(0.43); + ring1.setAxialMethod(AxialMethod.TOP); + ring1.setAxialOffset(0.43); rings.add(ring1); RocketComponent parent = new BodyTube(); @@ -101,13 +102,13 @@ public void testComputeOneLeadingOneRingWithinRoot() throws Exception { List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); - ring1.setRelativePosition(RocketComponent.Position.TOP); + ring1.setAxialMethod(AxialMethod.TOP); ring1.setLength(0.004); - ring1.setPositionValue(0.43); + ring1.setAxialOffset(0.43); CenteringRing ring2 = new CenteringRing(); - ring2.setRelativePosition(RocketComponent.Position.TOP); + ring2.setAxialMethod(AxialMethod.TOP); ring2.setLength(0.004); - ring2.setPositionValue(0.45); + ring2.setAxialOffset(0.45); rings.add(ring1); rings.add(ring2); @@ -128,13 +129,13 @@ public void testComputeOneLeadingOneTrailingRing() throws Exception { List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); - ring1.setRelativePosition(RocketComponent.Position.TOP); + ring1.setAxialMethod(AxialMethod.TOP); ring1.setLength(0.004); - ring1.setPositionValue(0.43); + ring1.setAxialOffset(0.43); CenteringRing ring2 = new CenteringRing(); - ring2.setRelativePosition(RocketComponent.Position.TOP); + ring2.setAxialMethod(AxialMethod.TOP); ring2.setLength(0.004); - ring2.setPositionValue(0.48); + ring2.setAxialOffset(0.48); rings.add(ring1); rings.add(ring2); @@ -153,13 +154,13 @@ public void testComputeOneWithinRootOneTrailingRing() throws Exception { List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); - ring1.setRelativePosition(RocketComponent.Position.TOP); + ring1.setAxialMethod(AxialMethod.TOP); ring1.setLength(0.004); - ring1.setPositionValue(0.4701); + ring1.setAxialOffset(0.4701); CenteringRing ring2 = new CenteringRing(); ring2.setLength(0.004); - ring2.setRelativePosition(RocketComponent.Position.TOP); - ring2.setPositionValue(0.48); + ring2.setAxialMethod(AxialMethod.TOP); + ring2.setAxialOffset(0.48); rings.add(ring1); rings.add(ring2); RocketComponent parent = new BodyTube(1.0d, 0.1d); @@ -179,14 +180,14 @@ public void testBothRingsWithinRootChord() throws Exception { RocketComponent parent = new BodyTube(1.0000d, 0.1d); CenteringRing ring1 = new CenteringRing(); - ring1.setRelativePosition(RocketComponent.Position.TOP); + ring1.setAxialMethod(AxialMethod.TOP); ring1.setLength(0.004); - ring1.setPositionValue(0.4701); + ring1.setAxialOffset(0.4701); parent.addChild(ring1); CenteringRing ring2 = new CenteringRing(); ring2.setLength(0.004); - ring2.setRelativePosition(RocketComponent.Position.TOP); - ring2.setPositionValue(0.4750); + ring2.setAxialMethod(AxialMethod.TOP); + ring2.setAxialOffset(0.4750); parent.addChild(ring2); rings.add(ring1); rings.add(ring2); @@ -205,13 +206,13 @@ public void testBothRingsBeyondRootChord() throws Exception { List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); - ring1.setRelativePosition(RocketComponent.Position.TOP); + ring1.setAxialMethod(AxialMethod.TOP); ring1.setLength(0.004); - ring1.setPositionValue(0.48); + ring1.setAxialOffset(0.48); CenteringRing ring2 = new CenteringRing(); - ring2.setRelativePosition(RocketComponent.Position.TOP); + ring2.setAxialMethod(AxialMethod.TOP); ring2.setLength(0.004); - ring2.setPositionValue(0.49); + ring2.setAxialOffset(0.49); rings.add(ring1); rings.add(ring2); RocketComponent parent = new BodyTube(1.0d, 0.1d); @@ -231,22 +232,22 @@ public void test3RingsWithinRootChord() throws Exception { List<CenteringRing> rings = new ArrayList<CenteringRing>(); CenteringRing ring1 = new CenteringRing(); - ring1.setRelativePosition(RocketComponent.Position.ABSOLUTE); + ring1.setAxialMethod(AxialMethod.ABSOLUTE); ring1.setLength(0.004); - ring1.setPositionValue(0.47); + ring1.setAxialOffset(0.47); CenteringRing ring2 = new CenteringRing(); - ring2.setRelativePosition(RocketComponent.Position.ABSOLUTE); + ring2.setAxialMethod(AxialMethod.ABSOLUTE); ring2.setLength(0.004); - ring2.setPositionValue(0.4702); + ring2.setAxialOffset(0.4702); CenteringRing ring3 = new CenteringRing(); - ring3.setRelativePosition(RocketComponent.Position.ABSOLUTE); + ring3.setAxialMethod(AxialMethod.ABSOLUTE); ring3.setLength(0.004); - ring3.setPositionValue(0.4770); + ring3.setAxialOffset(0.4770); rings.add(ring1); rings.add(ring2); rings.add(ring3); BodyTube parent = new BodyTube(1.0d, 0.1d); - parent.setPositionValue(0); + parent.setAxialOffset(0); parent.addChild(ring1); parent.addChild(ring2); parent.addChild(ring3);