diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataBranch.java b/core/src/main/java/info/openrocket/core/componentanalysis/CADataBranch.java similarity index 98% rename from swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataBranch.java rename to core/src/main/java/info/openrocket/core/componentanalysis/CADataBranch.java index 2ad1ba427..4cddcedf5 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataBranch.java +++ b/core/src/main/java/info/openrocket/core/componentanalysis/CADataBranch.java @@ -1,4 +1,4 @@ -package info.openrocket.swing.gui.dialogs.componentanalysis; +package info.openrocket.core.componentanalysis; import info.openrocket.core.rocketcomponent.RocketComponent; import info.openrocket.core.simulation.DataBranch; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataType.java b/core/src/main/java/info/openrocket/core/componentanalysis/CADataType.java similarity index 98% rename from swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataType.java rename to core/src/main/java/info/openrocket/core/componentanalysis/CADataType.java index 1ee27fe00..c18005a17 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataType.java +++ b/core/src/main/java/info/openrocket/core/componentanalysis/CADataType.java @@ -1,4 +1,4 @@ -package info.openrocket.swing.gui.dialogs.componentanalysis; +package info.openrocket.core.componentanalysis; import info.openrocket.core.l10n.Translator; import info.openrocket.core.rocketcomponent.FinSet; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataTypeGroup.java b/core/src/main/java/info/openrocket/core/componentanalysis/CADataTypeGroup.java similarity index 95% rename from swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataTypeGroup.java rename to core/src/main/java/info/openrocket/core/componentanalysis/CADataTypeGroup.java index 0f9ad07da..d8b3b1057 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADataTypeGroup.java +++ b/core/src/main/java/info/openrocket/core/componentanalysis/CADataTypeGroup.java @@ -1,4 +1,4 @@ -package info.openrocket.swing.gui.dialogs.componentanalysis; +package info.openrocket.core.componentanalysis; import info.openrocket.core.l10n.Translator; import info.openrocket.core.startup.Application; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADomainDataType.java b/core/src/main/java/info/openrocket/core/componentanalysis/CADomainDataType.java similarity index 97% rename from swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADomainDataType.java rename to core/src/main/java/info/openrocket/core/componentanalysis/CADomainDataType.java index 1ff9d4e80..496858aae 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CADomainDataType.java +++ b/core/src/main/java/info/openrocket/core/componentanalysis/CADomainDataType.java @@ -1,4 +1,4 @@ -package info.openrocket.swing.gui.dialogs.componentanalysis; +package info.openrocket.core.componentanalysis; import info.openrocket.core.l10n.Translator; import info.openrocket.core.startup.Application; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAParameterSweep.java b/core/src/main/java/info/openrocket/core/componentanalysis/CAParameterSweep.java similarity index 99% rename from swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAParameterSweep.java rename to core/src/main/java/info/openrocket/core/componentanalysis/CAParameterSweep.java index 6e7077dee..24ed95f18 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAParameterSweep.java +++ b/core/src/main/java/info/openrocket/core/componentanalysis/CAParameterSweep.java @@ -1,4 +1,4 @@ -package info.openrocket.swing.gui.dialogs.componentanalysis; +package info.openrocket.core.componentanalysis; import info.openrocket.core.aerodynamics.AerodynamicCalculator; import info.openrocket.core.aerodynamics.AerodynamicForces; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAParameters.java b/core/src/main/java/info/openrocket/core/componentanalysis/CAParameters.java similarity index 61% rename from swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAParameters.java rename to core/src/main/java/info/openrocket/core/componentanalysis/CAParameters.java index 3439a483b..5fb0b0886 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAParameters.java +++ b/core/src/main/java/info/openrocket/core/componentanalysis/CAParameters.java @@ -1,16 +1,18 @@ -package info.openrocket.swing.gui.dialogs.componentanalysis; +package info.openrocket.core.componentanalysis; import info.openrocket.core.rocketcomponent.FlightConfiguration; import info.openrocket.core.rocketcomponent.Rocket; import info.openrocket.core.startup.Application; import info.openrocket.core.util.Mutable; -import info.openrocket.swing.gui.scalefigure.RocketPanel; + +import java.util.ArrayList; +import java.util.List; public class CAParameters implements Cloneable { private final Mutable mutable = new Mutable(); private final Rocket rocket; - private final RocketPanel rocketPanel; + private final List listeners = new ArrayList<>(); private double theta; private final double initialTheta; @@ -18,17 +20,24 @@ public class CAParameters implements Cloneable { private double mach; private double rollRate; - public CAParameters(Rocket rocket, RocketPanel rocketPanel) { + public CAParameters(Rocket rocket, double initialTheta) { this.rocket = rocket; - this.rocketPanel = rocketPanel; - setTheta(rocketPanel.getFigure().getRotation()); + setTheta(initialTheta); this.initialTheta = this.theta; setAOA(0); setMach(Application.getPreferences().getDefaultMach()); setRollRate(0); } + public void addListener(CAParametersListener listener) { + listeners.add(listener); + } + + public void removeListener(CAParametersListener listener) { + listeners.remove(listener); + } + public double getTheta() { return theta; } @@ -36,7 +45,9 @@ public class CAParameters implements Cloneable { public void setTheta(double theta) { mutable.check(); this.theta = theta; - this.rocketPanel.setCPTheta(theta); + for (CAParametersListener listener : listeners) { + listener.onThetaChanged(theta); + } } public double getInitialTheta() { @@ -50,7 +61,9 @@ public class CAParameters implements Cloneable { public void setAOA(double aoa) { mutable.check(); this.aoa = aoa; - this.rocketPanel.setCPAOA(aoa); + for (CAParametersListener listener : listeners) { + listener.onAOAChanged(aoa); + } } public double getMach() { @@ -60,7 +73,9 @@ public class CAParameters implements Cloneable { public void setMach(double mach) { mutable.check(); this.mach = mach; - this.rocketPanel.setCPMach(mach); + for (CAParametersListener listener : listeners) { + listener.onMachChanged(mach); + } } public double getRollRate() { @@ -70,7 +85,9 @@ public class CAParameters implements Cloneable { public void setRollRate(double rollRate) { mutable.check(); this.rollRate = rollRate; - this.rocketPanel.setCPRoll(rollRate); + for (CAParametersListener listener : listeners) { + listener.onRollRateChanged(rollRate); + } } public FlightConfiguration getSelectedConfiguration() { @@ -93,4 +110,11 @@ public class CAParameters implements Cloneable { throw new RuntimeException(e); } } + + public interface CAParametersListener { + void onThetaChanged(double theta); + void onAOAChanged(double aoa); + void onMachChanged(double mach); + void onRollRateChanged(double rollRate); + } } diff --git a/core/src/main/java/module-info.java b/core/src/main/java/module-info.java index b74348f80..361700d8e 100644 --- a/core/src/main/java/module-info.java +++ b/core/src/main/java/module-info.java @@ -34,6 +34,7 @@ open module info.openrocket.core { exports info.openrocket.core.appearance.defaults; exports info.openrocket.core.arch; exports info.openrocket.core.communication; + exports info.openrocket.core.componentanalysis; exports info.openrocket.core.database; exports info.openrocket.core.database.motor; exports info.openrocket.core.document; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAExportPanel.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAExportPanel.java index f326e1b67..751a335d4 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAExportPanel.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAExportPanel.java @@ -1,5 +1,6 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; +import info.openrocket.core.componentanalysis.CADataType; import info.openrocket.core.l10n.Translator; import info.openrocket.core.rocketcomponent.RocketComponent; import info.openrocket.core.startup.Application; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlot.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlot.java index 28a36f671..bf6b2a4f5 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlot.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlot.java @@ -1,5 +1,7 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; +import info.openrocket.core.componentanalysis.CADataBranch; +import info.openrocket.core.componentanalysis.CADataType; import info.openrocket.core.unit.Unit; import info.openrocket.swing.gui.plot.Plot; import org.jfree.data.xy.XYSeries; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotConfiguration.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotConfiguration.java index 45ff51245..122c883e9 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotConfiguration.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotConfiguration.java @@ -1,5 +1,8 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; +import info.openrocket.core.componentanalysis.CADataBranch; +import info.openrocket.core.componentanalysis.CADataType; +import info.openrocket.core.componentanalysis.CADomainDataType; import info.openrocket.core.l10n.Translator; import info.openrocket.core.rocketcomponent.RocketComponent; import info.openrocket.core.startup.Application; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotDialog.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotDialog.java index 2ffaca89b..9e146f1a0 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotDialog.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotDialog.java @@ -1,5 +1,7 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; +import info.openrocket.core.componentanalysis.CADataBranch; +import info.openrocket.core.componentanalysis.CADataType; import info.openrocket.core.preferences.ApplicationPreferences; import info.openrocket.core.startup.Application; import info.openrocket.swing.gui.plot.PlotDialog; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotPanel.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotPanel.java index 327eea73d..40652475a 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotPanel.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotPanel.java @@ -1,5 +1,9 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; +import info.openrocket.core.componentanalysis.CADataBranch; +import info.openrocket.core.componentanalysis.CADataType; +import info.openrocket.core.componentanalysis.CADataTypeGroup; +import info.openrocket.core.componentanalysis.CADomainDataType; import info.openrocket.core.rocketcomponent.RocketComponent; import info.openrocket.core.unit.Unit; import info.openrocket.swing.gui.plot.PlotPanel; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotTypeSelector.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotTypeSelector.java index 4da5ce513..d88bf8c95 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotTypeSelector.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/CAPlotTypeSelector.java @@ -1,5 +1,7 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; +import info.openrocket.core.componentanalysis.CADataType; +import info.openrocket.core.componentanalysis.CADataTypeGroup; import info.openrocket.core.rocketcomponent.RocketComponent; import info.openrocket.core.unit.Unit; import info.openrocket.swing.gui.plot.PlotTypeSelector; diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisGeneralPanel.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisGeneralPanel.java index e254a51da..0049ecc32 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisGeneralPanel.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisGeneralPanel.java @@ -3,6 +3,7 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; import info.openrocket.core.aerodynamics.AerodynamicCalculator; import info.openrocket.core.aerodynamics.AerodynamicForces; import info.openrocket.core.aerodynamics.FlightConditions; +import info.openrocket.core.componentanalysis.CAParameters; import info.openrocket.core.l10n.Translator; import info.openrocket.core.logging.WarningSet; import info.openrocket.core.masscalc.CMAnalysisEntry; @@ -103,7 +104,8 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange this.conditions = new FlightConditions(rocket.getSelectedConfiguration()); // Create CAParameters - this.parameters = new CAParameters(rocket, rocketPanel); + this.parameters = new CAParameters(rocket, rocketPanel.getFigure().getRotation()); + this.parameters.addListener(rocketPanel); this.aoa = new DoubleModel(parameters, "AOA", UnitGroup.UNITS_ANGLE, 0, Math.PI); this.mach = new DoubleModel(parameters, "Mach", UnitGroup.UNITS_COEFFICIENT, 0); diff --git a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisPlotExportPanel.java b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisPlotExportPanel.java index 2741506db..d254cdb7a 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisPlotExportPanel.java +++ b/swing/src/main/java/info/openrocket/swing/gui/dialogs/componentanalysis/ComponentAnalysisPlotExportPanel.java @@ -1,6 +1,11 @@ package info.openrocket.swing.gui.dialogs.componentanalysis; import info.openrocket.core.aerodynamics.AerodynamicCalculator; +import info.openrocket.core.componentanalysis.CADataBranch; +import info.openrocket.core.componentanalysis.CADataType; +import info.openrocket.core.componentanalysis.CADomainDataType; +import info.openrocket.core.componentanalysis.CAParameterSweep; +import info.openrocket.core.componentanalysis.CAParameters; import info.openrocket.core.l10n.Translator; import info.openrocket.core.rocketcomponent.Rocket; import info.openrocket.core.rocketcomponent.RocketComponent; diff --git a/swing/src/main/java/info/openrocket/swing/gui/scalefigure/RocketPanel.java b/swing/src/main/java/info/openrocket/swing/gui/scalefigure/RocketPanel.java index 7f8b42811..92a2f49db 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/scalefigure/RocketPanel.java +++ b/swing/src/main/java/info/openrocket/swing/gui/scalefigure/RocketPanel.java @@ -76,6 +76,7 @@ import info.openrocket.core.util.ModID; import info.openrocket.core.util.StateChangeListener; import info.openrocket.swing.gui.components.StyledLabel; +import info.openrocket.core.componentanalysis.CAParameters; import net.miginfocom.swing.MigLayout; import info.openrocket.swing.gui.adaptors.DoubleModel; import info.openrocket.swing.gui.components.BasicSlider; @@ -104,7 +105,7 @@ import org.slf4j.LoggerFactory; * @author Bill Kuker */ @SuppressWarnings("serial") -public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource { +public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource, CAParameters.CAParametersListener { private static final Translator trans = Application.getTranslator(); private static final Logger log = LoggerFactory.getLogger(RocketPanel.class); @@ -1171,6 +1172,26 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figure3d.setSelection(components); } + @Override + public void onThetaChanged(double theta) { + setCPTheta(theta); + } + + @Override + public void onAOAChanged(double aoa) { + setCPAOA(aoa); + } + + @Override + public void onMachChanged(double mach) { + setCPMach(mach); + } + + @Override + public void onRollRateChanged(double rollRate) { + setCPRoll(rollRate); + } + private static class ViewTypeComboBoxModel extends DefaultComboBoxModel { public ViewTypeComboBoxModel(VIEW_TYPE[] items, VIEW_TYPE initialItem) { super(items); diff --git a/swing/src/main/java/info/openrocket/swing/gui/util/SwingPreferences.java b/swing/src/main/java/info/openrocket/swing/gui/util/SwingPreferences.java index 124b135e6..0d404be9a 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/util/SwingPreferences.java +++ b/swing/src/main/java/info/openrocket/swing/gui/util/SwingPreferences.java @@ -24,7 +24,7 @@ import java.util.prefs.Preferences; import info.openrocket.core.database.Databases; import info.openrocket.core.preferences.ApplicationPreferences; import info.openrocket.core.rocketcomponent.NoseCone; -import info.openrocket.swing.gui.dialogs.componentanalysis.CADataType; +import info.openrocket.core.componentanalysis.CADataType; import info.openrocket.swing.gui.theme.UITheme; import org.slf4j.Logger; import org.slf4j.LoggerFactory;