From f8cfebe5f5b799b2fa185edd3a700e16825724c5 Mon Sep 17 00:00:00 2001 From: Kevin Ruland Date: Thu, 31 Dec 2015 09:57:36 -0600 Subject: [PATCH] Fix the motor cg computation. Partial fix to barrowman aero. --- .../aerodynamics/BarrowmanCalculator.java | 42 +- .../openrocket/masscalc/MassCalculator.java | 24 +- .../openrocket/motor/MotorConfiguration.java | 15 - .../sf/openrocket/simulation/FlightEvent.java | 3 +- .../net/sf/openrocket/util/TestRockets.java | 1 + .../aerodynamics/BarrowmanCalculatorTest.java | 2 +- .../rocketcomponent/BoosterSetTest.java | 1 + .../gui/dialogs/ComponentAnalysisDialog.java | 358 ++++++++++-------- 8 files changed, 258 insertions(+), 188 deletions(-) diff --git a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java index fc5da5330..ee23fa198 100644 --- a/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java +++ b/core/src/net/sf/openrocket/aerodynamics/BarrowmanCalculator.java @@ -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(); diff --git a/core/src/net/sf/openrocket/masscalc/MassCalculator.java b/core/src/net/sf/openrocket/masscalc/MassCalculator.java index f1ed4b5d4..8f4e28954 100644 --- a/core/src/net/sf/openrocket/masscalc/MassCalculator.java +++ b/core/src/net/sf/openrocket/masscalc/MassCalculator.java @@ -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 ); diff --git a/core/src/net/sf/openrocket/motor/MotorConfiguration.java b/core/src/net/sf/openrocket/motor/MotorConfiguration.java index 14780d09e..1e461c7fb 100644 --- a/core/src/net/sf/openrocket/motor/MotorConfiguration.java +++ b/core/src/net/sf/openrocket/motor/MotorConfiguration.java @@ -29,7 +29,6 @@ public class MotorConfiguration implements FlightConfigurableParameter listeners = new ArrayList(); @@ -50,13 +49,11 @@ public class MotorConfiguration implements FlightConfigurableParameter { @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) + "]"; + } } diff --git a/core/src/net/sf/openrocket/util/TestRockets.java b/core/src/net/sf/openrocket/util/TestRockets.java index 7fd7ce0f3..ca1a58c34 100644 --- a/core/src/net/sf/openrocket/util/TestRockets.java +++ b/core/src/net/sf/openrocket/util/TestRockets.java @@ -405,6 +405,7 @@ public class TestRockets { bodytube.setMaterial(material); finset.setMaterial(material); + rocket.enableEvents(); return rocket; } diff --git a/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java b/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java index 449972566..87de5f59c 100644 --- a/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java +++ b/core/test/net/sf/openrocket/aerodynamics/BarrowmanCalculatorTest.java @@ -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); diff --git a/core/test/net/sf/openrocket/rocketcomponent/BoosterSetTest.java b/core/test/net/sf/openrocket/rocketcomponent/BoosterSetTest.java index 042ab61ee..cd24137e7 100644 --- a/core/test/net/sf/openrocket/rocketcomponent/BoosterSetTest.java +++ b/core/test/net/sf/openrocket/rocketcomponent/BoosterSetTest.java @@ -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; } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java index 36807d1cf..31917453c 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ComponentAnalysisDialog.java @@ -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 cpData = new ArrayList(); - private final List cgData = new ArrayList(); + + private final JList warningList; + + + private final List cgData = new ArrayList(); private final List dragData = new ArrayList(); private double totalCD = 0; private final List rollData = new ArrayList(); - - + + 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 psm = new ParameterSetModel( configuration.getRocket().getConfigSet()); JComboBox combo = new JComboBox(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("CN" + ALPHA + "") { @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 aeroData = aerodynamicCalculator.getForceAnalysis(configuration, conditions, set); Map 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(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(); } - + }