Ignore:
Timestamp:
2007-10-19T00:13:15+02:00 (18 years ago)
Author:
gabriel
Message:

utilsplugin: Port to API 0.5.

Location:
applications/editors/josm/plugins/utilsplugin/src
Files:
2 added
1 copied

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/utilsplugin/src/UtilsPlugin/MergeNodesAction.java

    r5075 r5076  
    44
    55import java.util.ArrayList;
    6 import java.util.Arrays;
    76import java.util.LinkedList;
    87import java.util.Collection;
     8import java.util.Collections;
    99
    1010import java.awt.event.ActionEvent;
     
    1313import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1414import org.openstreetmap.josm.data.osm.Node;
    15 import org.openstreetmap.josm.data.osm.Segment;
    1615import org.openstreetmap.josm.data.osm.Way;
     16import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
     17import org.openstreetmap.josm.data.coor.EastNorth;
    1718import org.openstreetmap.josm.gui.MapFrame;
    1819import org.openstreetmap.josm.plugins.Plugin;
     20import org.openstreetmap.josm.actions.JosmAction;
    1921import org.openstreetmap.josm.command.Command;
    2022import org.openstreetmap.josm.command.AddCommand;
     
    2426
    2527import javax.swing.AbstractAction;
     28import javax.swing.JOptionPane;
    2629
    27 class MergePointsAction extends AbstractAction {
    28         public MergePointsAction() {
    29                 super("Merge Points");
     30class MergeNodesAction extends JosmAction {
     31        public MergeNodesAction() {
     32                super(tr("Merge nodes"), "mergenodes",
     33                        tr("Merge nodes"), 0, 0, true);
    3034        }
     35
    3136        public void actionPerformed(ActionEvent e) {
    3237                Collection<OsmPrimitive> sel = Main.ds.getSelected();
    33                 Collection<OsmPrimitive> nodes = new ArrayList<OsmPrimitive>();
    34                 Node target = null;
     38                Collection<Node> nodes = new ArrayList<Node>();
     39
    3540                for (OsmPrimitive osm : sel)
    3641                        if (osm instanceof Node)
    3742                                nodes.add((Node)osm);
    3843                if (nodes.size() < 2) {
    39                         javax.swing.JOptionPane.showMessageDialog(Main.parent, tr("Must select at least two nodes."));
     44                        JOptionPane.showMessageDialog(Main.parent,
     45                                tr("Must select at least two nodes."));
    4046                        return;
    4147                }
    42                 for ( OsmPrimitive o : nodes )
    43                 {
    44                         Node n = (Node)o;
    45                         if( target == null || target.id == 0 )
    46                         {
     48
     49                // Find the node with the lowest ID.
     50                // We're gonna keep our 3-digit node ids.
     51                Node target = null;
     52                for (Node n : nodes) {
     53                        if (target == null || target.id == 0 || n.id < target.id) {
    4754                                target = n;
    48                                 continue;
    4955                        }
    50                         if( n.id == 0 )
    51                                 continue;
    52                         if( n.id < target.id )
    53                                 target = n;
    5456                }
    55 //              System.out.println( "Selected: "+target.toString() );
     57
     58                Collection<Command> cmds = new LinkedList<Command>();
     59
     60                Node newTarget = new Node(target);
     61                cmds.add(new ChangeCommand(target, newTarget));
     62
     63                // Don't place the merged node on one of the former nodes.
     64                // Place it right there in the middle.
     65                double x = 0, y = 0;
     66                for (Node n : nodes) {
     67                        x += n.eastNorth.east();
     68                        y += n.eastNorth.north();
     69                }
     70                newTarget.eastNorth = new EastNorth(
     71                        x / nodes.size(), y / nodes.size());
     72
    5673                nodes.remove(target);
    57                
    58                 // target is what we're merging into
    59                 // nodes is the list of nodes to be removed
    60                 // Since some segment may disappear, we need to track those too
    61                 Collection<OsmPrimitive> seglist = new ArrayList<OsmPrimitive>();
    62                                
    63                 // Now do the merging
    64                 Collection<Command> cmds = new LinkedList<Command>();
    65                 for (final Segment s : Main.ds.segments)
    66                 {
    67                         if( s.deleted || s.incomplete )
    68                                 continue;
    69                         if( !nodes.contains( s.from ) && !nodes.contains( s.to ) )
    70                                 continue;
    71                                
    72                         Segment newseg = new Segment(s);
    73                         if( nodes.contains( s.from ) )
    74                                 newseg.from = target;
    75                         if( nodes.contains( s.to ) )
    76                                 newseg.to = target;
    7774
    78                         // Is this node now a NULL node?
    79                         if( newseg.from == newseg.to )
    80                                 seglist.add(s);
    81                         else
    82                                 cmds.add(new ChangeCommand(s,newseg));
    83                 }
    84                 if( seglist.size() > 0 )  // Some segments to be deleted?
    85                 {
    86                         // We really want to delete this, but we must check if it is part of a way first
    87                         for (final Way w : Main.ds.ways)
    88                         {
    89                                 Way newway = null;
    90                                 if( w.deleted )
    91                                         continue;
    92                                 for (final OsmPrimitive o : seglist )
    93                                 {
    94                                         Segment s = (Segment)o;
    95                                         if( w.segments.contains(s) )
    96                                         {
    97                                                 if( newway == null )
    98                                                         newway = new Way(w);
    99                                                 newway.segments.remove(s);
    100                                         }
    101                                 }
    102                                 if( newway != null )   // Made changes?
    103                                 {
    104                                         // If no segments left, delete the way
    105                                         if( newway.segments.size() == 0 )
    106                                                 cmds.add(makeDeleteCommand(w));
    107                                         else
    108                                                 cmds.add(new ChangeCommand(w,newway));
     75                cmds.add(new DeleteCommand(nodes));
     76
     77                for (Way w : Main.ds.ways) {
     78                        if (w.deleted || w.incomplete) continue;
     79
     80                        boolean affected = false;
     81                        for (Node n : nodes) {
     82                                if (w.nodes.contains(n)) {
     83                                        affected = true;
     84                                        break;
    10985                                }
    11086                        }
    111                         cmds.add(new DeleteCommand(seglist));
     87                        if (!affected) continue;
     88
     89                        // Replace the old nodes with the merged ones
     90                        Way wnew = new Way(w);
     91                        for (int i = 0; i < wnew.nodes.size(); i++) {
     92                                if (nodes.contains(wnew.nodes.get(i))) {
     93                                        wnew.nodes.set(i, newTarget);
     94                                }
     95                        }
     96
     97                        // Remove duplicates
     98                        Node lastN = null;
     99                        for (int i = wnew.nodes.size() - 1; i >= 0; i--) {
     100                                if (lastN == wnew.nodes.get(i)) {
     101                                        wnew.nodes.remove(i);
     102                                        if (i < wnew.nodes.size()) i++;
     103                                }
     104                        }
     105
     106                        if (wnew.nodes.size() < 2) {
     107                                CollectBackReferencesVisitor backRefV =
     108                                        new CollectBackReferencesVisitor(Main.ds, false);
     109                                backRefV.visit(w);
     110                                if (!backRefV.data.isEmpty()) {
     111                                        JOptionPane.showMessageDialog(Main.parent,
     112                                                tr("Cannot merge nodes: " +
     113                                                        "Would have to delete way that is still used."));
     114                                        return;
     115                                }
     116
     117                                cmds.add(new DeleteCommand(Collections.singleton(w)));
     118                        } else {
     119                                cmds.add(new ChangeCommand(w, wnew));
     120                        }
    112121                }
    113122
    114                 cmds.add(new DeleteCommand(nodes));
    115                 Main.main.editLayer().add(new SequenceCommand(tr("Merge Nodes"), cmds));
     123                Main.main.undoRedo.add(new SequenceCommand(tr("Merge Nodes"), cmds));
    116124                Main.map.repaint();
    117125        }
    118         private DeleteCommand makeDeleteCommand(OsmPrimitive obj)
    119         {
    120           return new DeleteCommand(Arrays.asList(new OsmPrimitive[]{obj}));
    121         }
    122126}
    123 
Note: See TracChangeset for help on using the changeset viewer.