Ignore:
Timestamp:
24.01.2010 17:55:56 (2 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.