Fix the motor cg computation. Partial fix to barrowman aero.
This commit is contained in:
parent
4c00a20653
commit
f8cfebe5f5
@ -192,27 +192,27 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
||||
// With the implementation of ParallelStages and Pods, this is no longer true. -Daniel Williams
|
||||
//
|
||||
// // Check for discontinuities
|
||||
// if (component instanceof SymmetricComponent) {
|
||||
// SymmetricComponent sym = (SymmetricComponent) component;
|
||||
// // TODO:LOW: Ignores other cluster components (not clusterable)
|
||||
// double x = component.toAbsolute(Coordinate.NUL)[0].x;
|
||||
//
|
||||
// // Check for lengthwise discontinuity
|
||||
// if (x > componentX + 0.0001) {
|
||||
// if (!MathUtil.equals(radius, 0)) {
|
||||
// warnings.add(Warning.DISCONTINUITY);
|
||||
// radius = 0;
|
||||
// }
|
||||
// }
|
||||
// componentX = component.toAbsolute(new Coordinate(component.getLength()))[0].x;
|
||||
//
|
||||
// // Check for radius discontinuity
|
||||
// if (!MathUtil.equals(sym.getForeRadius(), radius)) {
|
||||
// warnings.add(Warning.DISCONTINUITY);
|
||||
// // TODO: MEDIUM: Apply correction to values to cp and to map
|
||||
// }
|
||||
// radius = sym.getAftRadius();
|
||||
// }
|
||||
if (component instanceof SymmetricComponent) {
|
||||
SymmetricComponent sym = (SymmetricComponent) component;
|
||||
// TODO:LOW: Ignores other cluster components (not clusterable)
|
||||
double x = component.toAbsolute(Coordinate.NUL)[0].x;
|
||||
|
||||
// Check for lengthwise discontinuity
|
||||
if (x > componentX + 0.0001) {
|
||||
if (!MathUtil.equals(radius, 0)) {
|
||||
warnings.add(Warning.DISCONTINUITY);
|
||||
radius = 0;
|
||||
}
|
||||
}
|
||||
componentX = component.toAbsolute(new Coordinate(component.getLength()))[0].x;
|
||||
|
||||
// Check for radius discontinuity
|
||||
if (!MathUtil.equals(sym.getForeRadius(), radius)) {
|
||||
warnings.add(Warning.DISCONTINUITY);
|
||||
// TODO: MEDIUM: Apply correction to values to cp and to map
|
||||
}
|
||||
radius = sym.getAftRadius();
|
||||
}
|
||||
|
||||
// Call calculation method
|
||||
forces.zero();
|
||||
|
@ -26,6 +26,7 @@ public class MassCalculator implements Monitorable {
|
||||
public Coordinate getCG(Motor motor) {
|
||||
return Coordinate.NUL;
|
||||
}
|
||||
|
||||
},
|
||||
LAUNCH_MASS {
|
||||
@Override
|
||||
@ -41,6 +42,25 @@ public class MassCalculator implements Monitorable {
|
||||
};
|
||||
|
||||
public abstract Coordinate getCG(Motor motor);
|
||||
|
||||
/**
|
||||
* Compute the cg contribution of the motor relative to the rocket's coordinates
|
||||
*
|
||||
* @param motorConfig
|
||||
* @return
|
||||
*/
|
||||
public Coordinate getCG(MotorConfiguration motorConfig) {
|
||||
Coordinate cg = getCG(motorConfig.getMotor());
|
||||
cg = cg.add(motorConfig.getPosition());
|
||||
|
||||
RocketComponent motorMount = (RocketComponent) motorConfig.getMount();
|
||||
Coordinate totalCG = new Coordinate();
|
||||
for (Coordinate cord : motorMount.toAbsolute(cg) ) {
|
||||
totalCG = totalCG.average(cord);
|
||||
}
|
||||
|
||||
return totalCG;
|
||||
}
|
||||
}
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(MassCalculator.class);
|
||||
@ -146,10 +166,10 @@ public class MassCalculator implements Monitorable {
|
||||
for (MotorConfiguration inst : config.getActiveMotors() ) {
|
||||
//ThrustCurveMotor motor = (ThrustCurveMotor) inst.getMotor();
|
||||
|
||||
Coordinate position = inst.getPosition();
|
||||
Coordinate curMotorCM = type.getCG(inst.getMotor()).add(position);
|
||||
double Ir = inst.getRotationalInertia();
|
||||
double It = inst.getLongitudinalInertia();
|
||||
|
||||
Coordinate curMotorCM = type.getCG(inst);
|
||||
|
||||
MassData instData = new MassData( curMotorCM, Ir, It);
|
||||
motorData = motorData.add( instData );
|
||||
|
@ -29,7 +29,6 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
|
||||
protected boolean ignitionOveride = false;
|
||||
protected double ignitionDelay = 0.0;
|
||||
protected IgnitionEvent ignitionEvent = IgnitionEvent.NEVER;
|
||||
protected double ignitionTime = 0.0;
|
||||
|
||||
protected int modID = 0;
|
||||
private final List<StateChangeListener> listeners = new ArrayList<StateChangeListener>();
|
||||
@ -50,13 +49,11 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
|
||||
public MotorState getSimulationState() {
|
||||
MotorState state = motor.getNewInstance();
|
||||
if( ignitionOveride ) {
|
||||
state.setIgnitionTime( this.ignitionTime );
|
||||
state.setIgnitionEvent( this.ignitionEvent );
|
||||
state.setIgnitionDelay( this.ignitionDelay );
|
||||
state.setEjectionDelay( this.ejectionDelay );
|
||||
} else {
|
||||
MotorConfiguration defInstance = mount.getDefaultMotorInstance();
|
||||
state.setIgnitionTime( defInstance.ignitionTime );
|
||||
state.setIgnitionEvent( defInstance.ignitionEvent );
|
||||
state.setIgnitionDelay( defInstance.ignitionDelay );
|
||||
state.setEjectionDelay( defInstance.ejectionDelay );
|
||||
@ -118,21 +115,10 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
|
||||
fireChangeEvent();
|
||||
}
|
||||
|
||||
public double getIgnitionTime() {
|
||||
return this.ignitionTime;
|
||||
}
|
||||
|
||||
public void useDefaultIgnition() {
|
||||
this.ignitionOveride = false;
|
||||
}
|
||||
|
||||
public void setIgnitionTime(double _time) {
|
||||
this.ignitionTime = _time;
|
||||
this.ignitionOveride = true;
|
||||
modID++;
|
||||
fireChangeEvent();
|
||||
}
|
||||
|
||||
public double getIgnitionDelay() {
|
||||
return this.ignitionDelay;
|
||||
}
|
||||
@ -225,7 +211,6 @@ public class MotorConfiguration implements FlightConfigurableParameter<MotorConf
|
||||
clone.ignitionOveride = this.ignitionOveride;
|
||||
clone.ignitionDelay = this.ignitionDelay;
|
||||
clone.ignitionEvent = this.ignitionEvent;
|
||||
clone.ignitionTime = this.ignitionTime;
|
||||
return clone;
|
||||
}
|
||||
|
||||
|
@ -164,6 +164,7 @@ public class FlightEvent implements Comparable<FlightEvent> {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "FlightEvent[type=" + type.name() + ",time=" + time + ",source=" + source + "]";
|
||||
return "FlightEvent[type=" + type.name() + ",time=" + time + ",source=" + source + ",data=" + String.valueOf(data) + "]";
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -405,6 +405,7 @@ public class TestRockets {
|
||||
bodytube.setMaterial(material);
|
||||
finset.setMaterial(material);
|
||||
|
||||
rocket.enableEvents();
|
||||
return rocket;
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,7 @@ public class BarrowmanCalculatorTest {
|
||||
WarningSet warnings = new WarningSet();
|
||||
|
||||
MotorConfiguration inst = TestRockets.getTestD12Motor();
|
||||
InnerTube motorTube = (InnerTube)rkt.getChild(0).getChild(1).getChild(1);
|
||||
InnerTube motorTube = (InnerTube)rkt.getChild(0).getChild(1).getChild(2);
|
||||
motorTube.setMotorInstance(fcid, inst);
|
||||
motorTube.setMotorMount(true);
|
||||
motorTube.setMotorOverhang(0.005);
|
||||
|
@ -50,6 +50,7 @@ public class BoosterSetTest extends BaseTestCase {
|
||||
FinSet coreFins = new TrapezoidFinSet(4, 4, 2, 2, 4);
|
||||
coreFins.setName("Core Fins");
|
||||
coreLowerBody.addChild(coreFins);
|
||||
rocket.enableEvents();
|
||||
return rocket;
|
||||
}
|
||||
|
||||
|
@ -56,6 +56,8 @@ import net.sf.openrocket.gui.util.GUIUtil;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.masscalc.MassCalculator;
|
||||
import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
|
||||
import net.sf.openrocket.motor.MotorConfiguration;
|
||||
import net.sf.openrocket.rocketcomponent.AxialStage;
|
||||
import net.sf.openrocket.rocketcomponent.FinSet;
|
||||
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
|
||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||
@ -71,8 +73,8 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
private static final long serialVersionUID = 9131240570600307935L;
|
||||
private static ComponentAnalysisDialog singletonDialog = null;
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
|
||||
|
||||
|
||||
|
||||
private final FlightConditions conditions;
|
||||
private final FlightConfiguration configuration;
|
||||
private final DoubleModel theta, aoa, mach, roll;
|
||||
@ -80,37 +82,36 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
private boolean fakeChange = false;
|
||||
private AerodynamicCalculator aerodynamicCalculator;
|
||||
private final MassCalculator massCalculator = new MassCalculator();
|
||||
|
||||
|
||||
private final ColumnTableModel cpTableModel;
|
||||
private final ColumnTableModel dragTableModel;
|
||||
private final ColumnTableModel rollTableModel;
|
||||
|
||||
private final JList warningList;
|
||||
|
||||
|
||||
private final List<AerodynamicForces> cpData = new ArrayList<AerodynamicForces>();
|
||||
private final List<Coordinate> cgData = new ArrayList<Coordinate>();
|
||||
|
||||
private final JList<Object> warningList;
|
||||
|
||||
|
||||
private final List<Object[]> cgData = new ArrayList<Object[]>();
|
||||
private final List<AerodynamicForces> dragData = new ArrayList<AerodynamicForces>();
|
||||
private double totalCD = 0;
|
||||
private final List<AerodynamicForces> rollData = new ArrayList<AerodynamicForces>();
|
||||
|
||||
|
||||
|
||||
|
||||
public ComponentAnalysisDialog(final RocketPanel rocketPanel) {
|
||||
////Component analysis
|
||||
super(SwingUtilities.getWindowAncestor(rocketPanel),
|
||||
trans.get("componentanalysisdlg.componentanalysis"));
|
||||
|
||||
|
||||
JTable table;
|
||||
|
||||
JPanel panel = new JPanel(new MigLayout("fill", "[][35lp::][fill][fill]"));
|
||||
|
||||
JPanel panel = new JPanel(new MigLayout("fill"));
|
||||
add(panel);
|
||||
|
||||
|
||||
this.configuration = rocketPanel.getConfiguration();
|
||||
this.aerodynamicCalculator = rocketPanel.getAerodynamicCalculator().newInstance();
|
||||
|
||||
|
||||
|
||||
|
||||
conditions = new FlightConditions(configuration);
|
||||
|
||||
|
||||
rocketPanel.setCPAOA(0);
|
||||
aoa = new DoubleModel(rocketPanel, "CPAOA", UnitGroup.UNITS_ANGLE, 0, Math.PI);
|
||||
rocketPanel.setCPMach(Application.getPreferences().getDefaultMach());
|
||||
@ -119,7 +120,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
theta = new DoubleModel(rocketPanel, "CPTheta", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
|
||||
rocketPanel.setCPRoll(0);
|
||||
roll = new DoubleModel(rocketPanel, "CPRoll", UnitGroup.UNITS_ROLL);
|
||||
|
||||
|
||||
//// Wind direction:
|
||||
panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.winddir")), "width 120lp!");
|
||||
panel.add(new UnitSelector(theta, true), "width 50lp!");
|
||||
@ -142,60 +143,60 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
}
|
||||
});
|
||||
panel.add(worstToggle, "");
|
||||
|
||||
|
||||
warningList = new JList();
|
||||
|
||||
|
||||
warningList = new JList<>();
|
||||
JScrollPane scrollPane = new JScrollPane(warningList);
|
||||
////Warnings:
|
||||
scrollPane.setBorder(BorderFactory.createTitledBorder(trans.get("componentanalysisdlg.TitledBorder.warnings")));
|
||||
panel.add(scrollPane, "gap paragraph, spany 4, width 300lp!, growy 1, height :100lp:, wrap");
|
||||
|
||||
|
||||
////Angle of attack:
|
||||
panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.angleofattack")), "width 120lp!");
|
||||
panel.add(new UnitSelector(aoa, true), "width 50lp!");
|
||||
panel.add(new BasicSlider(aoa.getSliderModel(0, Math.PI)), "growx, wrap");
|
||||
|
||||
|
||||
//// Mach number:
|
||||
panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.machnumber")), "width 120lp!");
|
||||
panel.add(new UnitSelector(mach, true), "width 50lp!");
|
||||
panel.add(new BasicSlider(mach.getSliderModel(0, 3)), "growx, wrap");
|
||||
|
||||
|
||||
//// Roll rate:
|
||||
panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.rollrate")), "width 120lp!");
|
||||
panel.add(new UnitSelector(roll, true), "width 50lp!");
|
||||
panel.add(new BasicSlider(roll.getSliderModel(-20 * 2 * Math.PI, 20 * 2 * Math.PI)),
|
||||
"growx, wrap paragraph");
|
||||
|
||||
|
||||
"growx, wrap");
|
||||
|
||||
|
||||
// Stage and motor selection:
|
||||
//// Active stages:
|
||||
panel.add(new JLabel(trans.get("componentanalysisdlg.lbl.activestages")), "spanx, split, gapafter rel");
|
||||
panel.add(new StageSelector(configuration), "gapafter paragraph");
|
||||
|
||||
|
||||
//// Motor configuration:
|
||||
JLabel label = new JLabel(trans.get("componentanalysisdlg.lbl.motorconf"));
|
||||
label.setHorizontalAlignment(JLabel.RIGHT);
|
||||
panel.add(label, "growx, right");
|
||||
|
||||
|
||||
ParameterSetModel<FlightConfiguration> psm = new ParameterSetModel<FlightConfiguration>( configuration.getRocket().getConfigSet());
|
||||
JComboBox<FlightConfiguration> combo = new JComboBox<FlightConfiguration>(psm);
|
||||
panel.add(combo, "wrap");
|
||||
|
||||
|
||||
|
||||
|
||||
// Tabbed pane
|
||||
|
||||
|
||||
JTabbedPane tabbedPane = new JTabbedPane();
|
||||
panel.add(tabbedPane, "spanx, growx, growy");
|
||||
|
||||
|
||||
|
||||
|
||||
// Create the CP data table
|
||||
cpTableModel = new ColumnTableModel(
|
||||
|
||||
|
||||
//// Component
|
||||
new Column(trans.get("componentanalysisdlg.TabStability.Col.Component")) {
|
||||
@Override
|
||||
public Object getValueAt(int row) {
|
||||
RocketComponent c = cpData.get(row).getComponent();
|
||||
Object c = cgData.get(row)[0];
|
||||
if (c instanceof Rocket) {
|
||||
return trans.get("componentanalysisdlg.TOTAL");
|
||||
}
|
||||
@ -212,7 +213,11 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int row) {
|
||||
return unit.toString(cgData.get(row).x);
|
||||
Coordinate cg = (Coordinate) cgData.get(row)[1];
|
||||
if ( cg == null ) {
|
||||
return null;
|
||||
}
|
||||
return unit.toString(cg.x);
|
||||
}
|
||||
},
|
||||
new Column(trans.get("componentanalysisdlg.TabStability.Col.Mass") + " / " + UnitGroup.UNITS_MASS.getDefaultUnit().getUnit()) {
|
||||
@ -220,7 +225,11 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int row) {
|
||||
return unit.toString(cgData.get(row).weight);
|
||||
Coordinate cg = (Coordinate) cgData.get(row)[1];
|
||||
if ( cg == null ) {
|
||||
return null;
|
||||
}
|
||||
return unit.toString(cg.weight);
|
||||
}
|
||||
},
|
||||
new Column(trans.get("componentanalysisdlg.TabStability.Col.CP") + " / " + UnitGroup.UNITS_LENGTH.getDefaultUnit().getUnit()) {
|
||||
@ -228,42 +237,56 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int row) {
|
||||
return unit.toString(cpData.get(row).getCP().x);
|
||||
AerodynamicForces forces = (AerodynamicForces) cgData.get(row)[2];
|
||||
if ( forces == null ) {
|
||||
return null;
|
||||
}
|
||||
return unit.toString(forces.getCP().x);
|
||||
}
|
||||
},
|
||||
new Column("<html>C<sub>N<sub>" + ALPHA + "</sub></sub>") {
|
||||
@Override
|
||||
public Object getValueAt(int row) {
|
||||
return NOUNIT.toString(cpData.get(row).getCP().weight);
|
||||
AerodynamicForces forces = (AerodynamicForces) cgData.get(row)[2];
|
||||
if ( forces == null ) {
|
||||
return null;
|
||||
}
|
||||
return NOUNIT.toString(forces.getCP().weight);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
) {
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return cpData.size();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return cgData.size();
|
||||
}
|
||||
};
|
||||
|
||||
table = new ColumnTable(cpTableModel);
|
||||
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
table.setSelectionBackground(Color.LIGHT_GRAY);
|
||||
table.setSelectionForeground(Color.BLACK);
|
||||
cpTableModel.setColumnWidths(table.getColumnModel());
|
||||
|
||||
|
||||
table.setDefaultRenderer(Object.class, new CustomCellRenderer());
|
||||
// table.setShowHorizontalLines(false);
|
||||
// table.setShowVerticalLines(true);
|
||||
|
||||
|
||||
JScrollPane scrollpane = new JScrollPane(table);
|
||||
scrollpane.setPreferredSize(new Dimension(600, 200));
|
||||
|
||||
|
||||
//// Stability and Stability information
|
||||
tabbedPane.addTab(trans.get("componentanalysisdlg.TabStability"),
|
||||
null, scrollpane, trans.get("componentanalysisdlg.TabStability.ttip"));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Create the drag data table
|
||||
dragTableModel = new ColumnTableModel(
|
||||
//// Component
|
||||
@ -276,7 +299,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
}
|
||||
return c.toString();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getDefaultWidth() {
|
||||
return 200;
|
||||
@ -311,33 +334,38 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
}
|
||||
}
|
||||
) {
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return dragData.size();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return dragData.size();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
table = new JTable(dragTableModel);
|
||||
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
table.setSelectionBackground(Color.LIGHT_GRAY);
|
||||
table.setSelectionForeground(Color.BLACK);
|
||||
dragTableModel.setColumnWidths(table.getColumnModel());
|
||||
|
||||
|
||||
table.setDefaultRenderer(Object.class, new DragCellRenderer(new Color(0.5f, 1.0f, 0.5f)));
|
||||
// table.setShowHorizontalLines(false);
|
||||
// table.setShowVerticalLines(true);
|
||||
|
||||
|
||||
scrollpane = new JScrollPane(table);
|
||||
scrollpane.setPreferredSize(new Dimension(600, 200));
|
||||
|
||||
|
||||
//// Drag characteristics and Drag characteristics tooltip
|
||||
tabbedPane.addTab(trans.get("componentanalysisdlg.dragTabchar"), null, scrollpane,
|
||||
trans.get("componentanalysisdlg.dragTabchar.ttip"));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Create the roll data table
|
||||
rollTableModel = new ColumnTableModel(
|
||||
//// Component
|
||||
@ -373,30 +401,35 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
}
|
||||
}
|
||||
) {
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return rollData.size();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return rollData.size();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
table = new JTable(rollTableModel);
|
||||
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
table.setSelectionBackground(Color.LIGHT_GRAY);
|
||||
table.setSelectionForeground(Color.BLACK);
|
||||
rollTableModel.setColumnWidths(table.getColumnModel());
|
||||
|
||||
table.setDefaultRenderer(Object.class, new CustomCellRenderer());
|
||||
|
||||
scrollpane = new JScrollPane(table);
|
||||
scrollpane.setPreferredSize(new Dimension(600, 200));
|
||||
|
||||
|
||||
//// Roll dynamics and Roll dynamics tooltip
|
||||
tabbedPane.addTab(trans.get("componentanalysisdlg.rollTableModel"), null, scrollpane,
|
||||
trans.get("componentanalysisdlg.rollTableModel.ttip"));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Add the data updater to listen to changes in aoa and theta
|
||||
mach.addChangeListener(this);
|
||||
theta.addChangeListener(this);
|
||||
@ -404,9 +437,9 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
roll.addChangeListener(this);
|
||||
configuration.addChangeListener(this);
|
||||
this.stateChanged(null);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Remove listeners when closing window
|
||||
this.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
@ -425,7 +458,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
singletonDialog = null;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//// Reference length:
|
||||
panel.add(new StyledLabel(trans.get("componentanalysisdlg.lbl.reflenght"), -1),
|
||||
"span, split, gapleft para, gapright rel");
|
||||
@ -433,19 +466,19 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
UnitSelector sel = new UnitSelector(dm, true);
|
||||
sel.resizeFont(-1);
|
||||
panel.add(sel, "gapright para");
|
||||
|
||||
|
||||
//// Reference area:
|
||||
panel.add(new StyledLabel(trans.get("componentanalysisdlg.lbl.refarea"), -1), "gapright rel");
|
||||
dm = new DoubleModel(conditions, "RefArea", UnitGroup.UNITS_AREA);
|
||||
sel = new UnitSelector(dm, true);
|
||||
sel.resizeFont(-1);
|
||||
panel.add(sel, "wrap");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Buttons
|
||||
JButton button;
|
||||
|
||||
|
||||
// TODO: LOW: printing
|
||||
// button = new JButton("Print");
|
||||
// button.addActionListener(new ActionListener() {
|
||||
@ -460,7 +493,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
// }
|
||||
// });
|
||||
// panel.add(button,"tag ok");
|
||||
|
||||
|
||||
//button = new JButton("Close");
|
||||
//Close button
|
||||
button = new JButton(trans.get("dlg.but.close"));
|
||||
@ -470,18 +503,18 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
ComponentAnalysisDialog.this.dispose();
|
||||
}
|
||||
});
|
||||
panel.add(button, "span, split, tag cancel");
|
||||
|
||||
|
||||
panel.add(button, "span, tag cancel");
|
||||
|
||||
|
||||
this.setLocationByPlatform(true);
|
||||
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||
pack();
|
||||
|
||||
|
||||
GUIUtil.setDisposableDialogOptions(this, null);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Updates the data in the table and fires a table data change event.
|
||||
*/
|
||||
@ -494,7 +527,7 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
conditions.setMach(mach.getValue());
|
||||
conditions.setRollRate(roll.getValue());
|
||||
conditions.setReference(configuration);
|
||||
|
||||
|
||||
if (worstToggle.isSelected()) {
|
||||
aerodynamicCalculator.getWorstCP(configuration, conditions, null);
|
||||
if (!MathUtil.equals(conditions.getTheta(), theta.getValue())) {
|
||||
@ -504,27 +537,35 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Map<RocketComponent, AerodynamicForces> aeroData =
|
||||
aerodynamicCalculator.getForceAnalysis(configuration, conditions, set);
|
||||
Map<RocketComponent, Coordinate> massData =
|
||||
massCalculator.getCGAnalysis(configuration, MassCalcType.LAUNCH_MASS);
|
||||
|
||||
|
||||
cpData.clear();
|
||||
|
||||
|
||||
cgData.clear();
|
||||
dragData.clear();
|
||||
rollData.clear();
|
||||
for (RocketComponent c : configuration.getActiveComponents()) {
|
||||
forces = aeroData.get(c);
|
||||
Coordinate cg = massData.get(c);
|
||||
|
||||
if (forces == null)
|
||||
if ( c instanceof AxialStage ) {
|
||||
continue;
|
||||
if (forces.getCP() != null) {
|
||||
cpData.add(forces);
|
||||
cgData.add(cg);
|
||||
}
|
||||
Object[] data = new Object[3];
|
||||
cgData.add(data);
|
||||
data[0] = c;
|
||||
|
||||
Coordinate cg = massData.get(c);
|
||||
data[1] = cg;
|
||||
|
||||
forces = aeroData.get(c);
|
||||
if (forces == null) {
|
||||
continue;
|
||||
}
|
||||
if (forces.getCP() != null) {
|
||||
data[2] = forces;
|
||||
}
|
||||
|
||||
if (!Double.isNaN(forces.getCD())) {
|
||||
dragData.add(forces);
|
||||
}
|
||||
@ -532,17 +573,30 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
rollData.add(forces);
|
||||
}
|
||||
}
|
||||
|
||||
for ( MotorConfiguration motorConfig : configuration.getActiveMotors()) {
|
||||
|
||||
Object [] data = new Object[3];
|
||||
cgData.add(data);
|
||||
|
||||
data[0] = motorConfig.getMotor().getDesignation();
|
||||
data[1] = MassCalcType.LAUNCH_MASS.getCG(motorConfig);
|
||||
}
|
||||
|
||||
forces = aeroData.get(configuration.getRocket());
|
||||
if (forces != null) {
|
||||
cpData.add(forces);
|
||||
cgData.add(massData.get(configuration.getRocket()));
|
||||
Object[] data = new Object[3];
|
||||
cgData.add(data);
|
||||
data[0] = configuration.getRocket();
|
||||
data[1] = massData.get(configuration.getRocket());
|
||||
data[2] = forces;
|
||||
dragData.add(forces);
|
||||
rollData.add(forces);
|
||||
totalCD = forces.getCD();
|
||||
} else {
|
||||
totalCD = 0;
|
||||
}
|
||||
|
||||
|
||||
// Set warnings
|
||||
if (set.isEmpty()) {
|
||||
warningList.setListData(new String[] {
|
||||
@ -551,33 +605,37 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
} else {
|
||||
warningList.setListData(new Vector<Warning>(set));
|
||||
}
|
||||
|
||||
|
||||
cpTableModel.fireTableDataChanged();
|
||||
dragTableModel.fireTableDataChanged();
|
||||
rollTableModel.fireTableDataChanged();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private class CustomCellRenderer extends JLabel implements TableCellRenderer {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final Font normalFont;
|
||||
private final Font boldFont;
|
||||
|
||||
|
||||
public CustomCellRenderer() {
|
||||
super();
|
||||
normalFont = getFont();
|
||||
boldFont = normalFont.deriveFont(Font.BOLD);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value,
|
||||
boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
|
||||
this.setText(value.toString());
|
||||
|
||||
if ((row < 0) || (row >= cpData.size()))
|
||||
|
||||
this.setText(value == null ? null : value.toString());
|
||||
|
||||
if ((row < 0) || (row >= cgData.size()))
|
||||
return this;
|
||||
|
||||
if (cpData.get(row).getComponent() instanceof Rocket) {
|
||||
|
||||
if (cgData.get(row)[0] instanceof Rocket) {
|
||||
this.setFont(boldFont);
|
||||
} else {
|
||||
this.setFont(normalFont);
|
||||
@ -585,52 +643,56 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private class DragCellRenderer extends JLabel implements TableCellRenderer {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
private final Font normalFont;
|
||||
private final Font boldFont;
|
||||
|
||||
|
||||
|
||||
|
||||
public DragCellRenderer(Color baseColor) {
|
||||
super();
|
||||
normalFont = getFont();
|
||||
boldFont = normalFont.deriveFont(Font.BOLD);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value,
|
||||
boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
|
||||
|
||||
if (value instanceof Double) {
|
||||
|
||||
|
||||
// A drag coefficient
|
||||
double cd = (Double) value;
|
||||
this.setText(String.format("%.2f (%.0f%%)", cd, 100 * cd / totalCD));
|
||||
|
||||
|
||||
float r = (float) (cd / 1.5);
|
||||
|
||||
|
||||
float hue = MathUtil.clamp(0.3333f * (1 - 2.0f * r), 0, 0.3333f);
|
||||
float sat = MathUtil.clamp(0.8f * r + 0.1f * (1 - r), 0, 1);
|
||||
float val = 1.0f;
|
||||
|
||||
|
||||
this.setBackground(Color.getHSBColor(hue, sat, val));
|
||||
this.setOpaque(true);
|
||||
this.setHorizontalAlignment(SwingConstants.CENTER);
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
// Other
|
||||
this.setText(value.toString());
|
||||
this.setOpaque(false);
|
||||
this.setHorizontalAlignment(SwingConstants.LEFT);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if ((row < 0) || (row >= dragData.size()))
|
||||
return this;
|
||||
|
||||
|
||||
if ((dragData.get(row).getComponent() instanceof Rocket) || (column == 4)) {
|
||||
this.setFont(boldFont);
|
||||
} else {
|
||||
@ -639,20 +701,20 @@ public class ComponentAnalysisDialog extends JDialog implements StateChangeListe
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
///////// Singleton implementation
|
||||
|
||||
|
||||
public static void showDialog(RocketPanel rocketpanel) {
|
||||
if (singletonDialog != null)
|
||||
singletonDialog.dispose();
|
||||
singletonDialog = new ComponentAnalysisDialog(rocketpanel);
|
||||
singletonDialog.setVisible(true);
|
||||
}
|
||||
|
||||
|
||||
public static void hideDialog() {
|
||||
if (singletonDialog != null)
|
||||
singletonDialog.dispose();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user