@Override public Double getNaturalLength(Map<String, Object> map, Shape shp, MapTransform mt) throws ParameterException, IOException { double naturalLength; if (length != null) { double lineLength = ShapeHelper.getLineLength(shp); Double value = length.getValue(map); if (value != null) { naturalLength = Uom.toPixel(value, getUom(), mt.getDpi(), mt.getScaleDenominator(), lineLength); // if (naturalLength <= GraphicStroke.MIN_LENGTH || naturalLength > lineLength) { if (naturalLength < 1e-5 || Double.isInfinite(naturalLength)) { return Double.POSITIVE_INFINITY; } if (naturalLength > lineLength) { naturalLength = lineLength; } return naturalLength; } } return getGraphicWidth(map, mt); }
/** * @param g2 * @param rs * @param fid * @throws ParameterException * @throws IOException error while accessing external resource * @throws java.sql.SQLException */ @Override public void draw( Graphics2D g2, ResultSet rs, long fid, boolean selected, MapTransform mt, Geometry the_geom) throws ParameterException, IOException, SQLException { List<Shape> shapes = new LinkedList<Shape>(); shapes.add(mt.getShape(the_geom, true)); Map<String, Object> map = getFeaturesMap(rs, fid); for (Shape shp : shapes) { if (this.getTranslate() != null) { shp = getTranslate() .getAffineTransform( map, getUom(), mt, (double) mt.getWidth(), (double) mt.getHeight()) .createTransformedShape(shp); } if (shp != null) { if (fill != null) { fill.draw(g2, map, shp, selected, mt); } if (stroke != null) { double offset = 0.0; if (perpendicularOffset != null) { offset = Uom.toPixel( perpendicularOffset.getValue(rs, fid), getUom(), mt.getDpi(), mt.getScaleDenominator(), null); } stroke.draw(g2, map, shp, selected, mt, offset); } } } }
@Override public void draw( Graphics2D g2, Map<String, Object> map, Shape shape, boolean selected, MapTransform mt, double offset) throws ParameterException, IOException { List<Shape> shapes; if (!this.isOffsetRapport() && Math.abs(offset) > 0.0) { shapes = ShapeHelper.perpendicularOffset(shape, offset); // Setting offset to 0.0 let be sure the offset will never been applied twice! offset = 0.0; } else { shapes = new ArrayList<Shape>(); // TODO : Extract holes as separate shape ! shapes.add(shape); } double gWidth = getGraphicWidth(map, mt); for (Shape shp : shapes) { double segLength = getNaturalLength(map, shp, mt); double lineLength = ShapeHelper.getLineLength(shp); if (segLength > lineLength) { segLength = lineLength; } RelativeOrientation rOrient = this.getRelativeOrientation(); List<Shape> segments = null; double nbSegments; // int nbToDraw; if (this.isLengthRapport()) { nbSegments = (int) ((lineLength / segLength) + 0.5); segments = ShapeHelper.splitLine(shp, (int) nbSegments); // segLength = lineLength / nbSegments; // nbToDraw = (int) nbSegments; } else { nbSegments = lineLength / segLength; if (nbSegments == 0 && getParent() instanceof StrokeElement) { nbSegments = 1; } if (nbSegments > 0) { // TODO remove half of extra space at the beginning of the line // shp = ShapeHelper.splitLine(shp, (nbSegments - nbToDraw)/2.0).get(1); segments = ShapeHelper.splitLineInSeg(shp, segLength); } } if (segments != null) { for (Shape seg : segments) { List<Shape> oSegs; if (this.isOffsetRapport() && Math.abs(offset) > 0.0) { oSegs = ShapeHelper.perpendicularOffset(seg, offset); } else { oSegs = new ArrayList<Shape>(); oSegs.add(seg); } for (Shape oSeg : oSegs) { if (oSeg != null) { double realSegLength = ShapeHelper.getLineLength(oSeg); // Is there enough space on the real segment ? otherwise is the graphic part of a // compound stroke ? if (realSegLength > 0.9 * segLength || (getParent() instanceof StrokeElement && segLength == 0.0)) { Point2D.Double pt; double relativePos = 0.5; if (relativePosition != null) { relativePos = relativePosition.getValue(map); } if (segLength < MIN_LENGTH) { pt = ShapeHelper.getPointAt(oSeg, 0); } else { // TODO Replace with relative position ! pt = ShapeHelper.getPointAt(oSeg, realSegLength * relativePos); } AffineTransform at = AffineTransform.getTranslateInstance(pt.x, pt.y); if (rOrient != RelativeOrientation.PORTRAYAL) { Point2D.Double ptA; Point2D.Double ptB; if (segLength < MIN_LENGTH) { ptA = pt; ptB = ShapeHelper.getPointAt(oSeg, gWidth); } else { ptA = ShapeHelper.getPointAt(oSeg, relativePos * realSegLength - (gWidth * 0.5)); ptB = ShapeHelper.getPointAt(oSeg, relativePos * realSegLength + (gWidth * 0.5)); } double theta = Math.atan2(ptB.y - ptA.y, ptB.x - ptA.x); switch (rOrient) { case LINE: theta += 0.5 * Math.PI; break; case NORMAL_UP: if (theta < -Math.PI / 2 || theta > Math.PI / 2) { theta += Math.PI; } break; } at.concatenate(AffineTransform.getRotateInstance(theta)); } graphic.draw(g2, map, selected, mt, at); } } } } } } }