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>
29#include <pcb_drill_chart.h>
30#include <reporter.h>
31#include <pcbplot.h>
32#include <wx/filename.h>
41#include <pgm_base.h>
42#include <pcbnew_settings.h>
44#include <math/util.h> // for KiROUND
45
46
47static int scaleToSelection( double scale )
48{
49 int selection = 1;
50
51 if( scale == 0.0 ) selection = 0;
52 else if( scale == 1.5 ) selection = 2;
53 else if( scale == 2.0 ) selection = 3;
54 else if( scale == 3.0 ) selection = 4;
55
56 return selection;
57}
58
59
60PCB_PLOTTER::PCB_PLOTTER( BOARD* aBoard, REPORTER* aReporter, PCB_PLOT_PARAMS& aParams ) :
61 m_board( aBoard ),
62 m_plotOpts( aParams ),
63 m_reporter( aReporter )
64{
65}
66
67
68bool PCB_PLOTTER::Plot( const wxString& aOutputPath, const LSEQ& aLayersToPlot,
69 const LSEQ& aCommonLayers, bool aUseGerberFileExtensions,
70 bool aOutputPathIsSingle, std::optional<wxString> aLayerName,
71 std::optional<wxString> aSheetName, std::optional<wxString> aSheetPath,
72 std::vector<wxString>* aOutputFiles )
73{
74 std::function<bool( wxString* )> textResolver =
75 [&]( wxString* token ) -> bool
76 {
77 // Handles board->GetTitleBlock() *and* board->GetProject()
78 return m_board->ResolveTextVar( token, 0 );
79 };
80
81 // sanity, ensure one layer to print
82 if( aLayersToPlot.size() < 1 )
83 {
84 if( m_reporter )
85 m_reporter->Report( _( "No layers selected for plotting." ), RPT_SEVERITY_ERROR );
86
87 return false;
88 }
89
90 // The one path GUI plotting, PNG, PS and every CLI plot job share. Common layers are
91 // included or a chart plotted as one slips past the policy
92 LSET plotted( { aLayersToPlot } );
93 plotted |= LSET( { aCommonLayers } );
94
96
97 PAGE_INFO existingPageInfo = m_board->GetPageSettings();
98 VECTOR2I existingAuxOrigin = m_board->GetDesignSettings().GetAuxOrigin();
99
100 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() ) // Page is board boundary size
101 {
102 BOX2I bbox = m_board->ComputeBoundingBox( false, false );
103 SHAPE_POLY_SET boardOutlines;
104
105 // Board outline geometry is better if it exists so that origin is not influenced by Edge.Cuts line width
106 if( m_board->GetBoardPolygonOutlines( boardOutlines, false ) && boardOutlines.OutlineCount() > 0 )
107 bbox = boardOutlines.BBox();
108
109 PAGE_INFO currPageInfo = m_board->GetPageSettings();
110
111 currPageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );
112 currPageInfo.SetHeightMils( bbox.GetHeight() / pcbIUScale.IU_PER_MILS );
113
114 m_board->SetPageSettings( currPageInfo );
115 m_plotOpts.SetUseAuxOrigin( true );
116
117 // Keep the origin at the board origin so it lands on the SVG origin. The SVG
118 // plotter was given the bounding box to build its viewBox from elsewhere.
119 m_board->GetDesignSettings().SetAuxOrigin( VECTOR2I( 0, 0 ) );
120 }
121
122 // To reuse logic, in single plot mode, we want to kick any extra layers from the main list to commonLayers
123 LSEQ layersToPlot;
124 LSEQ commonLayers;
125
126 const bool isPdfMultiPage =
127 ( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle );
128
129 if( aOutputPathIsSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() && !isPdfMultiPage )
130 {
131 layersToPlot.push_back( aLayersToPlot[0] );
132
133 if( aLayersToPlot.size() > 1 )
134 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1, aLayersToPlot.end() );
135 }
136 else
137 {
138 layersToPlot = aLayersToPlot;
139 commonLayers = aCommonLayers;
140 }
141
142 int finalPageCount = 0;
143 std::vector<std::pair<PCB_LAYER_ID, wxString>> layersToExport;
144
145 // Skip the disabled copper layers and build the layer ID -> layer name mapping for plotter
146 // DXF plotter will use this information to name its layers
147 for( PCB_LAYER_ID layer : layersToPlot )
148 {
149 if( copperLayerShouldBeSkipped( layer ) )
150 continue;
151
152 finalPageCount++;
153 layersToExport.emplace_back( layer, m_board->GetLayerName( layer ) );
154 }
155
156 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
157
158 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
159 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
160
161 PLOT_FORMAT plot_format = m_plotOpts.GetFormat();
162 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
163 wxString sheetPath;
164 wxString msg;
165 bool success = true;
166 PLOTTER* plotter = nullptr;
167 int pageNum = 1;
168
169 for( size_t i = 0; i < layersToPlot.size(); i++ )
170 {
171 PCB_LAYER_ID layer = layersToPlot[i];
172
173 if( copperLayerShouldBeSkipped( layer ) )
174 continue;
175
176 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
177 wxString layerName = m_board->GetLayerName( layer );
178 wxFileName fn;
179
180 if( aOutputPathIsSingle )
181 {
182 fn = wxFileName( aOutputPath );
183 }
184 else
185 {
186 wxFileName brdFn = m_board->GetFileName();
187 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
188
189 // Use Gerber Extensions based on layer number
190 // (See http://en.wikipedia.org/wiki/Gerber_File)
191 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
192 fileExt = GetGerberProtelExtension( layer );
193
194 if( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
196 else if ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() )
198 else
199 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
200 }
201
202 if( jobfile_writer )
203 {
204 wxString fullname = fn.GetFullName();
205 jobfile_writer->AddGbrFile( layer, fullname );
206 }
207
208 if( ( plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF )
209 || ( !m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
210 || ( pageNum == 1
211 && ( ( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
212 || ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() ) ) ) )
213 {
214 // this will only be used by pdf
215 wxString pageNumber = wxString::Format( "%d", pageNum );
216 wxString pageName = layerName;
217 wxString sheetName = layerName;
218
219 if( aLayerName.has_value() )
220 {
221 layerName = aLayerName.value();
222 pageName = aLayerName.value();
223 }
224
225 if( aSheetName.has_value() )
226 sheetName = aSheetName.value();
227
228 if( aSheetPath.has_value() )
229 sheetPath = aSheetPath.value();
230
231 m_plotOpts.SetLayersToExport( layersToExport );
232 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
233 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
234 }
235
236 if( plotter )
237 {
238 plotter->SetLayer( layer );
239 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver, FOR_GUI ) );
240
241 if( m_plotOpts.m_PDFMetadata )
242 {
243 msg = wxS( "AUTHOR" );
244
245 if( m_board->ResolveTextVar( &msg, 0 ) )
246 plotter->SetAuthor( msg );
247
248 msg = wxS( "SUBJECT" );
249
250 if( m_board->ResolveTextVar( &msg, 0 ) )
251 plotter->SetSubject( msg );
252 }
253
254 try
255 {
256 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
258 }
259 catch( ... )
260 {
261 success = false;
262 delete plotter->RenderSettings();
263 delete plotter;
264 plotter = nullptr;
265 break;
266 }
267
268 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle && pageNum != finalPageCount )
269 {
270 wxString pageNumber = wxString::Format( "%d", pageNum + 1 );
271 size_t nextI = i + 1;
272 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
273
274 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
275 {
276 ++nextI;
277 nextLayer = layersToPlot[nextI];
278 }
279
280 layerName = m_board->GetLayerName( nextLayer );
281
282 wxString pageName = layerName;
283 wxString sheetName = layerName;
284
285 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
286 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
287 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
288 sheetPath, pageNumber, finalPageCount );
289 }
290
291 // last page
292 if( (plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF)
293 || (!m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption())
294 || i == aLayersToPlot.size() - 1
295 || pageNum == finalPageCount )
296 {
297 try
298 {
299 plotter->EndPlot();
300 }
301 catch( ... )
302 {
303 success = false;
304 }
305
306 delete plotter->RenderSettings();
307 delete plotter;
308 plotter = nullptr;
309
310 if( m_reporter )
311 m_reporter->Report( wxString::Format( _( "Plotted to '%s'." ), fn.GetFullPath() ),
313
314 if( aOutputFiles )
315 aOutputFiles->push_back( fn.GetFullPath() );
316 }
317 }
318 else
319 {
320 if( m_reporter )
321 m_reporter->Report( wxString::Format( _( "Failed to create file '%s'." ), fn.GetFullPath() ),
323
324 success = false;
325 }
326
327 pageNum++;
328
329 wxSafeYield(); // displays report message.
330 }
331
332 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
333 {
334 // Pick the basename from the board file
335 wxFileName fn( m_board->GetFileName() );
336
337 // Build gerber job file from basename
338 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
339 jobfile_writer->CreateJobFile( fn.GetFullPath() );
340
341 if( aOutputFiles )
342 aOutputFiles->push_back( fn.GetFullPath() );
343 }
344
345 if( m_reporter )
346 m_reporter->ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
347
348 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
349 {
350 // restore the original page and aux origin
351 m_board->SetPageSettings( existingPageInfo );
352 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
353 }
354
355 return success;
356}
357
358
360{
361 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
362}
363
364
365void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
366 const wxString& aSuffix, const wxString& aExtension )
367{
368 // aFilename contains the base filename only (without path and extension)
369 // when calling this function.
370 // It is expected to be a valid filename (this is usually the board filename)
371 aFilename->SetPath( aOutputDir );
372
373 // Set the file extension
374 aFilename->SetExt( aExtension );
375
376 // remove leading and trailing spaces if any from the suffix, if
377 // something survives add it to the name;
378 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
379 // so change them to underscore
380 // Remember it can be called from a python script, so the illegal chars
381 // have to be filtered here.
382 wxString suffix = aSuffix;
383 suffix.Trim( true );
384 suffix.Trim( false );
385
386 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
387 badchars.Append( "%." );
388
389 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
390 suffix.Replace( badchars[ii], wxT( "_" ) );
391
392 if( !suffix.IsEmpty() )
393 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
394}
395
396
397LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
398{
399 LSEQ plotSequence;
400
401 // Base layer always gets plotted first.
402 plotSequence.push_back( aLayerToPlot );
403
404 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
405 {
406 // Don't plot the same layer more than once;
407 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
408 continue;
409
410 plotSequence.push_back( layer );
411 }
412
413 return plotSequence;
414}
415
416
418 REPORTER& aReporter )
419{
421 {
422 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
425 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
428 aOpts.SetGerberPrecision( gJob->m_precision );
429 // Always disable plot pad holes
431 }
432 else
433 {
434 // Scale, doesn't apply to GERBER
435 aOpts.SetScale( aJob->m_scale );
436 aOpts.SetAutoScale( !aJob->m_scale );
438 // Drill marks doesn't apply to GERBER
439 switch( aJob->m_drillShapeOption )
440 {
443 default:
445 }
446 }
447
449 {
450 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
451 aOpts.SetSvgPrecision( svgJob->m_precision );
452 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
453 }
454
456 {
457 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
459 : DXF_UNITS::MM );
462 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
465 }
466
468 {
469 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
472 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
473 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
475 }
476
478 {
479 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
480 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
481 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
482 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
483 aOpts.SetA4Output( psJob->m_forceA4 );
484 }
485
487 {
488 JOB_EXPORT_PCB_PNG* pngJob = static_cast<JOB_EXPORT_PCB_PNG*>( aJob );
489 aOpts.SetPngDPI( pngJob->m_dpi );
490 aOpts.SetPngAntialias( pngJob->m_antialias );
491 }
492
493 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
494 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
496 aOpts.SetPlotReference( aJob->m_plotRefDes );
497 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
502 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
503
504 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
505 aOpts.SetMirror( aJob->m_mirror );
506 aOpts.SetNegative( aJob->m_negative );
507
510
511 switch( aJob->m_plotFormat )
512 {
513 default:
518 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
521 }
522
523 wxString theme = aJob->m_colorTheme;
524
525 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
526 if( theme.IsEmpty() )
527 {
528 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
529 theme = pcbSettings->m_ColorTheme;
530 }
531
532 COLOR_SETTINGS* colors = ::GetColorSettings( theme );
533
534 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
535 {
536 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
537 theme ),
539 }
540
541 aOpts.SetColorSettings( colors );
543}
544
545
546bool PlotFootprintToSVG( const FOOTPRINT& aFootprint, PROJECT& aProject,
547 const std::map<wxString, wxString>* aVarOverrides, PCB_PLOT_PARAMS& aPlotOpts,
548 const LSEQ& aLayersToPlot, const LSEQ& aLayersOnAll, const wxString& aFileName,
549 REPORTER* aReporter )
550{
551 // Plot the footprint by placing it at the origin of a temporary board; the SVG
552 // fit-to-board options make the footprint origin land on the SVG origin and size the
553 // page/viewBox to the footprint's bounding box.
554
555 // The hack for now is we create fake boards containing the footprint and plot the board
556 // until we refactor better plot api later
557 std::unique_ptr<BOARD> brd = BOARD_LOADER::CreateEmptyBoard( &aProject );
558
559 if( aVarOverrides )
560 brd->GetProject()->ApplyTextVars( *aVarOverrides );
561
562 brd->SynchronizeProperties();
563
564 FOOTPRINT* fp = dynamic_cast<FOOTPRINT*>( aFootprint.Clone() );
565
566 if( fp == nullptr )
567 return false;
568
569 fp->SetLink( niluuid );
570 fp->SetFlags( IS_NEW );
571 fp->SetParent( brd.get() );
572
573 for( PAD* pad : fp->Pads() )
574 {
575 pad->SetLocalRatsnestVisible( false );
576 pad->SetNetCode( 0 );
577 }
578
579 fp->SetOrientation( ANGLE_0 );
580 fp->SetPosition( VECTOR2I( 0, 0 ) );
581
582 brd->Add( fp, ADD_MODE::INSERT, true );
583
584 aPlotOpts.SetFormat( PLOT_FORMAT::SVG );
585 aPlotOpts.SetPlotFrameRef( false );
586 aPlotOpts.SetSvgFitPageToBoard( true );
587 aPlotOpts.SetMirror( false );
588 aPlotOpts.SetSkipPlotNPTH_Pads( false );
589
590 PCB_PLOTTER plotter( brd.get(), aReporter, aPlotOpts );
591
592 return plotter.Plot( aFileName, aLayersToPlot, aLayersOnAll, false, true, wxEmptyString, wxEmptyString,
593 wxEmptyString );
594}
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
BOX2< VECTOR2I > BOX2I
Definition box2.h:927
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:995
static std::unique_ptr< BOARD > CreateEmptyBoard(PROJECT *aProject)
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:409
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...
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:1259
void SetOrientation(const EDA_ANGLE &aNewAngle)
EDA_ITEM * Clone() const override
Invoke a function on all children.
std::deque< PAD * > & Pads()
Definition footprint.h:404
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.
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)
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)
COLOR4D m_PDFBackgroundColor
Background color to use if m_PDFUseBackgroundColor is true.
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 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:252
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:89
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:422
#define IS_NEW
New item, just created.
Classes used to generate a Gerber job file in JSON.
static const std::string GerberJobFileExtension
KIID niluuid(0)
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
void RefreshDrillCharts(BOARD &aBoard)
Bring every chart on the board up to date.
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:683