Changeset 406 in josm


Ignore:
Timestamp:
2007-10-19T12:38:34+02:00 (17 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.