Ignore:
Timestamp:
2010-01-24T17:55:56+01:00 (16 years ago)
Author:
bastiK
Message:

Reverse Arrows for 'oneway=-1' and similar (see #2387).
More efficient calculation of arrow geometry.
Test file for Arrow direction added.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r2883 r2890  
    108108    private static final int FLAG_HAS_DIRECTIONS = 1 << 5;
    109109    private static final int FLAG_TAGGED = 1 << 6;
     110    private static final int FLAG_DIRECTION_REVERSED = 1 << 7;
    110111
    111112    /**
     
    532533
    533534    private static volatile Match directionKeys = null;
     535    private static volatile Match reversedDirectionKeys = null;
    534536
    535537    /**
     
    538540     * Initialized by checkDirectionTagged()
    539541     */
    540     public static void initDirectionKeys() {
    541         if(directionKeys == null) {
    542 
    543             // Legacy support - convert list of keys to search pattern
    544             if (Main.pref.isCollection("tags.direction", false)) {
    545                 System.out.println("Collection of keys in tags.direction is no longer supported, value will converted to search pattern");
    546                 Collection<String> keys = Main.pref.getCollection("tags.direction", null);
    547                 StringBuilder builder = new StringBuilder();
    548                 for (String key:keys) {
    549                     builder.append(key);
    550                     builder.append("=* | ");
    551                 }
    552                 builder.delete(builder.length() - 3, builder.length());
    553                 Main.pref.put("tags.direction", builder.toString());
    554             }
    555 
    556             String defaultValue = "oneway? | incline=* | incline_steep=* | aerialway=* | waterway=stream | waterway=river | waterway=canal | waterway=drain | \"piste:type\"=downhill | \"piste:type\"=sled | man_made=\"piste:halfpipe\" ";
     542    static {
     543        // Legacy support - convert list of keys to search pattern
     544        if (Main.pref.isCollection("tags.direction", false)) {
     545            System.out.println("Collection of keys in tags.direction is no longer supported, value will converted to search pattern");
     546            Collection<String> keys = Main.pref.getCollection("tags.direction", null);
     547            StringBuilder builder = new StringBuilder();
     548            for (String key:keys) {
     549                builder.append(key);
     550                builder.append("=* | ");
     551            }
     552            builder.delete(builder.length() - 3, builder.length());
     553            Main.pref.put("tags.direction", builder.toString());
     554        }
     555
     556        String reversedDirectionDefault = "oneway=\"-1\" | incline=down | incline=\"-*\"";
     557        String directionDefault = "oneway? | incline=* | aerialway=* | waterway=stream | waterway=river | waterway=canal | waterway=drain | waterway=rapids | \"piste:type\"=downhill | \"piste:type\"=sled | man_made=\"piste:halfpipe\" ";
     558
     559        try {
     560            reversedDirectionKeys = SearchCompiler.compile(Main.pref.get("tags.reversed_direction", reversedDirectionDefault), false, false);
     561        } catch (ParseError e) {
     562            System.err.println("Unable to compile pattern for tags.reversed_direction, trying default pattern: " + e.getMessage());
     563
    557564            try {
    558                 directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", defaultValue), false, false);
    559             } catch (ParseError e) {
    560                 System.err.println("Unable to compile pattern for tags.direction, trying default pattern: " + e.getMessage());
    561 
    562                 try {
    563                     directionKeys = SearchCompiler.compile(defaultValue, false, false);
    564                 } catch (ParseError e2) {
    565                     throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage());
    566                 }
     565                reversedDirectionKeys = SearchCompiler.compile(reversedDirectionDefault, false, false);
     566            } catch (ParseError e2) {
     567                throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage());
     568            }
     569        }
     570        try {
     571            directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", directionDefault), false, false);
     572        } catch (ParseError e) {
     573            System.err.println("Unable to compile pattern for tags.direction, trying default pattern: " + e.getMessage());
     574
     575            try {
     576                directionKeys = SearchCompiler.compile(directionDefault, false, false);
     577            } catch (ParseError e2) {
     578                throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage());
    567579            }
    568580        }
     
    576588     * direction dependent.
    577589     */
     590    @Deprecated
    578591    public static Collection<String> getDirectionKeys() {
    579592        return Main.pref.getCollection("tags.direction",
     
    863876    private void keysChangedImpl(Map<String, String> originalKeys) {
    864877        clearCached();
    865         updateHasDirectionKeys();
     878        updateDirectionFlags();
    866879        updateTagged();
    867880        if (dataSet != null) {
     
    11261139    }
    11271140
    1128     private void updateHasDirectionKeys() {
    1129         initDirectionKeys();
     1141    private void updateDirectionFlags() {
     1142        boolean hasDirections = false;
     1143        boolean directionReversed = false;
     1144        if (reversedDirectionKeys.match(this)) {
     1145            hasDirections = true;
     1146            directionReversed = true;
     1147        }
    11301148        if (directionKeys.match(this)) {
     1149            hasDirections = true;
     1150        }
     1151
     1152        if (directionReversed) {
     1153            flags |= FLAG_DIRECTION_REVERSED;
     1154        } else {
     1155            flags &= ~FLAG_DIRECTION_REVERSED;
     1156        }
     1157        if (hasDirections) {
    11311158            flags |= FLAG_HAS_DIRECTIONS;
    11321159        } else {
     
    11421169    }
    11431170
     1171    public boolean reversedDirection() {
     1172        return (flags & FLAG_DIRECTION_REVERSED) != 0;
     1173    }
    11441174    /**
    11451175     * Replies the name of this primitive. The default implementation replies the value
     
    12221252
    12231253    protected String getFlagsAsString() {
    1224 
    12251254        StringBuilder builder = new StringBuilder();
    12261255
     
    12401269            builder.append("f");
    12411270        }
    1242 
    1243         if (isDeleted()) {
     1271        if (isDisabled()) {
    12441272            builder.append("d");
    12451273        }
    1246 
     1274        if (isTagged()) {
     1275            builder.append("T");
     1276        }
     1277        if (hasDirectionKeys()) {
     1278            if (reversedDirection()) {
     1279                builder.append("<");
     1280            } else {
     1281                builder.append(">");
     1282            }
     1283        }
    12471284        return builder.toString();
    12481285    }
Note: See TracChangeset for help on using the changeset viewer.