Changeset 4671 in josm for trunk/src/org


Ignore:
Timestamp:
2011-12-20T22:28:46+01:00 (9 years ago)
Author:
stoecker
Message:

fix #7164 - patch by ij - bugs fixes and improvements for FollowLine function

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

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

    r4214 r4671  
    99import java.util.Iterator;
    1010import java.util.List;
     11import java.util.Set;
    1112
    1213import org.openstreetmap.josm.Main;
     
    7273            return;
    7374        Way follower = selectedLines.iterator().next();
     75        if (follower.isClosed())    /* Don't loop until OOM */
     76            return;
    7477        Node prev = follower.getNode(1);
    7578        boolean reversed = true;
     
    8184        if (referrers.size() < 2) return; // There's nothing to follow
    8285       
     86        Node newPoint = null;       
    8387        Iterator<OsmPrimitive> i = referrers.iterator();
    8488        while (i.hasNext()) {
     
    9195                continue;
    9296            }
    93             List<Node> points = toFollow.getNodes();
    94             int indexOfLast = points.indexOf(last);
    95             int indexOfPrev = points.indexOf(prev);
    96             if ((indexOfLast == -1) || (indexOfPrev == -1)) { // Both points must belong to both lines
     97            Set<Node> points = toFollow.getNeighbours(last);
     98            if (!points.remove(prev) || (points.size() == 0))
    9799                continue;
     100            if (points.size() > 1)    // Ambiguous junction?
     101                return;
     102
     103            Node newPointCandidate = points.iterator().next();
     104
     105            if ((newPoint != null) && (newPoint != newPointCandidate))
     106                return;         // Ambiguous junction, force to select next
     107
     108            newPoint = newPointCandidate;
     109        }
     110        if (newPoint != null) {
     111            Way newFollower = new Way(follower);
     112            if (reversed) {
     113                newFollower.addNode(0, newPoint);
     114            } else {
     115                newFollower.addNode(newPoint);
    98116            }
    99             if (Math.abs(indexOfPrev - indexOfLast) != 1) {  // ...and be consecutive
    100                 continue;
    101             }
    102             Node newPoint = null;
    103             if (indexOfPrev == (indexOfLast - 1)) {
    104                 if ((indexOfLast + 1) < points.size()) {
    105                     newPoint = points.get(indexOfLast + 1);
    106                 }
    107             } else {
    108                 if ((indexOfLast - 1) >= 0) {
    109                     newPoint = points.get(indexOfLast - 1);
    110                 }
    111             }
    112             if (newPoint != null) {
    113                 Way newFollower = new Way(follower);
    114                 if (reversed) {
    115                     newFollower.addNode(0, newPoint);
    116                 } else {
    117                     newFollower.addNode(newPoint);
    118                 }
    119                 Main.main.undoRedo.add(new ChangeCommand(follower, newFollower));
    120                 osmLayer.data.clearSelection();
    121                 osmLayer.data.addSelected(newFollower);
    122                 osmLayer.data.addSelected(newPoint);
    123                 // "viewport following" mode for tracing long features
    124                 // from aerial imagery or GPS tracks.
    125                 if (Main.map.mapView.viewportFollowing) {
    126                     Main.map.mapView.smoothScrollTo(newPoint.getEastNorth());
    127                 };
    128                 return;
    129             }
     117            Main.main.undoRedo.add(new ChangeCommand(follower, newFollower));
     118            osmLayer.data.clearSelection();
     119            osmLayer.data.addSelected(newFollower);
     120            osmLayer.data.addSelected(newPoint);
     121            // "viewport following" mode for tracing long features
     122            // from aerial imagery or GPS tracks.
     123            if (Main.map.mapView.viewportFollowing) {
     124                Main.map.mapView.smoothScrollTo(newPoint.getEastNorth());
     125            };
    130126        }
    131127    }
  • trunk/src/org/openstreetmap/josm/data/osm/Way.java

    r4431 r4671  
    88import java.util.List;
    99import java.util.Set;
     10import java.util.HashSet;
    1011
    1112import org.openstreetmap.josm.Main;
     
    139140    }
    140141
     142    /**
     143     * Return nodes adjacent to <code>node</code>
     144     *
     145     * @param node the node. May be null.
     146     * @return Set of nodes adjacent to <code>node</code>
     147     * @since 4666
     148     */
     149    public Set<Node> getNeighbours(Node node) {
     150        HashSet<Node> neigh = new HashSet<Node>();
     151
     152        if (node == null) return neigh;
     153
     154        Node[] nodes = this.nodes;
     155        for (int i=0; i<nodes.length; i++) {
     156            if (nodes[i].equals(node)) {
     157                if (i > 0)
     158                    neigh.add(nodes[i-1]);
     159                if (i < nodes.length-1)
     160                    neigh.add(nodes[i+1]);
     161            }
     162        }
     163        return neigh;
     164    }
     165
    141166    public List<Pair<Node,Node>> getNodePairs(boolean sort) {
    142167        List<Pair<Node,Node>> chunkSet = new ArrayList<Pair<Node,Node>>();
Note: See TracChangeset for help on using the changeset viewer.