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 if( aOutputPathIsSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
105 {
106 layersToPlot.push_back( aLayersToPlot[0] );
107
108 if( aLayersToPlot.size() > 1 )
109 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1, aLayersToPlot.end() );
110 }
111 else
112 {
113 layersToPlot = aLayersToPlot;
114 commonLayers = aCommonLayers;
115 }
116
117 int finalPageCount = 0;
118 std::vector<std::pair<PCB_LAYER_ID, wxString>> layersToExport;
119
120 // Skip the disabled copper layers and build the layer ID -> layer name mapping for plotter
121 // DXF plotter will use this information to name its layers
122 for( PCB_LAYER_ID layer : layersToPlot )
123 {
124 if( copperLayerShouldBeSkipped( layer ) )
125 continue;
126
127 finalPageCount++;
128 layersToExport.emplace_back( layer, m_board->GetLayerName( layer ) );
129 }
130
131 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
132
133 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
134 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
135
136 PLOT_FORMAT plot_format = m_plotOpts.GetFormat();
137 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
138 wxString sheetPath;
139 wxString msg;
140 bool success = true;
141 PLOTTER* plotter = nullptr;
142 int pageNum = 1;
143
144 for( size_t i = 0; i < layersToPlot.size(); i++ )
145 {
146 PCB_LAYER_ID layer = layersToPlot[i];
147
148 if( copperLayerShouldBeSkipped( layer ) )
149 continue;
150
151 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
152 wxString layerName = m_board->GetLayerName( layer );
153 wxFileName fn;
154
155 if( aOutputPathIsSingle )
156 {
157 fn = wxFileName( aOutputPath );
158 }
159 else
160 {
161 wxFileName brdFn = m_board->GetFileName();
162 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
163
164 // Use Gerber Extensions based on layer number
165 // (See http://en.wikipedia.org/wiki/Gerber_File)
166 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
167 fileExt = GetGerberProtelExtension( layer );
168
169 if( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
171 else if ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() )
173 else
174 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
175 }
176
177 if( jobfile_writer )
178 {
179 wxString fullname = fn.GetFullName();
180 jobfile_writer->AddGbrFile( layer, fullname );
181 }
182
183 if( ( plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF )
184 || ( !m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
185 || ( pageNum == 1
186 && ( ( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
187 || ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() ) ) ) )
188 {
189 // this will only be used by pdf
190 wxString pageNumber = wxString::Format( "%d", pageNum );
191 wxString pageName = layerName;
192 wxString sheetName = layerName;
193
194 if( aLayerName.has_value() )
195 {
196 layerName = aLayerName.value();
197 pageName = aLayerName.value();
198 }
199
200 if( aSheetName.has_value() )
201 sheetName = aSheetName.value();
202
203 if( aSheetPath.has_value() )
204 sheetPath = aSheetPath.value();
205
206 m_plotOpts.SetLayersToExport( layersToExport );
207 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
208 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
209 }
210
211 if( plotter )
212 {
213 plotter->SetLayer( layer );
214 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver ) );
215
216 if( m_plotOpts.m_PDFMetadata )
217 {
218 msg = wxS( "AUTHOR" );
219
220 if( m_board->ResolveTextVar( &msg, 0 ) )
221 plotter->SetAuthor( msg );
222
223 msg = wxS( "SUBJECT" );
224
225 if( m_board->ResolveTextVar( &msg, 0 ) )
226 plotter->SetSubject( msg );
227 }
228
229 try
230 {
231 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
233 }
234 catch( ... )
235 {
236 success = false;
237 break;
238 }
239
240 if( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF
241 && m_plotOpts.m_PDFSingle
242 && i != layersToPlot.size() - 1 )
243 {
244 wxString pageNumber = wxString::Format( "%d", pageNum + 1 );
245 size_t nextI = i + 1;
246 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
247
248 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
249 {
250 ++nextI;
251 nextLayer = layersToPlot[nextI];
252 }
253
254 layerName = m_board->GetLayerName( nextLayer );
255
256 wxString pageName = layerName;
257 wxString sheetName = layerName;
258
259 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
260 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
261 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
262 sheetPath, pageNumber, finalPageCount );
263 }
264
265 // last page
266 if( (plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF)
267 || (!m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption())
268 || i == aLayersToPlot.size() - 1
269 || pageNum == finalPageCount )
270 {
271 try
272 {
273 plotter->EndPlot();
274 }
275 catch( ... )
276 {
277 success = false;
278 }
279
280 delete plotter->RenderSettings();
281 delete plotter;
282 plotter = nullptr;
283
284 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
285 m_reporter->Report( msg, RPT_SEVERITY_ACTION );
286 }
287 }
288 else
289 {
290 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
291 m_reporter->Report( msg, RPT_SEVERITY_ERROR );
292
293 success = false;
294 }
295
296 pageNum++;
297
298 wxSafeYield(); // displays report message.
299 }
300
301 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
302 {
303 // Pick the basename from the board file
304 wxFileName fn( m_board->GetFileName() );
305
306 // Build gerber job file from basename
307 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
308 jobfile_writer->CreateJobFile( fn.GetFullPath() );
309 }
310
311 m_reporter->ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
312
313 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
314 {
315 // restore the original page and aux origin
316 m_board->SetPageSettings( existingPageInfo );
317 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
318 }
319
320 return success;
321}
322
323
325{
326 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
327}
328
329
330void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
331 const wxString& aSuffix, const wxString& aExtension )
332{
333 // aFilename contains the base filename only (without path and extension)
334 // when calling this function.
335 // It is expected to be a valid filename (this is usually the board filename)
336 aFilename->SetPath( aOutputDir );
337
338 // Set the file extension
339 aFilename->SetExt( aExtension );
340
341 // remove leading and trailing spaces if any from the suffix, if
342 // something survives add it to the name;
343 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
344 // so change them to underscore
345 // Remember it can be called from a python script, so the illegal chars
346 // have to be filtered here.
347 wxString suffix = aSuffix;
348 suffix.Trim( true );
349 suffix.Trim( false );
350
351 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
352 badchars.Append( "%." );
353
354 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
355 suffix.Replace( badchars[ii], wxT( "_" ) );
356
357 if( !suffix.IsEmpty() )
358 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
359}
360
361
362LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
363{
364 LSEQ plotSequence;
365
366 // Base layer always gets plotted first.
367 plotSequence.push_back( aLayerToPlot );
368
369 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
370 {
371 // Don't plot the same layer more than once;
372 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
373 continue;
374
375 plotSequence.push_back( layer );
376 }
377
378 return plotSequence;
379}
380
381
383 REPORTER& aReporter )
384{
386 {
387 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
390 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
393 aOpts.SetGerberPrecision( gJob->m_precision );
394 // Always disable plot pad holes
396 }
397 else
398 {
399 // Scale, doesn't apply to GERBER
400 aOpts.SetScale( aJob->m_scale );
401 aOpts.SetAutoScale( !aJob->m_scale );
403 // Drill marks doesn't apply to GERBER
404 switch( aJob->m_drillShapeOption )
405 {
408 default:
410 }
411 }
412
414 {
415 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
416 aOpts.SetSvgPrecision( svgJob->m_precision );
417 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
418 }
419
421 {
422 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
424 : DXF_UNITS::MM );
427 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
429 }
430
432 {
433 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
436 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
437 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
439 }
440
442 {
443 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
444 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
445 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
446 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
447 aOpts.SetA4Output( psJob->m_forceA4 );
448 }
449
450 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
451 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
453 aOpts.SetPlotReference( aJob->m_plotRefDes );
454 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
459 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
460
461 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
462 aOpts.SetMirror( aJob->m_mirror );
463 aOpts.SetNegative( aJob->m_negative );
464
467
468 switch( aJob->m_plotFormat )
469 {
470 default:
475 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
477 }
478
479 wxString theme = aJob->m_colorTheme;
480
481 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
482 if( theme.IsEmpty() )
483 {
484 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
485 theme = pcbSettings->m_ColorTheme;
486 }
487
489
490 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
491 {
492 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
493 theme ),
495 }
496
497 aOpts.SetColorSettings( colors );
499}
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