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 <reporter.h>
26#include <pcbplot.h>
27#include <wx/filename.h>
36#include <pgm_base.h>
37#include <pcbnew_settings.h>
39#include <math/util.h> // for KiROUND
40
41
42static int scaleToSelection( double scale )
43{
44 int selection = 1;
45
46 if( scale == 0.0 ) selection = 0;
47 else if( scale == 1.5 ) selection = 2;
48 else if( scale == 2.0 ) selection = 3;
49 else if( scale == 3.0 ) selection = 4;
50
51 return selection;
52}
53
54
55PCB_PLOTTER::PCB_PLOTTER( BOARD* aBoard, REPORTER* aReporter, PCB_PLOT_PARAMS& aParams ) :
56 m_board( aBoard ),
57 m_plotOpts( aParams ),
58 m_reporter( aReporter )
59{
60}
61
62
63bool PCB_PLOTTER::Plot( const wxString& aOutputPath, const LSEQ& aLayersToPlot,
64 const LSEQ& aCommonLayers, bool aUseGerberFileExtensions,
65 bool aOutputPathIsSingle, std::optional<wxString> aLayerName,
66 std::optional<wxString> aSheetName, std::optional<wxString> aSheetPath,
67 std::vector<wxString>* aOutputFiles )
68{
69 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
70 {
71 // Handles board->GetTitleBlock() *and* board->GetProject()
72 return m_board->ResolveTextVar( token, 0 );
73 };
74
75 // sanity, ensure one layer to print
76 if( aLayersToPlot.size() < 1 )
77 {
78 m_reporter->Report( _( "No layers selected for plotting." ), RPT_SEVERITY_ERROR );
79 return false;
80 }
81
82 PAGE_INFO existingPageInfo = m_board->GetPageSettings();
83 VECTOR2I existingAuxOrigin = m_board->GetDesignSettings().GetAuxOrigin();
84
85 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() ) // Page is board boundary size
86 {
87 BOX2I bbox = m_board->ComputeBoundingBox( false, false );
88 SHAPE_POLY_SET boardOutlines;
89
90 // Board outline geometry is better if it exists so that origin is not influenced by Edge.Cuts line width
91 if( m_board->GetBoardPolygonOutlines( boardOutlines, false ) && boardOutlines.OutlineCount() > 0 )
92 bbox = boardOutlines.BBox();
93
94 PAGE_INFO currPageInfo = m_board->GetPageSettings();
95
96 currPageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );
97 currPageInfo.SetHeightMils( bbox.GetHeight() / pcbIUScale.IU_PER_MILS );
98
99 m_board->SetPageSettings( currPageInfo );
100 m_plotOpts.SetUseAuxOrigin( true );
101
102 VECTOR2I origin = bbox.GetOrigin();
103 m_board->GetDesignSettings().SetAuxOrigin( origin );
104 }
105
106 // To reuse logic, in single plot mode, we want to kick any extra layers from the main list to commonLayers
107 LSEQ layersToPlot;
108 LSEQ commonLayers;
109
110 const bool isPdfMultiPage =
111 ( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle );
112
113 if( aOutputPathIsSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() && !isPdfMultiPage )
114 {
115 layersToPlot.push_back( aLayersToPlot[0] );
116
117 if( aLayersToPlot.size() > 1 )
118 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1, aLayersToPlot.end() );
119 }
120 else
121 {
122 layersToPlot = aLayersToPlot;
123 commonLayers = aCommonLayers;
124 }
125
126 int finalPageCount = 0;
127 std::vector<std::pair<PCB_LAYER_ID, wxString>> layersToExport;
128
129 // Skip the disabled copper layers and build the layer ID -> layer name mapping for plotter
130 // DXF plotter will use this information to name its layers
131 for( PCB_LAYER_ID layer : layersToPlot )
132 {
133 if( copperLayerShouldBeSkipped( layer ) )
134 continue;
135
136 finalPageCount++;
137 layersToExport.emplace_back( layer, m_board->GetLayerName( layer ) );
138 }
139
140 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
141
142 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
143 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
144
145 PLOT_FORMAT plot_format = m_plotOpts.GetFormat();
146 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
147 wxString sheetPath;
148 wxString msg;
149 bool success = true;
150 PLOTTER* plotter = nullptr;
151 int pageNum = 1;
152
153 for( size_t i = 0; i < layersToPlot.size(); i++ )
154 {
155 PCB_LAYER_ID layer = layersToPlot[i];
156
157 if( copperLayerShouldBeSkipped( layer ) )
158 continue;
159
160 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
161 wxString layerName = m_board->GetLayerName( layer );
162 wxFileName fn;
163
164 if( aOutputPathIsSingle )
165 {
166 fn = wxFileName( aOutputPath );
167 }
168 else
169 {
170 wxFileName brdFn = m_board->GetFileName();
171 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
172
173 // Use Gerber Extensions based on layer number
174 // (See http://en.wikipedia.org/wiki/Gerber_File)
175 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
176 fileExt = GetGerberProtelExtension( layer );
177
178 if( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
180 else if ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() )
182 else
183 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
184 }
185
186 if( jobfile_writer )
187 {
188 wxString fullname = fn.GetFullName();
189 jobfile_writer->AddGbrFile( layer, fullname );
190 }
191
192 if( ( plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF )
193 || ( !m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
194 || ( pageNum == 1
195 && ( ( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
196 || ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() ) ) ) )
197 {
198 // this will only be used by pdf
199 wxString pageNumber = wxString::Format( "%d", pageNum );
200 wxString pageName = layerName;
201 wxString sheetName = layerName;
202
203 if( aLayerName.has_value() )
204 {
205 layerName = aLayerName.value();
206 pageName = aLayerName.value();
207 }
208
209 if( aSheetName.has_value() )
210 sheetName = aSheetName.value();
211
212 if( aSheetPath.has_value() )
213 sheetPath = aSheetPath.value();
214
215 m_plotOpts.SetLayersToExport( layersToExport );
216 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
217 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
218 }
219
220 if( plotter )
221 {
222 plotter->SetLayer( layer );
223 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver ) );
224
225 if( m_plotOpts.m_PDFMetadata )
226 {
227 msg = wxS( "AUTHOR" );
228
229 if( m_board->ResolveTextVar( &msg, 0 ) )
230 plotter->SetAuthor( msg );
231
232 msg = wxS( "SUBJECT" );
233
234 if( m_board->ResolveTextVar( &msg, 0 ) )
235 plotter->SetSubject( msg );
236 }
237
238 try
239 {
240 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
242 }
243 catch( ... )
244 {
245 success = false;
246 delete plotter->RenderSettings();
247 delete plotter;
248 plotter = nullptr;
249 break;
250 }
251
252 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle && pageNum != finalPageCount )
253 {
254 wxString pageNumber = wxString::Format( "%d", pageNum + 1 );
255 size_t nextI = i + 1;
256 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
257
258 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
259 {
260 ++nextI;
261 nextLayer = layersToPlot[nextI];
262 }
263
264 layerName = m_board->GetLayerName( nextLayer );
265
266 wxString pageName = layerName;
267 wxString sheetName = layerName;
268
269 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
270 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
271 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
272 sheetPath, pageNumber, finalPageCount );
273 }
274
275 // last page
276 if( (plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF)
277 || (!m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption())
278 || i == aLayersToPlot.size() - 1
279 || pageNum == finalPageCount )
280 {
281 try
282 {
283 plotter->EndPlot();
284 }
285 catch( ... )
286 {
287 success = false;
288 }
289
290 delete plotter->RenderSettings();
291 delete plotter;
292 plotter = nullptr;
293
294 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
295 m_reporter->Report( msg, RPT_SEVERITY_ACTION );
296
297 if( aOutputFiles )
298 aOutputFiles->push_back( fn.GetFullPath() );
299 }
300 }
301 else
302 {
303 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
304 m_reporter->Report( msg, RPT_SEVERITY_ERROR );
305
306 success = false;
307 }
308
309 pageNum++;
310
311 wxSafeYield(); // displays report message.
312 }
313
314 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
315 {
316 // Pick the basename from the board file
317 wxFileName fn( m_board->GetFileName() );
318
319 // Build gerber job file from basename
320 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
321 jobfile_writer->CreateJobFile( fn.GetFullPath() );
322
323 if( aOutputFiles )
324 aOutputFiles->push_back( fn.GetFullPath() );
325 }
326
327 m_reporter->ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
328
329 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
330 {
331 // restore the original page and aux origin
332 m_board->SetPageSettings( existingPageInfo );
333 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
334 }
335
336 return success;
337}
338
339
341{
342 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
343}
344
345
346void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
347 const wxString& aSuffix, const wxString& aExtension )
348{
349 // aFilename contains the base filename only (without path and extension)
350 // when calling this function.
351 // It is expected to be a valid filename (this is usually the board filename)
352 aFilename->SetPath( aOutputDir );
353
354 // Set the file extension
355 aFilename->SetExt( aExtension );
356
357 // remove leading and trailing spaces if any from the suffix, if
358 // something survives add it to the name;
359 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
360 // so change them to underscore
361 // Remember it can be called from a python script, so the illegal chars
362 // have to be filtered here.
363 wxString suffix = aSuffix;
364 suffix.Trim( true );
365 suffix.Trim( false );
366
367 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
368 badchars.Append( "%." );
369
370 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
371 suffix.Replace( badchars[ii], wxT( "_" ) );
372
373 if( !suffix.IsEmpty() )
374 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
375}
376
377
378LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
379{
380 LSEQ plotSequence;
381
382 // Base layer always gets plotted first.
383 plotSequence.push_back( aLayerToPlot );
384
385 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
386 {
387 // Don't plot the same layer more than once;
388 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
389 continue;
390
391 plotSequence.push_back( layer );
392 }
393
394 return plotSequence;
395}
396
397
399 REPORTER& aReporter )
400{
402 {
403 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
406 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
409 aOpts.SetGerberPrecision( gJob->m_precision );
410 // Always disable plot pad holes
412 }
413 else
414 {
415 // Scale, doesn't apply to GERBER
416 aOpts.SetScale( aJob->m_scale );
417 aOpts.SetAutoScale( !aJob->m_scale );
419 // Drill marks doesn't apply to GERBER
420 switch( aJob->m_drillShapeOption )
421 {
424 default:
426 }
427 }
428
430 {
431 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
432 aOpts.SetSvgPrecision( svgJob->m_precision );
433 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
434 }
435
437 {
438 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
440 : DXF_UNITS::MM );
443 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
446 }
447
449 {
450 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
453 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
454 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
456 }
457
459 {
460 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
461 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
462 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
463 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
464 aOpts.SetA4Output( psJob->m_forceA4 );
465 }
466
468 {
469 JOB_EXPORT_PCB_PNG* pngJob = static_cast<JOB_EXPORT_PCB_PNG*>( aJob );
470 aOpts.SetPngDPI( pngJob->m_dpi );
471 aOpts.SetPngAntialias( pngJob->m_antialias );
472 }
473
474 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
475 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
477 aOpts.SetPlotReference( aJob->m_plotRefDes );
478 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
483 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
484
485 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
486 aOpts.SetMirror( aJob->m_mirror );
487 aOpts.SetNegative( aJob->m_negative );
488
491
492 switch( aJob->m_plotFormat )
493 {
494 default:
499 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
502 }
503
504 wxString theme = aJob->m_colorTheme;
505
506 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
507 if( theme.IsEmpty() )
508 {
509 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
510 theme = pcbSettings->m_ColorTheme;
511 }
512
513 COLOR_SETTINGS* colors = ::GetColorSettings( theme );
514
515 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
516 {
517 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
518 theme ),
520 }
521
522 aOpts.SetColorSettings( colors );
524}
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
BOX2< VECTOR2I > BOX2I
Definition box2.h:918
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:986
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:373
constexpr size_type GetWidth() const
Definition box2.h:210
constexpr size_type GetHeight() const
Definition box2.h:211
constexpr const Vec & GetOrigin() const
Definition box2.h:206
Color settings are a bit different than most of the settings objects in that there can be more than o...
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
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition lset.cpp:595
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:75
static void PlotJobToPlotOpts(PCB_PLOT_PARAMS &aOpts, JOB_EXPORT_PCB_PLOT *aJob, REPORTER &aReporter)
Translate a JOB to PCB_PLOT_PARAMS.
PCB_PLOTTER(BOARD *aBoard, REPORTER *aReporter, PCB_PLOT_PARAMS &aParams)
PCB_PLOT_PARAMS m_plotOpts
Definition pcb_plotter.h:76
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:77
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 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:133
virtual void SetAuthor(const wxString &aAuthor)
Definition plotter.h:187
void SetLayer(PCB_LAYER_ID aLayer)
Sets the ID of the current layer.
Definition plotter.h:249
virtual void SetTitle(const wxString &aTitle)
Definition plotter.h:186
virtual bool EndPlot()=0
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:164
virtual void SetSubject(const wxString &aSubject)
Definition plotter.h:188
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:71
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
Definition reporter.h:100
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, int aFlags)
Definition common.cpp:59
The common library.
wxString GetDefaultPlotExtension(PLOT_FORMAT aFormat)
Return the default plot extension for a format.
#define _(s)
Classes used to generate a Gerber job file in JSON.
static const std::string GerberJobFileExtension
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
static int scaleToSelection(double scale)
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:78
@ FILLED
Definition plotter.h:79
PLOT_FORMAT
The set of supported output plot formats.
Definition plotter.h:60
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