Changeset 5076 in osm for applications/editors/josm/plugins/utilsplugin/src/UtilsPlugin/MergeNodesAction.java
- Timestamp:
- 2007-10-19T00:13:15+02:00 (18 years ago)
- Location:
- applications/editors/josm/plugins/utilsplugin/src
- Files:
-
- 2 added
- 1 copied
-
. (added)
-
UtilsPlugin (added)
-
UtilsPlugin/MergeNodesAction.java (copied) (copied from applications/editors/josm/plugins/utilsplugin/UtilsPlugin/MergePointsAction.java ) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/utilsplugin/src/UtilsPlugin/MergeNodesAction.java
r5075 r5076 4 4 5 5 import java.util.ArrayList; 6 import java.util.Arrays;7 6 import java.util.LinkedList; 8 7 import java.util.Collection; 8 import java.util.Collections; 9 9 10 10 import java.awt.event.ActionEvent; … … 13 13 import org.openstreetmap.josm.data.osm.OsmPrimitive; 14 14 import org.openstreetmap.josm.data.osm.Node; 15 import org.openstreetmap.josm.data.osm.Segment;16 15 import org.openstreetmap.josm.data.osm.Way; 16 import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor; 17 import org.openstreetmap.josm.data.coor.EastNorth; 17 18 import org.openstreetmap.josm.gui.MapFrame; 18 19 import org.openstreetmap.josm.plugins.Plugin; 20 import org.openstreetmap.josm.actions.JosmAction; 19 21 import org.openstreetmap.josm.command.Command; 20 22 import org.openstreetmap.josm.command.AddCommand; … … 24 26 25 27 import javax.swing.AbstractAction; 28 import javax.swing.JOptionPane; 26 29 27 class MergePointsAction extends AbstractAction { 28 public MergePointsAction() { 29 super("Merge Points"); 30 class MergeNodesAction extends JosmAction { 31 public MergeNodesAction() { 32 super(tr("Merge nodes"), "mergenodes", 33 tr("Merge nodes"), 0, 0, true); 30 34 } 35 31 36 public void actionPerformed(ActionEvent e) { 32 37 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 35 40 for (OsmPrimitive osm : sel) 36 41 if (osm instanceof Node) 37 42 nodes.add((Node)osm); 38 43 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.")); 40 46 return; 41 47 } 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) { 47 54 target = n; 48 continue;49 55 } 50 if( n.id == 0 )51 continue;52 if( n.id < target.id )53 target = n;54 56 } 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 56 73 nodes.remove(target); 57 58 // target is what we're merging into59 // nodes is the list of nodes to be removed60 // Since some segment may disappear, we need to track those too61 Collection<OsmPrimitive> seglist = new ArrayList<OsmPrimitive>();62 63 // Now do the merging64 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;77 74 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; 109 85 } 110 86 } 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 } 112 121 } 113 122 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)); 116 124 Main.map.repaint(); 117 125 } 118 private DeleteCommand makeDeleteCommand(OsmPrimitive obj)119 {120 return new DeleteCommand(Arrays.asList(new OsmPrimitive[]{obj}));121 }122 126 } 123
Note:
See TracChangeset
for help on using the changeset viewer.
