KiCad PCB EDA Suite
pcbnew_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) 2009 Jean-Pierre Charras, [email protected]
5 * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
6 * Copyright (C) 2018 CERN
7 * Author: Maciej Suminski <[email protected]>
8 * Author: Tomasz Wlostowski <[email protected]>
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, you may find one here:
22 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
23 * or you may search the http://www.gnu.org website for the version 2 license,
24 * or you may write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26 */
27
28#include "pcbnew_printout.h"
29#include <board.h>
30#include <math/util.h> // for KiROUND
31#include <pcb_painter.h>
32#include <pcbnew_settings.h>
33#include <view/view.h>
34#include <pcbplot.h>
36#include <pad.h>
37
38#include <advanced_config.h>
39
41 : BOARD_PRINTOUT_SETTINGS( aPageInfo )
42{
46 m_AsItemCheckboxes = false;
47}
48
49
51{
53
54 if( PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aConfig ) )
55 {
56 m_DrillMarks = static_cast<DRILL_MARKS>( cfg->m_Plot.pads_drill_mode );
57 m_Pagination = static_cast<PAGINATION_T>( cfg->m_Plot.all_layers_on_one_page );
58 m_PrintEdgeCutsOnAllPages = cfg->m_Plot.edgecut_on_all_layers;
59 m_Mirror = cfg->m_Plot.mirror;
60 }
61}
62
63
65{
67
68 if( PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aConfig ) )
69 {
70 cfg->m_Plot.pads_drill_mode = (int)m_DrillMarks;
71 cfg->m_Plot.all_layers_on_one_page = m_Pagination;
72 cfg->m_Plot.edgecut_on_all_layers = m_PrintEdgeCutsOnAllPages;
73 cfg->m_Plot.mirror = m_Mirror;
74 }
75}
76
77
79 const KIGFX::VIEW* aView, const wxString& aTitle ) :
80 BOARD_PRINTOUT( aParams, aView, aTitle ), m_pcbnewSettings( aParams )
81{
82 m_board = aBoard;
83}
84
85
87{
88 // Store the layerset, as it is going to be modified below and the original settings are
89 // needed.
91 int pageCount = lset.count();
92 wxString layerName;
93 PCB_LAYER_ID extractLayer;
94
95 // compute layer mask from page number if we want one page per layer
97 {
98 // This sequence is TBD, call a different sequencer if needed, such as Seq().
99 // Could not find documentation on page order.
100 LSEQ seq = lset.UIOrder();
101
102 // aPage starts at 1, not 0
103 if( unsigned( aPage - 1 ) < seq.size() )
104 m_settings.m_LayerSet = LSET( seq[ aPage - 1] );
105 }
106
107 if( !m_settings.m_LayerSet.any() )
108 return false;
109
110 extractLayer = m_settings.m_LayerSet.ExtractLayer();
111
112 if( extractLayer == UNDEFINED_LAYER )
113 layerName = _( "Multiple Layers" );
114 else
115 layerName = m_board->GetLayerName( extractLayer );
116
117 // In Pcbnew we can want the layer EDGE always printed
120
121 DrawPage( layerName, aPage, pageCount );
122
123 // Restore the original layer set, so the next page can be printed
124 m_settings.m_LayerSet = lset;
125
126 return true;
127}
128
129
130int PCBNEW_PRINTOUT::milsToIU( double aMils ) const
131{
132 return KiROUND( pcbIUScale.IU_PER_MILS * aMils );
133}
134
135
136void PCBNEW_PRINTOUT::setupViewLayers( KIGFX::VIEW& aView, const LSET& aLayerSet )
137{
138 BOARD_PRINTOUT::setupViewLayers( aView, aLayerSet );
139
140 for( PCB_LAYER_ID layer : m_settings.m_LayerSet.Seq() )
141 {
142 aView.SetLayerVisible( PCBNEW_LAYER_ID_START + layer, true );
143
144 // Enable the corresponding zone layer (copper layers and other layers)
145 aView.SetLayerVisible( LAYER_ZONE_START + layer, true );
146 }
147
148 RENDER_SETTINGS* renderSettings = aView.GetPainter()->GetSettings();
149 // A color to do not print objects on some layers, when the layer must be enabled
150 // to print some other objects
151 COLOR4D invisible_color = COLOR4D::UNSPECIFIED;
152
154 {
155 auto setVisibility =
156 [&]( GAL_LAYER_ID aLayer )
157 {
158 if( m_board->IsElementVisible( aLayer ) )
159 aView.SetLayerVisible( aLayer, true );
160 else
161 renderSettings->SetLayerColor( aLayer, invisible_color );
162 };
163
164 setVisibility( LAYER_MOD_FR );
165 setVisibility( LAYER_MOD_BK );
166 setVisibility( LAYER_MOD_VALUES );
167 setVisibility( LAYER_MOD_REFERENCES );
168 setVisibility( LAYER_MOD_TEXT );
169 setVisibility( LAYER_MOD_TEXT_INVISIBLE );
170 setVisibility( LAYER_PADS );
171 setVisibility( LAYER_PAD_FR );
172 setVisibility( LAYER_PAD_BK );
173 setVisibility( LAYER_PADS_TH );
174
175 setVisibility( LAYER_TRACKS );
176 setVisibility( LAYER_VIAS );
177 setVisibility( LAYER_VIA_MICROVIA );
178 setVisibility( LAYER_VIA_BBLIND );
179 setVisibility( LAYER_VIA_THROUGH );
180 setVisibility( LAYER_ZONES );
181
182 setVisibility( LAYER_DRC_WARNING );
183 setVisibility( LAYER_DRC_ERROR );
184 setVisibility( LAYER_DRC_EXCLUSION );
185 setVisibility( LAYER_ANCHOR );
186 setVisibility( LAYER_DRAWINGSHEET );
187 setVisibility( LAYER_GRID );
188 }
189 else
190 {
191 // Draw layers that must be not visible on printing are set to an invisible layer
192 // LAYER_PAD_FR, LAYER_PAD_BK and LAYER_PADS_TH must be enabled to print pads on
193 // technical layers, but not the pad on copper layer(s) if they are not enabled
194
195 if( !aLayerSet.test( F_Cu ) )
196 renderSettings->SetLayerColor( LAYER_PAD_FR, invisible_color );
197
198 if( !aLayerSet.test( B_Cu ) )
199 renderSettings->SetLayerColor( LAYER_PAD_BK, invisible_color );
200
201 // Enable items on copper layers, but do not draw holes
203 {
204 if( ( aLayerSet & LSET::AllCuMask() ).any() ) // Items visible on any copper layer
205 aView.SetLayerVisible( layer, true );
206 else
207 renderSettings->SetLayerColor( layer, invisible_color );
208 }
209
210 // Keep certain items always enabled/disabled and just rely on the layer visibility
211 // Note LAYER_PAD_FR, LAYER_PAD_BK, LAYER_PADS_TH are enabled here because paths must
212 // be drawn on some other (technical) layers.
213 const int alwaysEnabled[] =
214 {
219 };
220
221 for( int layer : alwaysEnabled )
222 aView.SetLayerVisible( layer, true );
223 }
224
226 {
227 // Enable hole layers to draw drill marks
229 {
230 aView.SetLayerVisible( layer, true );
231 aView.SetTopLayer( layer, true );
232 }
233
236 {
237 for( int layer : { LAYER_PAD_HOLEWALLS, LAYER_VIA_HOLEWALLS } )
238 {
239 aView.SetLayerVisible( layer, true );
240 aView.SetTopLayer( layer, true );
241 }
242 }
243 }
244}
245
246
248{
250
251 KIGFX::PCB_PRINT_PAINTER& painter = dynamic_cast<KIGFX::PCB_PRINT_PAINTER&>( aPainter );
252
254 {
256 painter.SetDrillMarks( false, 0 );
257 break;
258
261
265 break;
266
268 painter.SetDrillMarks( true );
269
273 break;
274 }
275}
276
277
279{
281 aGal->SetWorldUnitLength( 0.001/pcbIUScale.IU_PER_MM /* 1 nm */ / 0.0254 /* 1 inch in meters */ );
282}
283
284
286{
287 return m_board->ComputeBoundingBox();
288}
289
290
291std::unique_ptr<KIGFX::PAINTER> PCBNEW_PRINTOUT::getPainter( KIGFX::GAL* aGal )
292{
293 return std::make_unique<KIGFX::PCB_PRINT_PAINTER>( aGal );
294}
295
296
299 m_drillMarkReal( false ),
300 m_drillMarkSize( 0 )
301{ }
302
303
305{
306 return m_drillMarkReal ? KIGFX::PCB_PAINTER::getDrillShape( aPad ) : PAD_DRILL_SHAPE_CIRCLE;
307}
308
309
311{
312 SHAPE_SEGMENT segm;
313
314 if( m_drillMarkReal )
315 {
317 }
318 else
319 {
320 segm = SHAPE_SEGMENT( aPad->GetPosition(),
321 aPad->GetPosition(), m_drillMarkSize );
322 }
323
324 return segm;
325}
326
327
329{
330 return m_drillMarkReal ? KIGFX::PCB_PAINTER::getViaDrillSize( aVia ) : m_drillMarkSize;
331}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:110
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).
virtual void setupPainter(KIGFX::PAINTER &aPainter)
Configures GAL object for a printout.
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
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:269
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition: board.cpp:653
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
Definition: board.cpp:1253
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:474
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:102
Abstract interface for drawing on a 2D-surface.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
Contains all the knowledge about how to draw graphical object onto any particular output device.
Definition: painter.h:58
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Contains methods for drawing PCB-specific items.
Definition: pcb_painter.h:158
virtual SHAPE_SEGMENT getPadHoleShape(const PAD *aPad) const
Return hole shape for a pad (internal units).
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
Definition: pcb_painter.h:163
virtual int getDrillShape(const PAD *aPad) const
Return drill shape of a pad.
virtual int getViaDrillSize(const PCB_VIA *aVia) const
Return drill diameter for a via (internal units).
Special flavor of PCB_PAINTER that contains modifications to handle printing options.
void SetDrillMarks(bool aRealSize, unsigned int aSize=0)
Set drill marks visibility and options.
SHAPE_SEGMENT getPadHoleShape(const PAD *aPad) const override
Return hole shape for a pad (internal units).
int getViaDrillSize(const PCB_VIA *aVia) const override
Flag deciding whether use the actual hole size or user-specified size for drill marks.
int getDrillShape(const PAD *aPad) const override
Return drill shape of a pad.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
void SetLayerColor(int aLayer, const COLOR4D &aColor)
Change the color used to draw a layer.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:69
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:393
virtual void SetTopLayer(int aLayer, bool aEnabled=true)
Set given layer to be displayed on the top or sets back the default order of layers.
Definition: view.cpp:825
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:213
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: layer_ids.h:493
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:532
LSEQ UIOrder() const
Definition: lset.cpp:922
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:411
PCB_LAYER_ID ExtractLayer() const
Find the first set PCB_LAYER_ID.
Definition: lset.cpp:684
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:773
Definition: pad.h:60
VECTOR2I GetPosition() const override
Definition: pad.h:203
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:54
int milsToIU(double aMils) const override
< Convert mils to internal units
bool OnPrintPage(int aPage) override
std::unique_ptr< KIGFX::PAINTER > getPainter(KIGFX::GAL *aGal) override
Source VIEW object (note that actual printing only refers to this object)
void setupGal(KIGFX::GAL *aGal) override
Returns bounding box of the printed objects (excluding drawing-sheet frame)
PCBNEW_PRINTOUT(BOARD *aBoard, const PCBNEW_PRINTOUT_SETTINGS &aParams, const KIGFX::VIEW *aView, const wxString &aTitle)
PCBNEW_PRINTOUT_SETTINGS m_pcbnewSettings
void setupPainter(KIGFX::PAINTER &aPainter) override
Configures GAL object for a printout.
BOX2I getBoundingBox() override
Returns a PAINTER instance used to draw the items.
void setupViewLayers(KIGFX::VIEW &aView, const LSET &aLayerSet) override
Configures PAINTER object for a printout.
@ BLACK
Definition: color4d.h:42
#define _(s)
@ FRAME_PCB_EDITOR
Definition: frame_type.h:40
double m_SmallDrillMarkSize
The diameter of the drill marks on print and plot outputs (in mm), when the "Drill marks" option is s...
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition: layer_ids.h:190
@ LAYER_GRID
Definition: layer_ids.h:205
@ LAYER_MOD_TEXT_INVISIBLE
text marked as invisible
Definition: layer_ids.h:200
@ LAYER_VIA_HOLEWALLS
Definition: layer_ids.h:234
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
Definition: layer_ids.h:197
@ LAYER_PAD_FR
smd pads, front layer
Definition: layer_ids.h:202
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:217
@ LAYER_DRC_EXCLUSION
layer for drc markers which have been individually excluded
Definition: layer_ids.h:236
@ LAYER_MOD_TEXT
Definition: layer_ids.h:198
@ LAYER_ZONES
Control for copper zone opacity/visibility (color ignored)
Definition: layer_ids.h:231
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored)
Definition: layer_ids.h:230
@ LAYER_DRC_WARNING
layer for drc markers with SEVERITY_WARNING
Definition: layer_ids.h:235
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
Definition: layer_ids.h:214
@ LAYER_TRACKS
Definition: layer_ids.h:212
@ LAYER_MOD_FR
show footprints on front
Definition: layer_ids.h:208
@ LAYER_ZONE_START
Virtual layers for stacking zones and tracks on a given copper layer.
Definition: layer_ids.h:253
@ LAYER_ANCHOR
anchor of items having an anchor point (texts, footprints)
Definition: layer_ids.h:201
@ LAYER_PAD_BK
smd pads, back layer
Definition: layer_ids.h:203
@ LAYER_MOD_VALUES
show footprints values (when texts are visible)
Definition: layer_ids.h:210
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:213
@ LAYER_VIA_HOLES
to draw via holes (pad holes do not use this layer)
Definition: layer_ids.h:215
@ LAYER_VIA_MICROVIA
to draw micro vias
Definition: layer_ids.h:194
@ LAYER_VIA_THROUGH
to draw usual through hole vias
Definition: layer_ids.h:196
@ LAYER_DRC_ERROR
layer for drc markers with SEVERITY_ERROR
Definition: layer_ids.h:216
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition: layer_ids.h:193
@ LAYER_MOD_BK
show footprints on back
Definition: layer_ids.h:209
@ LAYER_MOD_REFERENCES
show footprints references (when texts are visible)
Definition: layer_ids.h:211
@ LAYER_VIA_BBLIND
to draw blind/buried vias
Definition: layer_ids.h:195
@ LAYER_PAD_HOLEWALLS
Definition: layer_ids.h:233
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ PCBNEW_LAYER_ID_START
Definition: layer_ids.h:63
@ Edge_Cuts
Definition: layer_ids.h:113
@ B_Cu
Definition: layer_ids.h:95
@ UNDEFINED_LAYER
Definition: layer_ids.h:60
@ F_Cu
Definition: layer_ids.h:64
@ PAD_DRILL_SHAPE_CIRCLE
Definition: pad_shapes.h:70
DRILL_MARKS
Plots and prints can show holes in pads and vias 3 options are available:
void Load(APP_SETTINGS_BASE *aConfig) override
LSET m_LayerSet
Layers to print.
void Save(APP_SETTINGS_BASE *aConfig) override
bool m_Mirror
Print mirrored.
const double IU_PER_MM
Definition: base_units.h:77
const double IU_PER_MILS
Definition: base_units.h:78
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
enum PCBNEW_PRINTOUT_SETTINGS::PAGINATION_T m_Pagination
bool m_PrintEdgeCutsOnAllPages
Print board outline on each page.
enum DRILL_MARKS m_DrillMarks
bool m_AsItemCheckboxes
Honor checkboxes in the Items tab of the Layers Manager.
void Load(APP_SETTINGS_BASE *aConfig) override
void Save(APP_SETTINGS_BASE *aConfig) override
PCBNEW_PRINTOUT_SETTINGS(const PAGE_INFO &aPageInfo)
bool m_blackWhite
Print in B&W or Color.
Definition: printout.h:60
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:85