KiCad PCB EDA Suite
Loading...
Searching...
No Matches
gerbview_printout.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <base_units.h>
26#include <base_screen.h>
28#include <gerbview_frame.h>
29#include <gerber_file_image.h>
31#include "gerbview_printout.h"
32
33#include <lseq.h>
34#include <lset.h>
35#include <view/view.h>
36#include <gerbview_painter.h>
37#include <math/util.h> // for KiROUND
38
39
41 const KIGFX::VIEW* aView, const wxString& aTitle ) :
42 BOARD_PRINTOUT( aParams, aView, aTitle )
43{
44 m_layout = aLayout;
45 m_gerbviewPrint = true;
46}
47
48
50{
51 // Store the layerset, as it is going to be modified below and the original settings are needed
53
54 LSEQ seq = lset.UIOrder();
55 wxCHECK( unsigned( aPage - 1 ) < seq.size(), false );
56 auto layerId = seq[aPage - 1];
57
58 // In gerbview, draw layers are always printed on separate pages because handling negative
59 // objects when using only one page is tricky
60
61 // Enable only one layer to create a printout
62 m_settings.m_LayerSet = LSET( { layerId } );
63
65 GERBER_FILE_IMAGE* gbrImage = gbrImgList.GetGbrImage( layerId );
66 wxString gbr_filename;
67
68 if( gbrImage )
69 gbr_filename = gbrImage->m_FileName;
70
71 DrawPage( gbr_filename, aPage, m_settings.m_pageCount );
72
73 // Restore the original layer set, so the next page can be printed
75
76 return true;
77}
78
79
80int GERBVIEW_PRINTOUT::milsToIU( double aMils ) const
81{
82 return KiROUND( gerbIUScale.IU_PER_MILS * aMils );
83}
84
85
86void GERBVIEW_PRINTOUT::setupViewLayers( KIGFX::VIEW& aView, const LSET& aLayerSet )
87{
88 BOARD_PRINTOUT::setupViewLayers( aView, aLayerSet );
89
90 for( PCB_LAYER_ID layer : m_settings.m_LayerSet.Seq() )
91 aView.SetLayerVisible( static_cast<int>( GERBVIEW_LAYER_ID_START ) + layer, true );
92}
93
94
96{
98 aGal->SetWorldUnitLength( 1.0/ gerbIUScale.IU_PER_MM /* 10 nm */ / 25.4 /* 1 inch in mm */ );
99}
100
101
103{
105}
106
107
108std::unique_ptr<KIGFX::PAINTER> GERBVIEW_PRINTOUT::getPainter( KIGFX::GAL* aGal )
109{
110 return std::make_unique<KIGFX::GERBVIEW_PAINTER>( aGal );
111}
BASE_SCREEN class implementation.
constexpr EDA_IU_SCALE gerbIUScale
Definition: base_units.h:107
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
An object derived from wxPrintout to handle the necessary information to control a printer when print...
virtual void DrawPage(const wxString &aLayerName=wxEmptyString, int aPageNum=1, int aPageCount=1)
Print a page (or a set of pages).
bool m_gerbviewPrint
True if the caller is Gerbview, false for Pcbnew.
virtual void setupViewLayers(KIGFX::VIEW &aView, const LSET &aLayerSet)
Configures PAINTER object for a printout.
virtual void setupGal(KIGFX::GAL *aGal)
Returns bounding box of the printed objects (excluding drawing-sheet frame)
BOARD_PRINTOUT_SETTINGS m_settings
A list of GERBER_DRAW_ITEM objects currently loaded.
Definition: gbr_layout.h:46
BOX2I ComputeBoundingBox() const
Calculate the bounding box containing all Gerber items.
Definition: gbr_layout.cpp:47
GERBER_FILE_IMAGE_LIST is a helper class to handle a list of GERBER_FILE_IMAGE files which are loaded...
static GERBER_FILE_IMAGE_LIST & GetImagesList()
Hold the image data and parameters for one gerber file and layer parameters.
wxString m_FileName
Full File Name for this layer.
void setupGal(KIGFX::GAL *aGal) override
Returns bounding box of the printed objects (excluding drawing-sheet frame)
std::unique_ptr< KIGFX::PAINTER > getPainter(KIGFX::GAL *aGal) override
Source VIEW object (note that actual printing only refers to this object)
bool OnPrintPage(int aPage) override
int milsToIU(double aMils) const override
< Convert mils to internal units
void setupViewLayers(KIGFX::VIEW &aView, const LSET &aLayerSet) override
Configures PAINTER object for a printout.
BOX2I getBoundingBox() override
Returns a PAINTER instance used to draw the items.
GERBVIEW_PRINTOUT(GBR_LAYOUT *aLayout, const BOARD_PRINTOUT_SETTINGS &aParams, const KIGFX::VIEW *aView, const wxString &aTitle)
GBR_LAYOUT * m_layout
Abstract interface for drawing on a 2D-surface.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:401
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: lseq.h:47
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:36
LSEQ UIOrder() const
Returns the copper, technical and user layers in the order shown in layer widget.
Definition: lset.cpp:799
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:410
@ GERBVIEW_LAYER_ID_START
Definition: layer_ids.h:425
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
LSET m_LayerSet
Layers to print.
const double IU_PER_MM
Definition: base_units.h:76
const double IU_PER_MILS
Definition: base_units.h:77
int m_pageCount
Number of pages to print.
Definition: printout.h:61