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