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, 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>
38#include <pgm_base.h>
39#include <pcbnew_settings.h>
40#include <math/util.h> // for KiROUND
41
42
43static int scaleToSelection( double scale )
44{
45 int selection = 1;
46
47 if( scale == 0.0 ) selection = 0;
48 else if( scale == 1.5 ) selection = 2;
49 else if( scale == 2.0 ) selection = 3;
50 else if( scale == 3.0 ) selection = 4;
51
52 return selection;
53}
54
55
56PCB_PLOTTER::PCB_PLOTTER( BOARD* aBoard, REPORTER* aReporter, PCB_PLOT_PARAMS& aParams ) :
57 m_board( aBoard ),
58 m_plotOpts( aParams ),
59 m_reporter( aReporter )
60{
61}
62
63
64bool PCB_PLOTTER::Plot( const wxString& aOutputPath, const LSEQ& aLayersToPlot,
65 const LSEQ& aCommonLayers, bool aUseGerberFileExtensions,
66 bool aOutputPathIsSingle, std::optional<wxString> aLayerName,
67 std::optional<wxString> aSheetName, std::optional<wxString> aSheetPath )
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 );
88 PAGE_INFO currPageInfo = m_board->GetPageSettings();
89
90 currPageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );
91 currPageInfo.SetHeightMils( bbox.GetHeight() / pcbIUScale.IU_PER_MILS );
92
93 m_board->SetPageSettings( currPageInfo );
94 m_plotOpts.SetUseAuxOrigin( true );
95
96 VECTOR2I origin = bbox.GetOrigin();
97 m_board->GetDesignSettings().SetAuxOrigin( origin );
98 }
99
100 // To reuse logic, in single plot mode, we want to kick any extra layers from the main list to commonLayers
101 LSEQ layersToPlot;
102 LSEQ commonLayers;
103
104 const bool isPdfMultiPage =
105 ( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle );
106
107 if( aOutputPathIsSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() && !isPdfMultiPage )
108 {
109 layersToPlot.push_back( aLayersToPlot[0] );
110
111 if( aLayersToPlot.size() > 1 )
112 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1, aLayersToPlot.end() );
113 }
114 else
115 {
116 layersToPlot = aLayersToPlot;
117 commonLayers = aCommonLayers;
118 }
119
120 int finalPageCount = 0;
121 std::vector<std::pair<PCB_LAYER_ID, wxString>> layersToExport;
122
123 // Skip the disabled copper layers and build the layer ID -> layer name mapping for plotter
124 // DXF plotter will use this information to name its layers
125 for( PCB_LAYER_ID layer : layersToPlot )
126 {
127 if( copperLayerShouldBeSkipped( layer ) )
128 continue;
129
130 finalPageCount++;
131 layersToExport.emplace_back( layer, m_board->GetLayerName( layer ) );
132 }
133
134 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
135
136 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
137 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
138
139 PLOT_FORMAT plot_format = m_plotOpts.GetFormat();
140 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
141 wxString sheetPath;
142 wxString msg;
143 bool success = true;
144 PLOTTER* plotter = nullptr;
145 int pageNum = 1;
146
147 for( size_t i = 0; i < layersToPlot.size(); i++ )
148 {
149 PCB_LAYER_ID layer = layersToPlot[i];
150
151 if( copperLayerShouldBeSkipped( layer ) )
152 continue;
153
154 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
155 wxString layerName = m_board->GetLayerName( layer );
156 wxFileName fn;
157
158 if( aOutputPathIsSingle )
159 {
160 fn = wxFileName( aOutputPath );
161 }
162 else
163 {
164 wxFileName brdFn = m_board->GetFileName();
165 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
166
167 // Use Gerber Extensions based on layer number
168 // (See http://en.wikipedia.org/wiki/Gerber_File)
169 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
170 fileExt = GetGerberProtelExtension( layer );
171
172 if( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
174 else if ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() )
176 else
177 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
178 }
179
180 if( jobfile_writer )
181 {
182 wxString fullname = fn.GetFullName();
183 jobfile_writer->AddGbrFile( layer, fullname );
184 }
185
186 if( ( plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF )
187 || ( !m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
188 || ( pageNum == 1
189 && ( ( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
190 || ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() ) ) ) )
191 {
192 // this will only be used by pdf
193 wxString pageNumber = wxString::Format( "%d", pageNum );
194 wxString pageName = layerName;
195 wxString sheetName = layerName;
196
197 if( aLayerName.has_value() )
198 {
199 layerName = aLayerName.value();
200 pageName = aLayerName.value();
201 }
202
203 if( aSheetName.has_value() )
204 sheetName = aSheetName.value();
205
206 if( aSheetPath.has_value() )
207 sheetPath = aSheetPath.value();
208
209 m_plotOpts.SetLayersToExport( layersToExport );
210 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
211 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
212 }
213
214 if( plotter )
215 {
216 plotter->SetLayer( layer );
217 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver ) );
218
219 if( m_plotOpts.m_PDFMetadata )
220 {
221 msg = wxS( "AUTHOR" );
222
223 if( m_board->ResolveTextVar( &msg, 0 ) )
224 plotter->SetAuthor( msg );
225
226 msg = wxS( "SUBJECT" );
227
228 if( m_board->ResolveTextVar( &msg, 0 ) )
229 plotter->SetSubject( msg );
230 }
231
232 try
233 {
234 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
236 }
237 catch( ... )
238 {
239 success = false;
240 break;
241 }
242
243 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF
244 && m_plotOpts.m_PDFSingle
245 && i != layersToPlot.size() - 1 )
246 {
247 wxString pageNumber = wxString::Format( "%d", pageNum + 1 );
248 size_t nextI = i + 1;
249 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
250
251 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
252 {
253 ++nextI;
254 nextLayer = layersToPlot[nextI];
255 }
256
257 layerName = m_board->GetLayerName( nextLayer );
258
259 wxString pageName = layerName;
260 wxString sheetName = layerName;
261
262 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
263 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
264 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
265 sheetPath, pageNumber, finalPageCount );
266 }
267
268 // last page
269 if( (plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF)
270 || (!m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption())
271 || i == aLayersToPlot.size() - 1
272 || pageNum == finalPageCount )
273 {
274 try
275 {
276 plotter->EndPlot();
277 }
278 catch( ... )
279 {
280 success = false;
281 }
282
283 delete plotter->RenderSettings();
284 delete plotter;
285 plotter = nullptr;
286
287 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
288 m_reporter->Report( msg, RPT_SEVERITY_ACTION );
289 }
290 }
291 else
292 {
293 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
294 m_reporter->Report( msg, RPT_SEVERITY_ERROR );
295
296 success = false;
297 }
298
299 pageNum++;
300
301 wxSafeYield(); // displays report message.
302 }
303
304 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
305 {
306 // Pick the basename from the board file
307 wxFileName fn( m_board->GetFileName() );
308
309 // Build gerber job file from basename
310 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
311 jobfile_writer->CreateJobFile( fn.GetFullPath() );
312 }
313
314 m_reporter->ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
315
316 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
317 {
318 // restore the original page and aux origin
319 m_board->SetPageSettings( existingPageInfo );
320 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
321 }
322
323 return success;
324}
325
326
328{
329 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
330}
331
332
333void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
334 const wxString& aSuffix, const wxString& aExtension )
335{
336 // aFilename contains the base filename only (without path and extension)
337 // when calling this function.
338 // It is expected to be a valid filename (this is usually the board filename)
339 aFilename->SetPath( aOutputDir );
340
341 // Set the file extension
342 aFilename->SetExt( aExtension );
343
344 // remove leading and trailing spaces if any from the suffix, if
345 // something survives add it to the name;
346 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
347 // so change them to underscore
348 // Remember it can be called from a python script, so the illegal chars
349 // have to be filtered here.
350 wxString suffix = aSuffix;
351 suffix.Trim( true );
352 suffix.Trim( false );
353
354 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
355 badchars.Append( "%." );
356
357 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
358 suffix.Replace( badchars[ii], wxT( "_" ) );
359
360 if( !suffix.IsEmpty() )
361 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
362}
363
364
365LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
366{
367 LSEQ plotSequence;
368
369 // Base layer always gets plotted first.
370 plotSequence.push_back( aLayerToPlot );
371
372 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
373 {
374 // Don't plot the same layer more than once;
375 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
376 continue;
377
378 plotSequence.push_back( layer );
379 }
380
381 return plotSequence;
382}
383
384
386 REPORTER& aReporter )
387{
389 {
390 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
393 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
396 aOpts.SetGerberPrecision( gJob->m_precision );
397 // Always disable plot pad holes
399 }
400 else
401 {
402 // Scale, doesn't apply to GERBER
403 aOpts.SetScale( aJob->m_scale );
404 aOpts.SetAutoScale( !aJob->m_scale );
406 // Drill marks doesn't apply to GERBER
407 switch( aJob->m_drillShapeOption )
408 {
411 default:
413 }
414 }
415
417 {
418 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
419 aOpts.SetSvgPrecision( svgJob->m_precision );
420 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
421 }
422
424 {
425 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
427 : DXF_UNITS::MM );
430 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
432 }
433
435 {
436 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
439 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
440 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
442 }
443
445 {
446 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
447 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
448 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
449 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
450 aOpts.SetA4Output( psJob->m_forceA4 );
451 }
452
453 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
454 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
456 aOpts.SetPlotReference( aJob->m_plotRefDes );
457 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
462 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
463
464 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
465 aOpts.SetMirror( aJob->m_mirror );
466 aOpts.SetNegative( aJob->m_negative );
467
470
471 switch( aJob->m_plotFormat )
472 {
473 default:
478 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
480 }
481
482 wxString theme = aJob->m_colorTheme;
483
484 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
485 if( theme.IsEmpty() )
486 {
487 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
488 theme = pcbSettings->m_ColorTheme;
489 }
490
492
493 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
494 {
495 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
496 theme ),
498 }
499
500 aOpts.SetColorSettings( colors );
502}
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:322
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.
wxString GetConfiguredOutputPath() const
Returns the configured output path for the job.
Definition job.h:232
wxString GetFilename() const
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
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:582
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:79
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: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)
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: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.
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)
COLOR4D m_PDFBackgroundColor
Background color to use if m_PDFUseBackgroundColor is true.
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)
bool GetBlackAndWhite() const
void SetUseAuxOrigin(bool aAux)
bool m_PDFBackFPPropertyPopups
on front and/or back of board
void SetDXFPlotMode(DXF_OUTLINE_MODE aPlotMode)
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
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
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
Definition common.cpp:61
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
static int scaleToSelection(double scale)
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 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:64
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:695