KiCad PCB EDA Suite
dialog_print_pcbnew.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) 2010-2016 Jean-Pierre Charras, jean-pierre.charras at wanadoo.fr
5 * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
6 * Copyright (C) 2018 CERN
7 *
8 * @author Maciej Suminski <[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 <kiface_base.h>
29#include <confirm.h>
30#include <core/arraydim.h>
31#include <base_units.h>
32#include <pcbnew_settings.h>
33#include <pcbplot.h>
34#include <board.h>
35#include <tool/tool_manager.h>
36#include <tools/pcb_actions.h>
37#include <tools/pcb_control.h>
39#include <pcbnew_printout.h>
40#include <wx/checklst.h>
41#include <wx/textdlg.h>
42
43
45{
46public:
49
50private:
51 enum
52 {
60 };
61
63 {
64 wxASSERT( dynamic_cast<PCBNEW_PRINTOUT_SETTINGS*>( m_settings ) );
65 return static_cast<PCBNEW_PRINTOUT_SETTINGS*>( m_settings );
66 }
67
68 bool TransferDataToWindow() override;
69
70 void createExtraOptions();
71 void createLeftPanel();
72
73 void onUseThemeClicked( wxCommandEvent& event );
74 void onPagePerLayerClicked( wxCommandEvent& event );
75 void onColorModeClicked( wxCommandEvent& event );
76 void onPopUpLayers( wxCommandEvent& event );
77
80
81 void saveSettings() override;
82
83 wxPrintout* createPrintout( const wxString& aTitle ) override
84 {
85 return new PCBNEW_PRINTOUT( m_parent->GetBoard(), *settings(),
86 m_parent->GetCanvas()->GetView(), aTitle );
87 }
88
90 LSEQ m_layerList; // List to hold CheckListBox layer numbers
91 wxMenu* m_popMenu;
92
93 wxCheckListBox* m_layerCheckListBox;
94 wxCheckBox* m_checkboxMirror;
98 wxCheckBox* m_checkAsItems;
99 wxCheckBox* m_checkBackground;
100 wxCheckBox* m_checkUseTheme;
101 wxChoice* m_colorTheme;
102};
103
104
106 PCBNEW_PRINTOUT_SETTINGS* aSettings ) :
107 DIALOG_PRINT_GENERIC( aParent, aSettings ),
108 m_parent( aParent )
109{
111
114
115 m_infoText->SetFont( KIUI::GetInfoFont( this ) );
116 m_infoText->SetLabel( _( "Right-click for layer selection commands." ) );
117 m_infoText->Show( true );
118
119 m_popMenu->Bind( wxEVT_COMMAND_MENU_SELECTED,
120 wxCommandEventHandler( DIALOG_PRINT_PCBNEW::onPopUpLayers ), this,
122
123 m_outputMode->Bind( wxEVT_COMMAND_CHOICE_SELECTED, &DIALOG_PRINT_PCBNEW::onColorModeClicked,
124 this );
125}
126
127
129{
131 return false;
132
133 BOARD* board = m_parent->GetBoard();
134
135 // Create layer list
136 // Could devote a PlotOrder() function in place of UIOrder().
138
139 // Populate the check list box by all enabled layers names
140 for( LSEQ seq = m_layerList; seq; ++seq )
141 {
142 PCB_LAYER_ID layer = *seq;
143
144 int checkIndex = m_layerCheckListBox->Append( board->GetLayerName( layer ) );
145
146 if( settings()->m_LayerSet.test( layer ) )
147 m_layerCheckListBox->Check( checkIndex );
148 }
149
150 m_checkboxMirror->SetValue( settings()->m_Mirror );
151 m_titleBlock->SetValue( settings()->m_titleBlock );
152
154
155 m_checkBackground->SetValue( cfg->m_Printing.background );
156 m_checkUseTheme->SetValue( cfg->m_Printing.use_theme );
157
158 m_colorTheme->Clear();
159
160 int width = 0;
161 int height = 0;
162 int minwidth = width;
163
164 wxString target = cfg->m_Printing.use_theme ? cfg->m_Printing.color_theme : cfg->m_ColorTheme;
165
167 {
168 int pos = m_colorTheme->Append( settings->GetName(), static_cast<void*>( settings ) );
169
170 if( settings->GetFilename() == target )
171 m_colorTheme->SetSelection( pos );
172
173 m_colorTheme->GetTextExtent( settings->GetName(), &width, &height );
174 minwidth = std::max( minwidth, width );
175 }
176
177 m_colorTheme->SetMinSize( wxSize( minwidth + 50, -1 ) );
178
179 wxCommandEvent dummy;
181
182 // Options to plot pads and vias holes
183 m_drillMarksChoice->SetSelection( settings()->m_DrillMarks );
184
185 // Print all layers one one page or separately
186 m_checkboxPagePerLayer->SetValue( settings()->m_Pagination
189
190 // Update the dialog layout when layers are added
191 GetSizer()->Fit( this );
192
193 return true;
194}
195
196
198{
199 wxGridBagSizer* optionsSizer = getOptionsSizer();
200 wxStaticBox* box = getOptionsBox();
201 int rows = optionsSizer->GetEffectiveRowsCount();
202 int cols = optionsSizer->GetEffectiveColsCount();
203
204 m_checkAsItems = new wxCheckBox( box, wxID_ANY,
205 _( "Print according to objects tab of appearance manager" ) );
206 optionsSizer->Add( m_checkAsItems, wxGBPosition( rows++, 0 ), wxGBSpan( 1, 3 ),
207 wxLEFT|wxRIGHT|wxBOTTOM, 5 );
208
209 m_checkBackground = new wxCheckBox( box, wxID_ANY, _( "Print background color" ) );
210 optionsSizer->Add( m_checkBackground, wxGBPosition( rows++, 0 ), wxGBSpan( 1, 3 ),
211 wxLEFT|wxRIGHT|wxBOTTOM, 5 );
212
213 m_checkUseTheme = new wxCheckBox( box, wxID_ANY,
214 _( "Use a different color theme for printing:" ) );
215 optionsSizer->Add( m_checkUseTheme, wxGBPosition( rows++, 0 ), wxGBSpan( 1, 3 ),
216 wxLEFT|wxRIGHT, 5 );
217
218 m_checkUseTheme->Bind( wxEVT_COMMAND_CHECKBOX_CLICKED,
220
221 wxArrayString m_colorThemeChoices;
222 m_colorTheme = new wxChoice( box, wxID_ANY, wxDefaultPosition, wxDefaultSize,
223 m_colorThemeChoices, 0 );
224 m_colorTheme->SetSelection( 0 );
225
226 optionsSizer->Add( m_colorTheme, wxGBPosition( rows++, 0 ), wxGBSpan( 1, 2 ),
227 wxLEFT, 28 );
228
229 rows++;
230
231 // Drill marks option
232 auto drillMarksLabel = new wxStaticText( box, wxID_ANY, _( "Drill marks:" ) );
233 std::vector<wxString> drillMarkChoices = { _( "No drill mark" ),
234 _( "Small mark" ),
235 _( "Real drill" ) };
236 m_drillMarksChoice = new wxChoice( box, wxID_ANY, wxDefaultPosition, wxDefaultSize,
237 drillMarkChoices.size(), drillMarkChoices.data(), 0 );
238 m_drillMarksChoice->SetSelection( 0 );
239
240 optionsSizer->Add( drillMarksLabel, wxGBPosition( rows, 0 ), wxGBSpan( 1, 1 ),
241 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 );
242 optionsSizer->Add( m_drillMarksChoice, wxGBPosition( rows++, 1 ), wxGBSpan( 1, cols - 1 ),
243 wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxBOTTOM, 5 );
244
245 // Print mirrored
246 m_checkboxMirror = new wxCheckBox( box, wxID_ANY, _( "Print mirrored" ) );
247
248 optionsSizer->Add( m_checkboxMirror, wxGBPosition( rows++, 0 ), wxGBSpan( 1, cols ),
249 wxLEFT|wxRIGHT|wxBOTTOM, 5 );
250
251 // Pagination
252 m_checkboxPagePerLayer = new wxCheckBox( box, wxID_ANY, _( "Print one page per layer" ) );
253
254 m_checkboxPagePerLayer->Bind( wxEVT_COMMAND_CHECKBOX_CLICKED,
256
257 m_checkboxEdgesOnAllPages = new wxCheckBox( box, wxID_ANY,
258 _( "Print board edges on all pages" ) );
259
260 optionsSizer->Add( m_checkboxPagePerLayer, wxGBPosition( rows++, 0 ), wxGBSpan( 1, cols ),
261 wxLEFT|wxRIGHT, 5 );
262 optionsSizer->Add( m_checkboxEdgesOnAllPages, wxGBPosition( rows++, 0 ), wxGBSpan( 1, cols ),
263 wxLEFT, 28 );
264}
265
266
268{
269 wxStaticBox* box = new wxStaticBox( this, wxID_ANY, _( "Include Layers" ) );
270 wxStaticBoxSizer* sbLayersSizer = new wxStaticBoxSizer( box, wxVERTICAL );
271
272 m_layerCheckListBox = new wxCheckListBox( sbLayersSizer->GetStaticBox(), wxID_ANY );
273 m_layerCheckListBox->SetMinSize( wxSize( 180, -1 ) );
274
275 sbLayersSizer->Add( m_layerCheckListBox, 1, wxEXPAND|wxBOTTOM|wxRIGHT, 5 );
276
277 getMainSizer()->Insert( 0, sbLayersSizer, 1, wxEXPAND | wxALL, 5 );
278
279 m_popMenu = new wxMenu();
280 m_popMenu->Append( new wxMenuItem( m_popMenu, ID_SELECT_FAB_LAYERS,
281 _( "Select Fab Layers" ), wxEmptyString ) );
282
283 m_popMenu->Append( new wxMenuItem( m_popMenu, ID_SELECT_COPPER_LAYERS,
284 _( "Select all Copper Layers" ), wxEmptyString ) );
285
286 m_popMenu->Append( new wxMenuItem( m_popMenu, ID_DESELECT_COPPER_LAYERS,
287 _( "Deselect all Copper Layers" ), wxEmptyString ) );
288
289 m_popMenu->Append( new wxMenuItem( m_popMenu, ID_SELECT_ALL_LAYERS,
290 _( "Select all Layers" ), wxEmptyString ) );
291
292 m_popMenu->Append( new wxMenuItem( m_popMenu, ID_DESELECT_ALL_LAYERS,
293 _( "Deselect all Layers" ), wxEmptyString ) );
294
295 this->Bind( wxEVT_RIGHT_DOWN,
296 [&]( wxMouseEvent& aEvent )
297 {
298 this->PopupMenu( m_popMenu, aEvent.GetPosition() );
299 } );
300
301 m_layerCheckListBox->Bind( wxEVT_RIGHT_DOWN,
302 [&]( wxMouseEvent& aEvent )
303 {
304 this->PopupMenu( m_popMenu, aEvent.GetPosition() );
305 } );
306}
307
308
309void DIALOG_PRINT_PCBNEW::onUseThemeClicked( wxCommandEvent& event )
310{
311 m_colorTheme->Enable( m_checkUseTheme->GetValue() );
312}
313
314
316{
317 if( m_checkboxPagePerLayer->GetValue() )
318 {
319 m_checkboxEdgesOnAllPages->Enable( true );
320 m_checkboxEdgesOnAllPages->SetValue( settings()->m_PrintEdgeCutsOnAllPages );
321 }
322 else
323 {
324 m_checkboxEdgesOnAllPages->Enable( false );
325 m_checkboxEdgesOnAllPages->SetValue( false );
326 }
327}
328
329
330void DIALOG_PRINT_PCBNEW::onColorModeClicked( wxCommandEvent& event )
331{
333
334 m_settings->m_blackWhite = m_outputMode->GetSelection();
335
339}
340
341
342// Select or deselect groups of layers in the layers list:
343void DIALOG_PRINT_PCBNEW::onPopUpLayers( wxCommandEvent& event )
344{
345 // Build a list of layers for usual fabrication: copper layers + tech layers without courtyard
346 LSET fab_layer_set = ( LSET::AllCuMask() | LSET::AllTechMask() ) & ~LSET( 2, B_CrtYd, F_CrtYd );
347
348 switch( event.GetId() )
349 {
350 case ID_SELECT_FAB_LAYERS: // Select layers usually needed to build a board
351 for( unsigned i = 0; i < m_layerList.size(); i++ )
352 {
353 LSET layermask( m_layerList[ i ] );
354
355 if( ( layermask & fab_layer_set ).any() )
356 m_layerCheckListBox->Check( i, true );
357 else
358 m_layerCheckListBox->Check( i, false );
359 }
360 break;
361
363 for( unsigned i = 0; i < m_layerList.size(); i++ )
364 {
365 if( IsCopperLayer( m_layerList[i] ) )
366 m_layerCheckListBox->Check( i, true );
367 }
368 break;
369
371 for( unsigned i = 0; i < m_layerList.size(); i++ )
372 {
373 if( IsCopperLayer( m_layerList[i] ) )
374 m_layerCheckListBox->Check( i, false );
375 }
376 break;
377
379 for( unsigned i = 0; i < m_layerList.size(); i++ )
380 m_layerCheckListBox->Check( i, true );
381 break;
382
384 for( unsigned i = 0; i < m_layerList.size(); i++ )
385 m_layerCheckListBox->Check( i, false );
386 break;
387
388 default:
389 break;
390 }
391}
392
393
395{
396 settings()->m_LayerSet = LSET();
397 int& pageCount = settings()->m_pageCount;
398 pageCount = 0;
399
400 for( unsigned i = 0; i < m_layerList.size(); i++ )
401 {
402 if( m_layerCheckListBox->IsChecked( i ) )
403 {
404 ++pageCount;
405 settings()->m_LayerSet.set( m_layerList[i] );
406 }
407 }
408
409 // In Pcbnew force the EDGE layer to be printed or not with the other layers
411
412 // All layers on one page (only if there is at least one layer selected)
413 if( !m_checkboxPagePerLayer->GetValue() && pageCount > 0 )
414 pageCount = 1;
415
416 return pageCount;
417}
418
419
421{
423
425
428
429 if( m_checkboxPagePerLayer->GetValue() )
430 {
433 }
434 else
435 {
437 }
438
439 settings()->m_Mirror = m_checkboxMirror->GetValue();
440
442
443 cfg->m_Printing.background = m_checkBackground->GetValue();
445 cfg->m_Printing.use_theme = m_checkUseTheme->GetValue();
446
447 int sel = m_colorTheme->GetSelection();
448 COLOR_SETTINGS* theme = static_cast<COLOR_SETTINGS*>( m_colorTheme->GetClientData( sel ) );
449
450 if( theme && m_checkUseTheme->IsChecked() )
451 {
452 cfg->m_Printing.color_theme = theme->GetFilename();
453 settings()->m_colorSettings = theme;
454 }
455 else
456 {
458 }
459
461}
462
463
464int PCB_CONTROL::Print( const TOOL_EVENT& aEvent )
465{
466 // Selection affects the origin item visibility
468
471
473 dlg.ForcePrintBorder( false );
474
475 dlg.ShowModal();
476
477 return 0;
478}
479
480
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:187
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:265
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:501
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:400
Color settings are a bit different than most of the settings objects in that there can be more than o...
APP_SETTINGS_BASE * m_config
wxStaticBox * getOptionsBox()
bool TransferDataToWindow() override
void ForcePrintBorder(bool aValue)
Set 'print border and title block' to a requested value and hides the corresponding checkbox.
wxGridBagSizer * getOptionsSizer()
PRINTOUT_SETTINGS * m_settings
wxCheckBox * m_checkboxPagePerLayer
void onPopUpLayers(wxCommandEvent &event)
Update layerset basing on the selected layers.
wxPrintout * createPrintout(const wxString &aTitle) override
Create a printout with a requested title.
PCB_BASE_EDIT_FRAME * m_parent
DIALOG_PRINT_PCBNEW(PCB_BASE_EDIT_FRAME *aParent, PCBNEW_PRINTOUT_SETTINGS *aSettings)
wxCheckBox * m_checkboxEdgesOnAllPages
bool TransferDataToWindow() override
void saveSettings() override
void onColorModeClicked(wxCommandEvent &event)
void onPagePerLayerClicked(wxCommandEvent &event)
wxCheckListBox * m_layerCheckListBox
void onUseThemeClicked(wxCommandEvent &event)
PCBNEW_PRINTOUT_SETTINGS * settings() const
SETTINGS_MANAGER * GetSettingsManager() const
wxString GetFilename() const
Definition: json_settings.h:73
APP_SETTINGS_BASE * KifaceSettings() const
Definition: kiface_base.h:93
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: layer_ids.h:491
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:530
LSEQ UIOrder() const
Definition: lset.cpp:916
static LSET AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition: lset.cpp:841
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:773
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:59
Common, abstract interface for edit frames.
COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
PCBNEW_SETTINGS * GetPcbNewSettings() const
const PAGE_INFO & GetPageSettings() const override
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
BOARD * GetBoard() const
PCB_BASE_FRAME * m_frame
Grid origin marker.
Definition: pcb_control.h:140
int Print(const TOOL_EVENT &aEvent)
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
bool m_isFootprintEditor
std::vector< COLOR_SETTINGS * > GetColorSettingsList()
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
Generic, UI-independent tool event.
Definition: tool_event.h:156
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:142
This file is part of the common library.
#define _(s)
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:823
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ F_CrtYd
Definition: layer_ids.h:117
@ B_CrtYd
Definition: layer_ids.h:116
wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:144
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:74
bool background
Whether or not to print background color.
Definition: app_settings.h:136
wxString color_theme
Color theme to use for printing.
Definition: app_settings.h:140
bool use_theme
If false, display color theme will be used.
Definition: app_settings.h:139
LSET m_LayerSet
Layers to print.
bool m_Mirror
Print mirrored.
enum PCBNEW_PRINTOUT_SETTINGS::PAGINATION_T m_Pagination
bool m_PrintEdgeCutsOnAllPages
Print board outline on each page.
bool m_AsItemCheckboxes
Honor checkboxes in the Items tab of the Layers Manager.
enum PCBNEW_PRINTOUT_SETTINGS::DRILL_MARK_SHAPE_T m_DrillMarks
COLOR_SETTINGS * m_colorSettings
The color settings to be used for printing.
Definition: printout.h:66
bool m_blackWhite
Print in B&W or Color.
Definition: printout.h:60
int m_pageCount
Number of pages to print.
Definition: printout.h:61
bool m_background
Print background color.
Definition: printout.h:62