Ticket #8798: IgnoreSharedNodes1-OverlappingSegmentOnly.patch
File IgnoreSharedNodes1-OverlappingSegmentOnly.patch, 3.8 KB (added by , 11 years ago) |
---|
-
src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
71 71 private Node selectedNode = null; 72 72 private Color mainColor; 73 73 private Stroke mainStroke; 74 private boolean ignoreSharedNodes; 74 75 75 76 /** 76 77 * drawing settings for helper lines … … 212 213 213 214 oldLineStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.ctrl.stroke.old-line", "1")); 214 215 mainStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.stroke.main", "3")); 216 217 ignoreSharedNodes = Main.pref.getBoolean("extrude.ignore-shared-nodes", false); 215 218 } 216 219 217 220 @Override public void exitMode() { … … 439 442 //find if the new points overlap existing segments (in case of 90 degree angles) 440 443 Node prevNode = getPreviousNode(selectedSegment.lowerIndex); 441 444 boolean nodeOverlapsSegment = prevNode != null && Geometry.segmentsParallel(initialN1en, prevNode.getEastNorth(), initialN1en, newN1en); 445 // segmentAngleZero marks subset of nodeOverlapsSegment. nodeOverlapsSegment is true if angle between segments is 0 or PI, segmentAngleZero only if angle is 0 446 boolean segmentAngleZero = prevNode != null && Math.abs(Geometry.getCornerAngle(prevNode.getEastNorth(), initialN1en, newN1en)) < 1e-5; 442 447 boolean hasOtherWays = this.hasNodeOtherWays(selectedSegment.getFirstNode(), selectedSegment.way); 443 448 444 449 if (nodeOverlapsSegment && !alwaysCreateNodes && !hasOtherWays) { 445 450 //move existing node 446 451 Node n1Old = selectedSegment.getFirstNode(); 447 452 cmds.add(new MoveCommand(n1Old, Main.getProjection().eastNorth2latlon(newN1en))); 453 } else if (ignoreSharedNodes && segmentAngleZero && !alwaysCreateNodes && hasOtherWays) { 454 // replace shared node with new one 455 Node n1Old = selectedSegment.getFirstNode(); 456 Node n1New = new Node(Main.getProjection().eastNorth2latlon(newN1en)); 457 wnew.addNode(insertionPoint, n1New); 458 wnew.removeNode(n1Old); 459 wayWasModified = true; 460 cmds.add(new AddCommand(n1New)); 448 461 } else { 449 462 //introduce new node 450 463 Node n1New = new Node(Main.getProjection().eastNorth2latlon(newN1en)); … … 457 470 //find if the new points overlap existing segments (in case of 90 degree angles) 458 471 Node nextNode = getNextNode(selectedSegment.lowerIndex + 1); 459 472 nodeOverlapsSegment = nextNode != null && Geometry.segmentsParallel(initialN2en, nextNode.getEastNorth(), initialN2en, newN2en); 473 segmentAngleZero = nextNode != null && Math.abs(Geometry.getCornerAngle(nextNode.getEastNorth(), initialN2en, newN2en)) < 1e-5; 460 474 hasOtherWays = hasNodeOtherWays(selectedSegment.getSecondNode(), selectedSegment.way); 461 475 462 476 if (nodeOverlapsSegment && !alwaysCreateNodes && !hasOtherWays) { 463 477 //move existing node 464 478 Node n2Old = selectedSegment.getSecondNode(); 465 479 cmds.add(new MoveCommand(n2Old, Main.getProjection().eastNorth2latlon(newN2en))); 480 } else if (ignoreSharedNodes && segmentAngleZero && !alwaysCreateNodes && hasOtherWays) { 481 // replace shared node with new one 482 Node n2Old = selectedSegment.getSecondNode(); 483 Node n2New = new Node(Main.getProjection().eastNorth2latlon(newN2en)); 484 wnew.addNode(insertionPoint, n2New); 485 wnew.removeNode(n2Old); 486 wayWasModified = true; 487 cmds.add(new AddCommand(n2New)); 466 488 } else { 467 489 //introduce new node 468 490 Node n2New = new Node(Main.getProjection().eastNorth2latlon(newN2en));