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));
}
}
}