Ticket #8798: IgnoreSharedNodes1-OverlappingSegmentOnly.patch

File IgnoreSharedNodes1-OverlappingSegmentOnly.patch, 3.8 KB (added by AlfonZ, 11 years ago)

Should extrusion create overlapping segments, which can't be simplified by moving the node because it's shared with another way, the node is removed from extruded way and replaced by new one. The behavior is controlled by advanced property extrude.ignore-shared-nodes (disabled by default).

  • src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java

     
    7171    private Node selectedNode = null;
    7272    private Color mainColor;
    7373    private Stroke mainStroke;
     74    private boolean ignoreSharedNodes;
    7475   
    7576    /**
    7677     * drawing settings for helper lines
     
    212213       
    213214        oldLineStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.ctrl.stroke.old-line", "1"));
    214215        mainStroke = GuiHelper.getCustomizedStroke(Main.pref.get("extrude.stroke.main", "3"));
     216
     217        ignoreSharedNodes = Main.pref.getBoolean("extrude.ignore-shared-nodes", false);
    215218    }
    216219
    217220    @Override public void exitMode() {
     
    439442        //find if the new points overlap existing segments (in case of 90 degree angles)
    440443        Node prevNode = getPreviousNode(selectedSegment.lowerIndex);
    441444        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;
    442447        boolean hasOtherWays = this.hasNodeOtherWays(selectedSegment.getFirstNode(), selectedSegment.way);
    443448
    444449        if (nodeOverlapsSegment && !alwaysCreateNodes && !hasOtherWays) {
    445450            //move existing node
    446451            Node n1Old = selectedSegment.getFirstNode();
    447452            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));
    448461        } else {
    449462            //introduce new node
    450463            Node n1New = new Node(Main.getProjection().eastNorth2latlon(newN1en));
     
    457470        //find if the new points overlap existing segments (in case of 90 degree angles)
    458471        Node nextNode = getNextNode(selectedSegment.lowerIndex + 1);
    459472        nodeOverlapsSegment = nextNode != null && Geometry.segmentsParallel(initialN2en, nextNode.getEastNorth(), initialN2en, newN2en);
     473        segmentAngleZero = nextNode != null && Math.abs(Geometry.getCornerAngle(nextNode.getEastNorth(), initialN2en, newN2en)) < 1e-5;
    460474        hasOtherWays = hasNodeOtherWays(selectedSegment.getSecondNode(), selectedSegment.way);
    461475
    462476        if (nodeOverlapsSegment && !alwaysCreateNodes && !hasOtherWays) {
    463477            //move existing node
    464478            Node n2Old = selectedSegment.getSecondNode();
    465479            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));
    466488        } else {
    467489            //introduce new node
    468490            Node n2New = new Node(Main.getProjection().eastNorth2latlon(newN2en));