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
253 && m_plotOpts.m_PDFSingle
254 && i != layersToPlot.size() - 1 )
255 {
256 wxString pageNumber = wxString::Format( "%d", pageNum + 1 );
257 size_t nextI = i + 1;
258 PCB_LAYER_ID nextLayer = layersToPlot[nextI];
259
260 while( copperLayerShouldBeSkipped( nextLayer ) && nextI < layersToPlot.size() - 1 )
261 {
262 ++nextI;
263 nextLayer = layersToPlot[nextI];
264 }
265
266 layerName = m_board->GetLayerName( nextLayer );
267
268 wxString pageName = layerName;
269 wxString sheetName = layerName;
270
271 static_cast<PDF_PLOTTER*>( plotter )->ClosePage();
272 static_cast<PDF_PLOTTER*>( plotter )->StartPage( pageNumber, pageName );
273 setupPlotterNewPDFPage( plotter, m_board, &m_plotOpts, layerName, sheetName,
274 sheetPath, pageNumber, finalPageCount );
275 }
276
277 // last page
278 if( (plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF)
279 || (!m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption())
280 || i == aLayersToPlot.size() - 1
281 || pageNum == finalPageCount )
282 {
283 try
284 {
285 plotter->EndPlot();
286 }
287 catch( ... )
288 {
289 success = false;
290 }
291
292 delete plotter->RenderSettings();
293 delete plotter;
294 plotter = nullptr;
295
296 msg.Printf( _( "Plotted to '%s'." ), fn.GetFullPath() );
297 m_reporter->Report( msg, RPT_SEVERITY_ACTION );
298
299 if( aOutputFiles )
300 aOutputFiles->push_back( fn.GetFullPath() );
301 }
302 }
303 else
304 {
305 msg.Printf( _( "Failed to create file '%s'." ), fn.GetFullPath() );
306 m_reporter->Report( msg, RPT_SEVERITY_ERROR );
307
308 success = false;
309 }
310
311 pageNum++;
312
313 wxSafeYield(); // displays report message.
314 }
315
316 if( jobfile_writer && m_plotOpts.GetCreateGerberJobFile() )
317 {
318 // Pick the basename from the board file
319 wxFileName fn( m_board->GetFileName() );
320
321 // Build gerber job file from basename
322 BuildPlotFileName( &fn, aOutputPath, wxT( "job" ), FILEEXT::GerberJobFileExtension );
323 jobfile_writer->CreateJobFile( fn.GetFullPath() );
324
325 if( aOutputFiles )
326 aOutputFiles->push_back( fn.GetFullPath() );
327 }
328
329 m_reporter->ReportTail( _( "Done." ), RPT_SEVERITY_INFO );
330
331 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() )
332 {
333 // restore the original page and aux origin
334 m_board->SetPageSettings( existingPageInfo );
335 m_board->GetDesignSettings().SetAuxOrigin( existingAuxOrigin );
336 }
337
338 return success;
339}
340
341
343{
344 return ( LSET::AllCuMask() & ~m_board->GetEnabledLayers() )[aLayerToPlot];
345}
346
347
348void PCB_PLOTTER::BuildPlotFileName( wxFileName* aFilename, const wxString& aOutputDir,
349 const wxString& aSuffix, const wxString& aExtension )
350{
351 // aFilename contains the base filename only (without path and extension)
352 // when calling this function.
353 // It is expected to be a valid filename (this is usually the board filename)
354 aFilename->SetPath( aOutputDir );
355
356 // Set the file extension
357 aFilename->SetExt( aExtension );
358
359 // remove leading and trailing spaces if any from the suffix, if
360 // something survives add it to the name;
361 // also the suffix can contain some not allowed chars in filename (/ \ . : and some others),
362 // so change them to underscore
363 // Remember it can be called from a python script, so the illegal chars
364 // have to be filtered here.
365 wxString suffix = aSuffix;
366 suffix.Trim( true );
367 suffix.Trim( false );
368
369 wxString badchars = wxFileName::GetForbiddenChars( wxPATH_DOS );
370 badchars.Append( "%." );
371
372 for( unsigned ii = 0; ii < badchars.Len(); ii++ )
373 suffix.Replace( badchars[ii], wxT( "_" ) );
374
375 if( !suffix.IsEmpty() )
376 aFilename->SetName( aFilename->GetName() + wxT( "-" ) + suffix );
377}
378
379
380LSEQ PCB_PLOTTER::getPlotSequence( PCB_LAYER_ID aLayerToPlot, LSEQ aPlotWithAllLayersSeq )
381{
382 LSEQ plotSequence;
383
384 // Base layer always gets plotted first.
385 plotSequence.push_back( aLayerToPlot );
386
387 for( PCB_LAYER_ID layer : aPlotWithAllLayersSeq )
388 {
389 // Don't plot the same layer more than once;
390 if( find( plotSequence.begin(), plotSequence.end(), layer ) != plotSequence.end() )
391 continue;
392
393 plotSequence.push_back( layer );
394 }
395
396 return plotSequence;
397}
398
399
401 REPORTER& aReporter )
402{
404 {
405 JOB_EXPORT_PCB_GERBERS* gJob = static_cast<JOB_EXPORT_PCB_GERBERS*>( aJob );
408 aOpts.SetUseGerberX2format( gJob->m_useX2Format );
411 aOpts.SetGerberPrecision( gJob->m_precision );
412 // Always disable plot pad holes
414 }
415 else
416 {
417 // Scale, doesn't apply to GERBER
418 aOpts.SetScale( aJob->m_scale );
419 aOpts.SetAutoScale( !aJob->m_scale );
421 // Drill marks doesn't apply to GERBER
422 switch( aJob->m_drillShapeOption )
423 {
426 default:
428 }
429 }
430
432 {
433 JOB_EXPORT_PCB_SVG* svgJob = static_cast<JOB_EXPORT_PCB_SVG*>( aJob );
434 aOpts.SetSvgPrecision( svgJob->m_precision );
435 aOpts.SetSvgFitPageToBoard( svgJob->m_fitPageToBoard );
436 }
437
439 {
440 JOB_EXPORT_PCB_DXF* dxfJob = static_cast<JOB_EXPORT_PCB_DXF*>( aJob );
442 : DXF_UNITS::MM );
445 aOpts.SetDXFPlotPolygonMode( dxfJob->m_polygonMode );
448 }
449
451 {
452 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
455 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
456 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
458 }
459
461 {
462 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
463 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
464 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
465 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
466 aOpts.SetA4Output( psJob->m_forceA4 );
467 }
468
470 {
471 JOB_EXPORT_PCB_PNG* pngJob = static_cast<JOB_EXPORT_PCB_PNG*>( aJob );
472 aOpts.SetPngDPI( pngJob->m_dpi );
473 aOpts.SetPngAntialias( pngJob->m_antialias );
474 }
475
476 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
477 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
479 aOpts.SetPlotReference( aJob->m_plotRefDes );
480 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
485 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
486
487 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
488 aOpts.SetMirror( aJob->m_mirror );
489 aOpts.SetNegative( aJob->m_negative );
490
493
494 switch( aJob->m_plotFormat )
495 {
496 default:
501 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
504 }
505
506 wxString theme = aJob->m_colorTheme;
507
508 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
509 if( theme.IsEmpty() )
510 {
511 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
512 theme = pcbSettings->m_ColorTheme;
513 }
514
515 COLOR_SETTINGS* colors = ::GetColorSettings( theme );
516
517 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
518 {
519 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
520 theme ),
522 }
523
524 aOpts.SetColorSettings( colors );
526}
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:372
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