Merge pull request #731 from teyrana/fix/726-positioning
[Fixes #726] Fixes multiple issues when changing Fin-Offset-Methods
This commit is contained in:
commit
b17d03138a
@ -934,11 +934,14 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
|
||||
// no change.
|
||||
return;
|
||||
}
|
||||
|
||||
// this variable does not change the internal representation
|
||||
|
||||
// this variable changes the internal representation, but not the physical position
|
||||
// the relativePosition (method) is just the lens through which external code may view this component's position.
|
||||
this.axialMethod = newAxialMethod;
|
||||
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
|
||||
this.axialOffset = getAxialOffset(newAxialMethod);
|
||||
|
||||
// // this doesn't cause any physical change-- just how it's described.
|
||||
// fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,8 +55,8 @@ public class FreeformFinSetTest extends BaseTestCase {
|
||||
sourceSet.setOverrideCGX(0.012);
|
||||
sourceSet.setOverrideMass(0.0123);
|
||||
sourceSet.setOverrideSubcomponents(true);
|
||||
sourceSet.setAxialOffset(0.1);
|
||||
sourceSet.setAxialMethod(AxialMethod.ABSOLUTE);
|
||||
sourceSet.setAxialOffset(0.1);
|
||||
sourceSet.setTabHeight(0.01);
|
||||
sourceSet.setTabLength(0.02);
|
||||
sourceSet.setTabOffsetMethod(AxialMethod.BOTTOM);
|
||||
|
@ -2,15 +2,18 @@ package net.sf.openrocket.rocketcomponent;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.hamcrest.CoreMatchers.not;
|
||||
import static org.hamcrest.Matchers.closeTo;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import net.sf.openrocket.rocketcomponent.position.AxialMethod;
|
||||
import net.sf.openrocket.util.BoundingBox;
|
||||
|
||||
import net.sf.openrocket.util.ArrayList;
|
||||
import org.junit.Test;
|
||||
|
||||
import net.sf.openrocket.rocketcomponent.position.AxialMethod;
|
||||
import net.sf.openrocket.rocketcomponent.position.AngleMethod;
|
||||
import net.sf.openrocket.rocketcomponent.position.RadiusMethod;
|
||||
import net.sf.openrocket.util.BoundingBox;
|
||||
import net.sf.openrocket.util.Coordinate;
|
||||
import net.sf.openrocket.util.MathUtil;
|
||||
import net.sf.openrocket.util.TestRockets;
|
||||
@ -147,6 +150,63 @@ public class RocketTest extends BaseTestCase {
|
||||
assertEquals( 0.062000000, bounds.max.y, EPSILON);
|
||||
assertEquals( 0.052893575, bounds.max.z, EPSILON);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testChangeAxialMethod(){
|
||||
class AxialPositionTestCase {
|
||||
final public AxialMethod beginMethod;
|
||||
final public double beginOffset;
|
||||
final public AxialMethod endMethod;
|
||||
final public double endOffset;
|
||||
final public double endPosition;
|
||||
|
||||
public AxialPositionTestCase( AxialMethod _begMeth, double _begOffs, AxialMethod _endMeth, double _endOffs, double _endPos){
|
||||
beginMethod = _begMeth; beginOffset = _begOffs; endMethod = _endMeth; endOffset = _endOffs; endPosition = _endPos;
|
||||
}
|
||||
}
|
||||
|
||||
final Rocket rocket = TestRockets.makeEstesAlphaIII();
|
||||
final AxialStage stage= (AxialStage)rocket.getChild(0);
|
||||
final BodyTube body = (BodyTube)stage.getChild(1);
|
||||
final FinSet fins = (FinSet) body.getChild(0);
|
||||
|
||||
{ // verify construction:
|
||||
assertEquals("incorrect body length:", 0.20, body.getLength(), EPSILON);
|
||||
assertEquals("incorrect fin length:", 0.05, fins.getLength(), EPSILON);
|
||||
{ // fin #1
|
||||
final Coordinate expLoc = new Coordinate(0.22, 0.012, 0);
|
||||
final Coordinate actLocs[] = fins.getComponentLocations();
|
||||
assertThat(fins.getName() + " not positioned correctly: ", actLocs[0], equalTo(expLoc));
|
||||
}
|
||||
}
|
||||
|
||||
final ArrayList<AxialPositionTestCase> allTestCases = new ArrayList<>(10);
|
||||
allTestCases.add(0, new AxialPositionTestCase(AxialMethod.BOTTOM, 0.0, AxialMethod.TOP, 0.15, 0.15));
|
||||
allTestCases.add(1, new AxialPositionTestCase(AxialMethod.TOP, 0.0, AxialMethod.BOTTOM, -0.15, 0.0));
|
||||
allTestCases.add(2, new AxialPositionTestCase(AxialMethod.BOTTOM, -0.03, AxialMethod.TOP, 0.12, 0.12));
|
||||
allTestCases.add(3, new AxialPositionTestCase(AxialMethod.BOTTOM, 0.03, AxialMethod.TOP, 0.18, 0.18));
|
||||
allTestCases.add(4, new AxialPositionTestCase(AxialMethod.BOTTOM, 0.03, AxialMethod.MIDDLE, 0.105, 0.18));
|
||||
allTestCases.add(5, new AxialPositionTestCase(AxialMethod.MIDDLE, 0.0, AxialMethod.TOP, 0.075, 0.075));
|
||||
allTestCases.add(6, new AxialPositionTestCase(AxialMethod.MIDDLE, 0.0, AxialMethod.BOTTOM, -0.075, 0.075));
|
||||
allTestCases.add(7, new AxialPositionTestCase(AxialMethod.MIDDLE, 0.005, AxialMethod.TOP, 0.08, 0.08));
|
||||
|
||||
for( int caseIndex=0; caseIndex < allTestCases.size(); ++caseIndex ){
|
||||
final AxialPositionTestCase cur = allTestCases.get(caseIndex);
|
||||
// test repositioning
|
||||
fins.setAxialOffset(cur.beginMethod, cur.beginOffset);
|
||||
assertEquals(fins.getName() + " incorrect start axial-position-method: ", fins.getAxialMethod(), cur.beginMethod);
|
||||
assertEquals(fins.getName() + " incorrect start axial-position-value: ", cur.beginOffset, fins.getAxialOffset(), EPSILON);
|
||||
|
||||
{
|
||||
// System.err.println(String.format("## Running Test case # %d :", caseIndex));
|
||||
fins.setAxialMethod(cur.endMethod);
|
||||
assertEquals(String.format(" Test Case # %d // offset doesn't match!", caseIndex), cur.endOffset, fins.getAxialOffset(), EPSILON);
|
||||
assertEquals(String.format(" Test Case # %d // position doesn't match!", caseIndex), cur.endPosition, fins.getPosition().x, EPSILON);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveReadjustLocation() {
|
||||
|
@ -1,6 +1,9 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.EventObject;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
@ -110,25 +113,32 @@ public class EllipticalFinSetConfig extends FinSetConfig {
|
||||
//// Position
|
||||
//// Position relative to:
|
||||
panel.add(new JLabel(trans.get("EllipticalFinSetCfg.Positionrelativeto")));
|
||||
|
||||
JComboBox<AxialMethod> positionCombo= new JComboBox<AxialMethod>( new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods ));
|
||||
panel.add(positionCombo, "spanx, growx, wrap");
|
||||
|
||||
final EnumModel<AxialMethod> axialMethodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods );
|
||||
final JComboBox<AxialMethod> axialMethodCombo = new JComboBox<AxialMethod>( axialMethodModel );
|
||||
panel.add(axialMethodCombo, "spanx, growx, wrap");
|
||||
|
||||
//// plus
|
||||
panel.add(new JLabel(trans.get("EllipticalFinSetCfg.plus")), "right");
|
||||
|
||||
m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
final DoubleModel axialOffsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
spin = new JSpinner(axialOffsetModel.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(
|
||||
|
||||
axialMethodCombo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
axialOffsetModel.stateChanged(new EventObject(e));
|
||||
}
|
||||
});
|
||||
|
||||
panel.add(new UnitSelector(axialOffsetModel), "growx");
|
||||
panel.add(new BasicSlider(axialOffsetModel.getSliderModel(
|
||||
new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
|
||||
new DoubleModel(component.getParent(), "Length"))),
|
||||
"w 100lp, wrap");
|
||||
|
||||
|
||||
|
||||
|
||||
//// Right portion
|
||||
mainPanel.add(panel, "aligny 20%");
|
||||
|
@ -14,6 +14,7 @@ import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EventObject;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JButton;
|
||||
@ -93,106 +94,111 @@ public class FreeformFinSetConfig extends FinSetConfig {
|
||||
|
||||
private JPanel generalPane() {
|
||||
|
||||
DoubleModel m;
|
||||
JSpinner spin;
|
||||
|
||||
|
||||
JPanel mainPanel = new JPanel(new MigLayout("fill"));
|
||||
|
||||
JPanel panel = new JPanel(new MigLayout("fill, gap rel unrel", "[][65lp::][30lp::]", ""));
|
||||
|
||||
|
||||
|
||||
//// Number of fins:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Numberoffins")));
|
||||
|
||||
IntegerModel im = new IntegerModel(component, "FinCount", 1, 8);
|
||||
|
||||
spin = new JSpinner(im.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx, wrap");
|
||||
|
||||
|
||||
//// Base rotation
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Finrotation")));
|
||||
|
||||
m = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
|
||||
|
||||
|
||||
|
||||
//// Fin cant
|
||||
JLabel label = new JLabel(trans.get("FreeformFinSetCfg.lbl.Fincant"));
|
||||
//// The angle that the fins are canted with respect to the rocket body.
|
||||
label.setToolTipText(trans.get("FreeformFinSetCfg.lbl.ttip.Fincant"));
|
||||
panel.add(label);
|
||||
|
||||
m = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE, -FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(-FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS)), "w 100lp, wrap 40lp");
|
||||
|
||||
|
||||
|
||||
//// Position
|
||||
//// Position relative to:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Posrelativeto")));
|
||||
|
||||
JComboBox<AxialMethod> positionCombo = new JComboBox<>( new EnumModel<>(component, "AxialMethod", AxialMethod.axialOffsetMethods ));
|
||||
panel.add(positionCombo, "spanx 3, growx, wrap");
|
||||
//// plus
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.plus")), "right");
|
||||
|
||||
m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), new DoubleModel(component.getParent(), "Length"))), "w 100lp, wrap");
|
||||
|
||||
|
||||
|
||||
{ //// Number of fins:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Numberoffins")));
|
||||
|
||||
final IntegerModel finCountModel = new IntegerModel(component, "FinCount", 1, 8);
|
||||
|
||||
JSpinner spin = new JSpinner(finCountModel.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx, wrap");
|
||||
}
|
||||
|
||||
{ //// Base rotation
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Finrotation")));
|
||||
|
||||
DoubleModel m = new DoubleModel(component, "BaseRotation", UnitGroup.UNITS_ANGLE);
|
||||
|
||||
JSpinner spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
|
||||
}
|
||||
|
||||
|
||||
{ //// Fin cant
|
||||
JLabel label = new JLabel(trans.get("FreeformFinSetCfg.lbl.Fincant"));
|
||||
//// The angle that the fins are canted with respect to the rocket body.
|
||||
label.setToolTipText(trans.get("FreeformFinSetCfg.lbl.ttip.Fincant"));
|
||||
panel.add(label);
|
||||
|
||||
final DoubleModel cantAngleModel = new DoubleModel(component, "CantAngle", UnitGroup.UNITS_ANGLE, -FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS);
|
||||
|
||||
final JSpinner cantAngleSpinner = new JSpinner(cantAngleModel.getSpinnerModel());
|
||||
cantAngleSpinner.setEditor(new SpinnerEditor(cantAngleSpinner));
|
||||
panel.add(cantAngleSpinner, "growx");
|
||||
|
||||
panel.add(new UnitSelector(cantAngleModel), "growx");
|
||||
panel.add(new BasicSlider(cantAngleModel.getSliderModel(-FinSet.MAX_CANT_RADIANS, FinSet.MAX_CANT_RADIANS)), "w 100lp, wrap 40lp");
|
||||
}
|
||||
|
||||
|
||||
{ //// Position
|
||||
//// Position relative to:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Posrelativeto")));
|
||||
|
||||
|
||||
final EnumModel<AxialMethod> axialMethodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods);
|
||||
final JComboBox<AxialMethod> axialMethodCombo = new JComboBox<AxialMethod>(axialMethodModel);
|
||||
panel.add(axialMethodCombo, "spanx 3, growx, wrap");
|
||||
|
||||
//// plus
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.plus")), "right");
|
||||
|
||||
final DoubleModel axialOffsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
final JSpinner axialOffsetSpinner = new JSpinner(axialOffsetModel.getSpinnerModel());
|
||||
axialOffsetSpinner.setEditor(new SpinnerEditor(axialOffsetSpinner));
|
||||
panel.add(axialOffsetSpinner, "growx");
|
||||
|
||||
panel.add(new UnitSelector(axialOffsetModel), "growx");
|
||||
panel.add(new BasicSlider(axialOffsetModel.getSliderModel(new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE), new DoubleModel(component.getParent(), "Length"))), "w 100lp, wrap");
|
||||
|
||||
axialMethodCombo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
axialOffsetModel.stateChanged(new EventObject(e));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
mainPanel.add(panel, "aligny 20%");
|
||||
mainPanel.add(new JSeparator(SwingConstants.VERTICAL), "growy, height 150lp");
|
||||
|
||||
|
||||
panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
|
||||
|
||||
|
||||
//// Cross section
|
||||
//// Fin cross section:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.FincrossSection")), "span, split");
|
||||
JComboBox<FinSet.CrossSection> sectionCombo = new JComboBox<>(new EnumModel<FinSet.CrossSection>(component, "CrossSection"));
|
||||
panel.add(sectionCombo, "growx, wrap unrel");
|
||||
|
||||
|
||||
//// Thickness:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Thickness")));
|
||||
|
||||
m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 30lp");
|
||||
|
||||
|
||||
//// Material
|
||||
panel.add(materialPanel(Material.Type.BULK), "span, wrap");
|
||||
|
||||
panel.add(filletMaterialPanel(), "span, wrap");
|
||||
|
||||
|
||||
{ //// Cross section
|
||||
//// Fin cross section:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.FincrossSection")), "span, split");
|
||||
JComboBox<FinSet.CrossSection> sectionCombo = new JComboBox<>(new EnumModel<FinSet.CrossSection>(component, "CrossSection"));
|
||||
panel.add(sectionCombo, "growx, wrap unrel");
|
||||
|
||||
|
||||
//// Thickness:
|
||||
panel.add(new JLabel(trans.get("FreeformFinSetCfg.lbl.Thickness")));
|
||||
|
||||
final DoubleModel m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
final JSpinner spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 30lp");
|
||||
}
|
||||
|
||||
{ //// Material
|
||||
panel.add(materialPanel(Material.Type.BULK), "span, wrap");
|
||||
panel.add(filletMaterialPanel(), "span, wrap");
|
||||
}
|
||||
|
||||
mainPanel.add(panel, "aligny 20%");
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.EventObject;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
@ -161,18 +164,26 @@ public class TrapezoidFinSetConfig extends FinSetConfig {
|
||||
{//// Position relative to:
|
||||
panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.Posrelativeto")));
|
||||
|
||||
final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods);
|
||||
final JComboBox<AxialMethod> positionCombo = new JComboBox<AxialMethod>(methodModel);
|
||||
final EnumModel<AxialMethod> axialMethodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods );
|
||||
final JComboBox<AxialMethod> axialMethodCombo = new JComboBox<AxialMethod>( axialMethodModel );
|
||||
panel.add(axialMethodCombo, "spanx, growx, wrap");
|
||||
|
||||
panel.add(positionCombo, "spanx, growx, wrap");
|
||||
//// plus
|
||||
panel.add(new JLabel(trans.get("TrapezoidFinSetCfg.lbl.plus")), "right");
|
||||
|
||||
final DoubleModel axialOffsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
final JSpinner axialOffsetSpinner = new JSpinner(axialOffsetModel.getSpinnerModel());
|
||||
axialOffsetSpinner.setEditor(new SpinnerEditor(axialOffsetSpinner));
|
||||
|
||||
panel.add(axialOffsetSpinner, "growx");
|
||||
|
||||
axialMethodCombo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
axialOffsetModel.stateChanged(new EventObject(e));
|
||||
}
|
||||
});
|
||||
|
||||
panel.add(new UnitSelector(axialOffsetModel), "growx");
|
||||
panel.add(new BasicSlider(axialOffsetModel.getSliderModel(
|
||||
new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
|
||||
|
@ -1,6 +1,9 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.EventObject;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
@ -123,20 +126,27 @@ public class TubeFinSetConfig extends RocketComponentConfig {
|
||||
panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
|
||||
|
||||
//// Position relative to:
|
||||
panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto")));
|
||||
|
||||
final EnumModel<AxialMethod> methodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods );
|
||||
final JComboBox<AxialMethod> methodCombo = new JComboBox<AxialMethod>( methodModel );
|
||||
panel.add(methodCombo, "spanx, growx, wrap");
|
||||
panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.Posrelativeto"))); // (note re-uses the label from LaunchLug, because they're the same
|
||||
|
||||
final EnumModel<AxialMethod> axialMethodModel = new EnumModel<AxialMethod>(component, "AxialMethod", AxialMethod.axialOffsetMethods );
|
||||
final JComboBox<AxialMethod> axialMethodCombo = new JComboBox<AxialMethod>( axialMethodModel );
|
||||
panel.add(axialMethodCombo, "spanx, growx, wrap");
|
||||
|
||||
//// plus
|
||||
panel.add(new JLabel(trans.get("LaunchLugCfg.lbl.plus")), "right");
|
||||
|
||||
m = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
final DoubleModel axialOffsetModel = new DoubleModel(component, "AxialOffset", UnitGroup.UNITS_LENGTH);
|
||||
spin = new JSpinner(axialOffsetModel.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
|
||||
axialMethodCombo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
axialOffsetModel.stateChanged(new EventObject(e));
|
||||
}
|
||||
});
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(
|
||||
new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
|
||||
|
Loading…
x
Reference in New Issue
Block a user