Changeset 33848 in osm
- Timestamp:
- 2017-11-21T01:35:52+01:00 (7 years ago)
- Location:
- applications/editors/josm/plugins/merge-overlap
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/merge-overlap/build.xml
r33436 r33848 4 4 <property name="commit.message" value="MergeOverlap: help shortcut parser, rebuild"/> 5 5 <!-- enter the *lowest* JOSM version this plugin is currently compatible with --> 6 <property name="plugin.main.version" value="12 463"/>6 <property name="plugin.main.version" value="12840"/> 7 7 8 8 <!-- Configure these properties (replace "..." accordingly). -
applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java
r33436 r33848 9 9 import java.awt.event.KeyEvent; 10 10 import java.util.ArrayList; 11 import java.util.Arrays;12 11 import java.util.Collection; 13 12 import java.util.Collections; 14 13 import java.util.HashMap; 15 14 import java.util.HashSet; 16 import java.util.Iterator;17 15 import java.util.LinkedHashSet; 18 16 import java.util.LinkedList; … … 21 19 import java.util.Set; 22 20 23 import javax.swing.JOptionPane;24 25 import mergeoverlap.hack.MyCombinePrimitiveResolverDialog;26 27 21 import org.openstreetmap.josm.Main; 28 22 import org.openstreetmap.josm.actions.JosmAction; 29 import org.openstreetmap.josm.actions.SplitWayAction;30 import org.openstreetmap.josm.actions.SplitWayAction.SplitWayResult;31 import org.openstreetmap.josm.command.AddCommand;32 23 import org.openstreetmap.josm.command.ChangeCommand; 33 24 import org.openstreetmap.josm.command.Command; 34 25 import org.openstreetmap.josm.command.DeleteCommand; 35 26 import org.openstreetmap.josm.command.SequenceCommand; 27 import org.openstreetmap.josm.command.SplitWayCommand; 36 28 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector; 37 29 import org.openstreetmap.josm.data.osm.Node; … … 39 31 import org.openstreetmap.josm.data.osm.OsmPrimitive; 40 32 import org.openstreetmap.josm.data.osm.Relation; 41 import org.openstreetmap.josm.data.osm.RelationMember;42 33 import org.openstreetmap.josm.data.osm.TagCollection; 43 34 import org.openstreetmap.josm.data.osm.Way; 44 import org.openstreetmap.josm.gui. layer.OsmDataLayer;35 import org.openstreetmap.josm.gui.MainApplication; 45 36 import org.openstreetmap.josm.tools.Pair; 46 37 import org.openstreetmap.josm.tools.Shortcut; 47 38 import org.openstreetmap.josm.tools.UserCancelException; 39 40 import mergeoverlap.hack.MyCombinePrimitiveResolverDialog; 48 41 49 42 /** … … 162 155 } 163 156 if (!nodes.isEmpty() && !way.isClosed() || nodes.size() >= 2) { 164 List<List<Node>> wayChunks = SplitWay Action.buildSplitChunks(way, new ArrayList<>(nodes));165 SplitWay Resultresult = splitWay(getLayerManager().getEditLayer(),way, wayChunks);166 167 cmds.add(result .getCommand());157 List<List<Node>> wayChunks = SplitWayCommand.buildSplitChunks(way, new ArrayList<>(nodes)); 158 SplitWayCommand result = SplitWayCommand.splitWay(way, wayChunks, Collections.emptyList()); 159 160 cmds.add(result); 168 161 sel.remove(way); 169 162 sel.add(result.getOriginalWay()); … … 238 231 Main.main.undoRedo.add(new SequenceCommand(tr("Merge Overlap (combine)"), cmds)); 239 232 getLayerManager().getEditDataSet().setSelected(sel); 240 Main .map.repaint();233 MainApplication.getMap().repaint(); 241 234 242 235 relations.clear(); … … 294 287 295 288 /** 296 * Splits a way297 *298 * @param layer299 * @param way300 * @param wayChunks301 * @return302 */303 private SplitWayResult splitWay(OsmDataLayer layer, Way way, List<List<Node>> wayChunks) {304 // build a list of commands, and also a new selection list305 Collection<Command> commandList = new ArrayList<>(wayChunks.size());306 307 Iterator<List<Node>> chunkIt = wayChunks.iterator();308 Collection<String> nowarnroles = Main.pref.getCollection("way.split.roles.nowarn",309 Arrays.asList(new String[] { "outer", "inner", "forward", "backward" }));310 311 // First, change the original way312 Way changedWay = new Way(way);313 oldWays.put(changedWay, way);314 changedWay.setNodes(chunkIt.next());315 commandList.add(new ChangeCommand(way, changedWay));316 317 List<Way> newWays = new ArrayList<>();318 // Second, create new ways319 while (chunkIt.hasNext()) {320 Way wayToAdd = new Way();321 wayToAdd.setKeys(way.getKeys());322 newWays.add(wayToAdd);323 wayToAdd.setNodes(chunkIt.next());324 commandList.add(new AddCommand(layer, wayToAdd));325 }326 boolean warnmerole = false;327 boolean warnme = false;328 // now copy all relations to new way also329 330 for (Relation r : getParentRelations(way)) {331 if (!r.isUsable()) {332 continue;333 }334 Relation c = null;335 String type = r.get("type");336 if (type == null) {337 type = "";338 }339 340 int ic = 0, ir = 0;341 List<RelationMember> relationMembers = r.getMembers();342 for (RelationMember rm : relationMembers) {343 if (rm.isWay() && rm.getMember() == way) {344 boolean insert = true;345 if ("restriction".equals(type)) {346 /*347 * this code assumes the restriction is correct. No real348 * error checking done349 */350 String role = rm.getRole();351 if ("from".equals(role) || "to".equals(role)) {352 OsmPrimitive via = null;353 for (RelationMember rmv : r.getMembers()) {354 if ("via".equals(rmv.getRole())) {355 via = rmv.getMember();356 }357 }358 List<Node> nodes = new ArrayList<>();359 if (via != null) {360 if (via instanceof Node) {361 nodes.add((Node) via);362 } else if (via instanceof Way) {363 nodes.add(((Way) via).lastNode());364 nodes.add(((Way) via).firstNode());365 }366 }367 Way res = null;368 for (Node n : nodes) {369 if (changedWay.isFirstLastNode(n)) {370 res = way;371 }372 }373 if (res == null) {374 for (Way wayToAdd : newWays) {375 for (Node n : nodes) {376 if (wayToAdd.isFirstLastNode(n)) {377 res = wayToAdd;378 }379 }380 }381 if (res != null) {382 if (c == null) {383 c = getNew(r);384 }385 c.addMember(new RelationMember(role, res));386 c.removeMembersFor(way);387 insert = false;388 }389 } else {390 insert = false;391 }392 } else if (!"via".equals(role)) {393 warnme = true;394 }395 } else if (!("route".equals(type)) && !("multipolygon".equals(type))) {396 warnme = true;397 }398 if (c == null) {399 c = getNew(r);400 }401 402 if (insert) {403 if (rm.hasRole() && !nowarnroles.contains(rm.getRole())) {404 warnmerole = true;405 }406 407 Boolean backwards = null;408 int k = 1;409 while (ir - k >= 0 || ir + k < relationMembers.size()) {410 if ((ir - k >= 0) && relationMembers.get(ir - k).isWay()) {411 Way w = relationMembers.get(ir - k).getWay();412 if ((w.lastNode() == way.firstNode()) || w.firstNode() == way.firstNode()) {413 backwards = false;414 } else if ((w.firstNode() == way.lastNode()) || w.lastNode() == way.lastNode()) {415 backwards = true;416 }417 break;418 }419 if ((ir + k < relationMembers.size()) && relationMembers.get(ir + k).isWay()) {420 Way w = relationMembers.get(ir + k).getWay();421 if ((w.lastNode() == way.firstNode()) || w.firstNode() == way.firstNode()) {422 backwards = true;423 } else if ((w.firstNode() == way.lastNode()) || w.lastNode() == way.lastNode()) {424 backwards = false;425 }426 break;427 }428 k++;429 }430 431 int j = ic;432 for (Way wayToAdd : newWays) {433 RelationMember em = new RelationMember(rm.getRole(), wayToAdd);434 j++;435 if ((backwards != null) && backwards) {436 c.addMember(ic, em);437 } else {438 c.addMember(j, em);439 }440 }441 ic = j;442 }443 }444 ic++;445 ir++;446 }447 448 if (c != null) {449 // commandList.add(new ChangeCommand(layer, r, c));450 newRelations.put(r, c);451 }452 }453 if (warnmerole) {454 JOptionPane.showMessageDialog(Main.parent,455 tr("<html>A role based relation membership was copied to all new ways.<br>You should verify this and correct it when necessary.</html>"),456 tr("Warning"), JOptionPane.WARNING_MESSAGE);457 } else if (warnme) {458 JOptionPane.showMessageDialog(Main.parent,459 tr("<html>A relation membership was copied to all new ways.<br>You should verify this and correct it when necessary.</html>"),460 tr("Warning"), JOptionPane.WARNING_MESSAGE);461 }462 463 return new SplitWayResult(new SequenceCommand(tr("Split way"), commandList), null, changedWay, newWays);464 }465 466 /**467 289 * @param ways 468 290 * @return null if ways cannot be combined. Otherwise returns the combined … … 639 461 } 640 462 641 private Relation getNew(Relation r) {642 return getNew(r, newRelations);643 }644 645 463 public static Relation getNew(Relation r, Map<Relation, Relation> newRelations) { 646 464 if (newRelations.containsValue(r)) { -
applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapPlugin.java
r30782 r33848 1 1 package mergeoverlap; 2 2 3 import org.openstreetmap.josm. Main;3 import org.openstreetmap.josm.gui.MainApplication; 4 4 import org.openstreetmap.josm.gui.MainMenu; 5 5 import org.openstreetmap.josm.plugins.Plugin; … … 17 17 public MergeOverlapPlugin(PluginInformation info) { 18 18 super(info); 19 MainMenu.add(Main .main.menu.moreToolsMenu, new MergeOverlapAction());19 MainMenu.add(MainApplication.getMenu().moreToolsMenu, new MergeOverlapAction()); 20 20 } 21 21 }
Note:
See TracChangeset
for help on using the changeset viewer.