Changeset 24189 in osm for applications/editors


Ignore:
Timestamp:
2010-11-11T11:30:42+01:00 (14 years ago)
Author:
extropy
Message:

pdfimport: progress bar and rotation autodetection.

Location:
applications/editors/josm/plugins/pdfimport/src/pdfimport
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/FilePlacement.java

    r24186 r24189  
    77import java.util.Properties;
    88
     9import org.openstreetmap.josm.data.Bounds;
    910import org.openstreetmap.josm.data.coor.EastNorth;
    1011import org.openstreetmap.josm.data.coor.LatLon;
     
    2223        public double minNorth = 0;
    2324        public double maxNorth = 10000;
    24        
     25
    2526        private AffineTransform transform;
    2627
     
    3839                this.minNorth = minNorth;
    3940                this.maxNorth = maxNorth;
    40         }       
     41        }
    4142
    4243        public Properties toProperties() {
     
    9899        }
    99100
    100        
     101
    101102        public String prepareTransform()
    102103        {
    103                 if (this.minX >= this.maxX){
     104                if (this.minX > this.maxX){
    104105                        return tr("Transform error: Min X must be smaller than max");
    105106                }
    106107
    107                 if (this.minY >= this.maxY){
     108                if (this.minY > this.maxY){
    108109                        return tr("Transform error: Min Y must be smaller than max");
    109110                }
    110                
    111                
     111
     112                if (Math.abs(this.minY - this.maxY) < 1 &&
     113                                Math.abs(this.minX - this.maxX) < 1)
     114                {
     115                        return tr("Transform error: Points too close");
     116                }
     117                else if (Math.abs(this.minX - this.maxX) < 1){
     118                        //x axis equal, assume same scale in both dimensions
     119                        if (this.minEast == this.maxEast){
     120                                //no rotation
     121                                this.maxX = this.minX + this.maxY - this.minY;
     122                                this.maxEast = this.minEast + this.maxNorth - this.minNorth;
     123                        } else if (this.minNorth == this.maxNorth) {
     124                                //needs rotated 90 degrees clockwise, or counter
     125                                this.maxX = this.minX + this.maxY - this.minY;
     126                                this.maxNorth = this.minNorth - (this.maxEast - this.minEast);
     127                        } else {
     128                                return tr("Transform error: Unsupported variant.");
     129                        }
     130                } else if (Math.abs(this.minY - this.maxY) < 1) {
     131                        //Y axis equal, assume same scale in both dimensions
     132                        if (this.minNorth == this.maxNorth){
     133                                //no rotation
     134                                this.maxY = this.minY + this.maxX - this.minX;
     135                                this.maxNorth = this.minNorth + this.maxEast - this.minEast;
     136                        } else if (this.minEast == this.maxEast){
     137                                //needs rotated 90 degrees clockwise, or counter
     138                                this.maxY = this.minY + this.maxX - this.minX;
     139                                this.maxEast = this.minEast - (this.maxNorth - this.minNorth);
     140                        } else {
     141                                return tr("Transform error: Unsupported variant.");
     142                        }
     143                } else {
     144                        return tr("Transform error: Unsupported variant.");
     145                }
     146
     147
    112148                if (this.minEast < this.maxEast && this.minNorth < this.maxNorth) {
    113149                        //no rotation
    114150                        this.transform = new AffineTransform();
    115                         this.transform.translate(-this.minX, -this.minY);
     151                        this.transform.translate(this.minEast, this.minNorth);
    116152                        this.transform.scale(
    117153                                        (this.maxEast - this.minEast) / (this.maxX - this.minX),
    118154                                        (this.maxNorth - this.minNorth) /  (this.maxY - this.minY));
    119                         this.transform.translate(this.minEast, this.minNorth);
     155                        this.transform.translate(-this.minX, -this.minY);
    120156                } else if (this.minEast < this.maxEast && this.minNorth > this.maxNorth) {
    121157                        //need to rotate 90 degrees counterclockwise
     158                        this.transform = new AffineTransform();
    122159                        //transform to 0..1, 0..1 range
    123                         this.transform.translate(-this.minX, -this.minY);
    124                         this.transform.scale(1/(this.maxX - this.minX), 1/(this.minY - this.maxY));
    125                        
     160                        this.transform.preConcatenate(AffineTransform.getTranslateInstance(-this.minX, -this.minY));
     161                        this.transform.preConcatenate(AffineTransform.getScaleInstance(1/(this.maxX - this.minX), 1/(this.minY - this.maxY)));
     162
    126163                        //rotate -90 degs around center
    127                         this.transform.quadrantRotate(-1,  0.5, 0.5);
    128                        
     164                        this.transform.preConcatenate(AffineTransform.getQuadrantRotateInstance(-1,  0.5, 0.5));
     165
    129166                        //transform back to target range
    130                         this.transform.scale(
     167                        this.transform.preConcatenate(AffineTransform.getScaleInstance(
    131168                                        (this.maxEast - this.minEast),
    132                                         (this.minNorth - this.maxNorth));
    133                         this.transform.translate(this.minEast, this.maxNorth);                 
     169                                        (this.minNorth - this.maxNorth)));
     170                        this.transform.preConcatenate(AffineTransform.getTranslateInstance(this.minEast, this.maxNorth));
    134171                } else if (this.minEast > this.maxEast && this.minNorth < this.maxNorth) {
    135172                        //need to rotate 90 degrees clockwise
     173                        this.transform = new AffineTransform();
    136174                        //transform to 0..1, 0..1 range
    137                         this.transform.translate(-this.minX, -this.minY);
    138                         this.transform.scale(1/(this.maxX - this.minX), 1/(this.maxY - this.minY));
    139                        
     175                        this.transform.preConcatenate(AffineTransform.getTranslateInstance(-this.minX, -this.minY));
     176                        this.transform.preConcatenate(AffineTransform.getScaleInstance(1/(this.maxX - this.minX), 1/(this.maxY - this.minY)));
     177
    140178                        //rotate 90 degs around center
    141                         this.transform.quadrantRotate(1, 0.5, 0.5);
    142                        
     179                        this.transform.preConcatenate(AffineTransform.getQuadrantRotateInstance(1, 0.5, 0.5));
     180
    143181                        //transform back to target range
    144                         this.transform.scale(
     182                        this.transform.preConcatenate(AffineTransform.getScaleInstance(
    145183                                        (this.minEast - this.maxEast),
    146                                         (this.maxNorth - this.minNorth));
    147                         this.transform.translate(this.maxEast, this.minNorth);                 
    148                 }               
     184                                        (this.maxNorth - this.minNorth)));
     185                        this.transform.preConcatenate(AffineTransform.getTranslateInstance(this.maxEast, this.minNorth));
     186                }
    149187                else
    150188                {
    151189                        return tr("Transform error: Unsupported orientation");
    152190                }
    153                
     191
    154192                return null;
    155                        
    156         }       
    157        
     193
     194        }
     195
    158196        EastNorth en = new EastNorth(0, 0);
    159197        Point2D src = new Point2D.Double();
     198
     199
     200        public Bounds getWorldBounds(PathOptimizer data) {
     201                LatLon min = this.tranformCoords(new Point2D.Double(data.bounds.getMinX(), data.bounds.getMinY()));
     202                LatLon max = this.tranformCoords(new Point2D.Double(data.bounds.getMaxX(), data.bounds.getMaxY()));
     203                return new Bounds(min, max);
     204        }
    160205
    161206        public LatLon tranformCoords(Point2D pt) {
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java

    r24186 r24189  
    2929import javax.swing.JOptionPane;
    3030import javax.swing.JPanel;
     31import javax.swing.JProgressBar;
    3132import javax.swing.JTextField;
    3233import javax.swing.SwingUtilities;
     
    4142import org.openstreetmap.josm.data.projection.Projection;
    4243import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     44import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     45import org.openstreetmap.josm.gui.progress.ProgressRenderer;
     46import org.openstreetmap.josm.gui.progress.SwingRenderingProgressMonitor;
    4347import org.openstreetmap.josm.io.OsmExporter;
    4448
    4549import pdfimport.pdfbox.PdfBoxParser;
    4650
    47 public class LoadPdfDialog extends JFrame {
     51public class LoadPdfDialog extends JFrame{
     52
     53        class LoadProgressRenderer implements ProgressRenderer{
     54                private final JProgressBar pBar;
     55                private String title = "";
     56
     57                public LoadProgressRenderer(JProgressBar pb)
     58                {
     59                        this.pBar =pb;
     60                        this.pBar.setMinimum(0);
     61                        this.pBar.setValue(0);
     62                        this.pBar.setMaximum(1);
     63                        this.pBar.setString("");
     64                        this.pBar.setStringPainted(true);
     65
     66                }
     67
     68                public void setCustomText(String message) {
     69                        this.pBar.setString(this.title + message);
     70                }
     71
     72                public void setIndeterminate(boolean indeterminate) {
     73                        this.pBar.setIndeterminate(indeterminate);
     74                }
     75
     76                public void setMaximum(int maximum) {
     77                        this.pBar.setMaximum(maximum);
     78                }
     79
     80                public void setTaskTitle(String taskTitle) {
     81                        this.title = taskTitle;
     82                        this.pBar.setString(this.title);
     83                }
     84
     85                public void setValue(int value) {
     86                        this.pBar.setValue(value);
     87                }
     88
     89                public void finish() {
     90                        this.pBar.setString(tr("Finished"));
     91                        this.pBar.setValue(this.pBar.getMaximum());
     92                }
     93
     94        }
    4895
    4996        private File fileName;
    5097        private PathOptimizer data;
    51         private final FilePlacement placement;
    5298        private OsmDataLayer layer;
    5399
     
    82128        private JCheckBox removeLargeObjectsCheck;
    83129        private JTextField removeLargeObjectsSize;
     130        private JProgressBar loadProgress;
     131        protected OsmDataLayer newLayer;
     132
     133        private LoadProgressRenderer progressRenderer;
     134
    84135
    85136        public LoadPdfDialog() {
    86 
    87                 this.placement = new FilePlacement();
    88 
    89137                this.buildGUI();
     138                FilePlacement pl = new FilePlacement();
     139                this.setPlacement(pl);
    90140                this.addListeners();
    91141                this.removeLayer();
     
    161211                this.showButton = new JButton(tr("Show target"));
    162212                this.cancelButton = new JButton(tr("Discard"));
    163 
    164                 this.minXField = new JTextField(""+this.placement.minX);
    165                 this.minYField = new JTextField(""+this.placement.minY);
    166                 this.minEastField = new JTextField(""+this.placement.minEast);
    167                 this.minNorthField = new JTextField(""+this.placement.minNorth);
     213                this.loadProgress = new JProgressBar();
     214                this.progressRenderer = new LoadProgressRenderer(this.loadProgress);
     215
     216                this.minXField = new JTextField("");
     217                this.minYField = new JTextField("");
     218                this.minEastField = new JTextField("");
     219                this.minNorthField = new JTextField("");
    168220                this.getMinButton = new JButton(tr("Take X and Y from selected node"));
    169221
    170                 this.maxXField = new JTextField(""+this.placement.maxX);
    171                 this.maxYField = new JTextField(""+this.placement.maxY);
    172                 this.maxEastField = new JTextField(""+this.placement.maxEast);
    173                 this.maxNorthField = new JTextField(""+this.placement.maxNorth);
     222                this.maxXField = new JTextField("");
     223                this.maxYField = new JTextField("");
     224                this.maxEastField = new JTextField("");
     225                this.maxNorthField = new JTextField("");
    174226                this.getMaxButton = new JButton(tr("Take X and Y from selected node"));
    175227
     
    235287                c.gridx = 0; c.gridy = 0; c.gridwidth = 1;
    236288                selectFilePanel.add(this.loadFileButton, c);
    237 
    238289
    239290                JPanel projectionPanel = new JPanel(new GridBagLayout());
     
    280331                projectionPanel.add(this.getMaxButton, c);
    281332
     333
    282334                JPanel okCancelPanel = new JPanel(new GridLayout(1,3));
    283335                okCancelPanel.add(this.cancelButton);
     
    285337                okCancelPanel.add(this.okButton);
    286338                okCancelPanel.add(this.saveButton);
     339
    287340
    288341                JPanel panel = new JPanel(new GridBagLayout());
     
    295348                c.gridx = 0; c.gridy = 3; c.gridwidth = 1;
    296349                panel.add(okCancelPanel, c);
    297 
    298                 this.setSize(400, 520);
     350                c.gridx = 0; c.gridy = 4; c.gridwidth = 1;
     351                panel.add(this.loadProgress, c);
     352
     353
     354                this.setSize(450, 550);
    299355                this.setContentPane(panel);
    300356        }
     
    316372                                new Runnable() {
    317373                                        public void run() {
    318                                                 data = loadPDF(newFileName);
     374                                                //async part
     375                                                SwingRenderingProgressMonitor monitor = new SwingRenderingProgressMonitor(progressRenderer);
     376                                                monitor.beginTask("Loading file", 1000);
     377                                                data = loadPDF(newFileName, monitor.createSubTaskMonitor(500, false));
     378                                                OsmBuilder.Mode mode = LoadPdfDialog.this.debugModeCheck.isSelected() ? OsmBuilder.Mode.Debug: OsmBuilder.Mode.Draft;
     379
     380                                                if (data!= null) {
     381                                                        LoadPdfDialog.this.newLayer = LoadPdfDialog.this.makeLayer(tr("PDF file preview"), new FilePlacement(), mode, monitor.createSubTaskMonitor(500, false));
     382                                                }
     383
     384                                                monitor.finishTask();
     385                                                progressRenderer.finish();
    319386                                        }
    320387                                },
     
    322389
    323390                                        public void actionPerformed(ActionEvent e) {
     391                                                //sync part
    324392                                                if (data!= null) {
    325                                                         OsmBuilder.Mode mode = LoadPdfDialog.this.debugModeCheck.isSelected() ? OsmBuilder.Mode.Debug: OsmBuilder.Mode.Draft;
    326                                                         LoadPdfDialog.this.fileName = newFileName;
    327                                                         LoadPdfDialog.this.makeLayer(tr("PDF file preview"), new FilePlacement(), mode);
     393                                                        LoadPdfDialog.this.placeLayer(newLayer, new FilePlacement());
     394                                                        fileName = newFileName;
     395                                                        newLayer = null;
    328396                                                        LoadPdfDialog.this.loadFileButton.setText(tr("Loaded"));
    329397                                                        LoadPdfDialog.this.loadFileButton.setEnabled(true);
    330                                                         LoadPdfDialog.this.loadPlacement();
    331                                                         LoadPdfDialog.this.setPlacement();
     398                                                        FilePlacement placement =  LoadPdfDialog.this.loadPlacement();
     399                                                        LoadPdfDialog.this.setPlacement(placement);
    332400                                                }
    333401                                        }
     
    335403        }
    336404
    337        
    338         private boolean preparePlacement()
     405
     406        private FilePlacement preparePlacement()
    339407        {
    340                 boolean ok = this.parsePlacement();
    341                 if (!ok){
    342                         JOptionPane.showMessageDialog(Main.parent, tr("Problems parsing placement."));
    343                         return false;
    344                 }
    345                
    346                 String transformError = this.placement.prepareTransform();
     408                FilePlacement placement = this.parsePlacement();
     409                if (placement == null){
     410                        return null;
     411                }
     412
     413                String transformError = placement.prepareTransform();
    347414                if (transformError != null){
    348                         JOptionPane.showMessageDialog(Main.parent, transformError);                     
    349                 }               
    350 
    351                 this.savePlacement();
    352                
    353                 return true;
     415                        JOptionPane.showMessageDialog(Main.parent, transformError);
     416                        return null;
     417                }
     418
     419                this.savePlacement(placement);
     420
     421                return placement;
    354422        }
    355423
    356424        private void okPressed() {
    357425
    358                 if (!preparePlacement()) {
     426                final FilePlacement placement = preparePlacement();
     427                if (placement == null) {
    359428                        return;
    360429                }
    361430
    362                 //rebuild layer with latest projection
    363                 this.makeLayer(tr("Imported PDF: ") + this.fileName, this.placement, OsmBuilder.Mode.Final);
    364 
    365                 this.setVisible(false);
     431                this.removeLayer();
     432
     433                this.runAsBackgroundTask(
     434                                new Runnable() {
     435                                        public void run() {
     436                                                //async part
     437                                                SwingRenderingProgressMonitor monitor = new SwingRenderingProgressMonitor(progressRenderer);
     438                                                LoadPdfDialog.this.newLayer = LoadPdfDialog.this.makeLayer(tr("Imported PDF: ") + fileName, placement, OsmBuilder.Mode.Final, monitor);
     439                                                progressRenderer.finish();
     440                                        }
     441                                },
     442                                new ActionListener() {
     443
     444                                        public void actionPerformed(ActionEvent e) {
     445                                                //sync part
     446                                                //rebuild layer with latest projection
     447                                                LoadPdfDialog.this.placeLayer(newLayer, placement);
     448                                                LoadPdfDialog.this.setVisible(false);
     449                                        }
     450                                });
    366451        }
    367452
    368453        private void savePressed() {
    369454
    370                 if (!preparePlacement()) {
     455                final FilePlacement placement = preparePlacement();
     456                if (placement == null) {
    371457                        return;
    372                 }               
    373 
    374                 java.io.File file = this.chooseSaveFile();
     458                }
     459
     460                final java.io.File file = this.chooseSaveFile();
    375461
    376462                if (file == null){
    377463                        return;
    378                 }               
    379                
    380                 //rebuild layer with latest projection
     464                }
     465
    381466                this.removeLayer();
    382467
    383 
    384                 this.saveLayer(file);
    385                 this.setVisible(false);
     468                this.runAsBackgroundTask(
     469                                new Runnable() {
     470                                        public void run() {
     471                                                //async part
     472                                                SwingRenderingProgressMonitor monitor = new SwingRenderingProgressMonitor(progressRenderer);
     473                                                LoadPdfDialog.this.saveLayer(file, placement, monitor);
     474                                                progressRenderer.finish();
     475                                        }
     476                                },
     477                                new ActionListener() {
     478
     479                                        public void actionPerformed(ActionEvent e) {
     480                                                //sync part
     481                                                LoadPdfDialog.this.setVisible(false);
     482                                        }
     483                                });
    386484        }
    387485
     
    389487        private void showPressed() {
    390488
    391                 boolean ok = this.parsePlacement();
    392                 if (!ok){
     489                FilePlacement placement = preparePlacement();
     490                if (placement == null) {
    393491                        return;
    394492                }
    395493
    396                 OsmBuilder builder = new OsmBuilder(this.placement);
    397 
    398494                //zoom to new location
    399                 Main.map.mapView.zoomTo(builder.getWorldBounds(this.data));
     495                Main.map.mapView.zoomTo(placement.getWorldBounds(this.data));
    400496                Main.map.repaint();
    401497        }
     
    511607        }
    512608
    513         private PathOptimizer loadPDF(File fileName) {
    514 
    515                 PathOptimizer data = new PathOptimizer();
     609        private PathOptimizer loadPDF(File fileName, ProgressMonitor monitor) {
     610
     611                monitor.beginTask(tr(""), 100);
     612                monitor.setTicks(0);
     613                monitor.setCustomText(tr("Preparing"));
     614
     615                double nodesTolerance = 0.0;
     616                Color color = null;
     617
     618                if (this.mergeCloseNodesCheck.isSelected()) {
     619                        try {
     620                                nodesTolerance = Double.parseDouble(this.mergeCloseNodesTolerance.getText());
     621                        }
     622                        catch (Exception e) {
     623                                JOptionPane
     624                                .showMessageDialog(
     625                                                Main.parent,
     626                                                tr("Tolerance is not a number"));
     627                                return null;
     628                        }
     629                }
     630
     631                if (this.colorFilterCheck.isSelected()) {
     632                        try {
     633                                String colString = this.colorFilterColor.getText().replace("#", "");
     634                                color = new Color(Integer.parseInt(colString, 16));
     635                        }
     636                        catch (Exception e) {
     637                                JOptionPane
     638                                .showMessageDialog(
     639                                                Main.parent,
     640                                                tr("Could not parse color"));
     641                                return null;
     642                        }
     643                }
     644
     645
     646                monitor.setTicks(10);
     647                monitor.setCustomText(tr("Parsing file"));
     648
     649                PathOptimizer data = new PathOptimizer(nodesTolerance, color);
    516650
    517651                try {
    518652                        PdfBoxParser parser = new PdfBoxParser(data);
    519                         parser.parse(fileName);
     653                        parser.parse(fileName, monitor.createSubTaskMonitor(80, false));
    520654
    521655                } catch (FileNotFoundException e1) {
     
    534668                }
    535669
    536                 if (this.colorFilterCheck.isSelected()) {
    537                         try {
    538                                 String colString = this.colorFilterColor.getText().replace("#", "");
    539                                 Color color = new Color(Integer.parseInt(colString, 16));
    540                                 data.filterByColor(color);
    541                         }
    542                         catch (Exception e) {
    543                                 JOptionPane
    544                                 .showMessageDialog(
    545                                                 Main.parent,
    546                                                 tr("Could not parse color"));
    547                                 return null;
    548                         }
    549                 }
    550 
     670                monitor.setTicks(80);
    551671
    552672                if (this.removeParallelSegmentsCheck.isSelected()) {
    553673                        try {
    554674                                double tolerance = Double.parseDouble(this.removeParallelSegmentsTolerance.getText());
     675                                monitor.setCustomText(tr("Removing parallel segments"));
    555676                                data.removeParallelLines(tolerance);
    556677                        }
     
    564685                }
    565686
    566                 if (this.mergeCloseNodesCheck.isSelected()) {
     687                monitor.setTicks(85);
     688                monitor.setCustomText(tr("Joining adjacent segments"));
     689                data.mergeSegments();
     690
     691                if (this.removeSmallObjectsCheck.isSelected()) {
    567692                        try {
    568                                 double tolerance = Double.parseDouble(this.mergeCloseNodesTolerance.getText());
    569                                 data.mergeNodes(tolerance);
     693                                double tolerance = Double.parseDouble(this.removeSmallObjectsSize.getText());
     694                                monitor.setTicks(90);
     695                                monitor.setCustomText(tr("Removing small objects"));
     696
     697                                data.removeSmallObjects(tolerance);
    570698                        }
    571699                        catch (Exception e) {
     
    578706                }
    579707
    580                 data.mergeSegments();
    581 
    582                 if (this.removeSmallObjectsCheck.isSelected()) {
     708                if (this.removeLargeObjectsCheck.isSelected()) {
    583709                        try {
    584                                 double tolerance = Double.parseDouble(this.removeSmallObjectsSize.getText());
    585                                 data.removeSmallObjects(tolerance);
     710                                double tolerance = Double.parseDouble(this.removeLargeObjectsSize.getText());
     711                                monitor.setTicks(90);
     712                                monitor.setCustomText(tr("Removing large objects"));
     713                                data.removeLargeObjects(tolerance);
    586714                        }
    587715                        catch (Exception e) {
     
    594722                }
    595723
    596 
    597                 if (this.removeLargeObjectsCheck.isSelected()) {
    598                         try {
    599                                 double tolerance = Double.parseDouble(this.removeLargeObjectsSize.getText());
    600                                 data.removeLargeObjects(tolerance);
    601                         }
    602                         catch (Exception e) {
    603                                 JOptionPane
    604                                 .showMessageDialog(
    605                                                 Main.parent,
    606                                                 tr("Tolerance is not a number"));
    607                                 return null;
    608                         }
    609                 }
    610 
     724                monitor.setTicks(95);
     725                monitor.setCustomText(tr("Finalizing layers"));
    611726                data.splitLayersByPathKind();
    612727                data.finish();
     728
     729                monitor.finishTask();
    613730                return data;
    614731        }
     
    616733
    617734
    618         private boolean parsePlacement() {
     735        private FilePlacement parsePlacement() {
    619736                Object selectedProjection = this.projectionCombo.getSelectedItem();
    620737
     
    622739                {
    623740                        JOptionPane.showMessageDialog(Main.parent, tr("Please set a projection."));
    624                         return false;
    625                 }
    626 
    627                 this.placement.projection = (Projection)this.projectionCombo.getSelectedItem();
     741                        return null;
     742                }
     743
     744                FilePlacement placement = new FilePlacement();
     745
     746                placement.projection = (Projection)this.projectionCombo.getSelectedItem();
    628747
    629748                try
    630749                {
    631                         this.placement.setPdfBounds(
     750                        placement.setPdfBounds(
    632751                                        Double.parseDouble(this.minXField.getText()),
    633752                                        Double.parseDouble(this.minYField.getText()),
    634753                                        Double.parseDouble(this.maxXField.getText()),
    635754                                        Double.parseDouble(this.maxYField.getText()));
    636                         this.placement.setEastNorthBounds(
     755                        placement.setEastNorthBounds(
    637756                                        Double.parseDouble(this.minEastField.getText()),
    638757                                        Double.parseDouble(this.minNorthField.getText()),
     
    642761                catch (Exception e) {
    643762                        JOptionPane.showMessageDialog(Main.parent, tr("Could not parse numbers. Please check."));
    644                         return false;
    645                 }
    646 
    647                 return true;
    648         }
    649 
    650         private void setPlacement() {
     763                        return null;
     764                }
     765
     766                return placement;
     767        }
     768
     769        private void setPlacement(FilePlacement placement) {
     770
     771                if (placement == null) {
     772                        //use default values.
     773                        placement = new FilePlacement();
     774                }
    651775
    652776                this.projectionCombo.setSelectedItem(placement.projection);
     
    662786
    663787
    664         private void loadPlacement() {
     788        private FilePlacement loadPlacement() {
     789                FilePlacement pl = null;
    665790                //load saved transformation
    666791                File propertiesFile = new File(fileName.getAbsoluteFile()+ ".placement");
     
    668793
    669794                        if (propertiesFile.exists()){
     795                                pl = new FilePlacement();
    670796                                Properties p = new Properties();
    671797                                p.load(new FileInputStream(propertiesFile));
    672                                 this.placement.fromProperties(p);
     798                                pl.fromProperties(p);
    673799                        }
    674800                }catch (Exception e){
     801                        pl = null;
    675802                        e.printStackTrace();
    676803                }
    677         }
    678 
    679         private void savePlacement(){
     804
     805                return pl;
     806        }
     807
     808        private void savePlacement(FilePlacement pl){
    680809                //load saved transformation
    681810                File propertiesFile = new File(fileName.getAbsoluteFile()+ ".placement");
    682811                try {
    683                         Properties p = this.placement.toProperties();
     812                        Properties p = pl.toProperties();
    684813                        p.store(new FileOutputStream(propertiesFile), "PDF file placement on OSM");
    685814                } catch (Exception e){
     
    689818
    690819
    691         private void makeLayer(String name, FilePlacement placement, OsmBuilder.Mode mode) {
     820        private OsmDataLayer makeLayer(String name, FilePlacement placement, OsmBuilder.Mode mode, ProgressMonitor monitor) {
     821                monitor.beginTask(tr("Building JOSM layer"), 100);
     822                OsmBuilder builder = new OsmBuilder(placement);
     823                DataSet data = builder.build(this.data.getLayers(), mode, monitor.createSubTaskMonitor(50, false));
     824                monitor.setTicks(50);
     825                monitor.setCustomText(tr("Postprocessing layer"));
     826                OsmDataLayer result = new OsmDataLayer(data, name, null);
     827                result.onPostLoadFromFile();
     828
     829                monitor.finishTask();
     830                return result;
     831        }
     832
     833        private void placeLayer(OsmDataLayer _layer, FilePlacement placement) {
    692834                this.removeLayer();
    693 
    694                 if (placement == null) {
    695                         return;
    696                 }
    697 
    698                 OsmBuilder builder = new OsmBuilder(placement);
    699 
    700                 DataSet data = builder.build(this.data.getLayers(), mode);
    701                 this.layer = new OsmDataLayer(data, name, null);
    702 
    703                 // Commit
    704                 this.layer.onPostLoadFromFile();
     835                this.layer = _layer;
    705836                Main.main.addLayer(this.layer);
    706                 Main.map.mapView.zoomTo(builder.getWorldBounds(this.data));
    707 
    708                 this.okButton.setEnabled(true);
    709                 this.showButton.setEnabled(true);
     837                Main.map.mapView.zoomTo(placement.getWorldBounds(this.data));
    710838        }
    711839
     
    716844                        this.layer = null;
    717845                }
    718 
    719                 this.okButton.setEnabled(false);
    720                 this.showButton.setEnabled(false);
    721         }
    722 
    723         private void saveLayer(java.io.File file) {             
    724                 OsmBuilder builder = new OsmBuilder(this.placement);
    725                 DataSet data = builder.build(this.data.getLayers(), OsmBuilder.Mode.Final);
     846        }
     847
     848        private void saveLayer(java.io.File file, FilePlacement placement, ProgressMonitor monitor) {
     849                monitor.beginTask(tr("Saving to file."), 1000);
     850
     851                OsmBuilder builder = new OsmBuilder(placement);
     852                DataSet data = builder.build(this.data.getLayers(), OsmBuilder.Mode.Final, monitor.createSubTaskMonitor(500, false));
    726853                OsmDataLayer layer = new OsmDataLayer(data, file.getName(), file);
     854
     855                monitor.setCustomText(tr(" Writing to file"));
     856                monitor.setTicks(500);
    727857
    728858                OsmExporter exporter = new OsmExporter();
     
    734864                        //TODO:
    735865                }
     866
     867                monitor.finishTask();
    736868        }
    737869
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/OsmBuilder.java

    r24186 r24189  
    11package pdfimport;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
    24
    35import java.awt.Color;
     
    810import java.util.Map;
    911
    10 import org.openstreetmap.josm.data.Bounds;
    11 import org.openstreetmap.josm.data.coor.LatLon;
    1212import org.openstreetmap.josm.data.osm.DataSet;
    1313import org.openstreetmap.josm.data.osm.Node;
     
    1515import org.openstreetmap.josm.data.osm.RelationMember;
    1616import org.openstreetmap.josm.data.osm.Way;
     17import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    1718
    1819public class OsmBuilder {
     
    2728        private Mode mode;
    2829
     30        private ProgressMonitor monitor;
     31        private int monitorPos;
     32        private int monitorTotal;
    2933
    3034        public OsmBuilder(FilePlacement placement)
     
    3337        }
    3438
     39        public DataSet build(List<LayerContents> data, Mode mode, ProgressMonitor monitor) {
    3540
    36         public Bounds getWorldBounds(PathOptimizer data) {
    37                 LatLon min = placement.tranformCoords(new Point2D.Double(data.bounds.getMinX(), data.bounds.getMinY()));
    38                 LatLon max = placement.tranformCoords(new Point2D.Double(data.bounds.getMaxX(), data.bounds.getMaxY()));
    39                 return new Bounds(min, max);
    40         }
    41 
    42         public DataSet build(List<LayerContents> data, Mode mode) {
    43 
     41                this.monitor = monitor;
     42                this.monitorPos = 0;
    4443                this.mode = mode;
    4544                DataSet result = new DataSet();
     45
     46                //count total items for progress monitor.
     47                this.monitorTotal = 0;
     48                for (LayerContents layer: data) {
     49                        this.monitorTotal += layer.paths.size();
     50                        for(PdfMultiPath mp: layer.multiPaths){
     51                                this.monitorTotal += mp.paths.size();
     52                        }
     53                }
     54
     55                monitor.beginTask(tr("Building JOSM layer."), this.monitorTotal);
     56
    4657
    4758                for (LayerContents layer: data) {
    4859                        this.addLayer(result, layer);
    4960                }
     61
     62                monitor.finishTask();
    5063                return result;
    5164        }
     
    108121
    109122        private Way insertWay(PdfPath path, Map<Point2D, Node> point2Node, int multipathId, boolean multipolygon) {
     123
     124                monitor.setExtraText(tr(" "+this.monitorPos+"/"+this.monitorTotal));
     125                monitor.setTicks(this.monitorPos);
     126                this.monitorPos ++;
    110127
    111128                List<Node> nodes = new ArrayList<Node>(path.points.size());
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java

    r24080 r24189  
    1919        private List<LayerContents> layers;
    2020        public Rectangle2D bounds;
    21 
    22         public PathOptimizer()
     21        private final double pointsTolerance;
     22        private final Color color;
     23
     24        public PathOptimizer(double _pointsTolerance, Color _color)
    2325        {
     26
    2427                uniquePointMap = new HashMap<Point2D, Point2D>();
    2528                uniquePoints = new ArrayList<Point2D>();
    2629                layerMap = new HashMap<LayerInfo, LayerContents>();
    2730                layers = new ArrayList<LayerContents>();
     31                pointsTolerance = _pointsTolerance;
     32                color = _color;
    2833        }
    2934
     
    4247        public void addPath(LayerInfo info, PdfPath path)
    4348        {
     49                if (!isColorOK(info)){
     50                        return;
     51                }
     52
     53                if (path.points.size() > 10){
     54                        int a = 10;
     55                        a++;
     56                }
     57
    4458                LayerContents layer = this.getLayer(info);
    4559                layer.paths.add(path);
     
    4862        public void addMultiPath(LayerInfo info, List<PdfPath> paths) {
    4963
     64                if (!isColorOK(info)){
     65                        return;
     66                }
     67
    5068                LayerContents layer = this.getLayer(info);
     69
     70                //optimize the paths
     71                Set<Point2D> points = new HashSet<Point2D>();
     72                for(PdfPath path: paths) {
     73                        points.addAll(path.points);
     74                }
     75                LayerContents multipathLayer = new LayerContents();
     76                multipathLayer.paths = paths;
     77                Map<Point2D, Point2D> pointMap = DuplicateNodesFinder.findDuplicateNodes(points, pointsTolerance);
     78                this.fixPoints(multipathLayer,pointMap);
     79                this.concatenatePaths(multipathLayer);
     80
     81                paths = multipathLayer.paths;
     82
    5183                boolean goodMultiPath = true;
    52 
    5384                for(PdfPath path: paths) {
    5485                        goodMultiPath &= path.isClosed();
     
    6394        }
    6495
    65         public void filterByColor(Color color) {
     96        private boolean isColorOK(LayerInfo info) {
     97
     98                if (color == null) {
     99                        return true;
     100                }
    66101
    67102                int rgb = color.getRGB() & 0xffffff;
    68 
    69                 List<LayerContents> newLayers = new ArrayList<LayerContents>();
    70                 for(LayerContents l: this.layers) {
    71 
    72                         boolean good = false;
    73 
    74 
    75                         if (l.info.fill != null && (l.info.fill.getRGB() & 0xffffff) == rgb) {
    76                                 good = true;
    77                         }
    78 
    79                         if (l.info.stroke != null && (l.info.stroke.getRGB() & 0xffffff) == rgb) {
    80                                 good = true;
    81                         }
    82 
    83                         if (good) {
    84                                 newLayers.add(l);
    85                         }
    86                 }
    87                 this.layers = newLayers;
     103                boolean good = false;
     104
     105                if (info.fill != null && (info.fill.getRGB() & 0xffffff) == rgb) {
     106                        good = true;
     107                }
     108
     109                if (info.stroke != null && (info.stroke.getRGB() & 0xffffff) == rgb) {
     110                        good = true;
     111                }
     112
     113                return good;
    88114        }
    89115
     
    95121        }
    96122
    97         public void mergeNodes(double tolerance) {
    98                 Map<Point2D, Point2D> pointMap = DuplicateNodesFinder.findDuplicateNodes(uniquePoints, tolerance);
     123        public void mergeNodes() {
     124                Map<Point2D, Point2D> pointMap = DuplicateNodesFinder.findDuplicateNodes(uniquePoints, pointsTolerance);
    99125
    100126                for(LayerContents layer: this.layers) {
     
    491517                        }
    492518
    493                         //construct path
    494 
    495519                        //remove from map
    496520                        for (PdfPath path: pathChain) {
    497521                                pathEndpoints.get(path.firstPoint()).remove(path);
    498522                                pathEndpoints.get(path.lastPoint()).remove(path);
    499                         }
    500 
     523                                mergedPaths.add(path);
     524                        }
     525
     526
     527                        //construct path
    501528                        PdfPath path = pathChain.get(0);
    502529
     
    507534                                        throw new RuntimeException();
    508535                                }
    509 
    510                                 mergedPaths.add(pathChain.get(pos));
    511536                        }
    512537
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/pdfbox/GraphicsProcessor.java

    r23991 r24189  
    11package pdfimport.pdfbox;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
    24
    35import java.awt.BasicStroke;
     
    1113import java.util.List;
    1214
     15import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     16
    1317import pdfimport.LayerInfo;
    1418import pdfimport.PathOptimizer;
     
    2630
    2731        private final AffineTransform transform;
    28 
    29         public GraphicsProcessor(PathOptimizer target, int rotation)
     32        private final ProgressMonitor monitor;
     33
     34        public GraphicsProcessor(PathOptimizer target, int rotation, ProgressMonitor monitor)
    3035        {
    3136                this.target = target;
     
    3439                this.info.stroke = Color.BLACK;
    3540                this.info.fill = Color.BLACK;
     41                this.monitor = monitor;
    3642        }
    3743
     
    4854                if (paths.size() > 1) {
    4955                        this.target.addMultiPath(this.info, paths);
     56                        this.parsePath(s, closed);
    5057                }
    5158                else if (paths.size() == 1) {
    5259                        this.target.addPath(this.info, paths.get(0));
    5360                }
     61
     62                this.monitor.setCustomText(tr(" {0} objects so far", pathNo));
    5463        }
    5564
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/pdfbox/PageDrawer.java

    r23991 r24189  
    8888                        processStream( page, resources, page.getContents().getStream() );
    8989                }
     90
    9091                List annotations = page.getAnnotations();
    9192                for( int i=0; i<annotations.size(); i++ )
  • applications/editors/josm/plugins/pdfimport/src/pdfimport/pdfbox/PdfBoxParser.java

    r23991 r24189  
    11package pdfimport.pdfbox;
     2
    23import static org.openstreetmap.josm.tools.I18n.tr;
    34
     
    1011import org.apache.pdfbox.pdmodel.common.PDRectangle;
    1112import org.apache.pdfbox.util.PDFStreamEngine;
     13import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    1214
    1315import pdfimport.PathOptimizer;
     
    2123
    2224        @SuppressWarnings("unchecked")
    23         public void parse(File file) throws Exception
     25        public void parse(File file, ProgressMonitor monitor) throws Exception
    2426        {
     27                monitor.beginTask(tr("Parsing PDF", 1));
     28
    2529                PDDocument document = PDDocument.load( file);
    2630
     
    4347                }
    4448
    45                 GraphicsProcessor p = new GraphicsProcessor(target, rotation);
     49                GraphicsProcessor p = new GraphicsProcessor(target, rotation, monitor);
    4650                PageDrawer drawer = new PageDrawer();
    4751                drawer.drawPage(p, page);
    4852                this.target.bounds = new Rectangle2D.Double(pageSize.getLowerLeftX(), pageSize.getLowerLeftY(), pageSize.getWidth(), pageSize.getHeight());
     53
     54                monitor.finishTask();
    4955        }
    5056}
Note: See TracChangeset for help on using the changeset viewer.