Ticket #18728: 18728.2.patch
File 18728.2.patch, 4.4 KB (added by , 5 years ago) |
---|
-
src/org/openstreetmap/josm/actions/JoinAreasAction.java
685 685 Map<Node, Way> oldestWayMap = new HashMap<>(); 686 686 687 687 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 } 690 691 } 692 // remember number of split commands so far 693 int outerCmdsSize = cmds.size(); 691 694 692 695 for (Way way : innerStartingWays) { 693 List<Way> splitWays = splitWayOnNodes(way, nodes, oldestWayMap);694 preparedWays.addAll(markWayInsideSide(splitWays, true));696 if (!splitWayOnNodes(way, nodes)) { 697 } 695 698 } 696 699 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 697 727 // Find boundary ways 698 728 List<Way> discardedWays = new ArrayList<>(); 699 729 List<AssembledPolygon> boundaries = findBoundaryPolygons(preparedWays, discardedWays); … … 1109 1139 * Uses {@link SplitWayCommand#splitWay} for the heavy lifting. 1110 1140 * @param way way to split 1111 1141 * @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 1114 1143 */ 1115 private List<Way> splitWayOnNodes(Way way, Set<Node> nodes, Map<Node, Way> oldestWayMap) {1144 private boolean splitWayOnNodes(Way way, Set<Node> nodes) { 1116 1145 1117 List<Way> result = new ArrayList<>();1118 1146 List<List<Node>> chunks = buildNodeChunks(way, nodes); 1119 1147 1120 1148 if (chunks.size() > 1) { … … 1122 1150 Collections.<OsmPrimitive>emptyList(), SplitWayCommand.Strategy.keepFirstChunk()); 1123 1151 1124 1152 if (split != null) { 1125 // execute the command, we need the results1153 // don't execute the command now 1126 1154 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; 1142 1156 } 1143 1157 } 1144 if (result.isEmpty()) { 1145 //nothing to split 1146 result.add(way); 1147 } 1148 return result; 1158 return false; 1149 1159 } 1150 1160 1151 1161 /** … … 1722 1732 cmds.add(commands.get(i)); 1723 1733 } 1724 1734 ur.undo(cmds.size()); 1735 commitCommands(message == null ? marktr("Join Areas Function") : message); 1725 1736 } 1726 1737 1727 commitCommands(message == null ? marktr("Join Areas Function") : message);1728 1738 cmdsCount = 0; 1729 1739 } 1730 1740