/* * Copyright (C) 2011 Jason von Nieda <jason@vonnieda.org> * * This file is part of OpenPnP. * * OpenPnP is free software: you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * OpenPnP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with OpenPnP. If not, see * <http://www.gnu.org/licenses/>. * * For more information about OpenPnP visit http://openpnp.org */ package org.openpnp.gui.components.reticle; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import org.openpnp.model.Length; import org.openpnp.model.LengthUnit; public class RulerReticle extends CrosshairReticle { private LengthUnit units; private double unitsPerTick; public RulerReticle() { super(); this.units = LengthUnit.Millimeters; this.unitsPerTick = 1; setColor(Color.red); } public LengthUnit getUnits() { return units; } public void setUnits(LengthUnit units) { this.units = units; } public double getUnitsPerTick() { return unitsPerTick; } public void setUnitsPerTick(double unitsPerTick) { this.unitsPerTick = unitsPerTick; } @Override public void draw(Graphics2D g2d, LengthUnit cameraUnitsPerPixelUnits, double cameraUnitsPerPixelX, double cameraUnitsPerPixelY, double viewPortCenterX, double viewPortCenterY, int viewPortWidth, int viewPortHeight, double rotation) { super.draw(g2d, cameraUnitsPerPixelUnits, cameraUnitsPerPixelX, cameraUnitsPerPixelY, viewPortCenterX, viewPortCenterY, viewPortWidth, viewPortHeight, rotation); g2d.setStroke(new BasicStroke(1f)); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Calculate half the diagonal size of the viewport. int halfDiagonal = (int) (Math.sqrt(Math.pow(viewPortWidth, 2) + Math.pow(viewPortHeight, 2)) / 2.0); AffineTransform origTx = g2d.getTransform(); g2d.translate(viewPortCenterX, viewPortCenterY); // AffineTransform rotates positive clockwise, so we invert the value. g2d.rotate(Math.toRadians(-rotation)); double uppX = new Length(cameraUnitsPerPixelX, cameraUnitsPerPixelUnits) .convertToUnits(this.units).getValue(); double uppY = new Length(cameraUnitsPerPixelY, cameraUnitsPerPixelUnits) .convertToUnits(this.units).getValue(); double pixelsPerTickX = unitsPerTick / uppX; double pixelsPerTickY = unitsPerTick / uppY; int tickLength = 10; g2d.setColor(color); for (int i = 1; i < (halfDiagonal / pixelsPerTickX); i++) { int x = (int) (i * pixelsPerTickX); g2d.drawLine(x, -tickLength, x, tickLength); g2d.drawLine(-x, -tickLength, -x, tickLength); } for (int i = 1; i < (halfDiagonal / pixelsPerTickY); i++) { int y = (int) (i * pixelsPerTickY); g2d.setColor(color); g2d.drawLine(-tickLength, y, tickLength, y); g2d.setColor(complimentaryColor); g2d.drawLine(-tickLength, -y, tickLength, -y); } g2d.setTransform(origTx); } }