KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_plot.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) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <wx/bmpbuttn.h>
25#include <wx/clntdata.h>
26#include <wx/rearrangectrl.h>
27
28#include <plotters/plotter.h>
29#include <confirm.h>
30#include <pcb_edit_frame.h>
32#include <pcbplot.h>
33#include <pgm_base.h>
35#include <reporter.h>
37#include <layer_ids.h>
38#include <locale_io.h>
39#include <bitmaps.h>
40#include <dialog_plot.h>
41#include <dialog_gendrill.h>
44#include <tool/tool_manager.h>
46#include <tools/drc_tool.h>
47#include <math/util.h> // for KiROUND
48#include <macros.h>
49
50#include <wx/dirdlg.h>
51
52
56
57
61class PCB_LAYER_ID_CLIENT_DATA : public wxClientData
62{
63public:
66 { }
67
69 m_id( aId )
70 { }
71
72 void SetData( PCB_LAYER_ID aId ) { m_id = aId; }
73 PCB_LAYER_ID Layer() const { return m_id; }
74
75private:
77};
78
79
80PCB_LAYER_ID_CLIENT_DATA* getLayerClientData( const wxRearrangeList* aList, int aIdx )
81{
82 return static_cast<PCB_LAYER_ID_CLIENT_DATA*>( aList->GetClientObject( aIdx ) );
83}
84
85
87 DIALOG_PLOT_BASE( aParent ),
88 m_parent( aParent ),
89 m_defaultPenSize( aParent, m_hpglPenLabel, m_hpglPenCtrl, m_hpglPenUnits ),
90 m_trackWidthCorrection( aParent, m_widthAdjustLabel, m_widthAdjustCtrl, m_widthAdjustUnits )
91{
92 BOARD* board = m_parent->GetBoard();
93
94 SetName( DLG_WINDOW_NAME );
95 m_plotOpts = aParent->GetPlotSettings();
97
98 m_messagesPanel->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
99
100 int order = 0;
101 LSET plotOnAllLayersSelection = m_plotOpts.GetPlotOnAllLayersSelection();
102 wxArrayInt plotAllLayersOrder;
103 wxArrayString plotAllLayersChoicesStrings;
104 std::vector<PCB_LAYER_ID> layersIdChoiceList;
105 int textWidth = 0;
106
107 for( LSEQ seq = board->GetEnabledLayers().SeqStackupForPlotting(); seq; ++seq )
108 {
109 PCB_LAYER_ID id = *seq;
110 wxString layerName = board->GetLayerName( id );
111
112 // wxCOL_WIDTH_AUTOSIZE doesn't work on all platforms, so we calculate width here
113 textWidth = std::max( textWidth, KIUI::GetTextSize( layerName, m_layerCheckListBox ).x );
114
115 plotAllLayersChoicesStrings.Add( layerName );
116 layersIdChoiceList.push_back( id );
117
118 size_t size = plotOnAllLayersSelection.size();
119
120 if( ( static_cast<size_t>( id ) <= size ) && plotOnAllLayersSelection.test( id ) )
121 plotAllLayersOrder.push_back( order );
122 else
123 plotAllLayersOrder.push_back( ~order );
124
125 order += 1;
126 }
127
128 int checkColSize = 22;
129 int layerColSize = textWidth + 15;
130
131#ifdef __WXMAC__
132 // TODO: something in wxWidgets 3.1.x pads checkbox columns with extra space. (It used to
133 // also be that the width of the column would get set too wide (to 30), but that's patched in
134 // our local wxWidgets fork.)
135 checkColSize += 30;
136#endif
137
138 m_layerCheckListBox->SetMinClientSize( wxSize( checkColSize + layerColSize,
139 m_layerCheckListBox->GetMinClientSize().y ) );
140
141 wxStaticBox* allLayersLabel = new wxStaticBox( this, wxID_ANY, _( "Plot on All Layers" ) );
142 wxStaticBoxSizer* sbSizer = new wxStaticBoxSizer( allLayersLabel, wxVERTICAL );
143
144 m_plotAllLayersList = new wxRearrangeList( sbSizer->GetStaticBox(), wxID_ANY,
145 wxDefaultPosition, wxDefaultSize,
146 plotAllLayersOrder, plotAllLayersChoicesStrings, 0 );
147
148 m_plotAllLayersList->SetMinClientSize( wxSize( checkColSize + layerColSize,
149 m_plotAllLayersList->GetMinClientSize().y ) );
150
151 // Attach the LAYER_ID to each item in m_plotAllLayersList
152 // plotAllLayersChoicesStrings and layersIdChoiceList are in the same order,
153 // but m_plotAllLayersList has these strings in a different order
154 for( size_t idx = 0; idx < layersIdChoiceList.size(); idx++ )
155 {
156 wxString& txt = plotAllLayersChoicesStrings[idx];
157 int list_idx = m_plotAllLayersList->FindString( txt, true );
158
159 PCB_LAYER_ID layer_id = layersIdChoiceList[idx];
160 m_plotAllLayersList->SetClientObject( list_idx, new PCB_LAYER_ID_CLIENT_DATA( layer_id ) );
161 }
162
163 sbSizer->Add( m_plotAllLayersList, 1, wxALL | wxEXPAND, 3 );
164
165 wxBoxSizer* bButtonSizer;
166 bButtonSizer = new wxBoxSizer( wxHORIZONTAL );
167
168 m_bpMoveUp = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
169 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
170 m_bpMoveUp->SetToolTip( _( "Move current selection up" ) );
171 m_bpMoveUp->SetBitmap( KiBitmapBundle( BITMAPS::small_up ) );
172
173 bButtonSizer->Add( m_bpMoveUp, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3 );
174
175 m_bpMoveDown = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
176 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
177 m_bpMoveDown->SetToolTip( _( "Move current selection down" ) );
178 m_bpMoveDown->SetBitmap( KiBitmapBundle( BITMAPS::small_down ) );
179
180 bButtonSizer->Add( m_bpMoveDown, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
181
182 sbSizer->Add( bButtonSizer, 0, wxALL | wxEXPAND, 3 );
183
184 bmiddleSizer->Insert( 1, sbSizer, 1, wxALL | wxEXPAND, 5 );
185
186 init_Dialog();
187
188 SetupStandardButtons( { { wxID_OK, _( "Plot" ) },
189 { wxID_APPLY, _( "Generate Drill Files..." ) },
190 { wxID_CANCEL, _( "Close" ) } } );
191
192 GetSizer()->Fit( this );
193 GetSizer()->SetSizeHints( this );
194
195 m_bpMoveUp->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
196 m_bpMoveDown->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
197
198 m_layerCheckListBox->Connect( wxEVT_RIGHT_DOWN,
199 wxMouseEventHandler( DIALOG_PLOT::OnRightClickLayers ), nullptr,
200 this );
201
202 m_plotAllLayersList->Connect( wxEVT_RIGHT_DOWN,
203 wxMouseEventHandler( DIALOG_PLOT::OnRightClickAllLayers ), nullptr,
204 this );
205}
206
207
209{
210 s_lastAllLayersOrder.clear();
211
212 for( int ii = 0; ii < (int) m_plotAllLayersList->GetCount(); ++ii )
214
215 m_bpMoveDown->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
216 m_bpMoveUp->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
217}
218
219
221{
222 BOARD* board = m_parent->GetBoard();
223 wxFileName fileName;
224
225 PROJECT_FILE& projectFile = m_parent->Prj().GetProjectFile();
227
228 if( !projectFile.m_PcbLastPath[ LAST_PATH_PLOT ].IsEmpty() )
230
233
235
236 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
237
238 // m_PSWidthAdjust is stored in mm in user config
240
241 // The reasonable width correction value must be in a range of
242 // [-(MinTrackWidth-1), +(MinClearanceValue-1)] decimils.
245
246 switch( m_plotOpts.GetFormat() )
247 {
248 default:
249 case PLOT_FORMAT::GERBER: m_plotFormatOpt->SetSelection( 0 ); break;
250 case PLOT_FORMAT::POST: m_plotFormatOpt->SetSelection( 1 ); break;
251 case PLOT_FORMAT::SVG: m_plotFormatOpt->SetSelection( 2 ); break;
252 case PLOT_FORMAT::DXF: m_plotFormatOpt->SetSelection( 3 ); break;
253 case PLOT_FORMAT::HPGL: m_plotFormatOpt->SetSelection( 4 ); break;
254 case PLOT_FORMAT::PDF: m_plotFormatOpt->SetSelection( 5 ); break;
255 }
256
257 // Set units and value for HPGL pen size (this param is in mils).
259
260 // Test for a reasonable scale value. Set to 1 if problem
263 {
265 }
266
268 EDA_UNITS::UNSCALED,
269 m_XScaleAdjust ) );
270
272 EDA_UNITS::UNSCALED,
273 m_YScaleAdjust ) );
274
275 // Test for a reasonable PS width correction value. Set to 0 if problem.
276 if( m_PSWidthAdjust < m_widthAdjustMinValue || m_PSWidthAdjust > m_widthAdjustMaxValue )
277 m_PSWidthAdjust = 0.;
278
280
283
284 // Could devote a PlotOrder() function in place of UIOrder().
286
287 // Populate the check list box by all enabled layers names.
288 for( LSEQ seq = m_layerList; seq; ++seq )
289 {
290 PCB_LAYER_ID layer = *seq;
291
292 int checkIndex = m_layerCheckListBox->Append( board->GetLayerName( layer ) );
293
294 if( m_plotOpts.GetLayerSelection()[layer] )
295 m_layerCheckListBox->Check( checkIndex );
296 }
297
299
300 // Option for disabling Gerber Aperture Macro (for broken Gerber readers)
302
303 // Option for using proper Gerber extensions. Note also Protel extensions are
304 // a broken feature. However, for now, we need to handle it.
306
307 // Option for including Gerber attributes, from Gerber X2 format, in the output
308 // In X1 format, they will be added as comments
310
311 // Option for including Gerber netlist info (from Gerber X2 format) in the output
313
314 // Option to generate a Gerber job file
316
317 // Gerber precision for coordinates
318 m_coordFormatCtrl->SetSelection( m_plotOpts.GetGerberPrecision() == 5 ? 0 : 1 );
319
320 // SVG precision and units for coordinates
322
323 // Option to exclude pads from silkscreen layers
325
326 // Option to tent vias
328
329 // Option to use aux origin
331
332 // Option to plot page references:
334
335 // Options to plot texts on footprints
340
341 // Options to plot pads and vias holes
342 m_drillShapeOpt->SetSelection( (int)m_plotOpts.GetDrillMarksType() );
343
344 // Scale option
345 m_scaleOpt->SetSelection( m_plotOpts.GetScaleSelection() );
346
347 // Plot mode
349
350 // DXF outline mode
352
353 // DXF text mode
354 m_DXF_plotTextStrokeFontOpt->SetValue( m_plotOpts.GetTextMode() == PLOT_TEXT_MODE::DEFAULT );
355
356 // DXF units selection
357 m_DXF_plotUnits->SetSelection( m_plotOpts.GetDXFPlotUnits() == DXF_UNITS::INCHES ? 0 : 1);
358
359 // Plot mirror option
360 m_plotMirrorOpt->SetValue( m_plotOpts.GetMirror() );
361
362 // Plot vias on mask layer (not tented) or not (tented)
364
365 // Black and white plotting
366 m_SVGColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
367 m_PDFColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
371
372 // Initialize a few other parameters, which can also be modified
373 // from the drill dialog
374 reInitDialog();
375
376 // Update options values:
377 wxCommandEvent cmd_event;
378 SetPlotFormat( cmd_event );
379 OnSetScaleOpt( cmd_event );
380}
381
382
384{
385 // after calling the Drill or DRC dialogs some parameters can be modified....
386
387 // Output directory
389
390 // Origin of coordinates:
392
393 int knownViolations = 0;
394 int exclusions = 0;
395
396 for( PCB_MARKER* marker : m_parent->GetBoard()->Markers() )
397 {
398 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
399 exclusions++;
400 else
401 knownViolations++;
402 }
403
404 if( knownViolations || exclusions )
405 {
406 m_DRCExclusionsWarning->SetLabel( wxString::Format( m_DRCWarningTemplate, knownViolations,
407 exclusions ) );
409 }
410 else
411 {
413 }
414
415 BOARD* board = m_parent->GetBoard();
416 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
417
418 if( getPlotFormat() == PLOT_FORMAT::GERBER &&
419 ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
420 {
422 }
423 else
424 {
426 }
427}
428
429
431{
432 auto findLayer =
433 [&]( wxRearrangeList* aList, PCB_LAYER_ID aLayer ) -> int
434 {
435 for( int ii = 0; ii < (int) aList->GetCount(); ++ii )
436 {
437 if( getLayerClientData( aList, ii )->Layer() == aLayer )
438 return ii;
439 }
440
441 return -1;
442 };
443
444 int idx = 0;
445
446 for( LSEQ seq = aSeq; seq; ++seq, ++idx )
447 {
448 int currentPos = findLayer( m_plotAllLayersList, *seq );
449
450 while( currentPos > idx )
451 {
452 m_plotAllLayersList->Select( currentPos );
453 m_plotAllLayersList->MoveCurrentUp();
454 currentPos--;
455 }
456 }
457}
458
459
460#define ID_LAYER_FAB 13001
461#define ID_SELECT_COPPER_LAYERS 13002
462#define ID_DESELECT_COPPER_LAYERS 13003
463#define ID_SELECT_ALL_LAYERS 13004
464#define ID_DESELECT_ALL_LAYERS 13005
465#define ID_STACKUP_ORDER 13006
466
467
468// A helper function to show a popup menu, when the dialog is right clicked.
469void DIALOG_PLOT::OnRightClickLayers( wxMouseEvent& event )
470{
471 // Build a list of layers for usual fabrication: copper layers + tech layers without courtyard
472 LSET fab_layer_set = ( LSET::AllCuMask() | LSET::AllTechMask() ) & ~LSET( 2, B_CrtYd, F_CrtYd );
473
474 wxMenu menu;
475 menu.Append( new wxMenuItem( &menu, ID_LAYER_FAB, _( "Select Fab Layers" ) ) );
476
477 menu.AppendSeparator();
478 menu.Append( new wxMenuItem( &menu, ID_SELECT_COPPER_LAYERS, _( "Select All Copper Layers" ) ) );
479 menu.Append( new wxMenuItem( &menu, ID_DESELECT_COPPER_LAYERS, _( "Deselect All Copper Layers" ) ) );
480
481 menu.AppendSeparator();
482 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
483 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
484
485 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
486 [&]( wxCommandEvent& aCmd )
487 {
488 switch( aCmd.GetId() )
489 {
490 case ID_LAYER_FAB: // Select layers usually needed to build a board
491 {
492 for( unsigned i = 0; i < m_layerList.size(); i++ )
493 {
494 LSET layermask( m_layerList[ i ] );
495
496 if( ( layermask & fab_layer_set ).any() )
497 m_layerCheckListBox->Check( i, true );
498 else
499 m_layerCheckListBox->Check( i, false );
500 }
501
502 break;
503 }
504
506 for( unsigned i = 0; i < m_layerList.size(); i++ )
507 {
508 if( IsCopperLayer( m_layerList[i] ) )
509 m_layerCheckListBox->Check( i, true );
510 }
511
512 break;
513
515 for( unsigned i = 0; i < m_layerList.size(); i++ )
516 {
517 if( IsCopperLayer( m_layerList[i] ) )
518 m_layerCheckListBox->Check( i, false );
519 }
520
521 break;
522
524 for( unsigned i = 0; i < m_layerList.size(); i++ )
525 m_layerCheckListBox->Check( i, true );
526
527 break;
528
530 for( unsigned i = 0; i < m_layerList.size(); i++ )
531 m_layerCheckListBox->Check( i, false );
532
533 break;
534
535 default:
536 aCmd.Skip();
537 }
538 } );
539
540 PopupMenu( &menu );
541}
542
543
544void DIALOG_PLOT::OnRightClickAllLayers( wxMouseEvent& event )
545{
546 wxMenu menu;
547 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
548 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
549
550 menu.AppendSeparator();
551 menu.Append( new wxMenuItem( &menu, ID_STACKUP_ORDER, _( "Order as Board Stackup" ) ) );
552
553 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
554 [&]( wxCommandEvent& aCmd )
555 {
556 switch( aCmd.GetId() )
557 {
558 case ID_SELECT_ALL_LAYERS:
559 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
560 m_plotAllLayersList->Check( i, true );
561
562 break;
563
564 case ID_DESELECT_ALL_LAYERS:
565 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
566 m_plotAllLayersList->Check( i, false );
567
568 break;
569
570 case ID_STACKUP_ORDER:
571 {
572 LSEQ stackup = m_parent->GetBoard()->GetEnabledLayers().SeqStackupForPlotting();
573 arrangeAllLayersList( stackup );
574 m_plotAllLayersList->Select( -1 );
575 break;
576 }
577
578 default:
579 aCmd.Skip();
580 }
581 } );
582
583 PopupMenu( &menu );
584}
585
586
587void DIALOG_PLOT::CreateDrillFile( wxCommandEvent& event )
588{
589 // Be sure drill file use the same settings (axis option, plot directory) as plot files:
591
592 DIALOG_GENDRILL dlg( m_parent, this );
593 dlg.ShowModal();
594
595 // a few plot settings can be modified: take them in account
597 reInitDialog();
598}
599
600
601void DIALOG_PLOT::OnChangeDXFPlotMode( wxCommandEvent& event )
602{
603 // m_DXF_plotTextStrokeFontOpt is disabled if m_DXF_plotModeOpt is checked (plot in DXF
604 // polygon mode)
605 m_DXF_plotTextStrokeFontOpt->Enable( !m_DXF_plotModeOpt->GetValue() );
606
607 // if m_DXF_plotTextStrokeFontOpt option is disabled (plot DXF in polygon mode), force
608 // m_DXF_plotTextStrokeFontOpt to true to use Pcbnew stroke font
609 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() )
610 m_DXF_plotTextStrokeFontOpt->SetValue( true );
611}
612
613
614void DIALOG_PLOT::OnSetScaleOpt( wxCommandEvent& event )
615{
616 /* Disable sheet reference for scale != 1:1 */
617 bool scale1 = ( m_scaleOpt->GetSelection() == 1 );
618
619 m_plotSheetRef->Enable( scale1 );
620
621 if( !scale1 )
622 m_plotSheetRef->SetValue( false );
623}
624
625
627{
628 // Build the absolute path of current output directory to preselect it in the file browser.
629 std::function<bool( wxString* )> textResolver =
630 [&]( wxString* token ) -> bool
631 {
632 return m_parent->GetBoard()->ResolveTextVar( token, 0 );
633 };
634
635 wxString path = m_outputDirectoryName->GetValue();
636 path = ExpandTextVars( path, &textResolver );
638 path = Prj().AbsolutePath( path );
639
640 wxDirDialog dirDialog( this, _( "Select Output Directory" ), path );
641
642 if( dirDialog.ShowModal() == wxID_CANCEL )
643 return;
644
645 wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() );
646
647 wxFileName fn( Prj().AbsolutePath( m_parent->GetBoard()->GetFileName() ) );
648 wxString defaultPath = fn.GetPathWithSep();
649 wxString msg;
650 wxFileName relPathTest; // Used to test if we can make the path relative
651
652 relPathTest.Assign( dirDialog.GetPath() );
653
654 // Test if making the path relative is possible before asking the user if they want to do it
655 if( relPathTest.MakeRelativeTo( defaultPath ) )
656 {
657 msg.Printf( _( "Do you want to use a path relative to\n'%s'?" ), defaultPath );
658
659 wxMessageDialog dialog( this, msg, _( "Plot Output Directory" ),
660 wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT );
661
662 if( dialog.ShowModal() == wxID_YES )
663 dirName.MakeRelativeTo( defaultPath );
664 }
665
666 m_outputDirectoryName->SetValue( dirName.GetFullPath() );
667}
668
669
671{
672 // plot format id's are ordered like displayed in m_plotFormatOpt
673 static const PLOT_FORMAT plotFmt[] = {
674 PLOT_FORMAT::GERBER,
675 PLOT_FORMAT::POST,
676 PLOT_FORMAT::SVG,
677 PLOT_FORMAT::DXF,
678 PLOT_FORMAT::HPGL,
679 PLOT_FORMAT::PDF };
680
681 return plotFmt[m_plotFormatOpt->GetSelection()];
682}
683
684
685void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event )
686{
687 // this option exist only in DXF format:
688 m_DXF_plotModeOpt->Enable( getPlotFormat() == PLOT_FORMAT::DXF );
689
690 // The alert message about non 0 solder mask min width and margin is shown
691 // only in gerber format and if min mask width or mask margin is not 0
692 BOARD* board = m_parent->GetBoard();
693 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
694
695 if( getPlotFormat() == PLOT_FORMAT::GERBER
696 && ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
697 {
699 }
700 else
701 {
703 }
704
705 switch( getPlotFormat() )
706 {
707 case PLOT_FORMAT::SVG:
708 case PLOT_FORMAT::PDF:
709 m_drillShapeOpt->Enable( true );
710 m_plotModeOpt->Enable( false );
712 m_plotMirrorOpt->Enable( true );
713 m_useAuxOriginCheckBox->Enable( true );
714 m_defaultPenSize.Enable( false );
715 m_scaleOpt->Enable( false );
716 m_scaleOpt->SetSelection( 1 );
717 m_fineAdjustXCtrl->Enable( false );
718 m_fineAdjustYCtrl->Enable( false );
720 m_plotPSNegativeOpt->Enable( true );
721 m_forcePSA4OutputOpt->Enable( false );
722 m_forcePSA4OutputOpt->SetValue( false );
723
724 if( getPlotFormat() == PLOT_FORMAT::SVG )
725 {
728 }
729 else
730 {
733 }
734
739 break;
740
741 case PLOT_FORMAT::POST:
742 m_drillShapeOpt->Enable( true );
743 m_plotModeOpt->Enable( true );
744 m_plotMirrorOpt->Enable( true );
745 m_useAuxOriginCheckBox->Enable( false );
746 m_useAuxOriginCheckBox->SetValue( false );
747 m_defaultPenSize.Enable( false );
748 m_scaleOpt->Enable( true );
749 m_fineAdjustXCtrl->Enable( true );
750 m_fineAdjustYCtrl->Enable( true );
752 m_plotPSNegativeOpt->Enable( true );
753 m_forcePSA4OutputOpt->Enable( true );
754
761 break;
762
763 case PLOT_FORMAT::GERBER:
764 m_drillShapeOpt->Enable( false );
765 m_drillShapeOpt->SetSelection( 0 );
766 m_plotModeOpt->Enable( false );
768 m_plotMirrorOpt->Enable( false );
769 m_plotMirrorOpt->SetValue( false );
770 m_useAuxOriginCheckBox->Enable( true );
771 m_defaultPenSize.Enable( false );
772 m_scaleOpt->Enable( false );
773 m_scaleOpt->SetSelection( 1 );
774 m_fineAdjustXCtrl->Enable( false );
775 m_fineAdjustYCtrl->Enable( false );
777 m_plotPSNegativeOpt->Enable( false );
778 m_plotPSNegativeOpt->SetValue( false );
779 m_forcePSA4OutputOpt->Enable( false );
780 m_forcePSA4OutputOpt->SetValue( false );
781
788 break;
789
790 case PLOT_FORMAT::HPGL:
791 m_drillShapeOpt->Enable( true );
792 m_plotModeOpt->Enable( true );
793 m_plotMirrorOpt->Enable( true );
794 m_useAuxOriginCheckBox->Enable( false );
795 m_useAuxOriginCheckBox->SetValue( false );
796 m_defaultPenSize.Enable( true );
797 m_scaleOpt->Enable( true );
798 m_fineAdjustXCtrl->Enable( false );
799 m_fineAdjustYCtrl->Enable( false );
801 m_plotPSNegativeOpt->SetValue( false );
802 m_plotPSNegativeOpt->Enable( false );
803 m_forcePSA4OutputOpt->Enable( true );
804
811 break;
812
813 case PLOT_FORMAT::DXF:
814 m_drillShapeOpt->Enable( true );
815 m_plotModeOpt->Enable( false );
817 m_plotMirrorOpt->Enable( false );
818 m_plotMirrorOpt->SetValue( false );
819 m_useAuxOriginCheckBox->Enable( true );
820 m_defaultPenSize.Enable( false );
821 m_scaleOpt->Enable( false );
822 m_scaleOpt->SetSelection( 1 );
823 m_fineAdjustXCtrl->Enable( false );
824 m_fineAdjustYCtrl->Enable( false );
826 m_plotPSNegativeOpt->Enable( false );
827 m_plotPSNegativeOpt->SetValue( false );
828 m_forcePSA4OutputOpt->Enable( false );
829 m_forcePSA4OutputOpt->SetValue( false );
830
837
838 OnChangeDXFPlotMode( event );
839 break;
840
841 case PLOT_FORMAT::UNDEFINED:
842 break;
843 }
844
845 /* Update the interlock between scale and frame reference
846 * (scaling would mess up the frame border...) */
847 OnSetScaleOpt( event );
848
849 Layout();
850 m_MainSizer->SetSizeHints( this );
851}
852
853
854// A helper function to "clip" aValue between aMin and aMax and write result in * aResult
855// return false if clipped, true if aValue is just copied into * aResult
856static bool setDouble( double* aResult, double aValue, double aMin, double aMax )
857{
858 if( aValue < aMin )
859 {
860 *aResult = aMin;
861 return false;
862 }
863 else if( aValue > aMax )
864 {
865 *aResult = aMax;
866 return false;
867 }
868
869 *aResult = aValue;
870 return true;
871}
872
873
874static bool setInt( int* aResult, int aValue, int aMin, int aMax )
875{
876 if( aValue < aMin )
877 {
878 *aResult = aMin;
879 return false;
880 }
881 else if( aValue > aMax )
882 {
883 *aResult = aMax;
884 return false;
885 }
886
887 *aResult = aValue;
888 return true;
889}
890
891
893{
894 REPORTER& reporter = m_messagesPanel->Reporter();
895 PCB_PLOT_PARAMS tempOptions;
896
897 tempOptions.SetSubtractMaskFromSilk( m_subtractMaskFromSilk->GetValue() );
898 tempOptions.SetPlotFrameRef( m_plotSheetRef->GetValue() );
899 tempOptions.SetSketchPadsOnFabLayers( m_sketchPadsOnFabLayers->GetValue() );
900 tempOptions.SetUseAuxOrigin( m_useAuxOriginCheckBox->GetValue() );
901 tempOptions.SetPlotValue( m_plotFootprintValues->GetValue() );
902 tempOptions.SetPlotReference( m_plotFootprintRefs->GetValue() );
903 tempOptions.SetPlotFPText( m_plotFootprintText->GetValue() );
904 tempOptions.SetPlotInvisibleText( m_plotInvisibleText->GetValue() );
905 tempOptions.SetScaleSelection( m_scaleOpt->GetSelection() );
906
907 int sel = m_drillShapeOpt->GetSelection();
908 tempOptions.SetDrillMarksType( static_cast<DRILL_MARKS>( sel ) );
909
910 tempOptions.SetMirror( m_plotMirrorOpt->GetValue() );
911 tempOptions.SetPlotMode( m_plotModeOpt->GetSelection() == 1 ? SKETCH : FILLED );
912 tempOptions.SetDXFPlotPolygonMode( m_DXF_plotModeOpt->GetValue() );
913
914 sel = m_DXF_plotUnits->GetSelection();
915 tempOptions.SetDXFPlotUnits( sel == 0 ? DXF_UNITS::INCHES : DXF_UNITS::MILLIMETERS );
916
917 tempOptions.SetPlotViaOnMaskLayer( !m_tentVias->GetValue() );
918
919 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() ) // Currently, only DXF supports this option
920 tempOptions.SetTextMode( PLOT_TEXT_MODE::DEFAULT );
921 else
922 tempOptions.SetTextMode( m_DXF_plotTextStrokeFontOpt->GetValue() ? PLOT_TEXT_MODE::DEFAULT :
923 PLOT_TEXT_MODE::NATIVE );
924
925 if( getPlotFormat() == PLOT_FORMAT::SVG )
926 {
927 tempOptions.SetBlackAndWhite( !!m_SVGColorChoice->GetSelection() );
928 }
929 else if( getPlotFormat() == PLOT_FORMAT::PDF )
930 {
931 tempOptions.SetBlackAndWhite( !!m_PDFColorChoice->GetSelection() );
932 tempOptions.m_PDFFrontFPPropertyPopups = m_frontFPPropertyPopups->GetValue();
933 tempOptions.m_PDFBackFPPropertyPopups = m_backFPPropertyPopups->GetValue();
934 tempOptions.m_PDFMetadata = m_pdfMetadata->GetValue();
935 }
936 else
937 {
938 tempOptions.SetBlackAndWhite( true );
939 }
940
941 // Update settings from text fields. Rewrite values back to the fields,
942 // since the values may have been constrained by the setters.
943 wxString msg;
944
945 // read HPLG pen size (this param is stored in mils)
946 // However, due to issues when converting this value from or to mm
947 // that can slightly change the value, update this param only if it
948 // is in use
949 if( getPlotFormat() == PLOT_FORMAT::HPGL )
950 {
952 {
954 msg.Printf( _( "HPGL pen size constrained." ) );
955 reporter.Report( msg, RPT_SEVERITY_INFO );
956 }
957 }
958 else // keep the last value (initial value if no HPGL plot made)
959 {
961 }
962
963 // X scale
964 double tmpDouble;
965 msg = m_fineAdjustXCtrl->GetValue();
966 msg.ToDouble( &tmpDouble );
967
969 {
970 msg.Printf( wxT( "%f" ), m_XScaleAdjust );
971 m_fineAdjustXCtrl->SetValue( msg );
972 msg.Printf( _( "X scale constrained." ) );
973 reporter.Report( msg, RPT_SEVERITY_INFO );
974 }
975
976 // Y scale
977 msg = m_fineAdjustYCtrl->GetValue();
978 msg.ToDouble( &tmpDouble );
979
981 {
982 msg.Printf( wxT( "%f" ), m_YScaleAdjust );
983 m_fineAdjustYCtrl->SetValue( msg );
984 msg.Printf( _( "Y scale constrained." ) );
985 reporter.Report( msg, RPT_SEVERITY_INFO );
986 }
987
988 auto cfg = m_parent->GetPcbNewSettings();
989
991 cfg->m_Plot.fine_scale_y = m_YScaleAdjust;
992
993 cfg->m_Plot.check_zones_before_plotting = m_zoneFillCheck->GetValue();
994
995 // PS Width correction
998 {
1000 msg.Printf( _( "Width correction constrained. The width correction value must be in the"
1001 " range of [%s; %s] for the current design rules." ),
1004 reporter.Report( msg, RPT_SEVERITY_WARNING );
1005 }
1006
1007 // Store m_PSWidthAdjust in mm in user config
1008 cfg->m_Plot.ps_fine_width_adjust = pcbIUScale.IUTomm( m_PSWidthAdjust );
1009
1010 tempOptions.SetFormat( getPlotFormat() );
1011
1012 tempOptions.SetDisableGerberMacros( m_disableApertMacros->GetValue() );
1013 tempOptions.SetUseGerberProtelExtensions( m_useGerberExtensions->GetValue() );
1014 tempOptions.SetUseGerberX2format( m_useGerberX2Format->GetValue() );
1015 tempOptions.SetIncludeGerberNetlistInfo( m_useGerberNetAttributes->GetValue() );
1016 tempOptions.SetCreateGerberJobFile( m_generateGerberJobFile->GetValue() );
1017
1018 tempOptions.SetGerberPrecision( m_coordFormatCtrl->GetSelection() == 0 ? 5 : 6 );
1019 tempOptions.SetSvgPrecision( m_svgPrecsision->GetValue() );
1020
1021 LSET selectedLayers;
1022
1023 for( unsigned i = 0; i < m_layerList.size(); i++ )
1024 {
1025 if( m_layerCheckListBox->IsChecked( i ) )
1026 selectedLayers.set( m_layerList[i] );
1027 }
1028
1029 // Get a list of copper layers that aren't being used by inverting enabled layers.
1030 LSET disabledCopperLayers = LSET::AllCuMask() & ~m_parent->GetBoard()->GetEnabledLayers();
1031
1032 LSET plotOnAllLayers;
1033
1034 // Add selected layers from plot on all layers list in order set by user.
1035 wxArrayInt plotOnAllLayersSelections;
1036
1037 m_plotAllLayersList->GetCheckedItems( plotOnAllLayersSelections );
1038
1039 size_t count = plotOnAllLayersSelections.GetCount();
1040
1041 for( size_t i = 0; i < count; i++ )
1042 {
1043 int index = plotOnAllLayersSelections.Item( i );
1044 wxClientData* tmp = m_plotAllLayersList->GetClientObject( index );
1045 PCB_LAYER_ID_CLIENT_DATA* layerId = dynamic_cast<PCB_LAYER_ID_CLIENT_DATA*>( tmp );
1046
1047 wxCHECK2( layerId, continue );
1048
1049 plotOnAllLayers.set( layerId->Layer() );
1050 }
1051
1052 tempOptions.SetPlotOnAllLayersSelection( plotOnAllLayers );
1053
1054 // Enable all of the disabled copper layers.
1055 // If someone enables more copper layers they will be selected by default.
1056 selectedLayers = selectedLayers | disabledCopperLayers;
1057 tempOptions.SetLayerSelection( selectedLayers );
1058
1059 tempOptions.SetNegative( m_plotPSNegativeOpt->GetValue() );
1060 tempOptions.SetA4Output( m_forcePSA4OutputOpt->GetValue() );
1061
1062 // Set output directory and replace backslashes with forward ones
1063 wxString dirStr;
1064 dirStr = m_outputDirectoryName->GetValue();
1065 dirStr.Replace( wxT( "\\" ), wxT( "/" ) );
1066 tempOptions.SetOutputDirectory( dirStr );
1068
1069 if( !m_plotOpts.IsSameAs( tempOptions ) )
1070 {
1071 m_parent->SetPlotSettings( tempOptions );
1072 m_parent->OnModify();
1073 m_plotOpts = tempOptions;
1074 }
1075}
1076
1077
1078void DIALOG_PLOT::OnGerberX2Checked( wxCommandEvent& event )
1079{
1080 // Currently: do nothing
1081}
1082
1083
1084void DIALOG_PLOT::Plot( wxCommandEvent& event )
1085{
1086 BOARD* board = m_parent->GetBoard();
1087
1089
1090 SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
1092
1094
1096
1097 // If no layer selected, we have nothing plotted.
1098 // Prompt user if it happens because he could think there is a bug in Pcbnew.
1099 if( !m_plotOpts.GetLayerSelection().any() )
1100 {
1101 DisplayError( this, _( "No layer selected, Nothing to plot" ) );
1102 return;
1103 }
1104
1105 // Create output directory if it does not exist (also transform it in absolute form).
1106 // Bail if it fails.
1107
1108 std::function<bool( wxString* )> textResolver =
1109 [&]( wxString* token ) -> bool
1110 {
1111 // Handles board->GetTitleBlock() *and* board->GetProject()
1112 return m_parent->GetBoard()->ResolveTextVar( token, 0 );
1113 };
1114
1115 wxString path = m_plotOpts.GetOutputDirectory();
1116 path = ExpandTextVars( path, &textResolver );
1118
1119 wxFileName outputDir = wxFileName::DirName( path );
1120 wxString boardFilename = m_parent->GetBoard()->GetFileName();
1121 REPORTER& reporter = m_messagesPanel->Reporter();
1122
1123 if( !EnsureFileDirectoryExists( &outputDir, boardFilename, &reporter ) )
1124 {
1125 wxString msg;
1126 msg.Printf( _( "Could not write plot files to folder '%s'." ), outputDir.GetPath() );
1127 DisplayError( this, msg );
1128 return;
1129 }
1130
1131 if( m_zoneFillCheck->GetValue() )
1132 m_parent->GetToolManager()->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( this );
1133
1134 m_plotOpts.SetAutoScale( false );
1135
1136 switch( m_plotOpts.GetScaleSelection() )
1137 {
1138 default: m_plotOpts.SetScale( 1 ); break;
1139 case 0: m_plotOpts.SetAutoScale( true ); break;
1140 case 2: m_plotOpts.SetScale( 1.5 ); break;
1141 case 3: m_plotOpts.SetScale( 2 ); break;
1142 case 4: m_plotOpts.SetScale( 3 ); break;
1143 }
1144
1145 /* If the scale factor edit controls are disabled or the scale value
1146 * is 0, don't adjust the base scale factor. This fixes a bug when
1147 * the default scale adjust is initialized to 0 and saved in program
1148 * settings resulting in a divide by zero fault.
1149 */
1150 if( getPlotFormat() == PLOT_FORMAT::POST )
1151 {
1152 if( m_XScaleAdjust != 0.0 )
1154
1155 if( m_YScaleAdjust != 0.0 )
1157
1159 }
1160
1161 wxString file_ext( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
1162
1163 // Test for a reasonable scale value
1164 // XXX could this actually happen? isn't it constrained in the apply function?
1166 DisplayInfoMessage( this, _( "Warning: Scale option set to a very small value" ) );
1167
1169 DisplayInfoMessage( this, _( "Warning: Scale option set to a very large value" ) );
1170
1171 GERBER_JOBFILE_WRITER jobfile_writer( board, &reporter );
1172
1173 // Save the current plot options in the board
1175
1176 wxBusyCursor dummy;
1177
1178 for( LSEQ seq = m_plotOpts.GetLayerSelection().UIOrder(); seq; ++seq )
1179 {
1180 LSEQ plotSequence;
1181
1182 // Base layer always gets plotted first.
1183 plotSequence.push_back( *seq );
1184
1185 // Add selected layers from plot on all layers list in order set by user.
1186 wxArrayInt plotOnAllLayers;
1187
1188 if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
1189 {
1190 size_t count = plotOnAllLayers.GetCount();
1191
1192 for( size_t i = 0; i < count; i++ )
1193 {
1194 int index = plotOnAllLayers.Item( i );
1196
1197 // Don't plot the same layer more than once;
1198 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
1199 continue;
1200
1201 plotSequence.push_back( layer );
1202 }
1203 }
1204
1205 PCB_LAYER_ID layer = *seq;
1206
1207 // All copper layers that are disabled are actually selected
1208 // This is due to wonkyness in automatically selecting copper layers
1209 // for plotting when adding more than two layers to a board.
1210 // If plot options become accessible to the layers setup dialog
1211 // please move this functionality there!
1212 // This skips a copper layer if it is actually disabled on the board.
1213 if( ( LSET::AllCuMask() & ~board->GetEnabledLayers() )[layer] )
1214 continue;
1215
1216 // Pick the basename from the board file
1217 wxFileName fn( boardFilename );
1218
1219 // Use Gerber Extensions based on layer number
1220 // (See http://en.wikipedia.org/wiki/Gerber_File)
1221 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && m_useGerberExtensions->GetValue() )
1222 file_ext = GetGerberProtelExtension( layer );
1223
1224 BuildPlotFileName( &fn, outputDir.GetPath(), board->GetLayerName( layer ), file_ext );
1225 wxString fullname = fn.GetFullName();
1226 jobfile_writer.AddGbrFile( layer, fullname );
1227
1228 LOCALE_IO toggle;
1229
1230 //@todo allow controlling the sheet name and path that will be displayed in the title block
1231 // Leave blank for now
1232 PLOTTER* plotter = StartPlotBoard( board, &m_plotOpts, layer, fn.GetFullPath(),
1233 wxEmptyString, wxEmptyString );
1234
1235 // Print diags in messages box:
1236 wxString msg;
1237
1238 if( plotter )
1239 {
1240 plotter->SetTitle( ExpandTextVars( board->GetTitleBlock().GetTitle(), &textResolver ) );
1241
1243 {
1244 msg = wxS( "AUTHOR" );
1245
1246 if( board->ResolveTextVar( &msg, 0 ) )
1247 plotter->SetAuthor( msg );
1248
1249 msg = wxS( "SUBJECT" );
1250
1251 if( board->ResolveTextVar( &msg, 0 ) )
1252 plotter->SetSubject( msg );
1253 }
1254
1255 PlotBoardLayers( board, plotter, plotSequence, m_plotOpts );
1256 PlotInteractiveLayer( board, plotter, m_plotOpts );
1257 plotter->EndPlot();
1258 delete plotter->RenderSettings();
1259 delete plotter;
1260
1261 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
1262 reporter.Report( msg, RPT_SEVERITY_ACTION );
1263 }
1264 else
1265 {
1266 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
1267 reporter.Report( msg, RPT_SEVERITY_ERROR );
1268 }
1269
1270 wxSafeYield(); // displays report message.
1271 }
1272
1273 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && m_plotOpts.GetCreateGerberJobFile() )
1274 {
1275 // Pick the basename from the board file
1276 wxFileName fn( boardFilename );
1277
1278 // Build gerber job file from basename
1279 BuildPlotFileName( &fn, outputDir.GetPath(), wxT( "job" ),
1281 jobfile_writer.CreateJobFile( fn.GetFullPath() );
1282 }
1283
1284 reporter.ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
1285}
1286
1287
1288void DIALOG_PLOT::onRunDRC( wxCommandEvent& event )
1289{
1290 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1291
1292 if( parent )
1293 {
1294 DRC_TOOL* drcTool = parent->GetToolManager()->GetTool<DRC_TOOL>();
1295
1296 // First close an existing dialog if open
1297 // (low probability, but can happen)
1298 drcTool->DestroyDRCDialog();
1299
1300 // Open a new drc dialog, with the right parent frame, and in Modal Mode
1301 drcTool->ShowDRCDialog( this );
1302
1303 // Update DRC warnings on return to this dialog
1304 reInitDialog();
1305 }
1306}
1307
1308
1309void DIALOG_PLOT::onBoardSetup( wxHyperlinkEvent& aEvent )
1310{
1311 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1312
1313 if( parent )
1314 {
1315 parent->ShowBoardSetupDialog( _( "Solder Mask/Paste" ) );
1316
1317 // Update warnings on return to this dialog
1318 reInitDialog();
1319 }
1320}
1321
1322
1323void DIALOG_PLOT::onPlotAllListMoveUp( wxCommandEvent& aEvent )
1324{
1325 if( m_plotAllLayersList->CanMoveCurrentUp() )
1326 m_plotAllLayersList->MoveCurrentUp();
1327}
1328
1329
1330void DIALOG_PLOT::onPlotAllListMoveDown( wxCommandEvent& aEvent )
1331{
1332 if( m_plotAllLayersList->CanMoveCurrentDown() )
1333 m_plotAllLayersList->MoveCurrentDown();
1334}
1335
1336
1337void DIALOG_PLOT::onPlotFPRefs( wxCommandEvent& aEvent )
1338{
1339 if( aEvent.IsChecked() )
1340 m_plotFootprintText->SetValue( true );
1341}
1342
1343
1344void DIALOG_PLOT::onPlotFPValues( wxCommandEvent& aEvent )
1345{
1346 if( aEvent.IsChecked() )
1347 m_plotFootprintText->SetValue( true );
1348}
1349
1350
1351void DIALOG_PLOT::onPlotFPText( wxCommandEvent& aEvent )
1352{
1353 if( !aEvent.IsChecked() )
1354 {
1355 m_plotFootprintRefs->SetValue( false );
1356 m_plotFootprintValues->SetValue( false );
1357 }
1358}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:112
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
Definition: bitmap.cpp:110
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:173
Container for design settings for a BOARD object.
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:276
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:689
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:433
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:656
MARKERS & Markers()
Definition: board.h:330
const wxString & GetFileName() const
Definition: board.h:313
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:576
PROJECT * GetProject() const
Definition: board.h:457
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:806
Class DIALOG_PLOT_BASE.
wxCheckBox * m_frontFPPropertyPopups
wxStaticText * m_DRCExclusionsWarning
wxCheckBox * m_backFPPropertyPopups
wxTextCtrl * m_fineAdjustXCtrl
wxBoxSizer * bmiddleSizer
wxStaticBoxSizer * m_PDFOptionsSizer
wxCheckBox * m_disableApertMacros
wxChoice * m_scaleOpt
wxChoice * m_coordFormatCtrl
wxCheckBox * m_DXF_plotModeOpt
wxChoice * m_SVGColorChoice
STD_BITMAP_BUTTON * m_browseButton
wxTextCtrl * m_outputDirectoryName
wxSpinCtrl * m_svgPrecsision
wxTextCtrl * m_fineAdjustYCtrl
wxStaticBoxSizer * m_HPGLOptionsSizer
wxCheckBox * m_tentVias
wxCheckBox * m_plotFootprintRefs
wxCheckBox * m_useAuxOriginCheckBox
wxStaticBoxSizer * m_PSOptionsSizer
wxCheckBox * m_plotFootprintText
wxCheckBox * m_plotPSNegativeOpt
wxCheckBox * m_DXF_plotTextStrokeFontOpt
wxChoice * m_plotModeOpt
wxCheckBox * m_useGerberExtensions
wxCheckBox * m_plotSheetRef
wxBoxSizer * m_SizerSolderMaskAlert
wxCheckBox * m_generateGerberJobFile
wxCheckBox * m_useGerberX2Format
wxCheckListBox * m_layerCheckListBox
wxCheckBox * m_plotMirrorOpt
wxStaticBoxSizer * m_svgOptionsSizer
wxCheckBox * m_forcePSA4OutputOpt
wxCheckBox * m_useGerberNetAttributes
wxCheckBox * m_sketchPadsOnFabLayers
wxCheckBox * m_subtractMaskFromSilk
wxBoxSizer * m_PlotOptionsSizer
wxChoice * m_DXF_plotUnits
wxStaticBoxSizer * m_SizerDXF_options
wxCheckBox * m_plotInvisibleText
wxCheckBox * m_pdfMetadata
wxChoice * m_drillShapeOpt
wxCheckBox * m_plotFootprintValues
wxCheckBox * m_zoneFillCheck
wxStaticBoxSizer * m_GerberOptionsSizer
WX_HTML_REPORT_PANEL * m_messagesPanel
wxChoice * m_PDFColorChoice
wxChoice * m_plotFormatOpt
wxBoxSizer * m_MainSizer
static LSET s_lastAllLayersSet
Definition: dialog_plot.h:108
void reInitDialog()
void OnRightClickLayers(wxMouseEvent &event)
static LSEQ s_lastAllLayersOrder
The plot on all layers ordering the last time the dialog was opened.
Definition: dialog_plot.h:111
PCB_PLOT_PARAMS m_plotOpts
Definition: dialog_plot.h:99
STD_BITMAP_BUTTON * m_bpMoveUp
Definition: dialog_plot.h:103
void onPlotAllListMoveUp(wxCommandEvent &aEvent)
void OnChangeDXFPlotMode(wxCommandEvent &event) override
int m_widthAdjustMinValue
Definition: dialog_plot.h:91
UNIT_BINDER m_trackWidthCorrection
Definition: dialog_plot.h:95
void onBoardSetup(wxHyperlinkEvent &aEvent) override
void OnRightClickAllLayers(wxMouseEvent &event)
PCB_EDIT_FRAME * m_parent
Definition: dialog_plot.h:81
void Plot(wxCommandEvent &event) override
void applyPlotSettings()
int m_PSWidthAdjust
Definition: dialog_plot.h:87
wxString m_DRCWarningTemplate
Definition: dialog_plot.h:97
void setPlotModeChoiceSelection(OUTLINE_MODE aPlotMode)
Definition: dialog_plot.h:73
void OnOutputDirectoryBrowseClicked(wxCommandEvent &event) override
wxRearrangeList * m_plotAllLayersList
Definition: dialog_plot.h:101
void onPlotAllListMoveDown(wxCommandEvent &aEvent)
void onRunDRC(wxCommandEvent &event) override
void arrangeAllLayersList(const LSEQ &aSeq)
double m_YScaleAdjust
Definition: dialog_plot.h:85
void OnSetScaleOpt(wxCommandEvent &event) override
virtual ~DIALOG_PLOT()
STD_BITMAP_BUTTON * m_bpMoveDown
Definition: dialog_plot.h:104
void onPlotFPText(wxCommandEvent &aEvent) override
DIALOG_PLOT(PCB_EDIT_FRAME *parent)
Definition: dialog_plot.cpp:86
void CreateDrillFile(wxCommandEvent &event) override
void onPlotFPValues(wxCommandEvent &aEvent) override
void onPlotFPRefs(wxCommandEvent &aEvent) override
UNIT_BINDER m_defaultPenSize
Definition: dialog_plot.h:94
double m_XScaleAdjust
Definition: dialog_plot.h:83
PLOT_FORMAT getPlotFormat()
static LSET s_lastLayerSet
The plot layer set that last time the dialog was opened.
Definition: dialog_plot.h:107
int m_widthAdjustMaxValue
Definition: dialog_plot.h:92
void OnGerberX2Checked(wxCommandEvent &event) override
void init_Dialog()
void SetPlotFormat(wxCommandEvent &event) override
LSEQ m_layerList
Definition: dialog_plot.h:82
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void ShowDRCDialog(wxWindow *aParent)
Opens the DRC dialog.
Definition: drc_tool.cpp:71
void DestroyDRCDialog()
Close and free the DRC dialog.
Definition: drc_tool.cpp:122
GERBER_JOBFILE_WRITER is a class used to create Gerber job file a Gerber job file stores info to make...
bool CreateJobFile(const wxString &aFullFilename)
Creates a Gerber job file.
void AddGbrFile(PCB_LAYER_ID aLayer, wxString &aFilename)
add a gerber file name and type in job file list
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:49
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: layer_ids.h:519
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:573
LSEQ UIOrder() const
Definition: lset.cpp:1012
LSEQ SeqStackupForPlotting() const
Return the sequence that is typical for a bottom-to-top stack-up.
Definition: lset.cpp:563
static LSET AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition: lset.cpp:931
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:863
DIALOG_PLOT m_Plot
virtual const PCB_PLOT_PARAMS & GetPlotSettings() const
Return the PCB_PLOT_PARAMS for the BOARD owned by this frame.
PCBNEW_SETTINGS * GetPcbNewSettings() const
BOARD * GetBoard() const
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
The main frame for Pcbnew.
void ShowBoardSetupDialog(const wxString &aInitialPage=wxEmptyString)
void OnModify() override
Must be called after a board change to set the modified flag.
A helper wxWidgets control client data object to store layer IDs.
Definition: dialog_plot.cpp:62
PCB_LAYER_ID Layer() const
Definition: dialog_plot.cpp:73
void SetData(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:72
PCB_LAYER_ID_CLIENT_DATA(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:68
Parameters and options when plotting/printing a board.
bool GetNegative() const
PLOT_FORMAT GetFormat() const
void SetDrillMarksType(DRILL_MARKS aVal)
bool GetUseAuxOrigin() const
void SetLayerSelection(LSET aSelection)
void SetOutputDirectory(const wxString &aDir)
void SetPlotReference(bool aFlag)
void SetSketchPadsOnFabLayers(bool aFlag)
void SetUseGerberX2format(bool aUse)
bool GetMirror() const
DXF_UNITS GetDXFPlotUnits() const
bool GetPlotInvisibleText() const
void SetA4Output(int aForce)
PLOT_TEXT_MODE GetTextMode() const
void SetDXFPlotPolygonMode(bool aFlag)
void SetAutoScale(bool aFlag)
double GetHPGLPenDiameter() const
unsigned GetSvgPrecision() const
void SetPlotFrameRef(bool aFlag)
bool m_PDFMetadata
Generate PDF metadata for SUBJECT and AUTHOR.
unsigned GetBlackAndWhite() const
double GetScale() const
bool GetCreateGerberJobFile() const
bool GetDXFPlotPolygonMode() const
void SetSketchPadLineWidth(int aWidth)
LSET GetLayerSelection() const
bool GetPlotReference() const
wxString GetOutputDirectory() const
int GetScaleSelection() const
void SetPlotOnAllLayersSelection(LSET aSelection)
LSET GetPlotOnAllLayersSelection() const
bool SetHPGLPenDiameter(double aValue)
bool m_PDFFrontFPPropertyPopups
Generate PDF property popup menus for footprints.
void SetScale(double aVal)
void SetDisableGerberMacros(bool aDisable)
void SetScaleSelection(int aSelection)
void SetFineScaleAdjustX(double aVal)
void SetMirror(bool aFlag)
void SetBlackAndWhite(bool blackAndWhite)
void SetPlotViaOnMaskLayer(bool aFlag)
void SetPlotFPText(bool aFlag)
void SetGerberPrecision(int aPrecision)
void SetSubtractMaskFromSilk(bool aSubtract)
bool GetSketchPadsOnFabLayers() const
bool GetSubtractMaskFromSilk() const
void SetPlotValue(bool aFlag)
int GetGerberPrecision() const
void SetUseGerberProtelExtensions(bool aUse)
bool GetA4Output() const
DRILL_MARKS GetDrillMarksType() const
bool GetUseGerberX2format() const
void SetDXFPlotUnits(DXF_UNITS aUnit)
void SetColorSettings(COLOR_SETTINGS *aSettings)
bool IsSameAs(const PCB_PLOT_PARAMS &aPcbPlotParams) const
Compare current settings to aPcbPlotParams, including not saved parameters in brd file.
void SetIncludeGerberNetlistInfo(bool aUse)
bool GetPlotValue() const
void SetPlotInvisibleText(bool aFlag)
void SetCreateGerberJobFile(bool aCreate)
bool GetIncludeGerberNetlistInfo() const
void SetNegative(bool aFlag)
void SetPlotMode(OUTLINE_MODE aPlotMode)
void SetUseAuxOrigin(bool aAux)
bool m_PDFBackFPPropertyPopups
on front and/or back of board
bool GetPlotFPText() const
void SetTextMode(PLOT_TEXT_MODE aVal)
bool GetUseGerberProtelExtensions() const
void SetSvgPrecision(unsigned aPrecision)
bool GetPlotFrameRef() const
void SetFormat(PLOT_FORMAT aFormat)
bool GetPlotViaOnMaskLayer() const
bool GetDisableGerberMacros() const
void SetFineScaleAdjustY(double aVal)
OUTLINE_MODE GetPlotMode() const
void SetWidthAdjust(int aVal)
Base plotter engine class.
Definition: plotter.h:104
virtual void SetAuthor(const wxString &aAuthor)
Definition: plotter.h:155
virtual void SetTitle(const wxString &aTitle)
Definition: plotter.h:154
virtual bool EndPlot()=0
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:135
virtual void SetSubject(const wxString &aSubject)
Definition: plotter.h:156
The backing store for a PROJECT, in JSON format.
Definition: project_file.h:70
wxString m_PcbLastPath[LAST_PATH_SIZE]
MRU path storage.
Definition: project_file.h:157
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:166
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
Definition: project.cpp:320
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:71
virtual REPORTER & ReportTail(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the end of the list, for objects that support report ordering.
Definition: reporter.h:99
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)=0
Report a string with a given severity.
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
A bitmap button widget that behaves like a standard dialog button except with an icon.
void SetBitmap(const wxBitmapBundle &aBmp)
const wxString & GetTitle() const
Definition: title_block.h:63
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
virtual long long int GetValue()
Return the current value in Internal Units.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void SetFileName(const wxString &aReportFileName)
Handle actions specific to filling copper zones.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
Definition: common.cpp:334
bool EnsureFileDirectoryExists(wxFileName *aTargetFullFileName, const wxString &aBaseFilename, REPORTER *aReporter)
Make aTargetFullFileName absolute and create the path of this file if it doesn't yet exist.
Definition: common.cpp:362
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject)
Definition: common.cpp:58
wxString GetDefaultPlotExtension(PLOT_FORMAT aFormat)
Returns the default plot extension for a format.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:280
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:332
This file is part of the common library.
#define ID_STACKUP_ORDER
static bool setDouble(double *aResult, double aValue, double aMin, double aMax)
static bool setInt(int *aResult, int aValue, int aMin, int aMax)
PCB_LAYER_ID_CLIENT_DATA * getLayerClientData(const wxRearrangeList *aList, int aIdx)
Definition: dialog_plot.cpp:80
#define ID_SELECT_ALL_LAYERS
#define ID_DESELECT_COPPER_LAYERS
#define ID_DESELECT_ALL_LAYERS
#define ID_LAYER_FAB
#define ID_SELECT_COPPER_LAYERS
#define DLG_WINDOW_NAME
Definition: dialog_plot.h:30
#define _(s)
Classes used to generate a Gerber job file in JSON.
static const bool FILLED
Definition: gr_basic.cpp:30
static const std::string GerberJobFileExtension
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:879
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ F_CrtYd
Definition: layer_ids.h:118
@ F_Fab
Definition: layer_ids.h:121
@ B_CrtYd
Definition: layer_ids.h:117
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
Definition: eda_units.cpp:284
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: ui_common.cpp:74
@ SKETCH
Definition: outline_mode.h:26
const wxString GetGerberProtelExtension(int aLayer)
Definition: pcbplot.cpp:42
void BuildPlotFileName(wxFileName *aFilename, const wxString &aOutputDir, const wxString &aSuffix, const wxString &aExtension)
Complete a plot filename.
Definition: pcbplot.cpp:361
PLOTTER * StartPlotBoard(BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aLayer, const wxString &aFullFileName, const wxString &aSheetName, const wxString &aSheetPath)
Open a new plotfile using the options (and especially the format) specified in the options and prepar...
void PlotBoardLayers(BOARD *aBoard, PLOTTER *aPlotter, const LSEQ &aLayerSequence, const PCB_PLOT_PARAMS &aPlotOptions)
Plot a sequence of board layer IDs.
void PlotInteractiveLayer(BOARD *aBoard, PLOTTER *aPlotter, const PCB_PLOT_PARAMS &aPlotOpt)
Plot interactive items (hypertext links, properties, etc.).
#define PLOT_MIN_SCALE
Definition: pcbplot.h:55
#define PLOT_MAX_SCALE
Definition: pcbplot.h:56
see class PGM_BASE
DRILL_MARKS
Plots and prints can show holes in pads and vias 3 options are available:
PLOT_FORMAT
The set of supported output plot formats.
Definition: plotter.h:64
@ LAST_PATH_PLOT
Definition: project_file.h:57
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_EXCLUSION
@ RPT_SEVERITY_INFO
@ RPT_SEVERITY_ACTION
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:119
std::vector< FAB_LAYER_COLOR > dummy
constexpr double IUTomm(int iu) const
Definition: base_units.h:87
const double IU_PER_MM
Definition: base_units.h:77
const double IU_PER_MILS
Definition: base_units.h:78
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
Definition of file extensions used in Kicad.