Ticket #21154: 21154-core.patch

File 21154-core.patch, 6.0 KB (added by GerdP, 3 years ago)

possible patch for JOSM core to perform geometry checks on a way

  • src/org/openstreetmap/josm/actions/AlignInCircleAction.java

     
    3131import org.openstreetmap.josm.data.osm.Way;
    3232import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
    3333import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
    34 import org.openstreetmap.josm.data.validation.tests.CrossingWays;
    35 import org.openstreetmap.josm.data.validation.tests.SelfIntersectingWay;
     34import org.openstreetmap.josm.data.validation.OsmValidator;
    3635import org.openstreetmap.josm.gui.Notification;
    3736import org.openstreetmap.josm.tools.Geometry;
    3837import org.openstreetmap.josm.tools.Logging;
     
    327326        }
    328327
    329328        try {
    330             if (CrossingWays.isSelfCrossing(test))
    331                 return false;
    332             return !SelfIntersectingWay.isSelfIntersecting(test);
     329            return OsmValidator.validateGeometry(test, false);
    333330        } finally {
    334331            test.setNodes(null); // see #19855
    335332        }
  • src/org/openstreetmap/josm/actions/CombineWayAction.java

     
    3737import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
    3838import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
    3939import org.openstreetmap.josm.data.preferences.BooleanProperty;
    40 import org.openstreetmap.josm.data.validation.Test;
    41 import org.openstreetmap.josm.data.validation.tests.OverlappingWays;
    42 import org.openstreetmap.josm.data.validation.tests.SelfIntersectingWay;
     40import org.openstreetmap.josm.data.validation.OsmValidator;
    4341import org.openstreetmap.josm.gui.ExtendedDialog;
    4442import org.openstreetmap.josm.gui.MainApplication;
    4543import org.openstreetmap.josm.gui.Notification;
     
    307305
    308306        final Way selectedWay = combineResult.a;
    309307        UndoRedoHandler.getInstance().add(combineResult.b);
    310         Test test = new OverlappingWays();
    311         test.startTest(null);
    312         test.visit(combineResult.a);
    313         test.endTest();
    314         if (test.getErrors().isEmpty()) {
    315             test = new SelfIntersectingWay();
    316             test.startTest(null);
    317             test.visit(combineResult.a);
    318             test.endTest();
    319         }
    320         if (!test.getErrors().isEmpty()) {
    321             new Notification(test.getErrors().get(0).getMessage())
    322             .setIcon(JOptionPane.WARNING_MESSAGE)
    323             .setDuration(Notification.TIME_SHORT)
    324             .show();
    325         }
     308        OsmValidator.validateGeometry(selectedWay, true);
    326309        if (selectedWay != null) {
    327310            GuiHelper.runInEDT(() -> ds.setSelected(selectedWay));
    328311        }
  • src/org/openstreetmap/josm/data/validation/OsmValidator.java

     
    3535import javax.swing.tree.TreeModel;
    3636import javax.swing.tree.TreeNode;
    3737
     38import org.openstreetmap.josm.data.osm.Way;
    3839import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
    3940import org.openstreetmap.josm.data.projection.ProjectionRegistry;
    4041import org.openstreetmap.josm.data.validation.tests.Addresses;
     
    4445import org.openstreetmap.josm.data.validation.tests.ConditionalKeys;
    4546import org.openstreetmap.josm.data.validation.tests.ConnectivityRelations;
    4647import org.openstreetmap.josm.data.validation.tests.CrossingWays;
     48import org.openstreetmap.josm.data.validation.tests.CrossingWays.SelfCrossing;
    4749import org.openstreetmap.josm.data.validation.tests.DirectionNodes;
    4850import org.openstreetmap.josm.data.validation.tests.DuplicateNode;
    4951import org.openstreetmap.josm.data.validation.tests.DuplicateRelation;
     
    7476import org.openstreetmap.josm.data.validation.tests.WayConnectedToArea;
    7577import org.openstreetmap.josm.data.validation.tests.WronglyOrderedWays;
    7678import org.openstreetmap.josm.gui.MainApplication;
     79import org.openstreetmap.josm.gui.Notification;
    7780import org.openstreetmap.josm.gui.layer.ValidatorLayer;
    7881import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
    7982import org.openstreetmap.josm.gui.util.GuiHelper;
     
    695698    static void clearIgnoredErrors() {
    696699        ignoredErrors.clear();
    697700    }
     701
     702    /**
     703     * Execute geometry tests {@link OverlappingWays}, {@link SelfCrossing},
     704     * and {@link SelfIntersectingWay} on a given way.
     705     * @param way the way to test
     706     * @param showNotification if set to {@code true} and an error was found show the corresponding message
     707     * @return {@code true} if no error was found, else {@code false}
     708     * @since xxx
     709     */
     710    public static boolean validateGeometry(Way way, boolean showNotification) {
     711        Test test = new OverlappingWays();
     712        test.startTest(null);
     713        test.visit(way);
     714        test.endTest();
     715        if (test.getErrors().isEmpty()) {
     716            test = new SelfCrossing();
     717            test.startTest(null);
     718            test.visit(way);
     719            test.endTest();
     720        }
     721        if (test.getErrors().isEmpty()) {
     722            test = new SelfIntersectingWay();
     723            test.startTest(null);
     724            test.visit(way);
     725            test.endTest();
     726        }
     727        if (!test.getErrors().isEmpty()) {
     728            if (showNotification) {
     729                new Notification(test.getErrors().get(0).getMessage())
     730                .setIcon(JOptionPane.WARNING_MESSAGE)
     731                .setDuration(Notification.TIME_SHORT)
     732                .show();
     733            }
     734            return false;
     735        }
     736        return true;
     737    }
    698738}