Ticket #18728: 18728.2.patch

File 18728.2.patch, 4.4 KB (added by GerdP, 3 months ago)
  • src/org/openstreetmap/josm/actions/JoinAreasAction.java

     
    685685        Map<Node, Way> oldestWayMap = new HashMap<>();
    686686
    687687        for (Way way : outerStartingWays) {
    688             List<Way> splitWays = splitWayOnNodes(way, nodes, oldestWayMap);
    689             preparedWays.addAll(markWayInsideSide(splitWays, false));
     688            if (!splitWayOnNodes(way, nodes)) {
     689                preparedWays.addAll(markWayInsideSide(Collections.singletonList(way), false));
     690            }
    690691        }
     692        // remember number of split commands so far
     693        int outerCmdsSize = cmds.size();
    691694
    692695        for (Way way : innerStartingWays) {
    693             List<Way> splitWays = splitWayOnNodes(way, nodes, oldestWayMap);
    694             preparedWays.addAll(markWayInsideSide(splitWays, true));
     696            if (!splitWayOnNodes(way, nodes)) {
     697            }
    695698        }
    696699
     700        List<Command> savedCmds = new ArrayList<>(cmds);
     701        commitCommands(marktr("Split ways into fragments"));
     702
     703        for (int i = 0; i < savedCmds.size(); i++) {
     704            Command cmd = savedCmds.get(i);
     705
     706            if (cmd instanceof SplitWayCommand) {
     707                SplitWayCommand split = (SplitWayCommand) cmd;
     708                List<Way> result = new ArrayList<>();
     709                Way way = split.getOriginalWay();
     710                result.add(way);
     711                result.addAll(split.getNewWays());
     712
     713                // see #9599
     714                if (!way.isNew() && result.size() > 1) {
     715                    for (Way part : result) {
     716                        Node n = part.firstNode();
     717                        Way old = oldestWayMap.get(n);
     718                        if (old == null || old.getUniqueId() > way.getUniqueId()) {
     719                            oldestWayMap.put(n, way);
     720                        }
     721                    }
     722                }
     723                preparedWays.addAll(markWayInsideSide(result, i >= outerCmdsSize));
     724            }
     725        }
     726
    697727        // Find boundary ways
    698728        List<Way> discardedWays = new ArrayList<>();
    699729        List<AssembledPolygon> boundaries = findBoundaryPolygons(preparedWays, discardedWays);
     
    11091139     * Uses {@link SplitWayCommand#splitWay} for the heavy lifting.
    11101140     * @param way way to split
    11111141     * @param nodes split points
    1112      * @param oldestWayMap  nodes from old ways (modified here)
    1113      * @return list of split ways (or original way if no splitting is done).
     1142     * @return true if split command was added
    11141143     */
    1115     private List<Way> splitWayOnNodes(Way way, Set<Node> nodes, Map<Node, Way> oldestWayMap) {
     1144    private boolean splitWayOnNodes(Way way, Set<Node> nodes) {
    11161145
    1117         List<Way> result = new ArrayList<>();
    11181146        List<List<Node>> chunks = buildNodeChunks(way, nodes);
    11191147
    11201148        if (chunks.size() > 1) {
     
    11221150                    Collections.<OsmPrimitive>emptyList(), SplitWayCommand.Strategy.keepFirstChunk());
    11231151
    11241152            if (split != null) {
    1125                 //execute the command, we need the results
     1153                // don't execute the command now
    11261154                cmds.add(split);
    1127                 commitCommands(marktr("Split ways into fragments"));
    1128 
    1129                 result.add(split.getOriginalWay());
    1130                 result.addAll(split.getNewWays());
    1131 
    1132                 // see #9599
    1133                 if (!way.isNew() && result.size() > 1) {
    1134                     for (Way part : result) {
    1135                         Node n = part.firstNode();
    1136                         Way old = oldestWayMap.get(n);
    1137                         if (old == null || old.getUniqueId() > way.getUniqueId()) {
    1138                             oldestWayMap.put(n, way);
    1139                         }
    1140                     }
    1141                 }
     1155                return true;
    11421156            }
    11431157        }
    1144         if (result.isEmpty()) {
    1145             //nothing to split
    1146             result.add(way);
    1147         }
    1148         return result;
     1158        return false;
    11491159    }
    11501160
    11511161    /**
     
    17221732                cmds.add(commands.get(i));
    17231733            }
    17241734            ur.undo(cmds.size());
     1735            commitCommands(message == null ? marktr("Join Areas Function") : message);
    17251736        }
    17261737
    1727         commitCommands(message == null ? marktr("Join Areas Function") : message);
    17281738        cmdsCount = 0;
    17291739    }
    17301740