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 The 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>
45#include <tool/tool_manager.h>
47#include <tools/drc_tool.h>
48#include <math/util.h> // for KiROUND
49#include <macros.h>
57#include <pcb_plotter.h>
58
59#include <wx/dirdlg.h>
60#include <wx/msgdlg.h>
61
62
64
65
66static double selectionToScale( int selection )
67{
68 switch( selection )
69 {
70 default: return 1.0;
71 case 0: return 0.0;
72 case 2: return 1.5;
73 case 3: return 2.0;
74 case 4: return 3.0;
75 }
76}
77
78
82class PCB_LAYER_ID_CLIENT_DATA : public wxClientData
83{
84public:
87 { }
88
90 m_id( aId )
91 { }
92
93 void SetData( PCB_LAYER_ID aId ) { m_id = aId; }
94 PCB_LAYER_ID Layer() const { return m_id; }
95
96private:
98};
99
100
101PCB_LAYER_ID_CLIENT_DATA* getLayerClientData( const wxRearrangeList* aList, int aIdx )
102{
103 return static_cast<PCB_LAYER_ID_CLIENT_DATA*>( aList->GetClientObject( aIdx ) );
104}
105
106
108 : DIALOG_PLOT( aEditFrame, aEditFrame )
109{
110}
111
112
113DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aEditFrame, wxWindow* aParent, JOB_EXPORT_PCB_PLOT* aJob ) :
114 DIALOG_PLOT_BASE( aParent ),
115 m_editFrame( aEditFrame ),
116 m_trackWidthCorrection( m_editFrame, m_widthAdjustLabel, m_widthAdjustCtrl, m_widthAdjustUnits ),
117 m_job( aJob )
118{
119 BOARD* board = m_editFrame->GetBoard();
120
121 m_pdfBackgroundColorSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
122
123 SetName( DLG_WINDOW_NAME );
125
126 if( m_job )
127 {
128 SetTitle( aJob->GetSettingsDialogTitle() );
129
131 m_messagesPanel->Hide();
132
133 m_browseButton->Hide();
134 m_openDirButton->Hide();
135 m_staticTextPlotFmt->Hide();
136 m_plotFormatOpt->Hide();
137 m_buttonDRC->Hide();
139 m_sdbSizer1Apply->Hide();
140 }
141 else
142 {
144 m_messagesPanel->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
145 }
146
147 // DIALOG_SHIM needs a unique hash_key because classname will be the same for both job and
148 // non-job versions.
149 m_hash_key = TO_UTF8( GetTitle() );
150
151 int order = 0;
152 wxArrayInt plotAllLayersOrder;
153 wxArrayString plotAllLayersChoicesStrings;
154 std::vector<PCB_LAYER_ID> layersIdChoiceList;
155 int textWidth = 0;
156
157 for( PCB_LAYER_ID layer : board->GetEnabledLayers().SeqStackupForPlotting() )
158 {
159 wxString layerName = board->GetLayerName( layer );
160
161 // wxCOL_WIDTH_AUTOSIZE doesn't work on all platforms, so we calculate width here
162 textWidth = std::max( textWidth, KIUI::GetTextSize( layerName, m_layerCheckListBox ).x );
163
164 plotAllLayersChoicesStrings.Add( layerName );
165 layersIdChoiceList.push_back( layer );
166
168 plotAllLayersOrder.push_back( order );
169 else
170 plotAllLayersOrder.push_back( ~order );
171
172 order += 1;
173 }
174
175 int checkColSize = 22;
176 int layerColSize = textWidth + 15;
177
178#ifdef __WXMAC__
179 // TODO: something in wxWidgets 3.1.x pads checkbox columns with extra space. (It used to
180 // also be that the width of the column would get set too wide (to 30), but that's patched in
181 // our local wxWidgets fork.)
182 checkColSize += 30;
183#endif
184
185 m_layerCheckListBox->SetMinClientSize( wxSize( checkColSize + layerColSize,
186 m_layerCheckListBox->GetMinClientSize().y ) );
187
188 wxStaticBox* allLayersLabel = new wxStaticBox( this, wxID_ANY, _( "Plot on All Layers" ) );
189 wxStaticBoxSizer* sbSizer = new wxStaticBoxSizer( allLayersLabel, wxVERTICAL );
190
191 m_plotAllLayersList = new wxRearrangeList( sbSizer->GetStaticBox(), wxID_ANY,
192 wxDefaultPosition, wxDefaultSize,
193 plotAllLayersOrder, plotAllLayersChoicesStrings, 0 );
194
195 m_plotAllLayersList->SetMinClientSize( wxSize( checkColSize + layerColSize,
196 m_plotAllLayersList->GetMinClientSize().y ) );
197
198 // Attach the LAYER_ID to each item in m_plotAllLayersList
199 // plotAllLayersChoicesStrings and layersIdChoiceList are in the same order,
200 // but m_plotAllLayersList has these strings in a different order
201 for( size_t idx = 0; idx < layersIdChoiceList.size(); idx++ )
202 {
203 wxString& txt = plotAllLayersChoicesStrings[idx];
204 int list_idx = m_plotAllLayersList->FindString( txt, true );
205
206 PCB_LAYER_ID layer_id = layersIdChoiceList[idx];
207 m_plotAllLayersList->SetClientObject( list_idx, new PCB_LAYER_ID_CLIENT_DATA( layer_id ) );
208 }
209
210 sbSizer->Add( m_plotAllLayersList, 1, wxALL | wxEXPAND | wxFIXED_MINSIZE, 3 );
211
212 wxBoxSizer* bButtonSizer;
213 bButtonSizer = new wxBoxSizer( wxHORIZONTAL );
214
215 m_bpMoveUp = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
216 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
217 m_bpMoveUp->SetToolTip( _( "Move current selection up" ) );
218 m_bpMoveUp->SetBitmap( KiBitmapBundle( BITMAPS::small_up ) );
219
220 bButtonSizer->Add( m_bpMoveUp, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3 );
221
222 m_bpMoveDown = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
223 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
224 m_bpMoveDown->SetToolTip( _( "Move current selection down" ) );
225 m_bpMoveDown->SetBitmap( KiBitmapBundle( BITMAPS::small_down ) );
226
227 bButtonSizer->Add( m_bpMoveDown, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
228
229 sbSizer->Add( bButtonSizer, 0, wxALL | wxEXPAND, 3 );
230
231 bmiddleSizer->Insert( 1, sbSizer, 1, wxALL | wxEXPAND, 5 );
232
233 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
234 m_openDirButton->SetBitmap( KiBitmapBundle( BITMAPS::small_new_window ) );
235
236 if( m_job )
237 {
239 }
240 else
241 {
242 SetupStandardButtons( { { wxID_OK, _( "Plot" ) },
243 { wxID_APPLY, _( "Generate Drill Files..." ) },
244 { wxID_CANCEL, _( "Close" ) } } );
245 }
246
247 GetSizer()->Fit( this );
248 GetSizer()->SetSizeHints( this );
249
250 m_bpMoveUp->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
251 m_bpMoveDown->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
252
253 m_layerCheckListBox->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( DIALOG_PLOT::OnRightClickLayers ),
254 nullptr, this );
255
256 m_plotAllLayersList->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( DIALOG_PLOT::OnRightClickAllLayers ),
257 nullptr, this );
258}
259
260
262{
263 s_lastAllLayersOrder.clear();
264
265 for( int ii = 0; ii < (int) m_plotAllLayersList->GetCount(); ++ii )
267
268 m_bpMoveDown->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
269 m_bpMoveUp->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
270}
271
272
274{
275 BOARD* board = m_editFrame->GetBoard();
276 wxFileName fileName;
277
278 PROJECT_FILE& projectFile = m_editFrame->Prj().GetProjectFile();
279
280 // Could devote a PlotOrder() function in place of UIOrder().
282
283 if( !m_job && !projectFile.m_PcbLastPath[ LAST_PATH_PLOT ].IsEmpty() )
285
286 if( m_job
288 && static_cast<JOB_EXPORT_PCB_PS*>( m_job )->m_useGlobalSettings ) )
289 {
290 // When we are using a job we get the PS adjust values from the plot options
291 // The exception is when this is a fresh job and we want to get the global values as defaults
294
299 }
300
301 // The reasonable width correction value must be in a range of
302 // [-(MinTrackWidth-1), +(MinClearanceValue-1)] decimils.
305
306 switch( m_plotOpts.GetFormat() )
307 {
308 default:
309 case PLOT_FORMAT::GERBER: m_plotFormatOpt->SetSelection( 0 ); break;
310 case PLOT_FORMAT::POST: m_plotFormatOpt->SetSelection( 1 ); break;
311 case PLOT_FORMAT::SVG: m_plotFormatOpt->SetSelection( 2 ); break;
312 case PLOT_FORMAT::DXF: m_plotFormatOpt->SetSelection( 3 ); break;
313 case PLOT_FORMAT::HPGL: /* no longer supported */ break;
314 case PLOT_FORMAT::PDF: m_plotFormatOpt->SetSelection( 4 ); break;
315 }
316
319
320 // Populate the check list box by all enabled layers names.
321 for( PCB_LAYER_ID layer : m_layerList )
322 {
323 int checkIndex = m_layerCheckListBox->Append( board->GetLayerName( layer ) );
324
325 if( m_plotOpts.GetLayerSelection()[layer] )
326 m_layerCheckListBox->Check( checkIndex );
327 }
328
330
331 // Option for disabling Gerber Aperture Macro (for broken Gerber readers)
333
334 // Option for using proper Gerber extensions. Note also Protel extensions are
335 // a broken feature. However, for now, we need to handle it.
337
338 // Option for including Gerber attributes, from Gerber X2 format, in the output
339 // In X1 format, they will be added as comments
341
342 // Option for including Gerber netlist info (from Gerber X2 format) in the output
344
345 // Option to generate a Gerber job file
347
348 // Gerber precision for coordinates
349 m_coordFormatCtrl->SetSelection( m_plotOpts.GetGerberPrecision() == 5 ? 0 : 1 );
350
351 // SVG precision and units for coordinates
354
358
362
363 if( m_plotDNP->GetValue() )
364 {
366 m_hideDNP->SetValue( true );
367 else
368 m_crossoutDNP->SetValue( true );
369 }
370
371 m_hideDNP->Enable( m_plotDNP->GetValue() );
372 m_crossoutDNP->Enable( m_plotDNP->GetValue() );
373
375
377
379
380 // Options to plot pads and vias holes
381 m_drillShapeOpt->SetSelection( (int) m_plotOpts.GetDrillMarksType() );
382
383 // Scale option
384 m_scaleOpt->SetSelection( m_plotOpts.GetScaleSelection() );
385
386 // DXF outline mode
388
389 // DXF text mode
390 m_DXF_plotTextStrokeFontOpt->SetValue( m_plotOpts.GetTextMode() == PLOT_TEXT_MODE::DEFAULT );
391
392 // DXF units selection
393 m_DXF_plotUnits->SetSelection( m_plotOpts.GetDXFPlotUnits() == DXF_UNITS::INCH ? 0 : 1 );
394
395 // Plot mirror option
396 m_plotMirrorOpt->SetValue( m_plotOpts.GetMirror() );
397
398 // Black and white plotting
399 m_SVGColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
400 m_PDFColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
407
408 // Initialize a few other parameters, which can also be modified
409 // from the drill dialog
410 reInitDialog();
411
412 // Update options values:
413 wxCommandEvent cmd_event;
414 SetPlotFormat( cmd_event );
415
416 return true;
417}
418
419
421{
423 {
424 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( m_job );
431 gJob->m_useBoardPlotParams = false;
432 }
433 else
434 {
436 }
437
439 {
440 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( m_job );
444 }
445
447 {
448 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( m_job );
451 dxfJob->m_plotGraphicItemsUsingContours = m_plotOpts.GetDXFPlotMode() == DXF_OUTLINE_MODE::SKETCH;
454 }
455
457 {
458 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( m_job );
464 // For a fresh job we got the adjusts from the global pcbnew settings
465 // After the user confirmed and/or changed them we stop using the global adjusts
466 psJob->m_useGlobalSettings = false;
467 }
468
470 {
471 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( m_job );
477
478 // we need to embed this for the cli deprecation fix
479 if( pdfJob->m_pdfSingle )
480 {
482 }
483 else
484 {
486 }
487 }
488
495
498
504
507 {
508 switch( m_plotOpts.GetDrillMarksType() )
509 {
510 case DRILL_MARKS::NO_DRILL_SHAPE: m_job->m_drillShapeOption = DRILL_MARKS::NO_DRILL_SHAPE; break;
511 case DRILL_MARKS::SMALL_DRILL_SHAPE: m_job->m_drillShapeOption = DRILL_MARKS::SMALL_DRILL_SHAPE; break;
512 default:
513 case DRILL_MARKS::FULL_DRILL_SHAPE: m_job->m_drillShapeOption = DRILL_MARKS::FULL_DRILL_SHAPE; break;
514 }
515 }
516
518
519 // this exists outside plot opts because its usually globally saved
521}
522
523
525{
526 // after calling the Drill or DRC dialogs some parameters can be modified....
527
528 // Output directory
530
531 // Origin of coordinates:
533
534 int knownViolations = 0;
535 int exclusions = 0;
536
537 for( PCB_MARKER* marker : m_editFrame->GetBoard()->Markers() )
538 {
539 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
540 exclusions++;
541 else
542 knownViolations++;
543 }
544
545 if( !m_job && ( knownViolations || exclusions ) )
546 {
547 m_DRCExclusionsWarning->SetLabel( wxString::Format( m_DRCWarningTemplate, knownViolations,
548 exclusions ) );
550 }
551 else
552 {
554 }
555
556 BOARD* board = m_editFrame->GetBoard();
557 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
558
559 if( getPlotFormat() == PLOT_FORMAT::GERBER &&
560 ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
561 {
563 }
564 else
565 {
567 }
568}
569
570
572{
573 auto findLayer =
574 [&]( wxRearrangeList* aList, PCB_LAYER_ID aLayer ) -> int
575 {
576 for( int ii = 0; ii < (int) aList->GetCount(); ++ii )
577 {
578 if( getLayerClientData( aList, ii )->Layer() == aLayer )
579 return ii;
580 }
581
582 return -1;
583 };
584
585 int idx = 0;
586
587 for( PCB_LAYER_ID layer : aSeq )
588 {
589 int currentPos = findLayer( m_plotAllLayersList, layer );
590
591 while( currentPos > idx )
592 {
593 m_plotAllLayersList->Select( currentPos );
594 m_plotAllLayersList->MoveCurrentUp();
595 currentPos--;
596 }
597
598 idx++;
599 }
600}
601
602
603#define ID_LAYER_FAB 13001
604#define ID_SELECT_COPPER_LAYERS 13002
605#define ID_DESELECT_COPPER_LAYERS 13003
606#define ID_SELECT_ALL_LAYERS 13004
607#define ID_DESELECT_ALL_LAYERS 13005
608#define ID_STACKUP_ORDER 13006
609
610
611// A helper function to show a popup menu, when the dialog is right clicked.
612void DIALOG_PLOT::OnRightClickLayers( wxMouseEvent& event )
613{
614 // Build a list of layers for usual fabrication: copper layers + tech layers without courtyard
615 LSET fab_layer_set = ( LSET::AllCuMask() | LSET::AllTechMask() ) & ~LSET( { B_CrtYd, F_CrtYd } );
616
617 wxMenu menu;
618 menu.Append( new wxMenuItem( &menu, ID_LAYER_FAB, _( "Select Fab Layers" ) ) );
619
620 menu.AppendSeparator();
621 menu.Append( new wxMenuItem( &menu, ID_SELECT_COPPER_LAYERS, _( "Select All Copper Layers" ) ) );
622 menu.Append( new wxMenuItem( &menu, ID_DESELECT_COPPER_LAYERS, _( "Deselect All Copper Layers" ) ) );
623
624 menu.AppendSeparator();
625 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
626 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
627
628 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
629 [&]( wxCommandEvent& aCmd )
630 {
631 switch( aCmd.GetId() )
632 {
633 case ID_LAYER_FAB: // Select layers usually needed to build a board
634 {
635 for( unsigned i = 0; i < m_layerList.size(); i++ )
636 {
637 LSET layermask( { m_layerList[ i ] } );
638
639 if( ( layermask & fab_layer_set ).any() )
640 m_layerCheckListBox->Check( i, true );
641 else
642 m_layerCheckListBox->Check( i, false );
643 }
644
645 break;
646 }
647
649 for( unsigned i = 0; i < m_layerList.size(); i++ )
650 {
651 if( IsCopperLayer( m_layerList[i] ) )
652 m_layerCheckListBox->Check( i, true );
653 }
654
655 break;
656
658 for( unsigned i = 0; i < m_layerList.size(); i++ )
659 {
660 if( IsCopperLayer( m_layerList[i] ) )
661 m_layerCheckListBox->Check( i, false );
662 }
663
664 break;
665
667 for( unsigned i = 0; i < m_layerList.size(); i++ )
668 m_layerCheckListBox->Check( i, true );
669
670 break;
671
673 for( unsigned i = 0; i < m_layerList.size(); i++ )
674 m_layerCheckListBox->Check( i, false );
675
676 break;
677
678 default:
679 aCmd.Skip();
680 }
681 } );
682
683 PopupMenu( &menu );
684}
685
686
687void DIALOG_PLOT::OnRightClickAllLayers( wxMouseEvent& event )
688{
689 wxMenu menu;
690 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
691 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
692
693 menu.AppendSeparator();
694 menu.Append( new wxMenuItem( &menu, ID_STACKUP_ORDER, _( "Order as Board Stackup" ) ) );
695
696 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
697 [&]( wxCommandEvent& aCmd )
698 {
699 switch( aCmd.GetId() )
700 {
701 case ID_SELECT_ALL_LAYERS:
702 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
703 m_plotAllLayersList->Check( i, true );
704
705 break;
706
707 case ID_DESELECT_ALL_LAYERS:
708 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
709 m_plotAllLayersList->Check( i, false );
710
711 break;
712
713 case ID_STACKUP_ORDER:
714 {
715 LSEQ stackup = m_editFrame->GetBoard()->GetEnabledLayers().SeqStackupForPlotting();
716 arrangeAllLayersList( stackup );
717 m_plotAllLayersList->Select( -1 );
718 break;
719 }
720
721 default:
722 aCmd.Skip();
723 }
724 } );
725
726 PopupMenu( &menu );
727}
728
729
730void DIALOG_PLOT::CreateDrillFile( wxCommandEvent& event )
731{
732 // Be sure drill file use the same settings (axis option, plot directory) as plot files:
734
735 DIALOG_GENDRILL dlg( m_editFrame, this );
736 dlg.ShowModal();
737
738 // a few plot settings can be modified: take them in account
740 reInitDialog();
741}
742
743
744void DIALOG_PLOT::OnChangeDXFPlotMode( wxCommandEvent& event )
745{
746 // m_DXF_plotTextStrokeFontOpt is disabled if m_DXF_plotModeOpt is checked (plot in DXF
747 // polygon mode)
748 m_DXF_plotTextStrokeFontOpt->Enable( !m_DXF_plotModeOpt->GetValue() );
749
750 // if m_DXF_plotTextStrokeFontOpt option is disabled (plot DXF in polygon mode), force
751 // m_DXF_plotTextStrokeFontOpt to true to use Pcbnew stroke font
752 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() )
753 m_DXF_plotTextStrokeFontOpt->SetValue( true );
754}
755
756
758{
759 // Build the absolute path of current output directory to preselect it in the file browser.
760 std::function<bool( wxString* )> textResolver =
761 [&]( wxString* token ) -> bool
762 {
763 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
764 };
765
766 wxString path = m_outputDirectoryName->GetValue();
767 path = ExpandTextVars( path, &textResolver );
769 path = Prj().AbsolutePath( path );
770
771 wxDirDialog dirDialog( this, _( "Select Output Directory" ), path );
772
773 if( dirDialog.ShowModal() == wxID_CANCEL )
774 return;
775
776 wxFileName dirName = wxFileName::DirName( dirDialog.GetPath() );
777
778 wxFileName fn( Prj().AbsolutePath( m_editFrame->GetBoard()->GetFileName() ) );
779 wxString defaultPath = fn.GetPathWithSep();
780 wxString msg;
781 wxFileName relPathTest; // Used to test if we can make the path relative
782
783 relPathTest.Assign( dirDialog.GetPath() );
784
785 // Test if making the path relative is possible before asking the user if they want to do it
786 if( relPathTest.MakeRelativeTo( defaultPath ) )
787 {
788 if( IsOK( this, wxString::Format( _( "Do you want to use a path relative to\n'%s'?" ), defaultPath ) ) )
789 dirName.MakeRelativeTo( defaultPath );
790 }
791
792 m_outputDirectoryName->SetValue( dirName.GetFullPath() );
793}
794
795
797{
798 // plot format id's are ordered like displayed in m_plotFormatOpt
799 static const PLOT_FORMAT plotFmt[] = {
800 PLOT_FORMAT::GERBER,
801 PLOT_FORMAT::POST,
802 PLOT_FORMAT::SVG,
803 PLOT_FORMAT::DXF,
804 PLOT_FORMAT::PDF };
805
806 return plotFmt[m_plotFormatOpt->GetSelection()];
807}
808
809
810void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event )
811{
812 // this option exist only in DXF format:
813 m_DXF_plotModeOpt->Enable( getPlotFormat() == PLOT_FORMAT::DXF );
814
815 // The alert message about non 0 solder mask min width and margin is shown
816 // only in gerber format and if min mask width or mask margin is not 0
817 BOARD* board = m_editFrame->GetBoard();
818 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
819
820 if( getPlotFormat() == PLOT_FORMAT::GERBER
821 && ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
822 {
824 }
825 else
826 {
828 }
829
830 switch( getPlotFormat() )
831 {
832 case PLOT_FORMAT::SVG:
833 case PLOT_FORMAT::PDF:
834 m_drillShapeOpt->Enable( true );
835 m_plotMirrorOpt->Enable( true );
836 m_useAuxOriginCheckBox->Enable( true );
837 m_scaleOpt->Enable( true );
838 m_fineAdjustXCtrl->Enable( false );
839 m_fineAdjustYCtrl->Enable( false );
841 m_plotPSNegativeOpt->Enable( true );
842 m_forcePSA4OutputOpt->Enable( false );
843 m_forcePSA4OutputOpt->SetValue( false );
844
845 if( getPlotFormat() == PLOT_FORMAT::SVG )
846 {
849 }
850 else
851 {
854 }
855
859 break;
860
861 case PLOT_FORMAT::POST:
862 m_drillShapeOpt->Enable( true );
863 m_plotMirrorOpt->Enable( true );
864 m_useAuxOriginCheckBox->Enable( false );
865 m_useAuxOriginCheckBox->SetValue( false );
866 m_scaleOpt->Enable( true );
867 m_fineAdjustXCtrl->Enable( true );
868 m_fineAdjustYCtrl->Enable( true );
870 m_plotPSNegativeOpt->Enable( true );
871 m_forcePSA4OutputOpt->Enable( true );
872
878 break;
879
880 case PLOT_FORMAT::GERBER:
881 m_drillShapeOpt->Enable( false );
882 m_drillShapeOpt->SetSelection( 0 );
883 m_plotMirrorOpt->Enable( false );
884 m_plotMirrorOpt->SetValue( false );
885 m_useAuxOriginCheckBox->Enable( true );
886 m_scaleOpt->Enable( false );
887 m_scaleOpt->SetSelection( 1 );
888 m_fineAdjustXCtrl->Enable( false );
889 m_fineAdjustYCtrl->Enable( false );
891 m_plotPSNegativeOpt->Enable( false );
892 m_plotPSNegativeOpt->SetValue( false );
893 m_forcePSA4OutputOpt->Enable( false );
894 m_forcePSA4OutputOpt->SetValue( false );
895
901 break;
902
903 case PLOT_FORMAT::DXF:
904 m_drillShapeOpt->Enable( true );
905 m_plotMirrorOpt->Enable( false );
906 m_plotMirrorOpt->SetValue( false );
907 m_useAuxOriginCheckBox->Enable( true );
908 m_scaleOpt->Enable( true );
909 m_fineAdjustXCtrl->Enable( false );
910 m_fineAdjustYCtrl->Enable( false );
912 m_plotPSNegativeOpt->Enable( false );
913 m_plotPSNegativeOpt->SetValue( false );
914 m_forcePSA4OutputOpt->Enable( false );
915 m_forcePSA4OutputOpt->SetValue( false );
916
922
923 OnChangeDXFPlotMode( event );
924 break;
925
926 default:
927 case PLOT_FORMAT::HPGL:
928 case PLOT_FORMAT::UNDEFINED:
929 break;
930 }
931
932 Layout();
933 m_MainSizer->SetSizeHints( this );
934}
935
936
937// A helper function to "clip" aValue between aMin and aMax and write result in * aResult
938// return false if clipped, true if aValue is just copied into * aResult
939static bool setDouble( double* aResult, double aValue, double aMin, double aMax )
940{
941 if( aValue < aMin )
942 {
943 *aResult = aMin;
944 return false;
945 }
946 else if( aValue > aMax )
947 {
948 *aResult = aMax;
949 return false;
950 }
951
952 *aResult = aValue;
953 return true;
954}
955
956
957static bool setInt( int* aResult, int aValue, int aMin, int aMax )
958{
959 if( aValue < aMin )
960 {
961 *aResult = aMin;
962 return false;
963 }
964 else if( aValue > aMax )
965 {
966 *aResult = aMax;
967 return false;
968 }
969
970 *aResult = aValue;
971 return true;
972}
973
974
976{
977 REPORTER& reporter = m_messagesPanel->Reporter();
978 PCB_PLOT_PARAMS tempOptions;
979
980 tempOptions.SetSubtractMaskFromSilk( m_subtractMaskFromSilk->GetValue() );
981 tempOptions.SetPlotFrameRef( m_plotSheetRef->GetValue() );
982 tempOptions.SetSketchPadsOnFabLayers( m_sketchPadsOnFabLayers->GetValue() );
983 tempOptions.SetPlotPadNumbers( m_plotPadNumbers->GetValue() );
984 tempOptions.SetHideDNPFPsOnFabLayers( m_plotDNP->GetValue()
985 && m_hideDNP->GetValue() );
986 tempOptions.SetSketchDNPFPsOnFabLayers( m_plotDNP->GetValue()
987 && m_crossoutDNP->GetValue() );
988 tempOptions.SetCrossoutDNPFPsOnFabLayers( m_plotDNP->GetValue()
989 && m_crossoutDNP->GetValue() );
990 tempOptions.SetUseAuxOrigin( m_useAuxOriginCheckBox->GetValue() );
991 tempOptions.SetScaleSelection( m_scaleOpt->GetSelection() );
992
993 int sel = m_drillShapeOpt->GetSelection();
994 tempOptions.SetDrillMarksType( static_cast<DRILL_MARKS>( sel ) );
995
996 tempOptions.SetMirror( m_plotMirrorOpt->GetValue() );
997 tempOptions.SetDXFPlotPolygonMode( m_DXF_plotModeOpt->GetValue() );
998
999 sel = m_DXF_plotUnits->GetSelection();
1000 tempOptions.SetDXFPlotUnits( sel == 0 ? DXF_UNITS::INCH : DXF_UNITS::MM );
1001
1002 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() ) // Currently, only DXF supports this option
1003 tempOptions.SetTextMode( PLOT_TEXT_MODE::DEFAULT );
1004 else
1005 tempOptions.SetTextMode( m_DXF_plotTextStrokeFontOpt->GetValue() ? PLOT_TEXT_MODE::DEFAULT :
1006 PLOT_TEXT_MODE::NATIVE );
1007
1008 if( getPlotFormat() == PLOT_FORMAT::SVG )
1009 {
1010 tempOptions.SetBlackAndWhite( m_SVGColorChoice->GetSelection() == 1 );
1011 }
1012 else if( getPlotFormat() == PLOT_FORMAT::PDF )
1013 {
1014 tempOptions.SetBlackAndWhite( m_PDFColorChoice->GetSelection() == 1 );
1015 tempOptions.m_PDFFrontFPPropertyPopups = m_frontFPPropertyPopups->GetValue();
1016 tempOptions.m_PDFBackFPPropertyPopups = m_backFPPropertyPopups->GetValue();
1017 tempOptions.m_PDFMetadata = m_pdfMetadata->GetValue();
1018 tempOptions.m_PDFSingle = m_pdfSingle->GetValue();
1020 }
1021 else
1022 {
1023 tempOptions.SetBlackAndWhite( true );
1024 }
1025
1026 // Update settings from text fields. Rewrite values back to the fields,
1027 // since the values may have been constrained by the setters.
1028
1029 // X scale
1030 double tmpDouble;
1031 wxString msg = m_fineAdjustXCtrl->GetValue();
1032 msg.ToDouble( &tmpDouble );
1033
1035 {
1036 msg.Printf( wxT( "%f" ), m_XScaleAdjust );
1037 m_fineAdjustXCtrl->SetValue( msg );
1038 msg.Printf( _( "X scale constrained." ) );
1039 reporter.Report( msg, RPT_SEVERITY_INFO );
1040 }
1041
1042 // Y scale
1043 msg = m_fineAdjustYCtrl->GetValue();
1044 msg.ToDouble( &tmpDouble );
1045
1047 {
1048 msg.Printf( wxT( "%f" ), m_YScaleAdjust );
1049 m_fineAdjustYCtrl->SetValue( msg );
1050 msg.Printf( _( "Y scale constrained." ) );
1051 reporter.Report( msg, RPT_SEVERITY_INFO );
1052 }
1053
1054 // PS Width correction
1057 {
1059 msg.Printf( _( "Width correction constrained. The width correction value must be in the"
1060 " range of [%s; %s] for the current design rules." ),
1063 reporter.Report( msg, RPT_SEVERITY_WARNING );
1064 }
1065
1066 if( m_job )
1067 {
1068 // When using a job we store the adjusts in the plot options
1069 tempOptions.SetFineScaleAdjustX( m_XScaleAdjust );
1070 tempOptions.SetFineScaleAdjustY( m_YScaleAdjust );
1071 tempOptions.SetWidthAdjust( m_PSWidthAdjust );
1072 }
1073
1074 tempOptions.SetFormat( getPlotFormat() );
1075
1076 tempOptions.SetDisableGerberMacros( m_disableApertMacros->GetValue() );
1077 tempOptions.SetUseGerberProtelExtensions( m_useGerberExtensions->GetValue() );
1078 tempOptions.SetUseGerberX2format( m_useGerberX2Format->GetValue() );
1079 tempOptions.SetIncludeGerberNetlistInfo( m_useGerberNetAttributes->GetValue() );
1080 tempOptions.SetCreateGerberJobFile( m_generateGerberJobFile->GetValue() );
1081
1082 tempOptions.SetGerberPrecision( m_coordFormatCtrl->GetSelection() == 0 ? 5 : 6 );
1083 tempOptions.SetSvgPrecision( m_svgPrecsision->GetValue() );
1084 tempOptions.SetSvgFitPageToBoard( m_SVG_fitPageToBoard->GetValue() );
1085
1086 LSET selectedLayers;
1087
1088 for( unsigned i = 0; i < m_layerList.size(); i++ )
1089 {
1090 if( m_layerCheckListBox->IsChecked( i ) )
1091 selectedLayers.set( m_layerList[i] );
1092 }
1093
1094 // Get a list of copper layers that aren't being used by inverting enabled layers.
1095 LSET disabledCopperLayers = LSET::AllCuMask() & ~m_editFrame->GetBoard()->GetEnabledLayers();
1096
1097 // Add selected layers from plot on all layers list in order set by user.
1098 wxArrayInt plotOnAllLayers;
1099 LSEQ commonLayers;
1100
1101 if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
1102 {
1103 size_t count = plotOnAllLayers.GetCount();
1104
1105 for( size_t i = 0; i < count; i++ )
1106 {
1107 int index = plotOnAllLayers.Item( i );
1108 PCB_LAYER_ID client_layer = getLayerClientData( m_plotAllLayersList, index )->Layer();
1109
1110 commonLayers.push_back( client_layer );
1111 }
1112 }
1113
1114 tempOptions.SetPlotOnAllLayersSequence( commonLayers );
1115
1116 // Enable all of the disabled copper layers.
1117 // If someone enables more copper layers they will be selected by default.
1118 selectedLayers = selectedLayers | disabledCopperLayers;
1119 tempOptions.SetLayerSelection( selectedLayers );
1120
1121 tempOptions.SetNegative( m_plotPSNegativeOpt->GetValue() );
1122 tempOptions.SetA4Output( m_forcePSA4OutputOpt->GetValue() );
1123
1124 // Set output directory and replace backslashes with forward ones
1125 wxString dirStr;
1126 dirStr = m_outputDirectoryName->GetValue();
1127 dirStr.Replace( wxT( "\\" ), wxT( "/" ) );
1128 tempOptions.SetOutputDirectory( dirStr );
1130
1131 if( !m_job && !m_plotOpts.IsSameAs( tempOptions ) )
1132 {
1133 m_editFrame->SetPlotSettings( tempOptions );
1135 m_plotOpts = tempOptions;
1136 }
1137 else
1138 {
1139 m_plotOpts = tempOptions;
1140 }
1141}
1142
1143
1144void DIALOG_PLOT::OnGerberX2Checked( wxCommandEvent& event )
1145{
1146 // Currently: do nothing
1147}
1148
1149
1150void DIALOG_PLOT::Plot( wxCommandEvent& event )
1151{
1152 if( m_job )
1153 {
1156 EndModal( wxID_OK );
1157 }
1158 else
1159 {
1160 BOARD* board = m_editFrame->GetBoard();
1161
1163
1164 PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
1165
1167
1169
1170 // If no layer selected, we have nothing plotted.
1171 // Prompt user if it happens because he could think there is a bug in Pcbnew.
1172 if( !m_plotOpts.GetLayerSelection().any() )
1173 {
1174 DisplayError( this, _( "No layer selected, Nothing to plot" ) );
1175 return;
1176 }
1177
1178 // Create output directory if it does not exist (also transform it in absolute form).
1179 // Bail if it fails.
1180
1181 std::function<bool( wxString* )> textResolver =
1182 [&]( wxString* token ) -> bool
1183 {
1184 // Handles board->GetTitleBlock() *and* board->GetProject()
1185 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
1186 };
1187
1188 wxString path = m_plotOpts.GetOutputDirectory();
1189 path = ExpandTextVars( path, &textResolver );
1191
1192 wxFileName outputDir = wxFileName::DirName( path );
1193 wxString boardFilename = m_editFrame->GetBoard()->GetFileName();
1194 REPORTER& reporter = m_messagesPanel->Reporter();
1195
1196 if( !EnsureFileDirectoryExists( &outputDir, boardFilename, &reporter ) )
1197 {
1198 wxString msg;
1199 msg.Printf( _( "Could not write plot files to folder '%s'." ), outputDir.GetPath() );
1200 DisplayError( this, msg );
1201 return;
1202 }
1203
1204 if( m_zoneFillCheck->GetValue() )
1205 m_editFrame->GetToolManager()->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( this );
1206
1207 m_plotOpts.SetAutoScale( false );
1208
1209 switch( m_plotOpts.GetScaleSelection() )
1210 {
1211 default: m_plotOpts.SetScale( 1 ); break;
1212 case 0: m_plotOpts.SetAutoScale( true ); break;
1213 case 2: m_plotOpts.SetScale( 1.5 ); break;
1214 case 3: m_plotOpts.SetScale( 2 ); break;
1215 case 4: m_plotOpts.SetScale( 3 ); break;
1216 }
1217
1218 /* If the scale factor edit controls are disabled or the scale value
1219 * is 0, don't adjust the base scale factor. This fixes a bug when
1220 * the default scale adjust is initialized to 0 and saved in program
1221 * settings resulting in a divide by zero fault.
1222 */
1223 if( getPlotFormat() == PLOT_FORMAT::POST )
1224 {
1225 if( m_XScaleAdjust != 0.0 )
1227
1228 if( m_YScaleAdjust != 0.0 )
1230
1232 }
1233
1234 // Test for a reasonable scale value
1235 // XXX could this actually happen? isn't it constrained in the apply function?
1237 DisplayInfoMessage( this, _( "Warning: Scale option set to a very small value" ) );
1238
1240 DisplayInfoMessage( this, _( "Warning: Scale option set to a very large value" ) );
1241
1242
1243 // Save the current plot options in the board
1245
1246 LOCALE_IO dummy; // Ensure the "C3 locale is used by the plotter
1247 PCB_PLOTTER pcbPlotter( m_editFrame->GetBoard(), &reporter, m_plotOpts );
1248
1249 LSEQ layersToPlot = m_plotOpts.GetLayerSelection().UIOrder();
1250
1251 wxArrayInt plotOnAllLayers;
1252 LSEQ commonLayers;
1253
1254 if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
1255 {
1256 size_t count = plotOnAllLayers.GetCount();
1257
1258 for( size_t i = 0; i < count; i++ )
1259 {
1260 int index = plotOnAllLayers.Item( i );
1261 PCB_LAYER_ID client_layer = getLayerClientData( m_plotAllLayersList, index )->Layer();
1262
1263 commonLayers.push_back( client_layer );
1264 }
1265 }
1266
1267 pcbPlotter.Plot( outputDir.GetPath(), layersToPlot, commonLayers, m_useGerberExtensions->GetValue() );
1268 }
1269}
1270
1271
1272
1273void DIALOG_PLOT::onRunDRC( wxCommandEvent& event )
1274{
1275 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1276
1277 if( parent )
1278 {
1279 DRC_TOOL* drcTool = parent->GetToolManager()->GetTool<DRC_TOOL>();
1280
1281 // First close an existing dialog if open
1282 // (low probability, but can happen)
1283 drcTool->DestroyDRCDialog();
1284
1285 // Open a new drc dialog, with the right parent frame, and in Modal Mode
1286 drcTool->ShowDRCDialog( this );
1287
1288 // Update DRC warnings on return to this dialog
1289 reInitDialog();
1290 }
1291}
1292
1293
1294void DIALOG_PLOT::onOpenOutputDirectory( wxCommandEvent& event )
1295{
1296 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
1297 {
1298 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
1299 };
1300
1301 wxString path = m_outputDirectoryName->GetValue();
1302 path = ExpandTextVars( path, &textResolver );
1304 path = Prj().AbsolutePath( path );
1305
1306 if( !wxDirExists( path ) )
1307 {
1308 DisplayError( this, wxString::Format( _( "Directory '%s' does not exist." ), path ) );
1309 return;
1310 }
1311
1312 wxLaunchDefaultApplication( path );
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::onDNPCheckbox( wxCommandEvent& aEvent )
1345{
1346 m_hideDNP->Enable( aEvent.IsChecked() );
1347 m_crossoutDNP->Enable( aEvent.IsChecked() );
1348}
1349
1350
1351void DIALOG_PLOT::onSketchPads( wxCommandEvent& aEvent )
1352{
1353 m_plotPadNumbers->Enable( aEvent.IsChecked() );
1354}
1355
1356
1358{
1359 if( m_PDFColorChoice->GetSelection() == 1 )
1360 {
1361 m_pdfBackgroundColorSwatch->Disable();
1362 m_pdfBackgroundColorText->Disable();
1363 }
1364 else
1365 {
1367 m_pdfBackgroundColorText->Enable();
1368 }
1369}
1370
1371
1372void DIALOG_PLOT::onPDFColorChoice( wxCommandEvent& aEvent )
1373{
1375}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:112
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:115
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition: bitmap.cpp:110
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:236
BASE_SET & set(size_t pos)
Definition: base_set.h:116
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:317
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:500
const MARKERS & Markers() const
Definition: board.h:370
const wxString & GetFileName() const
Definition: board.h:354
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:680
PROJECT * GetProject() const
Definition: board.h:538
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:1024
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:907
void SetSwatchColor(const KIGFX::COLOR4D &aColor, bool aSendEvent)
Set the current swatch color directly.
KIGFX::COLOR4D GetSwatchColor() const
void SetDefaultColor(const KIGFX::COLOR4D &aColor)
Sets the color that will be chosen with the "Reset to Default" button in the chooser.
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
wxCheckBox * m_pdfSingle
wxChoice * m_SVGColorChoice
wxStaticText * m_staticTextPlotFmt
STD_BITMAP_BUTTON * m_browseButton
wxTextCtrl * m_outputDirectoryName
wxSpinCtrl * m_svgPrecsision
wxTextCtrl * m_fineAdjustYCtrl
wxCheckBox * m_plotPadNumbers
wxCheckBox * m_useAuxOriginCheckBox
wxStaticBoxSizer * m_PSOptionsSizer
STD_BITMAP_BUTTON * m_openDirButton
wxCheckBox * m_plotPSNegativeOpt
wxCheckBox * m_SVG_fitPageToBoard
wxStaticText * m_pdfBackgroundColorText
wxCheckBox * m_DXF_plotTextStrokeFontOpt
wxCheckBox * m_useGerberExtensions
wxCheckBox * m_plotSheetRef
wxBoxSizer * m_SizerSolderMaskAlert
wxCheckBox * m_generateGerberJobFile
wxRadioButton * m_crossoutDNP
wxButton * m_sdbSizer1Apply
wxCheckBox * m_useGerberX2Format
wxCheckListBox * m_layerCheckListBox
wxCheckBox * m_plotMirrorOpt
wxStaticBoxSizer * m_svgOptionsSizer
COLOR_SWATCH * m_pdfBackgroundColorSwatch
wxCheckBox * m_forcePSA4OutputOpt
wxCheckBox * m_useGerberNetAttributes
wxCheckBox * m_sketchPadsOnFabLayers
wxCheckBox * m_subtractMaskFromSilk
wxCheckBox * m_plotDNP
wxBoxSizer * m_PlotOptionsSizer
wxChoice * m_DXF_plotUnits
wxStaticBoxSizer * m_SizerDXF_options
wxCheckBox * m_pdfMetadata
wxChoice * m_drillShapeOpt
wxButton * m_buttonDRC
wxRadioButton * m_hideDNP
wxCheckBox * m_zoneFillCheck
wxStaticBoxSizer * m_GerberOptionsSizer
WX_HTML_REPORT_PANEL * m_messagesPanel
wxChoice * m_PDFColorChoice
wxChoice * m_plotFormatOpt
wxBoxSizer * m_MainSizer
A dialog to set the plot options and create plot files in various formats.
Definition: dialog_plot.h:41
void onPDFColorChoice(wxCommandEvent &event) override
DIALOG_PLOT(PCB_EDIT_FRAME *aEditFrame)
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:108
JOB_EXPORT_PCB_PLOT * m_job
Definition: dialog_plot.h:105
PCB_PLOT_PARAMS m_plotOpts
Definition: dialog_plot.h:98
STD_BITMAP_BUTTON * m_bpMoveUp
Definition: dialog_plot.h:102
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:94
void onBoardSetup(wxHyperlinkEvent &aEvent) override
void OnRightClickAllLayers(wxMouseEvent &event)
void onSketchPads(wxCommandEvent &event) override
void Plot(wxCommandEvent &event) override
void applyPlotSettings()
int m_PSWidthAdjust
Definition: dialog_plot.h:87
wxString m_DRCWarningTemplate
Definition: dialog_plot.h:96
wxRearrangeList * m_plotAllLayersList
Definition: dialog_plot.h:100
bool TransferDataToWindow() override
void onPlotAllListMoveDown(wxCommandEvent &aEvent)
void onRunDRC(wxCommandEvent &event) override
void arrangeAllLayersList(const LSEQ &aSeq)
double m_YScaleAdjust
Definition: dialog_plot.h:85
void onOpenOutputDirectory(wxCommandEvent &event) override
void updatePdfColorOptions()
PCB_EDIT_FRAME * m_editFrame
Definition: dialog_plot.h:81
virtual ~DIALOG_PLOT()
STD_BITMAP_BUTTON * m_bpMoveDown
Definition: dialog_plot.h:103
void CreateDrillFile(wxCommandEvent &event) override
void onDNPCheckbox(wxCommandEvent &event) override
double m_XScaleAdjust
Definition: dialog_plot.h:83
PLOT_FORMAT getPlotFormat()
void transferPlotParamsToJob()
int m_widthAdjustMaxValue
Definition: dialog_plot.h:92
void onOutputDirectoryBrowseClicked(wxCommandEvent &event) override
void OnGerberX2Checked(wxCommandEvent &event) override
void SetPlotFormat(wxCommandEvent &event) override
LSEQ m_layerList
Definition: dialog_plot.h:82
void SetupStandardButtons(std::map< int, wxString > aLabels={})
std::string m_hash_key
Definition: dialog_shim.h:236
int ShowModal() override
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
@ ONE_PAGE_PER_LAYER_ONE_FILE
The most traditional output mode KiCad has had.
bool m_pdfSingle
This is a hack to deal with cli having the wrong behavior We will deprecate out the wrong behavior,...
GEN_MODE m_pdfGenMode
The background color specified in a hex string.
LSEQ m_plotOnAllLayersSequence
Used by SVG & PDF.
DRILL_MARKS m_drillShapeOption
Used by SVG/DXF/PDF/Gerbers.
bool m_mirror
Common Options.
LSEQ m_plotLayerSequence
Layers to include on all individual layer prints.
unsigned int m_precision
void SetConfiguredOutputPath(const wxString &aPath)
Sets the configured output path for the job, this path is always saved to file.
Definition: job.cpp:153
virtual wxString GetSettingsDialogTitle() const
Definition: job.cpp:80
wxString ToCSSString() const
Definition: color4d.cpp:147
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:41
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: lseq.h:47
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:37
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
Definition: lset.cpp:733
LSEQ SeqStackupForPlotting() const
Return the sequence that is typical for a bottom-to-top stack-up.
Definition: lset.cpp:387
static const LSET & AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition: lset.cpp:659
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
Definition: lset.cpp:591
virtual const PCB_PLOT_PARAMS & GetPlotSettings() const
Return the PCB_PLOT_PARAMS for the BOARD owned by this frame.
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:83
PCB_LAYER_ID Layer() const
Definition: dialog_plot.cpp:94
void SetData(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:93
PCB_LAYER_ID_CLIENT_DATA(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:89
bool Plot(const wxString &aOutputPath, const LSEQ &aLayersToPlot, const LSEQ &aCommonLayers, bool aUseGerberFileExtensions, bool aOutputPathIsSingle=false, std::optional< wxString > aLayerName=std::nullopt, std::optional< wxString > aSheetName=std::nullopt, std::optional< wxString > aSheetPath=std::nullopt)
Definition: pcb_plotter.cpp:64
static void PlotJobToPlotOpts(PCB_PLOT_PARAMS &aOpts, JOB_EXPORT_PCB_PLOT *aJob, REPORTER &aReporter)
Translate a JOB to PCB_PLOT_PARAMS.
Parameters and options when plotting/printing a board.
bool GetNegative() const
PLOT_FORMAT GetFormat() const
void SetDrillMarksType(DRILL_MARKS aVal)
bool GetUseAuxOrigin() const
LSEQ GetPlotOnAllLayersSequence() const
bool GetHideDNPFPsOnFabLayers() const
void SetLayerSelection(const LSET &aSelection)
void SetOutputDirectory(const wxString &aDir)
int GetWidthAdjust() const
void SetSketchPadsOnFabLayers(bool aFlag)
void SetUseGerberX2format(bool aUse)
bool GetMirror() const
DXF_UNITS GetDXFPlotUnits() const
void SetA4Output(int aForce)
bool GetCrossoutDNPFPsOnFabLayers() const
bool GetSketchDNPFPsOnFabLayers() const
void SetPlotOnAllLayersSequence(LSEQ aSeq)
void SetDXFPlotPolygonMode(bool aFlag)
void SetAutoScale(bool aFlag)
unsigned GetSvgPrecision() const
void SetPlotFrameRef(bool aFlag)
void SetSketchDNPFPsOnFabLayers(bool aFlag)
bool m_PDFMetadata
Generate PDF metadata for SUBJECT and AUTHOR.
double GetScale() const
PLOT_TEXT_MODE GetTextMode() const override
bool GetCreateGerberJobFile() const
void SetPlotPadNumbers(bool aFlag)
bool GetDXFPlotPolygonMode() const
void SetSketchPadLineWidth(int aWidth)
bool GetSvgFitPagetoBoard() const
LSET GetLayerSelection() const
wxString GetOutputDirectory() const
int GetScaleSelection() const
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 SetGerberPrecision(int aPrecision)
DXF_OUTLINE_MODE GetDXFPlotMode() const override
void SetSubtractMaskFromSilk(bool aSubtract)
bool GetSketchPadsOnFabLayers() const
void SetHideDNPFPsOnFabLayers(bool aFlag)
bool GetSubtractMaskFromSilk() const
int GetGerberPrecision() const
COLOR4D m_PDFBackgroundColor
Background color to use if m_PDFUseBackgroundColor is true.
double GetFineScaleAdjustY() 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)
void SetCreateGerberJobFile(bool aCreate)
bool GetIncludeGerberNetlistInfo() const
bool m_PDFSingle
Generate a single PDF file for all layers.
void SetNegative(bool aFlag)
double GetFineScaleAdjustX() const
bool GetBlackAndWhite() const
void SetUseAuxOrigin(bool aAux)
bool m_PDFBackFPPropertyPopups
on front and/or back of board
void SetTextMode(PLOT_TEXT_MODE aVal)
void SetSvgFitPageToBoard(int aSvgFitPageToBoard)
bool GetUseGerberProtelExtensions() const
void SetSvgPrecision(unsigned aPrecision)
bool GetPlotFrameRef() const
void SetCrossoutDNPFPsOnFabLayers(bool aFlag)
void SetFormat(PLOT_FORMAT aFormat)
bool GetDisableGerberMacros() const
void SetFineScaleAdjustY(double aVal)
void SetWidthAdjust(int aVal)
The backing store for a PROJECT, in JSON format.
Definition: project_file.h:68
wxString m_PcbLastPath[LAST_PATH_SIZE]
MRU path storage.
Definition: project_file.h:173
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:204
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:373
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:73
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
Definition: reporter.h:102
A bitmap button widget that behaves like a standard dialog button except with an icon.
void SetBitmap(const wxBitmapBundle &aBmp)
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.
int GetIntValue()
Definition: unit_binder.h:134
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)
Set the report full file name to the string.
REPORTER & Reporter()
Return the reporter object that reports to this panel.
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:355
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
Definition: common.cpp:59
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:376
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:251
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:222
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:169
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)
#define ID_SELECT_ALL_LAYERS
static double selectionToScale(int selection)
Definition: dialog_plot.cpp:66
#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.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition: layer_ids.h:665
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ F_CrtYd
Definition: layer_ids.h:116
@ F_Fab
Definition: layer_ids.h:119
@ B_CrtYd
Definition: layer_ids.h:115
@ 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)
Return the string from aValue according to aUnits (inch, mm ...) for display.
Definition: eda_units.cpp:310
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:78
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:100
#define PLOT_MIN_SCALE
Definition: pcbplot.h:57
#define PLOT_MAX_SCALE
Definition: pcbplot.h:58
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
Plotting engines similar to ps (PostScript, Gerber, svg)
@ LAST_PATH_PLOT
Definition: project_file.h:56
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_EXCLUSION
@ RPT_SEVERITY_INFO
#define DEFAULT_THEME
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
std::vector< FAB_LAYER_COLOR > dummy
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: string_utils.h:429
constexpr double IUTomm(int iu) const
Definition: base_units.h:90
Definition of file extensions used in Kicad.