From 8320c04afa30e2aa0150adc870d02abeedb01066 Mon Sep 17 00:00:00 2001 From: plaa Date: Sun, 7 Aug 2011 16:54:36 +0000 Subject: [PATCH] major optimization updates git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@147 180e2498-e6e9-4542-8430-84ac67f01cd8 --- ChangeLog | 8 + l10n/messages.properties | 199 ++- .../aerodynamics/BarrowmanCalculator.java | 4 +- .../aerodynamics/FlightConditions.java | 9 +- .../aerodynamics/barrowman/FinSetCalc.java | 8 +- .../barrowman/SymmetricComponentCalc.java | 6 +- .../document/OpenRocketDocument.java | 33 +- .../sf/openrocket/document/Simulation.java | 47 +- .../file/openrocket/OpenRocketLoader.java | 14 +- .../file/openrocket/OpenRocketSaver.java | 4 +- .../openrocket/gui/adaptors/BooleanModel.java | 81 +- .../openrocket/gui/adaptors/DoubleModel.java | 2 +- .../gui/components/CsvOptionPanel.java | 126 ++ .../gui/components/DescriptionArea.java | 19 + .../gui/components/DoubleCellEditor.java | 42 + .../gui/components/SimulationExportPanel.java | 226 +-- .../gui/components/UnitCellEditor.java | 19 +- .../dialogs/MotorDatabaseLoadingDialog.java | 72 +- .../optimization/FunctionEvaluationData.java | 67 + .../GeneralOptimizationDialog.java | 1460 ++++++++++++++++- .../optimization/OptimizationPlotDialog.java | 356 ++++ .../optimization/OptimizationStepData.java | 52 + .../optimization/OptimizationWorker.java | 229 +++ .../optimization/SimulationModifierTree.java | 50 +- .../sf/openrocket/gui/main/BasicFrame.java | 45 +- .../gui/main/SimulationEditDialog.java | 10 +- .../gui/main/SimulationRunDialog.java | 26 +- .../optimization/OptimizationTestDialog.java | 218 --- .../gui/plot/PlotConfiguration.java | 4 +- ...tDialog.java => SimulationPlotDialog.java} | 13 +- .../gui/plot/SimulationPlotPanel.java | 13 +- .../sf/openrocket/gui/print/DesignReport.java | 2 +- .../SymmetricComponentShapes.java | 68 +- .../gui/scalefigure/AbstractScaleFigure.java | 63 +- .../gui/scalefigure/FinPointFigure.java | 202 +-- .../gui/scalefigure/RocketFigure.java | 291 ++-- .../gui/scalefigure/RocketPanel.java | 2 +- .../gui/scalefigure/ScaleFigure.java | 19 +- .../gui/scalefigure/ScaleScrollPane.java | 214 +-- .../models/wind/PinkNoiseWindModel.java | 29 +- .../optimization/general/Point.java | 2 +- .../MultidirectionalSearchOptimizer.java | 56 +- .../general/multidim/SearchPattern.java | 2 +- .../OptimizableParameter.java | 8 + .../RocketOptimizationFunction.java | 20 +- .../RocketOptimizationListener.java | 6 +- .../rocketoptimization/SimulationDomain.java | 8 +- .../SimulationModifier.java | 16 +- .../domains/IdentitySimulationDomain.java | 5 +- .../domains/StabilityDomain.java | 96 +- .../modifiers/AbstractSimulationModifier.java | 59 +- .../modifiers/GenericComponentModifier.java | 21 +- .../modifiers/GenericModifier.java | 7 +- .../GroundHitVelocityParameter.java | 55 + .../parameters/LandingDistanceParameter.java | 55 + .../MaximumAccelerationParameter.java | 56 + .../parameters/MaximumAltitudeParameter.java | 27 +- .../parameters/MaximumVelocityParameter.java | 56 + .../parameters/StabilityParameter.java | 111 ++ .../DefaultOptimizableParameterService.java | 11 + .../DefaultSimulationModifierService.java | 244 ++- .../rocketcomponent/Configuration.java | 2 +- .../sf/openrocket/rocketcomponent/FinSet.java | 6 +- .../rocketcomponent/MassComponent.java | 8 +- .../openrocket/rocketcomponent/Parachute.java | 4 +- .../openrocket/rocketcomponent/Streamer.java | 4 +- .../rocketcomponent/SymmetricComponent.java | 170 +- .../rocketcomponent/Transition.java | 16 +- .../BasicEventSimulationEngine.java | 9 +- .../simulation/RK4SimulationStepper.java | 10 +- .../simulation/SimulationConditions.java | 15 +- ...Conditions.java => SimulationOptions.java} | 75 +- .../exception/MotorIgnitionException.java | 19 + .../exception/SimulationLaunchException.java | 14 +- .../sf/openrocket/startup/Application.java | 4 - src/net/sf/openrocket/unit/CaliberUnit.java | 103 +- src/net/sf/openrocket/unit/UnitGroup.java | 123 +- src/net/sf/openrocket/unit/Value.java | 40 +- src/net/sf/openrocket/util/Chars.java | 10 +- src/net/sf/openrocket/util/Coordinate.java | 2 +- src/net/sf/openrocket/util/FileHelper.java | 7 +- src/net/sf/openrocket/util/GUIUtil.java | 27 + src/net/sf/openrocket/util/MathUtil.java | 24 + .../sf/openrocket/util/MutableCoordinate.java | 312 ---- src/net/sf/openrocket/util/Prefs.java | 4 +- src/net/sf/openrocket/util/Quaternion.java | 2 +- .../TestRocketOptimizationFunction.java | 24 +- .../modifiers/TestGenericModifier.java | 4 +- test/net/sf/openrocket/unit/ValueTest.java | 14 +- test/net/sf/openrocket/util/TextUtilTest.java | 334 ++-- web/html/techdoc.pdf | Bin 1422837 -> 1447384 bytes 91 files changed, 4784 insertions(+), 1875 deletions(-) create mode 100644 src/net/sf/openrocket/gui/components/CsvOptionPanel.java create mode 100644 src/net/sf/openrocket/gui/components/DoubleCellEditor.java create mode 100644 src/net/sf/openrocket/gui/dialogs/optimization/FunctionEvaluationData.java create mode 100644 src/net/sf/openrocket/gui/dialogs/optimization/OptimizationPlotDialog.java create mode 100644 src/net/sf/openrocket/gui/dialogs/optimization/OptimizationStepData.java create mode 100644 src/net/sf/openrocket/gui/dialogs/optimization/OptimizationWorker.java delete mode 100644 src/net/sf/openrocket/gui/optimization/OptimizationTestDialog.java rename src/net/sf/openrocket/gui/plot/{PlotDialog.java => SimulationPlotDialog.java} (97%) create mode 100644 src/net/sf/openrocket/optimization/rocketoptimization/parameters/GroundHitVelocityParameter.java create mode 100644 src/net/sf/openrocket/optimization/rocketoptimization/parameters/LandingDistanceParameter.java create mode 100644 src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAccelerationParameter.java create mode 100644 src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumVelocityParameter.java create mode 100644 src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java rename src/net/sf/openrocket/simulation/{GUISimulationConditions.java => SimulationOptions.java} (86%) create mode 100644 src/net/sf/openrocket/simulation/exception/MotorIgnitionException.java delete mode 100644 src/net/sf/openrocket/util/MutableCoordinate.java diff --git a/ChangeLog b/ChangeLog index 8baecf09..3b3ed8f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-08-07 Sampo Niskanen + + * Optimization implementation + +2011-07-29 Sampo Niskanen + + * [BUG] NaN in transition radius calculation + 2011-07-22 Sampo Niskanen * Released version 1.1.6. diff --git a/l10n/messages.properties b/l10n/messages.properties index 9cfea75d..8d71278d 100644 --- a/l10n/messages.properties +++ b/l10n/messages.properties @@ -79,6 +79,7 @@ error.writing.desc = An error occurred while writing to the file: ! Labels used in buttons of dialog windows +# TODO: Rename these to "btn.xxx" button.ok = OK button.cancel = Cancel button.close = Close @@ -415,6 +416,12 @@ SimExpPan.ExportingVar.desc3 = variables out of SimExpPan.Col.Variable = Variable SimExpPan.Col.Unit = Unit + +CsvOptionPanel.separator.space = SPACE +CsvOptionPanel.separator.tab = TAB + + + ! MotorPlot MotorPlot.title.Motorplot = Motor plot MotorPlot.but.Select = Select @@ -919,7 +926,7 @@ TCMotorSelPan.delayBox.None = None PlotDialog.title.Flightdataplot = Flight data plot PlotDialog.Chart.Simulatedflight = Simulated flight PlotDialog.CheckBox.Showdatapoints = Show data points -PlotDialog.lbl.Chart = Click+drag down+right to zoom in, up+left to zoom out +PlotDialog.lbl.Chart = Click and drag down+right to zoom in, up+left to zoom out ! "main" prefix is used for the main application dialog @@ -964,6 +971,8 @@ main.menu.analyze = Analyze main.menu.analyze.desc = Rocket analysis main.menu.analyze.componentAnalysis = Component analysis main.menu.analyze.componentAnalysis.desc = Analyze the rocket components separately +main.menu.analyze.optimization = Rocket optimization +main.menu.analyze.optimization.desc = General rocket design optimization main.menu.help = Help main.menu.help.desc = Information about OpenRocket @@ -1296,17 +1305,177 @@ EllipticalFinSet.Ellipticalfinset = Elliptical fin set ! Modifiers -optimization.modifier.nosecone.length = Nose cone length -optimization.modifier.nosecone.diameter = Nose cone diameter -optimization.modifier.nosecone.thickness = Nose cone thickness - -optimization.modifier.transition.length = Transition length -optimization.modifier.transition.forediameter = Transition fore diameter -optimization.modifier.transition.aftdiameter = Transition aft diameter -optimization.modifier.transition.thickness = Transition thickness - -optimization.modifier.bodytube.length = Body tube length -optimization.modifier.bodytube.outerDiameter = Body tube outer diameter -optimization.modifier.bodytube.innerDiameter = Body tube inner diameter -optimization.modifier.bodytube.thickness = Body tube thickness - +optimization.modifier.nosecone.length = Length +optimization.modifier.nosecone.length.desc = Optimize the nose cone length. +optimization.modifier.nosecone.diameter = Diameter +optimization.modifier.nosecone.diameter.desc = Optimize the nose cone base diameter. +optimization.modifier.nosecone.thickness = Thickness +optimization.modifier.nosecone.thickness.desc = Optimize the nose cone wall thickness. +optimization.modifier.nosecone.shapeparameter = Shape parameter +optimization.modifier.nosecone.shapeparameter.desc = Optimize the nose cone shape parameter. + +optimization.modifier.transition.length = Length +optimization.modifier.transition.length.desc = Optimize the transition length. +optimization.modifier.transition.forediameter = Fore diameter +optimization.modifier.transition.forediameter.desc = Optimize the transition fore diameter. +optimization.modifier.transition.aftdiameter = Aft diameter +optimization.modifier.transition.aftdiameter.desc = Optimize the transition aft diameter. +optimization.modifier.transition.thickness = Thickness +optimization.modifier.transition.thickness.desc = Optimize the transition wall thickness. +optimization.modifier.transition.shapeparameter = Shape parameter +optimization.modifier.transition.shapeparameter.desc = Optimize the transition shape parameter. + +optimization.modifier.bodytube.length = Length +optimization.modifier.bodytube.length.desc = Optimize the body tube length. +optimization.modifier.bodytube.outerDiameter = Outer diameter +optimization.modifier.bodytube.outerDiameter.desc = Optimize the body tube outer diameter while maintaining the wall thickness. +optimization.modifier.bodytube.thickness = Thickness +optimization.modifier.bodytube.thickness.desc = Optimize the body tube wall thickness. + +optimization.modifier.trapezoidfinset.rootChord = Root chord +optimization.modifier.trapezoidfinset.rootChord.desc = Optimize the root chord length of the fin set (length of fin at the rocket body). +optimization.modifier.trapezoidfinset.tipChord = Tip chord +optimization.modifier.trapezoidfinset.tipChord.desc = Optimize the tip chord length of the fin set (length of fin at outer edge). +optimization.modifier.trapezoidfinset.sweep = Sweep +optimization.modifier.trapezoidfinset.sweep.desc = Optimize the sweep of the fin set (distance that the leading edge sweeps backwards). +optimization.modifier.trapezoidfinset.height = Height +optimization.modifier.trapezoidfinset.height.desc = Optimize the height (semi-span) of the fin set. + +optimization.modifier.ellipticalfinset.length = Root chord +optimization.modifier.ellipticalfinset.length.desc = Optimize the root chord length of the fin set. +optimization.modifier.ellipticalfinset.height = Height +optimization.modifier.ellipticalfinset.height = Optimize the height (semi-span) of the fin set. + +optimization.modifier.finset.cant = Cant angle +optimization.modifier.finset.cant.desc = Optimize the cant angle of the fin set. +optimization.modifier.finset.position = Position +optimization.modifier.finset.position.desc = Optimize the fin set position along the rocket body. + +optimization.modifier.launchlug.length = Length +optimization.modifier.launchlug.length.desc = Optimize the launch lug length. +optimization.modifier.launchlug.outerDiameter = Outer diameter +optimization.modifier.launchlug.outerDiameter.desc = Optimize the outer diameter of the launch lug. +optimization.modifier.launchlug.thickness = Thickness +optimization.modifier.launchlug.thickness.desc = Optimize the launch lug thickness while keeping the outer diameter constant. +optimization.modifier.launchlug.position = Position +optimization.modifier.launchlug.position.desc = Optimize the launch lug position along the rocket body. + + +optimization.modifier.internalcomponent.position = Position +optimization.modifier.internalcomponent.position.desc = Optimize the position of the component relative to the parent component. + +optimization.modifier.masscomponent.mass = Mass +optimization.modifier.masscomponent.mass.desc = Optimize the mass of the mass component. + +optimization.modifier.parachute.diameter = Diameter +optimization.modifier.parachute.diameter.desc = Optimize the parachute canopy diameter. +optimization.modifier.parachute.coefficient = Drag coefficient +optimization.modifier.parachute.coefficient.desc = Optimize the drag coefficient of the parachute. Typical parachutes have a drag coefficient of about 0.8. + +optimization.modifier.streamer.length = Length +optimization.modifier.streamer.length.desc = Optimize the length of the streamer. +optimization.modifier.streamer.width = Width +optimization.modifier.streamer.width.desc = Optimize the width of the streamer. +optimization.modifier.streamer.aspectRatio = Aspect ratio +optimization.modifier.streamer.aspectRatio.desc = Optimize the aspect ratio of the streamer (length/width). You should NOT select streamer length or width at the same time with the aspect ratio. +optimization.modifier.streamer.coefficient = Drag coefficient +optimization.modifier.streamer.coefficient.desc = Optimize the drag coefficient of the streamer. + +optimization.modifier.recoverydevice.deployDelay = Deployment delay +optimization.modifier.recoverydevice.deployDelay.desc = Optimize the deployment delay of the recovery device. +optimization.modifier.recoverydevice.deployAltitude = Deployment altitude +optimization.modifier.recoverydevice.deployAltitude.desc = Optimize the deployment altitude of the recovery device. + +optimization.modifier.rocketcomponent.overrideMass = Override mass +optimization.modifier.rocketcomponent.overrideMass.desc = Optimize the overridden mass of the component. +optimization.modifier.rocketcomponent.overrideCG = Override CG +optimization.modifier.rocketcomponent.overrideCG.desc = Optimize the overridden center of gravity of the component. + +optimization.modifier.motormount.overhang = Motor overhang +optimization.modifier.motormount.overhang.desc = Optimize the motor overhang. +optimization.modifier.motormount.delay = Motor ignition delay +optimization.modifier.motormount.delay.desc = Optimize the motor ignition delay. + + + + +! General rocket design optimization dialog + +GeneralOptimizationDialog.title = Rocket optimization +GeneralOptimizationDialog.goal.maximize = Maximize value +GeneralOptimizationDialog.goal.minimize = Minimize value +GeneralOptimizationDialog.goal.seek = Seek value of +GeneralOptimizationDialog.btn.start = Start optimization +GeneralOptimizationDialog.btn.stop = Stop optimization +GeneralOptimizationDialog.lbl.paramsToOptimize = Parameters to optimize: +GeneralOptimizationDialog.btn.add = Add +GeneralOptimizationDialog.btn.add.ttip = Add the selected parameter to the optimization +GeneralOptimizationDialog.btn.remove = Remove +GeneralOptimizationDialog.btn.remove.ttip = Remove the selected parameter from the optimization +GeneralOptimizationDialog.btn.removeAll = Remove all +GeneralOptimizationDialog.btn.removeAll.ttip = Remove all parameters from the optimization +GeneralOptimizationDialog.lbl.availableParams = Available parameters: +GeneralOptimizationDialog.lbl.optimizationOpts = Optimization options +GeneralOptimizationDialog.lbl.optimizeSim = Optimize simulation: +GeneralOptimizationDialog.lbl.optimizeSim.ttip = Select which simulation to optimize +GeneralOptimizationDialog.lbl.optimizeValue = Optimized value: +GeneralOptimizationDialog.lbl.optimizeValue.ttip = Select what value is to be optimized +GeneralOptimizationDialog.lbl.optimizeGoal = Optimization goal: +GeneralOptimizationDialog.lbl.optimizeGoal.ttip = Select the goal of the optimization +GeneralOptimizationDialog.lbl.optimizeGoalValue.ttip = Custom value to seek +GeneralOptimizationDialog.lbl.requireStability = Required stability +GeneralOptimizationDialog.lbl.requireMinStability = Minimum stability: +GeneralOptimizationDialog.lbl.requireMinStability.ttip = Require a minimum static stability margin for the design +GeneralOptimizationDialog.lbl.requireMaxStability = Maximum stability: +GeneralOptimizationDialog.lbl.requireMaxStability.ttip = Require a maximum static stability margin for the design +GeneralOptimizationDialog.status.bestValue = Best value: +GeneralOptimizationDialog.status.bestValue.ttip = Best optimization value found so far. +GeneralOptimizationDialog.status.stepCount = Step count: +GeneralOptimizationDialog.status.stepCount.ttip = Number of optimization steps that have been performed. +GeneralOptimizationDialog.status.evalCount = Evaluations: +GeneralOptimizationDialog.status.evalCount.ttip = Total number of function evaluations (simulations) that have been performed. +GeneralOptimizationDialog.status.stepSize = Step size: +GeneralOptimizationDialog.status.stepSize.ttip = Current optimization step size (relative to the optimization parameter ranges) +GeneralOptimizationDialog.btn.plotPath = Plot path +GeneralOptimizationDialog.btn.plotPath.ttip = Plot the optimization path (one and two dimensional optimization only) +GeneralOptimizationDialog.btn.save = Save path +GeneralOptimizationDialog.btn.save.ttip = Save the results of the function evaluations (simulations) as a CSV file. +GeneralOptimizationDialog.btn.apply = Apply optimization +GeneralOptimizationDialog.btn.apply.ttip = Apply the optimization results to the rocket design +GeneralOptimizationDialog.btn.reset = Reset +GeneralOptimizationDialog.btn.reset.ttip = Reset the rocket design to the current rocket design +GeneralOptimizationDialog.btn.close = Close +GeneralOptimizationDialog.btn.close.ttip = Close the dialog without modifying the rocket design +GeneralOptimizationDialog.error.selectParams.text = First select some parameters to optimize from the available parameters. +GeneralOptimizationDialog.error.selectParams.title = Select optimization parameters +GeneralOptimizationDialog.error.optimizationFailure.text = The optimization failed to run: +GeneralOptimizationDialog.error.optimizationFailure.title = Optimization failed +GeneralOptimizationDialog.undoText = Apply optimization +GeneralOptimizationDialog.basicSimulationName = Basic simulation +GeneralOptimizationDialog.noSimulationName = No simulation +GeneralOptimizationDialog.table.col.parameter = Parameter +GeneralOptimizationDialog.table.col.current = Current +GeneralOptimizationDialog.table.col.min = Minimum +GeneralOptimizationDialog.table.col.max = Maximum +GeneralOptimizationDialog.export.header = Include header line +GeneralOptimizationDialog.export.header.ttip = Include a header line as the first line containing the field descriptions. +GeneralOptimizationDialog.export.stability = Stability + + +! Dialog for plotting optimization results +OptimizationPlotDialog.title = Optimization results +OptimizationPlotDialog.lbl.zoomInstructions = Click and drag down+right to zoom in, up+left to zoom out +OptimizationPlotDialog.plot1d.title = Optimization result +OptimizationPlotDialog.plot1d.series = Optimization result +OptimizationPlotDialog.plot2d.title = Optimization path +OptimizationPlotDialog.plot2d.path = Optimization path +OptimizationPlotDialog.plot2d.evals = Evaluations +OptimizationPlotDialog.plot.ttip.stability = Stability: + +! Optimization parameters +MaximumAltitudeParameter.name = Apogee altitude +MaximumVelocityParameter.name = Maximum velocity +MaximumAccelerationParameter.name = Maximum acceleration +StabilityParameter.name = Stability +GroundHitVelocityParameter.name = Ground hit speed +LandingDistanceParameter.name = Landing distance diff --git a/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index 4b243389..ecafae1e 100644 --- a/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -12,10 +12,10 @@ 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.ExternalComponent; +import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; -import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.PolyInterpolator; @@ -268,7 +268,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator { // System.out.printf("constant Cf=%f ",Cf); } else if (Re < 5.39e5) { // Fully laminar - Cf = 1.328 / Math.sqrt(Re); + Cf = 1.328 / MathUtil.safeSqrt(Re); // System.out.printf("basic Cf=%f ",Cf); } else { // Transitional diff --git a/src/net/sf/openrocket/aerodynamics/FlightConditions.java b/src/net/sf/openrocket/aerodynamics/FlightConditions.java index 64e81455..45b9d20f 100644 --- a/src/net/sf/openrocket/aerodynamics/FlightConditions.java +++ b/src/net/sf/openrocket/aerodynamics/FlightConditions.java @@ -57,7 +57,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable { * Sqrt(1 - M^2) for M<1 * Sqrt(M^2 - 1) for M>1 */ - private double beta = Math.sqrt(1 - mach * mach); + private double beta = MathUtil.safeSqrt(1 - mach * mach); /** Current roll rate. */ @@ -122,7 +122,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable { */ public void setRefArea(double area) { refArea = area; - refLength = Math.sqrt(area / Math.PI) * 2; + refLength = MathUtil.safeSqrt(area / Math.PI) * 2; fireChangeEvent(); } @@ -237,9 +237,9 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable { this.mach = mach; if (mach < 1) - this.beta = Math.sqrt(1 - mach * mach); + this.beta = MathUtil.safeSqrt(1 - mach * mach); else - this.beta = Math.sqrt(mach * mach - 1); + this.beta = MathUtil.safeSqrt(mach * mach - 1); fireChangeEvent(); } @@ -378,6 +378,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable { * * @return the number of times this object has been modified since instantiation. */ + @Override public int getModID() { return modID + modIDadd + this.atmosphericConditions.getModID(); } diff --git a/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java b/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java index 2b3d7a6a..bd8ee75e 100644 --- a/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java +++ b/src/net/sf/openrocket/aerodynamics/barrowman/FinSetCalc.java @@ -1,6 +1,6 @@ package net.sf.openrocket.aerodynamics.barrowman; -import static java.lang.Math.*; +import static java.lang.Math.pow; import static net.sf.openrocket.util.MathUtil.pow2; import java.util.Arrays; @@ -462,7 +462,7 @@ public class FinSetCalc extends RocketComponentCalc { double[] k3 = new double[n]; for (int i = 0; i < n; i++) { double M = CNA_SUPERSONIC + i * 0.1; - double beta = sqrt(M * M - 1); + double beta = MathUtil.safeSqrt(M * M - 1); x[i] = M; k1[i] = 2.0 / beta; k2[i] = ((GAMMA + 1) * pow(M, 4) - 4 * pow2(beta)) / (4 * pow(beta, 4)); @@ -487,7 +487,7 @@ public class FinSetCalc extends RocketComponentCalc { // Subsonic case if (mach <= CNA_SUBSONIC) { - return 2 * Math.PI * pow2(span) / (1 + sqrt(1 + (1 - pow2(mach)) * + return 2 * Math.PI * pow2(span) / (1 + MathUtil.safeSqrt(1 + (1 - pow2(mach)) * pow2(pow2(span) / (finArea * cosGamma)))) / ref; } @@ -501,7 +501,7 @@ public class FinSetCalc extends RocketComponentCalc { double subV, superV; double subD, superD; - double sq = sqrt(1 + (1 - pow2(CNA_SUBSONIC)) * pow2(span * span / (finArea * cosGamma))); + double sq = MathUtil.safeSqrt(1 + (1 - pow2(CNA_SUBSONIC)) * pow2(span * span / (finArea * cosGamma))); subV = 2 * Math.PI * pow2(span) / ref / (1 + sq); subD = 2 * mach * Math.PI * pow(span, 6) / (pow2(finArea * cosGamma) * ref * sq * pow2(1 + sq)); diff --git a/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java b/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java index 42bce547..23178a33 100644 --- a/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java +++ b/src/net/sf/openrocket/aerodynamics/barrowman/SymmetricComponentCalc.java @@ -317,14 +317,14 @@ public class SymmetricComponentCalc extends RocketComponentCalc { p = (param - 0.5) * 4; } else { int1 = x34Interpolator; - int2 = calculateOgiveNoseInterpolator(0, 1 / Math.sqrt(1 + 4 * pow2(fineness))); + int2 = calculateOgiveNoseInterpolator(0, 1 / MathUtil.safeSqrt(1 + 4 * pow2(fineness))); p = (param - 0.75) * 4; } break; case PARABOLIC: if (param <= 0.5) { - int1 = calculateOgiveNoseInterpolator(0, 1 / Math.sqrt(1 + 4 * pow2(fineness))); + int1 = calculateOgiveNoseInterpolator(0, 1 / MathUtil.safeSqrt(1 + 4 * pow2(fineness))); int2 = parabolic12Interpolator; p = param * 2; } else if (param <= 0.75) { @@ -429,7 +429,7 @@ public class SymmetricComponentCalc extends RocketComponentCalc { // Above M = 1.3 use direct formula for (double m = 1.32; m < 4; m += 0.02) { - interpolator.addPoint(m, mul * (2.1 * pow2(sinphi) + 0.5 * sinphi / Math.sqrt(m * m - 1))); + interpolator.addPoint(m, mul * (2.1 * pow2(sinphi) + 0.5 * sinphi / MathUtil.safeSqrt(m * m - 1))); } return interpolator; diff --git a/src/net/sf/openrocket/document/OpenRocketDocument.java b/src/net/sf/openrocket/document/OpenRocketDocument.java index d0daa17a..c935bd29 100644 --- a/src/net/sf/openrocket/document/OpenRocketDocument.java +++ b/src/net/sf/openrocket/document/OpenRocketDocument.java @@ -26,14 +26,20 @@ import net.sf.openrocket.util.Icons; /** * Class describing an entire OpenRocket document, including a rocket and - * simulations. This class also handles undo/redo operations for the rocket structure. + * simulations. The document contains: + *

+ * - the rocket definition + * - a default Configuration + * - Simulation instances + * - the stored file and file save information + * - undo/redo information * * @author Sampo Niskanen */ public class OpenRocketDocument implements ComponentChangeListener { private static final LogHelper log = Application.getLogger(); private static final Translator trans = Application.getTranslator(); - + /** * The minimum number of undo levels that are stored. */ @@ -49,6 +55,8 @@ public class OpenRocketDocument implements ComponentChangeListener { /** Whether an undo error has already been reported to the user */ private static boolean undoErrorReported = false; + + private final Rocket rocket; private final Configuration configuration; @@ -496,6 +504,27 @@ public class OpenRocketDocument implements ComponentChangeListener { } } + + + /** + * Return a copy of this document. The rocket is copied with original ID's, the default + * motor configuration ID is maintained and the simulations are copied to the new rocket. + * No undo/redo information or file storage information is maintained. + * + * @return a copy of this document. + */ + public OpenRocketDocument copy() { + Rocket rocketCopy = rocket.copyWithOriginalID(); + OpenRocketDocument documentCopy = new OpenRocketDocument(rocketCopy); + documentCopy.getDefaultConfiguration().setMotorConfigurationID(configuration.getMotorConfigurationID()); + for (Simulation s : simulations) { + documentCopy.addSimulation(s.duplicateSimulation(rocketCopy)); + } + return documentCopy; + } + + + /////// Listeners public void addDocumentChangeListener(DocumentChangeListener listener) { diff --git a/src/net/sf/openrocket/document/Simulation.java b/src/net/sf/openrocket/document/Simulation.java index 709ce464..3c1e2c01 100644 --- a/src/net/sf/openrocket/document/Simulation.java +++ b/src/net/sf/openrocket/document/Simulation.java @@ -15,10 +15,10 @@ import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.simulation.BasicEventSimulationEngine; import net.sf.openrocket.simulation.FlightData; -import net.sf.openrocket.simulation.GUISimulationConditions; import net.sf.openrocket.simulation.RK4SimulationStepper; import net.sf.openrocket.simulation.SimulationConditions; import net.sf.openrocket.simulation.SimulationEngine; +import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.simulation.SimulationStepper; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.exception.SimulationListenerException; @@ -67,7 +67,7 @@ public class Simulation implements ChangeSource, Cloneable { /** The conditions to use */ // TODO: HIGH: Change to use actual conditions class?? - private GUISimulationConditions conditions; + private SimulationOptions options; private ArrayList simulationListeners = new ArrayList(); @@ -83,7 +83,7 @@ public class Simulation implements ChangeSource, Cloneable { /** The conditions actually used in the previous simulation, or null */ - private GUISimulationConditions simulatedConditions = null; + private SimulationOptions simulatedConditions = null; private String simulatedMotors = null; private FlightData simulatedData = null; private int simulatedRocketID = -1; @@ -99,14 +99,14 @@ public class Simulation implements ChangeSource, Cloneable { this.rocket = rocket; this.status = Status.NOT_SIMULATED; - conditions = new GUISimulationConditions(rocket); - conditions.setMotorConfigurationID( + options = new SimulationOptions(rocket); + options.setMotorConfigurationID( rocket.getDefaultConfiguration().getMotorConfigurationID()); - conditions.addChangeListener(new ConditionListener()); + options.addChangeListener(new ConditionListener()); } - public Simulation(Rocket rocket, Status status, String name, GUISimulationConditions conditions, + public Simulation(Rocket rocket, Status status, String name, SimulationOptions options, List listeners, FlightData data) { if (rocket == null) @@ -115,8 +115,8 @@ public class Simulation implements ChangeSource, Cloneable { throw new IllegalArgumentException("status cannot be null"); if (name == null) throw new IllegalArgumentException("name cannot be null"); - if (conditions == null) - throw new IllegalArgumentException("conditions cannot be null"); + if (options == null) + throw new IllegalArgumentException("options cannot be null"); this.rocket = rocket; @@ -130,8 +130,8 @@ public class Simulation implements ChangeSource, Cloneable { this.name = name; - this.conditions = conditions; - conditions.addChangeListener(new ConditionListener()); + this.options = options; + options.addChangeListener(new ConditionListener()); if (listeners != null) { this.simulationListeners.addAll(listeners); @@ -141,7 +141,7 @@ public class Simulation implements ChangeSource, Cloneable { if (data != null && this.status != Status.NOT_SIMULATED) { simulatedData = data; if (this.status == Status.LOADED) { - simulatedConditions = conditions.clone(); + simulatedConditions = options.clone(); simulatedRocketID = rocket.getModID(); } } @@ -169,21 +169,21 @@ public class Simulation implements ChangeSource, Cloneable { public Configuration getConfiguration() { mutex.verify(); Configuration c = new Configuration(rocket); - c.setMotorConfigurationID(conditions.getMotorConfigurationID()); + c.setMotorConfigurationID(options.getMotorConfigurationID()); c.setAllStages(); return c; } /** - * Returns the simulation conditions attached to this simulation. The conditions + * Returns the simulation options attached to this simulation. The options * may be modified freely, and the status of the simulation will change to reflect * the changes. * * @return the simulation conditions. */ - public GUISimulationConditions getConditions() { + public SimulationOptions getOptions() { mutex.verify(); - return conditions; + return options; } @@ -245,7 +245,7 @@ public class Simulation implements ChangeSource, Cloneable { if (status == Status.UPTODATE || status == Status.LOADED) { if (rocket.getFunctionalModID() != simulatedRocketID || - !conditions.equals(simulatedConditions)) + !options.equals(simulatedConditions)) return Status.OUTDATED; } @@ -277,11 +277,9 @@ public class Simulation implements ChangeSource, Cloneable { throw new IllegalStateException("Cannot instantiate simulator.", e); } catch (IllegalAccessException e) { throw new IllegalStateException("Cannot access simulator instance?! BUG!", e); - } catch (NullPointerException e) { - throw new IllegalStateException("Simulator null", e); } - SimulationConditions simulationConditions = conditions.toSimulationConditions(); + SimulationConditions simulationConditions = options.toSimulationConditions(); for (SimulationListener l : additionalListeners) { simulationConditions.getSimulationListenerList().add(l); } @@ -306,7 +304,7 @@ public class Simulation implements ChangeSource, Cloneable { log.debug("Simulation: returning from simulator, simulation took " + (t2 - t1) + "ms"); // Set simulated info after simulation, will not be set in case of exception - simulatedConditions = conditions.clone(); + simulatedConditions = options.clone(); simulatedMotors = getConfiguration().getMotorConfigurationDescription(); simulatedRocketID = rocket.getFunctionalModID(); @@ -324,7 +322,7 @@ public class Simulation implements ChangeSource, Cloneable { * * @return the conditions used in the previous simulation, or null. */ - public GUISimulationConditions getSimulatedConditions() { + public SimulationOptions getSimulatedConditions() { mutex.verify(); return simulatedConditions; } @@ -373,6 +371,7 @@ public class Simulation implements ChangeSource, Cloneable { /** * Returns a copy of this simulation suitable for cut/copy/paste operations. + * The rocket refers to the same instance as the original simulation. * This excludes any simulated data. * * @return a copy of this simulation and its conditions. @@ -385,7 +384,7 @@ public class Simulation implements ChangeSource, Cloneable { copy.mutex = SafetyMutex.newInstance(); copy.status = Status.NOT_SIMULATED; - copy.conditions = this.conditions.clone(); + copy.options = this.options.clone(); copy.simulationListeners = this.simulationListeners.clone(); copy.listeners = new ArrayList(); copy.simulatedConditions = null; @@ -416,7 +415,7 @@ public class Simulation implements ChangeSource, Cloneable { Simulation copy = new Simulation(newRocket); copy.name = this.name; - copy.conditions.copyFrom(this.conditions); + copy.options.copyFrom(this.options); copy.simulationListeners = this.simulationListeners.clone(); copy.simulationStepperClass = this.simulationStepperClass; copy.aerodynamicCalculatorClass = this.aerodynamicCalculatorClass; diff --git a/src/net/sf/openrocket/file/openrocket/OpenRocketLoader.java b/src/net/sf/openrocket/file/openrocket/OpenRocketLoader.java index d6cf6160..7719e0e2 100644 --- a/src/net/sf/openrocket/file/openrocket/OpenRocketLoader.java +++ b/src/net/sf/openrocket/file/openrocket/OpenRocketLoader.java @@ -69,7 +69,7 @@ import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.simulation.FlightDataType; import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.simulation.FlightEvent.Type; -import net.sf.openrocket.simulation.GUISimulationConditions; +import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.BugException; @@ -1257,12 +1257,12 @@ class SingleSimulationHandler extends ElementHandler { status = Simulation.Status.OUTDATED; } - GUISimulationConditions conditions; + SimulationOptions conditions; if (conditionHandler != null) { conditions = conditionHandler.getConditions(); } else { warnings.add("Simulation conditions not defined, using defaults."); - conditions = new GUISimulationConditions(doc.getRocket()); + conditions = new SimulationOptions(doc.getRocket()); } if (name == null) @@ -1284,14 +1284,14 @@ class SingleSimulationHandler extends ElementHandler { class SimulationConditionsHandler extends ElementHandler { - private GUISimulationConditions conditions; + private SimulationOptions conditions; private AtmosphereHandler atmosphereHandler; public SimulationConditionsHandler(Rocket rocket) { - conditions = new GUISimulationConditions(rocket); + conditions = new SimulationOptions(rocket); } - public GUISimulationConditions getConditions() { + public SimulationOptions getConditions() { return conditions; } @@ -1418,7 +1418,7 @@ class AtmosphereHandler extends ElementHandler { } - public void storeSettings(GUISimulationConditions cond, WarningSet warnings) { + public void storeSettings(SimulationOptions cond, WarningSet warnings) { if (!Double.isNaN(pressure)) { cond.setLaunchPressure(pressure); } diff --git a/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java b/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java index 85085259..bf237284 100644 --- a/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java +++ b/src/net/sf/openrocket/file/openrocket/OpenRocketSaver.java @@ -25,7 +25,7 @@ import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.simulation.FlightDataType; import net.sf.openrocket.simulation.FlightEvent; -import net.sf.openrocket.simulation.GUISimulationConditions; +import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.MathUtil; @@ -291,7 +291,7 @@ public class OpenRocketSaver extends RocketSaver { private void saveSimulation(Simulation simulation, double timeSkip) throws IOException { - GUISimulationConditions cond = simulation.getConditions(); + SimulationOptions cond = simulation.getOptions(); writeln(""); indent++; diff --git a/src/net/sf/openrocket/gui/adaptors/BooleanModel.java b/src/net/sf/openrocket/gui/adaptors/BooleanModel.java index a88f4b89..4e877aff 100644 --- a/src/net/sf/openrocket/gui/adaptors/BooleanModel.java +++ b/src/net/sf/openrocket/gui/adaptors/BooleanModel.java @@ -37,17 +37,21 @@ import net.sf.openrocket.util.Reflection; * * @author Sampo Niskanen */ - public class BooleanModel extends AbstractAction implements ChangeListener, Invalidatable { private static final LogHelper log = Application.getLogger(); private final ChangeSource source; private final String valueName; + /* Only used when referencing a ChangeSource! */ private final Method getMethod; private final Method setMethod; private final Method getEnabled; + /* Only used with internal boolean value! */ + private boolean value; + + private final List components = new ArrayList(); private final List componentEnableState = new ArrayList(); @@ -61,6 +65,34 @@ public class BooleanModel extends AbstractAction implements ChangeListener, Inva private Invalidator invalidator = new Invalidator(this); + /** + * Construct a BooleanModel that holds the boolean value within itself. + * + * @param initialValue the initial value of the boolean + */ + public BooleanModel(boolean initialValue) { + this.valueName = null; + this.source = null; + this.getMethod = null; + this.setMethod = null; + this.getEnabled = null; + + this.value = initialValue; + + oldValue = getValue(); + oldEnabled = getIsEnabled(); + + this.setEnabled(oldEnabled); + this.putValue(SELECTED_KEY, oldValue); + + } + + /** + * Construct a BooleanModel that references the boolean from a ChangeSource method. + * + * @param source the boolean source. + * @param valueName the name of the getter/setter method (without the get/is/set prefix) + */ public BooleanModel(ChangeSource source, String valueName) { this.source = source; this.valueName = valueName; @@ -109,24 +141,41 @@ public class BooleanModel extends AbstractAction implements ChangeListener, Inva } public boolean getValue() { - try { - return (Boolean) getMethod.invoke(source); - } catch (IllegalAccessException e) { - throw new BugException("getMethod execution error for source " + source, e); - } catch (InvocationTargetException e) { - throw Reflection.handleWrappedException(e); + + if (getMethod != null) { + + try { + return (Boolean) getMethod.invoke(source); + } catch (IllegalAccessException e) { + throw new BugException("getMethod execution error for source " + source, e); + } catch (InvocationTargetException e) { + throw Reflection.handleWrappedException(e); + } + + } else { + + // Use internal value + return value; + } } public void setValue(boolean b) { checkState(true); log.debug("Setting value of " + this + " to " + b); - try { - setMethod.invoke(source, new Object[] { b }); - } catch (IllegalAccessException e) { - throw new BugException("setMethod execution error for source " + source, e); - } catch (InvocationTargetException e) { - throw Reflection.handleWrappedException(e); + + if (setMethod != null) { + try { + setMethod.invoke(source, new Object[] { b }); + } catch (IllegalAccessException e) { + throw new BugException("setMethod execution error for source " + source, e); + } catch (InvocationTargetException e) { + throw Reflection.handleWrappedException(e); + } + } else { + // Manually fire state change - normally the ChangeSource fires it + value = b; + stateChanged(null); } } @@ -271,7 +320,11 @@ public class BooleanModel extends AbstractAction implements ChangeListener, Inva @Override public String toString() { if (toString == null) { - toString = "BooleanModel[" + source.getClass().getSimpleName() + ":" + valueName + "]"; + if (source != null) { + toString = "BooleanModel[" + source.getClass().getSimpleName() + ":" + valueName + "]"; + } else { + toString = "BooleanModel[internal value]"; + } } return toString; } diff --git a/src/net/sf/openrocket/gui/adaptors/DoubleModel.java b/src/net/sf/openrocket/gui/adaptors/DoubleModel.java index ce81e107..e1fc3071 100644 --- a/src/net/sf/openrocket/gui/adaptors/DoubleModel.java +++ b/src/net/sf/openrocket/gui/adaptors/DoubleModel.java @@ -261,7 +261,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable // Use quadratic scale // Further solution of the quadratic equation // a*x^2 + b*x + c-value == 0 - x = (Math.sqrt(quad1 * quad1 - 4 * quad2 * (quad0 - value)) - quad1) / (2 * quad2); + x = (MathUtil.safeSqrt(quad1 * quad1 - 4 * quad2 * (quad0 - value)) - quad1) / (2 * quad2); } return (int) (x * MAX); } diff --git a/src/net/sf/openrocket/gui/components/CsvOptionPanel.java b/src/net/sf/openrocket/gui/components/CsvOptionPanel.java new file mode 100644 index 00000000..b856e87c --- /dev/null +++ b/src/net/sf/openrocket/gui/components/CsvOptionPanel.java @@ -0,0 +1,126 @@ +package net.sf.openrocket.gui.components; + +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.util.Prefs; + +/** + * A panel that shows options for saving CSV files. + * + * @author Sampo Niskanen + */ +public class CsvOptionPanel extends JPanel { + + private static final Translator trans = Application.getTranslator(); + + private static final String SPACE = trans.get("CsvOptionPanel.separator.space"); + private static final String TAB = trans.get("CsvOptionPanel.separator.tab"); + + private final String baseClassName; + + private final JComboBox fieldSeparator; + private final JCheckBox[] options; + private final JComboBox commentCharacter; + + /** + * Sole constructor. + * + * @param includeComments a list of comment inclusion options to provide; + * every second item is the option name and every second the tooltip + */ + public CsvOptionPanel(Class baseClass, String... includeComments) { + super(new MigLayout("fill, insets 0")); + + this.baseClassName = baseClass.getSimpleName(); + + JPanel panel; + JLabel label; + String tip; + + + // TODO: HIGH: Rename the translation keys + + // Field separator panel + panel = new JPanel(new MigLayout("fill")); + panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Fieldsep"))); + + label = new JLabel(trans.get("SimExpPan.lbl.Fieldsepstr")); + tip = trans.get("SimExpPan.lbl.longA1") + + trans.get("SimExpPan.lbl.longA2"); + label.setToolTipText(tip); + panel.add(label, "gapright unrel"); + + fieldSeparator = new JComboBox(new String[] { ",", ";", SPACE, TAB }); + fieldSeparator.setEditable(true); + fieldSeparator.setSelectedItem(Prefs.getString(Prefs.EXPORT_FIELD_SEPARATOR, ",")); + fieldSeparator.setToolTipText(tip); + panel.add(fieldSeparator, "growx"); + + this.add(panel, "growx, wrap unrel"); + + + + // Comments separator panel + panel = new JPanel(new MigLayout("fill")); + panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Comments"))); + + + // List of include comments options + if (includeComments.length % 2 == 1) { + throw new IllegalArgumentException("Invalid argument length, must be even, length=" + includeComments.length); + } + options = new JCheckBox[includeComments.length / 2]; + for (int i = 0; i < includeComments.length / 2; i++) { + options[i] = new JCheckBox(includeComments[i * 2]); + options[i].setToolTipText(includeComments[i * 2 + 1]); + options[i].setSelected(Prefs.getBoolean("csvOptions." + baseClassName + "." + i, true)); + panel.add(options[i], "wrap"); + } + + + label = new JLabel(trans.get("SimExpPan.lbl.Commentchar")); + tip = trans.get("SimExpPan.lbl.ttip.Commentchar"); + label.setToolTipText(tip); + panel.add(label, "split 2, gapright unrel"); + + commentCharacter = new JComboBox(new String[] { "#", "%", ";" }); + commentCharacter.setEditable(true); + commentCharacter.setSelectedItem(Prefs.getString(Prefs.EXPORT_COMMENT_CHARACTER, "#")); + commentCharacter.setToolTipText(tip); + panel.add(commentCharacter, "growx"); + + this.add(panel, "growx, wrap"); + } + + + public String getFieldSeparator() { + return fieldSeparator.getSelectedItem().toString(); + } + + public String getCommentCharacter() { + return commentCharacter.getSelectedItem().toString(); + } + + public boolean getSelectionOption(int index) { + return options[index].isSelected(); + } + + /** + * Store the selected options to the user preferences. + */ + public void storePreferences() { + Prefs.putString(Prefs.EXPORT_FIELD_SEPARATOR, getFieldSeparator()); + Prefs.putString(Prefs.EXPORT_COMMENT_CHARACTER, getCommentCharacter()); + for (int i = 0; i < options.length; i++) { + Prefs.putBoolean("csvOptions." + baseClassName + "." + i, options[i].isSelected()); + } + } + +} diff --git a/src/net/sf/openrocket/gui/components/DescriptionArea.java b/src/net/sf/openrocket/gui/components/DescriptionArea.java index 616b3adc..1e37bb6f 100644 --- a/src/net/sf/openrocket/gui/components/DescriptionArea.java +++ b/src/net/sf/openrocket/gui/components/DescriptionArea.java @@ -16,14 +16,33 @@ public class DescriptionArea extends JScrollPane { private final JEditorPane editorPane; + /** + * Construct a description area with the specified number of rows, default description font size, + * being opaque. + * + * @param rows the number of rows + */ public DescriptionArea(int rows) { this("", rows, -1); } + /** + * Construct a description area with the specified number of rows and size, being opaque. + * + * @param rows the number of rows. + * @param size the font size difference compared to the default font size. + */ public DescriptionArea(int rows, float size) { this("", rows, size); } + /** + * Construct an opaque description area with the specified number of rows, size and text, being opaque. + * + * @param text the initial text. + * @param rows the number of rows. + * @param size the font size difference compared to the default font size. + */ public DescriptionArea(String text, int rows, float size) { this(text, rows, size, true); } diff --git a/src/net/sf/openrocket/gui/components/DoubleCellEditor.java b/src/net/sf/openrocket/gui/components/DoubleCellEditor.java new file mode 100644 index 00000000..6ff86822 --- /dev/null +++ b/src/net/sf/openrocket/gui/components/DoubleCellEditor.java @@ -0,0 +1,42 @@ +package net.sf.openrocket.gui.components; + +import java.awt.Component; + +import javax.swing.AbstractCellEditor; +import javax.swing.JSpinner; +import javax.swing.JTable; +import javax.swing.table.TableCellEditor; + +import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.DoubleModel; + +public class DoubleCellEditor extends AbstractCellEditor implements TableCellEditor { + + private final JSpinner editor; + private final DoubleModel model; + + public DoubleCellEditor() { + model = new DoubleModel(0); + editor = new JSpinner(model.getSpinnerModel()); + editor.setEditor(new SpinnerEditor(editor)); + // editor.addChangeListener(this); + } + + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, int row, int column) { + + double val = (Double) value; + model.setValue(val); + + return editor; + } + + + @Override + public Object getCellEditorValue() { + return model.getValue(); + } + +} diff --git a/src/net/sf/openrocket/gui/components/SimulationExportPanel.java b/src/net/sf/openrocket/gui/components/SimulationExportPanel.java index 62f79d6d..cd73c5f9 100644 --- a/src/net/sf/openrocket/gui/components/SimulationExportPanel.java +++ b/src/net/sf/openrocket/gui/components/SimulationExportPanel.java @@ -8,16 +8,12 @@ import java.util.Arrays; import javax.swing.BorderFactory; import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingUtilities; -import javax.swing.filechooser.FileFilter; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; @@ -32,32 +28,20 @@ import net.sf.openrocket.simulation.FlightDataType; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.util.FileHelper; import net.sf.openrocket.util.GUIUtil; import net.sf.openrocket.util.Prefs; import net.sf.openrocket.util.SaveCSVWorker; public class SimulationExportPanel extends JPanel { - + private static final String SPACE = "SPACE"; private static final String TAB = "TAB"; private static final Translator trans = Application.getTranslator(); - private static final FileFilter CSV_FILE_FILTER = new FileFilter() { - @Override - public String getDescription() { - //// Comma Separated Files (*.csv) - return trans.get("SimExpPan.desc"); - } - @Override - public boolean accept(File f) { - if (f.isDirectory()) - return true; - String name = f.getName().toLowerCase(); - return name.endsWith(".csv"); - } - }; - - + private static final int OPTION_SIMULATION_COMMENTS = 0; + private static final int OPTION_FIELD_DESCRIPTIONS = 1; + private static final int OPTION_FLIGHT_EVENTS = 2; private final JTable table; private final SelectionTableModel tableModel; @@ -70,38 +54,32 @@ public class SimulationExportPanel extends JPanel { private final FlightDataType[] types; private final Unit[] units; - private final JComboBox fieldSeparator; - private final JCheckBox simulationComments; - private final JCheckBox fieldNameComments; - private final JCheckBox eventComments; - private final JComboBox commentCharacter; + private final CsvOptionPanel csvOptions; public SimulationExportPanel(Simulation sim) { super(new MigLayout("fill, flowy")); - - JLabel label; + JPanel panel; JButton button; - String tip; - + this.simulation = sim; // TODO: MEDIUM: Only exports primary branch final FlightData data = simulation.getSimulatedData(); - + // Check that data exists - if (data == null || data.getBranchCount() == 0 || + if (data == null || data.getBranchCount() == 0 || data.getBranch(0).getTypes().length == 0) { throw new IllegalArgumentException("No data for panel"); } - + // Create the data model branch = data.getBranch(0); - + types = branch.getTypes(); Arrays.sort(types); @@ -112,16 +90,16 @@ public class SimulationExportPanel extends JPanel { units[i] = types[i].getUnitGroup().getDefaultUnit(); } - + //// Create the panel - + // Set up the variable selection table tableModel = new SelectionTableModel(); table = new JTable(tableModel); - table.setDefaultRenderer(Object.class, + table.setDefaultRenderer(Object.class, new SelectionBackgroundCellRenderer(table.getDefaultRenderer(Object.class))); - table.setDefaultRenderer(Boolean.class, + table.setDefaultRenderer(Boolean.class, new SelectionBackgroundCellRenderer(table.getDefaultRenderer(Boolean.class))); table.setRowSelectionAllowed(false); table.setColumnSelectionAllowed(false); @@ -146,7 +124,7 @@ public class SimulationExportPanel extends JPanel { col = columnModel.getColumn(2); col.setPreferredWidth(100); - + table.addMouseListener(new GUIUtil.BooleanTableClickListener(table)); // Add table @@ -174,85 +152,31 @@ public class SimulationExportPanel extends JPanel { }); panel.add(button, "growx 1, sizegroup selectbutton, wrap"); - + selectedCountLabel = new JLabel(); updateSelectedCount(); panel.add(selectedCountLabel); this.add(panel, "grow 100, wrap"); + + // These need to be in the order of the OPTIONS_XXX indices + csvOptions = new CsvOptionPanel(SimulationExportPanel.class, + trans.get("SimExpPan.checkbox.Includesimudesc"), + trans.get("SimExpPan.checkbox.ttip.Includesimudesc"), + trans.get("SimExpPan.checkbox.Includefielddesc"), + trans.get("SimExpPan.checkbox.ttip.Includefielddesc"), + trans.get("SimExpPan.checkbox.Incflightevents"), + trans.get("SimExpPan.checkbox.ttip.Incflightevents")); + this.add(csvOptions, "spany, split, growx 1"); - // Field separator panel - panel = new JPanel(new MigLayout("fill")); - panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Fieldsep"))); - - label = new JLabel(trans.get("SimExpPan.lbl.Fieldsepstr")); - //// The string used to separate the fields in the exported file.
- //// Use ',' for a Comma Separated Values (CSV) file. - tip = trans.get("SimExpPan.lbl.longA1") + - trans.get("SimExpPan.lbl.longA2"); - label.setToolTipText(tip); - panel.add(label); - - fieldSeparator = new JComboBox(new String[] { ",", ";", SPACE, TAB }); - fieldSeparator.setEditable(true); - fieldSeparator.setSelectedItem(Prefs.getString(Prefs.EXPORT_FIELD_SEPARATOR, - ",")); - fieldSeparator.setToolTipText(tip); - panel.add(fieldSeparator); - - this.add(panel, "spany, split, growx 1"); - - - - - // Comments separator panel - panel = new JPanel(new MigLayout("fill")); - //// Comments - panel.setBorder(BorderFactory.createTitledBorder(trans.get("SimExpPan.border.Comments"))); - - //// Include simulation description - simulationComments = new JCheckBox(trans.get("SimExpPan.checkbox.Includesimudesc")); - //// Include a comment at the beginning of the file describing the simulation. - simulationComments.setToolTipText(trans.get("SimExpPan.checkbox.ttip.Includesimudesc")); - simulationComments.setSelected(Prefs.getBoolean(Prefs.EXPORT_SIMULATION_COMMENT, - true)); - panel.add(simulationComments, "wrap"); - - //// Include field descriptions - fieldNameComments = new JCheckBox(trans.get("SimExpPan.checkbox.Includefielddesc")); - //// Include a comment line with the descriptions of the exported variables. - fieldNameComments.setToolTipText(trans.get("SimExpPan.checkbox.ttip.Includefielddesc")); - fieldNameComments.setSelected(Prefs.getBoolean(Prefs.EXPORT_FIELD_NAME_COMMENT, true)); - panel.add(fieldNameComments, "wrap"); - - - eventComments = new JCheckBox(trans.get("SimExpPan.checkbox.Incflightevents")); - eventComments.setToolTipText(trans.get("SimExpPan.checkbox.ttip.Incflightevents")); - eventComments.setSelected(Prefs.getBoolean(Prefs.EXPORT_EVENT_COMMENTS, true)); - panel.add(eventComments, "wrap"); - - - label = new JLabel(trans.get("SimExpPan.lbl.Commentchar")); - tip = trans.get("SimExpPan.lbl.ttip.Commentchar"); - label.setToolTipText(tip); - panel.add(label, "split 2"); - - commentCharacter = new JComboBox(new String[] { "#", "%", ";" }); - commentCharacter.setEditable(true); - commentCharacter.setSelectedItem(Prefs.getString(Prefs.EXPORT_COMMENT_CHARACTER, "#")); - commentCharacter.setToolTipText(tip); - panel.add(commentCharacter); - - this.add(panel, "growx 1"); - // Space-filling panel panel = new JPanel(); this.add(panel, "width 1, height 1, grow 1"); - + // Export button button = new JButton(trans.get("SimExpPan.but.Exporttofile")); button.addActionListener(new ActionListener() { @@ -268,7 +192,7 @@ public class SimulationExportPanel extends JPanel { private void doExport() { JFileChooser chooser = new JFileChooser(); - chooser.setFileFilter(CSV_FILE_FILTER); + chooser.setFileFilter(FileHelper.CSV_FILE_FILTER); chooser.setCurrentDirectory(Prefs.getDefaultDirectory()); if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) @@ -278,49 +202,33 @@ public class SimulationExportPanel extends JPanel { if (file == null) return; - if (file.getName().indexOf('.') < 0) { - String name = file.getAbsolutePath(); - name = name + ".csv"; - file = new File(name); - } - - if (file.exists()) { - int ret = JOptionPane.showConfirmDialog(this, - //// File - trans.get("SimExpPan.Fileexists.desc1") + file.getName() + - //// \" exists. Overwrite? - trans.get("SimExpPan.Fileexists.desc2"), - //// File exists - trans.get("SimExpPan.Fileexists.title"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (ret != JOptionPane.YES_OPTION) - return; + file = FileHelper.ensureExtension(file, "csv"); + if (!FileHelper.confirmWrite(file, this)) { + return; } + - String commentChar = commentCharacter.getSelectedItem().toString(); - String fieldSep = fieldSeparator.getSelectedItem().toString(); - boolean simulationComment = simulationComments.isSelected(); - boolean fieldComment = fieldNameComments.isSelected(); - boolean eventComment = eventComments.isSelected(); + String commentChar = csvOptions.getCommentCharacter(); + String fieldSep = csvOptions.getFieldSeparator(); + boolean simulationComment = csvOptions.getSelectionOption(OPTION_SIMULATION_COMMENTS); + boolean fieldComment = csvOptions.getSelectionOption(OPTION_FIELD_DESCRIPTIONS); + boolean eventComment = csvOptions.getSelectionOption(OPTION_FLIGHT_EVENTS); + csvOptions.storePreferences(); // Store preferences and export int n = 0; Prefs.setDefaultDirectory(chooser.getCurrentDirectory()); - for (int i=0; i < selected.length; i++) { + for (int i = 0; i < selected.length; i++) { Prefs.setExportSelected(types[i], selected[i]); if (selected[i]) n++; } - Prefs.putString(Prefs.EXPORT_FIELD_SEPARATOR, fieldSep); - Prefs.putString(Prefs.EXPORT_COMMENT_CHARACTER, commentChar); - Prefs.putBoolean(Prefs.EXPORT_EVENT_COMMENTS, eventComment); - Prefs.putBoolean(Prefs.EXPORT_FIELD_NAME_COMMENT, fieldComment); - Prefs.putBoolean(Prefs.EXPORT_SIMULATION_COMMENT, simulationComment); - + FlightDataType[] fieldTypes = new FlightDataType[n]; Unit[] fieldUnits = new Unit[n]; int pos = 0; - for (int i=0; i < selected.length; i++) { + for (int i = 0; i < selected.length; i++) { if (selected[i]) { fieldTypes[pos] = types[i]; fieldUnits[pos] = units[i]; @@ -334,9 +242,9 @@ public class SimulationExportPanel extends JPanel { fieldSep = "\t"; } - - SaveCSVWorker.export(file, simulation, branch, fieldTypes, fieldUnits, fieldSep, - commentChar, simulationComment, fieldComment, eventComment, + + SaveCSVWorker.export(file, simulation, branch, fieldTypes, fieldUnits, fieldSep, + commentChar, simulationComment, fieldComment, eventComment, SwingUtilities.getWindowAncestor(this)); } @@ -346,7 +254,7 @@ public class SimulationExportPanel extends JPanel { int n = 0; String str; - for (int i=0; i < selected.length; i++) { + for (int i = 0; i < selected.length; i++) { if (selected[i]) n++; } @@ -357,21 +265,21 @@ public class SimulationExportPanel extends JPanel { } else { //// Exporting //// variables out of - str = trans.get("SimExpPan.ExportingVar.desc2") + " "+n+" " + - trans.get("SimExpPan.ExportingVar.desc3") + " " + total + "."; + str = trans.get("SimExpPan.ExportingVar.desc2") + " " + n + " " + + trans.get("SimExpPan.ExportingVar.desc3") + " " + total + "."; } - + selectedCountLabel.setText(str); } - + /** * A table cell renderer that uses another renderer and sets the background and * foreground of the returned component based on the selection of the variable. */ private class SelectionBackgroundCellRenderer implements TableCellRenderer { - + private final TableCellRenderer renderer; public SelectionBackgroundCellRenderer(TableCellRenderer renderer) { @@ -382,7 +290,7 @@ public class SimulationExportPanel extends JPanel { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - Component component = renderer.getTableCellRendererComponent(table, + Component component = renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (selected[row]) { @@ -406,12 +314,12 @@ public class SimulationExportPanel extends JPanel { private static final int SELECTED = 0; private static final int NAME = 1; private static final int UNIT = 2; - + @Override public int getColumnCount() { return 3; } - + @Override public int getRowCount() { return types.length; @@ -447,10 +355,10 @@ public class SimulationExportPanel extends JPanel { throw new IndexOutOfBoundsException("column=" + column); } } - + @Override public Object getValueAt(int row, int column) { - + switch (column) { case SELECTED: return selected[row]; @@ -462,34 +370,34 @@ public class SimulationExportPanel extends JPanel { return units[row]; default: - throw new IndexOutOfBoundsException("column="+column); + throw new IndexOutOfBoundsException("column=" + column); } } - + @Override public void setValueAt(Object value, int row, int column) { switch (column) { case SELECTED: - selected[row] = (Boolean)value; + selected[row] = (Boolean) value; this.fireTableRowsUpdated(row, row); updateSelectedCount(); break; - + case NAME: break; - + case UNIT: - units[row] = (Unit)value; + units[row] = (Unit) value; break; - + default: - throw new IndexOutOfBoundsException("column="+column); + throw new IndexOutOfBoundsException("column=" + column); } } - + @Override public boolean isCellEditable(int row, int column) { switch (column) { @@ -503,7 +411,7 @@ public class SimulationExportPanel extends JPanel { return types[row].getUnitGroup().getUnitCount() > 1; default: - throw new IndexOutOfBoundsException("column="+column); + throw new IndexOutOfBoundsException("column=" + column); } } diff --git a/src/net/sf/openrocket/gui/components/UnitCellEditor.java b/src/net/sf/openrocket/gui/components/UnitCellEditor.java index 7afa28ab..2ff47abc 100644 --- a/src/net/sf/openrocket/gui/components/UnitCellEditor.java +++ b/src/net/sf/openrocket/gui/components/UnitCellEditor.java @@ -20,11 +20,10 @@ import net.sf.openrocket.unit.UnitGroup; * * @author Sampo Niskanen */ -public abstract class UnitCellEditor extends AbstractCellEditor -implements TableCellEditor, ActionListener { - - private final JComboBox editor; +public abstract class UnitCellEditor extends AbstractCellEditor + implements TableCellEditor, ActionListener { + private final JComboBox editor; public UnitCellEditor() { editor = new JComboBox(); @@ -36,12 +35,12 @@ implements TableCellEditor, ActionListener { @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - + Unit unit = (Unit) value; UnitGroup group = getUnitGroup(unit, row, column); editor.removeAllItems(); - for (Unit u: group.getUnits()) { + for (Unit u : group.getUnits()) { editor.addItem(u); } @@ -49,22 +48,22 @@ implements TableCellEditor, ActionListener { return editor; } - + @Override public Object getCellEditorValue() { return editor.getSelectedItem(); } - + @Override public void actionPerformed(ActionEvent e) { // End editing when a value has been selected this.fireEditingStopped(); } - - + + /** * Return the unit group corresponding to the specified cell. * diff --git a/src/net/sf/openrocket/gui/dialogs/MotorDatabaseLoadingDialog.java b/src/net/sf/openrocket/gui/dialogs/MotorDatabaseLoadingDialog.java index 0edfddae..006b30f4 100644 --- a/src/net/sf/openrocket/gui/dialogs/MotorDatabaseLoadingDialog.java +++ b/src/net/sf/openrocket/gui/dialogs/MotorDatabaseLoadingDialog.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.dialogs; +import java.awt.SplashScreen; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -17,10 +18,15 @@ import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.GUIUtil; +/** + * A progress dialog displayed while loading motors. + * + * @author Sampo Niskanen + */ public class MotorDatabaseLoadingDialog extends JDialog { private static final LogHelper log = Application.getLogger(); private static final Translator trans = Application.getTranslator(); - + private MotorDatabaseLoadingDialog(Window parent) { //// Loading motors @@ -44,7 +50,8 @@ public class MotorDatabaseLoadingDialog extends JDialog { /** * Check whether the motor database is loaded and block until it is. - * An uncloseable modal dialog window is opened while loading. + * An uncloseable modal dialog window is opened while loading unless the splash screen + * is still being displayed. * * @param parent the parent window for the dialog, or null */ @@ -53,31 +60,54 @@ public class MotorDatabaseLoadingDialog extends JDialog { if (db.isLoaded()) return; - log.info(1, "Motor database not loaded yet, displaying dialog"); - - final MotorDatabaseLoadingDialog dialog = new MotorDatabaseLoadingDialog(parent); - - final Timer timer = new Timer(100, new ActionListener() { - private int count = 0; + if (SplashScreen.getSplashScreen() == null) { + + log.info(1, "Motor database not loaded yet, displaying dialog"); + + final MotorDatabaseLoadingDialog dialog = new MotorDatabaseLoadingDialog(parent); + + final Timer timer = new Timer(100, new ActionListener() { + private int count = 0; + + @Override + public void actionPerformed(ActionEvent e) { + count++; + if (db.isLoaded()) { + log.debug("Database loaded, closing dialog"); + dialog.setVisible(false); + } else if (count % 10 == 0) { + log.debug("Database not loaded, count=" + count); + } + } + }); + + db.setInUse(); + timer.start(); + dialog.setVisible(true); + timer.stop(); + + } else { + + log.info(1, "Motor database not loaded yet, splash screen still present, delaying until loaded"); - @Override - public void actionPerformed(ActionEvent e) { + db.setInUse(); + int count = 0; + while (!db.isLoaded()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // No-op + } + count++; - if (db.isLoaded()) { - log.debug("Database loaded, closing dialog"); - dialog.setVisible(false); - } else if (count % 10 == 0) { + if (count % 10 == 0) { log.debug("Database not loaded, count=" + count); } } - }); - - db.setInUse(); - timer.start(); - dialog.setVisible(true); - timer.stop(); + + } - log.debug("Motor database now loaded"); + log.info("Motor database now loaded"); } } diff --git a/src/net/sf/openrocket/gui/dialogs/optimization/FunctionEvaluationData.java b/src/net/sf/openrocket/gui/dialogs/optimization/FunctionEvaluationData.java new file mode 100644 index 00000000..6162e965 --- /dev/null +++ b/src/net/sf/openrocket/gui/dialogs/optimization/FunctionEvaluationData.java @@ -0,0 +1,67 @@ +package net.sf.openrocket.gui.dialogs.optimization; + +import net.sf.openrocket.optimization.general.Point; +import net.sf.openrocket.unit.Value; + +/** + * Value object for function evaluation information. + * + * @author Sampo Niskanen + */ +public class FunctionEvaluationData { + + private final Point point; + private final Value[] state; + private final Value domainReference; + private final Value parameterValue; + private final double goalValue; + + + public FunctionEvaluationData(Point point, Value[] state, Value domainReference, Value parameterValue, double goalValue) { + this.point = point; + this.state = state.clone(); + this.domainReference = domainReference; + this.parameterValue = parameterValue; + this.goalValue = goalValue; + } + + + /** + * Return the function evaluation point (in 0...1 range). + */ + public Point getPoint() { + return point; + } + + + /** + * Return the function evaluation state in SI units + units. + */ + public Value[] getState() { + return state; + } + + + /** + * Return the domain description. + */ + public Value getDomainReference() { + return domainReference; + } + + + /** + * Return the optimization parameter value (or NaN is outside of domain). + */ + public Value getParameterValue() { + return parameterValue; + } + + + /** + * Return the function goal value. + */ + public double getGoalValue() { + return goalValue; + } +} diff --git a/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java b/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java index a68412e1..fe0e3774 100644 --- a/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java +++ b/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java @@ -1,66 +1,1047 @@ package net.sf.openrocket.gui.dialogs.optimization; +import java.awt.Component; import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.BufferedWriter; +import java.io.File; +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; import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; -import javax.swing.JTree; +import javax.swing.JSpinner; +import javax.swing.JTable; +import javax.swing.JToggleButton; +import javax.swing.ListSelectionModel; +import javax.swing.border.TitledBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableColumnModel; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreePath; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.gui.SpinnerEditor; +import net.sf.openrocket.gui.adaptors.DoubleModel; +import net.sf.openrocket.gui.components.CsvOptionPanel; +import net.sf.openrocket.gui.components.DescriptionArea; +import net.sf.openrocket.gui.components.DoubleCellEditor; +import net.sf.openrocket.gui.components.StyledLabel; +import net.sf.openrocket.gui.components.StyledLabel.Style; +import net.sf.openrocket.gui.components.UnitCellEditor; +import net.sf.openrocket.gui.components.UnitSelector; +import net.sf.openrocket.gui.scalefigure.RocketFigure; +import net.sf.openrocket.gui.scalefigure.ScaleScrollPane; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.optimization.general.Point; import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.optimization.rocketoptimization.OptimizationGoal; +import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain; import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; +import net.sf.openrocket.optimization.rocketoptimization.domains.IdentitySimulationDomain; +import net.sf.openrocket.optimization.rocketoptimization.domains.StabilityDomain; +import net.sf.openrocket.optimization.rocketoptimization.goals.MaximizationGoal; +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.Rocket; +import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.CaliberUnit; +import net.sf.openrocket.unit.Unit; +import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.unit.Value; import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.Chars; +import net.sf.openrocket.util.FileHelper; import net.sf.openrocket.util.GUIUtil; +import net.sf.openrocket.util.Named; +import net.sf.openrocket.util.Prefs; +import net.sf.openrocket.util.TextUtil; +import com.itextpdf.text.Font; + +/** + * General rocket optimization dialog. + * + * @author Sampo Niskanen + */ public class GeneralOptimizationDialog extends JDialog { + private static final LogHelper log = Application.getLogger(); 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"); + + private static final String START_TEXT = trans.get("btn.start"); + private static final String STOP_TEXT = trans.get("btn.stop"); + + + private final List optimizationParameters = new ArrayList(); private final Map> simulationModifiers = new HashMap>(); private final OpenRocketDocument baseDocument; - private final Rocket rocketCopy; + private OpenRocketDocument documentCopy; + + + private final JButton addButton; + private final JButton removeButton; + private final JButton removeAllButton; + + private final ParameterSelectionTableModel selectedModifierTableModel; + private final JTable selectedModifierTable; + private final DescriptionArea selectedModifierDescription; + private final SimulationModifierTree availableModifierTree; + + private final JComboBox simulationSelectionCombo; + private final JComboBox optimizationParameterCombo; + + private final JComboBox optimizationGoalCombo; + private final JSpinner optimizationGoalSpinner; + private final UnitSelector optimizationGoalUnitSelector; + private final DoubleModel optimizationSeekValue; + + private DoubleModel minimumStability; + private DoubleModel maximumStability; + private final JCheckBox minimumStabilitySelected; + private final JSpinner minimumStabilitySpinner; + private final UnitSelector minimumStabilityUnitSelector; + private final JCheckBox maximumStabilitySelected; + private final JSpinner maximumStabilitySpinner; + private final UnitSelector maximumStabilityUnitSelector; + private final JLabel bestValueLabel; + private final JLabel stepCountLabel; + private final JLabel evaluationCountLabel; + private final JLabel stepSizeLabel; + private final RocketFigure figure; + private final JToggleButton startButton; + private final JButton plotButton; + private final JButton saveButton; + + private final JButton applyButton; + private final JButton resetButton; + private final JButton closeButton; + + private final List selectedModifiers = new ArrayList(); + + /** List of components to disable while optimization is running */ + private final List disableComponents = new ArrayList(); + + /** Whether optimization is currently running or not */ + private boolean running = false; + /** The optimization worker that is running */ + private OptimizationWorker worker = null; + + + private double bestValue = Double.NaN; + private Unit bestValueUnit = Unit.NOUNIT2; + private int stepCount = 0; + private int evaluationCount = 0; + private double stepSize = 0; + + private final Map evaluationHistory = new LinkedHashMap(); + private final List optimizationPath = new LinkedList(); + + + private boolean updating = false; + + + /** + * Sole constructor. + * + * @param document the document + * @param parent the parent window + */ public GeneralOptimizationDialog(OpenRocketDocument document, Window parent) { - super(parent, "Rocket optimization"); + super(parent, trans.get("title")); this.baseDocument = document; - this.rocketCopy = document.getRocket().copyWithOriginalID(); + this.documentCopy = document.copy(); loadOptimizationParameters(); loadSimulationModifiers(); - + JPanel sub; + JLabel label; + JScrollPane scroll; + String tip; + JPanel panel = new JPanel(new MigLayout("fill")); - JTree tree = new SimulationModifierTree(rocketCopy, simulationModifiers); - JScrollPane scroll = new JScrollPane(tree); - panel.add(scroll, "width 300lp, height 300lp"); + ChangeListener clearHistoryChangeListener = new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + clearHistory(); + } + }; + ActionListener clearHistoryActionListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + clearHistory(); + } + }; + + + + //// Selected modifiers table + + selectedModifierTableModel = new ParameterSelectionTableModel(); + selectedModifierTable = new JTable(selectedModifierTableModel); + selectedModifierTable.setDefaultRenderer(Double.class, new DoubleCellRenderer()); + selectedModifierTable.setRowSelectionAllowed(true); + selectedModifierTable.setColumnSelectionAllowed(false); + selectedModifierTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + // Make sure spinner editor fits into the cell height + selectedModifierTable.setRowHeight(new JSpinner().getPreferredSize().height - 4); + + selectedModifierTable.setDefaultEditor(Double.class, new DoubleCellEditor()); + selectedModifierTable.setDefaultEditor(Unit.class, new UnitCellEditor() { + @Override + protected UnitGroup getUnitGroup(Unit value, int row, int column) { + return selectedModifiers.get(row).getUnitGroup(); + } + }); + + disableComponents.add(selectedModifierTable); + + selectedModifierTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + updateComponents(); + } + }); + + // Set column widths + TableColumnModel columnModel = selectedModifierTable.getColumnModel(); + columnModel.getColumn(0).setPreferredWidth(150); + columnModel.getColumn(1).setPreferredWidth(40); + columnModel.getColumn(2).setPreferredWidth(40); + columnModel.getColumn(3).setPreferredWidth(40); + + scroll = new JScrollPane(selectedModifierTable); + + label = new StyledLabel(trans.get("lbl.paramsToOptimize"), Style.BOLD); + disableComponents.add(label); + panel.add(label, "split 3, flowy"); + panel.add(scroll, "wmin 300lp, height 200lp, grow"); + selectedModifierDescription = new DescriptionArea(2, -3); + disableComponents.add(selectedModifierDescription); + panel.add(selectedModifierDescription, "growx"); + + + + //// Add/remove buttons + sub = new JPanel(new MigLayout("fill")); + + addButton = new JButton(Chars.LEFT_ARROW + " " + trans.get("btn.add") + " "); + addButton.setToolTipText(trans.get("btn.add.ttip")); + addButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + SimulationModifier mod = getSelectedAvailableModifier(); + if (mod != null) { + addModifier(mod); + clearHistory(); + } else { + log.error("Attempting to add simulation modifier when none is selected"); + } + } + }); + disableComponents.add(addButton); + sub.add(addButton, "wrap para, sg button"); + + removeButton = new JButton(" " + trans.get("btn.remove") + " " + Chars.RIGHT_ARROW); + removeButton.setToolTipText(trans.get("btn.remove.ttip")); + removeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + SimulationModifier mod = getSelectedModifier(); + if (mod == null) { + log.error("Attempting to remove simulation modifier when none is selected"); + return; + } + removeModifier(mod); + clearHistory(); + } + }); + disableComponents.add(removeButton); + sub.add(removeButton, "wrap para*2, sg button"); + + removeAllButton = new JButton(trans.get("btn.removeAll")); + removeAllButton.setToolTipText(trans.get("btn.removeAll.ttip")); + removeAllButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("Removing all selected modifiers"); + selectedModifiers.clear(); + selectedModifierTableModel.fireTableDataChanged(); + availableModifierTree.repaint(); + clearHistory(); + } + }); + disableComponents.add(removeAllButton); + sub.add(removeAllButton, "wrap para, sg button"); + + panel.add(sub); + + + + //// Available modifier tree + availableModifierTree = new SimulationModifierTree(documentCopy.getRocket(), simulationModifiers, selectedModifiers); + availableModifierTree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { + @Override + public void valueChanged(TreeSelectionEvent e) { + updateComponents(); + } + }); + + // Handle double-click + availableModifierTree.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + if (e.getClickCount() == 2) { + SimulationModifier mod = getSelectedAvailableModifier(); + if (mod != null) { + addModifier(mod); + clearHistory(); + } else { + log.user("Double-clicked non-available option"); + } + } + } + }); + + disableComponents.add(availableModifierTree); + scroll = new JScrollPane(availableModifierTree); + label = new StyledLabel(trans.get("lbl.availableParams"), Style.BOLD); + disableComponents.add(label); + panel.add(label, "split 2, flowy"); + panel.add(scroll, "width 300lp, height 200lp, grow, wrap para*2"); + + + + + //// Optimization options sub-panel + + sub = new JPanel(new MigLayout("fill")); + TitledBorder border = BorderFactory.createTitledBorder(trans.get("lbl.optimizationOpts")); + GUIUtil.changeFontStyle(border, Font.BOLD); + sub.setBorder(border); + disableComponents.add(sub); + + + //// Simulation to optimize + + label = new JLabel(trans.get("lbl.optimizeSim")); + tip = trans.get("lbl.optimizeSim.ttip"); + label.setToolTipText(tip); + disableComponents.add(label); + sub.add(label, ""); + + simulationSelectionCombo = new JComboBox(); + simulationSelectionCombo.setToolTipText(tip); + populateSimulations(); + simulationSelectionCombo.addActionListener(clearHistoryActionListener); + disableComponents.add(simulationSelectionCombo); + sub.add(simulationSelectionCombo, "growx, wrap unrel"); + + + + //// Value to optimize + label = new JLabel(trans.get("lbl.optimizeValue")); + tip = trans.get("lbl.optimizeValue.ttip"); + label.setToolTipText(tip); + disableComponents.add(label); + sub.add(label, ""); + + optimizationParameterCombo = new JComboBox(); + optimizationParameterCombo.setToolTipText(tip); + populateParameters(); + optimizationParameterCombo.addActionListener(clearHistoryActionListener); + disableComponents.add(optimizationParameterCombo); + sub.add(optimizationParameterCombo, "growx, wrap unrel"); + + + + //// Optimization goal + label = new JLabel(trans.get("lbl.optimizeGoal")); + tip = trans.get("lbl.optimizeGoal"); + label.setToolTipText(tip); + disableComponents.add(label); + sub.add(label, ""); + + optimizationGoalCombo = new JComboBox(new String[] { GOAL_MAXIMIZE, GOAL_MINIMIZE, GOAL_SEEK }); + optimizationGoalCombo.setToolTipText(tip); + optimizationGoalCombo.setEditable(false); + optimizationGoalCombo.addActionListener(clearHistoryActionListener); + disableComponents.add(optimizationGoalCombo); + sub.add(optimizationGoalCombo, "growx"); + + + //// Optimization custom value + optimizationSeekValue = new DoubleModel(0, UnitGroup.UNITS_NONE); + optimizationSeekValue.addChangeListener(clearHistoryChangeListener); + + optimizationGoalSpinner = new JSpinner(optimizationSeekValue.getSpinnerModel()); + tip = trans.get("lbl.optimizeGoalValue.ttip"); + optimizationGoalSpinner.setToolTipText(tip); + optimizationGoalSpinner.setEditor(new SpinnerEditor(optimizationGoalSpinner)); + disableComponents.add(optimizationGoalSpinner); + sub.add(optimizationGoalSpinner, "width 30lp"); + + optimizationGoalUnitSelector = new UnitSelector(optimizationSeekValue); + optimizationGoalUnitSelector.setToolTipText(tip); + disableComponents.add(optimizationGoalUnitSelector); + sub.add(optimizationGoalUnitSelector, "width 20lp, wrap unrel"); + + + panel.add(sub, "grow"); + + + + //// Required stability sub-panel + + sub = new JPanel(new MigLayout("fill")); + border = BorderFactory.createTitledBorder(trans.get("lbl.requireStability")); + GUIUtil.changeFontStyle(border, Font.BOLD); + sub.setBorder(border); + disableComponents.add(sub); + + + + double ref = CaliberUnit.calculateCaliber(baseDocument.getRocket()); + minimumStability = new DoubleModel(ref, UnitGroup.stabilityUnits(ref)); + maximumStability = new DoubleModel(5 * ref, UnitGroup.stabilityUnits(ref)); + minimumStability.addChangeListener(clearHistoryChangeListener); + maximumStability.addChangeListener(clearHistoryChangeListener); + + + //// Minimum stability + tip = trans.get("lbl.requireMinStability.ttip"); + minimumStabilitySelected = new JCheckBox(trans.get("lbl.requireMinStability")); + minimumStabilitySelected.setSelected(true); + minimumStabilitySelected.setToolTipText(tip); + minimumStabilitySelected.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + updateComponents(); + } + }); + disableComponents.add(minimumStabilitySelected); + sub.add(minimumStabilitySelected); + + minimumStabilitySpinner = new JSpinner(minimumStability.getSpinnerModel()); + minimumStabilitySpinner.setToolTipText(tip); + minimumStabilitySpinner.setEditor(new SpinnerEditor(minimumStabilitySpinner)); + disableComponents.add(minimumStabilitySpinner); + sub.add(minimumStabilitySpinner, "growx"); + + minimumStabilityUnitSelector = new UnitSelector(minimumStability); + minimumStabilityUnitSelector.setToolTipText(tip); + disableComponents.add(minimumStabilityUnitSelector); + sub.add(minimumStabilityUnitSelector, "growx, wrap unrel"); + + + //// Maximum stability + tip = trans.get("lbl.requireMaxStability.ttip"); + maximumStabilitySelected = new JCheckBox(trans.get("lbl.requireMaxStability")); + maximumStabilitySelected.setToolTipText(tip); + maximumStabilitySelected.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + updateComponents(); + } + }); + disableComponents.add(maximumStabilitySelected); + sub.add(maximumStabilitySelected); + + maximumStabilitySpinner = new JSpinner(maximumStability.getSpinnerModel()); + maximumStabilitySpinner.setToolTipText(tip); + maximumStabilitySpinner.setEditor(new SpinnerEditor(maximumStabilitySpinner)); + disableComponents.add(maximumStabilitySpinner); + sub.add(maximumStabilitySpinner, "growx"); + + maximumStabilityUnitSelector = new UnitSelector(maximumStability); + maximumStabilityUnitSelector.setToolTipText(tip); + disableComponents.add(maximumStabilityUnitSelector); + sub.add(maximumStabilityUnitSelector, "growx, wrap para"); + + + + // DescriptionArea desc = new DescriptionArea("Stability requirements are verified during each time step of the simulation.", + // 2, -2, false); + // desc.setViewportBorder(null); + // disableComponents.add(desc); + // sub.add(desc, "span, growx"); + + + panel.add(sub, "span 2, grow, wrap para*2"); + + + + + //// Rocket figure + figure = new RocketFigure(getSelectedSimulation().getConfiguration()); + figure.setBorderPixels(1, 1); + ScaleScrollPane figureScrollPane = new ScaleScrollPane(figure); + figureScrollPane.setFitting(true); + panel.add(figureScrollPane, "span, split, height 200lp, grow"); + + + sub = new JPanel(new MigLayout("fill")); + + + label = new JLabel(trans.get("status.bestValue")); + tip = trans.get("status.bestValue.ttip"); + label.setToolTipText(tip); + sub.add(label, "gapright unrel"); + + bestValueLabel = new JLabel(); + bestValueLabel.setToolTipText(tip); + sub.add(bestValueLabel, "wmin 60lp, wrap rel"); + + + label = new JLabel(trans.get("status.stepCount")); + tip = trans.get("status.stepCount.ttip"); + label.setToolTipText(tip); + sub.add(label, "gapright unrel"); + + stepCountLabel = new JLabel(); + stepCountLabel.setToolTipText(tip); + sub.add(stepCountLabel, "wrap rel"); + + + label = new JLabel(trans.get("status.evalCount")); + tip = trans.get("status.evalCount"); + label.setToolTipText(tip); + sub.add(label, "gapright unrel"); + + evaluationCountLabel = new JLabel(); + evaluationCountLabel.setToolTipText(tip); + sub.add(evaluationCountLabel, "wrap rel"); + + + label = new JLabel(trans.get("status.stepSize")); + tip = trans.get("status.stepSize.ttip"); + label.setToolTipText(tip); + sub.add(label, "gapright unrel"); + + stepSizeLabel = new JLabel(); + stepSizeLabel.setToolTipText(tip); + sub.add(stepSizeLabel, "wrap para"); + + + //// Start/Stop button + + startButton = new JToggleButton(START_TEXT); + startButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (updating) { + log.debug("Updating, ignoring event"); + return; + } + if (running) { + log.user("Stopping optimization"); + stopOptimization(); + } else { + log.user("Starting optimization"); + startOptimization(); + } + } + }); + sub.add(startButton, "span, growx, wrap para*2"); + + + plotButton = new JButton(trans.get("btn.plotPath")); + plotButton.setToolTipText(trans.get("btn.plotPath.ttip")); + plotButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("Plotting optimization path, dimensionality=" + selectedModifiers.size()); + OptimizationPlotDialog dialog = new OptimizationPlotDialog(optimizationPath, evaluationHistory, + selectedModifiers, getSelectedParameter(), + UnitGroup.stabilityUnits(getSelectedSimulation().getRocket()), + GeneralOptimizationDialog.this); + dialog.setVisible(true); + } + }); + disableComponents.add(plotButton); + sub.add(plotButton, "span, growx, wrap"); + + + saveButton = new JButton(trans.get("btn.save")); + saveButton.setToolTipText(trans.get("btn.save.ttip")); + saveButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("User selected save path"); + savePath(); + } + }); + disableComponents.add(saveButton); + sub.add(saveButton, "span, growx"); + + + + panel.add(sub, "wrap para*2"); + + + + + //// Bottom buttons + + applyButton = new JButton(trans.get("btn.apply")); + applyButton.setToolTipText(trans.get("btn.apply.ttip")); + applyButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("Applying optimization changes"); + applyDesign(); + } + }); + disableComponents.add(applyButton); + panel.add(applyButton, "span, split, gapright para, right"); + + resetButton = new JButton(trans.get("btn.reset")); + resetButton.setToolTipText(trans.get("btn.reset.ttip")); + resetButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("Resetting optimization design"); + resetDesign(); + } + }); + disableComponents.add(resetButton); + panel.add(resetButton, "gapright para, right"); + + closeButton = new JButton(trans.get("btn.close")); + closeButton.setToolTipText(trans.get("btn.close.ttip")); + closeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + log.user("Closing optimization dialog"); + stopOptimization(); + GeneralOptimizationDialog.this.dispose(); + } + }); + panel.add(closeButton, "right"); this.add(panel); + clearHistory(); + updateComponents(); GUIUtil.setDisposableDialogOptions(this, null); } + private void startOptimization() { + if (running) { + log.info("Optimization already running"); + return; + } + + + if (selectedModifiers.isEmpty()) { + JOptionPane.showMessageDialog(this, trans.get("error.selectParams.text"), + trans.get("error.selectParams.title"), JOptionPane.ERROR_MESSAGE); + updating = true; + startButton.setSelected(false); + startButton.setText(START_TEXT); + updating = false; + return; + } + + + running = true; + + // Update the button status + updating = true; + startButton.setSelected(true); + startButton.setText(STOP_TEXT); + updating = false; + + + // Create a copy of the simulation (we're going to modify the original in the current thread) + Simulation simulation = getSelectedSimulation(); + Rocket rocketCopy = simulation.getRocket().copyWithOriginalID(); + simulation = simulation.duplicateSimulation(rocketCopy); + + OptimizableParameter parameter = getSelectedParameter(); + + OptimizationGoal goal; + String value = (String) optimizationGoalCombo.getSelectedItem(); + if (GOAL_MAXIMIZE.equals(value)) { + goal = new MaximizationGoal(); + } else if (GOAL_MINIMIZE.equals(value)) { + goal = new MinimizationGoal(); + } else if (GOAL_SEEK.equals(value)) { + goal = new ValueSeekGoal(optimizationSeekValue.getValue()); + } else { + throw new BugException("optimizationGoalCombo had invalid value: " + value); + } + + SimulationDomain domain; + if (minimumStabilitySelected.isSelected() || maximumStabilitySelected.isSelected()) { + double min, max; + boolean minAbsolute, maxAbsolute; + + /* + * Make minAbsolute/maxAbsolute consistent with each other to produce reasonable + * result in plot tool tips. Yes, this is a bit ugly. + */ + + // Min stability + Unit unit = minimumStability.getCurrentUnit(); + if (unit instanceof CaliberUnit) { + min = unit.toUnit(minimumStability.getValue()); + minAbsolute = false; + } else { + min = minimumStability.getValue(); + minAbsolute = true; + } + + // Max stability + unit = maximumStability.getCurrentUnit(); + if (unit instanceof CaliberUnit) { + max = unit.toUnit(maximumStability.getValue()); + maxAbsolute = false; + } else { + max = maximumStability.getValue(); + maxAbsolute = true; + } + + + if (!minimumStabilitySelected.isSelected()) { + min = Double.NaN; + minAbsolute = maxAbsolute; + } + if (!maximumStabilitySelected.isSelected()) { + max = Double.NaN; + maxAbsolute = minAbsolute; + } + + domain = new StabilityDomain(min, minAbsolute, max, maxAbsolute); + } else { + domain = new IdentitySimulationDomain(); + } + + SimulationModifier[] modifiers = selectedModifiers.toArray(new SimulationModifier[0]); + + // Create and start the background worker + worker = new OptimizationWorker(simulation, parameter, goal, domain, modifiers) { + @Override + protected void done(OptimizationException exception) { + log.info("Optimization finished, exception=" + exception, exception); + + if (exception != null) { + JOptionPane.showMessageDialog(GeneralOptimizationDialog.this, + new Object[] { + trans.get("error.optimizationFailure.text"), + exception.getLocalizedMessage() + }, trans.get("error.optimizationFailure.title"), JOptionPane.ERROR_MESSAGE); + } + + worker = null; + stopOptimization(); + } + + @Override + protected void functionEvaluated(List data) { + for (FunctionEvaluationData d : data) { + evaluationHistory.put(d.getPoint(), d); + evaluationCount++; + } + updateCounters(); + } + + @Override + protected void optimizationStepTaken(List data) { + + // Add starting point to the path + if (optimizationPath.isEmpty()) { + optimizationPath.add(data.get(0).getOldPoint()); + } + + // Add other points to the path + for (OptimizationStepData d : data) { + optimizationPath.add(d.getNewPoint()); + } + + // Get function value from the latest point + OptimizationStepData latest = data.get(data.size() - 1); + Point newPoint = latest.getNewPoint(); + + FunctionEvaluationData pointValue = evaluationHistory.get(newPoint); + if (pointValue != null) { + bestValue = pointValue.getParameterValue().getValue(); + } else { + log.error("History does not contain point " + newPoint); + bestValue = Double.NaN; + } + + // Update the simulation + Simulation sim = getSelectedSimulation(); + for (int i = 0; i < newPoint.dim(); i++) { + try { + selectedModifiers.get(i).modify(sim, newPoint.get(i)); + } catch (OptimizationException e) { + throw new BugException("Simulation modifier failed to modify the base simulation " + + "modifier=" + selectedModifiers.get(i), e); + } + } + figure.updateFigure(); + + // Update other counter data + stepCount += data.size(); + stepSize = latest.getStepSize(); + updateCounters(); + } + }; + worker.start(); + + + clearHistory(); + + updateComponents(); + } + + private void stopOptimization() { + if (!running) { + log.info("Optimization not running"); + return; + } + + if (worker != null && worker.isAlive()) { + log.info("Worker still running, interrupting it and setting to null"); + worker.interrupt(); + worker = null; + return; + } + + running = false; + + // Update the button status + updating = true; + startButton.setSelected(false); + startButton.setText(START_TEXT); + updating = false; + + + updateComponents(); + } + + + + + /** + * Reset the current optimization history and values. This does not reset the design. + */ + private void clearHistory() { + evaluationHistory.clear(); + optimizationPath.clear(); + bestValue = Double.NaN; + bestValueUnit = getSelectedParameter().getUnitGroup().getDefaultUnit(); + stepCount = 0; + evaluationCount = 0; + stepSize = 0.5; + updateCounters(); + updateComponents(); + } + + + private void applyDesign() { + // TODO: MEDIUM: Apply also potential changes to simulations + Rocket src = getSelectedSimulation().getRocket().copyWithOriginalID(); + Rocket dest = baseDocument.getRocket(); + try { + baseDocument.startUndo(trans.get("undoText")); + dest.freeze(); + + // Remove all children + while (dest.getChildCount() > 0) { + dest.removeChild(0); + } + + // Move all children to the destination rocket + while (src.getChildCount() > 0) { + RocketComponent c = src.getChild(0); + src.removeChild(0); + dest.addChild(c); + } + + } finally { + dest.thaw(); + baseDocument.stopUndo(); + } + } + + + private void resetDesign() { + clearHistory(); + + documentCopy = baseDocument.copy(); + + loadOptimizationParameters(); + loadSimulationModifiers(); + + // Replace selected modifiers with corresponding new modifiers + List newSelected = new ArrayList(); + for (SimulationModifier original : selectedModifiers) { + List newModifiers = simulationModifiers.get(original.getRelatedObject()); + if (newModifiers != null) { + int index = newModifiers.indexOf(original); + if (index >= 0) { + newSelected.add(newModifiers.get(index)); + } + } + } + selectedModifiers.clear(); + selectedModifiers.addAll(newSelected); + selectedModifierTableModel.fireTableDataChanged(); + + // Update the available modifier tree + availableModifierTree.populateTree(documentCopy.getRocket(), simulationModifiers); + availableModifierTree.expandComponents(); + + + // Update selectable simulations + populateSimulations(); + + // Update selectable parameters + populateParameters(); + + } + + + private void populateSimulations() { + String current = null; + Object selection = simulationSelectionCombo.getSelectedItem(); + if (selection != null) { + current = selection.toString(); + } + + + List> simulations = new ArrayList>(); + Rocket rocket = documentCopy.getRocket(); + + for (Simulation s : documentCopy.getSimulations()) { + String id = s.getConfiguration().getMotorConfigurationID(); + String name = createSimulationName(s.getName(), rocket.getMotorConfigurationNameOrDescription(id)); + simulations.add(new Named(s, name)); + } + + for (String id : rocket.getMotorConfigurationIDs()) { + if (id == null) { + continue; + } + Simulation sim = new Simulation(rocket); + sim.getConfiguration().setMotorConfigurationID(id); + String name = createSimulationName(trans.get("basicSimulationName"), rocket.getMotorConfigurationNameOrDescription(id)); + simulations.add(new Named(sim, name)); + } + + + Simulation sim = new Simulation(rocket); + sim.getConfiguration().setMotorConfigurationID(null); + String name = createSimulationName(trans.get("noSimulationName"), rocket.getMotorConfigurationNameOrDescription(null)); + simulations.add(new Named(sim, name)); + + + simulationSelectionCombo.setModel(new DefaultComboBoxModel(simulations.toArray())); + + if (current != null) { + for (int i = 0; i < simulations.size(); i++) { + if (simulations.get(i).toString().equals(current)) { + simulationSelectionCombo.setSelectedIndex(i); + break; + } + } + } + } + + + private void populateParameters() { + String current = null; + Object selection = optimizationParameterCombo.getSelectedItem(); + if (selection != null) { + current = selection.toString(); + } else { + // Default to apogee altitude event if it is not the first one in the list + current = trans.get("MaximumAltitudeParameter.name"); + } + + List> parameters = new ArrayList>(); + for (OptimizableParameter p : optimizationParameters) { + parameters.add(new Named(p, p.getName())); + } + + optimizationParameterCombo.setModel(new DefaultComboBoxModel(parameters.toArray())); + + for (int i = 0; i < parameters.size(); i++) { + if (parameters.get(i).toString().equals(current)) { + optimizationParameterCombo.setSelectedIndex(i); + break; + } + } + } + + private void updateCounters() { + bestValueLabel.setText(bestValueUnit.toStringUnit(bestValue)); + stepCountLabel.setText("" + stepCount); + evaluationCountLabel.setText("" + evaluationCount); + stepSizeLabel.setText(UnitGroup.UNITS_RELATIVE.toStringUnit(stepSize)); + } + + private void loadOptimizationParameters() { - optimizationParameters.addAll(OptimizationServiceHelper.getOptimizableParameters(baseDocument)); + optimizationParameters.clear(); + optimizationParameters.addAll(OptimizationServiceHelper.getOptimizableParameters(documentCopy)); if (optimizationParameters.isEmpty()) { throw new BugException("No rocket optimization parameters found, distribution built wrong."); @@ -76,8 +1057,9 @@ public class GeneralOptimizationDialog extends JDialog { private void loadSimulationModifiers() { + simulationModifiers.clear(); - for (SimulationModifier m : OptimizationServiceHelper.getSimulationModifiers(baseDocument)) { + for (SimulationModifier m : OptimizationServiceHelper.getSimulationModifiers(documentCopy)) { Object key = m.getRelatedObject(); List list = simulationModifiers.get(key); if (list == null) { @@ -99,6 +1081,464 @@ public class GeneralOptimizationDialog extends JDialog { } + + + private void addModifier(SimulationModifier mod) { + if (!selectedModifiers.contains(mod)) { + log.user(1, "Adding simulation modifier " + mod); + selectedModifiers.add(mod); + Collections.sort(selectedModifiers, new SimulationModifierComparator()); + selectedModifierTableModel.fireTableDataChanged(); + availableModifierTree.repaint(); + } else { + log.user(1, "Attempting to add an already existing simulation modifier " + mod); + } + } + + + private void removeModifier(SimulationModifier mod) { + log.user(1, "Removing simulation modifier " + mod); + selectedModifiers.remove(mod); + selectedModifierTableModel.fireTableDataChanged(); + availableModifierTree.repaint(); + } + + + + /** + * Update the enabled status of all components in the dialog. + */ + private void updateComponents() { + + if (updating) { + return; + } + + updating = true; + + + // First enable all components if optimization not running + if (!running) { + for (JComponent c : disableComponents) { + c.setEnabled(true); + } + } + + + // "Add" button + SimulationModifier mod = getSelectedAvailableModifier(); + if (mod != null && !selectedModifiers.contains(mod)) { + addButton.setEnabled(true); + } else { + addButton.setEnabled(false); + } + + // "Remove" button + removeButton.setEnabled(selectedModifierTable.getSelectedRow() >= 0); + + // "Remove all" button + removeAllButton.setEnabled(!selectedModifiers.isEmpty()); + + + // Optimization goal + String selected = (String) optimizationGoalCombo.getSelectedItem(); + if (GOAL_SEEK.equals(selected)) { + optimizationGoalSpinner.setVisible(true); + optimizationGoalUnitSelector.setVisible(true); + } else { + optimizationGoalSpinner.setVisible(false); + optimizationGoalUnitSelector.setVisible(false); + } + + + // Minimum/maximum stability options + minimumStabilitySpinner.setEnabled(minimumStabilitySelected.isSelected()); + minimumStabilityUnitSelector.setEnabled(minimumStabilitySelected.isSelected()); + maximumStabilitySpinner.setEnabled(maximumStabilitySelected.isSelected()); + maximumStabilityUnitSelector.setEnabled(maximumStabilitySelected.isSelected()); + + + // Plot button (enabled if path exists and dimensionality is 1 or 2) + plotButton.setEnabled(!optimizationPath.isEmpty() && (selectedModifiers.size() == 1 || selectedModifiers.size() == 2)); + + // Save button (enabled if path exists) + saveButton.setEnabled(!optimizationPath.isEmpty()); + + + // Last disable all components if optimization is running + if (running) { + for (JComponent c : disableComponents) { + c.setEnabled(false); + } + } + + + // Update description text + mod = getSelectedModifier(); + if (mod != null) { + selectedModifierDescription.setText(mod.getDescription()); + } else { + selectedModifierDescription.setText(""); + } + + + // Update the figure + figure.setConfiguration(getSelectedSimulation().getConfiguration()); + + updating = false; + } + + + private void savePath() { + + if (evaluationHistory.isEmpty()) { + throw new BugException("evaluation history is empty"); + } + + CsvOptionPanel csvOptions = new CsvOptionPanel(GeneralOptimizationDialog.class, + trans.get("export.header"), trans.get("export.header.ttip")); + + + JFileChooser chooser = new JFileChooser(); + chooser.setFileFilter(FileHelper.CSV_FILE_FILTER); + chooser.setCurrentDirectory(Prefs.getDefaultDirectory()); + chooser.setAccessory(csvOptions); + + if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) + return; + + File file = chooser.getSelectedFile(); + if (file == null) + return; + + file = FileHelper.ensureExtension(file, "csv"); + if (!FileHelper.confirmWrite(file, this)) { + return; + } + + String fieldSeparator = csvOptions.getFieldSeparator(); + String commentCharacter = csvOptions.getCommentCharacter(); + boolean includeHeader = csvOptions.getSelectionOption(0); + csvOptions.storePreferences(); + + log.info("Saving optimization path to " + file + ", fieldSeparator=" + fieldSeparator + + ", commentCharacter=" + commentCharacter + ", includeHeader=" + includeHeader); + + try { + Writer writer = new BufferedWriter(new FileWriter(file)); + + // Write header + if (includeHeader) { + FunctionEvaluationData data = evaluationHistory.values().iterator().next(); + + writer.write(commentCharacter); + for (SimulationModifier mod : selectedModifiers) { + writer.write(mod.getRelatedObject().toString() + ": " + mod.getName() + " / " + + mod.getUnitGroup().getDefaultUnit().getUnit()); + writer.write(fieldSeparator); + } + if (minimumStabilitySelected.isSelected() || maximumStabilitySelected.isSelected()) { + writer.write(trans.get("export.stability") + " / " + data.getDomainReference().getUnit().getUnit()); + writer.write(fieldSeparator); + } + writer.write(getSelectedParameter().getName() + " / " + + getSelectedParameter().getUnitGroup().getDefaultUnit().getUnit()); + + writer.write("\n"); + } + + + for (FunctionEvaluationData data : evaluationHistory.values()) { + Value[] state = data.getState(); + + for (int i = 0; i < state.length; i++) { + writer.write(TextUtil.doubleToString(state[i].getUnitValue())); + writer.write(fieldSeparator); + } + + if (minimumStabilitySelected.isSelected() || maximumStabilitySelected.isSelected()) { + writer.write(TextUtil.doubleToString(data.getDomainReference().getUnitValue())); + writer.write(fieldSeparator); + } + + if (data.getParameterValue() != null) { + writer.write(TextUtil.doubleToString(data.getParameterValue().getUnitValue())); + } else { + writer.write("N/A"); + } + writer.write("\n"); + } + + writer.close(); + log.info("File successfully saved"); + + } catch (IOException e) { + FileHelper.errorWriting(e, this); + } + + } + + /** + * Return the currently selected available simulation modifier from the modifier tree, + * or null if none selected. + */ + private SimulationModifier getSelectedAvailableModifier() { + TreePath treepath = availableModifierTree.getSelectionPath(); + if (treepath != null) { + Object o = ((DefaultMutableTreeNode) treepath.getLastPathComponent()).getUserObject(); + if (o instanceof SimulationModifier) { + return (SimulationModifier) o; + } + } + return null; + } + + /** + * Return the currently selected simulation. + * @return the selected simulation. + */ + @SuppressWarnings("unchecked") + private Simulation getSelectedSimulation() { + return ((Named) simulationSelectionCombo.getSelectedItem()).get(); + } + + + /** + * Return the currently selected simulation modifier from the table, + * or null if none selected. + * @return the selected modifier or null. + */ + private SimulationModifier getSelectedModifier() { + int row = selectedModifierTable.getSelectedRow(); + if (row < 0) { + return null; + } + row = selectedModifierTable.convertRowIndexToModel(row); + return selectedModifiers.get(row); + } + + + /** + * Return the currently selected optimization parameter. + * @return the selected optimization parameter. + */ + @SuppressWarnings("unchecked") + private OptimizableParameter getSelectedParameter() { + return ((Named) optimizationParameterCombo.getSelectedItem()).get(); + } + + + private Unit getModifierUnit(int index) { + return selectedModifiers.get(index).getUnitGroup().getDefaultUnit(); + } + + private String createSimulationName(String simulationName, String motorConfiguration) { + String name; + boolean hasParenthesis = motorConfiguration.matches("^[\\[\\(].*[\\]\\)]$"); + name = simulationName + " "; + if (!hasParenthesis) { + name += "("; + } + name += motorConfiguration; + if (!hasParenthesis) { + name += ")"; + } + return name; + } + + /** + * The table model for the parameter selection. + * + * [Body tube: Length] [min] [max] [unit] + */ + private class ParameterSelectionTableModel extends AbstractTableModel { + + private static final int PARAMETER = 0; + private static final int CURRENT = 1; + private static final int MIN = 2; + private static final int MAX = 3; + private static final int COUNT = 4; + + @Override + public int getColumnCount() { + return COUNT; + } + + @Override + public int getRowCount() { + return selectedModifiers.size(); + } + + @Override + public String getColumnName(int column) { + switch (column) { + case PARAMETER: + return trans.get("table.col.parameter"); + case CURRENT: + return trans.get("table.col.current"); + case MIN: + return trans.get("table.col.min"); + case MAX: + return trans.get("table.col.max"); + default: + throw new IndexOutOfBoundsException("column=" + column); + } + + } + + @Override + public Class getColumnClass(int column) { + switch (column) { + case PARAMETER: + return String.class; + case CURRENT: + return Double.class; + case MIN: + return Double.class; + case MAX: + return Double.class; + default: + throw new IndexOutOfBoundsException("column=" + column); + } + } + + @Override + public Object getValueAt(int row, int column) { + + SimulationModifier modifier = selectedModifiers.get(row); + + switch (column) { + case PARAMETER: + return modifier.getRelatedObject().toString() + ": " + modifier.getName(); + case CURRENT: + try { + return getModifierUnit(row).toUnit(modifier.getCurrentSIValue(getSelectedSimulation())); + } catch (OptimizationException e) { + throw new BugException("Could not read current SI value from modifier " + modifier, e); + } + case MIN: + return getModifierUnit(row).toUnit(modifier.getMinValue()); + case MAX: + return getModifierUnit(row).toUnit(modifier.getMaxValue()); + default: + throw new IndexOutOfBoundsException("column=" + column); + } + + } + + @Override + public void setValueAt(Object value, int row, int column) { + + switch (column) { + case PARAMETER: + break; + + case MIN: + double min = (Double) value; + min = getModifierUnit(row).fromUnit(min); + selectedModifiers.get(row).setMinValue(min); + break; + + case CURRENT: + break; + + case MAX: + double max = (Double) value; + max = getModifierUnit(row).fromUnit(max); + selectedModifiers.get(row).setMaxValue(max); + break; + + default: + throw new IndexOutOfBoundsException("column=" + column); + } + this.fireTableRowsUpdated(row, row); + + } + + @Override + public boolean isCellEditable(int row, int column) { + switch (column) { + case PARAMETER: + return false; + case CURRENT: + return false; + case MIN: + return true; + case MAX: + return true; + default: + throw new IndexOutOfBoundsException("column=" + column); + } + } + + } + + + private class DoubleCellRenderer extends DefaultTableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + + super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + double val = (Double) value; + Unit unit = getModifierUnit(row); + + val = unit.fromUnit(val); + this.setText(unit.toStringUnit(val)); + + return this; + } + } + + + private static class SimulationModifierComparator implements Comparator { + + @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/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationPlotDialog.java b/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationPlotDialog.java new file mode 100644 index 00000000..da91712a --- /dev/null +++ b/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationPlotDialog.java @@ -0,0 +1,356 @@ +package net.sf.openrocket.gui.dialogs.optimization; + +import java.awt.Color; +import java.awt.Paint; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.gui.components.StyledLabel; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.Point; +import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.Unit; +import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.unit.Value; +import net.sf.openrocket.util.GUIUtil; +import net.sf.openrocket.util.LinearInterpolator; +import net.sf.openrocket.util.MathUtil; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.AxisLocation; +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.labels.CustomXYToolTipGenerator; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.renderer.PaintScale; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; +import org.jfree.chart.renderer.xy.XYShapeRenderer; +import org.jfree.chart.title.PaintScaleLegend; +import org.jfree.data.xy.DefaultXYZDataset; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; +import org.jfree.ui.RectangleEdge; + +/** + * A class that plots the path of an optimization. + * + * @author Sampo Niskanen + */ +public class OptimizationPlotDialog extends JDialog { + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + + + private static final LinearInterpolator RED = new LinearInterpolator( + new double[] { 0.0, 1.0 }, new double[] { 0.0, 1.0 } + ); + private static final LinearInterpolator GREEN = new LinearInterpolator( + new double[] { 0.0, 1.0 }, new double[] { 0.0, 0.0 } + ); + private static final LinearInterpolator BLUE = new LinearInterpolator( + new double[] { 0.0, 1.0 }, new double[] { 1.0, 0.0 } + ); + + private static final Color OUT_OF_DOMAIN_COLOR = Color.BLACK; + + private static final Color PATH_COLOR = new Color(220, 0, 0); + + + public OptimizationPlotDialog(List path, Map evaluations, + List modifiers, OptimizableParameter parameter, UnitGroup stabilityUnit, Window parent) { + super(parent, trans.get("title"), ModalityType.APPLICATION_MODAL); + + + JPanel panel = new JPanel(new MigLayout("fill")); + + ChartPanel chart; + if (modifiers.size() == 1) { + chart = create1DPlot(path, evaluations, modifiers, parameter, stabilityUnit); + } else if (modifiers.size() == 2) { + chart = create2DPlot(path, evaluations, modifiers, parameter, stabilityUnit); + } else { + throw new IllegalArgumentException("Invalid dimensionality, dim=" + modifiers.size()); + } + chart.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + panel.add(chart, "span, grow, wrap para"); + + + JLabel label = new StyledLabel(trans.get("lbl.zoomInstructions"), -2); + panel.add(label, ""); + + + JButton close = new JButton(trans.get("button.close")); + close.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + OptimizationPlotDialog.this.setVisible(false); + } + }); + panel.add(close, "right"); + + + this.add(panel); + + GUIUtil.setDisposableDialogOptions(this, close); + } + + + + /** + * Create a 1D plot of the optimization path. + */ + private ChartPanel create1DPlot(List path, Map evaluations, + List modifiers, OptimizableParameter parameter, UnitGroup stabilityUnit) { + + SimulationModifier modX = modifiers.get(0); + Unit xUnit = modX.getUnitGroup().getDefaultUnit(); + Unit yUnit = parameter.getUnitGroup().getDefaultUnit(); + + // Create the optimization path (with autosort) + XYSeries series = new XYSeries(trans.get("plot1d.series"), true, true); + List tooltips = new ArrayList(); + for (Point p : evaluations.keySet()) { + FunctionEvaluationData data = evaluations.get(p); + if (data != null) { + if (data.getParameterValue() != null) { + Value[] state = data.getState(); + series.add(xUnit.toUnit(state[0].getValue()), yUnit.toUnit(data.getParameterValue().getValue())); + tooltips.add(getTooltip(data, parameter)); + } + } else { + log.error("Could not find evaluation data for point " + p); + } + } + + + String xLabel = modX.getRelatedObject().toString() + ": " + modX.getName() + " / " + xUnit.getUnit(); + String yLabel = parameter.getName() + " / " + yUnit.getUnit(); + + JFreeChart chart = ChartFactory.createXYLineChart( + trans.get("plot1d.title"), + xLabel, + yLabel, + null, + PlotOrientation.VERTICAL, + false, // Legend + true, // Tooltips + false); // Urls + + + XYLineAndShapeRenderer lineRenderer = new XYLineAndShapeRenderer(true, true); + lineRenderer.setBaseShapesVisible(true); + lineRenderer.setSeriesShapesFilled(0, false); + //lineRenderer.setSeriesShape(0, shapeRenderer.getBaseShape()); + lineRenderer.setSeriesOutlinePaint(0, PATH_COLOR); + lineRenderer.setSeriesPaint(0, PATH_COLOR); + lineRenderer.setUseOutlinePaint(true); + CustomXYToolTipGenerator tooltipGenerator = new CustomXYToolTipGenerator(); + tooltipGenerator.addToolTipSeries(tooltips); + lineRenderer.setBaseToolTipGenerator(tooltipGenerator); + + + XYPlot plot = chart.getXYPlot(); + + plot.setDataset(0, new XYSeriesCollection(series)); + plot.setRenderer(lineRenderer); + + + + return new ChartPanel(chart); + } + + /** + * Create a 2D plot of the optimization path. + */ + private ChartPanel create2DPlot(List path, Map evaluations, + List modifiers, OptimizableParameter parameter, UnitGroup stabilityUnit) { + + Unit parameterUnit = parameter.getUnitGroup().getDefaultUnit(); + + SimulationModifier modX = modifiers.get(0); + SimulationModifier modY = modifiers.get(1); + + Unit xUnit = modX.getUnitGroup().getDefaultUnit(); + Unit yUnit = modY.getUnitGroup().getDefaultUnit(); + + // Create the optimization path dataset + XYSeries series = new XYSeries(trans.get("plot2d.path"), false, true); + List pathTooltips = new ArrayList(); + for (Point p : path) { + FunctionEvaluationData data = evaluations.get(p); + if (data != null) { + Value[] state = data.getState(); + series.add(xUnit.toUnit(state[0].getValue()), yUnit.toUnit(state[1].getValue())); + pathTooltips.add(getTooltip(data, parameter)); + } else { + log.error("Could not find evaluation data for point " + p); + } + } + + + // Create evaluations dataset + double min = Double.POSITIVE_INFINITY; + double max = Double.NEGATIVE_INFINITY; + double[][] evals = new double[3][evaluations.size()]; + List evalTooltips = new ArrayList(); + + Iterator iterator = evaluations.values().iterator(); + for (int i = 0; i < evaluations.size(); i++) { + FunctionEvaluationData data = iterator.next(); + Value param = data.getParameterValue(); + double value; + if (param != null) { + value = parameterUnit.toUnit(data.getParameterValue().getValue()); + } else { + value = Double.NaN; + } + + Value[] state = data.getState(); + evals[0][i] = xUnit.toUnit(state[0].getValue()); + evals[1][i] = yUnit.toUnit(state[1].getValue()); + evals[2][i] = value; + + if (value < min) { + min = value; + } + if (value > max) { + max = value; + } + + evalTooltips.add(getTooltip(data, parameter)); + } + DefaultXYZDataset evalDataset = new DefaultXYZDataset(); + evalDataset.addSeries(trans.get("plot2d.evals"), evals); + + + + String xLabel = modX.getRelatedObject().toString() + ": " + modX.getName() + " / " + xUnit.getUnit(); + String yLabel = modY.getRelatedObject().toString() + ": " + modY.getName() + " / " + yUnit.getUnit(); + + JFreeChart chart = ChartFactory.createXYLineChart( + trans.get("plot2d.title"), + xLabel, + yLabel, + null, + //evalDataset, + PlotOrientation.VERTICAL, + true, // Legend + true, // Tooltips + false); // Urls + + PaintScale paintScale = new GradientScale(min, max); + + XYShapeRenderer shapeRenderer = new XYShapeRenderer(); + shapeRenderer.setPaintScale(paintScale); + shapeRenderer.setUseFillPaint(true); + CustomXYToolTipGenerator tooltipGenerator = new CustomXYToolTipGenerator(); + tooltipGenerator.addToolTipSeries(evalTooltips); + shapeRenderer.setBaseToolTipGenerator(tooltipGenerator); + + + shapeRenderer.getLegendItem(0, 0); + + + XYLineAndShapeRenderer lineRenderer = new XYLineAndShapeRenderer(true, true); + lineRenderer.setBaseShapesVisible(true); + lineRenderer.setSeriesShapesFilled(0, false); + lineRenderer.setSeriesShape(0, shapeRenderer.getBaseShape()); + lineRenderer.setSeriesOutlinePaint(0, PATH_COLOR); + lineRenderer.setSeriesPaint(0, PATH_COLOR); + lineRenderer.setUseOutlinePaint(true); + tooltipGenerator = new CustomXYToolTipGenerator(); + tooltipGenerator.addToolTipSeries(pathTooltips); + lineRenderer.setBaseToolTipGenerator(tooltipGenerator); + + + XYPlot plot = chart.getXYPlot(); + + plot.setDataset(0, new XYSeriesCollection(series)); + plot.setRenderer(lineRenderer); + + plot.setDataset(1, evalDataset); + plot.setRenderer(1, shapeRenderer); + + + // Add value scale + NumberAxis numberAxis = new NumberAxis(parameter.getName() + " / " + parameterUnit.getUnit()); + PaintScaleLegend scale = new PaintScaleLegend(paintScale, numberAxis); + scale.setPosition(RectangleEdge.RIGHT); + scale.setMargin(4.0D, 4.0D, 40.0D, 4.0D); + scale.setAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); + chart.addSubtitle(scale); + + + return new ChartPanel(chart); + } + + + + private String getTooltip(FunctionEvaluationData data, OptimizableParameter parameter) { + String ttip = ""; + if (data.getParameterValue() != null) { + ttip += parameter.getName() + ": " + + parameter.getUnitGroup().getDefaultUnit().toStringUnit(data.getParameterValue().getValue()); + ttip += "
"; + } + if (data.getDomainReference() != null) { + ttip += trans.get("plot.ttip.stability") + " " + data.getDomainReference(); + } + return ttip; + } + + private class GradientScale implements PaintScale { + + private final double min; + private final double max; + + public GradientScale(double min, double max) { + this.min = min; + this.max = max; + } + + @Override + public Paint getPaint(double value) { + if (Double.isNaN(value)) { + return OUT_OF_DOMAIN_COLOR; + } + + value = MathUtil.map(value, min, max, 0.0, 1.0); + value = MathUtil.clamp(value, 0.0, 1.0); + + float r = (float) RED.getValue(value); + float g = (float) GREEN.getValue(value); + float b = (float) BLUE.getValue(value); + + return new Color(r, g, b); + } + + @Override + public double getLowerBound() { + return min; + } + + @Override + public double getUpperBound() { + return max; + } + } + +} diff --git a/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationStepData.java b/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationStepData.java new file mode 100644 index 00000000..ec1ece5a --- /dev/null +++ b/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationStepData.java @@ -0,0 +1,52 @@ +package net.sf.openrocket.gui.dialogs.optimization; + +import net.sf.openrocket.optimization.general.Point; + +/** + * Value object for optimization step data. + * + * @author Sampo Niskanen + */ +public class OptimizationStepData { + + private final Point oldPoint; + private final double oldValue; + private final Point newPoint; + private final double newValue; + private final double stepSize; + + + public OptimizationStepData(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) { + this.oldPoint = oldPoint; + this.oldValue = oldValue; + this.newPoint = newPoint; + this.newValue = newValue; + this.stepSize = stepSize; + } + + + public Point getOldPoint() { + return oldPoint; + } + + + public double getOldValue() { + return oldValue; + } + + + public Point getNewPoint() { + return newPoint; + } + + + public double getNewValue() { + return newValue; + } + + + public double getStepSize() { + return stepSize; + } + +} diff --git a/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationWorker.java b/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationWorker.java new file mode 100644 index 00000000..b7d18445 --- /dev/null +++ b/src/net/sf/openrocket/gui/dialogs/optimization/OptimizationWorker.java @@ -0,0 +1,229 @@ +package net.sf.openrocket.gui.dialogs.optimization; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; + +import javax.swing.SwingUtilities; + +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.FunctionOptimizer; +import net.sf.openrocket.optimization.general.OptimizationController; +import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.optimization.general.ParallelExecutorCache; +import net.sf.openrocket.optimization.general.ParallelFunctionCache; +import net.sf.openrocket.optimization.general.Point; +import net.sf.openrocket.optimization.general.multidim.MultidirectionalSearchOptimizer; +import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.optimization.rocketoptimization.OptimizationGoal; +import net.sf.openrocket.optimization.rocketoptimization.RocketOptimizationFunction; +import net.sf.openrocket.optimization.rocketoptimization.RocketOptimizationListener; +import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain; +import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.Value; +import net.sf.openrocket.util.BugException; + +/** + * A background worker that runs the optimization in the background. It supports providing + * evaluation and step counter information via listeners that are executed on the EDT. + * + * @author Sampo Niskanen + */ +public abstract class OptimizationWorker extends Thread implements OptimizationController, RocketOptimizationListener { + + /* + * Note: This is implemented as a separate Thread object instead of a SwingWorker because + * the SwingWorker cannot be interrupted in any way except by canceling the task, which + * makes it impossible to wait for its exiting (SwingWorker.get() throws a CancellationException + * if cancel() has been called). + * + * SwingWorker also seems to miss some chunks that have been provided to process() when the + * thread ends. + * + * Nothing of this is documented, of course... + */ + + private static final LogHelper log = Application.getLogger(); + + /** Notify listeners every this many milliseconds */ + private static final long PURGE_TIMEOUT = 500; + /** End optimization when step size is below this threshold */ + private static final double STEP_SIZE_LIMIT = 0.005; + + private final FunctionOptimizer optimizer; + private final RocketOptimizationFunction function; + + private final Simulation simulation; + private final SimulationModifier[] modifiers; + + private final ParallelFunctionCache cache; + + + private final LinkedBlockingQueue evaluationQueue = + new LinkedBlockingQueue(); + private final LinkedBlockingQueue stepQueue = + new LinkedBlockingQueue(); + private volatile long lastPurge = 0; + + private OptimizationException optimizationException = null; + + + /** + * Sole constructor + * @param simulation the simulation + * @param parameter the optimization parameter + * @param goal the optimization goal + * @param domain the optimization domain + * @param modifiers the simulation modifiers + */ + public OptimizationWorker(Simulation simulation, OptimizableParameter parameter, + OptimizationGoal goal, SimulationDomain domain, SimulationModifier... modifiers) { + + this.simulation = simulation; + this.modifiers = modifiers.clone(); + + function = new RocketOptimizationFunction(simulation, parameter, goal, domain, modifiers); + function.addRocketOptimizationListener(this); + + cache = new ParallelExecutorCache(1); + cache.setFunction(function); + + optimizer = new MultidirectionalSearchOptimizer(cache); + } + + + @Override + public void run() { + try { + + double[] current = new double[modifiers.length]; + for (int i = 0; i < modifiers.length; i++) { + current[i] = modifiers[i].getCurrentScaledValue(simulation); + } + Point initial = new Point(current); + + optimizer.optimize(initial, this); + + } catch (OptimizationException e) { + this.optimizationException = e; + } finally { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + lastPurge = System.currentTimeMillis() + 24L * 3600L * 1000L; + processQueue(); + done(optimizationException); + } + }); + } + } + + /** + * This method is called after the optimization has ended, either normally, when interrupted + * or by throwing an exception. This method is called on the EDT, like the done() method of SwingWorker. + *

+ * All data chunks to the listeners will be guaranteed to have been processed before calling done(). + * + * @param exception a possible optimization exception that occurred, or null for normal exit. + */ + protected abstract void done(OptimizationException exception); + + + /** + * This method is called for each function evaluation that has taken place. + * This method is called on the EDT. + * + * @param data the data accumulated since the last call + */ + protected abstract void functionEvaluated(List data); + + /** + * This method is called after each step taken by the optimization algorithm. + * This method is called on the EDT. + * + * @param data the data accumulated since the last call + */ + protected abstract void optimizationStepTaken(List data); + + + /** + * Publishes data to the listeners. The queue is purged every PURGE_TIMEOUT milliseconds. + * + * @param data the data to publish to the listeners + */ + private synchronized void publish(FunctionEvaluationData evaluation, OptimizationStepData step) { + + if (evaluation != null) { + evaluationQueue.add(evaluation); + } + if (step != null) { + stepQueue.add(step); + } + + // Add a method to the EDT to process the queue data + long now = System.currentTimeMillis(); + if (lastPurge + PURGE_TIMEOUT <= now) { + lastPurge = now; + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + processQueue(); + } + }); + } + + } + + + /** + * Process the queue and call the listeners. This method must always be called from the EDT. + */ + private void processQueue() { + + if (!SwingUtilities.isEventDispatchThread()) { + throw new BugException("processQueue called from non-EDT"); + } + + + List evaluations = new ArrayList(); + evaluationQueue.drainTo(evaluations); + if (!evaluations.isEmpty()) { + functionEvaluated(evaluations); + } + + + List steps = new ArrayList(); + stepQueue.drainTo(steps); + if (!steps.isEmpty()) { + optimizationStepTaken(steps); + } + } + + + + + /* + * NOTE: The stepTaken and evaluated methods may be called from other + * threads than the EDT or the SwingWorker thread! + */ + + @Override + public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) { + publish(null, new OptimizationStepData(oldPoint, oldValue, newPoint, newValue, stepSize)); + + if (stepSize < STEP_SIZE_LIMIT) { + log.info("stepSize=" + stepSize + " is below limit, ending optimization"); + return false; + } else { + return true; + } + } + + @Override + public void evaluated(Point point, Value[] state, Value domainReference, Value parameterValue, double goalValue) { + publish(new FunctionEvaluationData(point, state, domainReference, parameterValue, goalValue), null); + } + +} diff --git a/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java b/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java index 73296bbd..1e7e47f0 100644 --- a/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java +++ b/src/net/sf/openrocket/gui/dialogs/optimization/SimulationModifierTree.java @@ -8,8 +8,10 @@ import java.util.List; import java.util.Map; import javax.swing.JTree; +import javax.swing.ToolTipManager; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import net.sf.openrocket.gui.components.BasicTree; @@ -17,6 +19,7 @@ import net.sf.openrocket.gui.main.ComponentIcons; import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.util.TextUtil; /** * A tree that displays the simulation modifiers in a tree structure. @@ -28,28 +31,39 @@ import net.sf.openrocket.rocketcomponent.RocketComponent; */ public class SimulationModifierTree extends BasicTree { + private final List selectedModifiers; + /** * Sole constructor. * * @param rocket the rocket. * @param simulationModifiers the simulation modifiers, ordered and mapped by components + * @param selectedModifiers a list of the currently selected modifiers (may be modified). */ - public SimulationModifierTree(Rocket rocket, Map> simulationModifiers) { - super(createModifierTree(rocket, simulationModifiers)); + public SimulationModifierTree(Rocket rocket, Map> simulationModifiers, + List selectedModifiers) { + this.selectedModifiers = selectedModifiers; + populateTree(rocket, simulationModifiers); this.setCellRenderer(new ComponentModifierTreeRenderer()); + + // Enable tooltips for this component + ToolTipManager.sharedInstance().registerComponent(this); + expandComponents(); } - - private static DefaultMutableTreeNode createModifierTree(Rocket rocket, - Map> simulationModifiers) { + /** + * Populate the simulation modifier tree from the provided information. This can be used to update + * the tree. + */ + public void populateTree(Rocket rocket, Map> simulationModifiers) { DefaultMutableTreeNode baseNode = new DefaultMutableTreeNode(rocket); populateTree(baseNode, rocket, simulationModifiers); - return baseNode; + this.setModel(new DefaultTreeModel(baseNode)); } @@ -83,8 +97,11 @@ public class SimulationModifierTree extends BasicTree { } + /** + * Expand the rocket components, but not the modifiers. + */ @SuppressWarnings("rawtypes") - private void expandComponents() { + public void expandComponents() { DefaultMutableTreeNode baseNode = (DefaultMutableTreeNode) this.getModel().getRoot(); Enumeration enumeration = baseNode.breadthFirstEnumeration(); @@ -135,13 +152,30 @@ public class SimulationModifierTree extends BasicTree { if (object instanceof RocketComponent) { setForeground(Color.GRAY); setFont(componentFont); + + // Set tooltip + RocketComponent c = (RocketComponent) object; + String comment = c.getComment().trim(); + if (comment.length() > 0) { + comment = TextUtil.htmlEncode(comment); + comment = "" + comment.replace("\n", "
"); + this.setToolTipText(comment); + } else { + this.setToolTipText(null); + } } else if (object instanceof String) { setForeground(Color.GRAY); setFont(stringFont); } else if (object instanceof SimulationModifier) { - setForeground(Color.BLACK); + + if (selectedModifiers.contains(object)) { + setForeground(Color.GRAY); + } else { + setForeground(Color.BLACK); + } setFont(modifierFont); setText(((SimulationModifier) object).getName()); + setToolTipText(((SimulationModifier) object).getDescription()); } return this; diff --git a/src/net/sf/openrocket/gui/main/BasicFrame.java b/src/net/sf/openrocket/gui/main/BasicFrame.java index a9cbbfc0..e4b20408 100644 --- a/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.concurrent.ExecutionException; import javax.swing.Action; +import javax.swing.BorderFactory; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; @@ -80,7 +81,6 @@ import net.sf.openrocket.gui.dialogs.WarningDialog; import net.sf.openrocket.gui.dialogs.optimization.GeneralOptimizationDialog; import net.sf.openrocket.gui.dialogs.preferences.PreferencesDialog; import net.sf.openrocket.gui.main.componenttree.ComponentTree; -import net.sf.openrocket.gui.optimization.OptimizationTestDialog; import net.sf.openrocket.gui.scalefigure.RocketPanel; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.logging.LogHelper; @@ -367,8 +367,8 @@ public class BasicFrame extends JFrame { scroll.setBorder(null); scroll.setViewportBorder(null); - TitledBorder border = new TitledBorder(trans.get("BasicFrame.title.Addnewcomp")); - border.setTitleFont(border.getTitleFont().deriveFont(Font.BOLD)); + TitledBorder border = BorderFactory.createTitledBorder(trans.get("BasicFrame.title.Addnewcomp")); + GUIUtil.changeFontStyle(border, Font.BOLD); scroll.setBorder(border); panel.add(scroll, "grow"); @@ -648,6 +648,19 @@ public class BasicFrame extends JFrame { menu.add(item); + 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.user("Rocket optimization selected"); + new GeneralOptimizationDialog(document, BasicFrame.this).setVisible(true); + } + }); + menu.add(item); + + + //// Debug // (shown if openrocket.debug.menu is defined) if (System.getProperty("openrocket.debug.menu") != null) { @@ -951,25 +964,6 @@ public class BasicFrame extends JFrame { menu.add(item); - item = new JMenuItem("General optimization test"); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - new GeneralOptimizationDialog(document, BasicFrame.this).setVisible(true); - } - }); - menu.add(item); - - - item = new JMenuItem("Optimization test"); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - new OptimizationTestDialog(BasicFrame.this, document).setVisible(true); - } - }); - menu.add(item); - return menu; } @@ -1370,13 +1364,6 @@ public class BasicFrame extends JFrame { * */ public void printAction() { - if (!Prefs.getBoolean("printing.experimental.communicated", false)) { - log.info("Showing printing is experimental warning to the user"); - JOptionPane.showMessageDialog(this, "Printing is an currently an experimental feature " + - "and might not fully work on all platforms", - "Experimental feature", JOptionPane.WARNING_MESSAGE); - Prefs.putBoolean("printing.experimental.communicated", true); - } new PrintDialog(this, document).setVisible(true); } diff --git a/src/net/sf/openrocket/gui/main/SimulationEditDialog.java b/src/net/sf/openrocket/gui/main/SimulationEditDialog.java index 501f79b0..90561b49 100644 --- a/src/net/sf/openrocket/gui/main/SimulationEditDialog.java +++ b/src/net/sf/openrocket/gui/main/SimulationEditDialog.java @@ -48,7 +48,7 @@ import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.FlightDataBranch; import net.sf.openrocket.simulation.RK4SimulationStepper; -import net.sf.openrocket.simulation.GUISimulationConditions; +import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.simulation.FlightDataType; import net.sf.openrocket.simulation.listeners.SimulationListener; import net.sf.openrocket.simulation.listeners.example.CSVSaveListener; @@ -81,7 +81,7 @@ public class SimulationEditDialog extends JDialog { private final Window parentWindow; private final Simulation simulation; - private final GUISimulationConditions conditions; + private final SimulationOptions conditions; private final Configuration configuration; private static final Translator trans = Application.getTranslator(); @@ -96,7 +96,7 @@ public class SimulationEditDialog extends JDialog { this.parentWindow = parent; this.simulation = s; - this.conditions = simulation.getConditions(); + this.conditions = simulation.getOptions(); configuration = simulation.getConfiguration(); JPanel mainPanel = new JPanel(new MigLayout("fill","[grow, fill]")); @@ -496,7 +496,7 @@ public class SimulationEditDialog extends JDialog { sub.add(label); m = new DoubleModel(conditions,"LaunchRodAngle", UnitGroup.UNITS_ANGLE, - 0, GUISimulationConditions.MAX_LAUNCH_ROD_ANGLE); + 0, SimulationOptions.MAX_LAUNCH_ROD_ANGLE); spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); @@ -507,7 +507,7 @@ public class SimulationEditDialog extends JDialog { unit.setToolTipText(tip); sub.add(unit,"growx"); slider = new BasicSlider(m.getSliderModel(0, Math.PI/9, - GUISimulationConditions.MAX_LAUNCH_ROD_ANGLE)); + SimulationOptions.MAX_LAUNCH_ROD_ANGLE)); slider.setToolTipText(tip); sub.add(slider,"w 75lp, wrap"); diff --git a/src/net/sf/openrocket/gui/main/SimulationRunDialog.java b/src/net/sf/openrocket/gui/main/SimulationRunDialog.java index 96693eb6..1788515e 100644 --- a/src/net/sf/openrocket/gui/main/SimulationRunDialog.java +++ b/src/net/sf/openrocket/gui/main/SimulationRunDialog.java @@ -48,8 +48,8 @@ import net.sf.openrocket.util.Prefs; public class SimulationRunDialog extends JDialog { private static final LogHelper log = Application.getLogger(); private static final Translator trans = Application.getTranslator(); - + /** Update the dialog status every this many ms */ private static final long UPDATE_MS = 200; @@ -95,6 +95,12 @@ public class SimulationRunDialog extends JDialog { 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]; @@ -127,7 +133,7 @@ public class SimulationRunDialog extends JDialog { panel.add(altLabel, "growx, wrap rel"); //// Velocity: - panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Velocity") +" ")); + panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Velocity") + " ")); velLabel = new JLabel(""); panel.add(velLabel, "growx, wrap para"); @@ -272,7 +278,7 @@ public class SimulationRunDialog extends JDialog { double launchBurn = 0; double otherBurn = 0; Configuration config = simulation.getConfiguration(); - String id = simulation.getConditions().getMotorConfigurationID(); + String id = simulation.getOptions().getMotorConfigurationID(); Iterator iterator = config.motorIterator(); while (iterator.hasNext()) { MotorMount m = iterator.next(); @@ -410,7 +416,7 @@ public class SimulationRunDialog extends JDialog { DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this, new Object[] { //// An exception occurred during the simulation: - trans.get("SimuRunDlg.msg.AnException1"), + trans.get("SimuRunDlg.msg.AnException1"), t.getMessage(), simulation.getSimulationListeners().isEmpty() ? trans.get("SimuRunDlg.msg.AnException2") : "" @@ -422,10 +428,10 @@ public class SimulationRunDialog extends JDialog { t.printStackTrace(); DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this, new Object[] { - //// A computation error occurred during the simulation. - trans.get("SimuRunDlg.msg.AssertionError1"), - //// Please report this as a bug along with the details below. - trans.get("SimuRunDlg.msg.AssertionError2") + //// A computation error occurred during the simulation. + trans.get("SimuRunDlg.msg.AssertionError1"), + //// Please report this as a bug along with the details below. + trans.get("SimuRunDlg.msg.AssertionError2") }, stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE); @@ -435,9 +441,9 @@ public class SimulationRunDialog extends JDialog { DetailDialog.showDetailedMessageDialog(SimulationRunDialog.this, new Object[] { //// An unknown error was encountered during the simulation. - trans.get("SimuRunDlg.msg.unknownerror1"), + trans.get("SimuRunDlg.msg.unknownerror1"), //// The program may be unstable, you should save all your designs and restart OpenRocket now! - trans.get("SimuRunDlg.msg.unknownerror2") + trans.get("SimuRunDlg.msg.unknownerror2") }, stackTrace, simulation.getName(), JOptionPane.ERROR_MESSAGE); diff --git a/src/net/sf/openrocket/gui/optimization/OptimizationTestDialog.java b/src/net/sf/openrocket/gui/optimization/OptimizationTestDialog.java deleted file mode 100644 index 337b971b..00000000 --- a/src/net/sf/openrocket/gui/optimization/OptimizationTestDialog.java +++ /dev/null @@ -1,218 +0,0 @@ -package net.sf.openrocket.gui.optimization; - -import static net.sf.openrocket.util.MathUtil.pow2; - -import java.awt.Window; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JPanel; - -import net.miginfocom.swing.MigLayout; -import net.sf.openrocket.document.OpenRocketDocument; -import net.sf.openrocket.document.Simulation; -import net.sf.openrocket.optimization.general.Function; -import net.sf.openrocket.optimization.general.FunctionOptimizer; -import net.sf.openrocket.optimization.general.OptimizationController; -import net.sf.openrocket.optimization.general.OptimizationException; -import net.sf.openrocket.optimization.general.ParallelExecutorCache; -import net.sf.openrocket.optimization.general.ParallelFunctionCache; -import net.sf.openrocket.optimization.general.Point; -import net.sf.openrocket.optimization.general.multidim.MultidirectionalSearchOptimizer; -import net.sf.openrocket.optimization.rocketoptimization.RocketOptimizationFunction; -import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain; -import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; -import net.sf.openrocket.optimization.rocketoptimization.domains.StabilityDomain; -import net.sf.openrocket.optimization.rocketoptimization.goals.MaximizationGoal; -import net.sf.openrocket.optimization.rocketoptimization.modifiers.GenericComponentModifier; -import net.sf.openrocket.optimization.rocketoptimization.parameters.MaximumAltitudeParameter; -import net.sf.openrocket.rocketcomponent.BodyTube; -import net.sf.openrocket.rocketcomponent.Rocket; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.unit.UnitGroup; -import net.sf.openrocket.util.GUIUtil; - -public class OptimizationTestDialog extends JDialog { - - private final OpenRocketDocument document; - - public OptimizationTestDialog(Window parent, OpenRocketDocument document) { - super(parent, "Optimization", ModalityType.APPLICATION_MODAL); - - this.document = document; - - JPanel panel = new JPanel(new MigLayout("fill")); - this.add(panel); - - JButton button = new JButton("Test optimize"); - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - doOptimize(); - } catch (OptimizationException e1) { - e1.printStackTrace(); - } - } - }); - panel.add(button, "wrap para"); - - - - JButton close = new JButton("Close"); - close.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - OptimizationTestDialog.this.dispose(); - } - }); - panel.add(close); - - - GUIUtil.setDisposableDialogOptions(this, close); - } - - - private void doOptimize() throws OptimizationException { - Simulation sim = document.getSimulation(0); - Rocket rocket = sim.getRocket(); - - RocketComponent body = null; - - for (RocketComponent c : rocket) { - if (c instanceof BodyTube) { - body = c; - break; - } - } - - Point initial; - - SimulationDomain domain; - // domain= new IdentitySimulationDomain(); - domain = new StabilityDomain(2, false); - - SimulationModifier mod1 = new GenericComponentModifier("Test", body, - UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, body.getID(), "Length"); - mod1.setMinValue(0.1); - mod1.setMaxValue(0.7); - - SimulationModifier mod2 = new GenericComponentModifier("Test", body, - UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, body.getID(), "OuterRadius"); - mod2.setMinValue(0.01); - mod2.setMaxValue(0.10); - - OptimizationController controller = new OptimizationController() { - int step = 0; - - @Override - public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) { - step++; - System.out.println("STEP " + step + " oldValue=" + oldValue + " newValue=" + newValue + - " oldPoint=" + oldPoint + " newPoint=" + newPoint + - " stepSize=" + stepSize); - return step < 20; - } - }; - - - initial = new Point(mod1.getCurrentScaledValue(sim), mod2.getCurrentScaledValue(sim)); - - - Function function = new RocketOptimizationFunction(sim, new MaximumAltitudeParameter(), - new MaximizationGoal(), domain, mod1, mod2); - /* - function = new Function() { - @Override - public double evaluate(Point point) throws InterruptedException, OptimizationException { - // y = ax^2 + bx + c - // y' = 2ax + b - // 2a * pi/4 + b = 0 - // b = -a*pi/2 - // a=-1 -> b = pi/2 - - - double x = point.get(0); - double y = -x * x + Math.PI / 2 * x; - System.out.println("Evaluating at x=" + x + " value=" + y); - return y; - } - }; - */ - - ParallelFunctionCache cache = new ParallelExecutorCache(1); - cache.setFunction(function); - - FunctionOptimizer optimizer = new MultidirectionalSearchOptimizer(cache); - - optimizer.optimize(initial, controller); - } - - - //////////////////////////////////////////////////////////////////////////////////////////////////////// - - - private static int evalCount = 0; - - public static void main(String[] args) throws OptimizationException { - Point initial; - - - - OptimizationController controller = new OptimizationController() { - int step = 0; - - @Override - public boolean stepTaken(Point oldPoint, double oldValue, Point newPoint, double newValue, double stepSize) { - step++; - System.out.println("STEP " + step + " oldValue=" + oldValue + " newValue=" + newValue + - " oldPoint=" + oldPoint + " newPoint=" + newPoint + - " stepSize=" + stepSize); - return step < 20; - } - }; - - - initial = new Point(0.5, 0.5); - - - Function function = new Function() { - @Override - public double evaluate(Point point) throws InterruptedException, OptimizationException { - // y = ax^2 + bx + c - // y' = 2ax + b - // 2a * pi/4 + b = 0 - // b = -a*pi/2 - // a=-1 -> b = pi/2 - - evalCount++; - - // double x = point.get(0); - // double y = x * x - Math.PI / 2 * x; - // System.out.println("Evaluating at x=" + x + " value=" + y); - // return y; - - double x = point.get(0); - double y = point.get(1); - double z = 4 * pow2((x - 0.3231)) + 2 * pow2(y - 0.8923); - - System.out.println("Evaluation " + evalCount + ": x=" + x + " y=" + y + " z=" + z); - - return z; - } - }; - - - ParallelFunctionCache cache = new ParallelExecutorCache(); - cache.setFunction(function); - - FunctionOptimizer optimizer = new MultidirectionalSearchOptimizer(cache); - - optimizer.optimize(initial, controller); - - - System.out.println("Total evaluation count: " + evalCount); - } -} diff --git a/src/net/sf/openrocket/gui/plot/PlotConfiguration.java b/src/net/sf/openrocket/gui/plot/PlotConfiguration.java index 93122736..bd58782f 100644 --- a/src/net/sf/openrocket/gui/plot/PlotConfiguration.java +++ b/src/net/sf/openrocket/gui/plot/PlotConfiguration.java @@ -19,7 +19,7 @@ import net.sf.openrocket.util.Pair; public class PlotConfiguration implements Cloneable { private static final Translator trans = Application.getTranslator(); - + public static final PlotConfiguration[] DEFAULT_CONFIGURATIONS; static { ArrayList configs = new ArrayList(); @@ -676,7 +676,7 @@ public class PlotConfiguration implements Cloneable { continue; double d = (max - min) / axis.getRangeLength(); - d = Math.sqrt(d); // Prioritize small ranges + d = MathUtil.safeSqrt(d); // Prioritize small ranges goodness += d * 100.0; } diff --git a/src/net/sf/openrocket/gui/plot/PlotDialog.java b/src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java similarity index 97% rename from src/net/sf/openrocket/gui/plot/PlotDialog.java rename to src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java index da775482..c68617b7 100644 --- a/src/net/sf/openrocket/gui/plot/PlotDialog.java +++ b/src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java @@ -65,7 +65,12 @@ import org.jfree.ui.LengthAdjustmentType; import org.jfree.ui.RectangleAnchor; import org.jfree.ui.TextAnchor; -public class PlotDialog extends JDialog { +/** + * Dialog that shows a plot of a simulation results based on user options. + * + * @author Sampo Niskanen + */ +public class SimulationPlotDialog extends JDialog { private static final float PLOT_STROKE_WIDTH = 1.5f; private static final Translator trans = Application.getTranslator(); @@ -128,7 +133,7 @@ public class PlotDialog extends JDialog { private final List renderers = new ArrayList(); - private PlotDialog(Window parent, Simulation simulation, PlotConfiguration config) { + private SimulationPlotDialog(Window parent, Simulation simulation, PlotConfiguration config) { //// Flight data plot super(parent, trans.get("PlotDialog.title.Flightdataplot")); this.setModalityType(ModalityType.DOCUMENT_MODAL); @@ -447,7 +452,7 @@ public class PlotDialog extends JDialog { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - PlotDialog.this.dispose(); + SimulationPlotDialog.this.dispose(); } }); panel.add(button, "right"); @@ -493,7 +498,7 @@ public class PlotDialog extends JDialog { * @param config the configuration of the plot. */ public static void showPlot(Window parent, Simulation simulation, PlotConfiguration config) { - new PlotDialog(parent, simulation, config).setVisible(true); + new SimulationPlotDialog(parent, simulation, config).setVisible(true); } diff --git a/src/net/sf/openrocket/gui/plot/SimulationPlotPanel.java b/src/net/sf/openrocket/gui/plot/SimulationPlotPanel.java index eb646dc5..664d32da 100644 --- a/src/net/sf/openrocket/gui/plot/SimulationPlotPanel.java +++ b/src/net/sf/openrocket/gui/plot/SimulationPlotPanel.java @@ -33,9 +33,14 @@ import net.sf.openrocket.unit.Unit; import net.sf.openrocket.util.GUIUtil; import net.sf.openrocket.util.Icons; +/** + * Panel that displays the simulation plot options to the user. + * + * @author Sampo Niskanen + */ public class SimulationPlotPanel extends JPanel { private static final Translator trans = Application.getTranslator(); - + // TODO: LOW: Should these be somewhere else? public static final int AUTO = -1; public static final int LEFT = 0; @@ -238,7 +243,7 @@ public class SimulationPlotPanel extends JPanel { JOptionPane.showMessageDialog(SimulationPlotPanel.this, //// A maximum of 15 plots is allowed. //// Cannot add plot - trans.get("simplotpanel.OptionPane.lbl1"), + trans.get("simplotpanel.OptionPane.lbl1"), trans.get("simplotpanel.OptionPane.lbl2"), JOptionPane.ERROR_MESSAGE); return; @@ -287,7 +292,7 @@ public class SimulationPlotPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { defaultConfiguration = configuration.clone(); - PlotDialog.showPlot(SwingUtilities.getWindowAncestor(SimulationPlotPanel.this), + SimulationPlotDialog.showPlot(SwingUtilities.getWindowAncestor(SimulationPlotPanel.this), simulation, configuration); } }); @@ -375,7 +380,7 @@ public class SimulationPlotPanel extends JPanel { public void itemStateChanged(ItemEvent e) { if (modifying > 0) return; - Unit unit = (Unit) unitSelector.getSelectedUnit(); + Unit unit = unitSelector.getSelectedUnit(); configuration.setPlotDataUnit(index, unit); } }); diff --git a/src/net/sf/openrocket/gui/print/DesignReport.java b/src/net/sf/openrocket/gui/print/DesignReport.java index e1311444..d149b83c 100644 --- a/src/net/sf/openrocket/gui/print/DesignReport.java +++ b/src/net/sf/openrocket/gui/print/DesignReport.java @@ -456,7 +456,7 @@ public class DesignReport { FlightData flight = null; try { Simulation simulation = Prefs.getBackgroundSimulation(duplicate); - simulation.getConditions().setMotorConfigurationID(motorId); + simulation.getOptions().setMotorConfigurationID(motorId); simulation.simulate(); flight = simulation.getSimulatedData(); } catch (SimulationException e1) { diff --git a/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java b/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java index c1b9caee..53dc895d 100644 --- a/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java +++ b/src/net/sf/openrocket/gui/rocketfigure/SymmetricComponentShapes.java @@ -5,20 +5,21 @@ import java.awt.geom.Path2D; import java.util.ArrayList; import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Transformation; public class SymmetricComponentShapes extends RocketComponentShapes { private static final int MINPOINTS = 91; - private static final double ACCEPTABLE_ANGLE = Math.cos(7.0*Math.PI/180.0); + private static final double ACCEPTABLE_ANGLE = Math.cos(7.0 * Math.PI / 180.0); // TODO: HIGH: adaptiveness sucks, remove it. // TODO: LOW: Uses only first component of cluster (not currently clusterable) - public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, + public static Shape[] getShapesSide(net.sf.openrocket.rocketcomponent.RocketComponent component, Transformation transformation) { - net.sf.openrocket.rocketcomponent.SymmetricComponent c = (net.sf.openrocket.rocketcomponent.SymmetricComponent)component; + net.sf.openrocket.rocketcomponent.SymmetricComponent c = (net.sf.openrocket.rocketcomponent.SymmetricComponent) component; int i; final double delta = 0.0000001; @@ -26,44 +27,44 @@ public class SymmetricComponentShapes extends RocketComponentShapes { ArrayList points = new ArrayList(); x = delta; - points.add(new Coordinate(x,c.getRadius(x),0)); - for (i=1; i < MINPOINTS-1; i++) { - x = c.getLength()*i/(MINPOINTS-1); - points.add(new Coordinate(x,c.getRadius(x),0)); + points.add(new Coordinate(x, c.getRadius(x), 0)); + for (i = 1; i < MINPOINTS - 1; i++) { + x = c.getLength() * i / (MINPOINTS - 1); + points.add(new Coordinate(x, c.getRadius(x), 0)); //System.out.println("Starting with x="+x); } x = c.getLength() - delta; - points.add(new Coordinate(x,c.getRadius(x),0)); + points.add(new Coordinate(x, c.getRadius(x), 0)); - - i=0; - while (i < points.size()-2) { - if (angleAcceptable(points.get(i),points.get(i+1),points.get(i+2)) || - points.get(i+1).x - points.get(i).x < 0.001) { // 1mm + + i = 0; + while (i < points.size() - 2) { + if (angleAcceptable(points.get(i), points.get(i + 1), points.get(i + 2)) || + points.get(i + 1).x - points.get(i).x < 0.001) { // 1mm i++; continue; } - + // Split the longer of the areas int n; - if (points.get(i+2).x-points.get(i+1).x > points.get(i+1).x-points.get(i).x) - n = i+1; + if (points.get(i + 2).x - points.get(i + 1).x > points.get(i + 1).x - points.get(i).x) + n = i + 1; else n = i; - x = (points.get(n).x + points.get(n+1).x)/2; - points.add(n+1,new Coordinate(x,c.getRadius(x),0)); + x = (points.get(n).x + points.get(n + 1).x) / 2; + points.add(n + 1, new Coordinate(x, c.getRadius(x), 0)); } //System.out.println("Final points: "+points.size()); final int len = points.size(); - - for (i=0; i < len; i++) { + + for (i = 0; i < len; i++) { points.set(i, c.toAbsolute(points.get(i))[0]); } - + /* Show points: Shape[] s = new Shape[len+1]; final double d=0.001; @@ -71,29 +72,30 @@ public class SymmetricComponentShapes extends RocketComponentShapes { s[i] = new Ellipse2D.Double(points.get(i).x()-d/2,points.get(i).y()-d/2,d,d); } */ - + //System.out.println("here"); // TODO: LOW: curved path instead of linear Path2D.Double path = new Path2D.Double(); - path.moveTo(points.get(len-1).x*S, points.get(len-1).y*S); - for (i=len-2; i>=0; i--) { - path.lineTo(points.get(i).x*S, points.get(i).y*S); + path.moveTo(points.get(len - 1).x * S, points.get(len - 1).y * S); + for (i = len - 2; i >= 0; i--) { + path.lineTo(points.get(i).x * S, points.get(i).y * S); } - for (i=0; i ACCEPTABLE_ANGLE); + return (cosAngle(v1, v2, v3) > ACCEPTABLE_ANGLE); } + /* * cosAngle = v1.v2 / |v1|*|v2| = v1.v2 / sqrt(v1.v1*v2.v2) */ @@ -101,7 +103,7 @@ public class SymmetricComponentShapes extends RocketComponentShapes { double cos; double len; cos = Coordinate.dot(v1.sub(v2), v2.sub(v3)); - len = Math.sqrt(v1.sub(v2).length2() * v2.sub(v3).length2()); - return cos/len; + len = MathUtil.safeSqrt(v1.sub(v2).length2() * v2.sub(v3).length2()); + return cos / len; } } diff --git a/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java b/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java index 5a515ba7..63d2f469 100644 --- a/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java +++ b/src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java @@ -13,41 +13,46 @@ import net.sf.openrocket.util.Prefs; public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure { - - // Number of pixels to leave at edges when fitting figure - public static final int BORDER_PIXELS_WIDTH=30; - public static final int BORDER_PIXELS_HEIGHT=20; + // 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; - protected final double dpi; + protected final double dpi; + protected double scale = 1.0; protected double scaling = 1.0; + protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH; + protected int borderPixelsHeight = DEFAULT_BORDER_PIXELS_HEIGHT; + protected final List listeners = new LinkedList(); - + public AbstractScaleFigure() { this.dpi = Prefs.getDPI(); this.scaling = 1.0; - this.scale = dpi/0.0254*scaling; + this.scale = dpi / 0.0254 * scaling; 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; @@ -64,49 +69,61 @@ public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure if (Math.abs(this.scaling - scaling) < 0.01) return; this.scaling = scaling; - this.scale = dpi/0.0254*scaling; + this.scale = dpi / 0.0254 * scaling; updateFigure(); } @Override public void setScaling(Dimension bounds) { double zh = 1, zv = 1; - int w = bounds.width - 2*BORDER_PIXELS_WIDTH -20; - int h = bounds.height - 2*BORDER_PIXELS_HEIGHT -20; + 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 = ((double)w) / getFigureWidth(); - zv = ((double)h) / getFigureHeight(); - - double s = Math.min(zh, zv)/dpi*0.0254 - 0.001; + zh = (w) / getFigureWidth(); + zv = (h) / getFigureHeight(); + + double s = Math.min(zh, zv) / dpi * 0.0254 - 0.001; setScaling(s); } - - + + @Override + public Dimension getBorderPixels() { + return new Dimension(borderPixelsWidth, borderPixelsHeight); + } + + @Override + public void setBorderPixels(int width, int height) { + this.borderPixelsWidth = width; + this.borderPixelsHeight = height; + } + + @Override public void addChangeListener(ChangeListener listener) { - listeners.add(0,listener); + listeners.add(0, listener); } - + @Override public void removeChangeListener(ChangeListener listener) { listeners.remove(listener); } private ChangeEvent changeEvent = null; + protected void fireChangeEvent() { ChangeListener[] list = listeners.toArray(new ChangeListener[0]); - for (ChangeListener l: list) { + for (ChangeListener l : list) { if (changeEvent == null) changeEvent = new ChangeEvent(this); l.stateChanged(changeEvent); } } - + } diff --git a/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java b/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java index 29e2112c..0f08be21 100644 --- a/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java +++ b/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java @@ -25,7 +25,7 @@ import net.sf.openrocket.util.MathUtil; // TODO: MEDIUM: the figure jumps and bugs when using automatic fitting public class FinPointFigure extends AbstractScaleFigure { - + private static final int BOX_SIZE = 4; private final FreeformFinSet finset; @@ -45,48 +45,48 @@ public class FinPointFigure extends AbstractScaleFigure { this.finset = finset; } - + @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*BORDER_PIXELS_WIDTH < getWidth()) { - + if (figureWidth * scale + 2 * borderPixelsWidth < getWidth()) { + // Figure fits in the viewport - tx = (getWidth()-figureWidth*scale)/2 - minX*scale; - + tx = (getWidth() - figureWidth * scale) / 2 - minX * scale; + } else { - + // Figure does not fit in viewport - tx = BORDER_PIXELS_WIDTH - minX*scale; + tx = borderPixelsWidth - minX * scale; } - if (figureHeight*scale + 2*BORDER_PIXELS_HEIGHT < getHeight()) { - ty = getHeight() - BORDER_PIXELS_HEIGHT; + if (figureHeight * scale + 2 * borderPixelsHeight < getHeight()) { + ty = getHeight() - borderPixelsHeight; } else { - ty = BORDER_PIXELS_HEIGHT + figureHeight*scale; + ty = borderPixelsHeight + figureHeight * scale; } - if (Math.abs(translateX - tx)>1 || Math.abs(translateY - ty)>1) { + 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) { + + if (Math.abs(translateX - tx) > 1 || Math.abs(translateY - ty) > 1) { // Origin has changed, fire event translateX = tx; translateY = ty; @@ -97,121 +97,121 @@ public class FinPointFigure extends AbstractScaleFigure { // Calculate and store the transformation used transform = new AffineTransform(); transform.translate(translateX, translateY); - transform.scale(scale/EXTRA_SCALE, -scale/EXTRA_SCALE); + transform.scale(scale / EXTRA_SCALE, -scale / EXTRA_SCALE); // TODO: HIGH: border Y-scale upwards - + g2.transform(transform); // Set rendering hints appropriately - g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + - 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; - + 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; + // Background grid - g2.setStroke(new BasicStroke((float)(1.0*EXTRA_SCALE/scale), + g2.setStroke(new BasicStroke((float) (1.0 * EXTRA_SCALE / scale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - g2.setColor(new Color(0,0,255,30)); - + 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(); + 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); - } - } - - - - + 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); + } + } + + + + // Base rocket line - g2.setStroke(new BasicStroke((float)(3.0*EXTRA_SCALE/scale), - BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL)); + 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); - + g2.drawLine((int) (x0 * EXTRA_SCALE), 0, (int) (x1 * EXTRA_SCALE), 0); + // 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); + 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.setStroke(new BasicStroke((float) (1.0 * EXTRA_SCALE / scale), + BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); g2.setColor(Color.BLACK); g2.draw(shape); - + // Fin point boxes - g2.setColor(new Color(150,0,0)); - double s = BOX_SIZE*EXTRA_SCALE/scale; + 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++) { + 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); + handles[i] = new Rectangle2D.Double(c.x * EXTRA_SCALE - s, c.y * EXTRA_SCALE - s, 2 * s, 2 * s); g2.draw(handles[i]); } } - + 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); + Point2D.Double p = new Point2D.Double(x, y); try { - transform.inverseTransform(p,p); + transform.inverseTransform(p, p); } catch (NoninvertibleTransformException e) { return -1; } - - for (int i=0; i < handles.length; i++) { + + for (int i = 0; i < handles.length; i++) { if (handles[i].contains(p)) return i; } @@ -224,9 +224,9 @@ public class FinPointFigure extends AbstractScaleFigure { return -1; // Calculate point in shapes' coordinates - Point2D.Double p = new Point2D.Double(x,y); + Point2D.Double p = new Point2D.Double(x, y); try { - transform.inverseTransform(p,p); + transform.inverseTransform(p, p); } catch (NoninvertibleTransformException e) { return -1; } @@ -234,22 +234,22 @@ public class FinPointFigure extends AbstractScaleFigure { 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)); + + System.out.println("Point: " + x0 + "," + y0); + System.out.println("delta: " + (BOX_SIZE / scale)); Coordinate[] points = finset.getFinPoints(); - for (int i=1; i < points.length; i++) { - double x1 = points[i-1].x; - double y1 = points[i-1].y; + for (int i = 1; i < points.length; i++) { + double x1 = points[i - 1].x; + double y1 = points[i - 1].y; double x2 = points[i].x; double y2 = points[i].y; -// System.out.println("point1:"+x1+","+y1+" point2:"+x2+","+y2); + // 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); + 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; } @@ -259,14 +259,14 @@ public class FinPointFigure extends AbstractScaleFigure { public Point2D.Double convertPoint(double x, double y) { - Point2D.Double p = new Point2D.Double(x,y); + Point2D.Double p = new Point2D.Double(x, y); try { - transform.inverseTransform(p,p); + transform.inverseTransform(p, p); } catch (NoninvertibleTransformException e) { - assert(false): "Should not occur"; - return new Point2D.Double(0,0); + assert (false) : "Should not occur"; + return new Point2D.Double(0, 0); } - + p.setLocation(p.x / EXTRA_SCALE, p.y / EXTRA_SCALE); return p; } @@ -279,9 +279,9 @@ public class FinPointFigure extends AbstractScaleFigure { modID = finset.getRocket().getAerodynamicModID(); calculateDimensions(); } - return new Dimension((int)translateX, (int)translateY); + return new Dimension((int) translateX, (int) translateY); } - + @Override public double getFigureWidth() { if (modID != finset.getRocket().getAerodynamicModID()) { @@ -290,7 +290,7 @@ public class FinPointFigure extends AbstractScaleFigure { } return figureWidth; } - + @Override public double getFigureHeight() { if (modID != finset.getRocket().getAerodynamicModID()) { @@ -299,14 +299,14 @@ public class FinPointFigure extends AbstractScaleFigure { } return figureHeight; } - + private void calculateDimensions() { minX = 0; maxX = 0; maxY = 0; - for (Coordinate c: finset.getFinPoints()) { + for (Coordinate c : finset.getFinPoints()) { if (c.x < minX) minX = c.x; if (c.x > maxX) @@ -322,8 +322,8 @@ public class FinPointFigure extends AbstractScaleFigure { figureHeight = maxY; - Dimension d = new Dimension((int)(figureWidth*scale+2*BORDER_PIXELS_WIDTH), - (int)(figureHeight*scale+2*BORDER_PIXELS_HEIGHT)); + Dimension d = new Dimension((int) (figureWidth * scale + 2 * borderPixelsWidth), + (int) (figureHeight * scale + 2 * borderPixelsHeight)); if (!d.equals(getPreferredSize()) || !d.equals(getMinimumSize())) { setPreferredSize(d); @@ -339,6 +339,6 @@ public class FinPointFigure extends AbstractScaleFigure { repaint(); } - + } diff --git a/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java b/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java index ea1f98c7..2f7556e2 100644 --- a/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java +++ b/src/net/sf/openrocket/gui/scalefigure/RocketFigure.java @@ -1,20 +1,6 @@ package net.sf.openrocket.gui.scalefigure; -import net.sf.openrocket.gui.figureelements.FigureElement; -import net.sf.openrocket.gui.main.ExceptionHandler; -import net.sf.openrocket.motor.Motor; -import net.sf.openrocket.rocketcomponent.Configuration; -import net.sf.openrocket.rocketcomponent.MotorMount; -import net.sf.openrocket.rocketcomponent.RocketComponent; -import net.sf.openrocket.util.BugException; -import net.sf.openrocket.util.Coordinate; -import net.sf.openrocket.util.LineStyle; -import net.sf.openrocket.util.MathUtil; -import net.sf.openrocket.util.Prefs; -import net.sf.openrocket.util.Reflection; -import net.sf.openrocket.util.Transformation; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; @@ -33,6 +19,20 @@ import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashSet; +import net.sf.openrocket.gui.figureelements.FigureElement; +import net.sf.openrocket.gui.main.ExceptionHandler; +import net.sf.openrocket.motor.Motor; +import net.sf.openrocket.rocketcomponent.Configuration; +import net.sf.openrocket.rocketcomponent.MotorMount; +import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.LineStyle; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Prefs; +import net.sf.openrocket.util.Reflection; +import net.sf.openrocket.util.Transformation; + /** * A ScaleFigure that draws a complete rocket. Extra information can * be added to the figure by the methods {@link #addRelativeExtra(FigureElement)}, @@ -40,7 +40,6 @@ import java.util.LinkedHashSet; * * @author Sampo Niskanen */ - public class RocketFigure extends AbstractScaleFigure { private static final long serialVersionUID = 1L; @@ -53,31 +52,31 @@ public class RocketFigure extends AbstractScaleFigure { // Width for drawing normal and selected components public static final double NORMAL_WIDTH = 1.0; public static final double SELECTED_WIDTH = 2.0; - - private final Configuration configuration; + + private Configuration configuration; private RocketComponent[] selection = new RocketComponent[0]; private int type = TYPE_SIDE; - + private double rotation; private Transformation transformation; private double translateX, translateY; - - + + /* * figureComponents contains the corresponding RocketComponents of the figureShapes */ private final ArrayList figureShapes = new ArrayList(); - private final ArrayList figureComponents = - new ArrayList(); + private final ArrayList figureComponents = + new ArrayList(); - private double minX=0, maxX=0, maxR=0; + private double minX = 0, maxX = 0, maxR = 0; // Figure width and height in SI-units and pixels - private double figureWidth=0, figureHeight=0; - private int figureWidthPx=0, figureHeightPx=0; + private double figureWidth = 0, figureHeight = 0; + private int figureWidthPx = 0, figureHeightPx = 0; private AffineTransform g2transformation = null; @@ -96,26 +95,36 @@ public class RocketFigure extends AbstractScaleFigure { this.rotation = 0.0; this.transformation = Transformation.rotate_x(0.0); - calculateSize(); 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); + return new Dimension((int) translateX, (int) translateY); } @Override public double getFigureHeight() { return figureHeight; } - + @Override public double getFigureWidth() { return figureWidth; } - + public RocketComponent[] getSelection() { return selection; @@ -154,19 +163,18 @@ public class RocketFigure extends AbstractScaleFigure { public void setType(int type) { if (type != TYPE_BACK && type != TYPE_SIDE) { - throw new IllegalArgumentException("Illegal type: "+type); + throw new IllegalArgumentException("Illegal type: " + type); } if (this.type == type) return; this.type = type; updateFigure(); } - - + /** * Updates the figure shapes and figure size. */ @@ -176,11 +184,11 @@ public class RocketFigure extends AbstractScaleFigure { figureComponents.clear(); calculateSize(); - + // Get shapes for all active components - for (RocketComponent c: configuration) { + for (RocketComponent c : configuration) { Shape[] s = getShapes(c); - for (int i=0; i < s.length; i++) { + for (int i = 0; i < s.length; i++) { figureShapes.add(s[i]); figureComponents.add(c); } @@ -189,7 +197,7 @@ public class RocketFigure extends AbstractScaleFigure { repaint(); fireChangeEvent(); } - + public void addRelativeExtra(FigureElement p) { relativeExtra.add(p); @@ -216,7 +224,7 @@ public class RocketFigure extends AbstractScaleFigure { absoluteExtra.clear(); } - + /** * Paints the rocket on to the Graphics element. *

@@ -227,39 +235,39 @@ public class RocketFigure extends AbstractScaleFigure { @Override public void paintComponent(Graphics g) { super.paintComponent(g); - Graphics2D g2 = (Graphics2D)g; - + Graphics2D g2 = (Graphics2D) g; + AffineTransform baseTransform = g2.getTransform(); // Update figure shapes if necessary if (figureShapes == null) updateFigure(); - + double tx, ty; // Calculate translation for figure centering - if (figureWidthPx + 2*BORDER_PIXELS_WIDTH < getWidth()) { - + if (figureWidthPx + 2 * borderPixelsWidth < getWidth()) { + // Figure fits in the viewport if (type == TYPE_BACK) - tx = getWidth()/2; - else - tx = (getWidth()-figureWidthPx)/2 - minX*scale; - + tx = getWidth() / 2; + else + tx = (getWidth() - figureWidthPx) / 2 - minX * scale; + } else { - + // Figure does not fit in viewport if (type == TYPE_BACK) - tx = BORDER_PIXELS_WIDTH + figureWidthPx/2; - else - tx = BORDER_PIXELS_WIDTH - minX*scale; + tx = borderPixelsWidth + figureWidthPx / 2; + else + tx = borderPixelsWidth - minX * scale; } - - ty = computeTy(figureHeightPx); - - if (Math.abs(translateX - tx)>1 || Math.abs(translateY - ty)>1) { + + ty = computeTy(figureHeightPx); + + if (Math.abs(translateX - tx) > 1 || Math.abs(translateY - ty) > 1) { // Origin has changed, fire event translateX = tx; translateY = ty; @@ -272,28 +280,28 @@ public class RocketFigure extends AbstractScaleFigure { g2transformation = new AffineTransform(); g2transformation.translate(translateX, translateY); // Mirror position Y-axis upwards - g2transformation.scale(scale/EXTRA_SCALE, -scale/EXTRA_SCALE); - + g2transformation.scale(scale / EXTRA_SCALE, -scale / EXTRA_SCALE); + g2.transform(g2transformation); - + // Set rendering hints appropriately - g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - + // Draw all shapes - for (int i=0; i < figureShapes.size(); i++) { + for (int i = 0; i < figureShapes.size(); i++) { RocketComponent c = figureComponents.get(i); Shape s = figureShapes.get(i); boolean selected = false; // Check if component is in the selection - for (int j=0; j < selection.length; j++) { + for (int j = 0; j < selection.length; j++) { if (c == selection[j]) { selected = true; break; @@ -306,37 +314,37 @@ public class RocketFigure extends AbstractScaleFigure { color = Prefs.getDefaultColor(c.getClass()); } g2.setColor(color); - + LineStyle style = c.getLineStyle(); if (style == null) style = Prefs.getDefaultLineStyle(c.getClass()); float[] dashes = style.getDashes(); - for (int j=0; j l = new LinkedHashSet(); - - for (int i=0; i 0.0001) - zh = (getWidth()-2*BORDER_PIXELS_WIDTH)/bounds.getWidth(); + zh = (getWidth() - 2 * borderPixelsWidth) / bounds.getWidth(); if (bounds.getHeight() > 0.0001) - zv = (getHeight()-2*BORDER_PIXELS_HEIGHT)/bounds.getHeight(); + zv = (getHeight() - 2 * borderPixelsHeight) / bounds.getHeight(); return Math.min(zh, zv); } - + + /** * Calculates the necessary size of the figure and set the PreferredSize * property accordingly. @@ -507,26 +516,26 @@ public class RocketFigure extends AbstractScaleFigure { switch (type) { case TYPE_SIDE: - figureWidth = maxX-minX; - figureHeight = 2*maxR; + figureWidth = maxX - minX; + figureHeight = 2 * maxR; break; - + case TYPE_BACK: - figureWidth = 2*maxR; - figureHeight = 2*maxR; + figureWidth = 2 * maxR; + figureHeight = 2 * maxR; break; - + default: - assert(false): "Should not occur, type="+type; + 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*BORDER_PIXELS_WIDTH, - figureHeightPx+2*BORDER_PIXELS_HEIGHT); + 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); @@ -538,14 +547,14 @@ public class RocketFigure extends AbstractScaleFigure { public Rectangle2D getDimensions() { switch (type) { case TYPE_SIDE: - return new Rectangle2D.Double(minX,-maxR,maxX-minX,2*maxR); + return new Rectangle2D.Double(minX, -maxR, maxX - minX, 2 * maxR); case TYPE_BACK: - return new Rectangle2D.Double(-maxR,-maxR,2*maxR,2*maxR); + return new Rectangle2D.Double(-maxR, -maxR, 2 * maxR, 2 * maxR); default: - throw new BugException("Illegal figure type = "+type); + throw new BugException("Illegal figure type = " + type); } } - + } diff --git a/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index c367d7e2..920d4617 100644 --- a/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -592,7 +592,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change Rocket duplicate = (Rocket) configuration.getRocket().copy(); Simulation simulation = Prefs.getBackgroundSimulation(duplicate); - simulation.getConditions().setMotorConfigurationID( + simulation.getOptions().setMotorConfigurationID( configuration.getMotorConfigurationID()); backgroundSimulationWorker = new BackgroundSimulationWorker(simulation); diff --git a/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java b/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java index 161c8353..48440fe3 100644 --- a/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java +++ b/src/net/sf/openrocket/gui/scalefigure/ScaleFigure.java @@ -48,7 +48,7 @@ public interface ScaleFigure extends ChangeSource { */ public double getScaling(); - + /** * Return the scale of the figure on px/m. * @@ -56,7 +56,7 @@ public interface ScaleFigure extends ChangeSource { */ public double getAbsoluteScale(); - + /** * Return the pixel coordinates of the figure origin. * @@ -64,4 +64,19 @@ public interface ScaleFigure extends ChangeSource { */ 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/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java b/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java index aa46b682..75ec602f 100644 --- a/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java +++ b/src/net/sf/openrocket/gui/scalefigure/ScaleScrollPane.java @@ -43,18 +43,18 @@ import net.sf.openrocket.util.BugException; * * @author Sampo Niskanen */ -public class ScaleScrollPane extends JScrollPane +public class ScaleScrollPane extends JScrollPane implements MouseListener, MouseMotionListener { public static final int RULER_SIZE = 20; public static final int MINOR_TICKS = 3; public static final int MAJOR_TICKS = 30; - + private JComponent component; private ScaleFigure figure; private JViewport viewport; - + private DoubleModel rulerUnit; private Ruler horizontalRuler; private Ruler verticalRuler; @@ -64,25 +64,34 @@ public class ScaleScrollPane extends JScrollPane 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) { super(component); -// super(component, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, -// JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); if (!(component instanceof ScaleFigure)) { throw new IllegalArgumentException("component must implement ScaleFigure"); } this.component = component; - this.figure = (ScaleFigure)component; + this.figure = (ScaleFigure) component; this.allowFit = allowFit; - rulerUnit = new DoubleModel(0.0,UnitGroup.UNITS_LENGTH); + rulerUnit = new DoubleModel(0.0, UnitGroup.UNITS_LENGTH); rulerUnit.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { @@ -100,10 +109,10 @@ public class ScaleScrollPane extends JScrollPane 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)); - + viewport = this.getViewport(); viewport.addMouseListener(this); viewport.addMouseMotionListener(this); @@ -135,14 +144,25 @@ public class ScaleScrollPane extends JScrollPane } + /** + * 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. + */ public boolean isFitting() { return fit; } + /** + * Set whether the figure is automatically fitted within the component bounds. + * + * @throws BugException if automatic fitting is disallowed and fit is true + */ public void setFitting(boolean fit) { if (fit && !allowFit) { throw new BugException("Attempting to fit figure not allowing fit."); @@ -169,7 +189,7 @@ public class ScaleScrollPane extends JScrollPane public double getScale() { return figure.getAbsoluteScale(); } - + public void setScaling(double scale) { if (fit) { setFitting(false); @@ -188,54 +208,54 @@ public class ScaleScrollPane extends JScrollPane //////////////// Mouse handlers //////////////// - private int dragStartX=0; - private int dragStartY=0; + private int dragStartX = 0; + private int dragStartY = 0; private Rectangle dragRectangle = null; - + @Override public void mousePressed(MouseEvent e) { dragStartX = e.getX(); dragStartY = e.getY(); dragRectangle = viewport.getViewRect(); } - + @Override public void mouseReleased(MouseEvent e) { dragRectangle = null; } - + @Override public void mouseDragged(MouseEvent e) { - if (dragRectangle==null) { + if (dragRectangle == null) { return; } - - dragRectangle.setLocation(dragStartX-e.getX(),dragStartY-e.getY()); - + + dragRectangle.setLocation(dragStartX - e.getX(), dragStartY - e.getY()); + dragStartX = e.getX(); dragStartY = e.getY(); viewport.scrollRectToVisible(dragRectangle); } - + @Override public void mouseClicked(MouseEvent e) { } - + @Override public void mouseEntered(MouseEvent e) { } - + @Override public void mouseExited(MouseEvent e) { } - + @Override public void mouseMoved(MouseEvent e) { } - + //////////////// The view port rulers //////////////// @@ -261,9 +281,9 @@ public class ScaleScrollPane extends JScrollPane public void updateSize() { Dimension d = component.getPreferredSize(); if (orientation == HORIZONTAL) { - setPreferredSize(new Dimension(d.width+10,RULER_SIZE)); + setPreferredSize(new Dimension(d.width + 10, RULER_SIZE)); } else { - setPreferredSize(new Dimension(RULER_SIZE,d.height+10)); + setPreferredSize(new Dimension(RULER_SIZE, d.height + 10)); } revalidate(); repaint(); @@ -274,102 +294,102 @@ public class ScaleScrollPane extends JScrollPane if (orientation == HORIZONTAL) { px -= origin.width; } else { -// px = -(px - origin.height); + // px = -(px - origin.height); px -= origin.height; } - return px/figure.getAbsoluteScale(); + return px / figure.getAbsoluteScale(); } private int toPx(double l) { Dimension origin = figure.getOrigin(); - int px = (int)(l * figure.getAbsoluteScale() + 0.5); + int px = (int) (l * figure.getAbsoluteScale() + 0.5); if (orientation == HORIZONTAL) { px += origin.width; } else { px = px + origin.height; -// px += origin.height; + // px += origin.height; } return px; } - @Override + @Override protected void paintComponent(Graphics g) { - super.paintComponent(g); - Graphics2D g2 = (Graphics2D)g; + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g; Rectangle area = g2.getClipBounds(); - - // Fill area with background color + + // Fill area with background color g2.setColor(getBackground()); - g2.fillRect(area.x, area.y, area.width, area.height+100); - + g2.fillRect(area.x, area.y, area.width, area.height + 100); + - int startpx,endpx; - if (orientation == HORIZONTAL) { - startpx = area.x; - endpx = area.x+area.width; - } else { - startpx = area.y; - 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(); + int startpx, endpx; + if (orientation == HORIZONTAL) { + startpx = area.x; + endpx = area.x + area.width; + } else { + startpx = area.y; + 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); + - Tick[] ticks = unit.getTicks(start, end, minor, major); - - - // Set color & hints - g2.setColor(Color.BLACK); + // Set color & hints + g2.setColor(Color.BLACK); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - - for (Tick t: ticks) { - int position = toPx(t.value); - drawTick(g2,position,t); - } - } - - private void drawTick(Graphics g, int position, Tick t) { - int length; - String str = null; - if (t.major) { - length = RULER_SIZE/2; - } else { - if (t.notable) - length = RULER_SIZE/3; - else - length = RULER_SIZE/6; - } - - // Set font - if (t.major) { - str = rulerUnit.getCurrentUnit().toString(t.value); - if (t.notable) - g.setFont(new Font("SansSerif", Font.BOLD, 9)); - else - g.setFont(new Font("SansSerif", Font.PLAIN, 9)); - } - - // Draw tick & text - if (orientation == HORIZONTAL) { - g.drawLine(position, RULER_SIZE-length, position, RULER_SIZE); - if (str != null) - g.drawString(str, position, RULER_SIZE-length-1); - } else { - g.drawLine(RULER_SIZE-length, position, RULER_SIZE, position); - if (str != null) - g.drawString(str, 1, position-1); - } - } + + for (Tick t : ticks) { + int position = toPx(t.value); + drawTick(g2, position, t); + } + } + + private void drawTick(Graphics g, int position, Tick t) { + int length; + String str = null; + if (t.major) { + length = RULER_SIZE / 2; + } else { + if (t.notable) + length = RULER_SIZE / 3; + else + length = RULER_SIZE / 6; + } + + // Set font + if (t.major) { + str = rulerUnit.getCurrentUnit().toString(t.value); + if (t.notable) + g.setFont(new Font("SansSerif", Font.BOLD, 9)); + else + g.setFont(new Font("SansSerif", Font.PLAIN, 9)); + } + + // Draw tick & text + if (orientation == HORIZONTAL) { + g.drawLine(position, RULER_SIZE - length, position, RULER_SIZE); + if (str != null) + g.drawString(str, position, RULER_SIZE - length - 1); + } else { + g.drawLine(RULER_SIZE - length, position, RULER_SIZE, position); + if (str != null) + g.drawString(str, 1, position - 1); + } + } } } diff --git a/src/net/sf/openrocket/models/wind/PinkNoiseWindModel.java b/src/net/sf/openrocket/models/wind/PinkNoiseWindModel.java index 3916f6a9..960325d5 100644 --- a/src/net/sf/openrocket/models/wind/PinkNoiseWindModel.java +++ b/src/net/sf/openrocket/models/wind/PinkNoiseWindModel.java @@ -15,9 +15,11 @@ import net.sf.openrocket.util.PinkNoise; */ public class PinkNoiseWindModel implements WindModel { - /** Source for seed numbers, may be overridden by get/setSeed(). */ - private static final Random seedSource = new Random(); + /** Random value with which to XOR the random seed value */ + private static final int SEED_RANDOMIZATION = 0x7343AA03; + + /** Pink noise alpha parameter. */ private static final double ALPHA = 5.0 / 3.0; @@ -34,7 +36,7 @@ public class PinkNoiseWindModel implements WindModel { private double average = 0; private double standardDeviation = 0; - private int seed; + private final int seed; private PinkNoise randomSource = null; private double time1; @@ -42,12 +44,11 @@ public class PinkNoiseWindModel implements WindModel { /** - * Construct a new wind simulator with a random starting seed value. + * Construct a new wind simulation with a specific seed value. + * @param seed the seed value. */ - public PinkNoiseWindModel() { - synchronized (seedSource) { - seed = seedSource.nextInt(); - } + public PinkNoiseWindModel(int seed) { + this.seed = seed ^ SEED_RANDOMIZATION; } @@ -122,18 +123,6 @@ public class PinkNoiseWindModel implements WindModel { - public int getSeed() { - return seed; - } - - public void setSeed(int seed) { - if (this.seed == seed) - return; - this.seed = seed; - } - - - @Override public Coordinate getWindVelocity(double time, double altitude) { if (time < 0) { diff --git a/src/net/sf/openrocket/optimization/general/Point.java b/src/net/sf/openrocket/optimization/general/Point.java index 47dab113..9b2bece8 100644 --- a/src/net/sf/openrocket/optimization/general/Point.java +++ b/src/net/sf/openrocket/optimization/general/Point.java @@ -139,7 +139,7 @@ public final class Point { */ public double length() { if (length < 0) { - length = Math.sqrt(length2()); + length = MathUtil.safeSqrt(length2()); } return length; } diff --git a/src/net/sf/openrocket/optimization/general/multidim/MultidirectionalSearchOptimizer.java b/src/net/sf/openrocket/optimization/general/multidim/MultidirectionalSearchOptimizer.java index 0e70bf13..1f15800f 100644 --- a/src/net/sf/openrocket/optimization/general/multidim/MultidirectionalSearchOptimizer.java +++ b/src/net/sf/openrocket/optimization/general/multidim/MultidirectionalSearchOptimizer.java @@ -21,6 +21,8 @@ import net.sf.openrocket.util.Statistics; * This is a parallel pattern search optimization algorithm. The function evaluations are performed * using an ExecutorService. By default a ThreadPoolExecutor is used that has as many thread defined * as the system has processors. + *

+ * The optimization can be aborted by interrupting the current thread. */ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Statistics { private static final LogHelper log = Application.getLogger(); @@ -30,6 +32,7 @@ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Stati private ParallelFunctionCache functionExecutor; private boolean useExpansion = false; + private boolean useCoordinateSearch = false; private int stepCount = 0; private int reflectionAcceptance = 0; @@ -73,7 +76,8 @@ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Stati List coordinateSearch = new ArrayList(simplex.size()); Point current; double currentValue; - do { + boolean continueOptimization = true; + while (continueOptimization) { log.debug("Starting optimization step with simplex " + simplex + (simplexComputed ? "" : " (not computed)")); @@ -95,12 +99,14 @@ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Stati * Expansion is unlikely as we're mainly dealing with bounded optimization. */ createReflection(simplex, reflection); - createCoordinateSearch(current, step, coordinateSearch); + if (useCoordinateSearch) + createCoordinateSearch(current, step, coordinateSearch); if (useExpansion) createExpansion(simplex, expansion); functionExecutor.compute(reflection); - functionExecutor.compute(coordinateSearch); + if (useCoordinateSearch) + functionExecutor.compute(coordinateSearch); if (useExpansion) functionExecutor.compute(expansion); @@ -113,7 +119,8 @@ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Stati log.debug("Reflection was successful, aborting coordinate search, " + (useExpansion ? "computing" : "skipping") + " expansion"); - functionExecutor.abort(coordinateSearch); + if (useCoordinateSearch) + functionExecutor.abort(coordinateSearch); simplex.clear(); simplex.add(current); @@ -160,24 +167,31 @@ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Stati */ halveStep(simplex); functionExecutor.compute(simplex); - functionExecutor.waitFor(coordinateSearch); - if (accept(coordinateSearch, currentValue)) { + if (useCoordinateSearch) { + functionExecutor.waitFor(coordinateSearch); - log.debug("Coordinate search successful, reseting simplex"); - List toAbort = new LinkedList(simplex); - simplex.clear(); - simplex.add(current); - for (Point p : pattern) { - simplex.add(current.add(p.mul(step))); + if (accept(coordinateSearch, currentValue)) { + + log.debug("Coordinate search successful, reseting simplex"); + List toAbort = new LinkedList(simplex); + simplex.clear(); + simplex.add(current); + for (Point p : pattern) { + simplex.add(current.add(p.mul(step))); + } + toAbort.removeAll(simplex); + functionExecutor.abort(toAbort); + simplexComputed = false; + coordinateAcceptance++; + + } else { + log.debug("Coordinate search unsuccessful, halving step."); + step /= 2; + reductionFallback++; } - toAbort.removeAll(simplex); - functionExecutor.abort(toAbort); - simplexComputed = false; - coordinateAcceptance++; - } else { - log.debug("Coordinate search unsuccessful, halving step."); + log.debug("Coordinate search not used, halving step."); step /= 2; reductionFallback++; } @@ -186,12 +200,14 @@ public class MultidirectionalSearchOptimizer implements FunctionOptimizer, Stati log.debug("Ending optimization step with simplex " + simplex); + continueOptimization = control.stepTaken(current, currentValue, simplex.get(0), + functionExecutor.getValue(simplex.get(0)), step); + if (Thread.interrupted()) { throw new InterruptedException(); } - } while (control.stepTaken(current, currentValue, simplex.get(0), - functionExecutor.getValue(simplex.get(0)), step)); + } } catch (InterruptedException e) { log.info("Optimization was interrupted with InterruptedException"); diff --git a/src/net/sf/openrocket/optimization/general/multidim/SearchPattern.java b/src/net/sf/openrocket/optimization/general/multidim/SearchPattern.java index 592f4eaa..1a7df333 100644 --- a/src/net/sf/openrocket/optimization/general/multidim/SearchPattern.java +++ b/src/net/sf/openrocket/optimization/general/multidim/SearchPattern.java @@ -58,7 +58,7 @@ public class SearchPattern { for (int j = 0; j < i; j++) { value -= MathUtil.pow2(coordinates[j]); } - value = Math.sqrt(value); + value = MathUtil.safeSqrt(value); coordinates[i] = value; pattern.add(new Point(coordinates)); diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/OptimizableParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/OptimizableParameter.java index e8506e8d..1a8f3ff1 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/OptimizableParameter.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/OptimizableParameter.java @@ -2,6 +2,7 @@ package net.sf.openrocket.optimization.rocketoptimization; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.unit.UnitGroup; /** * A parameter of a rocket or simulation that can be optimized @@ -30,4 +31,11 @@ public interface OptimizableParameter { */ public double computeValue(Simulation simulation) throws OptimizationException; + + /** + * Return the unit group associated with the computed value. + * @return the unit group of the computed value. + */ + public UnitGroup getUnitGroup(); + } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationFunction.java b/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationFunction.java index b0e8e843..2f224269 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationFunction.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationFunction.java @@ -67,16 +67,13 @@ public class RocketOptimizationFunction implements Function { @Override public double evaluate(Point point) throws InterruptedException, OptimizationException { - System.out.println("Evaluating function at point " + point); - /* * parameterValue is the computed parameter value (e.g. altitude) * goalValue is the value that needs to be minimized */ double goalValue, parameterValue; - - log.verbose("Computing optimization function value at point " + point); + log.debug("Computing optimization function value at point " + point); // Create the new simulation based on the point double[] p = point.asArray(); @@ -92,19 +89,18 @@ public class RocketOptimizationFunction implements Function { // Check whether the point is within the simulation domain - Pair d = domain.getDistanceToDomain(simulation); + Pair d = domain.getDistanceToDomain(simulation); double distance = d.getU(); - double referenceValue = d.getV(); + Value referenceValue = d.getV(); if (distance > 0 || Double.isNaN(distance)) { if (Double.isNaN(distance)) { goalValue = Double.MAX_VALUE; } else { goalValue = (distance + 1) * OUTSIDE_DOMAIN_SCALE; } - log.verbose("Optimization point is outside of domain, distance=" + distance + " goal function value=" + goalValue); - System.out.println("Optimization point is outside of domain, distance=" + distance + " goal function value=" + goalValue); + log.debug("Optimization point is outside of domain, distance=" + distance + " goal function value=" + goalValue); - fireEvent(simulation, point, referenceValue, Double.NaN, goalValue); + fireEvent(simulation, point, referenceValue, null, goalValue); return goalValue; } @@ -122,9 +118,9 @@ public class RocketOptimizationFunction implements Function { } log.verbose("Parameter value at point " + point + " is " + parameterValue + ", goal function value=" + goalValue); - System.out.println("Parameter value at point " + point + " is " + parameterValue + ", goal function value=" + goalValue); - fireEvent(simulation, point, referenceValue, parameterValue, goalValue); + fireEvent(simulation, point, referenceValue, new Value(parameterValue, parameter.getUnitGroup().getDefaultUnit()), + goalValue); return goalValue; } @@ -168,7 +164,7 @@ public class RocketOptimizationFunction implements Function { - private void fireEvent(Simulation simulation, Point p, double domainReference, double parameterValue, double goalValue) + private void fireEvent(Simulation simulation, Point p, Value domainReference, Value parameterValue, double goalValue) throws OptimizationException { if (listeners.isEmpty()) { diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationListener.java b/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationListener.java index dac89c05..05fc429b 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationListener.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/RocketOptimizationListener.java @@ -14,11 +14,11 @@ public interface RocketOptimizationListener { * Called after successful function evaluation. * * @param point the optimization point. - * @param state the values to which the rocket has been modified, in the order of "point". - * @param domainReference the domain reference value (or NaN if unavailable) + * @param state the values to which the rocket has been modified in SI units, in the order of "point". + * @param domainReference the domain reference description (or null if unavailable) * @param parameterValue the parameter value (or NaN if unavailable) * @param goalValue the goal value (return value of the function) */ - public void evaluated(Point point, Value[] state, double domainReference, double parameterValue, double goalValue); + public void evaluated(Point point, Value[] state, Value domainReference, Value parameterValue, double goalValue); } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/SimulationDomain.java b/src/net/sf/openrocket/optimization/rocketoptimization/SimulationDomain.java index d97eaae4..d2a204ec 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/SimulationDomain.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/SimulationDomain.java @@ -1,6 +1,7 @@ package net.sf.openrocket.optimization.rocketoptimization; import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.unit.Value; import net.sf.openrocket.util.Pair; /** @@ -18,11 +19,12 @@ public interface SimulationDomain { * is NaN, the simulation is outside of the domain. * * @param simulation the simulation to check. - * @return the double parameter is the domain indication; + * @return A pair indicating the status. The first element is the reference value, * a negative value or zero if the simulation is in the domain, - * a positive value or NaN if not. The second is a human-readable + * a positive value or NaN if not. The second is the value * indication of the domain (may be null). */ - public Pair getDistanceToDomain(Simulation simulation); + public Pair getDistanceToDomain(Simulation simulation); + } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/SimulationModifier.java b/src/net/sf/openrocket/optimization/rocketoptimization/SimulationModifier.java index 3efd5d6d..1989ea07 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/SimulationModifier.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/SimulationModifier.java @@ -17,11 +17,16 @@ import net.sf.openrocket.util.ChangeSource; public interface SimulationModifier extends ChangeSource { /** - * Return a name describing this modifier. + * Return a short name describing this modifier. * @return a name describing this modifier. */ public String getName(); + /** + * Return a longer description describing this modifiers. + * @return a description of the modifier. + */ + public String getDescription(); /** * Return the object this modifier is related to. This is for example the @@ -94,4 +99,13 @@ public interface SimulationModifier extends ChangeSource { */ public void modify(Simulation simulation, double scaledValue) throws OptimizationException; + + /** + * Compare whether this SimulationModifier is equivalent to another simulation modifier. + * "Equivalent" means that the simulation modifier corresponds to the same modification in + * another rocket instance (e.g. the same modification on another rocket component that + * has the same component ID). + */ + @Override + public boolean equals(Object obj); } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/domains/IdentitySimulationDomain.java b/src/net/sf/openrocket/optimization/rocketoptimization/domains/IdentitySimulationDomain.java index 2f398be3..fac678ea 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/domains/IdentitySimulationDomain.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/domains/IdentitySimulationDomain.java @@ -2,6 +2,7 @@ package net.sf.openrocket.optimization.rocketoptimization.domains; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain; +import net.sf.openrocket.unit.Value; import net.sf.openrocket.util.Pair; /** @@ -12,8 +13,8 @@ import net.sf.openrocket.util.Pair; public class IdentitySimulationDomain implements SimulationDomain { @Override - public Pair getDistanceToDomain(Simulation simulation) { - return new Pair(-1.0, Double.NaN); + public Pair getDistanceToDomain(Simulation simulation) { + return new Pair(-1.0, null); } } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java b/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java index 0142368d..143ef29a 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/domains/StabilityDomain.java @@ -11,37 +11,53 @@ import net.sf.openrocket.optimization.rocketoptimization.SimulationDomain; import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; +import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.unit.Value; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.MathUtil; import net.sf.openrocket.util.Pair; import net.sf.openrocket.util.Prefs; /** - * A simulation domain that limits the requires stability of the rocket. + * A simulation domain that limits the required stability of the rocket. * * @author Sampo Niskanen */ public class StabilityDomain implements SimulationDomain { - /* - * TODO: HIGH: Should this rather inspect stability during flight - */ - - private final double limit; - private final boolean absolute; + private final double minimum; + private final boolean minAbsolute; + private final double maximum; + private final boolean maxAbsolute; - public StabilityDomain(double limit, boolean absolute) { - this.limit = limit; - this.absolute = absolute; + /** + * Sole constructor. + * + * @param minimum minimum stability requirement (or NaN for no limit) + * @param minAbsolute true if minimum is an absolute SI measurement, + * false if it is relative to the rocket caliber + * @param maximum maximum stability requirement (or NaN for no limit) + * @param maxAbsolute true if maximum is an absolute SI measurement, + * false if it is relative to the rocket caliber + */ + public StabilityDomain(double minimum, boolean minAbsolute, double maximum, boolean maxAbsolute) { + super(); + this.minimum = minimum; + this.minAbsolute = minAbsolute; + this.maximum = maximum; + this.maxAbsolute = maxAbsolute; } + + @Override - public Pair getDistanceToDomain(Simulation simulation) { + public Pair getDistanceToDomain(Simulation simulation) { Coordinate cp, cg; double cpx, cgx; - double reference; + double absolute; + double relative; /* * These are instantiated each time because this class must be thread-safe. @@ -73,23 +89,51 @@ public class StabilityDomain implements SimulationDomain { // Calculate the reference (absolute or relative) - reference = cpx - cgx; - if (!absolute) { - double diameter = 0; - for (RocketComponent c : configuration) { - if (c instanceof SymmetricComponent) { - double d1 = ((SymmetricComponent) c).getForeRadius() * 2; - double d2 = ((SymmetricComponent) c).getAftRadius() * 2; - diameter = MathUtil.max(diameter, d1, d2); - } + absolute = cpx - cgx; + + double diameter = 0; + for (RocketComponent c : configuration) { + if (c instanceof SymmetricComponent) { + double d1 = ((SymmetricComponent) c).getForeRadius() * 2; + double d2 = ((SymmetricComponent) c).getAftRadius() * 2; + diameter = MathUtil.max(diameter, d1, d2); } - - reference = (cpx - cgx) / diameter; } + relative = absolute / diameter; - System.out.println("DOMAIN: limit=" + limit + " reference=" + reference + " result=" + (limit - reference)); + + Value desc; + if (minAbsolute && maxAbsolute) { + desc = new Value(absolute, UnitGroup.UNITS_LENGTH); + } else { + desc = new Value(relative, UnitGroup.UNITS_STABILITY_CALIBERS); + } - return new Pair(limit - reference, reference); + double ref; + if (minAbsolute) { + ref = minimum - absolute; + if (ref > 0) { + return new Pair(ref, desc); + } + } else { + ref = minimum - relative; + if (ref > 0) { + return new Pair(ref, desc); + } + } + + if (maxAbsolute) { + ref = absolute - maximum; + if (ref > 0) { + return new Pair(ref, desc); + } + } else { + ref = relative - maximum; + if (ref > 0) { + return new Pair(ref, desc); + } + } + + return new Pair(0.0, desc); } - } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/AbstractSimulationModifier.java b/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/AbstractSimulationModifier.java index 5d24e446..f680dda7 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/AbstractSimulationModifier.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/AbstractSimulationModifier.java @@ -22,6 +22,7 @@ import net.sf.openrocket.util.MathUtil; public abstract class AbstractSimulationModifier implements SimulationModifier { private final String name; + private final String description; private final Object relatedObject; private final UnitGroup unitGroup; @@ -34,14 +35,23 @@ public abstract class AbstractSimulationModifier implements SimulationModifier { /** * Sole constructor. * - * @param modifierName the name of this modifier (returned by {@link #getName()}) - * @param relatedObject the related object (returned by {@link #getRelatedObject()}) - * @param unitGroup the unit group (returned by {@link #getUnitGroup()}) + * @param modifierName the name of this modifier (returned by {@link #getName()}) + * @param modifierDescription the description of this modifier (returned by {@link #getDescription()}) + * @param relatedObject the related object (returned by {@link #getRelatedObject()}) + * @param unitGroup the unit group (returned by {@link #getUnitGroup()}) */ - public AbstractSimulationModifier(String modifierName, Object relatedObject, UnitGroup unitGroup) { + public AbstractSimulationModifier(String modifierName, String modifierDescription, Object relatedObject, + UnitGroup unitGroup) { this.name = modifierName; + this.description = modifierDescription; this.relatedObject = relatedObject; this.unitGroup = unitGroup; + + if (this.name == null || this.description == null || this.relatedObject == null || this.unitGroup == null) { + throw new IllegalArgumentException("null value provided:" + + " name=" + this.name + " description=" + description + " relatedObject=" + relatedObject + + " unitGroup=" + unitGroup); + } } @@ -50,6 +60,11 @@ public abstract class AbstractSimulationModifier implements SimulationModifier { return name; } + @Override + public String getDescription() { + return description; + } + @Override public Object getRelatedObject() { return relatedObject; @@ -155,4 +170,40 @@ public abstract class AbstractSimulationModifier implements SimulationModifier { } } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + + AbstractSimulationModifier other = (AbstractSimulationModifier) obj; + if (!this.description.equals(other.description)) + return false; + if (!this.name.equals(other.name)) + return false; + if (!this.relatedObject.equals(other.relatedObject)) + return false; + if (!this.unitGroup.equals(other.unitGroup)) + return false; + + return true; + } + + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (description.hashCode()); + result = prime * result + (name.hashCode()); + result = prime * result + (relatedObject.hashCode()); + result = prime * result + (unitGroup.hashCode()); + return result; + } + + } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericComponentModifier.java b/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericComponentModifier.java index b22d9332..bd80889a 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericComponentModifier.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericComponentModifier.java @@ -19,18 +19,19 @@ public class GenericComponentModifier extends GenericModifier { /** * Sole constructor. * - * @param modifierName the name of this modifier (returned by {@link #getName()}) - * @param relatedObject the related object (returned by {@link #getRelatedObject()}) - * @param unitGroup the unit group (returned by {@link #getUnitGroup()}) - * @param multiplier the multiplier by which the value returned by the getter is multiplied - * to obtain the desired value - * @param componentClass the RocketComponent class type that is being modified - * @param componentId the ID of the component to modify - * @param methodName the base name of the getter/setter methods (without "get"/"set") + * @param modifierName the name of this modifier (returned by {@link #getName()}) + * @param modifierDescription the description of this modifier (returned by {@link #getDescription()}) + * @param relatedObject the related object (returned by {@link #getRelatedObject()}) + * @param unitGroup the unit group (returned by {@link #getUnitGroup()}) + * @param multiplier the multiplier by which the value returned by the getter is multiplied + * to obtain the desired value + * @param componentClass the RocketComponent class type that is being modified + * @param componentId the ID of the component to modify + * @param methodName the base name of the getter/setter methods (without "get"/"set") */ - public GenericComponentModifier(String modifierName, Object relatedObject, UnitGroup unitGroup, + public GenericComponentModifier(String modifierName, String modifierDescription, Object relatedObject, UnitGroup unitGroup, double multiplier, Class componentClass, String componentId, String methodName) { - super(modifierName, relatedObject, unitGroup, multiplier, componentClass, methodName); + super(modifierName, modifierDescription, relatedObject, unitGroup, multiplier, componentClass, methodName); this.componentClass = componentClass; this.componentId = componentId; diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericModifier.java b/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericModifier.java index f2cb67f7..ec931108 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericModifier.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/modifiers/GenericModifier.java @@ -29,6 +29,7 @@ public abstract class GenericModifier extends AbstractSimulationModifier { * Sole constructor. * * @param modifierName the name of this modifier (returned by {@link #getName()}) + * @param modifierDescription the description of this modifier (returned by {@link #getDescription()}) * @param relatedObject the related object (returned by {@link #getRelatedObject()}) * @param unitGroup the unit group (returned by {@link #getUnitGroup()}) * @param multiplier the multiplier by which the value returned by the getter is multiplied @@ -36,9 +37,9 @@ public abstract class GenericModifier extends AbstractSimulationModifier { * @param modifiedClass the class type that {@link #getModifiedObject(Simulation)} returns * @param methodName the base name of the getter/setter methods (without "get"/"set") */ - public GenericModifier(String modifierName, Object relatedObject, UnitGroup unitGroup, double multiplier, - Class modifiedClass, String methodName) { - super(modifierName, relatedObject, unitGroup); + public GenericModifier(String modifierName, String modifierDescription, Object relatedObject, UnitGroup unitGroup, + double multiplier, Class modifiedClass, String methodName) { + super(modifierName, modifierDescription, relatedObject, unitGroup); this.multiplier = multiplier; this.modifiedClass = modifiedClass; diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/GroundHitVelocityParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/GroundHitVelocityParameter.java new file mode 100644 index 00000000..431e9ae5 --- /dev/null +++ b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/GroundHitVelocityParameter.java @@ -0,0 +1,55 @@ +package net.sf.openrocket.optimization.rocketoptimization.parameters; + +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.simulation.FlightDataType; +import net.sf.openrocket.simulation.exception.MotorIgnitionException; +import net.sf.openrocket.simulation.exception.SimulationException; +import net.sf.openrocket.simulation.exception.SimulationLaunchException; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; + +/** + * An optimization parameter that computes the speed the rocket hits the ground. + * + * @author Sampo Niskanen + */ +public class GroundHitVelocityParameter implements OptimizableParameter { + + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + + @Override + public String getName() { + return trans.get("name"); + } + + @Override + public double computeValue(Simulation simulation) throws OptimizationException { + try { + log.debug("Running simulation to evaluate ground hit speed"); + simulation.simulate(); + double value = simulation.getSimulatedData().getBranch(0).getLast(FlightDataType.TYPE_VELOCITY_TOTAL); + log.debug("Ground hit speed was " + value); + return value; + } catch (MotorIgnitionException e) { + // A problem with motor ignition will cause optimization to fail + throw new OptimizationException(e); + } catch (SimulationLaunchException e) { + // Other launch exceptions result in zero altitude + return Double.NaN; + } catch (SimulationException e) { + // Other exceptions fail + throw new OptimizationException(e); + } + } + + @Override + public UnitGroup getUnitGroup() { + return UnitGroup.UNITS_VELOCITY; + } + +} diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/LandingDistanceParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/LandingDistanceParameter.java new file mode 100644 index 00000000..4d6f5713 --- /dev/null +++ b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/LandingDistanceParameter.java @@ -0,0 +1,55 @@ +package net.sf.openrocket.optimization.rocketoptimization.parameters; + +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.simulation.FlightDataType; +import net.sf.openrocket.simulation.exception.MotorIgnitionException; +import net.sf.openrocket.simulation.exception.SimulationException; +import net.sf.openrocket.simulation.exception.SimulationLaunchException; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; + +/** + * An optimization parameter that computes the distance where a rocket lands. + * + * @author Sampo Niskanen + */ +public class LandingDistanceParameter implements OptimizableParameter { + + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + + @Override + public String getName() { + return trans.get("name"); + } + + @Override + public double computeValue(Simulation simulation) throws OptimizationException { + try { + log.debug("Running simulation to evaluate rocket landing distance"); + simulation.simulate(); + double value = simulation.getSimulatedData().getBranch(0).getLast(FlightDataType.TYPE_POSITION_XY); + log.debug("Landing distance was " + value); + return value; + } catch (MotorIgnitionException e) { + // A problem with motor ignition will cause optimization to fail + throw new OptimizationException(e); + } catch (SimulationLaunchException e) { + // Other launch exceptions result in zero altitude + return Double.NaN; + } catch (SimulationException e) { + // Other exceptions fail + throw new OptimizationException(e); + } + } + + @Override + public UnitGroup getUnitGroup() { + return UnitGroup.UNITS_DISTANCE; + } + +} diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAccelerationParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAccelerationParameter.java new file mode 100644 index 00000000..51f73d82 --- /dev/null +++ b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAccelerationParameter.java @@ -0,0 +1,56 @@ +package net.sf.openrocket.optimization.rocketoptimization.parameters; + +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.simulation.FlightDataType; +import net.sf.openrocket.simulation.exception.MotorIgnitionException; +import net.sf.openrocket.simulation.exception.SimulationException; +import net.sf.openrocket.simulation.exception.SimulationLaunchException; +import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; + +/** + * An optimization parameter that computes the maximum acceleration during a simulated flight. + * + * @author Sampo Niskanen + */ +public class MaximumAccelerationParameter implements OptimizableParameter { + + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + + @Override + public String getName() { + return trans.get("name"); + } + + @Override + public double computeValue(Simulation simulation) throws OptimizationException { + try { + log.debug("Running simulation to evaluate maximum acceleration"); + simulation.simulate(new ApogeeEndListener()); + double value = simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_ACCELERATION_TOTAL); + log.debug("Maximum acceleration was " + value); + return value; + } catch (MotorIgnitionException e) { + // A problem with motor ignition will cause optimization to fail + throw new OptimizationException(e); + } catch (SimulationLaunchException e) { + // Other launch exceptions result in zero velocity + return Double.NaN; + } catch (SimulationException e) { + // Other exceptions fail + throw new OptimizationException(e); + } + } + + @Override + public UnitGroup getUnitGroup() { + return UnitGroup.UNITS_ACCELERATION; + } + +} diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAltitudeParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAltitudeParameter.java index da40a676..248d1cf9 100644 --- a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAltitudeParameter.java +++ b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumAltitudeParameter.java @@ -1,11 +1,17 @@ package net.sf.openrocket.optimization.rocketoptimization.parameters; import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; import net.sf.openrocket.simulation.FlightDataType; +import net.sf.openrocket.simulation.exception.MotorIgnitionException; import net.sf.openrocket.simulation.exception.SimulationException; +import net.sf.openrocket.simulation.exception.SimulationLaunchException; import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; /** * An optimization parameter that computes the maximum altitude of a simulated flight. @@ -14,21 +20,36 @@ import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener; */ public class MaximumAltitudeParameter implements OptimizableParameter { + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + @Override public String getName() { - return "Maximum altitude"; + return trans.get("name"); } @Override public double computeValue(Simulation simulation) throws OptimizationException { try { - System.out.println("Running simulation"); + log.debug("Running simulation to evaluate apogee altitude"); simulation.simulate(new ApogeeEndListener()); - System.out.println("Maximum altitude was " + simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_ALTITUDE)); + log.debug("Maximum altitude was " + simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_ALTITUDE)); return simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_ALTITUDE); + } catch (MotorIgnitionException e) { + // A problem with motor ignition will cause optimization to fail + throw new OptimizationException(e); + } catch (SimulationLaunchException e) { + // Other launch exceptions result in zero altitude + return 0.0; } catch (SimulationException e) { + // Other exceptions fail throw new OptimizationException(e); } } + @Override + public UnitGroup getUnitGroup() { + return UnitGroup.UNITS_DISTANCE; + } + } diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumVelocityParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumVelocityParameter.java new file mode 100644 index 00000000..58c7a278 --- /dev/null +++ b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/MaximumVelocityParameter.java @@ -0,0 +1,56 @@ +package net.sf.openrocket.optimization.rocketoptimization.parameters; + +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.optimization.general.OptimizationException; +import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.simulation.FlightDataType; +import net.sf.openrocket.simulation.exception.MotorIgnitionException; +import net.sf.openrocket.simulation.exception.SimulationException; +import net.sf.openrocket.simulation.exception.SimulationLaunchException; +import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; + +/** + * An optimization parameter that computes the maximum velocity during a simulated flight. + * + * @author Sampo Niskanen + */ +public class MaximumVelocityParameter implements OptimizableParameter { + + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + + @Override + public String getName() { + return trans.get("name"); + } + + @Override + public double computeValue(Simulation simulation) throws OptimizationException { + try { + log.debug("Running simulation to evaluate maximum velocity"); + simulation.simulate(new ApogeeEndListener()); + double value = simulation.getSimulatedData().getBranch(0).getMaximum(FlightDataType.TYPE_VELOCITY_TOTAL); + log.debug("Maximum velocity was " + value); + return value; + } catch (MotorIgnitionException e) { + // A problem with motor ignition will cause optimization to fail + throw new OptimizationException(e); + } catch (SimulationLaunchException e) { + // Other launch exceptions result in zero velocity + return Double.NaN; + } catch (SimulationException e) { + // Other exceptions fail + throw new OptimizationException(e); + } + } + + @Override + public UnitGroup getUnitGroup() { + return UnitGroup.UNITS_VELOCITY; + } + +} diff --git a/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java new file mode 100644 index 00000000..a9f099c2 --- /dev/null +++ b/src/net/sf/openrocket/optimization/rocketoptimization/parameters/StabilityParameter.java @@ -0,0 +1,111 @@ +package net.sf.openrocket.optimization.rocketoptimization.parameters; + +import net.sf.openrocket.aerodynamics.AerodynamicCalculator; +import net.sf.openrocket.aerodynamics.BarrowmanCalculator; +import net.sf.openrocket.aerodynamics.FlightConditions; +import net.sf.openrocket.document.Simulation; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.LogHelper; +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.RocketComponent; +import net.sf.openrocket.rocketcomponent.SymmetricComponent; +import net.sf.openrocket.startup.Application; +import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.util.Coordinate; +import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Prefs; + +/** + * An optimization parameter that computes either the absolute or relative stability of a rocket. + * + * @author Sampo Niskanen + */ +public class StabilityParameter implements OptimizableParameter { + + private static final LogHelper log = Application.getLogger(); + private static final Translator trans = Application.getTranslator(); + + + private final boolean absolute; + + public StabilityParameter(boolean absolute) { + this.absolute = absolute; + } + + + @Override + public String getName() { + return trans.get("name") + " (" + getUnitGroup().getDefaultUnit().getUnit() + ")"; + } + + @Override + public double computeValue(Simulation simulation) throws OptimizationException { + Coordinate cp, cg; + double cpx, cgx; + double stability; + + log.debug("Calculating stability of simulation, absolute=" + absolute); + + /* + * These are instantiated each time because this class must be thread-safe. + * 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(); + FlightConditions conditions = new FlightConditions(configuration); + conditions.setMach(Prefs.getDefaultMach()); + conditions.setAOA(0); + conditions.setRollRate(0); + + cp = aerodynamicCalculator.getWorstCP(configuration, conditions, null); + cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS); + + if (cp.weight > 0.000001) + cpx = cp.x; + else + cpx = Double.NaN; + + if (cg.weight > 0.000001) + cgx = cg.x; + else + cgx = Double.NaN; + + + // Calculate the reference (absolute or relative) + stability = cpx - cgx; + + if (!absolute) { + double diameter = 0; + for (RocketComponent c : configuration) { + if (c instanceof SymmetricComponent) { + double d1 = ((SymmetricComponent) c).getForeRadius() * 2; + double d2 = ((SymmetricComponent) c).getAftRadius() * 2; + diameter = MathUtil.max(diameter, d1, d2); + } + } + stability = stability / diameter; + } + + log.debug("Resulting stability is " + stability + ", absolute=" + absolute); + + return stability; + } + + @Override + public UnitGroup getUnitGroup() { + if (absolute) { + return UnitGroup.UNITS_LENGTH; + } else { + return UnitGroup.UNITS_STABILITY_CALIBERS; + } + } + +} diff --git a/src/net/sf/openrocket/optimization/services/DefaultOptimizableParameterService.java b/src/net/sf/openrocket/optimization/services/DefaultOptimizableParameterService.java index 00178d0e..65b9ab98 100644 --- a/src/net/sf/openrocket/optimization/services/DefaultOptimizableParameterService.java +++ b/src/net/sf/openrocket/optimization/services/DefaultOptimizableParameterService.java @@ -6,7 +6,12 @@ import java.util.List; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.optimization.rocketoptimization.OptimizableParameter; +import net.sf.openrocket.optimization.rocketoptimization.parameters.GroundHitVelocityParameter; +import net.sf.openrocket.optimization.rocketoptimization.parameters.LandingDistanceParameter; +import net.sf.openrocket.optimization.rocketoptimization.parameters.MaximumAccelerationParameter; import net.sf.openrocket.optimization.rocketoptimization.parameters.MaximumAltitudeParameter; +import net.sf.openrocket.optimization.rocketoptimization.parameters.MaximumVelocityParameter; +import net.sf.openrocket.optimization.rocketoptimization.parameters.StabilityParameter; /** * Default implementation for optimization parameter service. @@ -20,6 +25,12 @@ public class DefaultOptimizableParameterService implements OptimizableParameterS List list = new ArrayList(); list.add(new MaximumAltitudeParameter()); + list.add(new MaximumVelocityParameter()); + list.add(new MaximumAccelerationParameter()); + list.add(new StabilityParameter(false)); + list.add(new StabilityParameter(true)); + list.add(new GroundHitVelocityParameter()); + list.add(new LandingDistanceParameter()); return list; } diff --git a/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java b/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java index 977cd186..565330aa 100644 --- a/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java +++ b/src/net/sf/openrocket/optimization/services/DefaultSimulationModifierService.java @@ -7,21 +7,41 @@ import java.util.List; import java.util.Map; import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.document.Simulation; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier; import net.sf.openrocket.optimization.rocketoptimization.modifiers.GenericComponentModifier; import net.sf.openrocket.rocketcomponent.BodyTube; +import net.sf.openrocket.rocketcomponent.EllipticalFinSet; +import net.sf.openrocket.rocketcomponent.FinSet; +import net.sf.openrocket.rocketcomponent.FreeformFinSet; +import net.sf.openrocket.rocketcomponent.InternalComponent; +import net.sf.openrocket.rocketcomponent.LaunchLug; +import net.sf.openrocket.rocketcomponent.MassComponent; +import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.Parachute; +import net.sf.openrocket.rocketcomponent.RecoveryDevice; +import net.sf.openrocket.rocketcomponent.RecoveryDevice.DeployEvent; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.rocketcomponent.Streamer; import net.sf.openrocket.rocketcomponent.Transition; +import net.sf.openrocket.rocketcomponent.TrapezoidFinSet; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.util.BugException; +import net.sf.openrocket.util.Reflection; +import net.sf.openrocket.util.Reflection.Method; public class DefaultSimulationModifierService implements SimulationModifierService { private static final Translator trans = Application.getTranslator(); + private static final double DEFAULT_RANGE_MULTIPLIER = 2.0; + + private static final Map, List> definitions = new HashMap, List>(); static { //addModifier("optimization.modifier.", unitGroup, multiplier, componentClass, methodName); @@ -33,23 +53,56 @@ public class DefaultSimulationModifierService implements SimulationModifierServi */ addModifier("optimization.modifier.nosecone.length", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Length"); - addModifier("optimization.modifier.nosecone.diameter", UnitGroup.UNITS_LENGTH, 2.0, NoseCone.class, "AftRadius"); - addModifier("optimization.modifier.nosecone.thickness", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Thickness"); + addModifier("optimization.modifier.nosecone.diameter", UnitGroup.UNITS_LENGTH, 2.0, NoseCone.class, "AftRadius", "isAftRadiusAutomatic"); + addModifier("optimization.modifier.nosecone.thickness", UnitGroup.UNITS_LENGTH, 1.0, NoseCone.class, "Thickness", "isFilled"); addModifier("optimization.modifier.transition.length", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Length"); - addModifier("optimization.modifier.transition.forediameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "ForeRadius"); - addModifier("optimization.modifier.transition.aftdiameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "AftRadius"); - addModifier("optimization.modifier.transition.thickness", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Thickness"); + addModifier("optimization.modifier.transition.forediameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "ForeRadius", "isForeRadiusAutomatic"); + addModifier("optimization.modifier.transition.aftdiameter", UnitGroup.UNITS_LENGTH, 2.0, Transition.class, "AftRadius", "isAftRadiusAutomatic"); + addModifier("optimization.modifier.transition.thickness", UnitGroup.UNITS_LENGTH, 1.0, Transition.class, "Thickness", "isFilled"); addModifier("optimization.modifier.bodytube.length", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Length"); - addModifier("optimization.modifier.bodytube.outerDiameter", UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, "OuterRadius"); - addModifier("optimization.modifier.bodytube.thickness", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Thickness"); + addModifier("optimization.modifier.bodytube.outerDiameter", UnitGroup.UNITS_LENGTH, 2.0, BodyTube.class, "OuterRadius", "isOuterRadiusAutomatic"); + addModifier("optimization.modifier.bodytube.thickness", UnitGroup.UNITS_LENGTH, 1.0, BodyTube.class, "Thickness", "isFilled"); + + addModifier("optimization.modifier.trapezoidfinset.rootChord", UnitGroup.UNITS_LENGTH, 1.0, TrapezoidFinSet.class, "RootChord"); + addModifier("optimization.modifier.trapezoidfinset.tipChord", UnitGroup.UNITS_LENGTH, 1.0, TrapezoidFinSet.class, "TipChord"); + addModifier("optimization.modifier.trapezoidfinset.sweep", UnitGroup.UNITS_LENGTH, 1.0, TrapezoidFinSet.class, "Sweep"); + addModifier("optimization.modifier.trapezoidfinset.height", UnitGroup.UNITS_LENGTH, 1.0, TrapezoidFinSet.class, "Height"); + addModifier("optimization.modifier.finset.cant", UnitGroup.UNITS_ANGLE, 1.0, TrapezoidFinSet.class, "CantAngle"); + + addModifier("optimization.modifier.ellipticalfinset.length", UnitGroup.UNITS_LENGTH, 1.0, EllipticalFinSet.class, "Length"); + addModifier("optimization.modifier.ellipticalfinset.height", UnitGroup.UNITS_LENGTH, 1.0, EllipticalFinSet.class, "Height"); + addModifier("optimization.modifier.finset.cant", UnitGroup.UNITS_ANGLE, 1.0, EllipticalFinSet.class, "CantAngle"); + + addModifier("optimization.modifier.finset.cant", UnitGroup.UNITS_ANGLE, 1.0, FreeformFinSet.class, "CantAngle"); + + addModifier("optimization.modifier.launchlug.length", UnitGroup.UNITS_LENGTH, 1.0, LaunchLug.class, "Length"); + addModifier("optimization.modifier.launchlug.outerDiameter", UnitGroup.UNITS_LENGTH, 2.0, LaunchLug.class, "OuterRadius"); + addModifier("optimization.modifier.launchlug.thickness", UnitGroup.UNITS_LENGTH, 1.0, LaunchLug.class, "Thickness"); + addModifier("optimization.modifier.masscomponent.mass", UnitGroup.UNITS_MASS, 1.0, MassComponent.class, "ComponentMass"); + + addModifier("optimization.modifier.parachute.diameter", UnitGroup.UNITS_LENGTH, 1.0, Parachute.class, "Diameter"); + addModifier("optimization.modifier.parachute.coefficient", UnitGroup.UNITS_NONE, 1.0, Parachute.class, "CD"); + + addModifier("optimization.modifier.streamer.length", UnitGroup.UNITS_LENGTH, 1.0, Streamer.class, "StripLength"); + addModifier("optimization.modifier.streamer.width", UnitGroup.UNITS_LENGTH, 1.0, Streamer.class, "StripWidth"); + addModifier("optimization.modifier.streamer.aspectRatio", UnitGroup.UNITS_NONE, 1.0, Streamer.class, "AspectRatio"); + addModifier("optimization.modifier.streamer.coefficient", UnitGroup.UNITS_NONE, 1.0, Streamer.class, "CD", "isCDAutomatic"); + + } + + private static void addModifier(String modifierNameKey, UnitGroup unitGroup, double multiplier, + Class componentClass, String methodName) { + addModifier(modifierNameKey, unitGroup, multiplier, componentClass, methodName, null); } private static void addModifier(String modifierNameKey, UnitGroup unitGroup, double multiplier, - Class componentClass, String methodName) { + Class componentClass, String methodName, String autoMethod) { + + String modifierDescriptionKey = modifierNameKey + ".desc"; List list = definitions.get(componentClass); if (list == null) { @@ -57,7 +110,8 @@ public class DefaultSimulationModifierService implements SimulationModifierServi definitions.put(componentClass, list); } - ModifierDefinition definition = new ModifierDefinition(modifierNameKey, unitGroup, multiplier, componentClass, methodName); + ModifierDefinition definition = new ModifierDefinition(modifierNameKey, modifierDescriptionKey, unitGroup, + multiplier, componentClass, methodName, autoMethod); list.add(definition); } @@ -69,29 +123,182 @@ public class DefaultSimulationModifierService implements SimulationModifierServi List modifiers = new ArrayList(); Rocket rocket = document.getRocket(); + + // Simulation is used to calculate default min/max values + Simulation simulation = new Simulation(rocket); + simulation.getConfiguration().setMotorConfigurationID(null); + for (RocketComponent c : rocket) { // Attribute modifiers List list = definitions.get(c.getClass()); if (list != null) { for (ModifierDefinition def : list) { + + // Ignore modifier if value is set to automatic + if (def.autoMethod != null) { + Method m = Reflection.findMethod(c.getClass(), def.autoMethod); + if ((Boolean) m.invoke(c)) { + continue; + } + } + SimulationModifier mod = new GenericComponentModifier( - trans.get(def.modifierNameKey), c, def.unitGroup, def.multiplier, def.componentClass, - c.getID(), def.methodName); + trans.get(def.modifierNameKey), trans.get(def.modifierDescriptionKey), c, def.unitGroup, + def.multiplier, def.componentClass, c.getID(), def.methodName); + setDefaultMinMax(mod, simulation); modifiers.add(mod); } } - // TODO: HIGH: Conditional modifiers (overrides) + + // Add override modifiers if mass/CG is overridden + if (c.isMassOverridden()) { + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.rocketcomponent.overrideMass"), + trans.get("optimization.modifier.rocketcomponent.overrideMass.desc"), + c, UnitGroup.UNITS_MASS, + 1.0, c.getClass(), c.getID(), "OverrideMass"); + setDefaultMinMax(mod, simulation); + modifiers.add(mod); + } + if (c.isCGOverridden()) { + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.rocketcomponent.overrideCG"), + trans.get("optimization.modifier.rocketcomponent.overrideCG.desc"), + c, UnitGroup.UNITS_LENGTH, + 1.0, c.getClass(), c.getID(), "OverrideCGX"); + mod.setMinValue(0); + mod.setMaxValue(c.getLength()); + modifiers.add(mod); + } + + + // Conditional motor mount parameters + if (c instanceof MotorMount) { + MotorMount mount = (MotorMount) c; + if (mount.isMotorMount()) { + + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.motormount.overhang"), + trans.get("optimization.modifier.motormount.overhang.desc"), + c, UnitGroup.UNITS_LENGTH, + 1.0, c.getClass(), c.getID(), "MotorOverhang"); + setDefaultMinMax(mod, simulation); + modifiers.add(mod); + + mod = new GenericComponentModifier( + trans.get("optimization.modifier.motormount.delay"), + trans.get("optimization.modifier.motormount.delay.desc"), + c, UnitGroup.UNITS_SHORT_TIME, + 1.0, c.getClass(), c.getID(), "IgnitionDelay"); + mod.setMinValue(0); + mod.setMaxValue(5); + modifiers.add(mod); + + } + } - // TODO: Transition / Nose cone shape parameter (conditional) + + // Inner component positioning + if (c instanceof InternalComponent) { + RocketComponent parent = c.getParent(); + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.internalcomponent.position"), + trans.get("optimization.modifier.internalcomponent.position.desc"), + c, UnitGroup.UNITS_LENGTH, + 1.0, c.getClass(), c.getID(), "PositionValue"); + mod.setMinValue(0); + mod.setMaxValue(parent.getLength()); + modifiers.add(mod); + } + + + // Custom min/max for fin set position + if (c instanceof FinSet) { + RocketComponent parent = c.getParent(); + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.finset.position"), + trans.get("optimization.modifier.finset.position.desc"), + c, UnitGroup.UNITS_LENGTH, + 1.0, c.getClass(), c.getID(), "PositionValue"); + mod.setMinValue(0); + mod.setMaxValue(parent.getLength()); + modifiers.add(mod); + } + + + // Custom min/max for launch lug position + if (c instanceof LaunchLug) { + RocketComponent parent = c.getParent(); + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.launchlug.position"), + trans.get("optimization.modifier.launchlug.position.desc"), + c, UnitGroup.UNITS_LENGTH, + 1.0, c.getClass(), c.getID(), "PositionValue"); + mod.setMinValue(0); + mod.setMaxValue(parent.getLength()); + modifiers.add(mod); + } + + + // Recovery device deployment altitude and delay + if (c instanceof RecoveryDevice) { + RecoveryDevice device = (RecoveryDevice) c; + + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier.recoverydevice.deployDelay"), + trans.get("optimization.modifier.recoverydevice.deployDelay.desc"), + c, UnitGroup.UNITS_SHORT_TIME, + 1.0, c.getClass(), c.getID(), "DeployDelay"); + mod.setMinValue(0); + mod.setMaxValue(10); + modifiers.add(mod); + + if (device.getDeployEvent() == DeployEvent.ALTITUDE) { + mod = new GenericComponentModifier( + trans.get("optimization.modifier.recoverydevice.deployAltitude"), + trans.get("optimization.modifier.recoverydevice.deployAltitude.desc"), + c, UnitGroup.UNITS_DISTANCE, + 1.0, c.getClass(), c.getID(), "DeployAltitude"); + setDefaultMinMax(mod, simulation); + modifiers.add(mod); + } + } + + + // Conditional shape parameter of Transition + if (c instanceof Transition) { + Transition transition = (Transition) c; + Transition.Shape shape = transition.getType(); + if (shape.usesParameter()) { + SimulationModifier mod = new GenericComponentModifier( + trans.get("optimization.modifier." + c.getClass().getSimpleName().toLowerCase() + ".shapeparameter"), + trans.get("optimization.modifier." + c.getClass().getSimpleName().toLowerCase() + ".shapeparameter.desc"), + c, UnitGroup.UNITS_NONE, + 1.0, c.getClass(), c.getID(), "ShapeParameter"); + mod.setMinValue(shape.minParameter()); + mod.setMaxValue(shape.maxParameter()); + modifiers.add(mod); + } + } } return modifiers; } - + private void setDefaultMinMax(SimulationModifier mod, Simulation simulation) { + try { + double current = mod.getCurrentSIValue(simulation); + mod.setMinValue(current / DEFAULT_RANGE_MULTIPLIER); + mod.setMaxValue(current * DEFAULT_RANGE_MULTIPLIER); + } catch (OptimizationException e) { + throw new BugException("Simulation modifier threw exception", e); + } + } + + /* * String modifierName, Object relatedObject, UnitGroup unitGroup, double multiplier, Class componentClass, String componentId, String methodName @@ -99,20 +306,23 @@ public class DefaultSimulationModifierService implements SimulationModifierServi private static class ModifierDefinition { private final String modifierNameKey; + private final String modifierDescriptionKey; private final UnitGroup unitGroup; private final double multiplier; private final Class componentClass; private final String methodName; + private final String autoMethod; - public ModifierDefinition(String modifierNameKey, UnitGroup unitGroup, double multiplier, - Class componentClass, String methodName) { - super(); + public ModifierDefinition(String modifierNameKey, String modifierDescriptionKey, UnitGroup unitGroup, + double multiplier, Class componentClass, String methodName, String autoMethod) { this.modifierNameKey = modifierNameKey; + this.modifierDescriptionKey = modifierDescriptionKey; this.unitGroup = unitGroup; this.multiplier = multiplier; this.componentClass = componentClass; this.methodName = methodName; + this.autoMethod = autoMethod; } } diff --git a/src/net/sf/openrocket/rocketcomponent/Configuration.java b/src/net/sf/openrocket/rocketcomponent/Configuration.java index 9ab9c0b3..be00f1d4 100644 --- a/src/net/sf/openrocket/rocketcomponent/Configuration.java +++ b/src/net/sf/openrocket/rocketcomponent/Configuration.java @@ -328,7 +328,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi /** * Perform a deep-clone. The object references are also cloned and no - * listeners are listening on the cloned object. + * listeners are listening on the cloned object. The rocket instance remains the same. */ @Override public Configuration clone() { diff --git a/src/net/sf/openrocket/rocketcomponent/FinSet.java b/src/net/sf/openrocket/rocketcomponent/FinSet.java index d628478a..5e40810b 100644 --- a/src/net/sf/openrocket/rocketcomponent/FinSet.java +++ b/src/net/sf/openrocket/rocketcomponent/FinSet.java @@ -513,7 +513,7 @@ public abstract class FinSet extends ExternalComponent { double radius = getBodyRadius(); - return fins * (inertia + MathUtil.pow2(Math.sqrt(h2) + radius)); + return fins * (inertia + MathUtil.pow2(MathUtil.safeSqrt(h2) + radius)); } @@ -538,9 +538,9 @@ public abstract class FinSet extends ExternalComponent { double h = getSpan(); if (MathUtil.equals(w * h, 0)) { - h = Math.sqrt(area); + h = MathUtil.safeSqrt(area); } else { - h = Math.sqrt(h * area / w); + h = MathUtil.safeSqrt(h * area / w); } if (fins == 1) diff --git a/src/net/sf/openrocket/rocketcomponent/MassComponent.java b/src/net/sf/openrocket/rocketcomponent/MassComponent.java index 47911aa0..49c139b0 100644 --- a/src/net/sf/openrocket/rocketcomponent/MassComponent.java +++ b/src/net/sf/openrocket/rocketcomponent/MassComponent.java @@ -4,9 +4,15 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.MathUtil; +/** + * This class represents a generic component that has a specific mass and an approximate shape. + * The mass is accessed via get/setComponentMass. + * + * @author Sampo Niskanen + */ public class MassComponent extends MassObject { private static final Translator trans = Application.getTranslator(); - + private double mass = 0; diff --git a/src/net/sf/openrocket/rocketcomponent/Parachute.java b/src/net/sf/openrocket/rocketcomponent/Parachute.java index 0ce768f9..4403d255 100644 --- a/src/net/sf/openrocket/rocketcomponent/Parachute.java +++ b/src/net/sf/openrocket/rocketcomponent/Parachute.java @@ -8,7 +8,7 @@ import net.sf.openrocket.util.Prefs; public class Parachute extends RecoveryDevice { private static final Translator trans = Application.getTranslator(); - + public static final double DEFAULT_CD = 0.8; private double diameter; @@ -94,7 +94,7 @@ public class Parachute extends RecoveryDevice { public void setArea(double area) { if (MathUtil.equals(getArea(), area)) return; - diameter = Math.sqrt(area / Math.PI) * 2; + diameter = MathUtil.safeSqrt(area / Math.PI) * 2; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/src/net/sf/openrocket/rocketcomponent/Streamer.java b/src/net/sf/openrocket/rocketcomponent/Streamer.java index dd071a40..8d73c457 100644 --- a/src/net/sf/openrocket/rocketcomponent/Streamer.java +++ b/src/net/sf/openrocket/rocketcomponent/Streamer.java @@ -60,7 +60,7 @@ public class Streamer extends RecoveryDevice { ratio = Math.max(ratio, 0.01); double area = getArea(); - stripWidth = Math.sqrt(area / ratio); + stripWidth = MathUtil.safeSqrt(area / ratio); stripLength = ratio * stripWidth; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -76,7 +76,7 @@ public class Streamer extends RecoveryDevice { return; double ratio = Math.max(getAspectRatio(), 0.01); - stripWidth = Math.sqrt(area / ratio); + stripWidth = MathUtil.safeSqrt(area / ratio); stripLength = ratio * stripWidth; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java b/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java index ac8318de..275de205 100644 --- a/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java +++ b/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java @@ -21,12 +21,12 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial public static final double DEFAULT_RADIUS = 0.025; public static final double DEFAULT_THICKNESS = 0.002; - private static final int DIVISIONS = 100; // No. of divisions when integrating + private static final int DIVISIONS = 100; // No. of divisions when integrating protected boolean filled = false; protected double thickness = DEFAULT_THICKNESS; - + // Cached data, default values signify not calculated private double wetArea = -1; private double planArea = -1; @@ -38,11 +38,11 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial private Coordinate cg = null; - + public SymmetricComponent() { super(); } - + /** * Return the component radius at position x. @@ -51,15 +51,21 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial * the component. */ public abstract double getRadius(double x); + + @Override public abstract double getInnerRadius(double x); - + public abstract double getForeRadius(); + public abstract boolean isForeRadiusAutomatic(); + public abstract double getAftRadius(); + public abstract boolean isAftRadiusAutomatic(); // Implement the Radial interface: + @Override public final double getOuterRadius(double x) { return getRadius(x); } @@ -76,14 +82,14 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial } - + /** * Return the component wall thickness. */ public double getThickness() { if (filled) - return Math.max(getForeRadius(),getAftRadius()); - return Math.min(thickness,Math.max(getForeRadius(),getAftRadius())); + return Math.max(getForeRadius(), getAftRadius()); + return Math.min(thickness, Math.max(getForeRadius(), getAftRadius())); } @@ -94,11 +100,11 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial public void setThickness(double thickness) { if ((this.thickness == thickness) && !filled) return; - this.thickness = MathUtil.clamp(thickness,0,Math.max(getForeRadius(),getAftRadius())); + this.thickness = MathUtil.clamp(thickness, 0, Math.max(getForeRadius(), getAftRadius())); filled = false; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - + /** * Returns whether the component is set as filled. If it is set filled, then the @@ -120,23 +126,23 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - + /** * Adds component bounds at a number of points between 0...length. */ @Override public Collection getComponentBounds() { List list = new ArrayList(20); - for (int n=0; n<=5; n++) { - double x = n*length/5; + for (int n = 0; n <= 5; n++) { + double x = n * length / 5; double r = getRadius(x); - addBound(list,x,r); + addBound(list, x, r); } return list; } - + /** * Calculate volume of the component by integrating over the length of the component. * The method caches the result, so subsequent calls are instant. Subclasses may @@ -231,7 +237,7 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial @Override public double getLongitudinalUnitInertia() { if (longitudinalInertia < 0) { - if (getComponentVolume() > 0.0000001) // == 0.1cm^3 + if (getComponentVolume() > 0.0000001) // == 0.1cm^3 integrateInertiaVolume(); else integrateInertiaSurface(); @@ -257,7 +263,7 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial * Performs integration over the length of the component and updates the cached variables. */ private void integrate() { - double x,r1,r2; + double x, r1, r2; double cgx; // Check length > 0 @@ -270,12 +276,12 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial return; } - + // Integrate for volume, CG, wetted area and planform area - final double l = length/DIVISIONS; - final double pil = Math.PI*l; // PI * l - final double pil3 = Math.PI*l/3; // PI * l/3 + final double l = length / DIVISIONS; + final double pil = Math.PI * l; // PI * l + final double pil3 = Math.PI * l / 3; // PI * l/3 r1 = getRadius(0); x = 0; wetArea = 0; @@ -285,44 +291,44 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial volume = 0; cgx = 0; - for (int n=1; n<=DIVISIONS; n++) { + for (int n = 1; n <= DIVISIONS; n++) { /* * r1 and r2 are the two radii * x is the position of r1 * hyp is the length of the hypotenuse from r1 to r2 * height if the y-axis height of the component if not filled */ + + r2 = getRadius(x + l); + final double hyp = MathUtil.hypot(r2 - r1, l); - r2 = getRadius(x+l); - final double hyp = MathUtil.hypot(r2-r1, l); - - + // Volume differential elements final double dV; final double dFullV; - dFullV = pil3*(r1*r1 + r1*r2 + r2*r2); - if (filled || r1 0) planCenter /= planArea; - if (volume < 0.0000000001) { // 0.1 mm^3 + if (volume < 0.0000000001) { // 0.1 mm^3 volume = 0; - cg = new Coordinate(length/2, 0, 0, 0); + cg = new Coordinate(length / 2, 0, 0, 0); } else { // getComponentMass is safe now // Use super.getComponentMass() to ensure only the transition shape mass // is used, not the shoulders - cg = new Coordinate(cgx/volume,0,0,super.getComponentMass()); + cg = new Coordinate(cgx / volume, 0, 0, super.getComponentMass()); } } @@ -352,11 +358,11 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial */ private void integrateInertiaVolume() { double x, r1, r2; - - final double l = length/DIVISIONS; - final double pil = Math.PI*l; // PI * l - final double pil3 = Math.PI*l/3; // PI * l/3 - + + final double l = length / DIVISIONS; + final double pil = Math.PI * l; // PI * l + final double pil3 = Math.PI * l / 3; // PI * l/3 + r1 = getRadius(0); x = 0; longitudinalInertia = 0; @@ -364,34 +370,34 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial double volume = 0; - for (int n=1; n<=DIVISIONS; n++) { + for (int n = 1; n <= DIVISIONS; n++) { /* * r1 and r2 are the two radii, outer is their average * x is the position of r1 * hyp is the length of the hypotenuse from r1 to r2 * height if the y-axis height of the component if not filled */ - r2 = getRadius(x+l); - final double outer = (r1 + r2)/2; - + r2 = getRadius(x + l); + final double outer = (r1 + r2) / 2; + // Volume differential elements final double inner; final double dV; - if (filled || r1= 0; x = x * radius / length; - return sqrt(2 * radius * x - x * x); // radius/length * sphere + return MathUtil.safeSqrt(2 * radius * x - x * x); // radius/length * sphere } }, @@ -699,10 +699,10 @@ public class Transition extends SymmetricComponent { assert param <= 2; double theta = Math.acos(1 - 2 * x / length); - if (param == 0) { - return radius * sqrt((theta - sin(2 * theta) / 2) / Math.PI); + if (MathUtil.equals(param, 0)) { + return radius * MathUtil.safeSqrt((theta - sin(2 * theta) / 2) / Math.PI); } - return radius * sqrt((theta - sin(2 * theta) / 2 + param * pow3(sin(theta))) / Math.PI); + return radius * MathUtil.safeSqrt((theta - sin(2 * theta) / 2 + param * pow3(sin(theta))) / Math.PI); } }, diff --git a/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index 21ccb266..7bc635c7 100644 --- a/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -16,6 +16,7 @@ import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RocketComponent; +import net.sf.openrocket.simulation.exception.MotorIgnitionException; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.exception.SimulationLaunchException; import net.sf.openrocket.simulation.listeners.SimulationListenerHelper; @@ -51,7 +52,7 @@ public class BasicEventSimulationEngine implements SimulationEngine { Configuration configuration = setupConfiguration(simulationConditions); MotorInstanceConfiguration motorConfiguration = setupMotorConfiguration(configuration); if (motorConfiguration.getMotorIDs().isEmpty()) { - throw new SimulationLaunchException("No motors defined."); + throw new MotorIgnitionException("No motors defined in the simulation."); } // Initialize the simulation @@ -161,7 +162,9 @@ public class BasicEventSimulationEngine implements SimulationEngine { flightData.addBranch(status.getFlightData()); - log.info("Warnings at the end of simulation: " + flightData.getWarningSet()); + if (!flightData.getWarningSet().isEmpty()) { + log.info("Warnings at the end of simulation: " + flightData.getWarningSet()); + } // TODO: HIGH: Simulate branches return flightData; @@ -494,7 +497,7 @@ public class BasicEventSimulationEngine implements SimulationEngine { // If no motor has ignited, abort if (!status.isMotorIgnited()) { - throw new SimulationLaunchException("No motors ignited."); + throw new MotorIgnitionException("No motors ignited."); } return ret; diff --git a/src/net/sf/openrocket/simulation/RK4SimulationStepper.java b/src/net/sf/openrocket/simulation/RK4SimulationStepper.java index 99fd475e..8d5e27db 100644 --- a/src/net/sf/openrocket/simulation/RK4SimulationStepper.java +++ b/src/net/sf/openrocket/simulation/RK4SimulationStepper.java @@ -21,6 +21,9 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { private static final LogHelper log = Application.getLogger(); + /** Random value with which to XOR the random seed value */ + private static final int SEED_RANDOMIZATION = 0x23E3A01F; + /** * A recommended reasonably accurate time step. @@ -50,8 +53,7 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { private static final double MIN_TIME_STEP = 0.001; - // TODO: HIGH: Randomness source from simulation - private final Random random = new Random(); + private Random random; @@ -59,8 +61,6 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { @Override public RK4SimulationStatus initialize(SimulationStatus original) { - log.info("Performing RK4SimulationStepper initialization"); - RK4SimulationStatus status = new RK4SimulationStatus(); status.copyFrom(original); @@ -72,6 +72,8 @@ public class RK4SimulationStepper extends AbstractSimulationStepper { Math.cos(sim.getLaunchRodAngle()) )); + this.random = new Random(original.getSimulationConditions().getRandomSeed() ^ SEED_RANDOMIZATION); + return status; } diff --git a/src/net/sf/openrocket/simulation/SimulationConditions.java b/src/net/sf/openrocket/simulation/SimulationConditions.java index 16177090..3e582086 100644 --- a/src/net/sf/openrocket/simulation/SimulationConditions.java +++ b/src/net/sf/openrocket/simulation/SimulationConditions.java @@ -57,12 +57,13 @@ public class SimulationConditions implements Monitorable, Cloneable { private List simulationListeners = new ArrayList(); + private int randomSeed = 0; + private int modID = 0; private int modIDadd = 0; - public AerodynamicCalculator getAerodynamicCalculator() { return aerodynamicCalculator; } @@ -240,6 +241,18 @@ public class SimulationConditions implements Monitorable, Cloneable { } + + public int getRandomSeed() { + return randomSeed; + } + + + public void setRandomSeed(int randomSeed) { + this.randomSeed = randomSeed; + this.modID++; + } + + // TODO: HIGH: Make cleaner public List getSimulationListenerList() { return simulationListeners; diff --git a/src/net/sf/openrocket/simulation/GUISimulationConditions.java b/src/net/sf/openrocket/simulation/SimulationOptions.java similarity index 86% rename from src/net/sf/openrocket/simulation/GUISimulationConditions.java rename to src/net/sf/openrocket/simulation/SimulationOptions.java index d0b83911..05a22b1f 100644 --- a/src/net/sf/openrocket/simulation/GUISimulationConditions.java +++ b/src/net/sf/openrocket/simulation/SimulationOptions.java @@ -18,9 +18,14 @@ import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.ChangeSource; import net.sf.openrocket.util.MathUtil; -// TODO: HIGH: Move somewhere else and clean up -@Deprecated -public class GUISimulationConditions implements ChangeSource, Cloneable { +/** + * A class holding simulation options in basic parameter form and which functions + * as a ChangeSource. A SimulationConditions instance is generated from this class + * using {@link #toSimulationConditions()}. + * + * @author Sampo Niskanen + */ +public class SimulationOptions implements ChangeSource, Cloneable { public static final double MAX_LAUNCH_ROD_ANGLE = Math.PI / 3; @@ -59,12 +64,13 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { private boolean useISA = true; private double launchTemperature = ExtendedISAModel.STANDARD_TEMPERATURE; private double launchPressure = ExtendedISAModel.STANDARD_PRESSURE; - private AtmosphericModel atmosphericModel = null; private double timeStep = RK4SimulationStepper.RECOMMENDED_TIME_STEP; private double maximumAngle = RK4SimulationStepper.RECOMMENDED_ANGLE_STEP; + private int randomSeed = new Random().nextInt(); + private boolean calculateExtras = true; @@ -72,7 +78,7 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { - public GUISimulationConditions(Rocket rocket) { + public SimulationOptions(Rocket rocket) { this.rocket = rocket; } @@ -242,7 +248,6 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { if (MathUtil.equals(this.launchTemperature, launchTemperature)) return; this.launchTemperature = launchTemperature; - this.atmosphericModel = null; fireChangeEvent(); } @@ -258,7 +263,6 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { if (MathUtil.equals(this.launchPressure, launchPressure)) return; this.launchPressure = launchPressure; - this.atmosphericModel = null; fireChangeEvent(); } @@ -269,15 +273,11 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { * * @return an AtmosphericModel object. */ - public AtmosphericModel getAtmosphericModel() { + private AtmosphericModel getAtmosphericModel() { if (useISA) { return ISA_ATMOSPHERIC_MODEL; } - if (atmosphericModel == null) { - atmosphericModel = new ExtendedISAModel(launchAltitude, - launchTemperature, launchPressure); - } - return atmosphericModel; + return new ExtendedISAModel(launchAltitude, launchTemperature, launchPressure); } @@ -321,10 +321,37 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { + public int getRandomSeed() { + return randomSeed; + } + + public void setRandomSeed(int randomSeed) { + if (this.randomSeed == randomSeed) { + return; + } + this.randomSeed = randomSeed; + /* + * This does not fire an event since we don't want to invalidate simulation results + * due to changing the seed value. This needs to be revisited if the user is ever + * allowed to select the seed value. + */ + // fireChangeEvent(); + } + + /** + * Randomize the random seed value. + */ + public void randomizeSeed() { + this.randomSeed = new Random().nextInt(); + // fireChangeEvent(); + } + + + @Override - public GUISimulationConditions clone() { + public SimulationOptions clone() { try { - GUISimulationConditions copy = (GUISimulationConditions) super.clone(); + SimulationOptions copy = (SimulationOptions) super.clone(); copy.listeners = new ArrayList(); return copy; } catch (CloneNotSupportedException e) { @@ -333,7 +360,7 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { } - public void copyFrom(GUISimulationConditions src) { + public void copyFrom(SimulationOptions src) { if (this.rocket == src.rocket) { @@ -371,6 +398,7 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { this.windAverage = src.windAverage; this.windTurbulence = src.windTurbulence; this.calculateExtras = src.calculateExtras; + this.randomSeed = src.randomSeed; fireChangeEvent(); } @@ -383,11 +411,11 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { */ @Override public boolean equals(Object other) { - if (!(other instanceof GUISimulationConditions)) + if (!(other instanceof SimulationOptions)) return false; - GUISimulationConditions o = (GUISimulationConditions) other; + SimulationOptions o = (SimulationOptions) other; return ((this.rocket == o.rocket) && - this.motorID == o.motorID && + this.motorID.equals(o.motorID) && MathUtil.equals(this.launchAltitude, o.launchAltitude) && MathUtil.equals(this.launchLatitude, o.launchLatitude) && MathUtil.equals(this.launchPressure, o.launchPressure) && @@ -398,7 +426,8 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { MathUtil.equals(this.maximumAngle, o.maximumAngle) && MathUtil.equals(this.timeStep, o.timeStep) && MathUtil.equals(this.windAverage, o.windAverage) && - MathUtil.equals(this.windTurbulence, o.windTurbulence) && this.calculateExtras == o.calculateExtras); + MathUtil.equals(this.windTurbulence, o.windTurbulence) && + this.calculateExtras == o.calculateExtras && this.randomSeed == o.randomSeed); } /** @@ -433,7 +462,6 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { // TODO: HIGH: Clean up - @Deprecated public SimulationConditions toSimulationConditions() { SimulationConditions conditions = new SimulationConditions(); @@ -444,10 +472,9 @@ public class GUISimulationConditions implements ChangeSource, Cloneable { conditions.setLaunchRodDirection(getLaunchRodDirection()); conditions.setLaunchAltitude(getLaunchAltitude()); conditions.setLaunchLatitude(getLaunchLatitude()); + conditions.setRandomSeed(randomSeed); - PinkNoiseWindModel windModel = new PinkNoiseWindModel(); - // TODO: HIGH: Randomness source for simulation - windModel.setSeed(new Random().nextInt()); + PinkNoiseWindModel windModel = new PinkNoiseWindModel(randomSeed); windModel.setAverage(getWindSpeedAverage()); windModel.setStandardDeviation(getWindSpeedDeviation()); conditions.setWindModel(windModel); diff --git a/src/net/sf/openrocket/simulation/exception/MotorIgnitionException.java b/src/net/sf/openrocket/simulation/exception/MotorIgnitionException.java new file mode 100644 index 00000000..fd9e60ac --- /dev/null +++ b/src/net/sf/openrocket/simulation/exception/MotorIgnitionException.java @@ -0,0 +1,19 @@ +package net.sf.openrocket.simulation.exception; + +/** + * An exception signifying that the simulation failed because no motors were + * defined or ignited in the rocket. + * + * @author Sampo Niskanen + */ +public class MotorIgnitionException extends SimulationLaunchException { + + public MotorIgnitionException(String message) { + super(message); + } + + public MotorIgnitionException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/src/net/sf/openrocket/simulation/exception/SimulationLaunchException.java b/src/net/sf/openrocket/simulation/exception/SimulationLaunchException.java index 1c840e35..df9f3862 100644 --- a/src/net/sf/openrocket/simulation/exception/SimulationLaunchException.java +++ b/src/net/sf/openrocket/simulation/exception/SimulationLaunchException.java @@ -7,21 +7,13 @@ package net.sf.openrocket.simulation.exception; * @author Sampo Niskanen */ public class SimulationLaunchException extends SimulationException { - - public SimulationLaunchException() { - - } - + public SimulationLaunchException(String message) { super(message); } - - public SimulationLaunchException(Throwable cause) { - super(cause); - } - + public SimulationLaunchException(String message, Throwable cause) { super(message, cause); } - + } diff --git a/src/net/sf/openrocket/startup/Application.java b/src/net/sf/openrocket/startup/Application.java index a7847d32..bb8b20f7 100644 --- a/src/net/sf/openrocket/startup/Application.java +++ b/src/net/sf/openrocket/startup/Application.java @@ -89,10 +89,6 @@ public final class Application { * @return a translator. */ public static Translator getTranslator() { - if (baseTranslator instanceof DebugTranslator) { - return baseTranslator; - } - Translator t = baseTranslator; t = new ClassBasedTranslator(t, 1); t = new ExceptionSuppressingTranslator(t); diff --git a/src/net/sf/openrocket/unit/CaliberUnit.java b/src/net/sf/openrocket/unit/CaliberUnit.java index c33c4b6f..cc93cb51 100644 --- a/src/net/sf/openrocket/unit/CaliberUnit.java +++ b/src/net/sf/openrocket/unit/CaliberUnit.java @@ -1,16 +1,12 @@ package net.sf.openrocket.unit; -import java.util.Collection; -import java.util.Collections; import java.util.Iterator; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.SymmetricComponent; +import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.MathUtil; @@ -21,19 +17,14 @@ public class CaliberUnit extends GeneralUnit { private final Configuration configuration; private final Rocket rocket; - private double caliber = -1; + private int rocketModId = -1; + private int configurationModId = -1; - - /* Listener for rocket and configuration, resets the caliber to -1. */ - private final ChangeListener listener = new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - caliber = -1; - } - }; + private double caliber = -1; + public CaliberUnit(Configuration configuration) { super(1.0, "cal"); this.configuration = configuration; @@ -42,7 +33,6 @@ public class CaliberUnit extends GeneralUnit { this.rocket = null; } else { this.rocket = configuration.getRocket(); - configuration.addChangeListener(listener); } } @@ -50,53 +40,94 @@ public class CaliberUnit extends GeneralUnit { super(1.0, "cal"); this.configuration = null; this.rocket = rocket; - if (rocket != null) { - rocket.addChangeListener(listener); + } + + public CaliberUnit(double reference) { + super(1.0, "cal"); + this.configuration = null; + this.rocket = null; + this.caliber = reference; + + if (reference <= 0) { + throw new IllegalArgumentException("Illegal reference = " + reference); } } @Override public double fromUnit(double value) { - if (caliber < 0) - calculateCaliber(); + checkCaliber(); return value * caliber; } @Override public double toUnit(double value) { - if (caliber < 0) - calculateCaliber(); + checkCaliber(); return value / caliber; } - // TODO: HIGH: Check caliber calculation method... - private void calculateCaliber() { - caliber = 0; - - Iterator iterator; - if (configuration != null) { - iterator = configuration.iterator(); - } else if (rocket != null) { - iterator = rocket.iterator(false); - } else { - Collection set = Collections.emptyList(); - iterator = set.iterator(); + + private void checkCaliber() { + if (configuration != null && configuration.getModID() != configurationModId) { + caliber = -1; + configurationModId = configuration.getModID(); + } + if (rocket != null && rocket.getModID() != rocketModId) { + caliber = -1; + rocketModId = rocket.getModID(); + } + if (caliber < 0) { + if (configuration != null) { + caliber = calculateCaliber(configuration); + } else if (rocket != null) { + caliber = calculateCaliber(rocket); + } else { + throw new BugException("Both rocket and configuration are null"); + } } + } + + + /** + * Calculate the caliber of a rocket configuration. + * + * @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()); + } + + /** + * Calculate the caliber of a rocket. + * + * @param rocket the rocket + * @return the caliber of the rocket, or the default caliber. + */ + public static double calculateCaliber(Rocket rocket) { + return calculateCaliber(rocket.iterator()); + } + + + + private static double calculateCaliber(Iterator iterator) { + double cal = 0; while (iterator.hasNext()) { RocketComponent c = iterator.next(); if (c instanceof SymmetricComponent) { double r1 = ((SymmetricComponent) c).getForeRadius() * 2; double r2 = ((SymmetricComponent) c).getAftRadius() * 2; - caliber = MathUtil.max(caliber, r1, r2); + cal = MathUtil.max(cal, r1, r2); } } - if (caliber <= 0) - caliber = DEFAULT_CALIBER; + if (cal < 0.0001) + cal = DEFAULT_CALIBER; + + return cal; } } diff --git a/src/net/sf/openrocket/unit/UnitGroup.java b/src/net/sf/openrocket/unit/UnitGroup.java index 0f75d827..920e7664 100644 --- a/src/net/sf/openrocket/unit/UnitGroup.java +++ b/src/net/sf/openrocket/unit/UnitGroup.java @@ -31,6 +31,11 @@ public class UnitGroup { public static final UnitGroup UNITS_AREA; public static final UnitGroup UNITS_STABILITY; + /** + * This unit group contains only the caliber unit that never scales the originating "SI" value. + * It can be used in cases where the originating value is already in calibers to obtains the correct unit. + */ + public static final UnitGroup UNITS_STABILITY_CALIBERS; public static final UnitGroup UNITS_VELOCITY; public static final UnitGroup UNITS_ACCELERATION; public static final UnitGroup UNITS_MASS; @@ -111,6 +116,10 @@ public class UnitGroup { UNITS_STABILITY.addUnit(new CaliberUnit((Rocket) null)); UNITS_STABILITY.setDefaultUnit(3); + UNITS_STABILITY_CALIBERS = new UnitGroup(); + UNITS_STABILITY_CALIBERS.addUnit(new GeneralUnit(1, "cal")); + + UNITS_VELOCITY = new UnitGroup(); UNITS_VELOCITY.addUnit(new GeneralUnit(1, "m/s")); UNITS_VELOCITY.addUnit(new GeneralUnit(1 / 3.6, "km/h")); @@ -204,8 +213,11 @@ public class UnitGroup { UNITS_RELATIVE = new UnitGroup(); UNITS_RELATIVE.addUnit(new FixedPrecisionUnit("" + ZWSP, 0.01, 1.0)); - UNITS_RELATIVE.addUnit(new FixedPrecisionUnit("%", 1, 0.01)); + UNITS_RELATIVE.addUnit(new GeneralUnit(0.01, "%")); UNITS_RELATIVE.addUnit(new FixedPrecisionUnit("" + PERMILLE, 1, 0.001)); + // UNITS_RELATIVE.addUnit(new FixedPrecisionUnit("" + ZWSP, 0.01, 1.0)); + // UNITS_RELATIVE.addUnit(new FixedPrecisionUnit("%", 1, 0.01)); + // UNITS_RELATIVE.addUnit(new FixedPrecisionUnit("" + PERMILLE, 1, 0.001)); UNITS_RELATIVE.setDefaultUnit(1); @@ -309,22 +321,44 @@ public class UnitGroup { } - + /** + * Return a UnitGroup for stability units based on the rocket. + * + * @param rocket the rocket from which to calculate the caliber + * @return the unit group + */ public static UnitGroup stabilityUnits(Rocket rocket) { return new StabilityUnitGroup(rocket); } + /** + * Return a UnitGroup for stability units based on the rocket configuration. + * + * @param config the rocket configuration from which to calculate the caliber + * @return the unit group + */ public static UnitGroup stabilityUnits(Configuration config) { return new StabilityUnitGroup(config); } + /** + * Return a UnitGroup for stability units based on a constant caliber. + * + * @param reference the constant reference length + * @return the unit group + */ + public static UnitGroup stabilityUnits(double reference) { + return new StabilityUnitGroup(reference); + } + + ////////////////////////////////////////////////////// - private ArrayList units = new ArrayList(); - private int defaultUnit = 0; + protected ArrayList units = new ArrayList(); + protected int defaultUnit = 0; public int getUnitCount() { return units.size(); @@ -391,18 +425,10 @@ public class UnitGroup { return units.indexOf(u); } - public void addUnit(Unit u) { + private void addUnit(Unit u) { units.add(u); } - public void addUnit(int n, Unit u) { - units.add(n, u); - } - - public void removeUnit(int n) { - units.remove(n); - } - public boolean contains(Unit u) { return units.contains(u); } @@ -508,80 +534,33 @@ public class UnitGroup { */ private static class StabilityUnitGroup extends UnitGroup { - private final CaliberUnit caliberUnit; - + public StabilityUnitGroup(double ref) { + this(new CaliberUnit(ref)); + } public StabilityUnitGroup(Rocket rocket) { - caliberUnit = new CaliberUnit(rocket); + this(new CaliberUnit(rocket)); } public StabilityUnitGroup(Configuration config) { - caliberUnit = new CaliberUnit(config); - } - - - //// Modify CaliberUnit to use local variable - - @Override - public Unit getDefaultUnit() { - return getUnit(UNITS_STABILITY.getDefaultUnitIndex()); + this(new CaliberUnit(config)); } - @Override - public Unit getUnit(int n) { - Unit u = UNITS_STABILITY.getUnit(n); - if (u instanceof CaliberUnit) { - return caliberUnit; - } - return u; - } - - @Override - public int getUnitIndex(Unit u) { - if (u instanceof CaliberUnit) { - for (int i = 0; i < UNITS_STABILITY.getUnitCount(); i++) { - if (UNITS_STABILITY.getUnit(i) instanceof CaliberUnit) - return i; + private StabilityUnitGroup(CaliberUnit caliberUnit) { + this.units.addAll(UnitGroup.UNITS_STABILITY.units); + this.defaultUnit = UnitGroup.UNITS_STABILITY.defaultUnit; + for (int i = 0; i < units.size(); i++) { + if (units.get(i) instanceof CaliberUnit) { + units.set(i, caliberUnit); } } - return UNITS_STABILITY.getUnitIndex(u); } - - //// Pass on to UNITS_STABILITY - - @Override - public int getDefaultUnitIndex() { - return UNITS_STABILITY.getDefaultUnitIndex(); - } - @Override public void setDefaultUnit(int n) { + super.setDefaultUnit(n); UNITS_STABILITY.setDefaultUnit(n); } - - @Override - public int getUnitCount() { - return UNITS_STABILITY.getUnitCount(); - } - - - //// Unsupported methods - - @Override - public void addUnit(int n, Unit u) { - throw new UnsupportedOperationException("StabilityUnitGroup must not be modified"); - } - - @Override - public void addUnit(Unit u) { - throw new UnsupportedOperationException("StabilityUnitGroup must not be modified"); - } - - @Override - public void removeUnit(int n) { - throw new UnsupportedOperationException("StabilityUnitGroup must not be modified"); - } } } diff --git a/src/net/sf/openrocket/unit/Value.java b/src/net/sf/openrocket/unit/Value.java index 278b815a..65382523 100644 --- a/src/net/sf/openrocket/unit/Value.java +++ b/src/net/sf/openrocket/unit/Value.java @@ -3,7 +3,7 @@ package net.sf.openrocket.unit; import net.sf.openrocket.util.MathUtil; /** - * A class representing an SI value and a unit. The toString() method yields the + * An immutable class representing an SI value and a unit. The toString() method yields the * current value in the current units. This class may be used to encapsulate * a sortable value for example for tables. The sorting is performed by the * value in the current units, ignoring the unit. @@ -12,8 +12,8 @@ import net.sf.openrocket.util.MathUtil; */ public class Value implements Comparable { - private double value; - private Unit unit; + private final double value; + private final Unit unit; /** @@ -44,7 +44,7 @@ public class Value implements Comparable { /** - * Get the value of this object. + * Get the value of this object (in SI units). * * @return the value */ @@ -52,16 +52,8 @@ public class Value implements Comparable { return value; } - /** - * Set the value of this object. - * - * @param value the value to set - */ - public void setValue(double value) { - this.value = value; - } - + /** * Get the value of this object in the current units. * @@ -72,16 +64,6 @@ public class Value implements Comparable { } - /** - * Set the value of this object in the current units. - * - * @param value the value in current units. - */ - public void setUnitValue(double value) { - this.value = unit.fromUnit(value); - } - - /** * Get the unit of this object. * @@ -91,18 +73,6 @@ public class Value implements Comparable { return unit; } - /** - * Set the value of this object. - * - * @param unit the unit to set (null not allowed) - */ - public void setUnit(Unit unit) { - if (unit == null) { - throw new IllegalArgumentException("unit is null"); - } - this.unit = unit; - } - /** * Return a string formatted using the {@link Unit#toStringUnit(double)} method diff --git a/src/net/sf/openrocket/util/Chars.java b/src/net/sf/openrocket/util/Chars.java index 08d2f827..1920bfa8 100644 --- a/src/net/sf/openrocket/util/Chars.java +++ b/src/net/sf/openrocket/util/Chars.java @@ -6,7 +6,7 @@ package net.sf.openrocket.util; * @author Sampo Niskanen */ public class Chars { - + /** The fraction 1/2 */ public static final char FRAC12 = '\u00BD'; /** The fraction 1/4 */ @@ -37,7 +37,7 @@ public class Chars { /** Micro sign (Greek letter mu) */ public static final char MICRO = '\u00B5'; - + /** Alpha */ public static final char ALPHA = '\u03b1'; /** Theta */ @@ -47,4 +47,10 @@ public class Chars { public static final char COPY = '\u00A9'; /** A centered bullet */ public static final char BULLET = '\u2022'; + + /** Left arrow (light) */ + public static final char LEFT_ARROW = '\u2190'; + /** Right arrow (light) */ + public static final char RIGHT_ARROW = '\u2192'; + } diff --git a/src/net/sf/openrocket/util/Coordinate.java b/src/net/sf/openrocket/util/Coordinate.java index 909cf273..3bc981aa 100644 --- a/src/net/sf/openrocket/util/Coordinate.java +++ b/src/net/sf/openrocket/util/Coordinate.java @@ -206,7 +206,7 @@ public final class Coordinate implements Serializable { */ public double length() { if (length < 0) { - length = Math.sqrt(x * x + y * y + z * z); + length = MathUtil.safeSqrt(x * x + y * y + z * z); } return length; } diff --git a/src/net/sf/openrocket/util/FileHelper.java b/src/net/sf/openrocket/util/FileHelper.java index 6a8216ff..0929c328 100644 --- a/src/net/sf/openrocket/util/FileHelper.java +++ b/src/net/sf/openrocket/util/FileHelper.java @@ -24,7 +24,7 @@ public final class FileHelper { private static final Translator trans = Application.getTranslator(); - // TODO: MEDIUM: Rename translation keys + // TODO: HIGH: Rename translation keys /** File filter for any rocket designs (*.ork, *.rkt) */ public static final FileFilter ALL_DESIGNS_FILTER = @@ -43,7 +43,12 @@ public final class FileHelper { public static final FileFilter PDF_FILTER = new SimpleFileFilter(trans.get("filetypes.pdf"), ".pdf"); + /** File filter for CSV files (*.csv) */ + public static final FileFilter CSV_FILE_FILTER = + new SimpleFileFilter(trans.get("SimExpPan.desc"), ".csv"); + + private FileHelper() { diff --git a/src/net/sf/openrocket/util/GUIUtil.java b/src/net/sf/openrocket/util/GUIUtil.java index 10d632e2..831f2381 100644 --- a/src/net/sf/openrocket/util/GUIUtil.java +++ b/src/net/sf/openrocket/util/GUIUtil.java @@ -52,6 +52,7 @@ import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.border.TitledBorder; import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableColumnModel; @@ -265,6 +266,32 @@ public class GUIUtil { } + /** + * Changes the style of the font of the specified border. + * + * @param border the component for which to change the font + * @param style the change in the font style + */ + public static void changeFontStyle(TitledBorder border, int style) { + /* + * There's been an NPE caused by the font changing, this is debug for it. + */ + if (border == null) { + throw new BugException("border is null"); + } + Font font = border.getTitleFont(); + if (font == null) { + throw new BugException("Border font is null"); + } + font = font.deriveFont(style); + if (font == null) { + throw new BugException("Derived font is null"); + } + border.setTitleFont(font); + } + + + /** * Traverses recursively the component tree, and sets all applicable component * models to null, so as to remove the listener connections. After calling this diff --git a/src/net/sf/openrocket/util/MathUtil.java b/src/net/sf/openrocket/util/MathUtil.java index 58585d77..75b18943 100644 --- a/src/net/sf/openrocket/util/MathUtil.java +++ b/src/net/sf/openrocket/util/MathUtil.java @@ -6,7 +6,12 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import net.sf.openrocket.logging.LogHelper; +import net.sf.openrocket.startup.Application; + public class MathUtil { + private static final LogHelper log = Application.getLogger(); + public static final double EPSILON = 0.00000001; // 10mm^3 in m^3 /** @@ -192,6 +197,25 @@ public class MathUtil { } + /** + * 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. + * + * @param d the value of which the square root is to be taken. + * @return the square root of the value. + */ + public static double safeSqrt(double d) { + if (d < 0) { + if (d < 0.01) { + log.warn(1, "Attempting to compute sqrt(" + d + ")"); + } + return 0; + } + return Math.sqrt(d); + } + + + public static boolean equals(double a, double b) { double absb = Math.abs(b); diff --git a/src/net/sf/openrocket/util/MutableCoordinate.java b/src/net/sf/openrocket/util/MutableCoordinate.java deleted file mode 100644 index 02af9357..00000000 --- a/src/net/sf/openrocket/util/MutableCoordinate.java +++ /dev/null @@ -1,312 +0,0 @@ -package net.sf.openrocket.util; - -import java.io.Serializable; - -/** - * An immutable class of weighted coordinates. The weights are non-negative. - * - * Can also be used as non-weighted coordinates with weight=0. - * - * @author Sampo Niskanen - */ -public final class MutableCoordinate implements Serializable { - public static final MutableCoordinate NUL = new MutableCoordinate(0,0,0,0); - public static final MutableCoordinate NaN = new MutableCoordinate(Double.NaN,Double.NaN, - Double.NaN,Double.NaN); - public static final double COMPARISON_DELTA = 0.000001; - private double x,y,z; - private double weight; - - - /* Count and report the number of times a Coordinate is constructed: */ -// private static int count=0; -// { -// count++; -// if ((count % 1000) == 0) { -// System.out.println("Coordinate instantiated "+count+" times"); -// } -// } - - - public MutableCoordinate() { - x=0; - y=0; - z=0; - weight=0; - } - - public MutableCoordinate(double x) { - this.x = x; - this.y = 0; - this.z = 0; - weight = 0; - } - - public MutableCoordinate(double x, double y) { - this.x = x; - this.y = y; - this.z = 0; - weight = 0; - } - - public MutableCoordinate(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - weight = 0; - } - public MutableCoordinate(double x, double y, double z, double w) { - this.x = x; - this.y = y; - this.z = z; - this.weight=w; - } - - - public boolean isWeighted() { - return (weight != 0); - } - - public boolean isNaN() { - return Double.isNaN(x) || Double.isNaN(y) || Double.isNaN(z) || Double.isNaN(weight); - } - - public MutableCoordinate setX(double x) { - return new MutableCoordinate(x,this.y,this.z,this.weight); - } - - public MutableCoordinate setY(double y) { - return new MutableCoordinate(this.x,y,this.z,this.weight); - } - - public MutableCoordinate setZ(double z) { - return new MutableCoordinate(this.x,this.y,z,this.weight); - } - - public MutableCoordinate setWeight(double weight) { - return new MutableCoordinate(this.x, this.y, this.z, weight); - } - - public MutableCoordinate setXYZ(MutableCoordinate c) { - return new MutableCoordinate(c.x, c.y, c.z, this.weight); - } - - public double getX() { - return x; - } - public double getY() { - return y; - } - public double getZ() { - return z; - } - - - /** - * Add the coordinate and weight of two coordinates. - * - * @param other the other Coordinate - * @return the sum of the coordinates - */ - public MutableCoordinate add(MutableCoordinate other) { - this.x += other.x; - this.y += other.y; - this.z += other.z; - this.weight += other.weight; - return this; - } - - public MutableCoordinate add(double x, double y, double z) { - this.x += x; - this.y += y; - this.z += z; - return this; - } - - public MutableCoordinate add(double x, double y, double z, double weight) { - return new MutableCoordinate(this.x+x, this.y+y, this.z+z, this.weight+weight); - } - - /** - * 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. - * - * @param other Coordinate to subtract from this. - * @return The result - */ - public MutableCoordinate sub(MutableCoordinate other) { - return new MutableCoordinate(this.x-other.x, this.y-other.y, this.z-other.z, this.weight); - } - - /** - * Subtract the specified values from this Coordinate. The weight of the result - * is the same as the weight of this Coordinate. - * - * @param x x value to subtract - * @param y y value to subtract - * @param z z value to subtract - * @return the result. - */ - public MutableCoordinate sub(double x, double y, double z) { - return new MutableCoordinate(this.x - x, this.y - y, this.z - z, this.weight); - } - - - /** - * Multiply the Coordinate with a scalar. All coordinates and the - * weight are multiplied by the given scalar. - - * @param m Factor to multiply by. - * @return The product. - */ - public MutableCoordinate multiply(double m) { - return new MutableCoordinate(this.x*m, this.y*m, this.z*m, this.weight*m); - } - - /** - * Dot product of two Coordinates, taken as vectors. Equal to - * x1*x2+y1*y2+z1*z2 - * @param other Coordinate to take product with. - * @return The dot product. - */ - public double dot(MutableCoordinate other) { - return this.x*other.x + this.y*other.y + this.z*other.z; - } - /** - * Dot product of two Coordinates. - */ - public static double dot(MutableCoordinate v1, MutableCoordinate v2) { - return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; - } - - /** - * Distance from the origin to the Coordinate. - */ - public double length() { - return Math.sqrt(x*x+y*y+z*z); - } - - /** - * Square of the distance from the origin to the Coordinate. - */ - public double length2() { - return x*x+y*y+z*z; - } - - /** - * Returns a new coordinate which has the same direction from the origin as this - * coordinate but is at a distance of one. If this coordinate is the origin, - * this method throws an IllegalStateException. The weight of the - * coordinate is unchanged. - * - * @return the coordinate normalized to distance one of the origin. - * @throws IllegalStateException if this coordinate is the origin. - */ - public MutableCoordinate normalize() { - double l = length(); - if (l < 0.0000001) { - throw new IllegalStateException("Cannot normalize zero coordinate"); - } - return new MutableCoordinate(x/l, y/l, z/l, weight); - } - - - - - /** - * Weighted average of two coordinates. If either of the weights are positive, - * the result is the weighted average of the coordinates and the weight is the sum - * of the original weights. If the sum of the weights is zero (and especially if - * both of the weights are zero), the result is the unweighted average of the - * coordinates with weight zero. - *

- * If other is null then this Coordinate is - * returned. - */ - public MutableCoordinate average(MutableCoordinate other) { - double x,y,z,w; - - if (other == null) - return this; - - w = this.weight + other.weight; - if (MathUtil.equals(w, 0)) { - x = (this.x+other.x)/2; - y = (this.y+other.y)/2; - z = (this.z+other.z)/2; - w = 0; - } else { - x = (this.x*this.weight + other.x*other.weight)/w; - y = (this.y*this.weight + other.y*other.weight)/w; - z = (this.z*this.weight + other.z*other.weight)/w; - } - return new MutableCoordinate(x,y,z,w); - } - - - /** - * Tests whether the coordinates (not weight!) are the same. - * - * Compares only the (x,y,z) coordinates, NOT the weight. Coordinate comparison is - * done to the precision of COMPARISON_DELTA. - * - * @param other Coordinate to compare to. - * @return true if the coordinates are equal - */ - @Override - public boolean equals(Object other) { - if (!(other instanceof MutableCoordinate)) - return false; - - final MutableCoordinate c = (MutableCoordinate)other; - return (MathUtil.equals(this.x, c.x) && - MathUtil.equals(this.y, c.y) && - MathUtil.equals(this.z, c.z)); - } - - /** - * Hash code method compatible with {@link #equals(Object)}. - */ - @Override - public int hashCode() { - return (int)((x+y+z)*100000); - } - - - @Override - public String toString() { - if (isWeighted()) - return String.format("(%.3f,%.3f,%.3f,w=%.3f)", x,y,z,weight); - else - return String.format("(%.3f,%.3f,%.3f)", x,y,z); - } - - - - public static void main(String[] arg) { - double a=1.2; - double x; - MutableCoordinate c; - long t1, t2; - - x = 0; - t1 = System.nanoTime(); - for (int i=0; i < 100000000; i++) { - x = x + a; - } - t2 = System.nanoTime(); - System.out.println("Value: "+x); - System.out.println("Plain addition: "+ ((t2-t1+500000)/1000000) + " ms"); - - c = MutableCoordinate.NUL; - t1 = System.nanoTime(); - for (int i=0; i < 100000000; i++) { - c = c.add(a,0,0); - } - t2 = System.nanoTime(); - System.out.println("Value: "+c.x); - System.out.println("Coordinate addition: "+ ((t2-t1+500000)/1000000) + " ms"); - - } - -} diff --git a/src/net/sf/openrocket/util/Prefs.java b/src/net/sf/openrocket/util/Prefs.java index 16e338c4..2d59f776 100644 --- a/src/net/sf/openrocket/util/Prefs.java +++ b/src/net/sf/openrocket/util/Prefs.java @@ -38,7 +38,7 @@ import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.simulation.FlightDataType; -import net.sf.openrocket.simulation.GUISimulationConditions; +import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.simulation.RK4SimulationStepper; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; @@ -758,7 +758,7 @@ public class Prefs { public static Simulation getBackgroundSimulation(Rocket rocket) { Simulation s = new Simulation(rocket); - GUISimulationConditions cond = s.getConditions(); + SimulationOptions cond = s.getOptions(); cond.setTimeStep(RK4SimulationStepper.RECOMMENDED_TIME_STEP * 2); cond.setWindSpeedAverage(1.0); diff --git a/src/net/sf/openrocket/util/Quaternion.java b/src/net/sf/openrocket/util/Quaternion.java index f51eadd2..5f277662 100644 --- a/src/net/sf/openrocket/util/Quaternion.java +++ b/src/net/sf/openrocket/util/Quaternion.java @@ -216,7 +216,7 @@ public class Quaternion { */ public double norm() { if (norm < 0) { - norm = Math.sqrt(x * x + y * y + z * z + w * w); + norm = MathUtil.safeSqrt(x * x + y * y + z * z + w * w); } return norm; } diff --git a/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java b/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java index 0205eddf..48cc648b 100644 --- a/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java +++ b/test/net/sf/openrocket/optimization/rocketoptimization/TestRocketOptimizationFunction.java @@ -5,6 +5,7 @@ import net.sf.openrocket.document.Simulation; import net.sf.openrocket.optimization.general.OptimizationException; import net.sf.openrocket.optimization.general.Point; import net.sf.openrocket.rocketcomponent.Rocket; +import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.unit.Value; import net.sf.openrocket.util.Pair; @@ -43,8 +44,9 @@ public class TestRocketOptimizationFunction { final double p1 = 0.4; final double p2 = 0.7; final double ddist = -0.43; - final double dref = 0.33; + final Value dref = new Value(ddist, Unit.NOUNIT2); final double pvalue = 9.81; + final Value pvalueValue = new Value(9.81, Unit.NOUNIT2); final double gvalue = 8.81; final Point point = new Point(p1, p2); @@ -52,8 +54,9 @@ public class TestRocketOptimizationFunction { context.checking(new Expectations() {{ oneOf(modifier1).modify(simulation, p1); oneOf(modifier2).modify(simulation, p2); - oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); + oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); oneOf(parameter).computeValue(simulation); will(returnValue(pvalue)); + oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE)); oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(gvalue)); oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2)); oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH)); @@ -62,7 +65,7 @@ public class TestRocketOptimizationFunction { oneOf(listener).evaluated(point, new Value[] { new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()), new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit()) - }, dref, pvalue, gvalue); + }, dref, pvalueValue, gvalue); }}); // @formatter:on @@ -87,15 +90,16 @@ public class TestRocketOptimizationFunction { final double p1 = 0.4; final double p2 = 0.7; final double ddist = -0.43; - final double dref = 0.33; + final Value dref = new Value(0.33, Unit.NOUNIT2); final double pvalue = 9.81; // @formatter:off context.checking(new Expectations() {{ oneOf(modifier1).modify(simulation, p1); oneOf(modifier2).modify(simulation, p2); - oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); + oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); oneOf(parameter).computeValue(simulation); will(returnValue(pvalue)); + oneOf(parameter).getUnitGroup(); will(returnValue(UnitGroup.UNITS_NONE)); oneOf(goal).getMinimizationParameter(pvalue); will(returnValue(Double.NaN)); }}); // @formatter:on @@ -123,14 +127,14 @@ public class TestRocketOptimizationFunction { final double p1 = 0.4; final double p2 = 0.7; final double ddist = 0.98; - final double dref = 0.33; + final Value dref = new Value(ddist, Unit.NOUNIT2); final Point point = new Point(p1, p2); // @formatter:off context.checking(new Expectations() {{ oneOf(modifier1).modify(simulation, p1); oneOf(modifier2).modify(simulation, p2); - oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); + oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); oneOf(modifier1).getCurrentSIValue(simulation); will(returnValue(0.2)); oneOf(modifier1).getUnitGroup(); will(returnValue(UnitGroup.UNITS_LENGTH)); oneOf(modifier2).getCurrentSIValue(simulation); will(returnValue(0.3)); @@ -138,7 +142,7 @@ public class TestRocketOptimizationFunction { oneOf(listener).evaluated(point, new Value[] { new Value(0.2, UnitGroup.UNITS_LENGTH.getDefaultUnit()), new Value(0.3, UnitGroup.UNITS_LENGTH.getDefaultUnit()) - }, dref, Double.NaN, 1.98E200); + }, dref, null, 1.98E200); }}); // @formatter:on @@ -164,13 +168,13 @@ public class TestRocketOptimizationFunction { final double p1 = 0.4; final double p2 = 0.7; final double ddist = Double.NaN; - final double dref = 0.33; + final Value dref = new Value(0.33, Unit.NOUNIT2); // @formatter:off context.checking(new Expectations() {{ oneOf(modifier1).modify(simulation, p1); oneOf(modifier2).modify(simulation, p2); - oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); + oneOf(domain).getDistanceToDomain(simulation); will(returnValue(new Pair(ddist, dref))); }}); // @formatter:on diff --git a/test/net/sf/openrocket/optimization/rocketoptimization/modifiers/TestGenericModifier.java b/test/net/sf/openrocket/optimization/rocketoptimization/modifiers/TestGenericModifier.java index 6bdcb96e..deacacf4 100644 --- a/test/net/sf/openrocket/optimization/rocketoptimization/modifiers/TestGenericModifier.java +++ b/test/net/sf/openrocket/optimization/rocketoptimization/modifiers/TestGenericModifier.java @@ -22,7 +22,9 @@ public class TestGenericModifier { value = new TestValue(); sim = new Simulation(new Rocket()); - gm = new GenericModifier("Test modifier", null, + Object related = new Object(); + + gm = new GenericModifier("Test modifier", "Description", related, UnitGroup.UNITS_NONE, 2.0, TestValue.class, "value") { @Override protected TestValue getModifiedObject(Simulation simulation) { diff --git a/test/net/sf/openrocket/unit/ValueTest.java b/test/net/sf/openrocket/unit/ValueTest.java index 0c8c61ff..9440c4d0 100644 --- a/test/net/sf/openrocket/unit/ValueTest.java +++ b/test/net/sf/openrocket/unit/ValueTest.java @@ -5,7 +5,7 @@ import static org.junit.Assert.*; import org.junit.Test; public class ValueTest { - + @Test public void testValues() { Value v1, v2; @@ -18,21 +18,21 @@ public class ValueTest { assertTrue(v1.compareTo(v1) == 0); assertTrue(v2.compareTo(v2) == 0); - v2.setUnit(UnitGroup.UNITS_TEMPERATURE.findApproximate("K")); + v2 = new Value(283.15, UnitGroup.UNITS_TEMPERATURE.findApproximate("K")); assertTrue(v1.compareTo(v2) > 0); assertTrue(v2.compareTo(v1) < 0); assertEquals("283 K", v2.toString()); - - v2.setUnit(UnitGroup.UNITS_TEMPERATURE.findApproximate("F")); + + v2 = new Value(283.15, UnitGroup.UNITS_TEMPERATURE.findApproximate("F")); assertTrue(v1.compareTo(v2) < 0); assertTrue(v2.compareTo(v1) > 0); - - v1.setValue(Double.NaN); + + v1 = new Value(Double.NaN, UnitGroup.UNITS_TEMPERATURE.findApproximate("F")); assertTrue(v1.compareTo(v2) > 0); assertTrue(v2.compareTo(v1) < 0); - v2.setValue(Double.NaN); + v2 = new Value(Double.NaN, UnitGroup.UNITS_TEMPERATURE.findApproximate("F")); assertTrue(v1.compareTo(v2) == 0); assertTrue(v1.compareTo(v2) == 0); assertEquals("N/A", v1.toString()); diff --git a/test/net/sf/openrocket/util/TextUtilTest.java b/test/net/sf/openrocket/util/TextUtilTest.java index 3b7385f0..8ac8319d 100644 --- a/test/net/sf/openrocket/util/TextUtilTest.java +++ b/test/net/sf/openrocket/util/TextUtilTest.java @@ -10,153 +10,153 @@ import org.junit.Test; public class TextUtilTest { @Test - public void textHexString() { + public void testHexString() { assertEquals("", TextUtil.hexString(new byte[0])); assertEquals("00", TextUtil.hexString(new byte[] { 0x00 })); assertEquals("ff", TextUtil.hexString(new byte[] { (byte) 0xff })); - - for (int i=0; i <= 0xff; i++) { + + for (int i = 0; i <= 0xff; i++) { assertEquals(String.format("%02x", i), TextUtil.hexString(new byte[] { (byte) i })); } - assertEquals("0f1e2d3c4b5a6978", TextUtil.hexString(new byte[] { + assertEquals("0f1e2d3c4b5a6978", TextUtil.hexString(new byte[] { 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78 })); Random rnd = new Random(); - for (int count=0; count<10; count++) { + for (int count = 0; count < 10; count++) { int n = rnd.nextInt(100); byte[] bytes = new byte[n]; rnd.nextBytes(bytes); StringBuilder sb = new StringBuilder(); - for (byte b: bytes) { + for (byte b : bytes) { sb.append(String.format("%02x", b & 0xFF)); } assertEquals(sb.toString(), TextUtil.hexString(bytes)); } } - + @Test public void specialCaseTest() { - assertEquals("NaN",TextUtil.doubleToString(Double.NaN)); - assertEquals("Inf",TextUtil.doubleToString(Double.POSITIVE_INFINITY)); - assertEquals("-Inf",TextUtil.doubleToString(Double.NEGATIVE_INFINITY)); - assertEquals("0",TextUtil.doubleToString(0.0)); - assertEquals("0",TextUtil.doubleToString(MathUtil.EPSILON/3)); - assertEquals("0",TextUtil.doubleToString(-MathUtil.EPSILON/3)); + assertEquals("NaN", TextUtil.doubleToString(Double.NaN)); + assertEquals("Inf", TextUtil.doubleToString(Double.POSITIVE_INFINITY)); + assertEquals("-Inf", TextUtil.doubleToString(Double.NEGATIVE_INFINITY)); + assertEquals("0", TextUtil.doubleToString(0.0)); + assertEquals("0", TextUtil.doubleToString(MathUtil.EPSILON / 3)); + assertEquals("0", TextUtil.doubleToString(-MathUtil.EPSILON / 3)); } @Test public void longTest() { - assertEquals("3.1416e-5", TextUtil.doubleToString(PI*1e-5)); - assertEquals("3.1416e-4", TextUtil.doubleToString(PI*1e-4)); - assertEquals("0.0031416", TextUtil.doubleToString(PI*1e-3)); - assertEquals("0.031416", TextUtil.doubleToString(PI*1e-2)); - assertEquals("0.31416", TextUtil.doubleToString(PI*1e-1)); - assertEquals("3.1416", TextUtil.doubleToString(PI)); - assertEquals("31.416", TextUtil.doubleToString(PI*1e1)); - assertEquals("314.16", TextUtil.doubleToString(PI*1e2)); - assertEquals("3141.6", TextUtil.doubleToString(PI*1e3)); - assertEquals("31416", TextUtil.doubleToString(PI*1e4)); - assertEquals("314159", TextUtil.doubleToString(PI*1e5)); - assertEquals("3141593", TextUtil.doubleToString(PI*1e6)); - assertEquals("31415927", TextUtil.doubleToString(PI*1e7)); - assertEquals("3.1416e8", TextUtil.doubleToString(PI*1e8)); - assertEquals("3.1416e9", TextUtil.doubleToString(PI*1e9)); - assertEquals("3.1416e10", TextUtil.doubleToString(PI*1e10)); - - assertEquals("-3.1416e-5", TextUtil.doubleToString(-PI*1e-5)); - assertEquals("-3.1416e-4", TextUtil.doubleToString(-PI*1e-4)); - assertEquals("-0.0031416", TextUtil.doubleToString(-PI*1e-3)); - assertEquals("-0.031416", TextUtil.doubleToString(-PI*1e-2)); - assertEquals("-0.31416", TextUtil.doubleToString(-PI*1e-1)); - assertEquals("-3.1416", TextUtil.doubleToString(-PI)); - assertEquals("-31.416", TextUtil.doubleToString(-PI*1e1)); - assertEquals("-314.16", TextUtil.doubleToString(-PI*1e2)); - assertEquals("-3141.6", TextUtil.doubleToString(-PI*1e3)); - assertEquals("-31416", TextUtil.doubleToString(-PI*1e4)); - assertEquals("-314159", TextUtil.doubleToString(-PI*1e5)); - assertEquals("-3141593", TextUtil.doubleToString(-PI*1e6)); - assertEquals("-31415927", TextUtil.doubleToString(-PI*1e7)); - assertEquals("-3.1416e8", TextUtil.doubleToString(-PI*1e8)); - assertEquals("-3.1416e9", TextUtil.doubleToString(-PI*1e9)); - assertEquals("-3.1416e10", TextUtil.doubleToString(-PI*1e10)); - + assertEquals("3.1416e-5", TextUtil.doubleToString(PI * 1e-5)); + assertEquals("3.1416e-4", TextUtil.doubleToString(PI * 1e-4)); + assertEquals("0.0031416", TextUtil.doubleToString(PI * 1e-3)); + assertEquals("0.031416", TextUtil.doubleToString(PI * 1e-2)); + assertEquals("0.31416", TextUtil.doubleToString(PI * 1e-1)); + assertEquals("3.1416", TextUtil.doubleToString(PI)); + assertEquals("31.416", TextUtil.doubleToString(PI * 1e1)); + assertEquals("314.16", TextUtil.doubleToString(PI * 1e2)); + assertEquals("3141.6", TextUtil.doubleToString(PI * 1e3)); + assertEquals("31416", TextUtil.doubleToString(PI * 1e4)); + assertEquals("314159", TextUtil.doubleToString(PI * 1e5)); + assertEquals("3141593", TextUtil.doubleToString(PI * 1e6)); + assertEquals("31415927", TextUtil.doubleToString(PI * 1e7)); + assertEquals("3.1416e8", TextUtil.doubleToString(PI * 1e8)); + assertEquals("3.1416e9", TextUtil.doubleToString(PI * 1e9)); + assertEquals("3.1416e10", TextUtil.doubleToString(PI * 1e10)); + + assertEquals("-3.1416e-5", TextUtil.doubleToString(-PI * 1e-5)); + assertEquals("-3.1416e-4", TextUtil.doubleToString(-PI * 1e-4)); + assertEquals("-0.0031416", TextUtil.doubleToString(-PI * 1e-3)); + assertEquals("-0.031416", TextUtil.doubleToString(-PI * 1e-2)); + assertEquals("-0.31416", TextUtil.doubleToString(-PI * 1e-1)); + assertEquals("-3.1416", TextUtil.doubleToString(-PI)); + assertEquals("-31.416", TextUtil.doubleToString(-PI * 1e1)); + assertEquals("-314.16", TextUtil.doubleToString(-PI * 1e2)); + assertEquals("-3141.6", TextUtil.doubleToString(-PI * 1e3)); + assertEquals("-31416", TextUtil.doubleToString(-PI * 1e4)); + assertEquals("-314159", TextUtil.doubleToString(-PI * 1e5)); + assertEquals("-3141593", TextUtil.doubleToString(-PI * 1e6)); + assertEquals("-31415927", TextUtil.doubleToString(-PI * 1e7)); + assertEquals("-3.1416e8", TextUtil.doubleToString(-PI * 1e8)); + assertEquals("-3.1416e9", TextUtil.doubleToString(-PI * 1e9)); + assertEquals("-3.1416e10", TextUtil.doubleToString(-PI * 1e10)); + } @Test public void shortTest() { double p = 3.1; - assertEquals("3.1e-5", TextUtil.doubleToString(p*1e-5)); - assertEquals("3.1e-4", TextUtil.doubleToString(p*1e-4)); - assertEquals("0.0031", TextUtil.doubleToString(p*1e-3)); - assertEquals("0.031", TextUtil.doubleToString(p*1e-2)); - assertEquals("0.31", TextUtil.doubleToString(p*1e-1)); - assertEquals("3.1", TextUtil.doubleToString(p)); - assertEquals("31", TextUtil.doubleToString(p*1e1)); - assertEquals("310", TextUtil.doubleToString(p*1e2)); - assertEquals("3100", TextUtil.doubleToString(p*1e3)); - assertEquals("31000", TextUtil.doubleToString(p*1e4)); - assertEquals("3.1e5", TextUtil.doubleToString(p*1e5)); - assertEquals("3.1e6", TextUtil.doubleToString(p*1e6)); - assertEquals("3.1e7", TextUtil.doubleToString(p*1e7)); - assertEquals("3.1e8", TextUtil.doubleToString(p*1e8)); - assertEquals("3.1e9", TextUtil.doubleToString(p*1e9)); - assertEquals("3.1e10", TextUtil.doubleToString(p*1e10)); - - assertEquals("-3.1e-5", TextUtil.doubleToString(-p*1e-5)); - assertEquals("-3.1e-4", TextUtil.doubleToString(-p*1e-4)); - assertEquals("-0.0031", TextUtil.doubleToString(-p*1e-3)); - assertEquals("-0.031", TextUtil.doubleToString(-p*1e-2)); - assertEquals("-0.31", TextUtil.doubleToString(-p*1e-1)); - assertEquals("-3.1", TextUtil.doubleToString(-p)); - assertEquals("-31", TextUtil.doubleToString(-p*1e1)); - assertEquals("-310", TextUtil.doubleToString(-p*1e2)); - assertEquals("-3100", TextUtil.doubleToString(-p*1e3)); - assertEquals("-31000", TextUtil.doubleToString(-p*1e4)); - assertEquals("-3.1e5", TextUtil.doubleToString(-p*1e5)); - assertEquals("-3.1e6", TextUtil.doubleToString(-p*1e6)); - assertEquals("-3.1e7", TextUtil.doubleToString(-p*1e7)); - assertEquals("-3.1e8", TextUtil.doubleToString(-p*1e8)); - assertEquals("-3.1e9", TextUtil.doubleToString(-p*1e9)); - assertEquals("-3.1e10", TextUtil.doubleToString(-p*1e10)); - + assertEquals("3.1e-5", TextUtil.doubleToString(p * 1e-5)); + assertEquals("3.1e-4", TextUtil.doubleToString(p * 1e-4)); + assertEquals("0.0031", TextUtil.doubleToString(p * 1e-3)); + assertEquals("0.031", TextUtil.doubleToString(p * 1e-2)); + assertEquals("0.31", TextUtil.doubleToString(p * 1e-1)); + assertEquals("3.1", TextUtil.doubleToString(p)); + assertEquals("31", TextUtil.doubleToString(p * 1e1)); + assertEquals("310", TextUtil.doubleToString(p * 1e2)); + assertEquals("3100", TextUtil.doubleToString(p * 1e3)); + assertEquals("31000", TextUtil.doubleToString(p * 1e4)); + assertEquals("3.1e5", TextUtil.doubleToString(p * 1e5)); + assertEquals("3.1e6", TextUtil.doubleToString(p * 1e6)); + assertEquals("3.1e7", TextUtil.doubleToString(p * 1e7)); + assertEquals("3.1e8", TextUtil.doubleToString(p * 1e8)); + assertEquals("3.1e9", TextUtil.doubleToString(p * 1e9)); + assertEquals("3.1e10", TextUtil.doubleToString(p * 1e10)); + + assertEquals("-3.1e-5", TextUtil.doubleToString(-p * 1e-5)); + assertEquals("-3.1e-4", TextUtil.doubleToString(-p * 1e-4)); + assertEquals("-0.0031", TextUtil.doubleToString(-p * 1e-3)); + assertEquals("-0.031", TextUtil.doubleToString(-p * 1e-2)); + assertEquals("-0.31", TextUtil.doubleToString(-p * 1e-1)); + assertEquals("-3.1", TextUtil.doubleToString(-p)); + assertEquals("-31", TextUtil.doubleToString(-p * 1e1)); + assertEquals("-310", TextUtil.doubleToString(-p * 1e2)); + assertEquals("-3100", TextUtil.doubleToString(-p * 1e3)); + assertEquals("-31000", TextUtil.doubleToString(-p * 1e4)); + assertEquals("-3.1e5", TextUtil.doubleToString(-p * 1e5)); + assertEquals("-3.1e6", TextUtil.doubleToString(-p * 1e6)); + assertEquals("-3.1e7", TextUtil.doubleToString(-p * 1e7)); + assertEquals("-3.1e8", TextUtil.doubleToString(-p * 1e8)); + assertEquals("-3.1e9", TextUtil.doubleToString(-p * 1e9)); + assertEquals("-3.1e10", TextUtil.doubleToString(-p * 1e10)); + p = 3; - assertEquals("3e-5", TextUtil.doubleToString(p*1e-5)); - assertEquals("3e-4", TextUtil.doubleToString(p*1e-4)); - assertEquals("3e-3", TextUtil.doubleToString(p*1e-3)); - assertEquals("0.03", TextUtil.doubleToString(p*1e-2)); - assertEquals("0.3", TextUtil.doubleToString(p*1e-1)); - assertEquals("3", TextUtil.doubleToString(p)); - assertEquals("30", TextUtil.doubleToString(p*1e1)); - assertEquals("300", TextUtil.doubleToString(p*1e2)); - assertEquals("3e3", TextUtil.doubleToString(p*1e3)); - assertEquals("3e4", TextUtil.doubleToString(p*1e4)); - assertEquals("3e5", TextUtil.doubleToString(p*1e5)); - assertEquals("3e6", TextUtil.doubleToString(p*1e6)); - assertEquals("3e7", TextUtil.doubleToString(p*1e7)); - assertEquals("3e8", TextUtil.doubleToString(p*1e8)); - assertEquals("3e9", TextUtil.doubleToString(p*1e9)); - assertEquals("3e10", TextUtil.doubleToString(p*1e10)); - - assertEquals("-3e-5", TextUtil.doubleToString(-p*1e-5)); - assertEquals("-3e-4", TextUtil.doubleToString(-p*1e-4)); - assertEquals("-3e-3", TextUtil.doubleToString(-p*1e-3)); - assertEquals("-0.03", TextUtil.doubleToString(-p*1e-2)); - assertEquals("-0.3", TextUtil.doubleToString(-p*1e-1)); - assertEquals("-3", TextUtil.doubleToString(-p)); - assertEquals("-30", TextUtil.doubleToString(-p*1e1)); - assertEquals("-300", TextUtil.doubleToString(-p*1e2)); - assertEquals("-3e3", TextUtil.doubleToString(-p*1e3)); - assertEquals("-3e4", TextUtil.doubleToString(-p*1e4)); - assertEquals("-3e5", TextUtil.doubleToString(-p*1e5)); - assertEquals("-3e6", TextUtil.doubleToString(-p*1e6)); - assertEquals("-3e7", TextUtil.doubleToString(-p*1e7)); - assertEquals("-3e8", TextUtil.doubleToString(-p*1e8)); - assertEquals("-3e9", TextUtil.doubleToString(-p*1e9)); - assertEquals("-3e10", TextUtil.doubleToString(-p*1e10)); - + assertEquals("3e-5", TextUtil.doubleToString(p * 1e-5)); + assertEquals("3e-4", TextUtil.doubleToString(p * 1e-4)); + assertEquals("3e-3", TextUtil.doubleToString(p * 1e-3)); + assertEquals("0.03", TextUtil.doubleToString(p * 1e-2)); + assertEquals("0.3", TextUtil.doubleToString(p * 1e-1)); + assertEquals("3", TextUtil.doubleToString(p)); + assertEquals("30", TextUtil.doubleToString(p * 1e1)); + assertEquals("300", TextUtil.doubleToString(p * 1e2)); + assertEquals("3e3", TextUtil.doubleToString(p * 1e3)); + assertEquals("3e4", TextUtil.doubleToString(p * 1e4)); + assertEquals("3e5", TextUtil.doubleToString(p * 1e5)); + assertEquals("3e6", TextUtil.doubleToString(p * 1e6)); + assertEquals("3e7", TextUtil.doubleToString(p * 1e7)); + assertEquals("3e8", TextUtil.doubleToString(p * 1e8)); + assertEquals("3e9", TextUtil.doubleToString(p * 1e9)); + assertEquals("3e10", TextUtil.doubleToString(p * 1e10)); + + assertEquals("-3e-5", TextUtil.doubleToString(-p * 1e-5)); + assertEquals("-3e-4", TextUtil.doubleToString(-p * 1e-4)); + assertEquals("-3e-3", TextUtil.doubleToString(-p * 1e-3)); + assertEquals("-0.03", TextUtil.doubleToString(-p * 1e-2)); + assertEquals("-0.3", TextUtil.doubleToString(-p * 1e-1)); + assertEquals("-3", TextUtil.doubleToString(-p)); + assertEquals("-30", TextUtil.doubleToString(-p * 1e1)); + assertEquals("-300", TextUtil.doubleToString(-p * 1e2)); + assertEquals("-3e3", TextUtil.doubleToString(-p * 1e3)); + assertEquals("-3e4", TextUtil.doubleToString(-p * 1e4)); + assertEquals("-3e5", TextUtil.doubleToString(-p * 1e5)); + assertEquals("-3e6", TextUtil.doubleToString(-p * 1e6)); + assertEquals("-3e7", TextUtil.doubleToString(-p * 1e7)); + assertEquals("-3e8", TextUtil.doubleToString(-p * 1e8)); + assertEquals("-3e9", TextUtil.doubleToString(-p * 1e9)); + assertEquals("-3e10", TextUtil.doubleToString(-p * 1e10)); + } @Test @@ -164,42 +164,42 @@ public class TextUtilTest { assertEquals("1.001", TextUtil.doubleToString(1.00096)); - + /* * Not testing with 1.00015 because it might be changed during number formatting * calculations. Its rounding is basically arbitrary anyway. */ - + assertEquals("1.0002e-5", TextUtil.doubleToString(1.0001500001e-5)); assertEquals("1.0001e-5", TextUtil.doubleToString(1.0001499999e-5)); assertEquals("1.0002e-4", TextUtil.doubleToString(1.0001500001e-4)); assertEquals("1.0001e-4", TextUtil.doubleToString(1.0001499999e-4)); assertEquals("0.0010002", TextUtil.doubleToString(1.0001500001e-3)); assertEquals("0.0010001", TextUtil.doubleToString(1.0001499999e-3)); - assertEquals("0.010002", TextUtil.doubleToString(1.0001500001e-2)); - assertEquals("0.010001", TextUtil.doubleToString(1.0001499999e-2)); - assertEquals("0.10002", TextUtil.doubleToString(1.0001500001e-1)); - assertEquals("0.10001", TextUtil.doubleToString(1.0001499999e-1)); - assertEquals("1.0002", TextUtil.doubleToString(1.0001500001)); - assertEquals("1.0001", TextUtil.doubleToString(1.0001499999)); - assertEquals("10.002", TextUtil.doubleToString(1.0001500001e1)); - assertEquals("10.001", TextUtil.doubleToString(1.0001499999e1)); - assertEquals("100.02", TextUtil.doubleToString(1.0001500001e2)); - assertEquals("100.01", TextUtil.doubleToString(1.0001499999e2)); - assertEquals("1000.2", TextUtil.doubleToString(1.0001500001e3)); - assertEquals("1000.1", TextUtil.doubleToString(1.0001499999e3)); - assertEquals("10002", TextUtil.doubleToString(1.0001500001e4)); - assertEquals("10001", TextUtil.doubleToString(1.0001499999e4)); - assertEquals("100012", TextUtil.doubleToString(1.00011500001e5)); - assertEquals("100011", TextUtil.doubleToString(1.00011499999e5)); - assertEquals("1000112", TextUtil.doubleToString(1.000111500001e6)); - assertEquals("1000111", TextUtil.doubleToString(1.000111499999e6)); - assertEquals("10001112", TextUtil.doubleToString(1.0001111500001e7)); - assertEquals("10001111", TextUtil.doubleToString(1.0001111499999e7)); - assertEquals("1.0002e8", TextUtil.doubleToString(1.0001500001e8)); - assertEquals("1.0001e8", TextUtil.doubleToString(1.0001499999e8)); - assertEquals("1.0002e9", TextUtil.doubleToString(1.0001500001e9)); - assertEquals("1.0001e9", TextUtil.doubleToString(1.0001499999e9)); + assertEquals("0.010002", TextUtil.doubleToString(1.0001500001e-2)); + assertEquals("0.010001", TextUtil.doubleToString(1.0001499999e-2)); + assertEquals("0.10002", TextUtil.doubleToString(1.0001500001e-1)); + assertEquals("0.10001", TextUtil.doubleToString(1.0001499999e-1)); + assertEquals("1.0002", TextUtil.doubleToString(1.0001500001)); + assertEquals("1.0001", TextUtil.doubleToString(1.0001499999)); + assertEquals("10.002", TextUtil.doubleToString(1.0001500001e1)); + assertEquals("10.001", TextUtil.doubleToString(1.0001499999e1)); + assertEquals("100.02", TextUtil.doubleToString(1.0001500001e2)); + assertEquals("100.01", TextUtil.doubleToString(1.0001499999e2)); + assertEquals("1000.2", TextUtil.doubleToString(1.0001500001e3)); + assertEquals("1000.1", TextUtil.doubleToString(1.0001499999e3)); + assertEquals("10002", TextUtil.doubleToString(1.0001500001e4)); + assertEquals("10001", TextUtil.doubleToString(1.0001499999e4)); + assertEquals("100012", TextUtil.doubleToString(1.00011500001e5)); + assertEquals("100011", TextUtil.doubleToString(1.00011499999e5)); + assertEquals("1000112", TextUtil.doubleToString(1.000111500001e6)); + assertEquals("1000111", TextUtil.doubleToString(1.000111499999e6)); + assertEquals("10001112", TextUtil.doubleToString(1.0001111500001e7)); + assertEquals("10001111", TextUtil.doubleToString(1.0001111499999e7)); + assertEquals("1.0002e8", TextUtil.doubleToString(1.0001500001e8)); + assertEquals("1.0001e8", TextUtil.doubleToString(1.0001499999e8)); + assertEquals("1.0002e9", TextUtil.doubleToString(1.0001500001e9)); + assertEquals("1.0001e9", TextUtil.doubleToString(1.0001499999e9)); assertEquals("1.0002e10", TextUtil.doubleToString(1.0001500001e10)); assertEquals("1.0001e10", TextUtil.doubleToString(1.0001499999e10)); @@ -210,30 +210,30 @@ public class TextUtilTest { assertEquals("-1.0001e-4", TextUtil.doubleToString(-1.0001499999e-4)); assertEquals("-0.0010002", TextUtil.doubleToString(-1.0001500001e-3)); assertEquals("-0.0010001", TextUtil.doubleToString(-1.0001499999e-3)); - assertEquals("-0.010002", TextUtil.doubleToString(-1.0001500001e-2)); - assertEquals("-0.010001", TextUtil.doubleToString(-1.0001499999e-2)); - assertEquals("-0.10002", TextUtil.doubleToString(-1.0001500001e-1)); - assertEquals("-0.10001", TextUtil.doubleToString(-1.0001499999e-1)); - assertEquals("-1.0002", TextUtil.doubleToString(-1.0001500001)); - assertEquals("-1.0001", TextUtil.doubleToString(-1.0001499999)); - assertEquals("-10.002", TextUtil.doubleToString(-1.0001500001e1)); - assertEquals("-10.001", TextUtil.doubleToString(-1.0001499999e1)); - assertEquals("-100.02", TextUtil.doubleToString(-1.0001500001e2)); - assertEquals("-100.01", TextUtil.doubleToString(-1.0001499999e2)); - assertEquals("-1000.2", TextUtil.doubleToString(-1.0001500001e3)); - assertEquals("-1000.1", TextUtil.doubleToString(-1.0001499999e3)); - assertEquals("-10002", TextUtil.doubleToString(-1.0001500001e4)); - assertEquals("-10001", TextUtil.doubleToString(-1.0001499999e4)); - assertEquals("-100012", TextUtil.doubleToString(-1.00011500001e5)); - assertEquals("-100011", TextUtil.doubleToString(-1.00011499999e5)); - assertEquals("-1000112", TextUtil.doubleToString(-1.000111500001e6)); - assertEquals("-1000111", TextUtil.doubleToString(-1.000111499999e6)); - assertEquals("-10001112", TextUtil.doubleToString(-1.0001111500001e7)); - assertEquals("-10001111", TextUtil.doubleToString(-1.0001111499999e7)); - assertEquals("-1.0002e8", TextUtil.doubleToString(-1.0001500001e8)); - assertEquals("-1.0001e8", TextUtil.doubleToString(-1.0001499999e8)); - assertEquals("-1.0002e9", TextUtil.doubleToString(-1.0001500001e9)); - assertEquals("-1.0001e9", TextUtil.doubleToString(-1.0001499999e9)); + assertEquals("-0.010002", TextUtil.doubleToString(-1.0001500001e-2)); + assertEquals("-0.010001", TextUtil.doubleToString(-1.0001499999e-2)); + assertEquals("-0.10002", TextUtil.doubleToString(-1.0001500001e-1)); + assertEquals("-0.10001", TextUtil.doubleToString(-1.0001499999e-1)); + assertEquals("-1.0002", TextUtil.doubleToString(-1.0001500001)); + assertEquals("-1.0001", TextUtil.doubleToString(-1.0001499999)); + assertEquals("-10.002", TextUtil.doubleToString(-1.0001500001e1)); + assertEquals("-10.001", TextUtil.doubleToString(-1.0001499999e1)); + assertEquals("-100.02", TextUtil.doubleToString(-1.0001500001e2)); + assertEquals("-100.01", TextUtil.doubleToString(-1.0001499999e2)); + assertEquals("-1000.2", TextUtil.doubleToString(-1.0001500001e3)); + assertEquals("-1000.1", TextUtil.doubleToString(-1.0001499999e3)); + assertEquals("-10002", TextUtil.doubleToString(-1.0001500001e4)); + assertEquals("-10001", TextUtil.doubleToString(-1.0001499999e4)); + assertEquals("-100012", TextUtil.doubleToString(-1.00011500001e5)); + assertEquals("-100011", TextUtil.doubleToString(-1.00011499999e5)); + assertEquals("-1000112", TextUtil.doubleToString(-1.000111500001e6)); + assertEquals("-1000111", TextUtil.doubleToString(-1.000111499999e6)); + assertEquals("-10001112", TextUtil.doubleToString(-1.0001111500001e7)); + assertEquals("-10001111", TextUtil.doubleToString(-1.0001111499999e7)); + assertEquals("-1.0002e8", TextUtil.doubleToString(-1.0001500001e8)); + assertEquals("-1.0001e8", TextUtil.doubleToString(-1.0001499999e8)); + assertEquals("-1.0002e9", TextUtil.doubleToString(-1.0001500001e9)); + assertEquals("-1.0001e9", TextUtil.doubleToString(-1.0001499999e9)); assertEquals("-1.0002e10", TextUtil.doubleToString(-1.0001500001e10)); assertEquals("-1.0001e10", TextUtil.doubleToString(-1.0001499999e10)); @@ -242,10 +242,10 @@ public class TextUtilTest { @Test public void randomTest() { - for (int i=0; i<10000; i++) { + for (int i = 0; i < 10000; i++) { double orig = Math.random(); double result; - double expected = Math.rint(orig*100000) / 100000.0; + double expected = Math.rint(orig * 100000) / 100000.0; if (orig < 0.1) continue; diff --git a/web/html/techdoc.pdf b/web/html/techdoc.pdf index 2377e85ccc843cef1dade7ff5646a4380538c5bd..ffb4aada581bc9628fe9c270ba84a4916f60a83f 100644 GIT binary patch delta 323014 zcma%jcRXBO*S67#-g}Q;X9lD9-aA3G5F*h_2u6#RkZ>^3dx?_hMDIiwM2}8%K_qIv zk=)Pw-S_i6@9+EmI%l7~ojGUieXeV*Ypw13uJKH%X+d~DS?k9L;x-c z4bVK(GxC&}M-NtdWuc z3S|5ME*TZTM2^cS#Kj~njcf1nz}5B%X8=Fd7uO+DOb#S$zlp{uAX3o8y^UHai>cFvm1{!){ZdG||+> zo5}Q7?+7d3W{NLyxK6P?x>x8CzkwO*U>1W)rqO|Gj;i*Kb% znv+;v0>pTBx>4aI>Tei@?y8sPz4;gp|ENv|uvDJ}FeRzm$8$?OOw=StO&n2BPE})$ zR~Pn3DM<7V#M7c?C`@e6YI4tVT=qV^XnSDLkC8n^W0GMIYcJK9JXcV6M|z)*Sm!(J z!-@l2_~}gSsXgfcJd0?sc&VFK80Fai<6C)aqc|xl=I@f{8BGmgGAq%YEVb)FS{khf zAJ=xq8>!2${jeLN+1ynaWp@eC?IiVwzYHt&9XypDJIA@)Kh+~NTyH!VfLrlNgW5IU zKDb>*o?agIHc$R%K_M+oJk3N7h6y1TmOie4zP+cbw}+j*CleTk$e{x9ae`s6KV5Pz zF0NjlOy*2rQL)=AOqRIP(oFwanWBgl7)Tvprqdw-|5>9a8_Y|XaTjJ(w9eT?X5M%VZ6;Kbk6CoOQxjq7)lbje+f zYCmc9*kg=UTy(nBJJfk5BWfLja)sYW^I*)2&-=2cON@E5h?ecfom`Ho3r zeBZ5Kdys+s$dm_u_G%lAIY?_)tDcoMbA)j}AS>hn0%!B(GeSq66z}T>#ukqCm zCmtvSmnFoz;3gWH(Q(vviePjDnus*B3#!mOzr}wsMiWXw0Iw9)|53iVNkanEXf* z{`|gI3b~GKEssgIbJDB$W+y&>!bq^3+>6Fhpk!GY3ookOeb&YygP*|mUUose6oDW zbPvCpdKwYXYlx^q?d{SpvTe~Zz1WltOwU?r*=I_US`nbms|V?_J(;wd*zl%gq~EK{ zfA27=F(G>z_vPtJjJRTwV-dL+U!q9rpR2WxpH8SBUz~h~$3>qes?I!pnI`^m?0ugvcZWx|IL@^U8HUiO z^)<|(Ol#TXuj)iyL{v5SDCE(C?tN3G4@Znr+R9R0XS(r>J1Kq!n9+Y$U_9DbbUb9` zQ{$a&dt>9@3RhRsA2sDEp!Sm)rm*u3?}-Vco01#HL#2(R&OhA^P9{MAVQZf#u2>Mq zjdsN1qYI}}IKL}ym9Eua`m=dx@iE%^WrMw38~-cX`v%92e2AcW{FRlwS)dF6{cuH=85?)Fry^5uDe38#uoL|{rQIy+gV37p+ zZ@-4%=o%@0WS1$F$e8b*>-ZeNr>F)o$ye`{kR1#lW^k;IDBFCk(U4=o``E~RF|lZB zzeOQrI4A~=u1?=u_}Lw;P*AuCjmsxJL4$vk!|0`Yn40C)4>+x1&}1R)1!I^$hQL!0 zE;@d-hO|P2(*4N~j`|TY86(u3+mTOx1OsbB?&(Gs!o{mUqtmX{FgF?s!8AXW^aM~cQwhQz8{1p5cX z0;A6SeE$Vt#RPwY9a!u)Dl>t_ZXs14d4vEf%%ljiJTekQg%_GQAj^VDCM*Qy7luHX zATSues34e07!2hHDy1laWbT7eOLD1SZ4}6M-^8#6iSR6+s|FFCxkh5rQ&-!7zRZL=?#q!u&$QNaTh>koQ33jH6NluTZgo z{9Gauu$UlnS6O^=F)jv=*=~ zWdMAZ)&Rn!4FE40O@LWOA0Uy{0@`H^fGSx{z)IEt(38^yZe;a=Lpd!VL+;N6#K|iG z67rhACxAl%`P=e;?%A%O0k|j_0QVI&fjf$~&xQ?LE2c zGYj`$_dHf}dQb=ghcQfBDwH`uNJxIplaibqj`b}5;v;$WN~l!d^X#%F zPTuay@#+qmY`%-#C+YY;+r@5k2dWfze5?ap?^eCS`7#)egHcC~Yxh!ND0beCh@^ua zE~QL`swzNk*q*$YwanZ6y!Ht!DhXd~!V@U#^?Tp@4T}xKE4(V^o55Rp)`=pP zk4Dx;&E(nz?-n+#dgde0<~l~ik6Oo;I~;Q9dXeWBa*BHuK37V>^HZAxM^#(jCqJko=|qyP6^2axSZ0uuqp?9>eF<{v@3ZYpSC$`awXv*6{^a|vk{)mEQa!yGQJ=?Me*bU$^CwSF zvG|pa#{QGxAtFgOAZ7}P=x^5kJHbOlV8FOD?|(xw=q-{WkqjAQ)2hcJIUqyP^fxq7 zX=oty3&==+V|AT|Ch$PR05HO7Th{=P)zbj>kjF22TEI&^10YCW6X4ND zjSEknAobjPwwo zBK*QaV!(Yv`hRI9M8Kti783o4@P%OfLLx}-0gQAvU_iV8#qS}}N;pISU}#7ngmg=g zQ9ctyNECSw;FS?4f=wCO$7f^&&>3T6fJOPmzyP-~$E~13L;?}LrP;qZ4-kZqB?d1V z(%Aq1NQnl4i2)fV;i$bV)vTs=sMJn`IzRr))FPkvHa^pD#HLAp#7=1-7w+-zj}o10I}m5?*|XSQN2RDdgEJYX2f*Q}N*0Lq41i|jam?!WURuB-Ykgqf zMioG_xt&QJAk79j&JH=w7C8=i9JSR4j2@@}PIiBO`{02J$?c;3yD^b(90K7%#^W6+ z1eE`Otn=bA0pbYhFa4(wR7alcxt7YYD52RhIeaNj`yqz1$}(8Kr1 zZiwAm>X!B`#q8NygLz1%m7EV9rUtGX8XQlxGM}6@KBDIqR(zgE-KQ$_u>E|+eUa6W zfRUKfNDZ2YdzZWRmDC9}FDaYfC)%sB@sz`w6w)-}I2dK#31S~pwRz-2<%WGqU3}32Dm~=*lpzEOXlrY zUGfD&?n4HcuIn4ymk7BF=hQJ%*Lr_@yShGfMV#(aCXV@GvZr*r z8=tuytGI#(omJv%J)gJKC^CObX~~y9Bw`^3xoOMoetRJsdKAUlYjOOPaP_qfK<42o zaOTC`Fg+eV8%_s12+}r4XTiH`t(@KX=9zMU--6NBh=B;%CG^p*bFuKzQ%dx>9vHTj zVA6d$D!q}5F0|9OiPw4}G>va1cuSkOc}@y?D$_r)wU*HKCCZy1<^deXyYTUOW+|Uy z80}|1=af9xCJ;vmqsxi$yoAUj@3b_`Wd*gQ^I>IJ$lYl9<91Skg|$bCYkN$6*JfDb z3=hw$5B-cyk4o8_YOHez&ZZtZDU@}nei#xqEx5=fCaMuE7U;@u_4>KakafJQA%7Ij z6!7k0`Kx75+pQ%Jl`wBWpa~B1B{IREEcsH~Hkn1BN*wXS&a$B&;XTVbizO98Ah&8o z?K`IJ*o^z)hGCzZN7QfQ%Iq_WN7T)D;#2g~?{CNO-Lb|r+Hcwv1iED5{q-7Qdpn?* z^Z~mZ?E#6%ME1q}()@V+sG@GKa_FMBNN00P2uso!w)8|+ML$?u^c)_$eIeMo^yczn z$PPt~1Z_eS&(tibP3IxYqM1ZZSTKgZnZjiI!pG8{^{nVwZ8t?0_PeV%bkTQht%s`8 z18!pS$gj@XJEOX4+~=c{v*~Rfe+=-kx2_=L@1Kqd6r+6lLkT_N}xB?AFh0!mB! z5(+}k2X}bW2AbB@pFs})rDdjrBlG;er;aI`KJ@kdGFqOqQ}K@^^HjX$-9q>DbW>B! zid@b6oRrSib{154mg6)-NN|leBb_h??bR7_lh&j3VH$-*!Ls*oLQJtdWlN{N&7N38 zsvxr|Ei?DUBAaq*G`_p`&Nuq{W+wTUrY-wl9K&+EQrJ$v)^d!&QO|1haHW3i6jh|( zT{{DVO~t|%txI?o>&_a5Tp35M=1I^VOO$?*_D&05VTjPAvVlKa;CsPCnY$_d*d>#I zesW+<{7~R9N6wG3;`)IC{o?s_!Fh9q8H4t_b9Z|g!^9=t_$_7oDig7}_@?ao4nYyn zpx>97JW+hz?M9r3aKE*s*$4f-b@Sn^m!cvcmbUkLd-a*uwyu?TL~08U_csb@opv7? zhNL}Cva0V|)WUrHD73wmQ~9T6X}IR5-RB@YE+=0j%d)vF4nx}G1EyW*sqrOD@?Exur^No1maDS7wW@A*F4&Dkc43eFP!v5h!W>u_}LJAQ@B z-A@I{E-}rYIts22gqp9J)qLL{Ub<2}y}?KnuYL75ra-urk}(1m&iG`%1D}7;Ka#e_ zo%wP8goVhU6Nq;v$3#k^5M&^a1X9Zs0zpi4A~I+6ET#z6Cg%HQL#WUpu&U)o@A`$ znWjqAvTHK*MRy9Ec^FbY&=Frg+3W5zZLFWkyL#P| zt{jQg5GPbXchsnRnTMZBH0mbw5WXWQzMg6~a2MC?rQN_njzIXa&|`9&ySWS(Ri+yb zG#-Va9<%qoUqiJLw9Uu@eEW3zug+hq^Aa|M-`RW|{(@xa4dJ3sfrSA3FKtdXIU*%! zOrrUytJIoI>{eM&!<=a`4sCXO& zLib;TV~p@z42TqpJ3xM4_AmFL=#g5F%=`4WF6Y={JzLdj%x?}3_y-5BRUZo{W1iAF za392Htzqp(Q{nngd{R-^=nIAuJNUO>+IjH`0%3NRU2=m83@p;*dDB_jXfhp~+)O09 zZ<^Y@48bvCk>`t%!%tRfW@hl%6|i=z1{N|d-d?*7eSR?&JMk+{E3Jr5(O^r9c4i{q z@nfoq9)5!0Md%aj($D=>1%4jTI#o~enpi!$W1nmNI`h>^(rj0XAKClxcdNo5Do;Kv zCiw;FpL@E6>nNy^5xy&gRyYGjY6rgaL5oridX5(58PPp*!~>Koul$Z(Ly{Tcy~RX@0K)OHH{7_~RTLch^_!ZZ+@CvF>lvM@ZXF zpz^3PCF0)MRB8!$T0E4uzgfUwms}CYq=4x(>mEb}8SA=OjY`8?+^a1TenbZ{3PLWIw-Cg^mw+Hp+ga&-TBwb*_ zcaxv*&M_8iANJwe11C$wi1C-GEELc`0@2^$1SlA@ejCwfRQ-xKY0}~WaGaA$v?0|=x=I6gg*fyKolLj+TP{=OiyYM*CBsBo0sPL>z8 z3mNKNct>O5_qHSt)35PhotmXnn^7{|?NOm=Xc)!;xv(=Fi{KRtcb1Ee1V2jFFp3^k z`QF*73bd7#9hFf%*P=$c@k6(vkKt7pm6($`Gi>Idvs7NGTBAsYESe)$-6nTFF@e+l zF8aY;OIBH5I(+xed1Yh5aJX?Y3wH4PA84mv@kTz_AAjBQ9!ubgtSS%R*ClvC)HP?S zPVIga=#jUvnX|{^5=#%?YH^zurwHG#;@eeWoK@U@unu>HMYF1zxD!!2HRi82RWbJu zbbK&}+GS!K7UJeZz7)eZUHRiS8|N2neZf9^dFMh@Ax0|q?ccaWzQagd z>3N`2M-v`fh8pmd`ioOIdMfBA!!CaVMwx-u7>cyXr|Im*nI8LrOxsN+JWf=xINse? z0M>yUzycD2TvQZPU>@Eyr z4JH%Y^`A`v?P_12G0F#6$#)(E5^9RVoMa46%wjGhuoIZw#EW5Y$9u%kF|xyvuo#3q zZ+3*@FXKnFf)4XJT8HKb{C2(1AL%LCq&sJQcJqBhE)l1m!5IzCHqtN?it~E&$Wvdg zqzGjlY`n3jeUF^XS@kIWEO%7vztFjV zY3_rhk*Tw+<;X#9HQaPB!(Bf#2+gXW2~MQ!fQ@3>Z}Z|5t#`umVW?nDIQf&3zPiUK zq!a{Eto3_?d}XK`1@i;}ht>uKeN7QTbro_)sqWa6ecUmpa145`QCHqU$H+LAlfw?fr0u;YIU z$B@PaFubw1$1}7z+8qM17@+Y>v2qf4{K3(}X2romGDH>Ag@s36 z6}O;Og}vkj*u;YXgq5s7Dq3xr0Evo9nnwO>(Y=RbmS+&U_s+&P%R$pIs1-@i?P$8a1)qCH zt5C9WU-7kn z4Hs}Q9O*MFdS~ht&4O^6>7W7b?B6HV)b+XUxm)zL=ISfUlykwPVKRkONm<6zl$q3S zNg-kyH|^u2CMPFaN4d)!rg>12bz8MEo^KIr`l-5b29#rZd(!zZ@8aCIk_a|pYwE_u z{_GMq=<5N{`uT@IhFhO z9xUm!{8-S8<6^b$9eqC0Xwktesc=!3E=~k_X$=xd4(2|QeI6I(-fe2HXz(~a_r+#& zNLFL`oA%dYZoe|$y`L#raH(FmZpzclu6l5ePY!=kSV-Fxlr1~3?HI3mmqWYBK2Xm5 z-Ld$aflYeUWVp|L);jbPke)vI+JYvU$iak~b>BNvo-d?UratRSZ}9W1v`QuJ zcDE^a_*WuRTXLpCInzmdop~&ZOToE1`7$`ib%^{xXZ}9)rRCbqFzq1e`(3<%_pa|+ zt$N1LIWm43L_^3axbHtnD-~GEHNpt1Xws!T-^nyhGfHR6i6(WNE*&-bwGMZzGNPfN zZWZj*f@mv5H5;X~=ZwVUsSF@okBx{a-m0J5CuGX5+@mSFIS4D!*L!?P5wMSCFUJnI z)$UD(1&U6Q`vzhs1n0vNh@2;_;~Ms97>DlpvjHXXyl4SZu&TuQ)4C*H@ zWyF0%&Zi4Wx!j(IM|HilgjD|!p;`1!jP?}Eg5bBH^AT#Ts9j~inHhfFNg)ek0=_Mg zqJnP|hs>n^nKy*~&KpYnr?vd`&yr(OaXjTff8`wur05g&|BdYeTT0|Wsh1c(D&9T)|SfQJ;7p<-MW)UFp_@XHp^^cP~qR1hQI04P-L;dtvR5OKYlaxuUrHa3I%2|?;>^Tr+^7ypJf2BB}yW6aga*| zJzF36kc5Yj#zdCy5y^=GIoVnWR8>?-gy1-c5D?4J0*tfOfw3HI-~f4a%+&@Wkmu-m zY5;w%2Jj|N8!*kpL%&^62sbW5UNk85&wBdb4e&Sj9WXB^K)ee@!>Ufn_rnBK%Klmt z$OZK8YeM+9D9`d=URwB1TmTjR6YwBbO39f1O#io16NF6%vUn|_O!wdAaHud05h8`d z12C2ofsoUHtXD&Z9@NNFq&!Z6SQ5g(_x=(QQX6N3chQMePR@qA}p-ri`te`P7zkW2I#j&$Z*Wtt!sa5pA79pQ-GW{o1~dW z3I6yLZpV10Rqp8Qt5n*kR-g z%QbM>l}fGiB*c3B@R($U;Rhotn=d)szZ{yRn{@5P_QgXA73PIgG2-<|eKWSx*H-0i zmIGL1;oyUt(%c}A^8>fAAJN!F@7eW+H`X?BopQF1L4+NZs-;fGB&)7jmV3;Bi+IqQ z9LA@G7T9-3&@jfeU*X)ZvUV5Iu0l!EsiMq3rM~O}J#8kT14{^cA%-u%%&acM(eEwT zZh9;!kgo-A(fvI3J{yuq$8vJ#I$So0$%UQLcvN_~b@4BDcYMCwcXYNHfR@|V)|aZ^yoeN zi;gQJvcyGbVd0yE{V~1Iip-J-=VJ^>v0?yGG#*61{@~TS#Ee7 z9T1SdAZfm2Cn{&Ho%MF7PRsSfo5_RnQmM};uHGmcQ2%|7j34&;alL)zC&ZEb9I+8Snq<82nL;elw1MGLo60 zqToN(yHI3d@NM-jDp&-uf=|E&_ck{3oEISqnts1*{x&6wUG+$JiLOt5p>b_;+0cWrajmvBtH^QA-hVvnuww|!9IIJ1e;)PA>OT&!?^zF9~&P>I)5&u?jAp z3aK9wE&hS=tL7mZyeL;NjV~tPh>t|t^L<1d!Q&;SbhoMJucH(1V#RTFrw1q|G5pH> zSTV)tnw}cel`EP4VLR!haNe!ch*G=1;<}g?{4*B6b!eAYdqh8`V;v0t_$f3@Pb<%N zj@$JjE|x{U!C#RiS`Axu;=bcqm~SEeP{*S!P6e^7cWdQ4A|XGd-j|;>exvjuSgweB zHnGAi^PCw2=SemJnR(l|I5u{IegzuQX<3eh!z>n2a(2lp-T0cRCCxn0uzbwZ=SODO z-oaf|U-&t{(;FBnak@RLh0kN4)h*#&@U91+%9-^Tg}7k7a-TGMO!r>O>YlG529s`- zy5%vsb0Z5`m}Z~EXI5+3y`=3o;zP_Od3ie=aV3m&MwPoi{BfOC*K?ynOG~ z@#;&sUbTP38aYFwd`SL+%vQZ^%W2?>LEps^+&Hk4e?KB~^PrsnvI~r^KUA_k^Z>w~2rqpE7V@ z4b+|Uyn7=tOgn$JiPyGk@x2763vvC51?*L||50Wmim6N2siScUyn-~9LQ4Ox*yh5F zI_XM%^K*7322IrQN7Lca-KaDXD)@dLh-rD9pHq$AIhV9uQ=wbE-=1@DGyY8c^yIWT@fc*~lLENh@=m2~ohb8_Ie+_bbZXHL4x@7F+@-QvyYzxb6=yt{tj7H&%^&SFjWIJy(C{n~4r^z)Y;(kv+dBSqYy`&XNBsLhJ-V+{lcsB1`$Y zcV?8-;c;Et;okPa-ZB#!K8;=YsvH)DRB}?6T%#Z@YoUDLHzX+jm z6f%EN0`PMQ4?!Y~gxuc|kLYi0{2wy9C<62tosaBaWbl8>SdlD|y{rc;w?dJ%sN`)1 z$PE$W0%&AtP#Cy6xNQL!q327e2xJdb-gaE$BmHj}7zi0u1t?qbe}{RZ2pbo49)Pof z1XWZNpc#@x96KRhU8f-$WYBXP`2Fwr{*S=#uk=8NH;58lhzZF$A>GK>$zqlOu`r5` z4X_ORA_Jq;;bJ(A1xuA8_oS%=hXsw9jphJuar;JJgj4*CqtNQb)=OSi{r9=gNz@!t z21mp`#&mym?EZdyqaH9}L^)W!G)l&6pD#;-tyoOeK&yW42P^(9AAgjVup+9O5K_Hk$mN7rxBv1V0c}hcR@F2Z3rpuiWWh6H$Y2o z$EnANRSWx!620c6X&x^@`v~ot((+?4HWk~G zi}vy{U{bBOmEBFpmV=XGmCGfGf#tI0eyu$9SHP{n6ZBd-nEzg(P@_Rl@#}gWwdsdr zk=fUVSv>I5QXRYFyS20_=U9R$+Rr0Kweg*9Feeri{KIu6drJAy95HKtY1h+$-eK6> z%$P}siVVD&fz+@Nd_Bbpy56OcN)OYG&{(ia30r^an3+0FI6UIN@;FLAFtBy(&9yCx z#lrnMK^gP%)fX~u^8D?4n*^^kn@fD3REm4uP0x3OcXs2#tcf-j8>QP5=c|fc431dd zm(V<4Oz8H8ZB$Ysx@KO`j@^MMY8!+-=s0Re6D;`}*u0S4u5gL^stWcn&g4aqs)+Rc z4T(Y*k9B;JaXq*PU86f`)FS2(E|jL*PfS^lCbCl9*jfuW9{_|#}=D=ErlQ^M~#ZyJhyLk@o^ zeDP8uEewQDvA$|*^_6!mz544k`ic2mC0GK`$TTw zGUzg)k@EJH?ln90GYHOol-&5J)}yDn`e>c@gLqjSuhd^BW{|W7pA*cDejAsvXL3J6 zhr?Bk-Hqxj8={CGmMn43wRgPoU~(BRb!z4>QOQA>pDApf<%QX@!te+$&-+gWZj4V8 za$E@}&IT><@8t$321zjSJ$m^R%M2Z?tC-q-+5E9yN##R3nFk~w@xjk|*>*~$BE#6JK3Aln^A+Id$Kz(~Ne-JQm5L03Q5G_m;vn5zlQm+sytQzgYQ?1uw1Pik~a@JQ`D zdf!*_b!h%{x`R(BM)puyK1I%INMdfl?z%&T-mF@{glRKQ4GmLoNlE?7t{Zw0dmB8( zC;&Tg1a@>J`cQN#QdV@#^Qm|ABH00mY<;P;%Jr_xndxew3J@GUFBp>=%B5R8ksBI9 zp1SrDzbC6S7hfi#5?}Bct71Ng#f>wKFX8S6&$3)S7j2nh7Cy%K(Z?LV&mlz)n4Q(f z7jbXJNI5#tkDE87=}RzMb4qds!zkcJl}*eKPG`4^*HrT2v~hGUx_h6f?j2Bt*hX@E z{Px04=u<00D!mfrcH$iA$gzWo2g@!BmMVSRi(l3{A?<=H1IjMPn}tN4;&5(Xo~ucF zIZWQV^Q?_z%o;vYSRfDPpwaC2Ix%gHt0w-OpZJ<$QUT2Fy`y|tbaNiQo*qx&cjEEc zxPJz|!diPaqX&u5&3*JRPB4`AAmoY3;tl2&I4#Yfgu)l&*Ddv{ml8En($6B-esffPH-Z1>!!IgK4j zq{B?m-T2_`dBJ^eo4X!&Z6rS%gs+HOc}GU@a9Bt{8tRn@waIB#86)0ACGOyja^tut zOptDmc|lPK*#la)?mQGG&EWzwFCCV)&rE5uu%(?W^EQ6yd$jQVYlJCIysOxCJORJ* zWV^+?6!{A#8-*!JYewCMp$a>oE5xI$I=Kz=qc>?y*cXGct(qc}7lk9W8Sv0-0vV>* z>^oL7)eb9iS!xZNq7gDaKPy)5$$vIrdd zXVdCGyf)Zv@dGdGzr42pTPO?_{Y!vF7C-;irx7tlWQ+(w0~~SSaM}XE9>N0_Eu?{@ z8EukVVc>6pI~0c89s=P8@P-L~tJKIQWcGG5)UB^3_P@sB|Ip?CQ48{Sxpi>wk6xKX zO~3>9Hc>+cAR{xZL`d-|B_Qb~?HI zuJ9(S+_L8rPut9%3*w}Y;Y@T=Ds4t(AFZ+Z4ETIs;yzL$+v2KB zA93;&cfy%|^<;hFdntT5t*%+E#Fr(x)6->_ER#*=ibZ>79jiqG4|jo=Bue{qevZ^> z1^z|QrW+Qpw5uqr`SAVHsw`co$aYXy=%UpPX zLw=Mc-;~^Ro|TQQpTbIsYgG-DhcP2c;YX!i#C7&~ul^zJbLr>QhNSxoe%aV(#n?7l z)Y3_dr_O@AJctaV>5hJ}DQdQMp-nNXZO>+aqePmuu;Zl+{AvtrnF$CKq%sl0{o%r5-5 znBjq11eOLriuZR}7Th_N{6l(G-_V7ebJ27qtfJM%KmFeAUp<29>@qt_XP= z@<}YOrk^R(nO76#~4UWKZY)-=Zq=b23A+&jlWq3m8-rQdg<}# z*s_T4D%_NkG_c65@x$Inr8eDc_`XlWmcLzLmFW34kwljXw`f zS(TjO@z$;S6p;1+uzCvLR(7Es>=M-xvBMl<{NOn?7GKpGY17$^d(lG^{KN<3biAzZ@-CJ!Ywt1iU;>=~Mk7tr`OVvE!ZG&)KAJzk9 z-&3Ap!J41EkM;(AfJ(P*cOVfqKr-!akXUtlDw%Umi*wv#y%_ zS1*I&Rc)>VCBDY2JX21x8-!=^9s$cgvoPJ`mYHoBJ!6DNXL{-!48-tTR5JbJRj(_E zw&dOs6r|pmh%YDp#Qm18G5@>neD$2nAl&L#6R0(n2?*9Z2U+O zsA>eH$&XN_fWu{JG^iLd!Mb9A2*F1sM-vtls!m%G!n(bR=)gzr2$9&ngGkrKpa8_S zyAeWV$m}Z74jo7cDNc|h+}7~~Z~qBNhkztdv15&>QYN4Qn0|r*i(PF*hXIZ{aJqY+ z=r%F@cV@iZN({`*{^3P2VIX&p2lW5iL-`l`b?9SIp)w)&Qc8gM0Gf0B-=YO7MEJKn z4aDrLq2|s2Q~TfGVTkB?akXo6Bb+^h2CjGW>HGtAycXTwnfu0uS;6+|Luwu3oDCN5 zS_g?U8@Xe?sy6sPp<$Y=;jX8+RC{(!=w#IEov@UaBl=~AM5cI7l~yIK&q>k2h%``v z!6ShECm@55CTV}4m3m@H89ptFp}dDC>fVB%Pl2+w2DKas&L;P9>TpsyBe~S$@5TL5lBg`K3pN{W;tR@7`_RyD z=bb7ZOP7~5Zjlo1V%&v#cwfI`%vAEScC<>7y!6X^LoT`b%wNFOR`3~`L*MIp;7ai)5fyE9+IpGn z=-6_S8m1DEQ|kqifPH|S2%e;f>7yAGG8EDXoed>GMTK9e;iK)tcu}ON0yACH%(_}= zLw!2^4K^@}iY4y|#LV~9xtU7br6Uh}_O`r@;EYbj?_lbgmU#kgg`7)pPF~bB{vLuhXMCD2A1)&=u=z(_wm4>dh9yMa2d7H%}IqwzVD=pL3;5|L$~FgKTA zD;Kp-nZt1dDq`6rxI0=7?tG?y?J*kb_AgR!c2ysOXxj9>ljT- zLAU3UC*kJiM6vxuf8UoGop>@NJ6bo3_?k9{P(AMjiNpS46y3JV=zi&Rdxu1l8bhGk z$!d$P&!=Crlut--OlijYzI_wuKB~V=xT6GnhI0<5r)%OecRd+4=?>8RXr3-ay?R2f z@v^fuvN?jC4MsY2Z5EwQMxDuhDc#yz+o^)3Q-hu#iOK0j#uO(I_%!^WQz$xP zEhqCtM1LcyeUQxt>--~}KNF1U8cYf=6*lLK*Y>^FlUIkO@CxlY-F&-vG`M&1^$MR< zXfo5LCd)lBUSyxY{Wgdo%F0Oo9*#7>gZndsr``lew?zUBRnj;d#+5`ct_?!UU0mc6 z?TB|ZAE_;lQb)=~AvA4NmssXFw?x&{koP=Ls6mgVESQz{(jNkpz_R^h3=A$mLt^87 zMLnZ2FJ$^*P=%~uAx!}=MArAjuAZM66g&1F{u2aX+%Cn3il2A3msQccPmSruzf&^n zlMwIj8SkBUeED(#!3kl=iWHR4sOhidih}2hNn;)ORs_Ea#j&y1E1!D>J8{cPfvF^X zic#qNSZ3I%K{k#$nm+i8J1TyEd?O@@@FAzqq~cmB zB`Rv4Pkpk!y5+W*_xkM!>1NKgbM#?dRy{BmtRJnjkOs$Hu=#^DEwDlF0xJmpXxM!0 zJ`s^Oze`-*k%8G@A`hiJ^e}|qTQCeZcDuMJeGO&#>OIEY=PHAJKMA-r&T(G_s9LnT zET?dAeZ%0F(`-0D2Iv08l)xf>8l3m|XdPi*yPpJ4TGBE)Px~=YdZQdsMr3|<`Z)B# z36u8F6O$t6ZpK9gEeY_0IHf4gLlEl>=Td;|nBzS>Vy^ens9(vJj0bJLm0`>7^riIH z>Ej5Qky^h#M96-rT+y<(UmJQRR%w44pafNnUqcTqk$-jMWs1fi|4^{#tWs*jr(GXsmyb`8`tQW;GdbcgL&vdR zE)xX8j!t84+xldlh0!g%JW88|p(!e&aE>RwXvd$DB-1&aV*t)Il$Dp(p3wIcj6yostbIpMW+Ng#d@EM&3px2Z#eH2YU<1GR7=n`Q=y#8*`{OXf zzn5BhHrO{Z^&KdW^iE@t?1qDdol0<`Q&5v6ap+RST+>2eGB7@O4ut;tm!oLJA*PxD zraQ)aCx%B$h8CW0l|lrPT(IlmLTX>+YC;p9;-^ff?eY?58bk&(>%t?gBFlL{=HwoF z12YuGjtEMeuFa*Te!ST;1&w>MDNF0#hZuavv-!DPq=pQ#TG8&wc``Bv?%KiXR(%PKpWu3?s{~P@GKw=bUCadg|`nbsS~4t_i~5tys4{?_$8|O73FA0pip#%J@;FY zlpTD%klQ(2^emzTUa^VLR2Jxdt8DDs9T6{FnV|Si&XWOvFbR8O^D^-xw}6P*MKY$( zIg5FaPv8xlX~41eHJC~Q(ue^69S3YC0Kmlg)64MJ%paKL2+K|l{3F%-ivSDwr?-O= z24L^cufNj=Un!##L7)x@>$l$TFYpEkHgkq$O<((togUhT zlMeXt?*h&LHR=CtpY{8;5Fd&EZsvdia{Z~sL+UeTr>vl5_f@`&b<@5!4IV6*5UAvy zy~gyG!*Uhg`RGavTsS3L#*f=rBcRO}P_ga@W4^Lb-URX8K6Y5AG+5p5{olX$4=(ef zwbmdmE1hzpjZ}=2l=HL4F0pD^mU$X%*y#E0;qlY0RaG0m#;SFi2k%4R<>7jb8tQ{< zxC8mq<@OEeCICLjsPD%>&1M6CV2|I^+0^RP(dLxPjEfZ)hz=MvhL-uvF%DAHCdqm*VlA>p0*^hj0a&I> z(08_pq?5eO&&cQW6%{Z=x9r$pc$52GHc?~}9)}kXTGqJ$lwsct0V;v8|Bknh zO>@wzLE2=w^6rr$XO&#Uiz3yQX}w7E+FS1tb2*nU-(|@+-CE2!eI-YCmf+GS4UggS{`&Q(39l~{7r&&O+4hQ>V~nao|dayX^%s5!^I;iJr48sfQ#yY2$7w$yq5% zqH7Yx>jVj!g38e276*q>H_k48a_lroaeZJJh@`4OrGNE}e4NG))!w9HLtfz}vKoZp;YFcJv74s4Zr3sg3v8qi?0E*$sR z3}qwykmp~dx16&q!h$1)xR*Lt(I!1vn1Gi^V(_GPR|U4<6B(&%TPvyp_L#OBwi z&4|_=xH@GrxZs}J#`y%LGW@P$nY60l`iBRzYOAmVh~LLZCNE8WW6NzJKS}}d6-Zm0 zg9w41C@i6b_hF5(D+rkpU)$7t^`ug>N%~FMIqOfoR$xYf7d;y6yoRM%Gr~CchKD0! z-x|RE{Pl-St(7yUbQc45JX*nVN;FtWXoMRDoeobQD}77 z7~!@domD2_SqGw=BKSnMk%SyopMz$mq>8VnHDE}pO*9Cw`m|j=u3Hfp_1U*LMRsrd zo8Vs$)s}sIG<@e`4bBRp z{rrVfZhx29joU#y^5)l0gUwaV#f?P*s%{e}t2OzBE(7&N);OgF72_%PM2oVgeekeG z++coB?kF=oA^6&g%3p*5hN{ z=H`zTIVpW74pHf(mu3Rm1bMHbY0z-@(78zi;K zi<%lNhIm?@NzTB(_d!KY_rSEKdICA#yvbM!t$y)Fqrkt`bhV&{Avc{ZB_$3T)6Eu8 ze1G=%V!T45P#uM@7`k}Z;dU~VmG%0&s%O000#LS6e**zzqLe$^hPyfrbN9 zAp)wv8|VN8@ZwK2dPoH0O)uHf2CE=JUSbLWV1bj6058CG002(g1`=Qg2E2p-Pz1A~ z15m(|k7(F`-h>q$5Dp$i1aM&ehoT$E^;;7Gkybwo?fx2qx%k2C7yzN?01OVm0Q|or z@ZThGf746+;o!lSRj7nmlt8XObP9)p6EEb!A5SM3AjG|FZU&-NSH%Q41FYJ*F#%Z! zu$4y{NWYIZvjmnJAM%`k94y2U7E*Q){2$=Qp9W2cQQRN+0fcPgclqHjex48$ImlV6 zg0+bNs*tKeIT1h;LZUotN&vvDFj(9+Dq?^)4&(}i#E}DUvH{w`eYg-6BjynagfD@x zH*%Su0l4X$r9xmM4uA?+!yX+wD;`b=e8T}y2E!8pejC^cf)h9aYFPgvk_U39H+^RT z3t$3%b2vbV(;EvHfCXZ4`~UEF`8SIL5ud;TpMCIt>kPpp!hk>Z4DcZrzzq=CX2=a# zg@esWS6lpjf?z*Ez;6tPh5OG_L!_so5Cc{Se8s}~hn615`>dsB zC;BIR{o~k137!)I5QCliAd(|UyDk`65@3q`e1L!bQ-K(fL5vQ-m68BV$oJ=8@_9nA zogg|ocq#`S`TwS%hsf zmRr5wfGmd>CpK-)5i2O6A-E?nd;QTZxTHK$(=9l4LZk;ajQjGz;qm9y`raz&fyIjR z5@w#lZ2gU|H|Q#qzvsi=P1|{cORy!jEA-E!#k}R{s}HX}boFFOPrqSC=Z|Nq&Vp20iMg(a}B1YXp_P`6z4E@ts|JD)o)Y5x+m~zrmCLIO$<1=G=Mo2n{Pf zInIySs?U9iz_w-)^KQNC$j@Xty2I~_+o}LDr~}{P^PmUn8R(*l*tf(xZ~|2CKJqhj zv^F@fe~bLUh)B$vPE~9X#yM!)R`-WVOI0Le?YFsLg7Fy1*IEHdx~>N7yI#UA1w0Y( z@HtYW_9b4!jsu!)r_o!n286`|Zf|Epb!;8z5#CTI6Bz#>#6|eb!95d5hRvXvqU)R0 ztREunuv>Zhc`t56$x}{VWT+N&9k2;E#6YcE1_yZEqLJPX|3l_6B=~g)n%`S{{F}f| zW?|8QjrvsQzPp9@2_)AGy-In_XZ~5U{U6iN*d>?{Rp0rXouZkijMI{@00b^g1Xx%I zB;vu9MvES5BM;DqH}I{%GNwn3SzJZy{{5pTrxKYr*M-#zi5xf5)tdDnURn7Z@^+1! z(U^YPG@3d2ULyIfe!4Yl`FJBewDzvudjQ7tPLGM!W;<=U7qg?zi6OrpBQ3ev?fDy3 z1ZJz)jiH}6vGR&7g|ZsCDrN|SB=Uqr=?&&x)d-SNRl0%KD5{KmMLFhLZya=4s!Z0k zL-?KMd6YV>{KtyCluFt`y<2)*a!}!eCMppQ+497&Ix2j;8jPqf<-LyQaAq$aB^5J= ze6%&aa8c+z0J-DcP;mE^4*b#$9VPI^sCq21?7X<4pKefiTH=`F%CZr-Vy}G91xUAc z2mu6(N`>$M@GWI6&F;I+teOQB&4(%E-pqrLQN(Vx86yo6W&3H6Z3hhV3pCbQuYlE3c$JbJaVfsu6uuFhw?8qCy_aLAIwRo3DY;x8D96J!(IEZk}cr z#gJw^SzagSyNGhGJomj%kP3ISPbmuS=hFxYO2OByquckMa9fwAZDX)fC`3kGoGyYF zuh-j2ZWc;NM?qS8W_v!rMl!vLJ{B6wd(lG`wL|?h>x?|hn9x{HOwz_TF?4STDEypt zKob(Ex?owOR?@UfGkvs(%2`ZQufd^g+ZI`?wEv)b#lo4PaB02az zLK#yz%aOow1}hvaHMeAjzb9JY&EDUXe7N=l!Hyi$ot>)7dMos}8zaC~nb{WYd|lnC z?e$tG{ab2KCd3nR0`YzjqXvr+P?jeHj4Kqc%!NXlhE4={yYM9*o5$TUJ2Ttr-8Tog zaULe!wtFcWHKtt&Q!lK@p(Yq*M)n;o1CyXslTIUA^AoZ@IPKDfWR?U-7)pw9kv!n& z9ks2M3N;nS)JO@f+PRieCgO2vTaGDd>e__B&me<7BoxXC@8EP;@-3dK-7$aQFL0(j z2q}EOji;z#hE|5wCl? zRk+%YCT0!Yxm#L~B#}7hSo8W=3G_Z5qLk2(g2vzsu$v59mI~e1SJG)YInBNX^z~*^ zPv{qKa|2l<$@<`~W^;0&^5HRXnsWN_f!56yxXup`r&J)^eEcQp<#=RFKz6L=)8qq2 zpJ0Oq@}-ANkb=+L0qkHF9RON-!h{G|Uk5-4e%T8{2DuEDD2Aql0rK&K z-F9K*!6~``d@!~r0Q0tl0!A{6?esA#5 z;$Itt0rK;Jo7@4E0Dj2F!2xr6Kp?NS62J(YW(Cm+ojxBEKUhK;fKSB#8+rdeCH~)V z@?YB%Xj8EU^q_#bv>^$Lwi}=hyl4sG8X@-vBfI^%A2bkRxlaZ;w&yc}+*0uOEy0}b z0J1+P=kE^LyfGat!tV{FLn|wRM?3&ZU^__wYI>crD7c#s8VPLe36T81K&HLvw$tU0WSfc+unKuUc-PavScl(@^gtagA<|S%*H26 z4g)^K4}Z_`*k;7!)hg9Trvj%T6M#&Ni+=jko6&9QQAb*EPoyWjQXWWM_;vD=Lu9$1 zmUD(TVi`fMBRa8M64oKT<}FA=v{i`1u>xg6YoCMFaxuItg@ekv5lAOCL-`9&1WY&?dfZ95F116mYUY8>i{IMJ@D zRSM@mPp+x7UK{HS+Ckx7y|4&}t=3K? z;+Yu(SxGjKuvnqQhvWki^SE>|*ER@B*r9 z!{LD{kl_gXm>|xOW0siQlnTdH%J9g#%-J^dG2v=34JrZxI6IkhJJbJ==_>P7Du#A- zk)sJ3(I(zX;x_0}XL1~sZ;#LP#2eZY?$t$t66Fs#zBmGN)Ii;CSWCG4I_XmD=?JDm zx#=AAEmoY(h;Cg|xKkf7_8GL)v$MFYO2Vq4v`kh4fJ#I=(wEt9tg|%1B*OknDlI;}E6yF=dm_KmO#Yr)$YJ zt(f_qvY$ZG>)c38b?V|)`qM*o@I!xW?*UJ@XKB!2DO*RBvbb*XYk~qsn02?SG=+h5 z8BqUEE%q(H>o5X1A>UfVUrr{xE_69eCb!h>>rZ2e*Ng4y_&#OnwNlU(MmEUo34J=) z>F9NYrh;a@Tdse(9h!Jw;!YmU={u4%V^cP~PoO z?G6Owk5NKo@0eZ;eGYRo`r;88g&x`>ZJ#50lKVMbEInZAN4QWW{VZu!4h=Z6?*Zh_ z{AyN<@m;6;(z}!z_04JpIFYE~T#E5DXmv4OAC>5wjJd+-elwC5i!qC72?on8foLB2Q%urR%V>vq}9eFI$wEP(=UP89s9Ht zc9y>o@#F}yg-zilGvvnfr9xx0F_eNd0;%3WQ|i3G%Q7BV(I^ZF=6hSSxad)W^ieo4 z5U#-DJ*IxQTPy8(juOACoBzQb*I8>Q0y8NK-fn+SAOe~XW5$nuGSaXa_U>dF-=-d^ z>%EtpQ$->}YE6bpSD89*dU{iWuwg>p=q+F@U3%SzUfH^q?z>nr<&H=haj|59wxqFy zn_NLg-(kc?f?jg73<}9t%cmF+_rbJ7l@?*m6rv*82Dd!UxRLEw>h;9CioIzjLcfFx zZTdEn;dFlFtrRC8n!zX;xd4FG(IZ-zZb)_N#s1K9`DOdyvN4#Wwm>*Nyc}cY}77> zr4yhw^+H9{*hs`juqa2KK=IgXpE4;&>cj!w;gB*67_KM5t=T7vtdwE0hOAlTm5>}!4d>EU>us|Bx7d0}PViIZF ztlEgMG9(-+Tbm^%8f@;bc!7x<0ar`pMpXFGqXQwVpY)jCOYSTb!3wyyct!15bhmNHqg4qYC9I_&a_W7vM|>5`>#=Dp(#NH4<`-<60w%_ z&S_3;CpYF;p|rU4UpMP;;;|W2`ri4|Yw?I7N@h()-ySE}fJ7fIznw%cYS<)T zRpHLCH*m`eHtE>NGD-?gu)kU!dEA+bzXLb?aueO2+z-oF2bjWyN7zbM zPqFrGZ_TT4B3hxc)Cb3pABqrV6Es5YwfQG3+(fZH?dy8+ut|BWe`>58dzELm995!C zRyg6WU!RiBejQ)AQEOAOKD7(FBRC&;d$i*2c7rRF@KuJAXBN?AVv|osccJF=+bEZ- zuz8w%HB5A{D!X(KBCEEy5%GK`a`DmNj2*V0^be?ehq5dm%(=7qhhr(}Bnf3bTn4kRnPG z=#QMF#p;KrCT8GaCY~;T!&3HDR{ZfAQ|3cn5EKAO<%Z>*UY4;1_L{4}4k=LYR+%GYkR zhKP&bWtR@_TaySpxqy~GA?9TGe-C?mv~PEsKIr-`n!)G54V$UUaw!aDb`mv+SMAx{<_hZzy z&0Bc`*4-%iquEI$p4*Lfp$t}-7<_0XYYbBm^kMrc*OD@TD-2PVVbCu8tY0vQ&;%$B z+{@`_@Q}O2>rFq~Jx+O1Z(h^LP{FJI36dJng&ObvV5boP z7ayLtU{t_N=9&iTM{D7wA``2oR-^zYg z|Kbxt^eAdROb92342a$hYs%)jvrL3~xZ(uGjdOFv(OiNMRq3fzHJ}6y#-m|r2iR;c z5CW|(qH$4NVF_hOTt}b@j$+mXYcShiOK(BXR;u8V2yDQou4EsamW0~D7q`st7O%b{ zp3RSX-2*Fo)4~iR8m&uZ8Uo*2ivip(A>m13TR&xTe6rW!!yAO-j`rPti=nlmo`j`t zVY1aJj@b(m5!m<`fOjzM>Q1zVoIs%P7762iewAcjszEIgUvI*)9WLKPL(tzbp{=Bwy;V; zcDh_B-XkBJ*N12!3CF$bbD09?_Y!^Ix-TNBZ6B<#M>^_bh)T~luP=~Kt+7}b3thY6H)lTyTvr(28w*`7 zVWRV~2SukB=H}4s0Y5uJ%e}<@ySeA7!17Dis;R zNV^)ceCP^YD?6<&?JgXg$VhX)BHYXP7LW5e5fqToTW>pVWoJ=csk)l$jpl}sm{VvO zx;-q^q)rBxgjHOz6t&IDdA9HSURaq?$0Htsl9Why#oDGaKEU*LuI}}m(>4acO)`u* zl+F|GrF3#h=V(FeI{LjIKmH97E}4n1hS2xxeWf-BN9Y&Tv}B&gJW!%4=X>C%7uLKVRV zl&7b7B&nA)k6%L7_Xu`-U01J*m-|9zdiU1cSGxh4Sw+K~$FVQG$HuP}c}8#3vWa+6 zD=3sAs+Wtl6$`buz#i(G?+XR9m#s7`)IKu4Mov2Ool8yFr6HQd8F$iph1lqsjfnvt zs=G`hKBI4@#vit9M4SvVV2`SIU1htDf{G)SYQk<8QK6IUO*m{yp!e<#Sb3@WR=4;E zJ{#43O=>}sn_sc|xJde4;zvccw|QkseBaW}($6Sbt@!i!!3QMf{0LI<2|x;*xp3*J ziORWpshx)|Z(_aQ$d)QiJK~uR>P_0!fPeLQL$-$5Iw>jzZe1X;E=<8yVzJDu9>^t^ zJhSV?mFwH6Nza}G^6J%|ZnV9SQnkc%i?4%ou4P~R0f9wF!{Hj)2>8hw)s4t|5~B~X zIQt|V)x5Otp!Z=vK-^@gqNpUd$-kfT#6M=;uLs{BAV$up3PYEiD^paoR22ZiF^7J9 zM5d5s0Octri=gB zg;HJjrL!~973Y*H&N+xdN&q1HqVzjdb)upDjsxNXC4&Bds3;rMY?o&aPJ{%jK)*L) zb>kpo9kH*3-A!oFYBv==f0Aj-f_wKxA66;NbWCayXnI1tnLW3@|A;>63=c&1a}xu- zAy9lrKz;6%?d|Ib)ryB2-HVbJD=z0r#wM(R z*mkx_3s7Ce!%!_~QhDEVW;nK&y;lb*iNlnCsSQ3Cba!!acv+^-Jxa!Eg2mDpp8yc_47q>lBY-Rt_}8yO1dD_go^QB z_opzVV-_ODrgu@Hr<)G0dwSPV`@CyKcSs|*(~pN6U*A@?lLw|UrVrFK^6=EFAHx9c zD`#=!&(rWa7b6EIq}rA5v4Kx-`lk|moBA*G{>K{q@96!x34!i^!0rOS ztG1NDe>EWh1v$YrNdPjmzuLV4!I$h1V+DvG9+)c`pbqv6gOFn;FJa-IasG5NKm)v5 zi;MmHxB+W z(r4qi|DWXHuY}v*6M?_7Z+|@C|CJ*A-3a<`X~lmf4=mv2VhHnS?2Z5f8R_=h#|+Gy z2~h{&fWtEZXO!}RLu;8pLoW`5h2ng#HI22m1K z(&I2slpXnA&Ce*bL@T^(=X{@7NP5Vn*qVZ5v&wfLc!dG2p=+nLtVO5~Wlp6$9xy&z zSjbNBp1r4)fmAi`e1#h;r@5s9*$(D_w=rGu$3?{g7z#fH*_OLJL&LenUt&UCygIAbl7br%X{Ux2uBV#0E6^^C03I|3 z;A>TtGpm(Uc$d#`-B^5MYraSNA>1ZAp0!}UZ@li?a$U2G^48?5a!&mw#lZXusEl^6 zSu4z=5u{kpPfkiP*P={WU3{2)ILGqPUW~CtGDWc{}9> z@Jn-W3SObM@560BOSE9NKyO}+z(zw6z{AnhiDtwxb>84pZIqZ>YDySDML zn3Z!y%Wj=p%Xvp6TXl$bWq}B{?cPK!sraLjl4S!jZ;SO_5!|i}aM+S!8P5pMW(z0N zhoB$Z9GZ_RHN0v;3Xjk#acdGi*aC*n0kwJF8^K7aN%5$7jdYqRT(b$FAbcf_6wJAb z+}zSn>Y%vaWmbCe>BS05RZHa+QUkfV1NqTD)=9m}{v*z`Mel${k|hWeEn)@gM9c26 zLB)KhL&g)%7qgk}aXP{52myrV5RDKegabiX{;SEaSq8w)BBms*#lK|{8M!|lS%p3z^|v||GI1-H&9@73>k;jD z3?)j{>GUU>;ksMV`~>-xc{!C@vEzO*Ps(buhLgT)UH(E^=g!Jzk#3gfI~vZzzS3J$ zs*>ZtEq=yTnW0D*)Eak(6SZ~GY!nZ=H0a|BWj&X$KF4fH11^w>orEK8iIDn7bDG;E zOniB&K0IAJA-^OWPiX(h(~PMI)}Gj6D{9XY9oK!KWBL#Z_YiqM=Cp`po%iuArM)n3 zw?3dCJ7ey#GV>w;te~J7#Z8DNq^Xv23D5wQ@UIbb#xuq7jIb9{V6;>B-4Eq|NmBE{ z;%uFt3=ymfsGflQO=h@8y#mjMW$yX{10lNG-UHu2RuR%CD)%2KwbajH!eT>keER0Zage?6?e^fvZ2@N9Na;eAol+qhEg9-{ypa zk)cnU*hQ!~iXaoXEWw5!w-M(bqS%-sBg>-Ac;onTjUtO zGZc8w(+f>1`6_gzMlx-8SBizQitGhD9uiRk$bL{(J86wt3o7v&769ess#OpgLIBo> zd1Z%%4cPF!?jEAnANqhHIzV5_xqPJJYOKEG84N_dFT+2APGO6`T_Isc9O1Bkgh=3lIYe^F>!zs3(`pA1g}wZp|9%Q|cbymXH|M3(sfM7)th3y3{yQWQVs8`|4PJ z*Cgz61~s?d{on}e&0Ukks?UI}a+OW;dEaN-n5Gc- z%3QP?R+ufEOC4aw^b3QaS|sw;??~_A6?6mMU1bYswD|i9XQ6$PG(iknfzz-(F>^9} z$rw|@$N7>hH*2hk-NR}WDo+0B#k&d?&c=1lp_ddBmAeuYd2@ArJ7U6k+k?;ttXCmV zFuvb8011U)z!F4@6Vuszv}q-IDfmb68|$k^ZiTh4(?0`JgeMA!TCi1 z#XoZSzeGzu&Ob)0IRB}5f4;z93=nyCUloExo9JSQKI&@`Bv|r+n~MRAkeK=0^!|UG zdGI%$?CC2xj zek$^MTR8ttcB=^r$Bcw@xy2>6nWLLQkypJu8ZGstp_HP%g>9>Y>z4ULh#0gHsBpMI zZU0)DF~9%>+ep;Al1w%!dJQzPG z*IG(vD;2FMe<^!g`lpfN9=^E$;H-ORB$HxVlA??zbV;qS5&gk~WckYclgHsh$bv*q zM2bB-{lft~s-M;Dk+=(nii{L2=m)rCQ<`u)Z21IQw%=W&Z`&+>hNbOXib(>QRlpK# z#GM(t?U+=zoDYZD@OCbEmtF;>vlmGw4pzUs=3Q(pxxfv1Jko%?&LP=cLobv~_m(d- zytK^xb^;SF)DOE+b3!%T(19aoxgUp#<#elld5|`dC$uti@zwBi}-~}#rV1C zkg&7INqItH-t*L%mYNO253wn+uLcU5zqN=jjJMuWtR31X*ENZ@XS2I)FNDq9&6q8UkOK)X`hmr%lgS8c# z7J9XAWj_;DZm7bA6-Z5nOcnntnt8;okm`f)>j#07H`|}Qy_TR+CkNd>P`OU39lvJH zg{v;pPcf=j71Y2I8-)KR%L%vB7mX>wEr=3J?pa!c{c(gnetOM$qNJ-gH#(}8&vG77 z1{p;f!6a@zZyX1Yr1V{AP|`J-q@>5oZm|r*(o^yMSpX+*$uS5qC+D!HM{v|60`+B> z)4mX

-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 delta 297515 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

V(QUc>7=ffK+T};)v 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°_51trK#o%0ZYlTb@( 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 -- 2.47.2