bug fixes
authorplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 6 Mar 2010 09:02:36 +0000 (09:02 +0000)
committerplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 6 Mar 2010 09:02:36 +0000 (09:02 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@40 180e2498-e6e9-4542-8430-84ac67f01cd8

14 files changed:
ChangeLog
TODO
doc/simulation-2.0.uml [new file with mode: 0644]
doc/simulation-2.0.umlclass [new file with mode: 0644]
html/favicon.ico [new file with mode: 0644]
pix-src/icon/icon-web.ico [new file with mode: 0644]
src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java
src/net/sf/openrocket/gui/main/ExceptionHandler.java
src/net/sf/openrocket/gui/main/SimulationEditDialog.java
src/net/sf/openrocket/gui/main/SimulationPanel.java
src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java
src/net/sf/openrocket/simulation/FlightData.java
src/net/sf/openrocket/simulation/FlightDataBranch.java
test/net/sf/openrocket/rocketcomponent/ComponentCompareTest.java

index 3c5130611041cc71f1adf5a63522947292f8bc28..7d9193c34a8373216c657b693d67ff0a1523bf7b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-03-05  Sampo Niskanen
+
+       * [BUG] Fixed exception for fins with small root chord
+
+2010-02-26  Sampo Niskanen
+
+       * Simulation panel max.acceleration now from flight stage only
+
 2010-02-17  Sampo Niskanen
 
        * Released version 0.9.6
diff --git a/TODO b/TODO
index ec1e28876b5c54e261f19f83cfd9390a00cf19d8..b91d16abd860bfb07b9b221525ddd6b0e206bb43 100644 (file)
--- a/TODO
+++ b/TODO
@@ -7,7 +7,7 @@ Must-have:
 
 - Go through thrust curves and select best ones
 - Updated splash screen
-
+- BUG: Invalid fin points possible when removing points
 
 Maybe:
 
@@ -167,3 +167,5 @@ In 0.9.6:
   exponential growth until time step is reached (t1 = 1.5*t0)
 - Limit time step during while on launch rod
 - Re-investigate 15% reduction of three-fin CNa
+In 0.9.7:
+- BUG: Simulation table max. acceleration takes into account parachute deceleration
diff --git a/doc/simulation-2.0.uml b/doc/simulation-2.0.uml
new file mode 100644 (file)
index 0000000..64b5482
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Package xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:uml="http://www.eclipse.org/uml2/2.1.0/UML" xmi:id="_J062EPIyEd6814i1KDlzfw" name="net.sf.openrocket.simulation">
+  <elementImport xmi:id="_J8VFoPIyEd6814i1KDlzfw">
+    <importedElement xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+  </elementImport>
+  <elementImport xmi:id="_J8VFofIyEd6814i1KDlzfw">
+    <importedElement xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+  </elementImport>
+  <elementImport xmi:id="_J8VssPIyEd6814i1KDlzfw">
+    <importedElement xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#UnlimitedNatural"/>
+  </elementImport>
+  <elementImport xmi:id="_J8VssfIyEd6814i1KDlzfw">
+    <importedElement xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+  </elementImport>
+  <packagedElement xmi:type="uml:Class" xmi:id="_Tba2QPIyEd6814i1KDlzfw" name="BasicSimulationEngine" clientDependency="_-iWDsPIzEd6814i1KDlzfw">
+    <interfaceRealization xmi:id="_-iWDsPIzEd6814i1KDlzfw" supplier="_cpXMgPIyEd6814i1KDlzfw" client="_Tba2QPIyEd6814i1KDlzfw" contract="_cpXMgPIyEd6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Interface" xmi:id="_cpXMgPIyEd6814i1KDlzfw" name="SimulationEngine">
+    <ownedOperation xmi:id="_f7S3UPIyEd6814i1KDlzfw" name="simulate">
+      <ownedParameter xmi:id="_lcXTMPIyEd6814i1KDlzfw" direction="return"/>
+      <ownedParameter xmi:id="_lcX6QPIyEd6814i1KDlzfw" name="SimulationConditions"/>
+    </ownedOperation>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Interface" xmi:id="_E_lM4PI0Ed6814i1KDlzfw" name="SimulationCalculator">
+    <ownedOperation xmi:id="_Zi4R0PI0Ed6814i1KDlzfw" name="step">
+      <ownedParameter xmi:id="_ag6nYPI0Ed6814i1KDlzfw" direction="return"/>
+      <ownedParameter xmi:id="_ag6nYfI0Ed6814i1KDlzfw" name="SimulationStatus"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_4Xf1kPI0Ed6814i1KDlzfw" name="initialize">
+      <ownedParameter xmi:id="_5bYUcPI0Ed6814i1KDlzfw" direction="return"/>
+      <ownedParameter xmi:id="_5bY7gPI0Ed6814i1KDlzfw" name="SimulationStatus"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_5w4qYPI0Ed6814i1KDlzfw" name="store">
+      <ownedParameter xmi:id="_6n_4kPI0Ed6814i1KDlzfw" direction="return"/>
+      <ownedParameter xmi:id="_6oAfoPI0Ed6814i1KDlzfw" name="SimulationStatus"/>
+    </ownedOperation>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_GxqOgPI0Ed6814i1KDlzfw" name="CartesianCalculator" clientDependency="_SwleoPI0Ed6814i1KDlzfw">
+    <interfaceRealization xmi:id="_SwleoPI0Ed6814i1KDlzfw" supplier="_E_lM4PI0Ed6814i1KDlzfw" client="_GxqOgPI0Ed6814i1KDlzfw" contract="_E_lM4PI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_JF1QkPI0Ed6814i1KDlzfw" name="CartesianLaunchCalculator">
+    <generalization xmi:id="_PK6YcPI0Ed6814i1KDlzfw" general="_GxqOgPI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_LMYtYPI0Ed6814i1KDlzfw" name="CartesianFlightCalculator">
+    <generalization xmi:id="_PzSAAPI0Ed6814i1KDlzfw" general="_GxqOgPI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_MplrMPI0Ed6814i1KDlzfw" name="CartesianLandingCalculator">
+    <generalization xmi:id="_QQTTMPI0Ed6814i1KDlzfw" general="_GxqOgPI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_TpljMPI0Ed6814i1KDlzfw" name="SphericalCalculator" clientDependency="_Vi51QPI0Ed6814i1KDlzfw">
+    <interfaceRealization xmi:id="_Vi51QPI0Ed6814i1KDlzfw" supplier="_E_lM4PI0Ed6814i1KDlzfw" client="_TpljMPI0Ed6814i1KDlzfw" contract="_E_lM4PI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_dO-wIPI0Ed6814i1KDlzfw" name="AbstractSimulationStatus (?)" clientDependency="_WkCPYPJmEd6814i1KDlzfw" isAbstract="true">
+    <interfaceRealization xmi:id="_WkCPYPJmEd6814i1KDlzfw" supplier="_CNJOwPJmEd6814i1KDlzfw" client="_dO-wIPI0Ed6814i1KDlzfw" contract="_CNJOwPJmEd6814i1KDlzfw"/>
+    <ownedOperation xmi:id="_fWLGIPI0Ed6814i1KDlzfw" name="getPosition">
+      <ownedParameter xmi:id="_hKvbEPI0Ed6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_hhJI4PI0Ed6814i1KDlzfw" name="getAltitude">
+      <ownedParameter xmi:id="_iJ4j4PI0Ed6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_inlMgPI0Ed6814i1KDlzfw" name="getOrientation">
+      <ownedParameter xmi:id="_jSE7API0Ed6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_1aRPcPI0Ed6814i1KDlzfw" name="getConfiguration">
+      <ownedParameter xmi:id="_2T4YAPI0Ed6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_oIIrAPI0Ed6814i1KDlzfw" name="CartesianSimulationStatus">
+    <generalization xmi:id="_qQ68cPI0Ed6814i1KDlzfw" general="_dO-wIPI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_GqNGMPI1Ed6814i1KDlzfw" name="SphericalSimulationStatus">
+    <generalization xmi:id="_JAnj8PI1Ed6814i1KDlzfw" general="_dO-wIPI0Ed6814i1KDlzfw"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Interface" xmi:id="_CNJOwPJmEd6814i1KDlzfw" name="SimulationStatus">
+    <ownedOperation xmi:id="_EEdVsPJmEd6814i1KDlzfw" name="getAltitude">
+      <ownedParameter xmi:id="_FBjQEPJmEd6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_FUn9EPJmEd6814i1KDlzfw" name="getPosition">
+      <ownedParameter xmi:id="_F9Z0UPJmEd6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_GxzFsPJmEd6814i1KDlzfw" name="getVelocity">
+      <ownedParameter xmi:id="_HuFu0PJmEd6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_IGCUwPJmEd6814i1KDlzfw" name="getSpeed">
+      <ownedParameter xmi:id="_IfWzsPJmEd6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_JT0WgPJmEd6814i1KDlzfw" name="getConfiguration">
+      <ownedParameter xmi:id="_J4oTwPJmEd6814i1KDlzfw" direction="return"/>
+    </ownedOperation>
+  </packagedElement>
+</uml:Package>
diff --git a/doc/simulation-2.0.umlclass b/doc/simulation-2.0.umlclass
new file mode 100644 (file)
index 0000000..eab546d
--- /dev/null
@@ -0,0 +1,479 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.1/notation" xmlns:uml="http://www.eclipse.org/uml2/2.1.0/UML" xmi:id="_J8WTwPIyEd6814i1KDlzfw" type="UMLClass" name="simulation-2.0.umlclass" measurementUnit="Pixel">
+  <children xmi:type="notation:Node" xmi:id="_PJd44PIyEd6814i1KDlzfw" type="2014">
+    <children xmi:type="notation:Node" xmi:id="_PJfHAPIyEd6814i1KDlzfw" type="5020"/>
+    <children xmi:type="notation:Node" xmi:id="_PJfHAfIyEd6814i1KDlzfw" type="7032">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_PJfHAvIyEd6814i1KDlzfw" collapsed="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_PJfHA_IyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_PJfuEPIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_PJfuEfIyEd6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_PJd44fIyEd6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Package" href="simulation-2.0.uml#_J062EPIyEd6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_PJef8PIyEd6814i1KDlzfw"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Tns-wPIyEd6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_Tnx3QPIyEd6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_TrWvsPIyEd6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_TnzFYPIyEd6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_Tn2vwPIyEd6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Tn2vwfIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Tn2vwvIyEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Tn2vw_IyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Tn2vxPIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Tn2vxfIyEd6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_ToC9APIyEd6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_ToC9AfIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_ToC9AvIyEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_ToC9A_IyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_ToC9BPIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_ToC9BfIyEd6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_ToFZQPIyEd6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_ToFZQfIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_ToFZQvIyEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_ToFZQ_IyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_ToFZRPIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_ToFZRfIyEd6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Tns-wfIyEd6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_Tns-wvIyEd6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_Tba2QPIyEd6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Tns-w_IyEd6814i1KDlzfw" x="24" y="264"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_cqKdwPIyEd6814i1KDlzfw" type="2013">
+    <children xmi:type="notation:Node" xmi:id="_cqM6APIyEd6814i1KDlzfw" type="5018"/>
+    <children xmi:type="notation:Node" xmi:id="_cqTAoPIyEd6814i1KDlzfw" type="7029">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_cqTAofIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_cqTAovIyEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_cqTAo_IyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_cqTnsPIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_cqTnsfIyEd6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_cqWrAPIyEd6814i1KDlzfw" type="7030">
+      <children xmi:type="notation:Node" xmi:id="_f8HWsPIyEd6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_f7S3UPIyEd6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_f8HWsfIyEd6814i1KDlzfw"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_cqWrAfIyEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_cqXSEPIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_cqXSEfIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_cqXSEvIyEd6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_cqgcAPIyEd6814i1KDlzfw" type="7031">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_cqgcAfIyEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_cqgcAvIyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_cqgcA_IyEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_cqgcBPIyEd6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_cqKdwfIyEd6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Interface" href="simulation-2.0.uml#_cpXMgPIyEd6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cqKdwvIyEd6814i1KDlzfw" x="12" y="96"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_FAHYYPI0Ed6814i1KDlzfw" type="2013">
+    <children xmi:type="notation:Node" xmi:id="_FAJNkPI0Ed6814i1KDlzfw" type="5018"/>
+    <children xmi:type="notation:Node" xmi:id="_FALCwPI0Ed6814i1KDlzfw" type="7029">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_FALCwfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_FALCwvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_FALCw_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_FALCxPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_FALCxfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_FAMQ4PI0Ed6814i1KDlzfw" type="7030">
+      <children xmi:type="notation:Node" xmi:id="_ZjnRoPI0Ed6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_Zi4R0PI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_ZjnRofI0Ed6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_4X6sUPI0Ed6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_4Xf1kPI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_4X6sUfI0Ed6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_5xThIPI0Ed6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_5w4qYPI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_5xThIfI0Ed6814i1KDlzfw"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_FAMQ4fI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_FAMQ4vI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_FAMQ4_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_FAMQ5PI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_FANfAPI0Ed6814i1KDlzfw" type="7031">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_FANfAfI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_FANfAvI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_FANfA_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_FANfBPI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_FAHYYfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Interface" href="simulation-2.0.uml#_E_lM4PI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_FAHYYvI0Ed6814i1KDlzfw" x="420" y="103"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_GyzeAPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_Gy0sIPI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_GzGY8PI0Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Gy1TMPI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_Gy16QPI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Gy16QfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Gy16QvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Gy16Q_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Gy16RPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gy16RfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Gy2hUPI0Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Gy2hUfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Gy2hUvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Gy2hU_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Gy2hVPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gy2hVfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Gy3vcPI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Gy3vcfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Gy3vcvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Gy3vc_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Gy3vdPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gy3vdfI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_GyzeAfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_GyzeAvI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_GxqOgPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_GyzeA_I0Ed6814i1KDlzfw" x="367" y="344"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_JGxEsPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_JGyS0PI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_JHBjYPI0Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_JGy54PI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_JGy54fI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_JGy54vI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_JGy54_I0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_JGy55PI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_JGy55fI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_JGy55vI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_JG0IAPI0Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_JG0IAfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_JG0IAvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_JG0IA_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_JG0IBPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_JG0IBfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_JG0vEPI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_JG0vEfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_JG0vEvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_JG0vE_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_JG0vFPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_JG0vFfI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_JGxEsfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_JGxEsvI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_JF1QkPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_JGxEs_I0Ed6814i1KDlzfw" x="201" y="498"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_LNeSgPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_LNfgoPI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_LNm1YPI0Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_LNfgofI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_LNgHsPI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_LNgHsfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_LNgHsvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_LNgHs_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_LNgHtPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_LNgHtfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_LNguwPI0Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_LNguwfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_LNguwvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_LNguw_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_LNguxPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_LNguxfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_LNhV0PI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_LNhV0fI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_LNh84PI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_LNh84fI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_LNh84vI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_LNh84_I0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_LNeSgfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_LNeSgvI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_LMYtYPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LNeSg_I0Ed6814i1KDlzfw" x="359" y="597"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Mqo0EPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_MqqCMPI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_Mqx-API0Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_MqqpQPI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_MqqpQfI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MqqpQvI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_MqqpQ_I0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_MqqpRPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_MqqpRfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_MqqpRvI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_MqrQUPI0Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MqrQUfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_MqrQUvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_MqrQU_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Mqr3YPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Mqr3YfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_MqsecPI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_MqsecfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_MqsecvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Mqsec_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_MqsedPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_MqsedfI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Mqo0EfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_Mqo0EvI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_MplrMPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mqo0E_I0Ed6814i1KDlzfw" x="511" y="486"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_TqEEUPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_TqF5gPI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_TqNOQPI0Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_TqF5gfI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_TqGgkPI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_TqGgkfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_TqGgkvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_TqGgk_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_TqGglPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_TqGglfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_TqHHoPI0Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_TqHHofI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_TqHHovI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_TqHHo_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_TqHHpPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_TqHHpfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_TqHusPI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_TqIVwPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_TqIVwfI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_TqIVwvI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_TqIVw_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_TqIVxPI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_TqErYPI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_TqErYfI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_TpljMPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TqErYvI0Ed6814i1KDlzfw" x="600" y="348" height="37"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_dPmbMPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_dPnpUPI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_dPvlIPI0Ed6814i1KDlzfw" bold="true" italic="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_dPoQYPI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_dPoQYfI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_dPoQYvI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_dPoQY_I0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_dPoQZPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_dPoQZfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_dPoQZvI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_dPo3cPI0Ed6814i1KDlzfw" type="7002">
+      <children xmi:type="notation:Node" xmi:id="_fW2bkPI0Ed6814i1KDlzfw" type="3002">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_fWLGIPI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_fW2bkfI0Ed6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_hh9BMPI0Ed6814i1KDlzfw" type="3002">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_hhJI4PI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_hh9BMfI0Ed6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_ioBRYPI0Ed6814i1KDlzfw" type="3002">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_inlMgPI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_ioBRYfI0Ed6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_1asGMPI0Ed6814i1KDlzfw" type="3002">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_1aRPcPI0Ed6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_1asGMfI0Ed6814i1KDlzfw"/>
+      </children>
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_dPo3cfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_dPo3cvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_dPpegPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_dPpegfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_dPpegvI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_dPqFkPI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_dPqFkfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_dPqFkvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_dPqFk_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_dPqFlPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_dPqFlfI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_dPmbMfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_dPmbMvI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_dO-wIPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dPmbM_I0Ed6814i1KDlzfw" x="900" y="324"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_oI5gAPI0Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_oI6uIPI0Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_oJCp8PI0Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_oI7VMPI0Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_oI78QPI0Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_oI78QfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_oI78QvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_oI78Q_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_oI78RPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_oI78RfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_oI8jUPI0Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_oI8jUfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_oI8jUvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_oI8jU_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_oI8jVPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_oI8jVfI0Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_oI9KYPI0Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_oI9KYfI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_oI9KYvI0Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_oI9KY_I0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_oI9KZPI0Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_oI9KZfI0Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_oI5gAfI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_oI5gAvI0Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_oIIrAPI0Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oI5gA_I0Ed6814i1KDlzfw" x="840" y="504"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_Gq8GAPI1Ed6814i1KDlzfw" type="2001">
+    <children xmi:type="notation:Node" xmi:id="_Gq9UIPI1Ed6814i1KDlzfw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_GrF3API1Ed6814i1KDlzfw" bold="true"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Gq97MPI1Ed6814i1KDlzfw" type="5019"/>
+    <children xmi:type="notation:Node" xmi:id="_Gq97MfI1Ed6814i1KDlzfw" type="7001">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Gq97MvI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Gq97M_I1Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Gq97NPI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Gq97NfI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gq97NvI1Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Gq-iQPI1Ed6814i1KDlzfw" type="7002">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Gq-iQfI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Gq-iQvI1Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Gq_JUPI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Gq_JUfI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gq_JUvI1Ed6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_Gq_wYPI1Ed6814i1KDlzfw" type="7003">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_Gq_wYfI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_Gq_wYvI1Ed6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_Gq_wY_I1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_Gq_wZPI1Ed6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gq_wZfI1Ed6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_Gq8GAfI1Ed6814i1KDlzfw" fontName="Sans"/>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_Gq8GAvI1Ed6814i1KDlzfw"/>
+    <element xmi:type="uml:Class" href="simulation-2.0.uml#_GqNGMPI1Ed6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Gq8GA_I1Ed6814i1KDlzfw" x="1068" y="504"/>
+  </children>
+  <children xmi:type="notation:Node" xmi:id="_CNqMIPJmEd6814i1KDlzfw" type="2013">
+    <children xmi:type="notation:Node" xmi:id="_CNqzMPJmEd6814i1KDlzfw" type="5018"/>
+    <children xmi:type="notation:Node" xmi:id="_CNraQPJmEd6814i1KDlzfw" type="7029">
+      <styles xmi:type="notation:DrawerStyle" xmi:id="_CNraQfJmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_CNraQvJmEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_CNraQ_JmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_CNraRPJmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_CNraRfJmEd6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_CNsoYPJmEd6814i1KDlzfw" type="7030">
+      <children xmi:type="notation:Node" xmi:id="_EE720PJmEd6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_EEdVsPJmEd6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_EE720fJmEd6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_FVAXkPJmEd6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_FUn9EPJmEd6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_FVAXkfJmEd6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_GyMHQPJmEd6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_GxzFsPJmEd6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_GyMHQfJmEd6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_IGb9YPJmEd6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_IGCUwPJmEd6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_IGb9YfJmEd6814i1KDlzfw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_JUPNQPJmEd6814i1KDlzfw" type="3029">
+        <element xmi:type="uml:Operation" href="simulation-2.0.uml#_JT0WgPJmEd6814i1KDlzfw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_JUPNQfJmEd6814i1KDlzfw"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_CNsoYfJmEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_CNsoYvJmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_CNsoY_JmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_CNsoZPJmEd6814i1KDlzfw"/>
+    </children>
+    <children xmi:type="notation:Node" xmi:id="_CNtPcPJmEd6814i1KDlzfw" type="7031">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_CNtPcfJmEd6814i1KDlzfw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_CNtPcvJmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_CNtPc_JmEd6814i1KDlzfw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_CNtPdPJmEd6814i1KDlzfw"/>
+    </children>
+    <styles xmi:type="notation:ShapeStyle" xmi:id="_CNqMIfJmEd6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Interface" href="simulation-2.0.uml#_CNJOwPJmEd6814i1KDlzfw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CNqMIvJmEd6814i1KDlzfw" x="936" y="60"/>
+  </children>
+  <styles xmi:type="notation:DiagramStyle" xmi:id="_J8WTwfIyEd6814i1KDlzfw"/>
+  <styles xmi:type="notation:FilteringStyle" xmi:id="_J8WTwvIyEd6814i1KDlzfw"/>
+  <element xmi:type="uml:Package" href="simulation-2.0.uml#_J062EPIyEd6814i1KDlzfw"/>
+  <edges xmi:type="notation:Edge" xmi:id="_-ifNoPIzEd6814i1KDlzfw" type="4008" source="_Tns-wPIyEd6814i1KDlzfw" target="_cqKdwPIyEd6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_-ifNofIzEd6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_-ifNovIzEd6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:InterfaceRealization" href="simulation-2.0.uml#_-iWDsPIzEd6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-ifNo_IzEd6814i1KDlzfw" points="[5, -45, -11, 193]$[42, -185, 26, 53]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_PK-p4PI0Ed6814i1KDlzfw" type="4001" source="_JGxEsPI0Ed6814i1KDlzfw" target="_GyzeAPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_PK-p4fI0Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_PK-p4vI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Generalization" href="simulation-2.0.uml#_PK6YcPI0Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_PK-p4_I0Ed6814i1KDlzfw" points="[43, -45, -98, 109]$[227, -155, 86, -1]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_PzUcQPI0Ed6814i1KDlzfw" type="4001" source="_LNeSgPI0Ed6814i1KDlzfw" target="_GyzeAPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_PzUcQfI0Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_PzUcQvI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Generalization" href="simulation-2.0.uml#_PzSAAPI0Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_PzUcQ_I0Ed6814i1KDlzfw" points="[-1, -45, 11, 208]$[74, -250, 86, 3]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_QQVIYPI0Ed6814i1KDlzfw" type="4001" source="_Mqo0EPI0Ed6814i1KDlzfw" target="_GyzeAPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_QQVIYfI0Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_QQVIYvI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Generalization" href="simulation-2.0.uml#_QQTTMPI0Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QQVIY_I0Ed6814i1KDlzfw" points="[-55, -45, 117, 97]$[-94, -96, 78, 46]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_Sw0IIPI0Ed6814i1KDlzfw" type="4008" source="_GyzeAPI0Ed6814i1KDlzfw" target="_FAHYYPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_Sw0IIfI0Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Sw0IIvI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:InterfaceRealization" href="simulation-2.0.uml#_SwleoPI0Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Sw0II_I0Ed6814i1KDlzfw" points="[9, -45, -37, 196]$[70, -286, 24, -45]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VjKT8PI0Ed6814i1KDlzfw" type="4008" source="_TqEEUPI0Ed6814i1KDlzfw" target="_FAHYYPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_VjKT8fI0Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_VjKT8vI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:InterfaceRealization" href="simulation-2.0.uml#_Vi51QPI0Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VjKT8_I0Ed6814i1KDlzfw" points="[-54, -45, 191, 161]$[-210, -184, 35, 22]"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VjhgUPI0Ed6814i1KDlzfw" id="(0.7358491,0.7582418)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_qQ-m0PI0Ed6814i1KDlzfw" type="4001" source="_oI5gAPI0Ed6814i1KDlzfw" target="_dPmbMPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_qQ-m0fI0Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_qQ-m0vI0Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Generalization" href="simulation-2.0.uml#_qQ68cPI0Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_qQ-m0_I0Ed6814i1KDlzfw" points="[-15, -45, 39, 153]$[-127, -249, -73, -51]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_JArOUPI1Ed6814i1KDlzfw" type="4001" source="_Gq8GAPI1Ed6814i1KDlzfw" target="_dPmbMPI0Ed6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_JArOUfI1Ed6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_JArOUvI1Ed6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:Generalization" href="simulation-2.0.uml#_JAnj8PI1Ed6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_JArOU_I1Ed6814i1KDlzfw" points="[-67, -45, 173, 129]$[-313, -171, -73, 3]"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_WkRf8PJmEd6814i1KDlzfw" type="4008" source="_dPmbMPI0Ed6814i1KDlzfw" target="_CNqMIPJmEd6814i1KDlzfw">
+    <styles xmi:type="notation:ConnectorStyle" xmi:id="_WkRf8fJmEd6814i1KDlzfw"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_WkRf8vJmEd6814i1KDlzfw" fontName="Sans"/>
+    <element xmi:type="uml:InterfaceRealization" href="simulation-2.0.uml#_WkCPYPJmEd6814i1KDlzfw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WkRf8_JmEd6814i1KDlzfw" points="[-15, -75, 42, 229]$[-58, -221, -1, 83]"/>
+  </edges>
+</notation:Diagram>
diff --git a/html/favicon.ico b/html/favicon.ico
new file mode 100644 (file)
index 0000000..09c23f8
Binary files /dev/null and b/html/favicon.ico differ
diff --git a/pix-src/icon/icon-web.ico b/pix-src/icon/icon-web.ico
new file mode 100644 (file)
index 0000000..09c23f8
Binary files /dev/null and b/pix-src/icon/icon-web.ico differ
index 11b8a52e4b2790aed024e263f3ce648238ca80a0..9e8c91b1b89828a73c8de55a9a1ae15cad917afc 100644 (file)
@@ -763,21 +763,32 @@ public class FinSetCalc extends RocketComponentCalc {
                        double lead = component.toRelative(Coordinate.NUL, parent)[0].x;
                        double trail = component.toRelative(new Coordinate(component.getLength()), 
                                        parent)[0].x;
+                       
+                       /*
+                        * The counting fails if the fin root chord is very small, in that case assume
+                        * no other fin interference than this fin set.
+                        */
+                       if (trail-lead < 0.007) {
+                               interferenceFinCount = component.getFinCount();
+                       } else {
+                               interferenceFinCount = 0;
+                               for (RocketComponent c: parent.getChildren()) {
+                                       if (c instanceof FinSet) {
+                                               double finLead = c.toRelative(Coordinate.NUL, parent)[0].x;
+                                               double finTrail = c.toRelative(new Coordinate(c.getLength()), parent)[0].x;
 
-                       interferenceFinCount = 0;
-                       for (RocketComponent c: parent.getChildren()) {
-                               if (c instanceof FinSet) {
-                                       double finLead = c.toRelative(Coordinate.NUL, parent)[0].x;
-                                       double finTrail = c.toRelative(new Coordinate(c.getLength()), parent)[0].x;
-                                       if ((finLead < trail - 0.005) && (finTrail > lead + 0.005)) {
-                                               interferenceFinCount += ((FinSet)c).getFinCount();
+                                               // Compute overlap of the fins
+
+                                               if ((finLead < trail - 0.005) && (finTrail > lead + 0.005)) {
+                                                       interferenceFinCount += ((FinSet)c).getFinCount();
+                                               }
                                        }
                                }
                        }
-                       
                        if (interferenceFinCount < component.getFinCount()) {
                                throw new BugException("Counted " + interferenceFinCount + " parallel fins, " +
-                                               "when component itself has " + component.getFinCount());
+                                               "when component itself has " + component.getFinCount() + 
+                                               ", fin points=" + Arrays.toString(component.getFinPoints()));
                        }
                }
                return interferenceFinCount;
index 8496ad5be57f6400d37d986a2f4764e54a999412..702c3025cf5d866644f5a85dbf93d9e395f57bff 100644 (file)
@@ -149,12 +149,18 @@ public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
                        return;
                }
                
+               // Create the message
+               String msg = e.getClass().getSimpleName() + ": " + e.getMessage();
+               if (msg.length() > 90) {
+                       msg = msg.substring(0, 80) + "...";
+               }
+               
                // Unknown Error
                if (!(e instanceof Exception)) {
                        JOptionPane.showMessageDialog(null, 
                                        new Object[] { 
                                                "An unknown Java error occurred:",
-                                               e.getMessage(),
+                                               msg,
                                                "<html>You should immediately close unnecessary design windows,<br>" +
                                                "save any unsaved designs and restart OpenRocket!"
                                        }, "Unknown Java error", JOptionPane.ERROR_MESSAGE);
@@ -162,13 +168,7 @@ public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
                }
                
                
-               // Normal exception, show question dialog
-               String msg = e.getClass().getSimpleName() + ": " + e.getMessage();
-               if (msg.length() > 90) {
-                       msg = msg.substring(0, 80) + "...";
-               }
-               
-               
+               // Normal exception, show question dialog               
                int selection = JOptionPane.showOptionDialog(null, new Object[] {
                                "OpenRocket encountered an uncaught exception.  This typically signifies " +
                                "a bug in the software.", 
index 5f9e932f972f0d5197db6e8c84b7da2b7cbe8a6f..1cce5ce6b4b4295bb5dc2b9ea6b1c41437874668 100644 (file)
@@ -750,34 +750,7 @@ public class SimulationEditDialog extends JDialog {
                        return noDataPanel();
                }
                
-               
-               if (true)
-                       return new SimulationPlotPanel(simulation);
-               
-               JPanel panel = new JPanel(new MigLayout("fill"));
-               
-               
-               
-               
-               JButton button = new JButton("test");
-
-               button.addActionListener(new ActionListener() {
-                       @Override
-                       public void actionPerformed(ActionEvent e) {
-                               PlotConfiguration config = new PlotConfiguration();
-                               config.addPlotDataType(FlightDataBranch.TYPE_ALTITUDE);
-                               config.addPlotDataType(FlightDataBranch.TYPE_VELOCITY_Z);
-                               config.addPlotDataType(FlightDataBranch.TYPE_ACCELERATION_Z);
-                               config.addPlotDataType(FlightDataBranch.TYPE_ACCELERATION_TOTAL);
-                               
-                               config.setDomainAxisType(FlightDataBranch.TYPE_TIME);
-                               
-                               performPlot(config);
-                       }
-               });
-               panel.add(button);
-               
-               return panel;
+               return new SimulationPlotPanel(simulation);
        }
        
        
index e62c2aa6ce9878a060ffd784fb4008d6bc9b145a..e52f20baf335eaf124ea9167c5195a346434eb91 100644 (file)
@@ -323,6 +323,8 @@ public class SimulationPanel extends JPanel {
                                                if (data==null)
                                                        return null;
                                                
+                                               
+                                               // TODO: CRITICAL: Show getMaxAcceleration if branches not available!
                                                return UnitGroup.UNITS_ACCELERATION.getDefaultUnit().toStringUnit(
                                                                data.getMaxAcceleration());
                                        }
index 05862f3d4384e98593927d20f0d4ba4702411b6c..ab5bea0dfa4c4140e4af8641cc0f01fa0a59a51b 100644 (file)
@@ -1,7 +1,9 @@
 package net.sf.openrocket.rocketcomponent;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 
+import net.sf.openrocket.util.BugException;
 import net.sf.openrocket.util.Coordinate;
 
 
@@ -19,12 +21,8 @@ public class FreeformFinSet extends FinSet {
        }
        
 
-       public FreeformFinSet(Coordinate[] finpoints) {
-               points.clear();
-               for (Coordinate c: finpoints) {
-                       points.add(c);
-               }
-               this.length = points.get(points.size()-1).x - points.get(0).x;
+       public FreeformFinSet(Coordinate[] finpoints) throws IllegalFinPointException {
+               setPoints(finpoints);
        }
 
        /*
@@ -73,7 +71,13 @@ public class FreeformFinSet extends FinSet {
                        
                        // Create the freeform fin set
                        Coordinate[] finpoints = finset.getFinPoints();
-                       freeform = new FreeformFinSet(finpoints);
+                       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);
+                       }
 
                        // Copy component attributes
                        freeform.copyFrom(finset);
@@ -134,6 +138,7 @@ public class FreeformFinSet extends FinSet {
                if (index == 0  ||  index == points.size()-1) {
                        throw new IllegalFinPointException("cannot remove first or last point");
                }
+               // TODO: CRITICAL: Can result in invalid fin points
                points.remove(index);
                fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
        }
@@ -144,7 +149,7 @@ public class FreeformFinSet extends FinSet {
        }
        
        public void setPoints(Coordinate[] p) throws IllegalFinPointException {
-               if (p[0].x != 0 || p[0].y != 0 || p[p.length-1].y != 0) {
+               if (p[0].x != 0 || p[0].y != 0 || p[p.length-1].x < 0 || p[p.length-1].y != 0) {
                        throw new IllegalFinPointException("Start or end point illegal.");
                }
                for (int i=0; i < p.length-1; i++) {
index 8d0307c6b4cd5216ebd7cd0bdd9d20aae7b344b5..6a753447b42187bb1da02a99f9d88b60b2247cd8 100644 (file)
@@ -5,6 +5,7 @@ import java.util.List;
 
 import net.sf.openrocket.aerodynamics.WarningSet;
 import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.Pair;
 
 
 public class FlightData {
@@ -128,6 +129,9 @@ public class FlightData {
                return maxVelocity;
        }
        
+       /**
+        * NOTE:  This value will also contain any possible acceleration peak when opening a parachute!
+        */
        public double getMaxAcceleration() {
                return maxAcceleration;
        }
@@ -161,7 +165,6 @@ public class FlightData {
                FlightDataBranch branch = branches.get(0);
                maxAltitude = branch.getMaximum(FlightDataBranch.TYPE_ALTITUDE);
                maxVelocity = branch.getMaximum(FlightDataBranch.TYPE_VELOCITY_TOTAL);
-               maxAcceleration = branch.getMaximum(FlightDataBranch.TYPE_ACCELERATION_TOTAL);
                maxMachNumber = branch.getMaximum(FlightDataBranch.TYPE_MACH_NUMBER);
 
                flightTime = branch.getLast(FlightDataBranch.TYPE_TIME);
@@ -177,6 +180,7 @@ public class FlightData {
                
                if (time == null || altitude == null) {
                        timeToApogee = Double.NaN;
+                       maxAcceleration = Double.NaN;
                        return;
                }
                int index = 0;
@@ -192,6 +196,13 @@ public class FlightData {
                        timeToApogee = time.get(index);
                else
                        timeToApogee = Double.NaN;
+
+               // Max. acceleration (must be after apogee time)
+               if (branch.get(FlightDataBranch.TYPE_ACCELERATION_TOTAL) != null) {
+                       maxAcceleration = calculateMaxAcceleration();
+               } else {
+                       maxAcceleration = Double.NaN;
+               }
        }
 
 
@@ -203,4 +214,41 @@ public class FlightData {
        }
        
        
+
+       /**
+        * Find the maximum acceleration before apogee.
+        */
+       private double calculateMaxAcceleration() {
+               
+               // End check at first recovery device deployment
+               double endTime = Double.MAX_VALUE;
+               FlightDataBranch branch = this.getBranch(0);
+               for (Pair<Double, FlightEvent> event: branch.getEvents()) {
+                       if (event.getV().getType() == FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT) {
+                               if (event.getV().getTime() < endTime) {
+                                       endTime = event.getV().getTime();
+                               }
+                       }
+               }
+               
+               List<Double> time = branch.get(FlightDataBranch.TYPE_TIME);
+               List<Double> acceleration = branch.get(FlightDataBranch.TYPE_ACCELERATION_TOTAL);
+               
+               if (time == null || acceleration == null) {
+                       return Double.NaN;
+               }
+               
+               double max = 0;
+               
+               for (int i=0; i<time.size(); i++) {
+                       if (time.get(i) >= endTime) {
+                               break;
+                       }
+                       double a = acceleration.get(i);
+                       if (a > max)
+                               max = a;
+               }
+
+               return max;
+       }
 }
index c80c268f1cd9476d0e8e422dd5741da9dd1fbe77..54ef01ca444f312ae6bc4be88829284799eed148 100644 (file)
@@ -426,4 +426,8 @@ public class FlightDataBranch {
        public boolean isMutable() {
                return mutable;
        }
+       
+       
+
+       
 }
index d09e90ab6abadf5f699ec438dca8520dd0530842..de97c9778fa261c3cb9ca0eed986c1d778166367 100644 (file)
@@ -71,7 +71,7 @@ public class ComponentCompareTest {
        
        
        @Test
-       public void testComponentSimilarity() {
+       public void testComponentSimilarity() throws IllegalFinPointException {
                FinSet trap = new TrapezoidFinSet(
                                5,   // fins
                                5.0, // root