Ignore:
Timestamp:
2012-12-26T16:22:48+01:00 (12 years ago)
Author:
donvip
Message:

fix #josm7341 - circle arc: problem when a way and three nodes are selected not in the way order

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/curves/CircleArcMaker.java

    r28028 r29124  
    33
    44import java.util.ArrayList;
     5import java.util.Arrays;
    56import java.util.Collection;
     7import java.util.Collections;
     8import java.util.Comparator;
    69import java.util.HashSet;
    710import java.util.Iterator;
     
    6063        Set<Way> targetWays = new HashSet<Way>();
    6164
    62         boolean nodesHasBeenChoosen = false;
     65        boolean nodesHaveBeenChoosen = false;
    6366        if (selectedNodes.size() == 3) {
    6467            Iterator<Node> nodeIter = selectedNodes.iterator();
     
    6669            n2 = nodeIter.next();
    6770            n3 = nodeIter.next();
    68             nodesHasBeenChoosen = true;
     71            nodesHaveBeenChoosen = true;
    6972            if (selectedWays.isEmpty()) { // Create a brand new way
    7073                Way newWay = new Way();
     
    7679            }
    7780        }
    78         if (selectedWays.isEmpty() == false) {
     81        if (!selectedWays.isEmpty()) {
    7982            // TODO: use only two nodes inferring the orientation from the parent way.
    8083
    81             if (nodesHasBeenChoosen == false) {
     84            if (!nodesHaveBeenChoosen) {
    8285                // Use the three last nodes in the way as anchors. This is intended to be used with the
    8386                // built in draw mode
     
    8992                n2 = w.getNode(nodeCount - 2);
    9093                n1 = w.getNode(nodeCount - 3);
    91                 nodesHasBeenChoosen = true;
    92             }
    93             targetWays.addAll(OsmPrimitive.getFilteredList(n1.getReferrers(), Way.class));
    94             targetWays.addAll(OsmPrimitive.getFilteredList(n2.getReferrers(), Way.class));
    95             targetWays.addAll(OsmPrimitive.getFilteredList(n3.getReferrers(), Way.class));
    96             //            for(Way w : selectedWays) {
    97             //                targetWays.add(w);
    98             //            }
    99 
    100         }
    101         if (nodesHasBeenChoosen == false) {
     94                nodesHaveBeenChoosen = true;
     95            }
     96            // Fix #7341. Find the first way having all nodes in common to sort them in its nodes order
     97            List<Node> consideredNodes = Arrays.asList(new Node[]{n1,n2,n3});
     98            for (Way w : selectedWays) {
     99                final List<Node> nodes = w.getNodes();
     100                if (nodes.containsAll(consideredNodes)) {
     101                    Collections.sort(consideredNodes, new Comparator<Node>() {
     102                        @Override
     103                        public int compare(Node a, Node b) {
     104                            return nodes.indexOf(a) - nodes.indexOf(b);
     105                        }
     106                    });
     107                    n1 = consideredNodes.get(0);
     108                    n2 = consideredNodes.get(1);
     109                    n3 = consideredNodes.get(2);
     110                    break;
     111                }
     112            }
     113           
     114            for (Node n : consideredNodes) {
     115                targetWays.addAll(OsmPrimitive.getFilteredList(n.getReferrers(), Way.class));
     116            }
     117        }
     118        if (!nodesHaveBeenChoosen) {
    102119            return null;
    103120        }
Note: See TracChangeset for help on using the changeset viewer.