package net.sourceforge.fidocadj.circuit.views; import java.io.*; import net.sourceforge.fidocadj.graphic.*; import net.sourceforge.fidocadj.circuit.model.*; import net.sourceforge.fidocadj.export.*; import net.sourceforge.fidocadj.geom.*; import net.sourceforge.fidocadj.layers.*; import net.sourceforge.fidocadj.primitives.*; /** Export: export the FidoCadJ drawing. This is a view of the 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 2007-2014 by Davide Bucci </pre> */ public class Export { private final DrawingModel dmp; // Border to be used in the export in logical coordinates public static final int exportBorder=6; /** Creator @param pp the model containing the drawing to be exported. */ public Export(DrawingModel pp) { dmp=pp; } /** Export the file using the given interface. @param exp the selected exporting interface. @param header specify if an header and a tail should be written or not. @param exportInvisible specify that the primitives on invisible layers should be exported. @param mp the coordinate mapping system to adopt. @throws IOException when things goes wrong, for example because there has been a memory error or when access to files is impossible. */ public void exportDrawing(ExportInterface exp, boolean header, boolean exportInvisible, MapCoordinates mp) throws IOException { int l; int i; int j; GraphicPrimitive g; // If it is needed, we should write the header of the file. This is // not to be done for example when we are exporting a macro and this // routine is called recursively. synchronized(this) { if (header) { PointG o=new PointG(0,0); DimensionG d = DrawingSize.getImageSize(dmp, 1, true,o); d.width+=exportBorder; d.height+=exportBorder; // We remeber that getImageSize works only with logical // coordinates so we may trasform them: d.width *= mp.getXMagnitude(); d.height *= mp.getYMagnitude(); // We finally write the header exp.exportStart(d, dmp.layerV, mp.getXGridStep()); } if(dmp.drawOnlyLayer>=0 && !dmp.drawOnlyPads){ for (i=0; i<dmp.getPrimitiveVector().size(); ++i){ g=(GraphicPrimitive)dmp.getPrimitiveVector().get(i); l=g.getLayer(); if(l==dmp.drawOnlyLayer && !(g instanceof PrimitiveMacro)) { if(((LayerDesc)(dmp.layerV.get(l))).isVisible|| exportInvisible) g.export(exp, mp); } else if(g instanceof PrimitiveMacro) { ((PrimitiveMacro)g).setDrawOnlyLayer(dmp.drawOnlyLayer); ((PrimitiveMacro)g).setExportInvisible(exportInvisible); if(((LayerDesc)(dmp.layerV.get(l))).isVisible|| exportInvisible) { g.export(exp, mp); } } } return; } else if (!dmp.drawOnlyPads) { for(j=0;j<dmp.layerV.size(); ++j) { for (i=0; i<dmp.getPrimitiveVector().size(); ++i){ g=(GraphicPrimitive)dmp.getPrimitiveVector().get(i); l=g.getLayer(); if(l==j && !(g instanceof PrimitiveMacro)){ if(((LayerDesc)(dmp.layerV.get(l))).isVisible|| exportInvisible) { g.export(exp, mp); } } else if(g instanceof PrimitiveMacro) { ((PrimitiveMacro)g).setDrawOnlyLayer(j); ((PrimitiveMacro)g).setExportInvisible( exportInvisible); if(((LayerDesc)(dmp.layerV.get(l))).isVisible|| exportInvisible) { g.export(exp, mp); } } } } } // Export in a second time only the PCB pads, in order to ensure // that the drills are always open. for (i=0; i<dmp.getPrimitiveVector().size(); ++i){ if ((g=(GraphicPrimitive)dmp.getPrimitiveVector().get(i)) instanceof PrimitivePCBPad) { ((PrimitivePCBPad)g).setDrawOnlyPads(true); l=g.getLayer(); if(((LayerDesc)(dmp.layerV.get(l))).isVisible ||exportInvisible) { g.export(exp, mp); } ((PrimitivePCBPad)g).setDrawOnlyPads(false); } else if (g instanceof PrimitiveMacro) { // Uhm... not beautiful ((PrimitiveMacro)g).setExportInvisible(exportInvisible); ((PrimitiveMacro)g).setDrawOnlyPads(true); l=g.getLayer(); if(((LayerDesc)(dmp.layerV.get(l))).isVisible ||exportInvisible) { g.export(exp, mp); } ((PrimitiveMacro)g).setDrawOnlyPads(false); ((PrimitiveMacro)g).resetExport(); } } if (header) exp.exportEnd(); } } }