/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.ui.model.graphic.imp.area; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import org.weasis.core.api.image.measure.MeasurementsAdapter; import org.weasis.core.api.image.util.MeasurableLayer; import org.weasis.core.api.image.util.Unit; import org.weasis.core.ui.Messages; import org.weasis.core.ui.model.utils.bean.MeasureItem; import org.weasis.core.ui.model.utils.bean.Measurement; import org.weasis.core.ui.util.MouseEventDouble; @XmlType(name = "ellipse") @XmlRootElement(name = "ellipse") public class EllipseGraphic extends RectangleGraphic { private static final long serialVersionUID = 3296060775738751236L; public static final Icon ICON = new ImageIcon(EllipseGraphic.class.getResource("/icon/22x22/draw-eclipse.png")); //$NON-NLS-1$ public static final Measurement AREA = new Measurement(Messages.getString("measure.area"), 1, true, true, true); //$NON-NLS-1$ public static final Measurement PERIMETER = new Measurement(Messages.getString("measure.perimeter"), 2, true, true, false); //$NON-NLS-1$ public static final Measurement CENTER_X = new Measurement(Messages.getString("measure.centerx"), 3, true, true, false); //$NON-NLS-1$ public static final Measurement CENTER_Y = new Measurement(Messages.getString("measure.centery"), 4, true, true, false); //$NON-NLS-1$ public static final Measurement WIDTH = new Measurement(Messages.getString("measure.width"), 5, true, true, false); //$NON-NLS-1$ public static final Measurement HEIGHT = new Measurement(Messages.getString("measure.height"), 6, true, true, false); //$NON-NLS-1$ protected static final List<Measurement> MEASUREMENT_LIST = new ArrayList<>(); static { MEASUREMENT_LIST.add(CENTER_X); MEASUREMENT_LIST.add(CENTER_Y); MEASUREMENT_LIST.add(AREA); MEASUREMENT_LIST.add(PERIMETER); MEASUREMENT_LIST.add(WIDTH); MEASUREMENT_LIST.add(HEIGHT); } public EllipseGraphic() { super(); } public EllipseGraphic(EllipseGraphic graphic) { super(graphic); } @Override public EllipseGraphic copy() { return new EllipseGraphic(this); } @Override public Icon getIcon() { return ICON; } @Override public String getUIName() { return Messages.getString("MeasureToolBar.ellipse"); //$NON-NLS-1$ } @Override public void buildShape(MouseEventDouble mouseevent) { Rectangle2D rectangle = new Rectangle2D.Double(); rectangle.setFrameFromDiagonal(getHandlePoint(eHandlePoint.NW.index), getHandlePoint(eHandlePoint.SE.index)); setShape(new Ellipse2D.Double(rectangle.getX(), rectangle.getY(), rectangle.getWidth(), rectangle.getHeight()), mouseevent); updateLabel(mouseevent, getDefaultView2d(mouseevent)); } @Override public List<MeasureItem> computeMeasurements(MeasurableLayer layer, boolean releaseEvent, Unit displayUnit) { if (layer != null && layer.hasContent() && isShapeValid()) { MeasurementsAdapter adapter = layer.getMeasurementAdapter(displayUnit); if (adapter != null) { ArrayList<MeasureItem> measVal = new ArrayList<>(); Rectangle2D rect = new Rectangle2D.Double(); rect.setFrameFromDiagonal(getHandlePoint(eHandlePoint.NW.index), getHandlePoint(eHandlePoint.SE.index)); double ratio = adapter.getCalibRatio(); if (CENTER_X.getComputed()) { measVal.add( new MeasureItem(CENTER_X, adapter.getXCalibratedValue(rect.getCenterX()), adapter.getUnit())); } if (CENTER_Y.getComputed()) { measVal.add( new MeasureItem(CENTER_Y, adapter.getYCalibratedValue(rect.getCenterY()), adapter.getUnit())); } if (WIDTH.getComputed()) { measVal.add(new MeasureItem(WIDTH, ratio * rect.getWidth(), adapter.getUnit())); } if (HEIGHT.getComputed()) { measVal.add(new MeasureItem(HEIGHT, ratio * rect.getHeight(), adapter.getUnit())); } if (AREA.getComputed()) { Double val = Math.PI * rect.getWidth() * ratio * rect.getHeight() * ratio / 4.0; String unit = "pix".equals(adapter.getUnit()) ? adapter.getUnit() : adapter.getUnit() + "2"; //$NON-NLS-1$ //$NON-NLS-2$ measVal.add(new MeasureItem(AREA, val, unit)); } if (PERIMETER.getComputed()) { double a = ratio * rect.getWidth() / 2.0; double b = ratio * rect.getHeight() / 2.0; Double val = 2.0 * Math.PI * Math.sqrt((a * a + b * b) / 2.0); measVal.add(new MeasureItem(PERIMETER, val, adapter.getUnit())); } List<MeasureItem> stats = getImageStatistics(layer, releaseEvent); if (stats != null) { measVal.addAll(stats); } return measVal; } } return Collections.emptyList(); } @Override public List<Measurement> getMeasurementList() { return MEASUREMENT_LIST; } }