package net.sourceforge.fidocadj.export; import javax.imageio.*; import java.io.*; import java.awt.*; import java.awt.image.*; import javax.swing.*; 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.geom.*; import net.sourceforge.fidocadj.globals.*; import net.sourceforge.fidocadj.layers.*; import net.sourceforge.fidocadj.graphic.*; import net.sourceforge.fidocadj.graphic.swing.*; import net.sourceforge.fidocadj.graphic.nil.*; import java.awt.event.*; import java.util.*; import java.lang.*; /** ExportGraphic.java Handle graphic export of a Fidocad file This class should be used to export the circuit under different graphic formats. <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 2007-2015 by Davide Bucci </pre> @author Davide Bucci */ public final class ExportGraphic { private ExportGraphic() { // Nothing to do. } /** Exports the circuit contained in circ using the specified parsing class. @param file the file name of the graphic file which will be created. @param P the parsing schematics class which should be used (libraries). @param format the graphic format which should be used {png|jpg}. @param unitPerPixel the number of unit for each graphic pixel. @param antiAlias specify whether the anti alias option should be on. @param blackWhite specify that the export should be done in B/W. @param ext activate FidoCadJ extensions when exporting @param shiftMin shift the exported image at the origin. @throws IOException if the file can not be created or an error occurs. */ public static void export(File file, DrawingModel P, String format, double unitPerPixel, boolean antiAlias, boolean blackWhite, boolean ext, boolean shiftMin) throws IOException { exportSizeP( file, P, format, 0, 0, unitPerPixel, false, antiAlias, blackWhite, ext, shiftMin); } /** Exports the circuit contained in circ using the specified parsing class. @param file the file name of the graphic file which will be created. @param P the parsing schematics class which should be used (libraries). @param format the graphic format which should be used {png|jpg}. @param width the image width in pixels (raster images only) @param height the image heigth in pixels (raster images only) @param antiAlias specify whether the anti alias option should be on. @param blackWhite specify that the export should be done in B/W. @param ext activate FidoCadJ extensions when exporting @param shiftMin shift the exported image at the origin. @throws IOException if an error occurs. */ public static void exportSize(File file, DrawingModel P, String format, int width, int height, boolean antiAlias, boolean blackWhite, boolean ext, boolean shiftMin) throws IOException { exportSizeP( file, P, format, width, height, 1, true, antiAlias, blackWhite, ext, shiftMin); } /** Exports the circuit contained in circ using the specified parsing class. @param file the file name of the graphic file which will be created. @param P the parsing schematics class which should be used (libraries). @param format the graphic format which should be used {png|jpg}. @param unitperpixel the number of unit for each graphic pixel. @param width the image width in pixels (raster images only) @param heith the image heigth in pixels (raster images only) @param setSize if true, calculate resolution from size. If false, it does the opposite strategy. @param antiAlias specify whether the anti alias option should be on. @param blackWhite specify that the export should be done in B/W. @param ext activate FidoCadJ extensions when exporting. @param shiftMin shift the exported image at the origin. @throws IOException if an error occurs. */ private static void exportSizeP(File file, DrawingModel P, String format, int width_t, int height_t, double unitPerPixel_t, boolean setSize, boolean antiAlias, boolean blackWhite, boolean ext, boolean shiftMin) throws IOException { int width=width_t; int height=height_t; double unitPerPixel=unitPerPixel_t; // obtain drawing size MapCoordinates m=new MapCoordinates(); // This solves bug #3299281 new SelectionActions(P).setSelectionAll(false); PointG org=new PointG(0,0); DimensionG d = DrawingSize.getImageSize(P, 1,true,org); if (setSize) { // In this case, the image size is set and so we need to calculate // the correct zoom factor in order to fit the drawing in the // specified area. d.width+=Export.exportBorder; d.height+=Export.exportBorder; unitPerPixel = Math.min((double)width/(double)d.width, (double)height/(double)d.height); } else { // In this situation, we do have to calculate the size from the // specified resolution. width=(int)((d.width+Export.exportBorder)*unitPerPixel); height=(int)((d.height+Export.exportBorder)*unitPerPixel); } org.x *=unitPerPixel; org.y *=unitPerPixel; org.x -= Export.exportBorder*unitPerPixel/2.0; org.y -= Export.exportBorder*unitPerPixel/2.0; Vector<LayerDesc> ol=P.getLayers(); BufferedImage bufferedImage; // To print in black and white, we only need to create a single layer // in which all layers will be exported and drawn. // Clearly, the choosen color will be black. if(blackWhite) { Vector<LayerDesc> v=new Vector<LayerDesc>(); for (int i=0; i<16;++i) v.add(new LayerDesc((new ColorSwing()).black(), // NOPMD ((LayerDesc)ol.get(i)).getVisible(), "B/W",((LayerDesc)ol.get(i)).getAlpha())); P.setLayers(v); } // Center the drawing in the given space. m.setMagnitudes(unitPerPixel, unitPerPixel); if(shiftMin && !"pcb".equals(format)) {// don't alter geometry m.setXCenter(-org.x); // if exported to pcb-rnd m.setYCenter(-org.y); } if ("png".equals(format)||"jpg".equals(format)) { // Create a buffered image in which to draw /* To get an error, try to export this in png at 1200 dpi: [FIDOCAD] RP 25 15 11000 95000 2 */ try { bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // Create a graphics contents on the buffered image Graphics2D g2d = (Graphics2D)bufferedImage.createGraphics(); if(antiAlias) { g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } g2d.setColor(Color.white); g2d.fillRect(0,0, width, height); // Save bitmap Drawing drawingAgent = new Drawing(P); drawingAgent.draw(new Graphics2DSwing(g2d),m); ImageIO.write(bufferedImage, format, file); // Graphics context no longer needed so dispose it g2d.dispose(); } finally { P.setLayers(ol); } } else if("svg".equals(format)) { ExportSVG es = new ExportSVG(file); new Export(P).exportDrawing(es, true, false, m); } else if("eps".equals(format)) { ExportEPS ep = new ExportEPS(file); new Export(P).exportDrawing(ep, true, false, m); } else if("pgf".equals(format)) { ExportPGF ef = new ExportPGF(file); new Export(P).exportDrawing(ef, true, false, m); } else if("pdf".equals(format)) { ExportPDF ef = new ExportPDF(file, new GraphicsNull()); new Export(P).exportDrawing(ef, true, false, m); } else if("scr".equals(format)) { ExportEagle ef = new ExportEagle(file); new Export(P).exportDrawing(ef, true, false, m); } else if("pcb".equals(format)) { ExportPCBRND ef = new ExportPCBRND(file); new Export(P).exportDrawing(ef, true, false, m); } else if("fcd".equals(format)) { ExportFidoCad ef = new ExportFidoCad(file); ef.setSplitStandardMacros(false); ef.setExtensions(ext); new Export(P).exportDrawing(ef, true, true, m); } else if("fcda".equals(format)) { ExportFidoCad ef = new ExportFidoCad(file); ef.setSplitStandardMacros(true); ef.setExtensions(ext); new Export(P).exportDrawing(ef, true, true, m); } else { IOException E=new IOException( "Wrong file format"); throw E; } P.setLayers(ol); } }