package net.sourceforge.fidocadj.geom;
import net.sourceforge.fidocadj.circuit.*;
import net.sourceforge.fidocadj.circuit.controllers.*;
import net.sourceforge.fidocadj.circuit.model.*;
import net.sourceforge.fidocadj.circuit.views.*;
import net.sourceforge.fidocadj.globals.*;
import net.sourceforge.fidocadj.layers.*;
import net.sourceforge.fidocadj.graphic.*;
import net.sourceforge.fidocadj.graphic.nil.*;
/**
Calculate the size of a given drawing.
<pre>
This file is part of FidoCadJ.
FidoCadJ 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.
FidoCadJ 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 FidoCadJ. If not,
@see <a href=http://www.gnu.org/licenses/>http://www.gnu.org/licenses/</a>.
Copyright 2008-2014 by Davide Bucci
</pre>
@author Davide Bucci
*/
public final class DrawingSize
{
/** Private constructor, for Utility class pattern
*/
private DrawingSize ()
{
// nothing
}
/** Get the image size.
@param dm the model class containing the drawing.
@param unitperpixel the zoom set to be used.
@param countMin specifies that the size should be calculated counting
the minimum x and y coordinates, and not the origin.
@param origin is updated with the image origin.
@return the image size stored in a {@link DimensionG} object.
*/
public static DimensionG getImageSize(DrawingModel dm,
double unitperpixel,
boolean countMin,
PointG origin)
{
int width;
int height;
MapCoordinates m=new MapCoordinates();
m.setMagnitudes(unitperpixel, unitperpixel);
m.setXCenter(0);
m.setYCenter(0);
// force an in-depth recalculation
dm.setChanged(true);
Drawing drawingAgent = new Drawing(dm);
drawingAgent.draw(new GraphicsNull(),m);
dm.imgCanvas.trackExtremePoints(m);
dm.setChanged(true);
// Calculate image size
if(countMin) {
width=m.getXMax()-m.getXMin();
height=m.getYMax()-m.getYMin();
} else {
width=m.getXMax();
height=m.getYMax();
}
// Verify that the image size is reasonable
if(width<=0 || height<=0) {
/*System.out.println("Warning: Image has a zero"+
"sized image");*/
width=100;
height=100;
}
if (m.getXMax() > m.getXMin() &&
m.getYMax() > m.getYMin())
{
origin.x=m.getXMin();
origin.y=m.getYMin();
} else {
origin.x=0;
origin.y=0;
}
return new DimensionG(width, height);
}
/** Get the image origin.
@param dm the model class containing the drawing.
@param unitperpixel the zoom set to be used.
@return the origin coordinates in logical units, stored in a
{@link PointG} object.
*/
public static PointG getImageOrigin(DrawingModel dm, double unitperpixel)
{
int originx;
int originy;
// force an in-depth recalculation
dm.setChanged(true);
MapCoordinates m=new MapCoordinates();
m.setMagnitudes(unitperpixel, unitperpixel);
m.setXCenter(0);
m.setYCenter(0);
// Draw the image. In this way, the min and max coordinates will be
// tracked.
Drawing drawingAgent = new Drawing(dm);
dm.imgCanvas.trackExtremePoints(m);
drawingAgent.draw(new GraphicsNull(), m);
dm.setChanged(true);
// Verify that the image size is correct
if (m.getXMax() >= m.getXMin() &&
m.getYMax() >= m.getYMin())
{
originx=m.getXMin();
originy=m.getYMin();
} else {
originx=0;
originy=0;
}
return new PointG(originx, originy);
}
/** Calculate the zoom to fit the given size in pixel (i.e. the viewport
size).
@param dm the current drawing model.
@param sizex the width of the area to be used for calculations.
@param sizey the height of the area to be used for calculations.
@param countMin specify if the absolute or relative size should be
taken into account. In other words, consider (countMin=false) or
not (countMin=true) the origin as part of the drawing.
@return the zoom to fit settings stored in a new {@link MapCoordinates}
object.
*/
public static MapCoordinates calculateZoomToFit(DrawingModel dm, int sizex,
int sizey, boolean countMin)
{
// Here we calculate the zoom to fit parameters
double maxsizex;
double maxsizey;
PointG org=new PointG(0,0);
MapCoordinates newZoom=new MapCoordinates();
// Determine the size and the origin of the current drawing.
DimensionG D = getImageSize(dm,1,countMin, org);
maxsizex=D.width+1;
maxsizey=D.height+1;
if (!countMin)
org=new PointG(0,0);
double zoomx=1.0/((maxsizex)/(double)sizex);
double zoomy=1.0/((maxsizey)/(double)sizey);
double z= zoomx>zoomy ? zoomy:zoomx;
z=Math.round(z*100.0)/100.0; // 0.20.5
if(z<MapCoordinates.MIN_MAGNITUDE)
z=MapCoordinates.MIN_MAGNITUDE;
newZoom.setMagnitudesNoCheck(z,z);
// The zoom setting might have been rounded, or bounded.
z = newZoom.getYMagnitude();
newZoom.setXCenter(org.x*z);
newZoom.setYCenter(org.y*z);
return newZoom;
}
}