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 <common.h>
26#include <plotters/plotter.h>
28#include <board.h>
29#include <reporter.h>
30#include <pcbplot.h>
31#include <wx/filename.h>
39#include <pgm_base.h>
40#include <pcbnew_settings.h>
42#include <math/util.h> // for KiROUND
43
44
45static int scaleToSelection( double scale )
46{
47 int selection = 1;
48
49 if( scale == 0.0 ) selection = 0;
50 else if( scale == 1.5 ) selection = 2;
51 else if( scale == 2.0 ) selection = 3;
52 else if( scale == 3.0 ) selection = 4;
53
54 return selection;
55}
56
57
58PCB_PLOTTER::PCB_PLOTTER( BOARD* aBoard, REPORTER* aReporter, PCB_PLOT_PARAMS& aParams ) :
59 m_board( aBoard ),
60 m_plotOpts( aParams ),
61 m_reporter( aReporter )
62{
63}
64
65
66bool PCB_PLOTTER::Plot( const wxString& aOutputPath, const LSEQ& aLayersToPlot,
67 const LSEQ& aCommonLayers, bool aUseGerberFileExtensions,
68 bool aOutputPathIsSingle, std::optional<wxString> aLayerName,
69 std::optional<wxString> aSheetName, std::optional<wxString> aSheetPath,
70 std::vector<wxString>* aOutputFiles )
71{
72 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) -> bool
73 {
74 // Handles board->GetTitleBlock() *and* board->GetProject()
75 return m_board->ResolveTextVar( token, 0 );
76 };
77
78 // sanity, ensure one layer to print
79 if( aLayersToPlot.size() < 1 )
80 {
81 m_reporter->Report( _( "No layers selected for plotting." ), RPT_SEVERITY_ERROR );
82 return false;
83 }
84
85 PAGE_INFO existingPageInfo = m_board->GetPageSettings();
86 VECTOR2I existingAuxOrigin = m_board->GetDesignSettings().GetAuxOrigin();
87
88 if( m_plotOpts.GetFormat() == PLOT_FORMAT::SVG && m_plotOpts.GetSvgFitPagetoBoard() ) // Page is board boundary size
89 {
90 BOX2I bbox = m_board->ComputeBoundingBox( false, false );
91 SHAPE_POLY_SET boardOutlines;
92
93 // Board outline geometry is better if it exists so that origin is not influenced by Edge.Cuts line width
94 if( m_board->GetBoardPolygonOutlines( boardOutlines, false ) && boardOutlines.OutlineCount() > 0 )
95 bbox = boardOutlines.BBox();
96
97 PAGE_INFO currPageInfo = m_board->GetPageSettings();
98
99 currPageInfo.SetWidthMils( bbox.GetWidth() / pcbIUScale.IU_PER_MILS );
100 currPageInfo.SetHeightMils( bbox.GetHeight() / pcbIUScale.IU_PER_MILS );
101
102 m_board->SetPageSettings( currPageInfo );
103 m_plotOpts.SetUseAuxOrigin( true );
104
105 VECTOR2I origin = bbox.GetOrigin();
106 m_board->GetDesignSettings().SetAuxOrigin( origin );
107 }
108
109 // To reuse logic, in single plot mode, we want to kick any extra layers from the main list to commonLayers
110 LSEQ layersToPlot;
111 LSEQ commonLayers;
112
113 const bool isPdfMultiPage =
114 ( m_plotOpts.GetFormat() == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle );
115
116 if( aOutputPathIsSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() && !isPdfMultiPage )
117 {
118 layersToPlot.push_back( aLayersToPlot[0] );
119
120 if( aLayersToPlot.size() > 1 )
121 commonLayers.insert( commonLayers.end(), aLayersToPlot.begin() + 1, aLayersToPlot.end() );
122 }
123 else
124 {
125 layersToPlot = aLayersToPlot;
126 commonLayers = aCommonLayers;
127 }
128
129 int finalPageCount = 0;
130 std::vector<std::pair<PCB_LAYER_ID, wxString>> layersToExport;
131
132 // Skip the disabled copper layers and build the layer ID -> layer name mapping for plotter
133 // DXF plotter will use this information to name its layers
134 for( PCB_LAYER_ID layer : layersToPlot )
135 {
136 if( copperLayerShouldBeSkipped( layer ) )
137 continue;
138
139 finalPageCount++;
140 layersToExport.emplace_back( layer, m_board->GetLayerName( layer ) );
141 }
142
143 std::unique_ptr<GERBER_JOBFILE_WRITER> jobfile_writer;
144
145 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && !aOutputPathIsSingle )
146 jobfile_writer = std::make_unique<GERBER_JOBFILE_WRITER>( m_board, m_reporter );
147
148 PLOT_FORMAT plot_format = m_plotOpts.GetFormat();
149 wxString fileExt( GetDefaultPlotExtension( m_plotOpts.GetFormat() ) );
150 wxString sheetPath;
151 wxString msg;
152 bool success = true;
153 PLOTTER* plotter = nullptr;
154 int pageNum = 1;
155
156 for( size_t i = 0; i < layersToPlot.size(); i++ )
157 {
158 PCB_LAYER_ID layer = layersToPlot[i];
159
160 if( copperLayerShouldBeSkipped( layer ) )
161 continue;
162
163 LSEQ plotSequence = getPlotSequence( layer, commonLayers );
164 wxString layerName = m_board->GetLayerName( layer );
165 wxFileName fn;
166
167 if( aOutputPathIsSingle )
168 {
169 fn = wxFileName( aOutputPath );
170 }
171 else
172 {
173 wxFileName brdFn = m_board->GetFileName();
174 fn.Assign( aOutputPath, brdFn.GetName(), fileExt );
175
176 // Use Gerber Extensions based on layer number
177 // (See http://en.wikipedia.org/wiki/Gerber_File)
178 if( m_plotOpts.GetFormat() == PLOT_FORMAT::GERBER && aUseGerberFileExtensions )
179 fileExt = GetGerberProtelExtension( layer );
180
181 if( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
183 else if ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() )
185 else
186 BuildPlotFileName( &fn, aOutputPath, layerName, fileExt );
187 }
188
189 if( jobfile_writer )
190 {
191 wxString fullname = fn.GetFullName();
192 jobfile_writer->AddGbrFile( layer, fullname );
193 }
194
195 if( ( plot_format != PLOT_FORMAT::PDF && plot_format != PLOT_FORMAT::DXF )
196 || ( !m_plotOpts.m_PDFSingle && !m_plotOpts.GetDXFMultiLayeredExportOption() )
197 || ( pageNum == 1
198 && ( ( plot_format == PLOT_FORMAT::PDF && m_plotOpts.m_PDFSingle )
199 || ( plot_format == PLOT_FORMAT::DXF && m_plotOpts.GetDXFMultiLayeredExportOption() ) ) ) )
200 {
201 // this will only be used by pdf
202 wxString pageNumber = wxString::Format( "%d", pageNum );
203 wxString pageName = layerName;
204 wxString sheetName = layerName;
205
206 if( aLayerName.has_value() )
207 {
208 layerName = aLayerName.value();
209 pageName = aLayerName.value();
210 }
211
212 if( aSheetName.has_value() )
213 sheetName = aSheetName.value();
214
215 if( aSheetPath.has_value() )
216 sheetPath = aSheetPath.value();
217
218 m_plotOpts.SetLayersToExport( layersToExport );
219 plotter = StartPlotBoard( m_board, &m_plotOpts, layer, layerName, fn.GetFullPath(),
220 sheetName, sheetPath, pageName, pageNumber, finalPageCount );
221 }
222
223 if( plotter )
224 {
225 plotter->SetLayer( layer );
226 plotter->SetTitle( ExpandTextVars( m_board->GetTitleBlock().GetTitle(), &textResolver ) );
227
228 if( m_plotOpts.m_PDFMetadata )
229 {
230 msg = wxS( "AUTHOR" );
231
232 if( m_board->ResolveTextVar( &msg, 0 ) )
233 plotter->SetAuthor( msg );
234
235 msg = wxS( "SUBJECT" );
236
237 if( m_board->ResolveTextVar( &msg, 0 ) )
238 plotter->SetSubject( msg );
239 }
240
241 try
242 {
243 PlotBoardLayers( m_board, plotter, plotSequence, m_plotOpts );
245 }
246 catch( ... )
247 {
248 success = false;
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 );
447 }
448
450 {
451 JOB_EXPORT_PCB_PDF* pdfJob = static_cast<JOB_EXPORT_PCB_PDF*>( aJob );
454 aOpts.m_PDFMetadata = pdfJob->m_pdfMetadata;
455 aOpts.m_PDFSingle = pdfJob->m_pdfSingle;
457 }
458
460 {
461 JOB_EXPORT_PCB_PS* psJob = static_cast<JOB_EXPORT_PCB_PS*>( aJob );
462 aOpts.SetWidthAdjust( KiROUND( psJob->m_trackWidthCorrection * pcbIUScale.IU_PER_MM ) );
463 aOpts.SetFineScaleAdjustX( psJob->m_XScaleAdjust );
464 aOpts.SetFineScaleAdjustY( psJob->m_YScaleAdjust );
465 aOpts.SetA4Output( psJob->m_forceA4 );
466 }
467
468 aOpts.SetUseAuxOrigin( aJob->m_useDrillOrigin );
469 aOpts.SetPlotFrameRef( aJob->m_plotDrawingSheet );
471 aOpts.SetPlotReference( aJob->m_plotRefDes );
472 aOpts.SetPlotValue( aJob->m_plotFootprintValues );
477 aOpts.SetPlotPadNumbers( aJob->m_plotPadNumbers );
478
479 aOpts.SetBlackAndWhite( aJob->m_blackAndWhite );
480 aOpts.SetMirror( aJob->m_mirror );
481 aOpts.SetNegative( aJob->m_negative );
482
485
486 switch( aJob->m_plotFormat )
487 {
488 default:
493 case JOB_EXPORT_PCB_PLOT::PLOT_FORMAT::HPGL: /* no longer supported */ break;
495 }
496
497 wxString theme = aJob->m_colorTheme;
498
499 // Theme may be empty when running from a job in GUI context, so use the GUI settings.
500 if( theme.IsEmpty() )
501 {
502 if( PCBNEW_SETTINGS* pcbSettings = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
503 theme = pcbSettings->m_ColorTheme;
504 }
505
506 COLOR_SETTINGS* colors = ::GetColorSettings( theme );
507
508 if( colors->GetFilename() != theme && !aOpts.GetBlackAndWhite() )
509 {
510 aReporter.Report( wxString::Format( _( "Color theme '%s' not found, will use theme from PCB Editor.\n" ),
511 theme ),
513 }
514
515 aOpts.SetColorSettings( colors );
517}
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:323
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:233
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:599
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:79
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:80
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:81
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
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:62
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: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:687