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#include <wx/msgdlg.h>
52
53
57
58
62class PCB_LAYER_ID_CLIENT_DATA : public wxClientData
63{
64public:
67 { }
68
70 m_id( aId )
71 { }
72
73 void SetData( PCB_LAYER_ID aId ) { m_id = aId; }
74 PCB_LAYER_ID Layer() const { return m_id; }
75
76private:
78};
79
80
81PCB_LAYER_ID_CLIENT_DATA* getLayerClientData( const wxRearrangeList* aList, int aIdx )
82{
83 return static_cast<PCB_LAYER_ID_CLIENT_DATA*>( aList->GetClientObject( aIdx ) );
84}
85
86
88 DIALOG_PLOT_BASE( aParent ),
89 m_parent( aParent ),
90 m_defaultPenSize( aParent, m_hpglPenLabel, m_hpglPenCtrl, m_hpglPenUnits ),
91 m_trackWidthCorrection( aParent, m_widthAdjustLabel, m_widthAdjustCtrl, m_widthAdjustUnits )
92{
93 BOARD* board = m_parent->GetBoard();
94
95 SetName( DLG_WINDOW_NAME );
96 m_plotOpts = aParent->GetPlotSettings();
98
99 m_messagesPanel->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
100
101 int order = 0;
102 LSET plotOnAllLayersSelection = m_plotOpts.GetPlotOnAllLayersSelection();
103 wxArrayInt plotAllLayersOrder;
104 wxArrayString plotAllLayersChoicesStrings;
105 std::vector<PCB_LAYER_ID> layersIdChoiceList;
106 int textWidth = 0;
107
108 for( LSEQ seq = board->GetEnabledLayers().SeqStackupForPlotting(); seq; ++seq )
109 {
110 PCB_LAYER_ID id = *seq;
111 wxString layerName = board->GetLayerName( id );
112
113 // wxCOL_WIDTH_AUTOSIZE doesn't work on all platforms, so we calculate width here
114 textWidth = std::max( textWidth, KIUI::GetTextSize( layerName, m_layerCheckListBox ).x );
115
116 plotAllLayersChoicesStrings.Add( layerName );
117 layersIdChoiceList.push_back( id );
118
119 size_t size = plotOnAllLayersSelection.size();
120
121 if( ( static_cast<size_t>( id ) <= size ) && plotOnAllLayersSelection.test( id ) )
122 plotAllLayersOrder.push_back( order );
123 else
124 plotAllLayersOrder.push_back( ~order );
125
126 order += 1;
127 }
128
129 int checkColSize = 22;
130 int layerColSize = textWidth + 15;
131
132#ifdef __WXMAC__
133 // TODO: something in wxWidgets 3.1.x pads checkbox columns with extra space. (It used to
134 // also be that the width of the column would get set too wide (to 30), but that's patched in
135 // our local wxWidgets fork.)
136 checkColSize += 30;
137#endif
138
139 m_layerCheckListBox->SetMinClientSize( wxSize( checkColSize + layerColSize,
140 m_layerCheckListBox->GetMinClientSize().y ) );
141
142 wxStaticBox* allLayersLabel = new wxStaticBox( this, wxID_ANY, _( "Plot on All Layers" ) );
143 wxStaticBoxSizer* sbSizer = new wxStaticBoxSizer( allLayersLabel, wxVERTICAL );
144
145 m_plotAllLayersList = new wxRearrangeList( sbSizer->GetStaticBox(), wxID_ANY,
146 wxDefaultPosition, wxDefaultSize,
147 plotAllLayersOrder, plotAllLayersChoicesStrings, 0 );
148
149 m_plotAllLayersList->SetMinClientSize( wxSize( checkColSize + layerColSize,
150 m_plotAllLayersList->GetMinClientSize().y ) );
151
152 // Attach the LAYER_ID to each item in m_plotAllLayersList
153 // plotAllLayersChoicesStrings and layersIdChoiceList are in the same order,
154 // but m_plotAllLayersList has these strings in a different order
155 for( size_t idx = 0; idx < layersIdChoiceList.size(); idx++ )
156 {
157 wxString& txt = plotAllLayersChoicesStrings[idx];
158 int list_idx = m_plotAllLayersList->FindString( txt, true );
159
160 PCB_LAYER_ID layer_id = layersIdChoiceList[idx];
161 m_plotAllLayersList->SetClientObject( list_idx, new PCB_LAYER_ID_CLIENT_DATA( layer_id ) );
162 }
163
164 sbSizer->Add( m_plotAllLayersList, 1, wxALL | wxEXPAND | wxFIXED_MINSIZE, 3 );
165
166 wxBoxSizer* bButtonSizer;
167 bButtonSizer = new wxBoxSizer( wxHORIZONTAL );
168
169 m_bpMoveUp = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
170 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
171 m_bpMoveUp->SetToolTip( _( "Move current selection up" ) );
172 m_bpMoveUp->SetBitmap( KiBitmapBundle( BITMAPS::small_up ) );
173
174 bButtonSizer->Add( m_bpMoveUp, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3 );
175
176 m_bpMoveDown = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
177 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
178 m_bpMoveDown->SetToolTip( _( "Move current selection down" ) );
179 m_bpMoveDown->SetBitmap( KiBitmapBundle( BITMAPS::small_down ) );
180
181 bButtonSizer->Add( m_bpMoveDown, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
182
183 sbSizer->Add( bButtonSizer, 0, wxALL | wxEXPAND, 3 );
184
185 bmiddleSizer->Insert( 1, sbSizer, 1, wxALL | wxEXPAND, 5 );
186
187 init_Dialog();
188
189 SetupStandardButtons( { { wxID_OK, _( "Plot" ) },
190 { wxID_APPLY, _( "Generate Drill Files..." ) },
191 { wxID_CANCEL, _( "Close" ) } } );
192
193 GetSizer()->Fit( this );
194 GetSizer()->SetSizeHints( this );
195
196 m_bpMoveUp->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
197 m_bpMoveDown->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
198
199 m_layerCheckListBox->Connect( wxEVT_RIGHT_DOWN,
200 wxMouseEventHandler( DIALOG_PLOT::OnRightClickLayers ), nullptr,
201 this );
202
203 m_plotAllLayersList->Connect( wxEVT_RIGHT_DOWN,
204 wxMouseEventHandler( DIALOG_PLOT::OnRightClickAllLayers ), nullptr,
205 this );
206}
207
208
210{
211 s_lastAllLayersOrder.clear();
212
213 for( int ii = 0; ii < (int) m_plotAllLayersList->GetCount(); ++ii )
215
216 m_bpMoveDown->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
217 m_bpMoveUp->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
218}
219
220
222{
223 BOARD* board = m_parent->GetBoard();
224 wxFileName fileName;
225
226 PROJECT_FILE& projectFile = m_parent->Prj().GetProjectFile();
228
229 if( !projectFile.m_PcbLastPath[ LAST_PATH_PLOT ].IsEmpty() )
231
234
236
237 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
238
239 // m_PSWidthAdjust is stored in mm in user config
241
242 // The reasonable width correction value must be in a range of
243 // [-(MinTrackWidth-1), +(MinClearanceValue-1)] decimils.
246
247 switch( m_plotOpts.GetFormat() )
248 {
249 default:
250 case PLOT_FORMAT::GERBER: m_plotFormatOpt->SetSelection( 0 ); break;
251 case PLOT_FORMAT::POST: m_plotFormatOpt->SetSelection( 1 ); break;
252 case PLOT_FORMAT::SVG: m_plotFormatOpt->SetSelection( 2 ); break;
253 case PLOT_FORMAT::DXF: m_plotFormatOpt->SetSelection( 3 ); break;
254 case PLOT_FORMAT::HPGL: m_plotFormatOpt->SetSelection( 4 ); break;
255 case PLOT_FORMAT::PDF: m_plotFormatOpt->SetSelection( 5 ); break;
256 }
257
258 // Set units and value for HPGL pen size (this param is in mils).
260
261 // Test for a reasonable scale value. Set to 1 if problem
264 {
266 }
267
269 EDA_UNITS::UNSCALED,
270 m_XScaleAdjust ) );
271
273 EDA_UNITS::UNSCALED,
274 m_YScaleAdjust ) );
275
276 // Test for a reasonable PS width correction value. Set to 0 if problem.
277 if( m_PSWidthAdjust < m_widthAdjustMinValue || m_PSWidthAdjust > m_widthAdjustMaxValue )
278 m_PSWidthAdjust = 0.;
279
281
284
285 // Could devote a PlotOrder() function in place of UIOrder().
287
288 // Populate the check list box by all enabled layers names.
289 for( LSEQ seq = m_layerList; seq; ++seq )
290 {
291 PCB_LAYER_ID layer = *seq;
292
293 int checkIndex = m_layerCheckListBox->Append( board->GetLayerName( layer ) );
294
295 if( m_plotOpts.GetLayerSelection()[layer] )
296 m_layerCheckListBox->Check( checkIndex );
297 }
298
300
301 // Option for disabling Gerber Aperture Macro (for broken Gerber readers)
303
304 // Option for using proper Gerber extensions. Note also Protel extensions are
305 // a broken feature. However, for now, we need to handle it.
307
308 // Option for including Gerber attributes, from Gerber X2 format, in the output
309 // In X1 format, they will be added as comments
311
312 // Option for including Gerber netlist info (from Gerber X2 format) in the output
314
315 // Option to generate a Gerber job file
317
318 // Gerber precision for coordinates
319 m_coordFormatCtrl->SetSelection( m_plotOpts.GetGerberPrecision() == 5 ? 0 : 1 );
320
321 // SVG precision and units for coordinates
323
324 // Option to exclude pads from silkscreen layers
328
329 // Option to tent vias
331
332 // Option to use aux origin
334
335 // Option to plot page references:
337
338 // Options to plot texts on footprints
343
344 // Options to plot pads and vias holes
345 m_drillShapeOpt->SetSelection( (int)m_plotOpts.GetDrillMarksType() );
346
347 // Scale option
348 m_scaleOpt->SetSelection( m_plotOpts.GetScaleSelection() );
349
350 // Plot mode
352
353 // DXF outline mode
355
356 // DXF text mode
357 m_DXF_plotTextStrokeFontOpt->SetValue( m_plotOpts.GetTextMode() == PLOT_TEXT_MODE::DEFAULT );
358
359 // DXF units selection
360 m_DXF_plotUnits->SetSelection( m_plotOpts.GetDXFPlotUnits() == DXF_UNITS::INCHES ? 0 : 1);
361
362 // Plot mirror option
363 m_plotMirrorOpt->SetValue( m_plotOpts.GetMirror() );
364
365 // Plot vias on mask layer (not tented) or not (tented)
367
368 // Black and white plotting
369 m_SVGColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
370 m_PDFColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
374
375 // Initialize a few other parameters, which can also be modified
376 // from the drill dialog
377 reInitDialog();
378
379 // Update options values:
380 wxCommandEvent cmd_event;
381 SetPlotFormat( cmd_event );
382 OnSetScaleOpt( cmd_event );
383}
384
385
387{
388 // after calling the Drill or DRC dialogs some parameters can be modified....
389
390 // Output directory
392
393 // Origin of coordinates:
395
396 int knownViolations = 0;
397 int exclusions = 0;
398
399 for( PCB_MARKER* marker : m_parent->GetBoard()->Markers() )
400 {
401 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
402 exclusions++;
403 else
404 knownViolations++;
405 }
406
407 if( knownViolations || exclusions )
408 {
409 m_DRCExclusionsWarning->SetLabel( wxString::Format( m_DRCWarningTemplate, knownViolations,
410 exclusions ) );
412 }
413 else
414 {
416 }
417
418 BOARD* board = m_parent->GetBoard();
419 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
420
421 if( getPlotFormat() == PLOT_FORMAT::GERBER &&
422 ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
423 {
425 }
426 else
427 {
429 }
430}
431
432
434{
435 auto findLayer =
436 [&]( wxRearrangeList* aList, PCB_LAYER_ID aLayer ) -> int
437 {
438 for( int ii = 0; ii < (int) aList->GetCount(); ++ii )
439 {
440 if( getLayerClientData( aList, ii )->Layer() == aLayer )
441 return ii;
442 }
443
444 return -1;
445 };
446
447 int idx = 0;
448
449 for( LSEQ seq = aSeq; seq; ++seq, ++idx )
450 {
451 int currentPos = findLayer( m_plotAllLayersList, *seq );
452
453 while( currentPos > idx )
454 {
455 m_plotAllLayersList->Select( currentPos );
456 m_plotAllLayersList->MoveCurrentUp();
457 currentPos--;
458 }
459 }
460}
461
462
463#define ID_LAYER_FAB 13001
464#define ID_SELECT_COPPER_LAYERS 13002
465#define ID_DESELECT_COPPER_LAYERS 13003
466#define ID_SELECT_ALL_LAYERS 13004
467#define ID_DESELECT_ALL_LAYERS 13005
468#define ID_STACKUP_ORDER 13006
469
470
471// A helper function to show a popup menu, when the dialog is right clicked.
472void DIALOG_PLOT::OnRightClickLayers( wxMouseEvent& event )
473{
474 // Build a list of layers for usual fabrication: copper layers + tech layers without courtyard
475 LSET fab_layer_set = ( LSET::AllCuMask() | LSET::AllTechMask() ) & ~LSET( 2, B_CrtYd, F_CrtYd );
476
477 wxMenu menu;
478 menu.Append( new wxMenuItem( &menu, ID_LAYER_FAB, _( "Select Fab Layers" ) ) );
479
480 menu.AppendSeparator();
481 menu.Append( new wxMenuItem( &menu, ID_SELECT_COPPER_LAYERS, _( "Select All Copper Layers" ) ) );
482 menu.Append( new wxMenuItem( &menu, ID_DESELECT_COPPER_LAYERS, _( "Deselect All Copper Layers" ) ) );
483
484 menu.AppendSeparator();
485 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
486 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
487
488 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
489 [&]( wxCommandEvent& aCmd )
490 {
491 switch( aCmd.GetId() )
492 {
493 case ID_LAYER_FAB: // Select layers usually needed to build a board
494 {
495 for( unsigned i = 0; i < m_layerList.size(); i++ )
496 {
497 LSET layermask( m_layerList[ i ] );
498
499 if( ( layermask & fab_layer_set ).any() )
500 m_layerCheckListBox->Check( i, true );
501 else
502 m_layerCheckListBox->Check( i, false );
503 }
504
505 break;
506 }
507
509 for( unsigned i = 0; i < m_layerList.size(); i++ )
510 {
511 if( IsCopperLayer( m_layerList[i] ) )
512 m_layerCheckListBox->Check( i, true );
513 }
514
515 break;
516
518 for( unsigned i = 0; i < m_layerList.size(); i++ )
519 {
520 if( IsCopperLayer( m_layerList[i] ) )
521 m_layerCheckListBox->Check( i, false );
522 }
523
524 break;
525
527 for( unsigned i = 0; i < m_layerList.size(); i++ )
528 m_layerCheckListBox->Check( i, true );
529
530 break;
531
533 for( unsigned i = 0; i < m_layerList.size(); i++ )
534 m_layerCheckListBox->Check( i, false );
535
536 break;
537
538 default:
539 aCmd.Skip();
540 }
541 } );
542
543 PopupMenu( &menu );
544}
545
546
547void DIALOG_PLOT::OnRightClickAllLayers( wxMouseEvent& event )
548{
549 wxMenu menu;
550 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
551 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
552
553 menu.AppendSeparator();
554 menu.Append( new wxMenuItem( &menu, ID_STACKUP_ORDER, _( "Order as Board Stackup" ) ) );
555
556 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
557 [&]( wxCommandEvent& aCmd )
558 {
559 switch( aCmd.GetId() )
560 {
561 case ID_SELECT_ALL_LAYERS:
562 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
563 m_plotAllLayersList->Check( i, true );
564
565 break;
566
567 case ID_DESELECT_ALL_LAYERS:
568 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
569 m_plotAllLayersList->Check( i, false );
570
571 break;
572
573 case ID_STACKUP_ORDER:
574 {
575 LSEQ stackup = m_parent->GetBoard()->GetEnabledLayers().SeqStackupForPlotting();
576 arrangeAllLayersList( stackup );
577 m_plotAllLayersList->Select( -1 );
578 break;
579 }
580
581 default:
582 aCmd.Skip();
583 }
584 } );
585
586 PopupMenu( &menu );
587}
588
589
590void DIALOG_PLOT::CreateDrillFile( wxCommandEvent& event )
591{
592 // Be sure drill file use the same settings (axis option, plot directory) as plot files:
594
595 DIALOG_GENDRILL dlg( m_parent, this );
596 dlg.ShowModal();
597
598 // a few plot settings can be modified: take them in account
600 reInitDialog();
601}
602
603
604void DIALOG_PLOT::OnChangeDXFPlotMode( wxCommandEvent& event )
605{
606 // m_DXF_plotTextStrokeFontOpt is disabled if m_DXF_plotModeOpt is checked (plot in DXF
607 // polygon mode)
608 m_DXF_plotTextStrokeFontOpt->Enable( !m_DXF_plotModeOpt->GetValue() );
609
610 // if m_DXF_plotTextStrokeFontOpt option is disabled (plot DXF in polygon mode), force
611 // m_DXF_plotTextStrokeFontOpt to true to use Pcbnew stroke font
612 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() )
613 m_DXF_plotTextStrokeFontOpt->SetValue( true );
614}
615
616
617void DIALOG_PLOT::OnSetScaleOpt( wxCommandEvent& event )
618{
619 /* Disable sheet reference for scale != 1:1 */
620 bool scale1 = ( m_scaleOpt->GetSelection() == 1 );
621
622 m_plotSheetRef->Enable( scale1 );
623
624 if( !scale1 )
625 m_plotSheetRef->SetValue( false );
626}
627
628
630{
631 // Build the absolute path of current output directory to preselect it in the file browser.
632 std::function<bool( wxString* )> textResolver =
633 [&]( wxString* token ) -> bool
634 {
635 return m_parent->GetBoard()->ResolveTextVar( token, 0 );
636 };
637
638 wxString path = m_outputDirectoryName->GetValue();
639 path = ExpandTextVars( path, &textResolver );
641 path = Prj().AbsolutePath( path );
642
643 wxDirDialog dirDialog( this, _( "Select Output Directory" ), path );
644
645 if( dirDialog.ShowModal() == wxID_CANCEL )
646 return;
647
648 wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() );
649
650 wxFileName fn( Prj().AbsolutePath( m_parent->GetBoard()->GetFileName() ) );
651 wxString defaultPath = fn.GetPathWithSep();
652 wxString msg;
653 wxFileName relPathTest; // Used to test if we can make the path relative
654
655 relPathTest.Assign( dirDialog.GetPath() );
656
657 // Test if making the path relative is possible before asking the user if they want to do it
658 if( relPathTest.MakeRelativeTo( defaultPath ) )
659 {
660 msg.Printf( _( "Do you want to use a path relative to\n'%s'?" ), defaultPath );
661
662 wxMessageDialog dialog( this, msg, _( "Plot Output Directory" ),
663 wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT );
664
665 if( dialog.ShowModal() == wxID_YES )
666 dirName.MakeRelativeTo( defaultPath );
667 }
668
669 m_outputDirectoryName->SetValue( dirName.GetFullPath() );
670}
671
672
674{
675 // plot format id's are ordered like displayed in m_plotFormatOpt
676 static const PLOT_FORMAT plotFmt[] = {
677 PLOT_FORMAT::GERBER,
678 PLOT_FORMAT::POST,
679 PLOT_FORMAT::SVG,
680 PLOT_FORMAT::DXF,
681 PLOT_FORMAT::HPGL,
682 PLOT_FORMAT::PDF };
683
684 return plotFmt[m_plotFormatOpt->GetSelection()];
685}
686
687
688void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event )
689{
690 // this option exist only in DXF format:
691 m_DXF_plotModeOpt->Enable( getPlotFormat() == PLOT_FORMAT::DXF );
692
693 // The alert message about non 0 solder mask min width and margin is shown
694 // only in gerber format and if min mask width or mask margin is not 0
695 BOARD* board = m_parent->GetBoard();
696 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
697
698 if( getPlotFormat() == PLOT_FORMAT::GERBER
699 && ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
700 {
702 }
703 else
704 {
706 }
707
708 switch( getPlotFormat() )
709 {
710 case PLOT_FORMAT::SVG:
711 case PLOT_FORMAT::PDF:
712 m_drillShapeOpt->Enable( true );
713 m_plotModeOpt->Enable( false );
715 m_plotMirrorOpt->Enable( true );
716 m_useAuxOriginCheckBox->Enable( true );
717 m_defaultPenSize.Enable( false );
718 m_scaleOpt->Enable( false );
719 m_scaleOpt->SetSelection( 1 );
720 m_fineAdjustXCtrl->Enable( false );
721 m_fineAdjustYCtrl->Enable( false );
723 m_plotPSNegativeOpt->Enable( true );
724 m_forcePSA4OutputOpt->Enable( false );
725 m_forcePSA4OutputOpt->SetValue( false );
726
727 if( getPlotFormat() == PLOT_FORMAT::SVG )
728 {
731 }
732 else
733 {
736 }
737
742 break;
743
744 case PLOT_FORMAT::POST:
745 m_drillShapeOpt->Enable( true );
746 m_plotModeOpt->Enable( true );
747 m_plotMirrorOpt->Enable( true );
748 m_useAuxOriginCheckBox->Enable( false );
749 m_useAuxOriginCheckBox->SetValue( false );
750 m_defaultPenSize.Enable( false );
751 m_scaleOpt->Enable( true );
752 m_fineAdjustXCtrl->Enable( true );
753 m_fineAdjustYCtrl->Enable( true );
755 m_plotPSNegativeOpt->Enable( true );
756 m_forcePSA4OutputOpt->Enable( true );
757
764 break;
765
766 case PLOT_FORMAT::GERBER:
767 m_drillShapeOpt->Enable( false );
768 m_drillShapeOpt->SetSelection( 0 );
769 m_plotModeOpt->Enable( false );
771 m_plotMirrorOpt->Enable( false );
772 m_plotMirrorOpt->SetValue( false );
773 m_useAuxOriginCheckBox->Enable( true );
774 m_defaultPenSize.Enable( false );
775 m_scaleOpt->Enable( false );
776 m_scaleOpt->SetSelection( 1 );
777 m_fineAdjustXCtrl->Enable( false );
778 m_fineAdjustYCtrl->Enable( false );
780 m_plotPSNegativeOpt->Enable( false );
781 m_plotPSNegativeOpt->SetValue( false );
782 m_forcePSA4OutputOpt->Enable( false );
783 m_forcePSA4OutputOpt->SetValue( false );
784
791 break;
792
793 case PLOT_FORMAT::HPGL:
794 m_drillShapeOpt->Enable( true );
795 m_plotModeOpt->Enable( true );
796 m_plotMirrorOpt->Enable( true );
797 m_useAuxOriginCheckBox->Enable( false );
798 m_useAuxOriginCheckBox->SetValue( false );
799 m_defaultPenSize.Enable( true );
800 m_scaleOpt->Enable( true );
801 m_fineAdjustXCtrl->Enable( false );
802 m_fineAdjustYCtrl->Enable( false );
804 m_plotPSNegativeOpt->SetValue( false );
805 m_plotPSNegativeOpt->Enable( false );
806 m_forcePSA4OutputOpt->Enable( true );
807
814 break;
815
816 case PLOT_FORMAT::DXF:
817 m_drillShapeOpt->Enable( true );
818 m_plotModeOpt->Enable( false );
820 m_plotMirrorOpt->Enable( false );
821 m_plotMirrorOpt->SetValue( false );
822 m_useAuxOriginCheckBox->Enable( true );
823 m_defaultPenSize.Enable( false );
824 m_scaleOpt->Enable( false );
825 m_scaleOpt->SetSelection( 1 );
826 m_fineAdjustXCtrl->Enable( false );
827 m_fineAdjustYCtrl->Enable( false );
829 m_plotPSNegativeOpt->Enable( false );
830 m_plotPSNegativeOpt->SetValue( false );
831 m_forcePSA4OutputOpt->Enable( false );
832 m_forcePSA4OutputOpt->SetValue( false );
833
840
841 OnChangeDXFPlotMode( event );
842 break;
843
844 case PLOT_FORMAT::UNDEFINED:
845 break;
846 }
847
848 /* Update the interlock between scale and frame reference
849 * (scaling would mess up the frame border...) */
850 OnSetScaleOpt( event );
851
852 Layout();
853 m_MainSizer->SetSizeHints( this );
854}
855
856
857// A helper function to "clip" aValue between aMin and aMax and write result in * aResult
858// return false if clipped, true if aValue is just copied into * aResult
859static bool setDouble( double* aResult, double aValue, double aMin, double aMax )
860{
861 if( aValue < aMin )
862 {
863 *aResult = aMin;
864 return false;
865 }
866 else if( aValue > aMax )
867 {
868 *aResult = aMax;
869 return false;
870 }
871
872 *aResult = aValue;
873 return true;
874}
875
876
877static bool setInt( int* aResult, int aValue, int aMin, int aMax )
878{
879 if( aValue < aMin )
880 {
881 *aResult = aMin;
882 return false;
883 }
884 else if( aValue > aMax )
885 {
886 *aResult = aMax;
887 return false;
888 }
889
890 *aResult = aValue;
891 return true;
892}
893
894
896{
897 REPORTER& reporter = m_messagesPanel->Reporter();
898 PCB_PLOT_PARAMS tempOptions;
899
900 tempOptions.SetSubtractMaskFromSilk( m_subtractMaskFromSilk->GetValue() );
901 tempOptions.SetPlotFrameRef( m_plotSheetRef->GetValue() );
902 tempOptions.SetSketchPadsOnFabLayers( m_sketchPadsOnFabLayers->GetValue() );
903 tempOptions.SetPlotPadNumbers( m_plotPadNumbers->GetValue() );
904 tempOptions.SetUseAuxOrigin( m_useAuxOriginCheckBox->GetValue() );
905 tempOptions.SetPlotValue( m_plotFootprintValues->GetValue() );
906 tempOptions.SetPlotReference( m_plotFootprintRefs->GetValue() );
907 tempOptions.SetPlotFPText( m_plotFootprintText->GetValue() );
908 tempOptions.SetPlotInvisibleText( m_plotInvisibleText->GetValue() );
909 tempOptions.SetScaleSelection( m_scaleOpt->GetSelection() );
910
911 int sel = m_drillShapeOpt->GetSelection();
912 tempOptions.SetDrillMarksType( static_cast<DRILL_MARKS>( sel ) );
913
914 tempOptions.SetMirror( m_plotMirrorOpt->GetValue() );
915 tempOptions.SetPlotMode( m_plotModeOpt->GetSelection() == 1 ? SKETCH : FILLED );
916 tempOptions.SetDXFPlotPolygonMode( m_DXF_plotModeOpt->GetValue() );
917
918 sel = m_DXF_plotUnits->GetSelection();
919 tempOptions.SetDXFPlotUnits( sel == 0 ? DXF_UNITS::INCHES : DXF_UNITS::MILLIMETERS );
920
921 tempOptions.SetPlotViaOnMaskLayer( !m_tentVias->GetValue() );
922
923 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() ) // Currently, only DXF supports this option
924 tempOptions.SetTextMode( PLOT_TEXT_MODE::DEFAULT );
925 else
926 tempOptions.SetTextMode( m_DXF_plotTextStrokeFontOpt->GetValue() ? PLOT_TEXT_MODE::DEFAULT :
927 PLOT_TEXT_MODE::NATIVE );
928
929 if( getPlotFormat() == PLOT_FORMAT::SVG )
930 {
931 tempOptions.SetBlackAndWhite( !!m_SVGColorChoice->GetSelection() );
932 }
933 else if( getPlotFormat() == PLOT_FORMAT::PDF )
934 {
935 tempOptions.SetBlackAndWhite( !!m_PDFColorChoice->GetSelection() );
936 tempOptions.m_PDFFrontFPPropertyPopups = m_frontFPPropertyPopups->GetValue();
937 tempOptions.m_PDFBackFPPropertyPopups = m_backFPPropertyPopups->GetValue();
938 tempOptions.m_PDFMetadata = m_pdfMetadata->GetValue();
939 }
940 else
941 {
942 tempOptions.SetBlackAndWhite( true );
943 }
944
945 // Update settings from text fields. Rewrite values back to the fields,
946 // since the values may have been constrained by the setters.
947 wxString msg;
948
949 // read HPLG pen size (this param is stored in mils)
950 // However, due to issues when converting this value from or to mm
951 // that can slightly change the value, update this param only if it
952 // is in use
953 if( getPlotFormat() == PLOT_FORMAT::HPGL )
954 {
956 {
958 msg.Printf( _( "HPGL pen size constrained." ) );
959 reporter.Report( msg, RPT_SEVERITY_INFO );
960 }
961 }
962 else // keep the last value (initial value if no HPGL plot made)
963 {
965 }
966
967 // X scale
968 double tmpDouble;
969 msg = m_fineAdjustXCtrl->GetValue();
970 msg.ToDouble( &tmpDouble );
971
973 {
974 msg.Printf( wxT( "%f" ), m_XScaleAdjust );
975 m_fineAdjustXCtrl->SetValue( msg );
976 msg.Printf( _( "X scale constrained." ) );
977 reporter.Report( msg, RPT_SEVERITY_INFO );
978 }
979
980 // Y scale
981 msg = m_fineAdjustYCtrl->GetValue();
982 msg.ToDouble( &tmpDouble );
983
985 {
986 msg.Printf( wxT( "%f" ), m_YScaleAdjust );
987 m_fineAdjustYCtrl->SetValue( msg );
988 msg.Printf( _( "Y scale constrained." ) );
989 reporter.Report( msg, RPT_SEVERITY_INFO );
990 }
991
992 auto cfg = m_parent->GetPcbNewSettings();
993
995 cfg->m_Plot.fine_scale_y = m_YScaleAdjust;
996
997 cfg->m_Plot.check_zones_before_plotting = m_zoneFillCheck->GetValue();
998
999 // PS Width correction
1002 {
1004 msg.Printf( _( "Width correction constrained. The width correction value must be in the"
1005 " range of [%s; %s] for the current design rules." ),
1008 reporter.Report( msg, RPT_SEVERITY_WARNING );
1009 }
1010
1011 // Store m_PSWidthAdjust in mm in user config
1012 cfg->m_Plot.ps_fine_width_adjust = pcbIUScale.IUTomm( m_PSWidthAdjust );
1013
1014 tempOptions.SetFormat( getPlotFormat() );
1015
1016 tempOptions.SetDisableGerberMacros( m_disableApertMacros->GetValue() );
1017 tempOptions.SetUseGerberProtelExtensions( m_useGerberExtensions->GetValue() );
1018 tempOptions.SetUseGerberX2format( m_useGerberX2Format->GetValue() );
1019 tempOptions.SetIncludeGerberNetlistInfo( m_useGerberNetAttributes->GetValue() );
1020 tempOptions.SetCreateGerberJobFile( m_generateGerberJobFile->GetValue() );
1021
1022 tempOptions.SetGerberPrecision( m_coordFormatCtrl->GetSelection() == 0 ? 5 : 6 );
1023 tempOptions.SetSvgPrecision( m_svgPrecsision->GetValue() );
1024
1025 LSET selectedLayers;
1026
1027 for( unsigned i = 0; i < m_layerList.size(); i++ )
1028 {
1029 if( m_layerCheckListBox->IsChecked( i ) )
1030 selectedLayers.set( m_layerList[i] );
1031 }
1032
1033 // Get a list of copper layers that aren't being used by inverting enabled layers.
1034 LSET disabledCopperLayers = LSET::AllCuMask() & ~m_parent->GetBoard()->GetEnabledLayers();
1035
1036 LSET plotOnAllLayers;
1037
1038 // Add selected layers from plot on all layers list in order set by user.
1039 wxArrayInt plotOnAllLayersSelections;
1040
1041 m_plotAllLayersList->GetCheckedItems( plotOnAllLayersSelections );
1042
1043 size_t count = plotOnAllLayersSelections.GetCount();
1044
1045 for( size_t i = 0; i < count; i++ )
1046 {
1047 int index = plotOnAllLayersSelections.Item( i );
1048 wxClientData* tmp = m_plotAllLayersList->GetClientObject( index );
1049 PCB_LAYER_ID_CLIENT_DATA* layerId = dynamic_cast<PCB_LAYER_ID_CLIENT_DATA*>( tmp );
1050
1051 wxCHECK2( layerId, continue );
1052
1053 plotOnAllLayers.set( layerId->Layer() );
1054 }
1055
1056 tempOptions.SetPlotOnAllLayersSelection( plotOnAllLayers );
1057
1058 // Enable all of the disabled copper layers.
1059 // If someone enables more copper layers they will be selected by default.
1060 selectedLayers = selectedLayers | disabledCopperLayers;
1061 tempOptions.SetLayerSelection( selectedLayers );
1062
1063 tempOptions.SetNegative( m_plotPSNegativeOpt->GetValue() );
1064 tempOptions.SetA4Output( m_forcePSA4OutputOpt->GetValue() );
1065
1066 // Set output directory and replace backslashes with forward ones
1067 wxString dirStr;
1068 dirStr = m_outputDirectoryName->GetValue();
1069 dirStr.Replace( wxT( "\\" ), wxT( "/" ) );
1070 tempOptions.SetOutputDirectory( dirStr );
1072
1073 if( !m_plotOpts.IsSameAs( tempOptions ) )
1074 {
1075 m_parent->SetPlotSettings( tempOptions );
1076 m_parent->OnModify();
1077 m_plotOpts = tempOptions;
1078 }
1079}
1080
1081
1082void DIALOG_PLOT::OnGerberX2Checked( wxCommandEvent& event )
1083{
1084 // Currently: do nothing
1085}
1086
1087
1088void DIALOG_PLOT::Plot( wxCommandEvent& event )
1089{
1090 BOARD* board = m_parent->GetBoard();
1091
1093
1096
1098
1100
1101 // If no layer selected, we have nothing plotted.
1102 // Prompt user if it happens because he could think there is a bug in Pcbnew.
1103 if( !m_plotOpts.GetLayerSelection().any() )
1104 {
1105 DisplayError( this, _( "No layer selected, Nothing to plot" ) );
1106 return;
1107 }
1108
1109 // Create output directory if it does not exist (also transform it in absolute form).
1110 // Bail if it fails.
1111
1112 std::function<bool( wxString* )> textResolver =
1113 [&]( wxString* token ) -> bool
1114 {
1115 // Handles board->GetTitleBlock() *and* board->GetProject()
1116 return m_parent->GetBoard()->ResolveTextVar( token, 0 );
1117 };
1118
1119 wxString path = m_plotOpts.GetOutputDirectory();
1120 path = ExpandTextVars( path, &textResolver );
1122
1123 wxFileName outputDir = wxFileName::DirName( path );
1124 wxString boardFilename = m_parent->GetBoard()->GetFileName();
1125 REPORTER& reporter = m_messagesPanel->Reporter();
1126
1127 if( !EnsureFileDirectoryExists( &outputDir, boardFilename, &reporter ) )
1128 {
1129 wxString msg;
1130 msg.Printf( _( "Could not write plot files to folder '%s'." ), outputDir.GetPath() );
1131 DisplayError( this, msg );
1132 return;
1133 }
1134
1135 if( m_zoneFillCheck->GetValue() )
1136 m_parent->GetToolManager()->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( this );
1137
1138 m_plotOpts.SetAutoScale( false );
1139
1140 switch( m_plotOpts.GetScaleSelection() )
1141 {
1142 default: m_plotOpts.SetScale( 1 ); break;
1143 case 0: m_plotOpts.SetAutoScale( true ); break;
1144 case 2: m_plotOpts.SetScale( 1.5 ); break;
1145 case 3: m_plotOpts.SetScale( 2 ); break;
1146 case 4: m_plotOpts.SetScale( 3 ); break;
1147 }
1148
1149 /* If the scale factor edit controls are disabled or the scale value
1150 * is 0, don't adjust the base scale factor. This fixes a bug when
1151 * the default scale adjust is initialized to 0 and saved in program
1152 * settings resulting in a divide by zero fault.
1153 */
1154 if( getPlotFormat() == PLOT_FORMAT::POST )
1155 {
1156 if( m_XScaleAdjust != 0.0 )
1158
1159 if( m_YScaleAdjust != 0.0 )
1161
1163 }
1164
1165 wxString file_ext( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
1166
1167 // Test for a reasonable scale value
1168 // XXX could this actually happen? isn't it constrained in the apply function?
1170 DisplayInfoMessage( this, _( "Warning: Scale option set to a very small value" ) );
1171
1173 DisplayInfoMessage( this, _( "Warning: Scale option set to a very large value" ) );
1174
1175 GERBER_JOBFILE_WRITER jobfile_writer( board, &reporter );
1176
1177 // Save the current plot options in the board
1179
1180 wxBusyCursor dummy;
1181
1182 for( LSEQ seq = m_plotOpts.GetLayerSelection().UIOrder(); seq; ++seq )
1183 {
1184 LSEQ plotSequence;
1185
1186 // Base layer always gets plotted first.
1187 plotSequence.push_back( *seq );
1188
1189 // Add selected layers from plot on all layers list in order set by user.
1190 wxArrayInt plotOnAllLayers;
1191
1192 if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
1193 {
1194 size_t count = plotOnAllLayers.GetCount();
1195
1196 for( size_t i = 0; i < count; i++ )
1197 {
1198 int index = plotOnAllLayers.Item( i );
1200
1201 // Don't plot the same layer more than once;
1202 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
1203 continue;
1204
1205 plotSequence.push_back( layer );
1206 }
1207 }
1208
1209 PCB_LAYER_ID layer = *seq;
1210 wxString layerName = board->GetLayerName( layer );
1211 //@todo allow controlling the sheet name and path that will be displayed in the title block
1212 // Leave blank for now
1213 wxString sheetName;
1214 wxString sheetPath;
1215
1216 // All copper layers that are disabled are actually selected
1217 // This is due to wonkyness in automatically selecting copper layers
1218 // for plotting when adding more than two layers to a board.
1219 // If plot options become accessible to the layers setup dialog
1220 // please move this functionality there!
1221 // This skips a copper layer if it is actually disabled on the board.
1222 if( ( LSET::AllCuMask() & ~board->GetEnabledLayers() )[layer] )
1223 continue;
1224
1225 // Pick the basename from the board file
1226 wxFileName fn( boardFilename );
1227
1228 // Use Gerber Extensions based on layer number
1229 // (See http://en.wikipedia.org/wiki/Gerber_File)
1230 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && m_useGerberExtensions->GetValue() )
1231 file_ext = GetGerberProtelExtension( layer );
1232
1233 BuildPlotFileName( &fn, outputDir.GetPath(), layerName, file_ext );
1234 wxString fullname = fn.GetFullName();
1235 jobfile_writer.AddGbrFile( layer, fullname );
1236
1237 LOCALE_IO toggle;
1238
1239 PLOTTER* plotter = StartPlotBoard( board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
1240 sheetName, sheetPath );
1241
1242 // Print diags in messages box:
1243 wxString msg;
1244
1245 if( plotter )
1246 {
1247 plotter->SetTitle( ExpandTextVars( board->GetTitleBlock().GetTitle(), &textResolver ) );
1248
1250 {
1251 msg = wxS( "AUTHOR" );
1252
1253 if( board->ResolveTextVar( &msg, 0 ) )
1254 plotter->SetAuthor( msg );
1255
1256 msg = wxS( "SUBJECT" );
1257
1258 if( board->ResolveTextVar( &msg, 0 ) )
1259 plotter->SetSubject( msg );
1260 }
1261
1262 PlotBoardLayers( board, plotter, plotSequence, m_plotOpts );
1263 PlotInteractiveLayer( board, plotter, m_plotOpts );
1264 plotter->EndPlot();
1265 delete plotter->RenderSettings();
1266 delete plotter;
1267
1268 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
1269 reporter.Report( msg, RPT_SEVERITY_ACTION );
1270 }
1271 else
1272 {
1273 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
1274 reporter.Report( msg, RPT_SEVERITY_ERROR );
1275 }
1276
1277 wxSafeYield(); // displays report message.
1278 }
1279
1280 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && m_plotOpts.GetCreateGerberJobFile() )
1281 {
1282 // Pick the basename from the board file
1283 wxFileName fn( boardFilename );
1284
1285 // Build gerber job file from basename
1286 BuildPlotFileName( &fn, outputDir.GetPath(), wxT( "job" ),
1288 jobfile_writer.CreateJobFile( fn.GetFullPath() );
1289 }
1290
1291 reporter.ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
1292}
1293
1294
1295void DIALOG_PLOT::onRunDRC( wxCommandEvent& event )
1296{
1297 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1298
1299 if( parent )
1300 {
1301 DRC_TOOL* drcTool = parent->GetToolManager()->GetTool<DRC_TOOL>();
1302
1303 // First close an existing dialog if open
1304 // (low probability, but can happen)
1305 drcTool->DestroyDRCDialog();
1306
1307 // Open a new drc dialog, with the right parent frame, and in Modal Mode
1308 drcTool->ShowDRCDialog( this );
1309
1310 // Update DRC warnings on return to this dialog
1311 reInitDialog();
1312 }
1313}
1314
1315
1316void DIALOG_PLOT::onBoardSetup( wxHyperlinkEvent& aEvent )
1317{
1318 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1319
1320 if( parent )
1321 {
1322 parent->ShowBoardSetupDialog( _( "Solder Mask/Paste" ) );
1323
1324 // Update warnings on return to this dialog
1325 reInitDialog();
1326 }
1327}
1328
1329
1330void DIALOG_PLOT::onPlotAllListMoveUp( wxCommandEvent& aEvent )
1331{
1332 if( m_plotAllLayersList->CanMoveCurrentUp() )
1333 m_plotAllLayersList->MoveCurrentUp();
1334}
1335
1336
1337void DIALOG_PLOT::onPlotAllListMoveDown( wxCommandEvent& aEvent )
1338{
1339 if( m_plotAllLayersList->CanMoveCurrentDown() )
1340 m_plotAllLayersList->MoveCurrentDown();
1341}
1342
1343
1344void DIALOG_PLOT::onPlotFPRefs( wxCommandEvent& aEvent )
1345{
1346 if( aEvent.IsChecked() )
1347 m_plotFootprintText->SetValue( true );
1348}
1349
1350
1351void DIALOG_PLOT::onPlotFPValues( wxCommandEvent& aEvent )
1352{
1353 if( aEvent.IsChecked() )
1354 m_plotFootprintText->SetValue( true );
1355}
1356
1357
1358void DIALOG_PLOT::onPlotFPText( wxCommandEvent& aEvent )
1359{
1360 if( !aEvent.IsChecked() )
1361 {
1362 m_plotFootprintRefs->SetValue( false );
1363 m_plotFootprintValues->SetValue( false );
1364 }
1365}
1366
1367void DIALOG_PLOT::onSketchPads( wxCommandEvent& aEvent )
1368{
1369 m_plotPadNumbers->Enable( aEvent.IsChecked() );
1370}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
Definition: bitmap.cpp:110
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:175
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:282
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:677
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:421
const MARKERS & Markers() const
Definition: board.h:331
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:677
const wxString & GetFileName() const
Definition: board.h:319
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:564
PROJECT * GetProject() const
Definition: board.h:476
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:794
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
wxCheckBox * m_plotPadNumbers
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:109
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:112
PCB_PLOT_PARAMS m_plotOpts
Definition: dialog_plot.h:100
STD_BITMAP_BUTTON * m_bpMoveUp
Definition: dialog_plot.h:104
void onPlotAllListMoveUp(wxCommandEvent &aEvent)
void OnChangeDXFPlotMode(wxCommandEvent &event) override
int m_widthAdjustMinValue
Definition: dialog_plot.h:92
UNIT_BINDER m_trackWidthCorrection
Definition: dialog_plot.h:96
void onBoardSetup(wxHyperlinkEvent &aEvent) override
void OnRightClickAllLayers(wxMouseEvent &event)
void onSketchPads(wxCommandEvent &event) override
PCB_EDIT_FRAME * m_parent
Definition: dialog_plot.h:82
void Plot(wxCommandEvent &event) override
void applyPlotSettings()
int m_PSWidthAdjust
Definition: dialog_plot.h:88
wxString m_DRCWarningTemplate
Definition: dialog_plot.h:98
void setPlotModeChoiceSelection(OUTLINE_MODE aPlotMode)
Definition: dialog_plot.h:74
void OnOutputDirectoryBrowseClicked(wxCommandEvent &event) override
wxRearrangeList * m_plotAllLayersList
Definition: dialog_plot.h:102
void onPlotAllListMoveDown(wxCommandEvent &aEvent)
void onRunDRC(wxCommandEvent &event) override
void arrangeAllLayersList(const LSEQ &aSeq)
double m_YScaleAdjust
Definition: dialog_plot.h:86
void OnSetScaleOpt(wxCommandEvent &event) override
virtual ~DIALOG_PLOT()
STD_BITMAP_BUTTON * m_bpMoveDown
Definition: dialog_plot.h:105
void onPlotFPText(wxCommandEvent &aEvent) override
DIALOG_PLOT(PCB_EDIT_FRAME *parent)
Definition: dialog_plot.cpp:87
void CreateDrillFile(wxCommandEvent &event) override
void onPlotFPValues(wxCommandEvent &aEvent) override
void onPlotFPRefs(wxCommandEvent &aEvent) override
UNIT_BINDER m_defaultPenSize
Definition: dialog_plot.h:95
double m_XScaleAdjust
Definition: dialog_plot.h:84
PLOT_FORMAT getPlotFormat()
static LSET s_lastLayerSet
The plot layer set that last time the dialog was opened.
Definition: dialog_plot.h:108
int m_widthAdjustMaxValue
Definition: dialog_plot.h:93
void OnGerberX2Checked(wxCommandEvent &event) override
void init_Dialog()
void SetPlotFormat(wxCommandEvent &event) override
LSEQ m_layerList
Definition: dialog_plot.h:83
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:522
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:576
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:63
PCB_LAYER_ID Layer() const
Definition: dialog_plot.cpp:74
void SetData(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:73
PCB_LAYER_ID_CLIENT_DATA(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:69
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
void SetPlotPadNumbers(bool aFlag)
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 GetPlotPadNumbers() const
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)
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
Base plotter engine class.
Definition: plotter.h:105
virtual void SetAuthor(const wxString &aAuthor)
Definition: plotter.h:156
virtual void SetTitle(const wxString &aTitle)
Definition: plotter.h:155
virtual bool EndPlot()=0
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:136
virtual void SetSubject(const wxString &aSubject)
Definition: plotter.h:157
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:170
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:222
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:81
#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:882
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ F_CrtYd
Definition: layer_ids.h:117
@ F_Fab
Definition: layer_ids.h:120
@ B_CrtYd
Definition: layer_ids.h:116
@ 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:300
KICOMMON_API 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:77
@ 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
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:56
PLOTTER * StartPlotBoard(BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aLayer, const wxString &aLayerName, 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...
#define PLOT_MAX_SCALE
Definition: pcbplot.h:57
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
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:65
@ LAST_PATH_PLOT
Definition: project_file.h:57
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_EXCLUSION
@ RPT_SEVERITY_INFO
@ RPT_SEVERITY_ACTION
std::vector< FAB_LAYER_COLOR > dummy
constexpr double IUTomm(int iu) const
Definition: base_units.h:86
const double IU_PER_MM
Definition: base_units.h:76
const double IU_PER_MILS
Definition: base_units.h:77
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:118
Definition of file extensions used in Kicad.