From f8993e89db91c5b352302fda36fd097a2113a81a Mon Sep 17 00:00:00 2001 From: Billy Olsen Date: Sun, 1 Mar 2020 18:24:54 -0700 Subject: [PATCH] Add rail button presets options Allow rail buttons to define presets. This change doesn't actually add any default presets to the library, but enables the ability to add some preset options for rail buttons. Partially Closes #554 Signed-off-by: Billy Olsen --- .../sf/openrocket/preset/ComponentPreset.java | 4 + .../preset/ComponentPresetFactory.java | 29 +++ .../preset/loader/RailButtonLoader.java | 32 +++ .../preset/xml/OpenRocketComponentDTO.java | 1 + .../preset/xml/OpenRocketComponentSaver.java | 2 + .../openrocket/preset/xml/RailButtonDTO.java | 132 ++++++++++++ .../gui/preset/PresetEditorDialog.java | 197 ++++++++++++++++++ 7 files changed, 397 insertions(+) create mode 100644 core/src/net/sf/openrocket/preset/loader/RailButtonLoader.java create mode 100644 core/src/net/sf/openrocket/preset/xml/RailButtonDTO.java diff --git a/core/src/net/sf/openrocket/preset/ComponentPreset.java b/core/src/net/sf/openrocket/preset/ComponentPreset.java index 80ac45135..debd4bae3 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPreset.java +++ b/core/src/net/sf/openrocket/preset/ComponentPreset.java @@ -200,6 +200,8 @@ public class ComponentPreset implements Comparable, Serializabl public final static TypedKey LINE_LENGTH = new TypedKey("LineLength", Double.class, UnitGroup.UNITS_LENGTH); public final static TypedKey LINE_MATERIAL = new TypedKey("LineMaterial", Material.class); public final static TypedKey IMAGE = new TypedKey("Image", byte[].class); + public final static TypedKey STANDOFF_HEIGHT = new TypedKey("StandoffHeight", Double.class, UnitGroup.UNITS_LENGTH); + public final static TypedKey FLANGE_HEIGHT = new TypedKey("FlangeHeight", Double.class, UnitGroup.UNITS_LENGTH); public final static List> ORDERED_KEY_LIST = Collections.unmodifiableList(Arrays.> asList( MANUFACTURER, @@ -215,6 +217,8 @@ public class ComponentPreset implements Comparable, Serializabl AFT_SHOULDER_LENGTH, FORE_SHOULDER_DIAMETER, FORE_SHOULDER_LENGTH, + STANDOFF_HEIGHT, + FLANGE_HEIGHT, SHAPE, THICKNESS, FILLED, diff --git a/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java b/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java index 7d2677b34..77ecc3691 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java +++ b/core/src/net/sf/openrocket/preset/ComponentPresetFactory.java @@ -5,6 +5,7 @@ import net.sf.openrocket.database.Databases; import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.rocketcomponent.NoseCone; +import net.sf.openrocket.rocketcomponent.RailButton; import net.sf.openrocket.rocketcomponent.Transition; public abstract class ComponentPresetFactory { @@ -67,6 +68,10 @@ public abstract class ComponentPresetFactory { makeBodyTube(exceptions, preset); break; } + case RAIL_BUTTON: { + makeRailButton(exceptions, preset); + break; + } case STREAMER: { makeStreamer(exceptions, preset); break; @@ -108,6 +113,30 @@ public abstract class ComponentPresetFactory { } + private static void makeRailButton(InvalidComponentPresetException exceptions, ComponentPreset preset) throws InvalidComponentPresetException { + + checkRequiredFields(exceptions, preset, HEIGHT); + checkRequiredFields(exceptions, preset, OUTER_DIAMETER); + checkRequiredFields(exceptions, preset, INNER_DIAMETER); + checkRequiredFields(exceptions, preset, FLANGE_HEIGHT); + checkRequiredFields(exceptions, preset, STANDOFF_HEIGHT); + + if (preset.has(MASS)) { + double mass = preset.get(MASS); + RailButton rb = new RailButton(); + rb.loadPreset(preset); + double density = mass / rb.getComponentVolume(); + + String materialName = "RailButtonCustom"; + if (preset.has(MATERIAL)) { + materialName = preset.get(MATERIAL).getName(); + } + + Material m = Databases.findMaterial(Material.Type.BULK, materialName, density); + preset.put(MATERIAL, m); + } + } + private static void makeNoseCone(InvalidComponentPresetException exceptions, ComponentPreset preset) { checkRequiredFields(exceptions, preset, LENGTH, SHAPE, AFT_OUTER_DIAMETER); diff --git a/core/src/net/sf/openrocket/preset/loader/RailButtonLoader.java b/core/src/net/sf/openrocket/preset/loader/RailButtonLoader.java new file mode 100644 index 000000000..5980ed0c5 --- /dev/null +++ b/core/src/net/sf/openrocket/preset/loader/RailButtonLoader.java @@ -0,0 +1,32 @@ +package net.sf.openrocket.preset.loader; + +import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.preset.ComponentPreset.Type; + +import java.io.File; + +public class RailButtonLoader extends BaseComponentLoader { + + public RailButtonLoader(MaterialHolder materials, File theBasePath) { + super(materials, theBasePath); + fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER)); + fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER)); + fileColumns.add(new DoubleUnitColumnParser("Height","Units",ComponentPreset.HEIGHT)); + fileColumns.add(new DoubleUnitColumnParser("Flange Height", "Units", ComponentPreset.FLANGE_HEIGHT)); + fileColumns.add(new DoubleUnitColumnParser("Standoff Height", "Units", ComponentPreset.STANDOFF_HEIGHT)); + + } + + + @Override + protected Type getComponentPresetType() { + return ComponentPreset.Type.RAIL_BUTTON; + } + + + @Override + protected RocksimComponentFileType getFileType() { + return RocksimComponentFileType.LAUNCH_LUG; + } + +} diff --git a/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentDTO.java b/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentDTO.java index 69da4e859..7294019c0 100644 --- a/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentDTO.java +++ b/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentDTO.java @@ -39,6 +39,7 @@ public class OpenRocketComponentDTO { @XmlElementRef(name = "CenteringRings", type = CenteringRingDTO.class), @XmlElementRef(name = "EngineBlocks", type = EngineBlockDTO.class), @XmlElementRef(name = "LaunchLugs", type = LaunchLugDTO.class), + @XmlElementRef(name = "RailButtons", type = RailButtonDTO.class), @XmlElementRef(name = "Streamers", type = StreamerDTO.class), @XmlElementRef(name = "Parachutes", type = ParachuteDTO.class)}) private List components = new ArrayList(); diff --git a/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentSaver.java b/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentSaver.java index 282e0b902..191a69a6c 100644 --- a/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentSaver.java +++ b/core/src/net/sf/openrocket/preset/xml/OpenRocketComponentSaver.java @@ -198,6 +198,8 @@ public class OpenRocketComponentSaver { return new EngineBlockDTO(thePreset); case LAUNCH_LUG: return new LaunchLugDTO(thePreset); + case RAIL_BUTTON: + return new RailButtonDTO(thePreset); case STREAMER: return new StreamerDTO(thePreset); case PARACHUTE: diff --git a/core/src/net/sf/openrocket/preset/xml/RailButtonDTO.java b/core/src/net/sf/openrocket/preset/xml/RailButtonDTO.java new file mode 100644 index 000000000..ab42e38df --- /dev/null +++ b/core/src/net/sf/openrocket/preset/xml/RailButtonDTO.java @@ -0,0 +1,132 @@ + +package net.sf.openrocket.preset.xml; + +import net.sf.openrocket.preset.ComponentPreset; +import net.sf.openrocket.preset.ComponentPresetFactory; +import net.sf.openrocket.preset.InvalidComponentPresetException; +import net.sf.openrocket.preset.TypedPropertyMap; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +/** + * Body tube preset XML handler. + */ +@XmlRootElement(name = "RailButton") +@XmlAccessorType(XmlAccessType.FIELD) +public class RailButtonDTO extends BaseComponentDTO { + + @XmlElement(name = "InsideDiameter") + private AnnotatedLengthDTO insideDiameter; + @XmlElement(name = "OutsideDiameter") + private AnnotatedLengthDTO outsideDiameter; + @XmlElement(name = "Height") + private AnnotatedLengthDTO height; + @XmlElement(name = "StandoffHeight") + private AnnotatedLengthDTO standoffHeight; + @XmlElement(name = "FlangeHeight") + private AnnotatedLengthDTO flangeHeight; + + /** + * Default constructor. + */ + public RailButtonDTO() { + } + + /** + * Most-useful constructor that maps a RailButton preset to a RailButtonDTO. + * + * @param preset the preset + * + * @throws net.sf.openrocket.util.BugException thrown if the expected body tube keys are not in the preset + */ + public RailButtonDTO(final ComponentPreset preset) { + super(preset); + setInsideDiameter(preset.get(ComponentPreset.INNER_DIAMETER)); + setOutsideDiameter(preset.get(ComponentPreset.OUTER_DIAMETER)); + setHeight(preset.get(ComponentPreset.HEIGHT)); + setStandoffHeight(preset.get(ComponentPreset.STANDOFF_HEIGHT)); + setFlangeHeight(preset.get(ComponentPreset.FLANGE_HEIGHT)); + } + + public double getInsideDiameter() { + return insideDiameter.getValue(); + } + + public void setInsideDiameter( final AnnotatedLengthDTO theLength ) { + insideDiameter = theLength; + } + + public void setInsideDiameter(final double theId) { + insideDiameter = new AnnotatedLengthDTO(theId); + } + + public double getOutsideDiameter() { + return outsideDiameter.getValue(); + } + + public void setOutsideDiameter(final AnnotatedLengthDTO theOd) { + outsideDiameter = theOd; + } + + public void setOutsideDiameter(final double theOd) { + outsideDiameter = new AnnotatedLengthDTO(theOd); + } + + public double getHeight() { + return height.getValue(); + } + + public void setHeight(final AnnotatedLengthDTO theHeight) { + height = theHeight; + } + + public void setHeight(final double theHeight) { + height = new AnnotatedLengthDTO(theHeight); + } + + public double getStandoffHeight() { + return standoffHeight.getValue(); + } + + public void setStandoffHeight(final AnnotatedLengthDTO theStandoffHeight) { + standoffHeight = theStandoffHeight; + } + + public void setStandoffHeight(final double theStandoffHeight) { + standoffHeight = new AnnotatedLengthDTO(theStandoffHeight); + } + + public double getFlangeHeight() { + return flangeHeight.getValue(); + } + + public void setFlangeHeight(final AnnotatedLengthDTO theFlangeHeight) { + flangeHeight = theFlangeHeight; + } + + public void setFlangeHeight(final double theFlangeHeight) { + flangeHeight = new AnnotatedLengthDTO(theFlangeHeight); + } + + @Override + public ComponentPreset asComponentPreset(java.util.List materials) throws InvalidComponentPresetException { + return asComponentPreset(ComponentPreset.Type.RAIL_BUTTON, materials); + } + + public ComponentPreset asComponentPreset(ComponentPreset.Type type, List materials) throws InvalidComponentPresetException { + TypedPropertyMap props = new TypedPropertyMap(); + addProps(props, materials); + props.put(ComponentPreset.INNER_DIAMETER, this.getInsideDiameter()); + props.put(ComponentPreset.OUTER_DIAMETER, this.getOutsideDiameter()); + props.put(ComponentPreset.HEIGHT, this.getHeight()); + props.put(ComponentPreset.STANDOFF_HEIGHT, this.getStandoffHeight()); + props.put(ComponentPreset.FLANGE_HEIGHT, this.getFlangeHeight()); + props.put(ComponentPreset.TYPE, type); + + return ComponentPresetFactory.create(props); + } +} diff --git a/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java b/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java index 1689c08df..60ec9f6e4 100644 --- a/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java +++ b/swing/src/net/sf/openrocket/gui/preset/PresetEditorDialog.java @@ -168,6 +168,17 @@ public class PresetEditorDialog extends JDialog implements ItemListener { private ImageIcon llImage; private JButton llImageBtn; + private JTextField rbPartNoTextField; + private JTextField rbDescTextField; + private DoubleModel rbOuterDia; + private DoubleModel rbInnerDia; + private DoubleModel rbHeight; + private DoubleModel rbStandoffHeight; + private DoubleModel rbFlangeHeight; + private DoubleModel rbMass; + private ImageIcon rbImage; + private JButton rbImageBtn; + private JTextField stPartNoTextField; private JTextField stDescTextField; private DoubleModel stThickness; @@ -204,6 +215,7 @@ public class PresetEditorDialog extends JDialog implements ItemListener { private static final String BULKHEAD_KEY = "Bulkhead.Bulkhead"; private static final String EB_KEY = "ComponentIcons.Engineblock"; private static final String LAUNCH_LUG_KEY = "ComponentIcons.Launchlug"; + private static final String RAIL_BUTTON_KEY = "ComponentIcons.RailButton"; private static final String STREAMER_KEY = "ComponentIcons.Streamer"; private static final String PARACHUTE_KEY = "ComponentIcons.Parachute"; @@ -217,6 +229,7 @@ public class PresetEditorDialog extends JDialog implements ItemListener { componentMap.put(trans.get(BULKHEAD_KEY), "BULKHEAD"); componentMap.put(trans.get(EB_KEY), "ENGINEBLOCK"); componentMap.put(trans.get(LAUNCH_LUG_KEY), "LAUNCHLUG"); + componentMap.put(trans.get(RAIL_BUTTON_KEY), "RAILBUTTON"); componentMap.put(trans.get(PARACHUTE_KEY), "PARACHUTE"); componentMap.put(trans.get(STREAMER_KEY), "STREAMER"); } @@ -961,6 +974,103 @@ public class PresetEditorDialog extends JDialog implements ItemListener { }); } + // Railbutton + { + JPanel rbPanel = new JPanel(); + componentOverlayPanel.add(rbPanel, "RAILBUTTON"); + rbPanel.setLayout(new MigLayout("", "[][grow][][grow]", "[][][][]")); + JLabel rbPartNoLabel = new JLabel("Part No:"); + rbPanel.add(rbPartNoLabel, "cell 0 0,alignx left"); + + rbPartNoTextField = new JTextField(); + rbPanel.add(rbPartNoTextField, "cell 1 0,growx"); + rbPartNoTextField.setColumns(10); + + JLabel rbDescLabel = new JLabel("Description:"); + rbPanel.add(rbDescLabel, "cell 3 0,alignx left"); + + rbDescTextField = new JTextField(); + rbPanel.add(rbDescTextField, "cell 4 0,growx"); + rbDescTextField.setColumns(10); + + JLabel rbOuterDiaLabel = new JLabel("Outer Dia.:"); + rbPanel.add(rbOuterDiaLabel, "cell 0 1,alignx left"); + + rbOuterDia = new DoubleModel(0, UnitGroup.UNITS_LENGTH, 0); + JSpinner spin = new JSpinner(rbOuterDia.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + rbPanel.add(spin, "cell 1 1, growx"); + rbPanel.add(new UnitSelector(rbOuterDia), "growx"); + + JLabel rbMassLabel = new JLabel("Mass:"); + rbPanel.add(rbMassLabel, "cell 3 1,alignx left"); + + rbMass = new DoubleModel(0, UnitGroup.UNITS_MASS, 0); + spin = new JSpinner(rbMass.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + rbPanel.add(spin, "cell 4 1, growx"); + rbPanel.add(new UnitSelector(llMass), "w 34lp!"); + + JLabel rbInnerDiaLabel = new JLabel("Inner Dia.:"); + rbPanel.add(rbInnerDiaLabel, "cell 0 2,alignx left"); + + rbInnerDia = new DoubleModel(0, UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(rbInnerDia.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + rbPanel.add(spin, "cell 1 2, growx"); + rbPanel.add(new UnitSelector(rbInnerDia), "growx"); + + JLabel rbHeightLabel = new JLabel("Height:"); + rbPanel.add(rbHeightLabel, "cell 3 2,alignx left"); + + rbHeight = new DoubleModel(0, UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(rbHeight.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + rbPanel.add(spin, "cell 4 2, growx"); + rbPanel.add(new UnitSelector(rbHeight), "w 34lp!"); + + JLabel rbStandoffLabel = new JLabel("Standoff:"); + rbPanel.add(rbStandoffLabel, "cell 0 3,alignx left"); + + rbStandoffHeight = new DoubleModel(0, UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(rbStandoffHeight.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + rbPanel.add(spin, "cell 1 3, growx"); + rbPanel.add(new UnitSelector(rbStandoffHeight), "growx"); + + JLabel rbFlangeLabel = new JLabel("Flange:"); + rbPanel.add(rbFlangeLabel, "cell 3 3,alignx left"); + + rbFlangeHeight = new DoubleModel(0, UnitGroup.UNITS_LENGTH, 0); + spin = new JSpinner(rbFlangeHeight.getSpinnerModel()); + spin.setEditor(new SpinnerEditor(spin)); + rbPanel.add(spin, "cell 4 3, growx"); + rbPanel.add(new UnitSelector(rbFlangeHeight), "w 34lp!"); + + JPanel panel = new JPanel(); + panel.setMinimumSize(new Dimension(200, 200)); + rbPanel.add(panel, "cell 4 4"); + panel.setLayout(null); + rbImageBtn = new JButton("No Image"); + rbImageBtn.setMaximumSize(new Dimension(75, 75)); + rbImageBtn.setMinimumSize(new Dimension(75, 75)); + panel.add(rbImageBtn); + rbImageBtn.setBounds(new Rectangle(6, 6, 132, 145)); + + rbImageBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent e) { + int returnVal = imageChooser.showOpenDialog(PresetEditorDialog.this); + + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = imageChooser.getSelectedFile(); + rbImage = scaleImage(new ImageIcon(file.getAbsolutePath()).getImage(), 155); + rbImageBtn.setIcon(rbImage); + } + } + }); + } + { JPanel stPanel = new JPanel(); componentOverlayPanel.add(stPanel, "STREAMER"); @@ -1188,6 +1298,7 @@ public class PresetEditorDialog extends JDialog implements ItemListener { cb.addItem(trans.get(TRANSITION_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.TRANSITION)); cb.addItem(trans.get(TUBE_COUPLER_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.TUBE_COUPLER)); cb.addItem(trans.get(LAUNCH_LUG_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.LAUNCH_LUG)); + cb.addItem(trans.get(RAIL_BUTTON_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.RAIL_BUTTON)); cb.addItem(trans.get(PARACHUTE_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.PARACHUTE)); cb.addItem(trans.get(STREAMER_KEY), preset != null && !preset.get(ComponentPreset.TYPE).equals(ComponentPreset.Type.STREAMER)); } @@ -1447,6 +1558,40 @@ public class PresetEditorDialog extends JDialog implements ItemListener { llImageBtn.setIcon(llImage); } break; + case RAIL_BUTTON: + typeCombo.setSelectedItem(trans.get(RAIL_BUTTON_KEY)); + rbDescTextField.setText(preset.get(ComponentPreset.DESCRIPTION)); + if (preset.has(ComponentPreset.INNER_DIAMETER)) { + rbInnerDia.setValue(preset.get(ComponentPreset.INNER_DIAMETER)); + rbInnerDia.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); + } + if (preset.has(ComponentPreset.OUTER_DIAMETER)) { + rbOuterDia.setValue(preset.get(ComponentPreset.OUTER_DIAMETER)); + rbOuterDia.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); + } + if (preset.has(ComponentPreset.HEIGHT)) { + rbHeight.setValue(preset.get(ComponentPreset.HEIGHT)); + rbHeight.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); + } + if (preset.has(ComponentPreset.STANDOFF_HEIGHT)) { + rbStandoffHeight.setValue(preset.get(ComponentPreset.STANDOFF_HEIGHT)); + rbStandoffHeight.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); + } + if (preset.has(ComponentPreset.FLANGE_HEIGHT)) { + rbFlangeHeight.setValue(preset.get(ComponentPreset.FLANGE_HEIGHT)); + rbFlangeHeight.setCurrentUnit(UnitGroup.UNITS_LENGTH.getDefaultUnit()); + } + if (preset.has(ComponentPreset.MASS)) { + rbMass.setValue(preset.get(ComponentPreset.MASS)); + rbMass.setCurrentUnit(UnitGroup.UNITS_MASS.getDefaultUnit()); + } + + rbPartNoTextField.setText(preset.get(ComponentPreset.PARTNO)); + if (preset.has(ComponentPreset.IMAGE)) { + rbImage = new ImageIcon(byteArrayToImage(preset.get(ComponentPreset.IMAGE))); + rbImageBtn.setIcon(llImage); + } + break; case PARACHUTE: setMaterial(materialChooser, preset, matHolder, Material.Type.SURFACE, ComponentPreset.MATERIAL); typeCombo.setSelectedItem(trans.get(PARACHUTE_KEY)); @@ -1579,6 +1724,12 @@ public class PresetEditorDialog extends JDialog implements ItemListener { clearLaunchLug(); } } + else if (type.equals(trans.get(RAIL_BUTTON_KEY))) { + result = extractRailButton(); + if (result != null) { + clearRailButton(); + } + } else if (type.equals(trans.get(PARACHUTE_KEY))) { result = extractParachute(); if (result != null) { @@ -1954,6 +2105,52 @@ public class PresetEditorDialog extends JDialog implements ItemListener { llImageBtn.setIcon(null); } + public ComponentPreset extractRailButton() { + TypedPropertyMap props = new TypedPropertyMap(); + try { + props.put(ComponentPreset.TYPE, ComponentPreset.Type.RAIL_BUTTON); + props.put(ComponentPreset.OUTER_DIAMETER, rbOuterDia.getValue()); + props.put(ComponentPreset.INNER_DIAMETER, rbInnerDia.getValue()); + props.put(ComponentPreset.STANDOFF_HEIGHT, rbStandoffHeight.getValue()); + props.put(ComponentPreset.FLANGE_HEIGHT, rbFlangeHeight.getValue()); + props.put(ComponentPreset.DESCRIPTION, rbDescTextField.getText()); + props.put(ComponentPreset.PARTNO, rbPartNoTextField.getText()); + props.put(ComponentPreset.MANUFACTURER, Manufacturer.getManufacturer(mfgTextField.getText())); + props.put(ComponentPreset.HEIGHT, rbHeight.getValue()); + final Material material = (Material) materialChooser.getSelectedItem(); + if (material != null) { + props.put(ComponentPreset.MATERIAL, material); + } + else { + JOptionPane.showMessageDialog(null, "A material must be selected.", "Error", JOptionPane.ERROR_MESSAGE); + return null; + } + props.put(ComponentPreset.MASS, rbMass.getValue()); + if (llImage != null) { + props.put(ComponentPreset.IMAGE, imageToByteArray(rbImage.getImage())); + } + return ComponentPresetFactory.create(props); + } catch (NumberFormatException nfe) { + JOptionPane.showMessageDialog(null, "Could not convert rail button attribute.", "Error", JOptionPane.ERROR_MESSAGE); + } catch (InvalidComponentPresetException e) { + JOptionPane.showMessageDialog(null, craftErrorMessage(e, "Mandatory rail button attribute not set."), "Error", JOptionPane.ERROR_MESSAGE); + } + return null; + } + + private void clearRailButton() { + rbOuterDia.setValue(0); + rbInnerDia.setValue(0); + rbDescTextField.setText(""); + rbPartNoTextField.setText(""); + rbFlangeHeight.setValue(0); + rbHeight.setValue(0); + rbStandoffHeight.setValue(0); + rbMass.setValue(0); + rbImage = null; + rbImageBtn.setIcon(null); + } + public ComponentPreset extractParachute() { TypedPropertyMap props = new TypedPropertyMap(); try {