Changeset 406 in josm


Ignore:
Timestamp:
Oct 19, 2007 12:38:34 PM (6 years ago)
Author:
framm
Message:
  • modify CombineWayAction not to allow merging of ways if they have different relation memberships (either different relations, or different roles in the same relation). Fixes bug #359
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java

    r343 r406  
    3434import org.openstreetmap.josm.data.osm.DataSet; 
    3535import org.openstreetmap.josm.data.osm.OsmPrimitive; 
     36import org.openstreetmap.josm.data.osm.Relation; 
     37import org.openstreetmap.josm.data.osm.RelationMember; 
    3638import org.openstreetmap.josm.data.osm.Way; 
    3739import org.openstreetmap.josm.data.osm.Node; 
     
    6264                        JOptionPane.showMessageDialog(Main.parent, tr("Please select at least two ways to combine.")); 
    6365                        return; 
     66                } 
     67                 
     68                // Check whether all ways have identical relationship membership. More  
     69                // specifically: If one of the selected ways is a member of relation X 
     70                // in role Y, then all selected ways must be members of X in role Y. 
     71                 
     72                // FIXME: In a later revision, we should display some sort of conflict  
     73                // dialog like we do for tags, to let the user choose which relations 
     74                // should be kept. 
     75                 
     76                // Step 1, iterate over all relations and create counters indicating 
     77                // how many of the selected ways are part of relation X in role Y 
     78                // (hashMap backlinks contains keys formed like X@Y) 
     79                HashMap<String, Integer> backlinks = new HashMap<String, Integer>(); 
     80                HashSet<Relation> relationsUsingWays = new HashSet<Relation>(); 
     81                for (Relation r : Main.ds.relations) { 
     82                        if (r.deleted) continue; 
     83                        for (RelationMember rm : r.members) { 
     84                                if (rm.member instanceof Way) { 
     85                                        for(Way w : selectedWays) { 
     86                                                if (rm.member == w) { 
     87                                                        String hash = Long.toString(r.id) + "@" + rm.role; 
     88                                                        System.out.println(hash); 
     89                                                        if (backlinks.containsKey(hash)) { 
     90                                                                backlinks.put(hash, new Integer(backlinks.get(hash)+1)); 
     91                                                        } else { 
     92                                                                backlinks.put(hash, 1); 
     93                                                        } 
     94                                                        // this is just a cache for later use 
     95                                                        relationsUsingWays.add(r); 
     96                                                } 
     97                                        } 
     98                                } 
     99                        } 
     100                } 
     101                 
     102                // Step 2, all values of the backlinks HashMap must now equal the size 
     103                // of the selection. 
     104                for (Integer i : backlinks.values()) { 
     105                        if (i.intValue() != selectedWays.size()) { 
     106                                JOptionPane.showMessageDialog(Main.parent, tr("The selected ways cannot be combined as they have differing relation memberships.")); 
     107                                return;                          
     108                        } 
    64109                } 
    65110 
     
    113158                                newWay.put(e.getKey(), e.getValue().iterator().next()); 
    114159                } 
     160                 
    115161                if (!components.isEmpty()) { 
    116162                        int answer = JOptionPane.showConfirmDialog(Main.parent, p, tr("Enter values for all conflicts."), JOptionPane.OK_CANCEL_OPTION); 
     
    124170                cmds.add(new DeleteCommand(selectedWays.subList(1, selectedWays.size()))); 
    125171                cmds.add(new ChangeCommand(selectedWays.peek(), newWay)); 
     172                 
     173                // modify all relations containing the now-deleted ways 
     174                for (Relation r : relationsUsingWays) { 
     175                        Relation newRel = new Relation(r); 
     176                        newRel.members.clear(); 
     177                        for (RelationMember rm : r.members) { 
     178                                // only copy member if it is either the first of all the selected 
     179                                // ways (indexOf==0) or not one if the selected ways (indexOf==-1) 
     180                                if (selectedWays.indexOf(rm.member) < 1) { 
     181                                        newRel.members.add(new RelationMember(rm)); 
     182                                } 
     183                        } 
     184                        cmds.add(new ChangeCommand(r, newRel)); 
     185                } 
    126186                Main.main.undoRedo.add(new SequenceCommand(tr("Combine {0} ways", selectedWays.size()), cmds)); 
    127187                Main.ds.setSelected(selectedWays.peek()); 
     
    195255                        return tr("Could not combine ways " 
    196256                                + "(They could not be merged into a single string of nodes)"); 
    197                 } else { 
    198                         return nodeList; 
    199                 } 
     257                }  
     258                 
     259                return nodeList; 
    200260        } 
    201261 
Note: See TracChangeset for help on using the changeset viewer.