Ticket #20130: 20130.patch
| File 20130.patch, 4.6 KB (added by , 5 years ago) |
|---|
-
resources/data/validator/geometry.mapcss
200 200 throwWarning: tr("Water area inside water area"); 201 201 } 202 202 203 area:closed:areaStyle[landuse=residential] ⧉o area[building][building!~/no|entrance/] { 204 throwWarning: tr("Building partly outside of residential area"); 205 } 206 203 207 area:closed:areaStyle ⧉ area:closed:areaStyle { 204 208 throwOther: tr("Overlapping Areas"); 205 209 } -
src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
217 217 | < SUPERSET_OR_EQUAL: "⊇" > 218 218 | < NOT_SUPERSET_OR_EQUAL: "⊉" > 219 219 | < CROSSING: "⧉" > 220 | < CROSSING_OUTSIDE: "⧉o" > 220 221 | < PERCENT: "%" > 221 222 | < COMMENT_START: "/*" > : COMMENT 222 223 | < UNEXPECTED_CHAR : ~[] > // avoid TokenMgrErrors because they are hard to recover from … … 633 634 <NOT_SUPERSET_OR_EQUAL> { type = Selector.ChildOrParentSelectorType.NOT_SUPERSET_OR_EQUAL; } 634 635 | 635 636 <CROSSING> { type = Selector.ChildOrParentSelectorType.CROSSING; } 637 | 638 <CROSSING_OUTSIDE> { type = Selector.ChildOrParentSelectorType.CROSSING_OUTSIDE; } 636 639 ) 637 640 w() 638 641 | -
src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
126 126 * @see ChildOrParentSelector 127 127 */ 128 128 enum ChildOrParentSelectorType { 129 CHILD, PARENT, SUBSET_OR_EQUAL, NOT_SUBSET_OR_EQUAL, SUPERSET_OR_EQUAL, NOT_SUPERSET_OR_EQUAL, CROSSING, SIBLING, 129 CHILD, PARENT, SUBSET_OR_EQUAL, NOT_SUBSET_OR_EQUAL, SUPERSET_OR_EQUAL, NOT_SUPERSET_OR_EQUAL, CROSSING, SIBLING, CROSSING_OUTSIDE, 130 130 } 131 131 132 132 /** … … 318 318 }; 319 319 } 320 320 321 private finalclass CrossingFinder extends AbstractFinder {321 private class CrossingFinder extends AbstractFinder { 322 322 323 323 private final String layer; 324 324 private Area area; 325 325 /** Will contain all way segments, grouped by cells */ 326 326 Map<Point2D, List<WaySegment>> cellSegments; 327 private final boolean markOutsideArea; 327 328 328 private CrossingFinder(Environment e ) {329 private CrossingFinder(Environment e, boolean markOutside) { 329 330 super(e); 330 331 CheckParameterUtil.ensureThat(isArea(e.osm), "Only areas are supported"); 331 332 layer = OsmUtils.getLayer(e.osm); 333 this.markOutsideArea = markOutside; 332 334 } 333 335 334 336 private Area getAreaEastNorth(IPrimitive p, Environment e) { … … 398 400 if (e.intersections == null) { 399 401 e.intersections = new HashMap<>(); 400 402 } 401 e.intersections.put(p, is.b); 403 final Area hiliteArea; 404 if (markOutsideArea) { 405 hiliteArea = new Area(area); 406 hiliteArea.subtract(is.b); 407 } else { 408 hiliteArea = is.b; 409 } 410 e.intersections.put(p, hiliteArea); 402 411 } 403 412 } 404 405 413 } 406 414 407 415 private void useFindCrossings(IPrimitive p) { … … 545 553 visitBBox(e, insideOrEqualFinder); 546 554 return ChildOrParentSelectorType.SUPERSET_OR_EQUAL == type ? e.children != null : e.children == null; 547 555 548 } else if (ChildOrParentSelectorType.CROSSING == type ) {556 } else if (ChildOrParentSelectorType.CROSSING == type || ChildOrParentSelectorType.CROSSING_OUTSIDE == type) { 549 557 e.parent = e.osm; 550 558 if (e.osm.getDataSet() != null && isArea(e.osm)) { 551 final CrossingFinder crossingFinder = new CrossingFinder(e); 559 boolean markOutside = ChildOrParentSelectorType.CROSSING_OUTSIDE == type; 560 final CrossingFinder crossingFinder = new CrossingFinder(e, markOutside); 552 561 visitBBox(e, crossingFinder); 553 562 return e.children != null; 554 563 }
