CircleAperture.java

package com.varnernet.gerb4j;

import com.varnernet.gerb4j.render.GerberOutputTarget;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

/**
 * A circular aperture.
 *
 * <p>A circle aperture defines a circular shape that can be flashed or used for drawing lines.
 * It may optionally have a hole in the center.
 */
public class CircleAperture extends Aperture {
    private final double diameter;
    private final double holeDiameter;

    /**
     * Creates a new circle aperture.
     *
     * @param id           the aperture identifier
     * @param diameter     the diameter of the circle
     * @param holeDiameter the diameter of the optional hole (0.0 for no hole)
     */
    public CircleAperture(final String id, final String diameter, final String holeDiameter) {
        super(id);
        this.diameter = Double.parseDouble(diameter);
        this.holeDiameter = (holeDiameter == null) ? 0.0 : Double.parseDouble(holeDiameter);
    }

    /**
     * Returns the diameter of the circle.
     *
     * @return the diameter
     */
    public double getDiameter() {
        return diameter;
    }

    /**
     * Returns the diameter of the optional hole.
     *
     * @return the hole diameter (0.0 if no hole)
     */
    public double getHoleDiameter() {
        return holeDiameter;
    }

    /**
     * Bounds centred at (0,0): a square enclosing the full diameter.
     */
    @Override
    public Rectangle2D getBounds() {
        double r = diameter / 2.0;
        return new Rectangle2D.Double(-r, -r, diameter, diameter);
    }

    /**
     * Circle apertures are the standard drawing aperture; stroke width = diameter.
     */
    @Override
    public double getStrokeWidth() {
        return diameter;
    }

    @Override
    public void render(final Point2D flashPoint, final GerberOutputTarget target, final Polarity polarity) {
        target.drawCircle(flashPoint, diameter, 0.0, polarity);
        if (holeDiameter > 0) {
            target.drawCircle(flashPoint, holeDiameter, 0.0, invertPolarity(polarity));
        }
    }
}