Ticket #21154: 21154.patch

File 21154.patch, 2.2 KB (added by GerdP, 3 years ago)

add code to check for self-intersection or self-crossing ways

  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitObjectAction.java

     
    4242import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData.Intersection;
    4343import org.openstreetmap.josm.data.validation.Severity;
    4444import org.openstreetmap.josm.data.validation.TestError;
     45import org.openstreetmap.josm.data.validation.tests.CrossingWays;
    4546import org.openstreetmap.josm.data.validation.tests.MultipolygonTest;
     47import org.openstreetmap.josm.data.validation.tests.SelfIntersectingWay;
    4648import org.openstreetmap.josm.gui.Notification;
    4749import org.openstreetmap.josm.spi.preferences.Config;
    4850import org.openstreetmap.josm.tools.CheckParameterUtil;
     
    257259            }
    258260            SplitWayCommand result = SplitWayCommand.splitWay(
    259261                    selectedWay, wayChunks, Collections.<OsmPrimitive>emptyList());
    260             UndoRedoHandler.getInstance().add(result);
     262            result.executeCommand();
     263                        List<Way> ways = result.getParticipatingPrimitives().stream().filter(Way.class::isInstance)
     264                                        .map(Way.class::cast).collect(Collectors.toList());
     265
     266            if (!validateGeometry(ways)) {
     267                showWarningNotification(
     268                                tr("Splitting would cause invalid geometry."));
     269                result.undoCommand();
     270                return;
     271            }
     272            UndoRedoHandler.getInstance().add(result, false);
    261273            if (splitWay != null)
    262274                UndoRedoHandler.getInstance().add(new DeleteCommand(splitWay));
    263275            getLayerManager().getEditDataSet().setSelected(result.getNewSelection());
     
    264276        }
    265277    }
    266278
     279        private static boolean validateGeometry(List<Way> ways) {
     280                return ways.stream()
     281                                .noneMatch(w -> CrossingWays.isSelfCrossing(w) || SelfIntersectingWay.isSelfIntersecting(w));
     282        }
     283
    267284    /**
    268285     * Splits a multipolygon into two separate multipolygons along a way using {@link #splitMultipolygonAtWay}
    269286     * if the resulting multipolygons are valid.