KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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>
44#include <tool/tool_manager.h>
46#include <tools/drc_tool.h>
47#include <math/util.h> // for KiROUND
48#include <macros.h>
54#include <pcb_plotter.h>
55
56#include <wx/dirdlg.h>
57#include <wx/msgdlg.h>
58
59
63
64
68class PCB_LAYER_ID_CLIENT_DATA : public wxClientData
69{
70public:
73 { }
74
76 m_id( aId )
77 { }
78
79 void SetData( PCB_LAYER_ID aId ) { m_id = aId; }
80 PCB_LAYER_ID Layer() const { return m_id; }
81
82private:
84};
85
86
87PCB_LAYER_ID_CLIENT_DATA* getLayerClientData( const wxRearrangeList* aList, int aIdx )
88{
89 return static_cast<PCB_LAYER_ID_CLIENT_DATA*>( aList->GetClientObject( aIdx ) );
90}
91
92
94 : DIALOG_PLOT( aEditFrame, aEditFrame )
95{
96}
97
98
99DIALOG_PLOT::DIALOG_PLOT( PCB_EDIT_FRAME* aEditFrame, wxWindow* aParent,
100 JOB_EXPORT_PCB_PLOT* aJob ) :
101 DIALOG_PLOT_BASE( aParent ),
102 m_editFrame( aEditFrame ),
103 m_defaultPenSize( m_editFrame, m_hpglPenLabel, m_hpglPenCtrl, m_hpglPenUnits ),
104 m_trackWidthCorrection( m_editFrame, m_widthAdjustLabel, m_widthAdjustCtrl, m_widthAdjustUnits ),
105 m_job( aJob )
106{
107 BOARD* board = m_editFrame->GetBoard();
108
109 SetName( DLG_WINDOW_NAME );
111
112 if( m_job )
113 {
114 SetTitle( aJob->GetSettingsDialogTitle() );
115
117 m_messagesPanel->Hide();
118
119 m_browseButton->Hide();
120 m_openDirButton->Hide();
121 m_staticTextPlotFmt->Hide();
122 m_plotFormatOpt->Hide();
123 m_buttonDRC->Hide();
125 m_sdbSizer1Apply->Hide();
126 }
127 else
128 {
130 m_messagesPanel->SetFileName( Prj().GetProjectPath() + wxT( "report.txt" ) );
131 }
132
133 // DIALOG_SHIM needs a unique hash_key because classname will be the same for both job and
134 // non-job versions (which have different sizes).
135 m_hash_key = TO_UTF8( GetTitle() );
136
137 int order = 0;
138 wxArrayInt plotAllLayersOrder;
139 wxArrayString plotAllLayersChoicesStrings;
140 std::vector<PCB_LAYER_ID> layersIdChoiceList;
141 int textWidth = 0;
142
143 for( PCB_LAYER_ID layer : board->GetEnabledLayers().SeqStackupForPlotting() )
144 {
145 wxString layerName = board->GetLayerName( layer );
146
147 // wxCOL_WIDTH_AUTOSIZE doesn't work on all platforms, so we calculate width here
148 textWidth = std::max( textWidth, KIUI::GetTextSize( layerName, m_layerCheckListBox ).x );
149
150 plotAllLayersChoicesStrings.Add( layerName );
151 layersIdChoiceList.push_back( layer );
152
154 plotAllLayersOrder.push_back( order );
155 else
156 plotAllLayersOrder.push_back( ~order );
157
158 order += 1;
159 }
160
161 int checkColSize = 22;
162 int layerColSize = textWidth + 15;
163
164#ifdef __WXMAC__
165 // TODO: something in wxWidgets 3.1.x pads checkbox columns with extra space. (It used to
166 // also be that the width of the column would get set too wide (to 30), but that's patched in
167 // our local wxWidgets fork.)
168 checkColSize += 30;
169#endif
170
171 m_layerCheckListBox->SetMinClientSize( wxSize( checkColSize + layerColSize,
172 m_layerCheckListBox->GetMinClientSize().y ) );
173
174 wxStaticBox* allLayersLabel = new wxStaticBox( this, wxID_ANY, _( "Plot on All Layers" ) );
175 wxStaticBoxSizer* sbSizer = new wxStaticBoxSizer( allLayersLabel, wxVERTICAL );
176
177 m_plotAllLayersList = new wxRearrangeList( sbSizer->GetStaticBox(), wxID_ANY,
178 wxDefaultPosition, wxDefaultSize,
179 plotAllLayersOrder, plotAllLayersChoicesStrings, 0 );
180
181 m_plotAllLayersList->SetMinClientSize( wxSize( checkColSize + layerColSize,
182 m_plotAllLayersList->GetMinClientSize().y ) );
183
184 // Attach the LAYER_ID to each item in m_plotAllLayersList
185 // plotAllLayersChoicesStrings and layersIdChoiceList are in the same order,
186 // but m_plotAllLayersList has these strings in a different order
187 for( size_t idx = 0; idx < layersIdChoiceList.size(); idx++ )
188 {
189 wxString& txt = plotAllLayersChoicesStrings[idx];
190 int list_idx = m_plotAllLayersList->FindString( txt, true );
191
192 PCB_LAYER_ID layer_id = layersIdChoiceList[idx];
193 m_plotAllLayersList->SetClientObject( list_idx, new PCB_LAYER_ID_CLIENT_DATA( layer_id ) );
194 }
195
196 sbSizer->Add( m_plotAllLayersList, 1, wxALL | wxEXPAND | wxFIXED_MINSIZE, 3 );
197
198 wxBoxSizer* bButtonSizer;
199 bButtonSizer = new wxBoxSizer( wxHORIZONTAL );
200
201 m_bpMoveUp = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
202 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
203 m_bpMoveUp->SetToolTip( _( "Move current selection up" ) );
204 m_bpMoveUp->SetBitmap( KiBitmapBundle( BITMAPS::small_up ) );
205
206 bButtonSizer->Add( m_bpMoveUp, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3 );
207
208 m_bpMoveDown = new STD_BITMAP_BUTTON( sbSizer->GetStaticBox(), wxID_ANY, wxNullBitmap,
209 wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW | 0 );
210 m_bpMoveDown->SetToolTip( _( "Move current selection down" ) );
211 m_bpMoveDown->SetBitmap( KiBitmapBundle( BITMAPS::small_down ) );
212
213 bButtonSizer->Add( m_bpMoveDown, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5 );
214
215 sbSizer->Add( bButtonSizer, 0, wxALL | wxEXPAND, 3 );
216
217 bmiddleSizer->Insert( 1, sbSizer, 1, wxALL | wxEXPAND, 5 );
218
219 init_Dialog();
220
221 if( m_job )
222 {
224 }
225 else
226 {
227 SetupStandardButtons( { { wxID_OK, _( "Plot" ) },
228 { wxID_APPLY, _( "Generate Drill Files..." ) },
229 { wxID_CANCEL, _( "Close" ) } } );
230 }
231
232 GetSizer()->Fit( this );
233 GetSizer()->SetSizeHints( this );
234
235 m_bpMoveUp->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
236 m_bpMoveDown->Bind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
237
238 m_layerCheckListBox->Connect( wxEVT_RIGHT_DOWN,
239 wxMouseEventHandler( DIALOG_PLOT::OnRightClickLayers ), nullptr,
240 this );
241
242 m_plotAllLayersList->Connect( wxEVT_RIGHT_DOWN,
243 wxMouseEventHandler( DIALOG_PLOT::OnRightClickAllLayers ), nullptr,
244 this );
245}
246
247
249{
250 s_lastAllLayersOrder.clear();
251
252 for( int ii = 0; ii < (int) m_plotAllLayersList->GetCount(); ++ii )
254
255 m_bpMoveDown->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveDown, this );
256 m_bpMoveUp->Unbind( wxEVT_COMMAND_BUTTON_CLICKED, &DIALOG_PLOT::onPlotAllListMoveUp, this );
257}
258
259
261{
262 BOARD* board = m_editFrame->GetBoard();
263 wxFileName fileName;
264
265 PROJECT_FILE& projectFile = m_editFrame->Prj().GetProjectFile();
266
267 // Could devote a PlotOrder() function in place of UIOrder().
269
271
272 if( !m_job && !projectFile.m_PcbLastPath[ LAST_PATH_PLOT ].IsEmpty() )
274
277
279
280 m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
281 m_openDirButton->SetBitmap( KiBitmapBundle( BITMAPS::small_new_window ) );
282
283 // m_PSWidthAdjust is stored in mm in user config
285
286 // The reasonable width correction value must be in a range of
287 // [-(MinTrackWidth-1), +(MinClearanceValue-1)] decimils.
290
291 switch( m_plotOpts.GetFormat() )
292 {
293 default:
294 case PLOT_FORMAT::GERBER: m_plotFormatOpt->SetSelection( 0 ); break;
295 case PLOT_FORMAT::POST: m_plotFormatOpt->SetSelection( 1 ); break;
296 case PLOT_FORMAT::SVG: m_plotFormatOpt->SetSelection( 2 ); break;
297 case PLOT_FORMAT::DXF: m_plotFormatOpt->SetSelection( 3 ); break;
298 case PLOT_FORMAT::HPGL: m_plotFormatOpt->SetSelection( 4 ); break;
299 case PLOT_FORMAT::PDF: m_plotFormatOpt->SetSelection( 5 ); break;
300 }
301
302 // Set units and value for HPGL pen size (this param is in mils).
304
305 // Test for a reasonable scale value. Set to 1 if problem
308 {
310 }
311
313 unityScale, EDA_UNITS::UNSCALED, m_XScaleAdjust ) );
314
316 unityScale, EDA_UNITS::UNSCALED, m_YScaleAdjust ) );
317
318 // Test for a reasonable PS width correction value. Set to 0 if problem.
319 if( m_PSWidthAdjust < m_widthAdjustMinValue || m_PSWidthAdjust > m_widthAdjustMaxValue )
320 m_PSWidthAdjust = 0.;
321
323
326
327 // Populate the check list box by all enabled layers names.
328 for( PCB_LAYER_ID layer : m_layerList )
329 {
330 int checkIndex = m_layerCheckListBox->Append( board->GetLayerName( layer ) );
331
332 if( m_plotOpts.GetLayerSelection()[layer] )
333 m_layerCheckListBox->Check( checkIndex );
334 }
335
337
338 // Option for disabling Gerber Aperture Macro (for broken Gerber readers)
340
341 // Option for using proper Gerber extensions. Note also Protel extensions are
342 // a broken feature. However, for now, we need to handle it.
344
345 // Option for including Gerber attributes, from Gerber X2 format, in the output
346 // In X1 format, they will be added as comments
348
349 // Option for including Gerber netlist info (from Gerber X2 format) in the output
351
352 // Option to generate a Gerber job file
354
355 // Gerber precision for coordinates
356 m_coordFormatCtrl->SetSelection( m_plotOpts.GetGerberPrecision() == 5 ? 0 : 1 );
357
358 // SVG precision and units for coordinates
361
365
369
370 if( m_plotDNP->GetValue() )
371 {
373 m_hideDNP->SetValue( true );
374 else
375 m_crossoutDNP->SetValue( true );
376 }
377
378 m_hideDNP->Enable( m_plotDNP->GetValue() );
379 m_crossoutDNP->Enable( m_plotDNP->GetValue() );
380
382
384
386
387 // Options to plot pads and vias holes
388 m_drillShapeOpt->SetSelection( (int) m_plotOpts.GetDrillMarksType() );
389
390 // Scale option
391 m_scaleOpt->SetSelection( m_plotOpts.GetScaleSelection() );
392
393 // Plot mode
395
396 // DXF outline mode
398
399 // DXF text mode
401 == PLOT_TEXT_MODE::DEFAULT );
402
403 // DXF units selection
404 m_DXF_plotUnits->SetSelection( m_plotOpts.GetDXFPlotUnits() == DXF_UNITS::INCH ? 0 : 1 );
405
406 // Plot mirror option
407 m_plotMirrorOpt->SetValue( m_plotOpts.GetMirror() );
408
409 // Black and white plotting
410 m_SVGColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
411 m_PDFColorChoice->SetSelection( m_plotOpts.GetBlackAndWhite() ? 1 : 0 );
416
417 // Initialize a few other parameters, which can also be modified
418 // from the drill dialog
419 reInitDialog();
420
421 // Update options values:
422 wxCommandEvent cmd_event;
423 SetPlotFormat( cmd_event );
424 OnSetScaleOpt( cmd_event );
425}
426
427
429{
431 {
432 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( m_job );
439 gJob->m_useBoardPlotParams = false;
440 }
441
443 {
444 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( m_job );
448 }
449
451 {
452 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( m_job );
453 dxfJob->m_dxfUnits = m_plotOpts.GetDXFPlotUnits() == DXF_UNITS::INCH
456 dxfJob->m_plotGraphicItemsUsingContours = m_plotOpts.GetPlotMode() == OUTLINE_MODE::SKETCH;
459 }
460
462 {
463 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( m_job );
468
469 // we need to embed this for the cli deprecation fix
470 if( pdfJob->m_pdfSingle )
471 {
473 }
474 else
475 {
477 }
478 }
479
486
489
495
498 {
499 switch( m_plotOpts.GetDrillMarksType() )
500 {
501 case DRILL_MARKS::NO_DRILL_SHAPE: m_job->m_drillShapeOption = DRILL_MARKS::NO_DRILL_SHAPE; break;
502 case DRILL_MARKS::SMALL_DRILL_SHAPE: m_job->m_drillShapeOption = DRILL_MARKS::SMALL_DRILL_SHAPE; break;
503 default:
504 case DRILL_MARKS::FULL_DRILL_SHAPE: m_job->m_drillShapeOption = DRILL_MARKS::FULL_DRILL_SHAPE; break;
505 }
506 }
507
509}
510
511
513{
514 // after calling the Drill or DRC dialogs some parameters can be modified....
515
516 // Output directory
518
519 // Origin of coordinates:
521
522 int knownViolations = 0;
523 int exclusions = 0;
524
525 for( PCB_MARKER* marker : m_editFrame->GetBoard()->Markers() )
526 {
527 if( marker->GetSeverity() == RPT_SEVERITY_EXCLUSION )
528 exclusions++;
529 else
530 knownViolations++;
531 }
532
533 if( !m_job && ( knownViolations || exclusions ) )
534 {
535 m_DRCExclusionsWarning->SetLabel( wxString::Format( m_DRCWarningTemplate, knownViolations,
536 exclusions ) );
538 }
539 else
540 {
542 }
543
544 BOARD* board = m_editFrame->GetBoard();
545 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
546
547 if( getPlotFormat() == PLOT_FORMAT::GERBER &&
548 ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
549 {
551 }
552 else
553 {
555 }
556}
557
558
560{
561 auto findLayer =
562 [&]( wxRearrangeList* aList, PCB_LAYER_ID aLayer ) -> int
563 {
564 for( int ii = 0; ii < (int) aList->GetCount(); ++ii )
565 {
566 if( getLayerClientData( aList, ii )->Layer() == aLayer )
567 return ii;
568 }
569
570 return -1;
571 };
572
573 int idx = 0;
574
575 for( PCB_LAYER_ID layer : aSeq )
576 {
577 int currentPos = findLayer( m_plotAllLayersList, layer );
578
579 while( currentPos > idx )
580 {
581 m_plotAllLayersList->Select( currentPos );
582 m_plotAllLayersList->MoveCurrentUp();
583 currentPos--;
584 }
585
586 idx++;
587 }
588}
589
590
591#define ID_LAYER_FAB 13001
592#define ID_SELECT_COPPER_LAYERS 13002
593#define ID_DESELECT_COPPER_LAYERS 13003
594#define ID_SELECT_ALL_LAYERS 13004
595#define ID_DESELECT_ALL_LAYERS 13005
596#define ID_STACKUP_ORDER 13006
597
598
599// A helper function to show a popup menu, when the dialog is right clicked.
600void DIALOG_PLOT::OnRightClickLayers( wxMouseEvent& event )
601{
602 // Build a list of layers for usual fabrication: copper layers + tech layers without courtyard
603 LSET fab_layer_set = ( LSET::AllCuMask() | LSET::AllTechMask() ) & ~LSET( { B_CrtYd, F_CrtYd } );
604
605 wxMenu menu;
606 menu.Append( new wxMenuItem( &menu, ID_LAYER_FAB, _( "Select Fab Layers" ) ) );
607
608 menu.AppendSeparator();
609 menu.Append( new wxMenuItem( &menu, ID_SELECT_COPPER_LAYERS, _( "Select All Copper Layers" ) ) );
610 menu.Append( new wxMenuItem( &menu, ID_DESELECT_COPPER_LAYERS, _( "Deselect All Copper Layers" ) ) );
611
612 menu.AppendSeparator();
613 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
614 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
615
616 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
617 [&]( wxCommandEvent& aCmd )
618 {
619 switch( aCmd.GetId() )
620 {
621 case ID_LAYER_FAB: // Select layers usually needed to build a board
622 {
623 for( unsigned i = 0; i < m_layerList.size(); i++ )
624 {
625 LSET layermask( { m_layerList[ i ] } );
626
627 if( ( layermask & fab_layer_set ).any() )
628 m_layerCheckListBox->Check( i, true );
629 else
630 m_layerCheckListBox->Check( i, false );
631 }
632
633 break;
634 }
635
637 for( unsigned i = 0; i < m_layerList.size(); i++ )
638 {
639 if( IsCopperLayer( m_layerList[i] ) )
640 m_layerCheckListBox->Check( i, true );
641 }
642
643 break;
644
646 for( unsigned i = 0; i < m_layerList.size(); i++ )
647 {
648 if( IsCopperLayer( m_layerList[i] ) )
649 m_layerCheckListBox->Check( i, false );
650 }
651
652 break;
653
655 for( unsigned i = 0; i < m_layerList.size(); i++ )
656 m_layerCheckListBox->Check( i, true );
657
658 break;
659
661 for( unsigned i = 0; i < m_layerList.size(); i++ )
662 m_layerCheckListBox->Check( i, false );
663
664 break;
665
666 default:
667 aCmd.Skip();
668 }
669 } );
670
671 PopupMenu( &menu );
672}
673
674
675void DIALOG_PLOT::OnRightClickAllLayers( wxMouseEvent& event )
676{
677 wxMenu menu;
678 menu.Append( new wxMenuItem( &menu, ID_SELECT_ALL_LAYERS, _( "Select All Layers" ) ) );
679 menu.Append( new wxMenuItem( &menu, ID_DESELECT_ALL_LAYERS, _( "Deselect All Layers" ) ) );
680
681 menu.AppendSeparator();
682 menu.Append( new wxMenuItem( &menu, ID_STACKUP_ORDER, _( "Order as Board Stackup" ) ) );
683
684 menu.Bind( wxEVT_COMMAND_MENU_SELECTED,
685 [&]( wxCommandEvent& aCmd )
686 {
687 switch( aCmd.GetId() )
688 {
689 case ID_SELECT_ALL_LAYERS:
690 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
691 m_plotAllLayersList->Check( i, true );
692
693 break;
694
695 case ID_DESELECT_ALL_LAYERS:
696 for( unsigned i = 0; i < m_plotAllLayersList->GetCount(); i++ )
697 m_plotAllLayersList->Check( i, false );
698
699 break;
700
701 case ID_STACKUP_ORDER:
702 {
703 LSEQ stackup = m_editFrame->GetBoard()->GetEnabledLayers().SeqStackupForPlotting();
704 arrangeAllLayersList( stackup );
705 m_plotAllLayersList->Select( -1 );
706 break;
707 }
708
709 default:
710 aCmd.Skip();
711 }
712 } );
713
714 PopupMenu( &menu );
715}
716
717
718void DIALOG_PLOT::CreateDrillFile( wxCommandEvent& event )
719{
720 // Be sure drill file use the same settings (axis option, plot directory) as plot files:
722
723 DIALOG_GENDRILL dlg( m_editFrame, this );
724 dlg.ShowModal();
725
726 // a few plot settings can be modified: take them in account
728 reInitDialog();
729}
730
731
732void DIALOG_PLOT::OnChangeDXFPlotMode( wxCommandEvent& event )
733{
734 // m_DXF_plotTextStrokeFontOpt is disabled if m_DXF_plotModeOpt is checked (plot in DXF
735 // polygon mode)
736 m_DXF_plotTextStrokeFontOpt->Enable( !m_DXF_plotModeOpt->GetValue() );
737
738 // if m_DXF_plotTextStrokeFontOpt option is disabled (plot DXF in polygon mode), force
739 // m_DXF_plotTextStrokeFontOpt to true to use Pcbnew stroke font
740 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() )
741 m_DXF_plotTextStrokeFontOpt->SetValue( true );
742}
743
744
745void DIALOG_PLOT::OnSetScaleOpt( wxCommandEvent& event )
746{
747 /* Disable sheet reference for scale != 1:1 */
748 bool scale1 = ( m_scaleOpt->GetSelection() == 1 );
749
750 m_plotSheetRef->Enable( scale1 );
751
752 if( !scale1 )
753 m_plotSheetRef->SetValue( false );
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 msg.Printf( _( "Do you want to use a path relative to\n'%s'?" ), defaultPath );
789
790 wxMessageDialog dialog( this, msg, _( "Plot Output Directory" ),
791 wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT );
792
793 if( dialog.ShowModal() == wxID_YES )
794 dirName.MakeRelativeTo( defaultPath );
795 }
796
797 m_outputDirectoryName->SetValue( dirName.GetFullPath() );
798}
799
800
802{
803 // plot format id's are ordered like displayed in m_plotFormatOpt
804 static const PLOT_FORMAT plotFmt[] = {
805 PLOT_FORMAT::GERBER,
806 PLOT_FORMAT::POST,
807 PLOT_FORMAT::SVG,
808 PLOT_FORMAT::DXF,
809 PLOT_FORMAT::HPGL,
810 PLOT_FORMAT::PDF };
811
812 return plotFmt[m_plotFormatOpt->GetSelection()];
813}
814
815
816void DIALOG_PLOT::SetPlotFormat( wxCommandEvent& event )
817{
818 // this option exist only in DXF format:
819 m_DXF_plotModeOpt->Enable( getPlotFormat() == PLOT_FORMAT::DXF );
820
821 // The alert message about non 0 solder mask min width and margin is shown
822 // only in gerber format and if min mask width or mask margin is not 0
823 BOARD* board = m_editFrame->GetBoard();
824 const BOARD_DESIGN_SETTINGS& brd_settings = board->GetDesignSettings();
825
826 if( getPlotFormat() == PLOT_FORMAT::GERBER
827 && ( brd_settings.m_SolderMaskExpansion || brd_settings.m_SolderMaskMinWidth ) )
828 {
830 }
831 else
832 {
834 }
835
836 switch( getPlotFormat() )
837 {
838 case PLOT_FORMAT::SVG:
839 case PLOT_FORMAT::PDF:
840 m_drillShapeOpt->Enable( true );
841 m_plotModeOpt->Enable( false );
843 m_plotMirrorOpt->Enable( true );
844 m_useAuxOriginCheckBox->Enable( true );
845 m_defaultPenSize.Enable( false );
846 m_scaleOpt->Enable( false );
847 m_scaleOpt->SetSelection( 1 );
848 m_fineAdjustXCtrl->Enable( false );
849 m_fineAdjustYCtrl->Enable( false );
851 m_plotPSNegativeOpt->Enable( true );
852 m_forcePSA4OutputOpt->Enable( false );
853 m_forcePSA4OutputOpt->SetValue( false );
854
855 if( getPlotFormat() == PLOT_FORMAT::SVG )
856 {
859 }
860 else
861 {
864 }
865
870 break;
871
872 case PLOT_FORMAT::POST:
873 m_drillShapeOpt->Enable( true );
874 m_plotModeOpt->Enable( true );
875 m_plotMirrorOpt->Enable( true );
876 m_useAuxOriginCheckBox->Enable( false );
877 m_useAuxOriginCheckBox->SetValue( false );
878 m_defaultPenSize.Enable( false );
879 m_scaleOpt->Enable( true );
880 m_fineAdjustXCtrl->Enable( true );
881 m_fineAdjustYCtrl->Enable( true );
883 m_plotPSNegativeOpt->Enable( true );
884 m_forcePSA4OutputOpt->Enable( true );
885
892 break;
893
894 case PLOT_FORMAT::GERBER:
895 m_drillShapeOpt->Enable( false );
896 m_drillShapeOpt->SetSelection( 0 );
897 m_plotModeOpt->Enable( false );
899 m_plotMirrorOpt->Enable( false );
900 m_plotMirrorOpt->SetValue( false );
901 m_useAuxOriginCheckBox->Enable( true );
902 m_defaultPenSize.Enable( false );
903 m_scaleOpt->Enable( false );
904 m_scaleOpt->SetSelection( 1 );
905 m_fineAdjustXCtrl->Enable( false );
906 m_fineAdjustYCtrl->Enable( false );
908 m_plotPSNegativeOpt->Enable( false );
909 m_plotPSNegativeOpt->SetValue( false );
910 m_forcePSA4OutputOpt->Enable( false );
911 m_forcePSA4OutputOpt->SetValue( false );
912
919 break;
920
921 case PLOT_FORMAT::HPGL:
922 m_drillShapeOpt->Enable( true );
923 m_plotModeOpt->Enable( true );
924 m_plotMirrorOpt->Enable( true );
925 m_useAuxOriginCheckBox->Enable( false );
926 m_useAuxOriginCheckBox->SetValue( false );
927 m_defaultPenSize.Enable( true );
928 m_scaleOpt->Enable( true );
929 m_fineAdjustXCtrl->Enable( false );
930 m_fineAdjustYCtrl->Enable( false );
932 m_plotPSNegativeOpt->SetValue( false );
933 m_plotPSNegativeOpt->Enable( false );
934 m_forcePSA4OutputOpt->Enable( true );
935
942 break;
943
944 case PLOT_FORMAT::DXF:
945 m_drillShapeOpt->Enable( true );
946 m_plotModeOpt->Enable( false );
948 m_plotMirrorOpt->Enable( false );
949 m_plotMirrorOpt->SetValue( false );
950 m_useAuxOriginCheckBox->Enable( true );
951 m_defaultPenSize.Enable( false );
952 m_scaleOpt->Enable( false );
953 m_scaleOpt->SetSelection( 1 );
954 m_fineAdjustXCtrl->Enable( false );
955 m_fineAdjustYCtrl->Enable( false );
957 m_plotPSNegativeOpt->Enable( false );
958 m_plotPSNegativeOpt->SetValue( false );
959 m_forcePSA4OutputOpt->Enable( false );
960 m_forcePSA4OutputOpt->SetValue( false );
961
968
969 OnChangeDXFPlotMode( event );
970 break;
971
972 case PLOT_FORMAT::UNDEFINED:
973 break;
974 }
975
976 /* Update the interlock between scale and frame reference
977 * (scaling would mess up the frame border...) */
978 OnSetScaleOpt( event );
979
980 Layout();
981 m_MainSizer->SetSizeHints( this );
982}
983
984
985// A helper function to "clip" aValue between aMin and aMax and write result in * aResult
986// return false if clipped, true if aValue is just copied into * aResult
987static bool setDouble( double* aResult, double aValue, double aMin, double aMax )
988{
989 if( aValue < aMin )
990 {
991 *aResult = aMin;
992 return false;
993 }
994 else if( aValue > aMax )
995 {
996 *aResult = aMax;
997 return false;
998 }
999
1000 *aResult = aValue;
1001 return true;
1002}
1003
1004
1005static bool setInt( int* aResult, int aValue, int aMin, int aMax )
1006{
1007 if( aValue < aMin )
1008 {
1009 *aResult = aMin;
1010 return false;
1011 }
1012 else if( aValue > aMax )
1013 {
1014 *aResult = aMax;
1015 return false;
1016 }
1017
1018 *aResult = aValue;
1019 return true;
1020}
1021
1022
1024{
1025 REPORTER& reporter = m_messagesPanel->Reporter();
1026 PCB_PLOT_PARAMS tempOptions;
1027
1028 tempOptions.SetSubtractMaskFromSilk( m_subtractMaskFromSilk->GetValue() );
1029 tempOptions.SetPlotFrameRef( m_plotSheetRef->GetValue() );
1030 tempOptions.SetSketchPadsOnFabLayers( m_sketchPadsOnFabLayers->GetValue() );
1031 tempOptions.SetPlotPadNumbers( m_plotPadNumbers->GetValue() );
1032 tempOptions.SetHideDNPFPsOnFabLayers( m_plotDNP->GetValue()
1033 && m_hideDNP->GetValue() );
1034 tempOptions.SetSketchDNPFPsOnFabLayers( m_plotDNP->GetValue()
1035 && m_crossoutDNP->GetValue() );
1036 tempOptions.SetCrossoutDNPFPsOnFabLayers( m_plotDNP->GetValue()
1037 && m_crossoutDNP->GetValue() );
1038 tempOptions.SetUseAuxOrigin( m_useAuxOriginCheckBox->GetValue() );
1039 tempOptions.SetScaleSelection( m_scaleOpt->GetSelection() );
1040
1041 int sel = m_drillShapeOpt->GetSelection();
1042 tempOptions.SetDrillMarksType( static_cast<DRILL_MARKS>( sel ) );
1043
1044 tempOptions.SetMirror( m_plotMirrorOpt->GetValue() );
1045 tempOptions.SetPlotMode( m_plotModeOpt->GetSelection() == 1 ? SKETCH : FILLED );
1046 tempOptions.SetDXFPlotPolygonMode( m_DXF_plotModeOpt->GetValue() );
1047
1048 sel = m_DXF_plotUnits->GetSelection();
1049 tempOptions.SetDXFPlotUnits( sel == 0 ? DXF_UNITS::INCH : DXF_UNITS::MM );
1050
1051 if( !m_DXF_plotTextStrokeFontOpt->IsEnabled() ) // Currently, only DXF supports this option
1052 tempOptions.SetTextMode( PLOT_TEXT_MODE::DEFAULT );
1053 else
1054 tempOptions.SetTextMode( m_DXF_plotTextStrokeFontOpt->GetValue() ? PLOT_TEXT_MODE::DEFAULT :
1055 PLOT_TEXT_MODE::NATIVE );
1056
1057 if( getPlotFormat() == PLOT_FORMAT::SVG )
1058 {
1059 tempOptions.SetBlackAndWhite( m_SVGColorChoice->GetSelection() == 1 );
1060 }
1061 else if( getPlotFormat() == PLOT_FORMAT::PDF )
1062 {
1063 tempOptions.SetBlackAndWhite( m_PDFColorChoice->GetSelection() == 1 );
1064 tempOptions.m_PDFFrontFPPropertyPopups = m_frontFPPropertyPopups->GetValue();
1065 tempOptions.m_PDFBackFPPropertyPopups = m_backFPPropertyPopups->GetValue();
1066 tempOptions.m_PDFMetadata = m_pdfMetadata->GetValue();
1067 tempOptions.m_PDFSingle = m_pdfSingle->GetValue();
1068 }
1069 else
1070 {
1071 tempOptions.SetBlackAndWhite( true );
1072 }
1073
1074 // Update settings from text fields. Rewrite values back to the fields,
1075 // since the values may have been constrained by the setters.
1076 wxString msg;
1077
1078 // read HPLG pen size (this param is stored in mils)
1079 // However, due to issues when converting this value from or to mm
1080 // that can slightly change the value, update this param only if it
1081 // is in use
1082 if( getPlotFormat() == PLOT_FORMAT::HPGL )
1083 {
1085 {
1087 msg.Printf( _( "HPGL pen size constrained." ) );
1088 reporter.Report( msg, RPT_SEVERITY_INFO );
1089 }
1090 }
1091 else // keep the last value (initial value if no HPGL plot made)
1092 {
1094 }
1095
1096 // X scale
1097 double tmpDouble;
1098 msg = m_fineAdjustXCtrl->GetValue();
1099 msg.ToDouble( &tmpDouble );
1100
1102 {
1103 msg.Printf( wxT( "%f" ), m_XScaleAdjust );
1104 m_fineAdjustXCtrl->SetValue( msg );
1105 msg.Printf( _( "X scale constrained." ) );
1106 reporter.Report( msg, RPT_SEVERITY_INFO );
1107 }
1108
1109 // Y scale
1110 msg = m_fineAdjustYCtrl->GetValue();
1111 msg.ToDouble( &tmpDouble );
1112
1114 {
1115 msg.Printf( wxT( "%f" ), m_YScaleAdjust );
1116 m_fineAdjustYCtrl->SetValue( msg );
1117 msg.Printf( _( "Y scale constrained." ) );
1118 reporter.Report( msg, RPT_SEVERITY_INFO );
1119 }
1120
1121 auto cfg = m_editFrame->GetPcbNewSettings();
1122
1124 cfg->m_Plot.fine_scale_y = m_YScaleAdjust;
1125
1126 cfg->m_Plot.check_zones_before_plotting = m_zoneFillCheck->GetValue();
1127
1128 // PS Width correction
1131 {
1133 msg.Printf( _( "Width correction constrained. The width correction value must be in the"
1134 " range of [%s; %s] for the current design rules." ),
1137 reporter.Report( msg, RPT_SEVERITY_WARNING );
1138 }
1139
1140 // Store m_PSWidthAdjust in mm in user config
1141 cfg->m_Plot.ps_fine_width_adjust = pcbIUScale.IUTomm( m_PSWidthAdjust );
1142
1143 tempOptions.SetFormat( getPlotFormat() );
1144
1145 tempOptions.SetDisableGerberMacros( m_disableApertMacros->GetValue() );
1146 tempOptions.SetUseGerberProtelExtensions( m_useGerberExtensions->GetValue() );
1147 tempOptions.SetUseGerberX2format( m_useGerberX2Format->GetValue() );
1148 tempOptions.SetIncludeGerberNetlistInfo( m_useGerberNetAttributes->GetValue() );
1149 tempOptions.SetCreateGerberJobFile( m_generateGerberJobFile->GetValue() );
1150
1151 tempOptions.SetGerberPrecision( m_coordFormatCtrl->GetSelection() == 0 ? 5 : 6 );
1152 tempOptions.SetSvgPrecision( m_svgPrecsision->GetValue() );
1153 tempOptions.SetSvgFitPageToBoard( m_SVG_fitPageToBoard->GetValue() );
1154
1155 LSET selectedLayers;
1156
1157 for( unsigned i = 0; i < m_layerList.size(); i++ )
1158 {
1159 if( m_layerCheckListBox->IsChecked( i ) )
1160 selectedLayers.set( m_layerList[i] );
1161 }
1162
1163 // Get a list of copper layers that aren't being used by inverting enabled layers.
1164 LSET disabledCopperLayers = LSET::AllCuMask() & ~m_editFrame->GetBoard()->GetEnabledLayers();
1165
1166 // Add selected layers from plot on all layers list in order set by user.
1167 wxArrayInt plotOnAllLayers;
1168 LSEQ commonLayers;
1169
1170 if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
1171 {
1172 size_t count = plotOnAllLayers.GetCount();
1173
1174 for( size_t i = 0; i < count; i++ )
1175 {
1176 int index = plotOnAllLayers.Item( i );
1177 PCB_LAYER_ID client_layer = getLayerClientData( m_plotAllLayersList, index )->Layer();
1178
1179 commonLayers.push_back( client_layer );
1180 }
1181 }
1182
1183 tempOptions.SetPlotOnAllLayersSequence( commonLayers );
1184
1185 // Enable all of the disabled copper layers.
1186 // If someone enables more copper layers they will be selected by default.
1187 selectedLayers = selectedLayers | disabledCopperLayers;
1188 tempOptions.SetLayerSelection( selectedLayers );
1189
1190 tempOptions.SetNegative( m_plotPSNegativeOpt->GetValue() );
1191 tempOptions.SetA4Output( m_forcePSA4OutputOpt->GetValue() );
1192
1193 // Set output directory and replace backslashes with forward ones
1194 wxString dirStr;
1195 dirStr = m_outputDirectoryName->GetValue();
1196 dirStr.Replace( wxT( "\\" ), wxT( "/" ) );
1197 tempOptions.SetOutputDirectory( dirStr );
1199
1200 if( !m_job && !m_plotOpts.IsSameAs( tempOptions ) )
1201 {
1202 m_editFrame->SetPlotSettings( tempOptions );
1204 m_plotOpts = tempOptions;
1205 }
1206 else
1207 {
1208 m_plotOpts = tempOptions;
1209 }
1210}
1211
1212
1213void DIALOG_PLOT::OnGerberX2Checked( wxCommandEvent& event )
1214{
1215 // Currently: do nothing
1216}
1217
1218
1219void DIALOG_PLOT::Plot( wxCommandEvent& event )
1220{
1221 if( m_job )
1222 {
1225 EndModal( wxID_OK );
1226 }
1227 else
1228 {
1229 BOARD* board = m_editFrame->GetBoard();
1230
1232
1234 PCBNEW_SETTINGS* cfg = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
1235
1237
1239
1240 // If no layer selected, we have nothing plotted.
1241 // Prompt user if it happens because he could think there is a bug in Pcbnew.
1242 if( !m_plotOpts.GetLayerSelection().any() )
1243 {
1244 DisplayError( this, _( "No layer selected, Nothing to plot" ) );
1245 return;
1246 }
1247
1248 // Create output directory if it does not exist (also transform it in absolute form).
1249 // Bail if it fails.
1250
1251 std::function<bool( wxString* )> textResolver =
1252 [&]( wxString* token ) -> bool
1253 {
1254 // Handles board->GetTitleBlock() *and* board->GetProject()
1255 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
1256 };
1257
1258 wxString path = m_plotOpts.GetOutputDirectory();
1259 path = ExpandTextVars( path, &textResolver );
1261
1262 wxFileName outputDir = wxFileName::DirName( path );
1263 wxString boardFilename = m_editFrame->GetBoard()->GetFileName();
1264 REPORTER& reporter = m_messagesPanel->Reporter();
1265
1266 if( !EnsureFileDirectoryExists( &outputDir, boardFilename, &reporter ) )
1267 {
1268 wxString msg;
1269 msg.Printf( _( "Could not write plot files to folder '%s'." ), outputDir.GetPath() );
1270 DisplayError( this, msg );
1271 return;
1272 }
1273
1274 if( m_zoneFillCheck->GetValue() )
1275 m_editFrame->GetToolManager()->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( this );
1276
1277 m_plotOpts.SetAutoScale( false );
1278
1279 switch( m_plotOpts.GetScaleSelection() )
1280 {
1281 default: m_plotOpts.SetScale( 1 ); break;
1282 case 0: m_plotOpts.SetAutoScale( true ); break;
1283 case 2: m_plotOpts.SetScale( 1.5 ); break;
1284 case 3: m_plotOpts.SetScale( 2 ); break;
1285 case 4: m_plotOpts.SetScale( 3 ); break;
1286 }
1287
1288 /* If the scale factor edit controls are disabled or the scale value
1289 * is 0, don't adjust the base scale factor. This fixes a bug when
1290 * the default scale adjust is initialized to 0 and saved in program
1291 * settings resulting in a divide by zero fault.
1292 */
1293 if( getPlotFormat() == PLOT_FORMAT::POST )
1294 {
1295 if( m_XScaleAdjust != 0.0 )
1297
1298 if( m_YScaleAdjust != 0.0 )
1300
1302 }
1303
1304 // Test for a reasonable scale value
1305 // XXX could this actually happen? isn't it constrained in the apply function?
1307 DisplayInfoMessage( this, _( "Warning: Scale option set to a very small value" ) );
1308
1310 DisplayInfoMessage( this, _( "Warning: Scale option set to a very large value" ) );
1311
1312
1313 // Save the current plot options in the board
1315
1316 LOCALE_IO dummy; // Ensure the "C3 locale is used by the plotter
1317 PCB_PLOTTER pcbPlotter( m_editFrame->GetBoard(), &reporter, m_plotOpts );
1318
1319 LSEQ layersToPlot = m_plotOpts.GetLayerSelection().UIOrder();
1320
1321 wxArrayInt plotOnAllLayers;
1322 LSEQ commonLayers;
1323
1324 if( m_plotAllLayersList->GetCheckedItems( plotOnAllLayers ) )
1325 {
1326 size_t count = plotOnAllLayers.GetCount();
1327
1328 for( size_t i = 0; i < count; i++ )
1329 {
1330 int index = plotOnAllLayers.Item( i );
1331 PCB_LAYER_ID client_layer = getLayerClientData( m_plotAllLayersList, index )->Layer();
1332
1333 commonLayers.push_back( client_layer );
1334 }
1335 }
1336
1337 pcbPlotter.Plot( outputDir.GetPath(), layersToPlot, commonLayers,
1338 m_useGerberExtensions->GetValue() );
1339 }
1340}
1341
1342
1343
1344void DIALOG_PLOT::onRunDRC( wxCommandEvent& event )
1345{
1346 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1347
1348 if( parent )
1349 {
1350 DRC_TOOL* drcTool = parent->GetToolManager()->GetTool<DRC_TOOL>();
1351
1352 // First close an existing dialog if open
1353 // (low probability, but can happen)
1354 drcTool->DestroyDRCDialog();
1355
1356 // Open a new drc dialog, with the right parent frame, and in Modal Mode
1357 drcTool->ShowDRCDialog( this );
1358
1359 // Update DRC warnings on return to this dialog
1360 reInitDialog();
1361 }
1362}
1363
1364
1365void DIALOG_PLOT::onOpenOutputDirectory( wxCommandEvent& event )
1366{
1367 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
1368 {
1369 return m_editFrame->GetBoard()->ResolveTextVar( token, 0 );
1370 };
1371
1372 wxString path = m_outputDirectoryName->GetValue();
1373 path = ExpandTextVars( path, &textResolver );
1375 path = Prj().AbsolutePath( path );
1376
1377 if( !wxDirExists( path ) )
1378 {
1379 DisplayError( this, wxString::Format( _( "Directory '%s' does not exist." ), path ) );
1380 return;
1381 }
1382
1383 wxLaunchDefaultApplication( path );
1384}
1385
1386
1387void DIALOG_PLOT::onBoardSetup( wxHyperlinkEvent& aEvent )
1388{
1389 PCB_EDIT_FRAME* parent = dynamic_cast<PCB_EDIT_FRAME*>( GetParent() );
1390
1391 if( parent )
1392 {
1393 parent->ShowBoardSetupDialog( _( "Solder Mask/Paste" ) );
1394
1395 // Update warnings on return to this dialog
1396 reInitDialog();
1397 }
1398}
1399
1400
1401void DIALOG_PLOT::onPlotAllListMoveUp( wxCommandEvent& aEvent )
1402{
1403 if( m_plotAllLayersList->CanMoveCurrentUp() )
1404 m_plotAllLayersList->MoveCurrentUp();
1405}
1406
1407
1408void DIALOG_PLOT::onPlotAllListMoveDown( wxCommandEvent& aEvent )
1409{
1410 if( m_plotAllLayersList->CanMoveCurrentDown() )
1411 m_plotAllLayersList->MoveCurrentDown();
1412}
1413
1414
1415void DIALOG_PLOT::onDNPCheckbox( wxCommandEvent& aEvent )
1416{
1417 m_hideDNP->Enable( aEvent.IsChecked() );
1418 m_crossoutDNP->Enable( aEvent.IsChecked() );
1419}
1420
1421
1422void DIALOG_PLOT::onSketchPads( wxCommandEvent& aEvent )
1423{
1424 m_plotPadNumbers->Enable( aEvent.IsChecked() );
1425}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition: bitmap.cpp:110
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:218
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:297
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:434
const MARKERS & Markers() const
Definition: board.h:346
const wxString & GetFileName() const
Definition: board.h:334
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:614
PROJECT * GetProject() const
Definition: board.h:511
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:946
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:829
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
wxStaticBoxSizer * m_HPGLOptionsSizer
wxCheckBox * m_useAuxOriginCheckBox
wxStaticBoxSizer * m_PSOptionsSizer
STD_BITMAP_BUTTON * m_openDirButton
wxCheckBox * m_plotPSNegativeOpt
wxCheckBox * m_SVG_fitPageToBoard
wxCheckBox * m_DXF_plotTextStrokeFontOpt
wxChoice * m_plotModeOpt
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
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
static LSET s_lastAllLayersSet
Definition: dialog_plot.h:116
DIALOG_PLOT(PCB_EDIT_FRAME *aEditFrame)
Definition: dialog_plot.cpp:93
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:119
JOB_EXPORT_PCB_PLOT * m_job
Definition: dialog_plot.h:112
PCB_PLOT_PARAMS m_plotOpts
Definition: dialog_plot.h:105
STD_BITMAP_BUTTON * m_bpMoveUp
Definition: dialog_plot.h:109
void onPlotAllListMoveUp(wxCommandEvent &aEvent)
void OnChangeDXFPlotMode(wxCommandEvent &event) override
int m_widthAdjustMinValue
Definition: dialog_plot.h:97
UNIT_BINDER m_trackWidthCorrection
Definition: dialog_plot.h:101
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:93
wxString m_DRCWarningTemplate
Definition: dialog_plot.h:103
void setPlotModeChoiceSelection(OUTLINE_MODE aPlotMode)
Definition: dialog_plot.h:77
wxRearrangeList * m_plotAllLayersList
Definition: dialog_plot.h:107
void onPlotAllListMoveDown(wxCommandEvent &aEvent)
void onRunDRC(wxCommandEvent &event) override
void arrangeAllLayersList(const LSEQ &aSeq)
double m_YScaleAdjust
Definition: dialog_plot.h:91
void onOpenOutputDirectory(wxCommandEvent &event) override
void OnSetScaleOpt(wxCommandEvent &event) override
PCB_EDIT_FRAME * m_editFrame
Definition: dialog_plot.h:87
virtual ~DIALOG_PLOT()
STD_BITMAP_BUTTON * m_bpMoveDown
Definition: dialog_plot.h:110
void CreateDrillFile(wxCommandEvent &event) override
void onDNPCheckbox(wxCommandEvent &event) override
UNIT_BINDER m_defaultPenSize
Definition: dialog_plot.h:100
double m_XScaleAdjust
Definition: dialog_plot.h:89
PLOT_FORMAT getPlotFormat()
static LSET s_lastLayerSet
The plot layer set that last time the dialog was opened.
Definition: dialog_plot.h:115
void transferPlotParamsToJob()
int m_widthAdjustMaxValue
Definition: dialog_plot.h:98
void onOutputDirectoryBrowseClicked(wxCommandEvent &event) override
void OnGerberX2Checked(wxCommandEvent &event) override
void init_Dialog()
void SetPlotFormat(wxCommandEvent &event) override
LSEQ m_layerList
Definition: dialog_plot.h:88
void SetupStandardButtons(std::map< int, wxString > aLabels={})
std::string m_hash_key
Definition: dialog_shim.h:194
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,...
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
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: 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:736
LSEQ SeqStackupForPlotting() const
Return the sequence that is typical for a bottom-to-top stack-up.
Definition: lset.cpp:388
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:583
static const LSET & AllTechMask()
Return a mask holding all technical layers (no CU layer) on both side.
Definition: lset.cpp:662
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:69
PCB_LAYER_ID Layer() const
Definition: dialog_plot.cpp:80
void SetData(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:79
PCB_LAYER_ID_CLIENT_DATA(PCB_LAYER_ID aId)
Definition: dialog_plot.cpp:75
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:49
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)
void SetSketchPadsOnFabLayers(bool aFlag)
void SetUseGerberX2format(bool aUse)
bool GetMirror() const
DXF_UNITS GetDXFPlotUnits() const
void SetA4Output(int aForce)
PLOT_TEXT_MODE GetTextMode() const
bool GetCrossoutDNPFPsOnFabLayers() const
bool GetSketchDNPFPsOnFabLayers() const
void SetPlotOnAllLayersSequence(LSEQ aSeq)
void SetDXFPlotPolygonMode(bool aFlag)
void SetAutoScale(bool aFlag)
double GetHPGLPenDiameter() const
unsigned GetSvgPrecision() const
void SetPlotFrameRef(bool aFlag)
void SetSketchDNPFPsOnFabLayers(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)
bool GetSvgFitPagetoBoard() const
LSET GetLayerSelection() const
wxString GetOutputDirectory() const
int GetScaleSelection() 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 SetGerberPrecision(int aPrecision)
void SetSubtractMaskFromSilk(bool aSubtract)
bool GetSketchPadsOnFabLayers() const
void SetHideDNPFPsOnFabLayers(bool aFlag)
bool GetSubtractMaskFromSilk() const
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)
void SetCreateGerberJobFile(bool aCreate)
bool GetIncludeGerberNetlistInfo() const
bool m_PDFSingle
Generate a single PDF file for all layers.
void SetNegative(bool aFlag)
void SetPlotMode(OUTLINE_MODE aPlotMode)
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)
OUTLINE_MODE GetPlotMode() const
void SetWidthAdjust(int aVal)
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
The backing store for a PROJECT, in JSON format.
Definition: project_file.h:73
wxString m_PcbLastPath[LAST_PATH_SIZE]
MRU path storage.
Definition: project_file.h:173
virtual PROJECT_FILE & GetProjectFile() const
Definition: project.h:203
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:370
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
T * GetAppSettings(const char *aFilename)
Return a handle to the a given settings by type.
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieve 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)
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)
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:351
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:372
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:221
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
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:87
#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
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition: layer_ids.h:663
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:277
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
@ SKETCH
Definition: outline_mode.h:26
#define PLOT_MIN_SCALE
Definition: pcbplot.h:57
#define PLOT_MAX_SCALE
Definition: pcbplot.h:58
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
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
Plotting engines similar to ps (PostScript, Gerber, svg)
@ LAST_PATH_PLOT
Definition: project_file.h:59
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_EXCLUSION
@ RPT_SEVERITY_INFO
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:403
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
Definition of file extensions used in Kicad.