KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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, 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 <pcb_plotter.h>
25#include <plotters/plotter.h>
27#include <board.h>
28#include <reporter.h>
29#include <pcbplot.h>
30#include <wx/filename.h>
37#include <pgm_base.h>
38#include <pcbnew_settings.h>
39
40
41PCB_PLOTTER::PCB_PLOTTER( BOARD* aBoard, REPORTER* aReporter, PCB_PLOT_PARAMS& aParams ) :
42 m_board( aBoard ),
43 m_plotOpts( aParams ),
44 m_reporter( aReporter )
45{
46}
47
48
49bool PCB_PLOTTER::Plot( const wxString& aOutputPath,
50 const LSEQ& aLayersToPlot,
51 const LSEQ& aCommonLayers,
52 bool aUseGerberFileExtensions,
53 bool aOutputPathIsSingle,
54 std::optional<wxString> aLayerName,
55 std::optional<wxString> aSheetName,
56 std::optional<wxString> aSheetPath )
57{
58 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
59 {
60 // Handles board->GetTitleBlock() *and* board->GetProject()
61 return m_board->ResolveTextVar( token, 0 );
62 };
63
64 // sanity, ensure one layer to print
65 if( aLayersToPlot.size() < 1 )
66 {
67 m_reporter->Report( _( "No layers selected for plotting." ), RPT_SEVERITY_ERROR );
68 return false;
69 }
70
71 PAGE_INFO existingPageInfo = m_board->GetPageSettings();
72 VECTOR2I existingAuxOrigin = m_board->GetDesignSettings().GetAuxOrigin();
73
74 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() ) // Page is board boundary size
75 {
76 BOX2I bbox = m_board->ComputeBoundingBox( false );
77 PAGE_INFO currPageInfo = m_board->GetPageSettings();
78
79 currPageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );
80 currPageInfo.SetHeightMils( bbox.GetHeight() / pcbIUScale.IU_PER_MILS );
81
82 m_board->SetPageSettings( currPageInfo );
84
85 VECTOR2I origin = bbox.GetOrigin();
87 }
88
89 // To reuse logic, in single plot mode, we want to kick any extra layers from the main list to commonLayers
90 LSEQ layersToPlot;
91 LSEQ commonLayers;
92
93 if( aOutputPathIsSingle )
94 {
95 layersToPlot.push_back( aLayersToPlot[0] );
96
97 if( aLayersToPlot.size() > 1 )
98 {
99 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1,
100 aLayersToPlot.end() );
101 }
102 }
103 else
104 {
105 layersToPlot = aLayersToPlot;
106 commonLayers = aCommonLayers;
107 }
108
109 int finalPageCount = 0;
110
111 for( PCB_LAYER_ID layer : layersToPlot )
112 {
113 if( copperLayerShouldBeSkipped( layer ) )
114 continue;
115
116 finalPageCount++;
117 }
118
119 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
120
121 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
122 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
123
124 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
125 wxString sheetPath;
126 wxString msg;
127 bool success = true;
128 PLOTTER* plotter = nullptr;
129 int pageNum = 1;
130
131 for( size_t i = 0; i < layersToPlot.size(); i++ )
132 {
133 PCB_LAYER_ID layer = layersToPlot[i];
134
135 if( copperLayerShouldBeSkipped( layer ) )
136 continue;
137
138 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
139 wxString layerName = m_board->GetLayerName( layer );
140 wxFileName fn;
141
142 if( aOutputPathIsSingle )
143 {
144 fn = wxFileName( aOutputPath );
145 }
146 else
147 {
148 wxFileName brdFn = m_board->GetFileName();
149 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
150
151 // Use Gerber Extensions based on layer number
152 // (See http://en.wikipedia.org/wiki/Gerber_File)
153 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
154 fileExt = GetGerberProtelExtension( layer );
155
156 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
157 fn.SetExt( GetDefaultPlotExtension( PLOT_FORMAT::PDF ) );
158 else
159 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
160 }
161
162 if( jobfile_writer )
163 {
164 wxString fullname = fn.GetFullName();
165 jobfile_writer->AddGbrFile( layer, fullname );
166 }
167
168 if( m_plotOpts.GetFormat() != PLOT_FORMAT::PDF
170 || ( pageNum == 1 && m_plotOpts.GetFormat() == PLOT_FORMAT::PDF
172 {
173 // this will only be used by pdf
174 wxString pageNumber = wxString::Format( "%d", pageNum );
175 wxString pageName = layerName;
176 wxString sheetName = layerName;
177
178 if( aLayerName.has_value() )
179 {
180 layerName = aLayerName.value();
181 pageName = aLayerName.value();
182 }
183
184 if( aSheetName.has_value() )
185 sheetName = aSheetName.value();
186
187 if( aSheetPath.has_value() )
188 sheetPath = aSheetPath.value();
189
190 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
191 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
192 }
193
194 if( plotter )
195 {
196 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver ) );
197
199 {
200 msg = wxS( "AUTHOR" );
201
202 if( m_board->ResolveTextVar( &msg, 0 ) )
203 plotter->SetAuthor( msg );
204
205 msg = wxS( "SUBJECT" );
206
207 if( m_board->ResolveTextVar( &msg, 0 ) )
208 plotter->SetSubject( msg );
209 }
210
211 try
212 {
213 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
215 }
216 catch( ... )
217 {
218 success = false;
219 break;
220 }
221
222 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle
223 && i != layersToPlot.size() - 1 )
224 {
225 wxString pageNumber = wxString::Format( "%zu", pageNum + 1 );
226 size_t nextI = i + 1;
227 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
228
229 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
230 {
231 ++nextI;
232 nextLayer = layersToPlot[nextI];
233 }
234
235 layerName = m_board->GetLayerName( nextLayer );
236
237 wxString pageName = layerName;
238 wxString sheetName = layerName;
239
240 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
241 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
242 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
243 sheetPath, pageNumber, finalPageCount );
244 }
245
246 // last page
247 if( m_plotOpts.GetFormat() != PLOT_FORMAT::PDF
249 || i == aLayersToPlot.size() - 1
250 || pageNum == finalPageCount )
251 {
252 try
253 {
254 plotter->EndPlot();
255 }
256 catch( ... )
257 {
258 success = false;
259 }
260
261 delete plotter->RenderSettings();
262 delete plotter;
263 plotter = nullptr;
264
265 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
267 }
268 }
269 else
270 {
271 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
273
274 success = false;
275 }
276
277 pageNum++;
278
279 wxSafeYield(); // displays report message.
280 }
281
282 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
283 {
284 // Pick the basename from the board file
285 wxFileName fn( m_board->GetFileName() );
286
287 // Build gerber job file from basename
288 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
289 jobfile_writer->CreateJobFile( fn.GetFullPath() );
290 }
291
293
294 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
295 {
296 // restore the original page and aux origin
297 m_board->SetPageSettings( existingPageInfo );
298 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
299 }
300
301 return success;
302}
303
304
306{
307 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
308}
309
310
311void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
312 const wxString& aSuffix, const wxString& aExtension )
313{
314 // aFilename contains the base filename only (without path and extension)
315 // when calling this function.
316 // It is expected to be a valid filename (this is usually the board filename)
317 aFilename->SetPath( aOutputDir );
318
319 // Set the file extension
320 aFilename->SetExt( aExtension );
321
322 // remove leading and trailing spaces if any from the suffix, if
323 // something survives add it to the name;
324 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
325 // so change them to underscore
326 // Remember it can be called from a python script, so the illegal chars
327 // have to be filtered here.
328 wxString suffix = aSuffix;
329 suffix.Trim( true );
330 suffix.Trim( false );
331
332 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
333 badchars.Append( "%." );
334
335 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
336 suffix.Replace( badchars[ii], wxT( "_" ) );
337
338 if( !suffix.IsEmpty() )
339 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
340}
341
342
343LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
344{
345 LSEQ plotSequence;
346
347 // Base layer always gets plotted first.
348 plotSequence.push_back( aLayerToPlot );
349
350 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
351 {
352 // Don't plot the same layer more than once;
353 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
354 continue;
355
356 plotSequence.push_back( layer );
357 }
358
359 return plotSequence;
360}
361
362
364 REPORTER& aReporter )
365{
367 {
368 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
371 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
374 aOpts.SetGerberPrecision( gJob->m_precision );
375 }
376
378 {
379 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
380 aOpts.SetSvgPrecision( svgJob->m_precision );
381 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
382 }
383
385 {
386 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
388 ? DXF_UNITS::INCH
389 : DXF_UNITS::MM );
390
391 aOpts.SetPlotMode( dxfJob->m_plotGraphicItemsUsingContours ? OUTLINE_MODE::SKETCH
392 : OUTLINE_MODE::FILLED );
393
394 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
395 }
396
398 {
399 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
402 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
403 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
404 }
405
406 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
407 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
409 aOpts.SetPlotReference( aJob->m_plotRefDes );
410 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
415 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
416
417 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
418 aOpts.SetMirror( aJob->m_mirror );
419 aOpts.SetNegative( aJob->m_negative );
420
423
424 switch( aJob->m_plotFormat )
425 {
426 default:
427 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::GERBER: aOpts.SetFormat( PLOT_FORMAT::GERBER ); break;
428 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::POST: aOpts.SetFormat( PLOT_FORMAT::POST ); break;
429 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::SVG: aOpts.SetFormat( PLOT_FORMAT::SVG ); break;
430 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::DXF: aOpts.SetFormat( PLOT_FORMAT::DXF ); break;
431 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: aOpts.SetFormat( PLOT_FORMAT::HPGL ); break;
432 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::PDF: aOpts.SetFormat( PLOT_FORMAT::PDF ); break;
433 }
434
435 switch( aJob->m_drillShapeOption )
436 {
437 case DRILL_MARKS::NO_DRILL_SHAPE: aOpts.SetDrillMarksType( DRILL_MARKS::NO_DRILL_SHAPE ); break;
438 case DRILL_MARKS::SMALL_DRILL_SHAPE: aOpts.SetDrillMarksType( DRILL_MARKS::SMALL_DRILL_SHAPE ); break;
439 default:
440 case DRILL_MARKS::FULL_DRILL_SHAPE: aOpts.SetDrillMarksType( DRILL_MARKS::FULL_DRILL_SHAPE ); break;
441 }
442
444 wxString theme = aJob->m_colorTheme;
445
446 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
447 if( theme.IsEmpty() )
448 {
449 PCBNEW_SETTINGS* pcbSettings = mgr.GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" );
450 theme = pcbSettings->m_ColorTheme;
451 }
452
453 COLOR_SETTINGS* colors = mgr.GetColorSettings( aJob->m_colorTheme );
454
455 if( colors->GetFilename() != theme )
456 {
457 aReporter.Report( wxString::Format(
458 _( "Color theme '%s' not found, will use theme from PCB Editor settings.\n" ),
459 theme ),
461 }
462
463 aOpts.SetColorSettings( colors );
465}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:218
void SetAuxOrigin(const VECTOR2I &aOrigin)
const VECTOR2I & GetAuxOrigin() const
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:297
const PAGE_INFO & GetPageSettings() const
Definition: board.h:715
bool ResolveTextVar(wxString *token, int aDepth) const
Definition: board.cpp:434
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:721
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
Definition: board.cpp:1763
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: board.h:716
const wxString & GetFileName() const
Definition: board.h:334
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
Definition: board.cpp:614
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:946
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
Definition: board.cpp:829
constexpr size_type GetWidth() const
Definition: box2.h:214
constexpr size_type GetHeight() const
Definition: box2.h:215
constexpr const Vec & GetOrigin() const
Definition: box2.h:210
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.
unsigned int m_precision
wxString GetConfiguredOutputPath() const
Returns the configured output path for the job.
Definition: job.h:226
wxString GetFilename() const
Definition: json_settings.h:81
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
Definition: lseq.h:47
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:583
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
void SetHeightMils(double aHeightInMils)
Definition: page_info.cpp:261
void SetWidthMils(double aWidthInMils)
Definition: page_info.cpp:247
LSEQ getPlotSequence(PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq)
Generates a final LSEQ for plotting by removing duplicates.
BOARD * m_board
Definition: pcb_plotter.h:77
bool Plot(const wxString &aOutputPath, const LSEQ &aLayersToPlot, const LSEQ &aCommonLayers, bool aUseGerberFileExtensions, bool aOutputPathIsSingle=false, std::optional< wxString > aLayerName=std::nullopt, std::optional< wxString > aSheetName=std::nullopt, std::optional< wxString > aSheetPath=std::nullopt)
Definition: pcb_plotter.cpp:49
static void PlotJobToPlotOpts(PCB_PLOT_PARAMS &aOpts, JOB_EXPORT_PCB_PLOT *aJob, REPORTER &aReporter)
Translate a JOB to PCB_PLOT_PARAMS.
PCB_PLOTTER(BOARD *aBoard, REPORTER *aReporter, PCB_PLOT_PARAMS &aParams)
Definition: pcb_plotter.cpp:41
PCB_PLOT_PARAMS m_plotOpts
Definition: pcb_plotter.h:78
REPORTER * m_reporter
Definition: pcb_plotter.h:79
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.
PLOT_FORMAT GetFormat() const
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 SetPlotOnAllLayersSequence(LSEQ aSeq)
void SetDXFPlotPolygonMode(bool aFlag)
void SetPlotFrameRef(bool aFlag)
void SetSketchDNPFPsOnFabLayers(bool aFlag)
bool m_PDFMetadata
Generate PDF metadata for SUBJECT and AUTHOR.
bool GetCreateGerberJobFile() const
void SetPlotPadNumbers(bool aFlag)
bool GetSvgFitPagetoBoard() const
bool m_PDFFrontFPPropertyPopups
Generate PDF property popup menus for footprints.
void SetDisableGerberMacros(bool aDisable)
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 SetUseGerberProtelExtensions(bool aUse)
void SetDXFPlotUnits(DXF_UNITS aUnit)
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)
void SetPlotMode(OUTLINE_MODE aPlotMode)
void SetUseAuxOrigin(bool aAux)
bool m_PDFBackFPPropertyPopups
on front and/or back of board
void SetSvgFitPageToBoard(int aSvgFitPageToBoard)
void SetSvgPrecision(unsigned aPrecision)
void SetCrossoutDNPFPsOnFabLayers(bool aFlag)
void SetFormat(PLOT_FORMAT aFormat)
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
Base plotter engine class.
Definition: plotter.h:105
virtual void SetAuthor(const wxString &aAuthor)
Definition: plotter.h:159
virtual void SetTitle(const wxString &aTitle)
Definition: plotter.h:158
virtual bool EndPlot()=0
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:136
virtual void SetSubject(const wxString &aSubject)
Definition: plotter.h:160
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
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:112
T * GetAppSettings(const char *aFilename)
Return a handle to the a given settings by type.
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieve a color settings object that applications can read colors from.
const wxString & GetTitle() const
Definition: title_block.h:63
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
Definition: common.cpp:59
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:60
const wxString GetGerberProtelExtension(int aLayer)
Definition: pcbplot.cpp:43
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 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.).
void setupPlotterNewPDFPage(PLOTTER *aPlotter, BOARD *aBoard, const PCB_PLOT_PARAMS *aPlotOpts, const wxString &aLayerName, const wxString &aSheetName, const wxString &aSheetPath, const wxString &aPageNumber, int aPageCount)
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1071
see class PGM_BASE
Plotting engines similar to ps (PostScript, Gerber, svg)
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_INFO
@ RPT_SEVERITY_ACTION
const double IU_PER_MILS
Definition: base_units.h:77