Changeset 2788 in osm
- Timestamp:
- 2007-05-06T19:50:38+02:00 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/DuplicateNode.java
r2591 r2788 3 3 import static org.openstreetmap.josm.tools.I18n.tr; 4 4 5 import java.util. List;5 import java.util.*; 6 6 7 import org.openstreetmap.josm.command.Command; 8 import org.openstreetmap.josm.command.DeleteCommand; 7 import javax.swing.JOptionPane; 8 9 import org.openstreetmap.josm.Main; 10 import org.openstreetmap.josm.command.*; 9 11 import org.openstreetmap.josm.data.coor.LatLon; 10 import org.openstreetmap.josm.data.osm.Node; 11 import org.openstreetmap.josm.data.osm.OsmPrimitive; 12 import org.openstreetmap.josm.data.osm.*; 12 13 import org.openstreetmap.josm.plugins.validator.Severity; 13 14 import org.openstreetmap.josm.plugins.validator.Test; … … 60 61 } 61 62 63 /** 64 * Merge the nodes into one. 65 * Copied from UtilsPlugin.MergePointsAction 66 */ 62 67 @Override 63 68 public Command fixError(TestError testError) 64 69 { 65 //TODO Which should be the fix? 66 return new DeleteCommand(testError.getPrimitives()); 70 Collection<OsmPrimitive> sel = testError.getPrimitives(); 71 Collection<OsmPrimitive> nodes = new ArrayList<OsmPrimitive>(); 72 73 Node target = null; 74 for (OsmPrimitive osm : sel) 75 nodes.add(osm); 76 77 if( nodes.size() < 2 ) 78 return null; 79 80 for ( OsmPrimitive o : nodes ) 81 { 82 Node n = (Node)o; 83 if( target == null || target.id == 0 ) 84 { 85 target = n; 86 continue; 87 } 88 if( n.id == 0 ) 89 continue; 90 if( n.id < target.id ) 91 target = n; 92 } 93 if( target == null ) 94 return null; 95 96 // target is what we're merging into 97 // nodes is the list of nodes to be removed 98 nodes.remove(target); 99 100 // Merge all properties 101 Node newtarget = new Node(target); 102 for (final OsmPrimitive o : nodes) 103 { 104 Node n = (Node)o; 105 for ( String key : n.keySet() ) 106 { 107 if( newtarget.keySet().contains(key) && !newtarget.get(key).equals(n.get(key)) ) 108 { 109 JOptionPane.showMessageDialog(Main.parent, tr("Nodes have conflicting key: " + key + " ["+newtarget.get(key)+", "+n.get(key)+"]")); 110 return null; 111 } 112 newtarget.put( key, n.get(key) ); 113 } 114 } 115 116 // Since some segment may disappear, we need to track those too 117 Collection<OsmPrimitive> seglist = new ArrayList<OsmPrimitive>(); 118 119 // Now do the merging 120 Collection<Command> cmds = new LinkedList<Command>(); 121 for (final Segment s : Main.ds.segments) 122 { 123 if( s.deleted || s.incomplete ) 124 continue; 125 if( !nodes.contains( s.from ) && !nodes.contains( s.to ) ) 126 continue; 127 128 Segment newseg = new Segment(s); 129 if( nodes.contains( s.from ) ) 130 newseg.from = target; 131 if( nodes.contains( s.to ) ) 132 newseg.to = target; 133 134 // Is this node now a NULL node? 135 if( newseg.from == newseg.to ) 136 seglist.add(s); 137 else 138 cmds.add(new ChangeCommand(s,newseg)); 139 } 140 141 if( seglist.size() > 0 ) // Some segments to be deleted? 142 { 143 // We really want to delete this, but we must check if it is part of a way first 144 for (final Way w : Main.ds.ways) 145 { 146 Way newway = null; 147 if( w.deleted ) 148 continue; 149 for (final OsmPrimitive o : seglist ) 150 { 151 Segment s = (Segment)o; 152 if( w.segments.contains(s) ) 153 { 154 if( newway == null ) 155 newway = new Way(w); 156 newway.segments.remove(s); 157 } 158 } 159 if( newway != null ) // Made changes? 160 { 161 // If no segments left, delete the way 162 if( newway.segments.size() == 0 ) 163 cmds.add(new DeleteCommand(Arrays.asList(new OsmPrimitive[]{w}))); 164 else 165 cmds.add(new ChangeCommand(w,newway)); 166 } 167 } 168 cmds.add(new DeleteCommand(seglist)); 169 } 170 171 cmds.add(new DeleteCommand(nodes)); 172 cmds.add(new ChangeCommand(target, newtarget)); 173 return new SequenceCommand(tr("Merge Nodes"), cmds); 67 174 } 68 175 … … 70 177 public boolean isFixable(TestError testError) 71 178 { 72 return false; //(testError.getTester() instanceof DuplicateNode);179 return (testError.getTester() instanceof DuplicateNode); 73 180 } 74 181 }
Note:
See TracChangeset
for help on using the changeset viewer.