Ignore:
Timestamp:
2017-04-17T19:27:17+02:00 (8 years ago)
Author:
donvip
Message:

fix #josm14386 - StackOverflowError

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/reltoolbox/src/relcontext/ChosenRelation.java

    r32398 r33265  
    150150        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f * opacity));
    151151
    152         drawRelations(g, mv, bbox, chosenRelation);
     152        drawRelations(g, mv, bbox, chosenRelation, new HashSet<>());
    153153
    154154        g.setComposite(oldComposite);
     
    156156    }
    157157
    158     private void drawRelations(Graphics2D g, MapView mv, Bounds bbox, Relation rel) {
    159         for (OsmPrimitive element : rel.getMemberPrimitives()) {
    160             if (element.getType() == OsmPrimitiveType.NODE) {
    161                 Node node = (Node) element;
    162                 Point center = mv.getPoint(node);
    163                 g.drawOval(center.x - 4, center.y - 4, 9, 9);
    164             } else if (element.getType() == OsmPrimitiveType.WAY) {
    165                 Way way = (Way) element;
    166                 if (way.getNodesCount() >= 2) {
    167                     GeneralPath b = new GeneralPath();
    168                     Point p = mv.getPoint(way.getNode(0));
    169                     b.moveTo(p.x, p.y);
    170                     for (int i = 1; i < way.getNodesCount(); i++) {
    171                         p = mv.getPoint(way.getNode(i));
    172                         b.lineTo(p.x, p.y);
     158    private void drawRelations(Graphics2D g, MapView mv, Bounds bbox, Relation rel, Set<Relation> visitedRelations) {
     159        if (!visitedRelations.contains(rel)) {
     160            visitedRelations.add(rel);
     161            for (OsmPrimitive element : rel.getMemberPrimitives()) {
     162                if (element.getType() == OsmPrimitiveType.NODE) {
     163                    Node node = (Node) element;
     164                    Point center = mv.getPoint(node);
     165                    g.drawOval(center.x - 4, center.y - 4, 9, 9);
     166                } else if (element.getType() == OsmPrimitiveType.WAY) {
     167                    Way way = (Way) element;
     168                    if (way.getNodesCount() >= 2) {
     169                        GeneralPath b = new GeneralPath();
     170                        Point p = mv.getPoint(way.getNode(0));
     171                        b.moveTo(p.x, p.y);
     172                        for (int i = 1; i < way.getNodesCount(); i++) {
     173                            p = mv.getPoint(way.getNode(i));
     174                            b.lineTo(p.x, p.y);
     175                        }
     176                        g.draw(b);
    173177                    }
    174                     g.draw(b);
     178                } else if (element.getType() == OsmPrimitiveType.RELATION) {
     179                    Color oldColor = g.getColor();
     180                    g.setColor(Color.magenta);
     181                    drawRelations(g, mv, bbox, (Relation) element, visitedRelations);
     182                    g.setColor(oldColor);
    175183                }
    176             } else if (element.getType() == OsmPrimitiveType.RELATION) {
    177                 Color oldColor = g.getColor();
    178                 g.setColor(Color.magenta);
    179                 drawRelations(g, mv, bbox, (Relation) element);
    180                 g.setColor(oldColor);
     184                // todo: closedway, multipolygon - ?
    181185            }
    182             // todo: closedway, multipolygon - ?
    183186        }
    184187    }
Note: See TracChangeset for help on using the changeset viewer.