Doug Pedrick, support for RockSim designs, printing
Kevin Ruland, Android version
Richard Graham, geodetic computations
+Jason Blood, freeform fin set import
Boris du Reau, internationalization
Translations contributed by:
! BasicFrame
-BasicFrame.SimpleFileFilter1 = All rocket designs (*.ork; *.rkt)
-BasicFrame.SimpleFileFilter2 = OpenRocket designs (*.ork)
-BasicFrame.SimpleFileFilter3 = RockSim designs (*.rkt)
BasicFrame.tab.Rocketdesign = Rocket design
BasicFrame.tab.Flightsim = Flight simulations
BasicFrame.title.Addnewcomp = Add new component
! General file type names
-filetypes.pdf = PDF files
+filetypes.pdf = PDF files (*.pdf)
+BasicFrame.SimpleFileFilter1 = All rocket designs (*.ork; *.rkt)
+BasicFrame.SimpleFileFilter2 = OpenRocket designs (*.ork)
+BasicFrame.SimpleFileFilter3 = RockSim designs (*.rkt)
+filetypes.images = Image files
! About Dialog
! Custom Fin BMP Importer
-CustomFinImport.button.label = Import from BMP
-CustomFinImport.filter = Bitmap Files (*.bmp)
+CustomFinImport.button.label = Import from image
CustomFinImport.badFinImage = Invalid fin image. Must be a black and white image (black for the fin), not touching any side, except the bottom of the image, which is the base of the fin.
CustomFinImport.errorLoadingFile = Error loading file:
CustomFinImport.errorParsingFile = Error parsing fin image:
CustomFinImport.undo = Import freeform fin set
CustomFinImport.error.title = Error loading fin profile
CustomFinImport.error.badimage = Could not deduce fin shape from image.
+CustomFinImport.description = The image must be a black and white image (black for the fin), not touching any side, except the bottom of the image, which is the base of the fin.
import net.sf.openrocket.gui.adaptors.EnumModel;
import net.sf.openrocket.gui.adaptors.IntegerModel;
import net.sf.openrocket.gui.components.BasicSlider;
+import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.UnitSelector;
import net.sf.openrocket.gui.dialogs.ScaleDialog;
private void importImage() {
JFileChooser chooser = new JFileChooser();
-
- chooser.addChoosableFileFilter(FileHelper.BMP_FILE_FILTER);
+ chooser.setFileFilter(FileHelper.getImageFileFilter());
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory());
- int option = chooser.showOpenDialog(this);
+ JPanel desc = new JPanel(new MigLayout("fill, ins 0 para 0 para"));
+ desc.add(new DescriptionArea(trans.get("CustomFinImport.description"), 5, 0), "grow, wmin 150lp");
+ chooser.setAccessory(desc);
+
+ int option = chooser.showOpenDialog(this);
if (option == JFileChooser.APPROVE_OPTION) {
try {
}
-
@Override
public void updateFields() {
super.updateFields();
"Doug Pedrick (RockSim file format, printing)<br>" +
"Kevin Ruland (Android version)<br>" +
"Boris du Reau (internationalization, translation lead)<br>" +
- "Richard Graham (geodetic computations)<br><br>" +
+ "Richard Graham (geodetic computations)<br>" +
+ "Jason Blood (finset import)<br><br>" +
"<b>Translations by:</b><br><br>" +
"Tripoli France (French)<br>" +
"Stefan Lobas / ERIG e.V. (German)<br>" +
startX = -1;
facing = FacingDirections.UP;
- if (validateImage(pic)) {
- points.add(Coordinate.NUL);
- loadFin(pic, points);
- } else {
+ if (!validateImage(pic)) {
throw new LocalizedIOException("CustomFinImport.error.badimage");
}
+ points.add(Coordinate.NUL);
+ loadFin(pic, points);
optimizePoints(points);
return points;
}
private boolean validateImage(BufferedImage pic) {
int height = pic.getHeight();
int width = pic.getWidth();
- Boolean bottomEdgeFound = false;
+ boolean bottomEdgeFound = false;
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
currentY = pic.getHeight() - 1;
do {
- if (CheckLeftIsFin(pic, currentX, currentY))
- RotateLeft();
- else if (CheckForwardIsFin(pic, currentX, currentY)) {
+ if (checkLeftIsFin(pic, currentX, currentY))
+ rotateLeft();
+ else if (checkForwardIsFin(pic, currentX, currentY)) {
// Do nothing
- } else if (CheckRightIsFin(pic, currentX, currentY))
- RotateRight();
+ } else if (checkRightIsFin(pic, currentX, currentY))
+ rotateRight();
else {
- TurnAround();
+ turnAround();
calledTurnedAround = true;
}
- MoveForward(pic);
+ moveForward(pic);
if (pixelIsFin(pic, currentX, currentY)) {
if (!calledTurnedAround) {
double x = (currentX - startX) * 0.001;
return false;
}
- private boolean CheckLeftIsFin(BufferedImage pic, int x, int y) {
+ private boolean checkLeftIsFin(BufferedImage pic, int x, int y) {
if (facing == FacingDirections.DOWN)
return pixelIsFin(pic, x + 1, y);
else if (facing == FacingDirections.UP)
return false;
}
- private Boolean CheckRightIsFin(BufferedImage pic, int x, int y) {
+ private boolean checkRightIsFin(BufferedImage pic, int x, int y) {
if (facing == FacingDirections.DOWN)
return pixelIsFin(pic, x - 1, y);
else if (facing == FacingDirections.UP)
return false;
}
- private boolean CheckForwardIsFin(BufferedImage pic, int x, int y) {
+ private boolean checkForwardIsFin(BufferedImage pic, int x, int y) {
if (facing == FacingDirections.DOWN)
return pixelIsFin(pic, x, y + 1);
else if (facing == FacingDirections.UP)
return false;
}
- private void RotateLeft() {
+ private void rotateLeft() {
if (facing == FacingDirections.UP)
facing = FacingDirections.LEFT;
else if (facing == FacingDirections.RIGHT)
facing = FacingDirections.DOWN;
}
- private void RotateRight() {
+ private void rotateRight() {
if (facing == FacingDirections.UP)
facing = FacingDirections.RIGHT;
else if (facing == FacingDirections.RIGHT)
facing = FacingDirections.UP;
}
- private void MoveForward(BufferedImage pic) {
+ private void moveForward(BufferedImage pic) {
if (facing == FacingDirections.UP) {
if (currentY > 0)
currentY--;
}
}
- private void TurnAround() {
+ private void turnAround() {
if (facing == FacingDirections.UP)
facing = FacingDirections.DOWN;
else if (facing == FacingDirections.DOWN)
import java.awt.Component;
import java.io.File;
import java.io.IOException;
+import java.util.Arrays;
+import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
public static final FileFilter CSV_FILE_FILTER =
new SimpleFileFilter(trans.get("SimExpPan.desc"), ".csv");
- /** File filter for BMP files (*.bmp) */
- public static final FileFilter BMP_FILE_FILTER =
- new SimpleFileFilter(trans.get("CustomFinImport.filter"), ".bmp");
-
-
}
- // public FileFilter getImageFileFilter() {
- // String[] extensions = ImageIO.getReaderFileSuffixes();
- //
- // }
+ public static FileFilter getImageFileFilter() {
+ String[] extensions = ImageIO.getReaderFileSuffixes();
+ for (int i = 0; i < extensions.length; i++) {
+ extensions[i] = extensions[i].toLowerCase();
+ }
+ Arrays.sort(extensions);
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(trans.get("filetypes.images"));
+ sb.append(" (");
+ for (int i = 0; i < extensions.length; i++) {
+ sb.append("*.").append(extensions[i]);
+ if (i < extensions.length - 1) {
+ sb.append("; ");
+ }
+ }
+ sb.append(")");
+
+ return new SimpleFileFilter(sb.toString(), extensions);
+ }
/**
stability data and motor files. The Android port is thanks to
work by Kevin Ruland.</p>
<p>Enhancements in the desktop version include saving designs in RKT
- format thanks to Doug Pedrick, configurable stage separation
+ format thanks to Doug Pedrick, freeform fin set import form images
+ by Jason Blood, configurable stage separation
events, guided help tours and displaying the computed motor
designation class. The application has also been translated to
Italian by Mauro Biasutti and Russian by the Sky Dart Team.</p>
stability data and motor files. The Android port is thanks to
work by Kevin Ruland.</p>
<p>Enhancements in the desktop version include saving designs in RKT
- format thanks to Doug Pedrick, configurable stage separation
+ format thanks to Doug Pedrick, freeform fin set import form images
+ by Jason Blood, configurable stage separation
events, guided help tours and displaying the computed motor
designation class. The application has also been translated to
Italian by Mauro Biasutti and Russian by the Sky Dart Team.</p>
documentation.htp ../html/documentation.html
license.htp ../html/license.html
contact.htp ../html/contact.html
-report.htp ../html/report.html
getinvolved.htp ../html/getinvolved.html
work by Kevin Ruland.</p>
<p>Enhancements in the desktop version include saving designs in RKT
- format thanks to Doug Pedrick, configurable stage separation
+ format thanks to Doug Pedrick, freeform fin set import form images
+ by Jason Blood, configurable stage separation
events, guided help tours and displaying the computed motor
designation class. The application has also been translated to
Italian by Mauro Biasutti and Russian by the Sky Dart Team.</p>