From ae88b93a2aa2c1817472637a28b20f48fe15b5d3 Mon Sep 17 00:00:00 2001 From: plaa Date: Sat, 17 Mar 2012 15:58:41 +0000 Subject: [PATCH] Fin import updates git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@461 180e2498-e6e9-4542-8430-84ac67f01cd8 --- core/README.TXT | 1 + core/resources/l10n/messages.properties | 13 ++++--- .../configdialog/FreeformFinSetConfig.java | 11 ++++-- .../openrocket/gui/dialogs/AboutDialog.java | 3 +- .../gui/util/CustomFinImporter.java | 37 +++++++++---------- .../sf/openrocket/gui/util/FileHelper.java | 31 +++++++++++----- core/web/html/download.html | 3 +- core/web/html/index.html | 3 +- core/web/htp/htp.rsp | 1 - core/web/htp/news.htp | 3 +- 10 files changed, 63 insertions(+), 43 deletions(-) diff --git a/core/README.TXT b/core/README.TXT index 86467aa5..b2c66f0f 100644 --- a/core/README.TXT +++ b/core/README.TXT @@ -28,6 +28,7 @@ Sampo Niskanen, main developer 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: diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 19b13442..4ffdbd98 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -58,9 +58,6 @@ RocketPanel.lbl.infoMessage = Click to select    Shift+click to ! 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 @@ -95,7 +92,11 @@ dlg.but.close = Close ! 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 @@ -1574,12 +1575,12 @@ GuidedTourSelectionDialog.btn.start = Start tour! ! 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. diff --git a/core/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/core/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index 81f118cf..af4c7bf4 100644 --- a/core/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/core/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -31,6 +31,7 @@ import net.sf.openrocket.gui.adaptors.DoubleModel; 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; @@ -259,12 +260,15 @@ public class FreeformFinSetConfig extends FinSetConfig { 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 { @@ -288,7 +292,6 @@ public class FreeformFinSetConfig extends FinSetConfig { } - @Override public void updateFields() { super.updateFields(); diff --git a/core/src/net/sf/openrocket/gui/dialogs/AboutDialog.java b/core/src/net/sf/openrocket/gui/dialogs/AboutDialog.java index 74600503..1bad92f0 100644 --- a/core/src/net/sf/openrocket/gui/dialogs/AboutDialog.java +++ b/core/src/net/sf/openrocket/gui/dialogs/AboutDialog.java @@ -32,7 +32,8 @@ public class AboutDialog extends JDialog { "Doug Pedrick (RockSim file format, printing)
" + "Kevin Ruland (Android version)
" + "Boris du Reau (internationalization, translation lead)
" + - "Richard Graham (geodetic computations)

" + + "Richard Graham (geodetic computations)
" + + "Jason Blood (finset import)

" + "Translations by:

" + "Tripoli France (French)
" + "Stefan Lobas / ERIG e.V. (German)
" + diff --git a/core/src/net/sf/openrocket/gui/util/CustomFinImporter.java b/core/src/net/sf/openrocket/gui/util/CustomFinImporter.java index 09eac8fb..1d29b216 100644 --- a/core/src/net/sf/openrocket/gui/util/CustomFinImporter.java +++ b/core/src/net/sf/openrocket/gui/util/CustomFinImporter.java @@ -33,13 +33,12 @@ public class CustomFinImporter { 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; } @@ -48,7 +47,7 @@ public class CustomFinImporter { 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) { @@ -83,18 +82,18 @@ public class CustomFinImporter { 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; @@ -119,7 +118,7 @@ public class CustomFinImporter { 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) @@ -132,7 +131,7 @@ public class CustomFinImporter { 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) @@ -145,7 +144,7 @@ public class CustomFinImporter { 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) @@ -158,7 +157,7 @@ public class CustomFinImporter { return false; } - private void RotateLeft() { + private void rotateLeft() { if (facing == FacingDirections.UP) facing = FacingDirections.LEFT; else if (facing == FacingDirections.RIGHT) @@ -169,7 +168,7 @@ public class CustomFinImporter { facing = FacingDirections.DOWN; } - private void RotateRight() { + private void rotateRight() { if (facing == FacingDirections.UP) facing = FacingDirections.RIGHT; else if (facing == FacingDirections.RIGHT) @@ -180,7 +179,7 @@ public class CustomFinImporter { facing = FacingDirections.UP; } - private void MoveForward(BufferedImage pic) { + private void moveForward(BufferedImage pic) { if (facing == FacingDirections.UP) { if (currentY > 0) currentY--; @@ -196,7 +195,7 @@ public class CustomFinImporter { } } - private void TurnAround() { + private void turnAround() { if (facing == FacingDirections.UP) facing = FacingDirections.DOWN; else if (facing == FacingDirections.DOWN) diff --git a/core/src/net/sf/openrocket/gui/util/FileHelper.java b/core/src/net/sf/openrocket/gui/util/FileHelper.java index 2edbb362..860379ed 100644 --- a/core/src/net/sf/openrocket/gui/util/FileHelper.java +++ b/core/src/net/sf/openrocket/gui/util/FileHelper.java @@ -3,7 +3,9 @@ package net.sf.openrocket.gui.util; 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; @@ -47,11 +49,6 @@ public final class FileHelper { 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"); - - @@ -60,10 +57,26 @@ public final class FileHelper { } - // 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); + } /** diff --git a/core/web/html/download.html b/core/web/html/download.html index 4284bbdb..4418d3c5 100644 --- a/core/web/html/download.html +++ b/core/web/html/download.html @@ -59,7 +59,8 @@ stability data and motor files. The Android port is thanks to work by Kevin Ruland.

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.

diff --git a/core/web/html/index.html b/core/web/html/index.html index 0489dd60..c42a1b1b 100644 --- a/core/web/html/index.html +++ b/core/web/html/index.html @@ -107,7 +107,8 @@ stability data and motor files. The Android port is thanks to work by Kevin Ruland.

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.

diff --git a/core/web/htp/htp.rsp b/core/web/htp/htp.rsp index a53a702f..81f6beb0 100644 --- a/core/web/htp/htp.rsp +++ b/core/web/htp/htp.rsp @@ -5,5 +5,4 @@ download.htp ../html/download.html 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 diff --git a/core/web/htp/news.htp b/core/web/htp/news.htp index 675482b3..be4153e2 100644 --- a/core/web/htp/news.htp +++ b/core/web/htp/news.htp @@ -23,7 +23,8 @@ work by Kevin Ruland.

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.

-- 2.47.2