Fin import updates
authorplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 17 Mar 2012 15:58:41 +0000 (15:58 +0000)
committerplaa <plaa@180e2498-e6e9-4542-8430-84ac67f01cd8>
Sat, 17 Mar 2012 15:58:41 +0000 (15:58 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@461 180e2498-e6e9-4542-8430-84ac67f01cd8

core/README.TXT
core/resources/l10n/messages.properties
core/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java
core/src/net/sf/openrocket/gui/dialogs/AboutDialog.java
core/src/net/sf/openrocket/gui/util/CustomFinImporter.java
core/src/net/sf/openrocket/gui/util/FileHelper.java
core/web/html/download.html
core/web/html/index.html
core/web/htp/htp.rsp
core/web/htp/news.htp

index 86467aa53cc685a965f32aea214e404dba401b06..b2c66f0fe4796d0325feba5cb68571829ef04c1e 100644 (file)
@@ -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:
index 19b13442e3b3e39294390c7e34d9fbbcbe5a71a7..4ffdbd98f9ce70a25e4d4e3e62da4da0bcd74e2d 100644 (file)
@@ -58,9 +58,6 @@ RocketPanel.lbl.infoMessage = <html>Click to select &nbsp;&nbsp; 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.
 
index 81f118cf4ad7c969c5182e7ad3f3811391b82d0d..af4c7bf4c4bb2e5572c7cffba1bca6dcf796e40e 100644 (file)
@@ -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();
index 74600503fe8f998e1fcdf388b7f495ed264d2471..1bad92f0dff7bc815b51eec4c2e77029683e7274 100644 (file)
@@ -32,7 +32,8 @@ public class AboutDialog extends JDialog {
                        "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>" +
index 09eac8fb4fd7ebbeedcbb2c875b93763d469f536..1d29b21633840f2a3f1364a981561c0071f304cd 100644 (file)
@@ -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)
index 2edbb362ee8896b4e372042e8f1372b508fd3c44..860379ed48bdb4f962cb973e7bdc9f33929eaac4 100644 (file)
@@ -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);
+       }
        
        
        /**
index 4284bbdbe09b86c6292998a5ecf48605d0f171e0..4418d3c5b52b8dfbc5f40b3ec5ce15555d882fd4 100644 (file)
@@ -59,7 +59,8 @@
     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>
index 0489dd6040e75217844205556f35ddf72252f010..c42a1b1bf99319f3eae2ea39eb37827203973571 100644 (file)
     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>
index a53a702feb72dcd01af832c7a7b090039094719a..81f6beb0f0311a44910b3e6125f02243db1a861f 100644 (file)
@@ -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
index 675482b3523d87d849f108de8d4ac1079191313a..be4153e21ef800766931d54604d289cd0b364511 100644 (file)
@@ -23,7 +23,8 @@
     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>