KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_plotter.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, see <https://www.gnu.org/licenses/>.
18 */
19
20#include <pcb_plotter.h>
21#include <common.h>
22#include <plotters/plotter.h>
24#include <board.h>
25#include <board_loader.h>
26#include <footprint.h>
27#include <pad.h>
28#include <project.h>
30#include <pcb_drill_chart.h>
31#include <reporter.h>
32#include <pcbplot.h>
33#include <wx/filename.h>
42#include <pgm_base.h>
43#include <pcbnew_settings.h>
45#include <math/util.h> // for KiROUND
46
47
48static int scaleToSelection( double scale )
49{
50 int selection = 1;
51
52 if( scale == 0.0 ) selection = 0;
53 else if( scale == 1.5 ) selection = 2;
54 else if( scale == 2.0 ) selection = 3;
55 else if( scale == 3.0 ) selection = 4;
56
57 return selection;
58}
59
60
61PCB_PLOTTER::PCB_PLOTTER( BOARD* aBoard, REPORTER* aReporter, PCB_PLOT_PARAMS& aParams ) :
62 m_board( aBoard ),
63 m_plotOpts( aParams ),
64 m_reporter( aReporter )
65{
66}
67
68
69bool PCB_PLOTTER::Plot( const wxString& aOutputPath, const LSEQ& aLayersToPlot,
70 const LSEQ& aCommonLayers, bool aUseGerberFileExtensions,
71 bool aOutputPathIsSingle, std::optional<wxString> aLayerName,
72 std::optional<wxString> aSheetName, std::optional<wxString> aSheetPath,
73 std::vector<wxString>* aOutputFiles )
74{
75 std::function<bool( wxString* )> textResolver =
76 [&]( wxString* token ) -> bool
77 {
78 // Handles board->GetTitleBlock() *and* board->GetProject()
79 return m_board->ResolveTextVar( token, 0 );
80 };
81
82 // sanity, ensure one layer to print
83 if( aLayersToPlot.size() < 1 )
84 {
85 if( m_reporter )
86 m_reporter->Report( _( "No layers selected for plotting." ), RPT_SEVERITY_ERROR );
87
88 return false;
89 }
90
91 // The one path GUI plotting, PNG, PS and every CLI plot job share. Common layers are
92 // included or a chart plotted as one slips past the policy
93 LSET plotted( { aLayersToPlot } );
94 plotted |= LSET( { aCommonLayers } );
95
97
98 PAGE_INFO existingPageInfo = m_board->GetPageSettings();
99 VECTOR2I existingAuxOrigin = m_board->GetDesignSettings().GetAuxOrigin();
100
101 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() ) // Page is board boundary size
102 {
103 BOX2I bbox = m_board->ComputeBoundingBox( false, false );
104 SHAPE_POLY_SET boardOutlines;
105
106 // Board outline geometry is better if it exists so that origin is not influenced by Edge.Cuts line width
107 if( m_board->GetBoardPolygonOutlines( boardOutlines, false ) && boardOutlines.OutlineCount() > 0 )
108 bbox = boardOutlines.BBox();
109
110 PAGE_INFO currPageInfo = m_board->GetPageSettings();
111
112 currPageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );
113 currPageInfo.SetHeightMils( bbox.GetHeight() / pcbIUScale.IU_PER_MILS );
114
115 m_board->SetPageSettings( currPageInfo );
116 m_plotOpts.SetUseAuxOrigin( true );
117
118 // Keep the origin at the board origin so it lands on the SVG origin. The SVG
119 // plotter was given the bounding box to build its viewBox from elsewhere.
120 m_board->GetDesignSettings().SetAuxOrigin( VECTOR2I( 0, 0 ) );
121 }
122
123 // To reuse logic, in single plot mode, we want to kick any extra layers from the main list to commonLayers
124 LSEQ layersToPlot;
125 LSEQ commonLayers;
126
127 const bool isPdfMultiPage =
128 ( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle );
129
130 if( aOutputPathIsSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() && !isPdfMultiPage )
131 {
132 layersToPlot.push_back( aLayersToPlot[0] );
133
134 if( aLayersToPlot.size() > 1 )
135 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1, aLayersToPlot.end() );
136 }
137 else
138 {
139 layersToPlot = aLayersToPlot;
140 commonLayers = aCommonLayers;
141 }
142
143 int finalPageCount = 0;
144 std::vector<std::pair<PCB_LAYER_ID, wxString>> layersToExport;
145
146 // Skip the disabled copper layers and build the layer ID -> layer name mapping for plotter
147 // DXF plotter will use this information to name its layers
148 for( PCB_LAYER_ID layer : layersToPlot )
149 {
150 if( copperLayerShouldBeSkipped( layer ) )
151 continue;
152
153 finalPageCount++;
154 layersToExport.emplace_back( layer, m_board->GetLayerName( layer ) );
155 }
156
157 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
158
159 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
160 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
161
162 PLOT_FORMAT plot_format = m_plotOpts.GetFormat();
163 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
164 wxString sheetPath;
165 wxString msg;
166 bool success = true;
167 PLOTTER* plotter = nullptr;
168 int pageNum = 1;
169
170 for( size_t i = 0; i < layersToPlot.size(); i++ )
171 {
172 PCB_LAYER_ID layer = layersToPlot[i];
173
174 if( copperLayerShouldBeSkipped( layer ) )
175 continue;
176
177 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
178 wxString layerName = m_board->GetLayerName( layer );
179 wxFileName fn;
180
181 if( aOutputPathIsSingle )
182 {
183 fn = wxFileName( aOutputPath );
184 }
185 else
186 {
187 wxFileName brdFn = m_board->GetFileName();
188 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
189
190 // Use Gerber Extensions based on layer number
191 // (See http://en.wikipedia.org/wiki/Gerber_File)
192 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
193 fileExt = GetGerberProtelExtension( layer );
194
195 if( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
197 else if ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() )
199 else
200 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
201 }
202
203 if( jobfile_writer )
204 {
205 wxString fullname = fn.GetFullName();
206 jobfile_writer->AddGbrFile( layer, fullname );
207 }
208
209 if( ( plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF )
210 || ( !m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
211 || ( pageNum == 1
212 && ( ( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
213 || ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() ) ) ) )
214 {
215 // this will only be used by pdf
216 wxString pageNumber = wxString::Format( "%d", pageNum );
217 wxString pageName = layerName;
218 wxString sheetName = layerName;
219
220 if( aLayerName.has_value() )
221 {
222 layerName = aLayerName.value();
223 pageName = aLayerName.value();
224 }
225
226 if( aSheetName.has_value() )
227 sheetName = aSheetName.value();
228
229 if( aSheetPath.has_value() )
230 sheetPath = aSheetPath.value();
231
232 m_plotOpts.SetLayersToExport( layersToExport );
233 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
234 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
235 }
236
237 if( plotter )
238 {
239 plotter->SetLayer( layer );
240 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver, FOR_GUI ) );
241
242 if( m_plotOpts.m_PDFMetadata )
243 {
244 msg = wxS( "AUTHOR" );
245
246 if( m_board->ResolveTextVar( &msg, 0 ) )
247 plotter->SetAuthor( msg );
248
249 msg = wxS( "SUBJECT" );
250
251 if( m_board->ResolveTextVar( &msg, 0 ) )
252 plotter->SetSubject( msg );
253 }
254
255 try
256 {
257 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
259 }
260 catch( ... )
261 {
262 success = false;
263 delete plotter->RenderSettings();
264 delete plotter;
265 plotter = nullptr;
266 break;
267 }
268
269 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle && pageNum != finalPageCount )
270 {
271 wxString pageNumber = wxString::Format( "%d", pageNum + 1 );
272 size_t nextI = i + 1;
273 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
274
275 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
276 {
277 ++nextI;
278 nextLayer = layersToPlot[nextI];
279 }
280
281 layerName = m_board->GetLayerName( nextLayer );
282
283 wxString pageName = layerName;
284 wxString sheetName = layerName;
285
286 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
287 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
288 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
289 sheetPath, pageNumber, finalPageCount );
290 }
291
292 // last page
293 if( (plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF)
294 || (!m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption())
295 || i == aLayersToPlot.size() - 1
296 || pageNum == finalPageCount )
297 {
298 try
299 {
300 plotter->EndPlot();
301 }
302 catch( ... )
303 {
304 success = false;
305 }
306
307 delete plotter->RenderSettings();
308 delete plotter;
309 plotter = nullptr;
310
311 if( m_reporter )
312 {
313 m_reporter->Report( wxString::Format( _( "Plotted to '%s'." ), fn.GetFullPath() ),
315 }
316
317 if( aOutputFiles )
318 aOutputFiles->push_back( fn.GetFullPath() );
319 }
320 }
321 else
322 {
323 if( m_reporter )
324 {
325 m_reporter->Report( wxString::Format( _( "Failed to create file '%s'." ), fn.GetFullPath() ),
327 }
328
329 success = false;
330 }
331
332 pageNum++;
333
334 wxSafeYield(); // displays report message.
335 }
336
337 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
338 {
339 // Pick the basename from the board file
340 wxFileName fn( m_board->GetFileName() );
341
342 // Build gerber job file from basename
343 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
344 jobfile_writer->CreateJobFile( fn.GetFullPath() );
345
346 if( aOutputFiles )
347 aOutputFiles->push_back( fn.GetFullPath() );
348 }
349
350 if( m_reporter )
351 m_reporter->ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
352
353 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
354 {
355 // restore the original page and aux origin
356 m_board->SetPageSettings( existingPageInfo );
357 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
358 }
359
360 return success;
361}
362
363
365{
366 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
367}
368
369
370void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
371 const wxString& aSuffix, const wxString& aExtension )
372{
373 // aFilename contains the base filename only (without path and extension)
374 // when calling this function.
375 // It is expected to be a valid filename (this is usually the board filename)
376 aFilename->SetPath( aOutputDir );
377
378 // Set the file extension
379 aFilename->SetExt( aExtension );
380
381 // remove leading and trailing spaces if any from the suffix, if
382 // something survives add it to the name;
383 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
384 // so change them to underscore
385 // Remember it can be called from a python script, so the illegal chars
386 // have to be filtered here.
387 wxString suffix = aSuffix;
388 suffix.Trim( true );
389 suffix.Trim( false );
390
391 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
392 badchars.Append( "%." );
393
394 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
395 suffix.Replace( badchars[ii], wxT( "_" ) );
396
397 if( !suffix.IsEmpty() )
398 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
399}
400
401
402LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
403{
404 LSEQ plotSequence;
405
406 // Base layer always gets plotted first.
407 plotSequence.push_back( aLayerToPlot );
408
409 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
410 {
411 // Don't plot the same layer more than once;
412 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
413 continue;
414
415 plotSequence.push_back( layer );
416 }
417
418 return plotSequence;
419}
420
421
423 REPORTER& aReporter )
424{
426 {
427 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
430 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
433 aOpts.SetGerberPrecision( gJob->m_precision );
434 // Always disable plot pad holes
436 }
437 else
438 {
439 // Scale, doesn't apply to GERBER
440 aOpts.SetScale( aJob->m_scale );
441 aOpts.SetAutoScale( !aJob->m_scale );
443 // Drill marks doesn't apply to GERBER
444 switch( aJob->m_drillShapeOption )
445 {
448 default:
450 }
451 }
452
454 {
455 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
456 aOpts.SetSvgPrecision( svgJob->m_precision );
457 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
458 }
459
461 {
462 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
464 : DXF_UNITS::MM );
467 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
470 }
471
473 {
474 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
477 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
478 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
480 }
481
483 {
484 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
485 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
486 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
487 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
488 aOpts.SetA4Output( psJob->m_forceA4 );
489 }
490
491 wxString theme = aJob->m_colorTheme;
492
493 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
494 if( theme.IsEmpty() )
495 {
496 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
497 theme = pcbSettings->m_ColorTheme;
498 }
499
500 COLOR_SETTINGS* colors = ::GetColorSettings( theme );
501
502 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
503 {
504 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
505 theme ),
507 }
508
510 {
511 JOB_EXPORT_PCB_PNG* pngJob = static_cast<JOB_EXPORT_PCB_PNG*>( aJob );
512 aOpts.SetPngDPI( pngJob->m_dpi );
513 aOpts.SetPngAntialias( pngJob->m_antialias );
514
515 if( pngJob->m_useBackgroundColor )
517 }
518
519 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
520 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
522 aOpts.SetPlotReference( aJob->m_plotRefDes );
523 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
528 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
529
530 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
531 aOpts.SetMirror( aJob->m_mirror );
532 aOpts.SetNegative( aJob->m_negative );
533
536
537 switch( aJob->m_plotFormat )
538 {
539 default:
544 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
547 }
548
549 aOpts.SetColorSettings( colors );
551}
552
553
554bool PlotFootprintToSVG( const FOOTPRINT& aFootprint, PROJECT& aProject,
555 const std::map<wxString, wxString>* aVarOverrides, PCB_PLOT_PARAMS& aPlotOpts,
556 const LSEQ& aLayersToPlot, const LSEQ& aLayersOnAll, const wxString& aFileName,
557 REPORTER* aReporter )
558{
559 // Plot the footprint by placing it at the origin of a temporary board; the SVG
560 // fit-to-board options make the footprint origin land on the SVG origin and size the
561 // page/viewBox to the footprint's bounding box.
562
563 // The hack for now is we create fake boards containing the footprint and plot the board
564 // until we refactor better plot api later
565 std::unique_ptr<BOARD> brd = BOARD_LOADER::CreateEmptyBoard( &aProject );
566
567 if( aVarOverrides )
568 brd->GetProject()->ApplyTextVars( *aVarOverrides );
569
570 brd->SynchronizeProperties();
571
572 FOOTPRINT* fp = dynamic_cast<FOOTPRINT*>( aFootprint.Clone() );
573
574 if( fp == nullptr )
575 return false;
576
577 fp->SetLink( niluuid );
578 fp->SetFlags( IS_NEW );
579 fp->SetParent( brd.get() );
580
581 for( PAD* pad : fp->Pads() )
582 {
583 pad->SetLocalRatsnestVisible( false );
584 pad->SetNetCode( 0 );
585 }
586
587 fp->SetOrientation( ANGLE_0 );
588 fp->SetPosition( VECTOR2I( 0, 0 ) );
589
590 brd->Add( fp, ADD_MODE::INSERT, true );
591
592 aPlotOpts.SetFormat( PLOT_FORMAT::SVG );
593 aPlotOpts.SetPlotFrameRef( false );
594 aPlotOpts.SetSvgFitPageToBoard( true );
595 aPlotOpts.SetMirror( false );
596 aPlotOpts.SetSkipPlotNPTH_Pads( false );
597
598 PCB_PLOTTER plotter( brd.get(), aReporter, aPlotOpts );
599
600 return plotter.Plot( aFileName, aLayersToPlot, aLayersOnAll, false, true, wxEmptyString, wxEmptyString,
601 wxEmptyString );
602}
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:128
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:982
static std::unique_ptr< BOARD > CreateEmptyBoard(PROJECT *aProject)
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:410
constexpr size_type GetWidth() const
Definition box2.h:211
constexpr size_type GetHeight() const
Definition box2.h:212
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition eda_item.h:158
virtual void SetParent(EDA_ITEM *aParent)
Definition eda_item.cpp:153
void SetPosition(const VECTOR2I &aPos) override
void SetLink(const KIID &aLink)
Definition footprint.h:1267
void SetOrientation(const EDA_ANGLE &aNewAngle)
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
std::deque< PAD * > & Pads()
Definition footprint.h:405
wxString m_pdfBackgroundColor
The background color specified in a hex string.
bool m_useDrillOrigin
Used by SVG/DXF/PDF/Gerbers.
LSEQ m_plotOnAllLayersSequence
Layers to include on all individual layer prints.
DRILL_MARKS m_drillShapeOption
Used by SVG & PDF.
bool m_mirror
Common Options.
wxString GetConfiguredOutputPath() const
Returns the configured output path for the job.
Definition job.h:235
wxString GetFilename() const
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
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
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition lset.cpp:595
Definition pad.h:61
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:75
void SetHeightMils(double aHeightInMils)
void SetWidthMils(double aWidthInMils)
LSEQ getPlotSequence(PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq)
Generates a final LSEQ for plotting by removing duplicates.
BOARD * m_board
Definition pcb_plotter.h:86
static void PlotJobToPlotOpts(PCB_PLOT_PARAMS &aOpts, JOB_EXPORT_PCB_PLOT *aJob, REPORTER &aReporter)
True when the board's out-of-date-chart policy regenerated charts during the last Plot().
PCB_PLOTTER(BOARD *aBoard, REPORTER *aReporter, PCB_PLOT_PARAMS &aParams)
PCB_PLOT_PARAMS m_plotOpts
Definition pcb_plotter.h:87
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, std::vector< wxString > *aOutputFiles=nullptr)
REPORTER * m_reporter
Definition pcb_plotter.h:88
bool copperLayerShouldBeSkipped(PCB_LAYER_ID aLayerToPlot)
All copper layers that are disabled are actually selected This is due to wonkyness in automatically s...
static void BuildPlotFileName(wxFileName *aFilename, const wxString &aOutputDir, const wxString &aSuffix, const wxString &aExtension)
Complete a plot filename.
Parameters and options when plotting/printing a board.
void SetDrillMarksType(DRILL_MARKS aVal)
void SetSkipPlotNPTH_Pads(bool aSkip)
void SetLayerSelection(const LSET &aSelection)
void SetOutputDirectory(const wxString &aDir)
void SetPlotReference(bool aFlag)
void SetSketchPadsOnFabLayers(bool aFlag)
void SetUseGerberX2format(bool aUse)
void SetA4Output(int aForce)
void SetPlotOnAllLayersSequence(LSEQ aSeq)
void SetDXFPlotPolygonMode(bool aFlag)
void SetAutoScale(bool aFlag)
void SetPlotFrameRef(bool aFlag)
void SetSketchDNPFPsOnFabLayers(bool aFlag)
bool m_PDFMetadata
Generate PDF metadata for SUBJECT and AUTHOR.
void SetPlotPadNumbers(bool aFlag)
COLOR4D m_backgroundColor
Background color to use for PNG and PDF plotting.
bool m_PDFFrontFPPropertyPopups
Generate PDF property popup menus for footprints.
void SetScale(double aVal)
void SetDisableGerberMacros(bool aDisable)
void SetDXFMultiLayeredExportOption(bool aFlag)
void SetScaleSelection(int aSelection)
void SetFineScaleAdjustX(double aVal)
void SetMirror(bool aFlag)
void SetBlackAndWhite(bool blackAndWhite)
void SetGerberPrecision(int aPrecision)
void SetSubtractMaskFromSilk(bool aSubtract)
void SetHideDNPFPsOnFabLayers(bool aFlag)
void SetPlotValue(bool aFlag)
void SetPngDPI(int aDPI)
void SetUseGerberProtelExtensions(bool aUse)
void SetDXFPlotUnits(DXF_UNITS aUnit)
void SetPngAntialias(bool aFlag)
void SetColorSettings(COLOR_SETTINGS *aSettings)
void SetIncludeGerberNetlistInfo(bool aUse)
void SetCreateGerberJobFile(bool aCreate)
bool m_PDFSingle
Generate a single PDF file for all layers.
void SetNegative(bool aFlag)
bool GetBlackAndWhite() const
void SetUseAuxOrigin(bool aAux)
bool m_PDFBackFPPropertyPopups
on front and/or back of board
void SetDXFPlotMode(DXF_OUTLINE_MODE aPlotMode)
void SetTextMode(PLOT_TEXT_MODE aVal)
void SetSvgFitPageToBoard(int aSvgFitPageToBoard)
void SetSvgPrecision(unsigned aPrecision)
void SetCrossoutDNPFPsOnFabLayers(bool aFlag)
void SetFormat(PLOT_FORMAT aFormat)
void SetBackgroundColor(const COLOR4D &aColor)
void SetFineScaleAdjustY(double aVal)
void SetWidthAdjust(int aVal)
Base plotter engine class.
Definition plotter.h:136
virtual void SetAuthor(const wxString &aAuthor)
Definition plotter.h:190
void SetLayer(PCB_LAYER_ID aLayer)
Sets the ID of the current layer.
Definition plotter.h:255
virtual void SetTitle(const wxString &aTitle)
Definition plotter.h:189
virtual bool EndPlot()=0
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:167
virtual void SetSubject(const wxString &aSubject)
Definition plotter.h:191
Container for project specific data.
Definition project.h:63
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
Represent a set of closed polygons.
int OutlineCount() const
Return the number of outlines in the set.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, RESOLUTION_CONTEXT aContext)
Definition common.cpp:60
@ FOR_GUI
Definition common.h:91
wxString GetDefaultPlotExtension(PLOT_FORMAT aFormat)
Return the default plot extension for a format.
#define _(s)
static constexpr EDA_ANGLE ANGLE_0
Definition eda_angle.h:448
#define IS_NEW
New item, just created.
int RefreshGeneratedTables(BOARD &aBoard)
Bring every generated table on the board up to date and return how many were rebuilt.
Classes used to generate a Gerber job file in JSON.
static const std::string GerberJobFileExtension
KIID niluuid(0)
@ LAYER_PCB_BACKGROUND
PCB background color.
Definition layer_ids.h:277
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
static int scaleToSelection(double scale)
bool PlotFootprintToSVG(const FOOTPRINT &aFootprint, PROJECT &aProject, const std::map< wxString, wxString > *aVarOverrides, PCB_PLOT_PARAMS &aPlotOpts, const LSEQ &aLayersToPlot, const LSEQ &aLayersOnAll, const wxString &aFileName, REPORTER *aReporter)
Plot a footprint to an SVG file, with the footprint origin at the SVG origin and the page/viewBox siz...
const wxString GetGerberProtelExtension(int aLayer)
Definition pcbplot.cpp:39
PLOTTER * StartPlotBoard(BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, int aLayer, const wxString &aLayerName, const wxString &aFullFileName, const wxString &aSheetName, const wxString &aSheetPath, const wxString &aPageName=wxT("1"), const wxString &aPageNumber=wxEmptyString, const int aPageCount=1)
Open a new plotfile using the options (and especially the format) specified in the options and prepar...
void setupPlotterNewPDFPage(PLOTTER *aPlotter, BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts, const wxString &aLayerName, const wxString &aSheetName, const wxString &aSheetPath, const wxString &aPageNumber, int aPageCount)
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.).
see class PGM_BASE
@ SKETCH
Definition plotter.h:81
@ FILLED
Definition plotter.h:82
PLOT_FORMAT
The set of supported output plot formats.
Definition plotter.h:63
Plotting engines similar to ps (PostScript, Gerber, svg)
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_INFO
@ RPT_SEVERITY_ACTION
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
T * GetAppSettings(const char *aFilename)
const int scale
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708