KiCad PCB EDA Suite
PCBNEW_PRINTOUT Class Reference

#include <pcbnew_printout.h>

Inheritance diagram for PCBNEW_PRINTOUT:
BOARD_PRINTOUT

Public Member Functions

 PCBNEW_PRINTOUT (BOARD *aBoard, const PCBNEW_PRINTOUT_SETTINGS &aParams, const KIGFX::VIEW *aView, const wxString &aTitle)
 
bool OnPrintPage (int aPage) override
 
void GetPageInfo (int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) override
 
bool HasPage (int aPage) override
 
virtual void DrawPage (const wxString &aLayerName=wxEmptyString, int aPageNum=1, int aPageCount=1)
 Print a page (or a set of pages). More...
 

Protected Member Functions

int milsToIU (double aMils) const override
 

Convert mils to internal units

More...
 
void setupViewLayers (const std::unique_ptr< KIGFX::VIEW > &aView, const LSET &aLayerSet) override
 

Enables layers visibility for a printout

More...
 
void setupPainter (const std::unique_ptr< KIGFX::PAINTER > &aPainter) override
 

Configures PAINTER object for a printout

More...
 
void setupGal (KIGFX::GAL *aGal) override
 

Configures GAL object for a printout

More...
 
EDA_RECT getBoundingBox () override
 

Returns bounding box of the printed objects (excluding worksheet frame)

More...
 
std::unique_ptr< KIGFX::PAINTERgetPainter (KIGFX::GAL *aGal) override
 

Returns a PAINTER instance used to draw the items.

More...
 

Protected Attributes

const KIGFX::VIEWm_view
 

Source VIEW object (note that actual printing only refers to this object)

More...
 
BOARD_PRINTOUT_SETTINGS m_settings
 

Printout parameters

More...
 

Private Attributes

BOARDm_board
 
PCBNEW_PRINTOUT_SETTINGS m_pcbnewSettings
 

Detailed Description

Definition at line 50 of file pcbnew_printout.h.

Constructor & Destructor Documentation

PCBNEW_PRINTOUT::PCBNEW_PRINTOUT ( BOARD aBoard,
const PCBNEW_PRINTOUT_SETTINGS aParams,
const KIGFX::VIEW aView,
const wxString &  aTitle 
)

Definition at line 60 of file pcbnew_printout.cpp.

References m_board.

61  :
62  BOARD_PRINTOUT( aParams, aView, aTitle ), m_pcbnewSettings( aParams )
63 {
64  m_board = aBoard;
65 }
PCBNEW_PRINTOUT_SETTINGS m_pcbnewSettings
BOARD_PRINTOUT(const BOARD_PRINTOUT_SETTINGS &aParams, const KIGFX::VIEW *aView, const wxString &aTitle)

Member Function Documentation

void BOARD_PRINTOUT::DrawPage ( const wxString &  aLayerName = wxEmptyString,
int  aPageNum = 1,
int  aPageCount = 1 
)
virtualinherited

Print a page (or a set of pages).

Note: this function prepare print parameters for the function which actually print the draw layers.

Parameters
aLayerName= a text which can be printed as layer name
aPageNum= the number of the current page (only used to print this value)
aPageCount= the number of pages to ptint (only used to print this value)

Definition at line 87 of file board_printout.cpp.

References BLACK, BOX2< Vec >::Centre(), KIGFX::VIEW::DataReference(), BOARD_PRINTOUT::getBoundingBox(), BOX2< Vec >::GetHeight(), EDA_RECT::GetOrigin(), BOARD_PRINTOUT::getPainter(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), EDA_RECT::GetSize(), PAGE_INFO::GetSizeMils(), BOX2< Vec >::GetWidth(), i, LAYER_ID_COUNT, LAYER_WORKSHEET, PRINTOUT_SETTINGS::m_blackWhite, BOARD_PRINTOUT_SETTINGS::m_layerSet, PRINTOUT_SETTINGS::m_pageInfo, PRINTOUT_SETTINGS::m_scale, BOARD_PRINTOUT::m_settings, BOARD_PRINTOUT::m_view, BOARD_PRINTOUT::milsToIU(), min, PRINTOUT_SETTINGS::PrintBorderAndTitleBlock(), KIGFX::RENDER_SETTINGS::SetLayerColor(), BOARD_PRINTOUT::setupGal(), BOARD_PRINTOUT::setupPainter(), BOARD_PRINTOUT::setupViewLayers(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by GERBVIEW_PRINTOUT::OnPrintPage(), and OnPrintPage().

88 {
89  auto dc = GetDC();
91  auto galPrint = KIGFX::GAL_PRINT::Create( options, dc );
92  auto gal = galPrint->GetGAL();
93  auto printCtx = galPrint->GetPrintCtx();
94  auto painter = getPainter( gal );
95  std::unique_ptr<KIGFX::VIEW> view( m_view->DataReference() );
96 
97  // Target paper size
98  wxRect pageSizePx = GetLogicalPageRect();
99  const VECTOR2D pageSizeIn( (double) pageSizePx.width / dc->GetPPI().x,
100  (double) pageSizePx.height / dc->GetPPI().y );
101  galPrint->SetSheetSize( pageSizeIn );
102  const VECTOR2D pageSizeIU( milsToIU( pageSizeIn.x * 1000 ), milsToIU( pageSizeIn.y * 1000 ) );
103 
104  view->SetGAL( gal );
105  view->SetPainter( painter.get() );
106  view->SetScaleLimits( 10e9, 0.0001 );
107  view->SetScale( 1.0 );
108 
109 
110  // Set the color scheme
111  auto srcSettings = m_view->GetPainter()->GetSettings();
112  auto dstSettings = view->GetPainter()->GetSettings();
113 
115  {
116  for( int i = 0; i < LAYER_ID_COUNT; ++i )
117  dstSettings->SetLayerColor( i, COLOR4D::BLACK );
118  }
119  else // color enabled
120  {
121  for( int i = 0; i < LAYER_ID_COUNT; ++i )
122  {
123  // Cairo does not support translucent colors on PostScript surfaces
124  // see 'Features support by the PostScript surface' on
125  // ttps://www.cairographics.org/documentation/using_the_postscript_surface/
126  dstSettings->SetLayerColor( i, srcSettings->GetLayerColor( i ).WithAlpha( 1.0 ) );
127  }
128  }
129 
130 
132  setupPainter( painter );
133 
134  auto sheetSizeMils = m_settings.m_pageInfo.GetSizeMils();
135  VECTOR2I sheetSizeIU( milsToIU( sheetSizeMils.GetWidth() ), milsToIU( sheetSizeMils.GetHeight() ) );
136  BOX2I bBox;
137 
138  // Determine printout bounding box
140  {
141  bBox = BOX2I( VECTOR2I( 0, 0 ), VECTOR2I( sheetSizeIU ) );
142  view->SetLayerVisible( LAYER_WORKSHEET, true );
143  }
144  else
145  {
146  EDA_RECT targetBbox = getBoundingBox();
147  bBox = BOX2I( targetBbox.GetOrigin(), targetBbox.GetSize() );
148  view->SetLayerVisible( LAYER_WORKSHEET, false );
149  }
150 
151 
152  // Fit to page
153  if( m_settings.m_scale <= 0.0 )
154  {
155  if( bBox.GetWidth() == 0 || bBox.GetHeight() == 0 )
156  {
157  // Nothing to print
158  m_settings.m_scale = 1.0;
159  }
160  else
161  {
162  double scaleX = (double) pageSizeIU.x / bBox.GetWidth();
163  double scaleY = (double) pageSizeIU.y / bBox.GetHeight();
164  m_settings.m_scale = std::min( scaleX, scaleY );
165  }
166  }
167 
168  setupGal( gal );
169  galPrint->SetNativePaperSize( pageSizeIn, printCtx->HasNativeLandscapeRotation() );
170  gal->SetLookAtPoint( bBox.Centre() );
171  gal->SetZoomFactor( m_settings.m_scale );
172 
173  {
174  KIGFX::GAL_DRAWING_CONTEXT ctx( gal );
175  view->Redraw();
176  }
177 }
BOX2< VECTOR2I > BOX2I
Definition: box2.h:520
const PAGE_INFO & m_pageInfo
Definition: printout.h:48
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
virtual std::unique_ptr< KIGFX::PAINTER > getPainter(KIGFX::GAL *aGal)=0
Returns a PAINTER instance used to draw the items.
const wxSize GetSize() const
Definition: eda_rect.h:101
const KIGFX::VIEW * m_view
Source VIEW object (note that actual printing only refers to this object)
VECTOR2< int > VECTOR2I
Definition: vector2d.h:587
BOARD_PRINTOUT_SETTINGS m_settings
Printout parameters
const wxSize & GetSizeMils() const
Definition: page_info.h:142
double m_scale
Printing scale.
Definition: printout.h:44
coord_type GetWidth() const
Definition: box2.h:195
bool PrintBorderAndTitleBlock() const
Returns true if the drawing border and title block should be printed.
Definition: printout.h:56
virtual int milsToIU(double aMils) const =0
Convert mils to internal units
virtual void setupGal(KIGFX::GAL *aGal)
Configures GAL object for a printout
void SetLayerColor(int aLayer, const COLOR4D &aColor)
Function SetLayerColor Changes the color used to draw a layer.
Definition: painter.h:230
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:199
virtual void setupPainter(const std::unique_ptr< KIGFX::PAINTER > &aPainter)
Configures PAINTER object for a printout
#define LAYER_ID_COUNT
Must update this if you add any enums after GerbView!
Vec Centre() const
Definition: box2.h:77
std::unique_ptr< VIEW > DataReference() const
Returns a new VIEW object that shares the same set of VIEW_ITEMs and LAYERs.
Definition: view.cpp:1457
bool m_blackWhite
Print in B&W or Color.
Definition: printout.h:46
coord_type GetHeight() const
Definition: box2.h:196
virtual RENDER_SETTINGS * GetSettings()=0
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
virtual void setupViewLayers(const std::unique_ptr< KIGFX::VIEW > &aView, const LSET &aLayerSet)
Enables layers visibility for a printout
size_t i
Definition: json11.cpp:597
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
Definition: colors.h:45
virtual EDA_RECT getBoundingBox()=0
Returns bounding box of the printed objects (excluding worksheet frame)
LSET m_layerSet
Layers to print.
#define min(a, b)
Definition: auxiliary.h:85
EDA_RECT PCBNEW_PRINTOUT::getBoundingBox ( )
overrideprotectedvirtual

Returns bounding box of the printed objects (excluding worksheet frame)

Implements BOARD_PRINTOUT.

Definition at line 201 of file pcbnew_printout.cpp.

References BOARD::ComputeBoundingBox(), and m_board.

202 {
203  return m_board->ComputeBoundingBox();
204 }
EDA_RECT ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Function ComputeBoundingBox calculates the bounding box containing all board items (or board edge seg...
void BOARD_PRINTOUT::GetPageInfo ( int *  minPage,
int *  maxPage,
int *  selPageFrom,
int *  selPageTo 
)
overrideinherited

Definition at line 77 of file board_printout.cpp.

References PRINTOUT_SETTINGS::m_pageCount, and BOARD_PRINTOUT::m_settings.

78 {
79  *minPage = 1;
80  *selPageFrom = 1;
81 
82  *maxPage = m_settings.m_pageCount;
83  *selPageTo = m_settings.m_pageCount;
84 }
BOARD_PRINTOUT_SETTINGS m_settings
Printout parameters
int m_pageCount
Number of pages to print.
Definition: printout.h:47
std::unique_ptr< KIGFX::PAINTER > PCBNEW_PRINTOUT::getPainter ( KIGFX::GAL aGal)
overrideprotectedvirtual

Returns a PAINTER instance used to draw the items.

Implements BOARD_PRINTOUT.

Definition at line 207 of file pcbnew_printout.cpp.

208 {
209  return std::unique_ptr<KIGFX::PAINTER>( new KIGFX::PCB_PRINT_PAINTER( aGal ) );
210 }
Special flavor of PCB_PAINTER that contains modifications to handle printing options.
bool BOARD_PRINTOUT::HasPage ( int  aPage)
inlineoverrideinherited

Definition at line 74 of file board_printout.h.

75  {
76  return aPage <= m_settings.m_pageCount;
77  }
BOARD_PRINTOUT_SETTINGS m_settings
Printout parameters
int m_pageCount
Number of pages to print.
Definition: printout.h:47
int PCBNEW_PRINTOUT::milsToIU ( double  aMils) const
overrideprotectedvirtual

Convert mils to internal units

Implements BOARD_PRINTOUT.

Definition at line 112 of file pcbnew_printout.cpp.

References IU_PER_MILS, and KiROUND().

113 {
114  return KiROUND( IU_PER_MILS * aMils );
115 }
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:120
#define IU_PER_MILS
Definition: plotter.cpp:134
bool PCBNEW_PRINTOUT::OnPrintPage ( int  aPage)
override

Definition at line 68 of file pcbnew_printout.cpp.

References BOARD_PRINTOUT::DrawPage(), Edge_Cuts, LSET::ExtractLayer(), BOARD_PRINTOUT_SETTINGS::m_layerSet, PCBNEW_PRINTOUT_SETTINGS::m_noEdgeLayer, PCBNEW_PRINTOUT_SETTINGS::m_pagination, m_pcbnewSettings, BOARD_PRINTOUT::m_settings, LSET::Name(), LSET::UIOrder(), and UNDEFINED_LAYER.

69 {
70  // Store the layerset, as it is going to be modified below and the original settings are needed
71  LSET lset = m_settings.m_layerSet;
72  int pageCount = lset.count();
73  wxString layer;
74  PCB_LAYER_ID extractLayer;
75 
76  // compute layer mask from page number if we want one page per layer
77  if( m_pcbnewSettings.m_pagination == 0 ) // One page per layer
78  {
79  // This sequence is TBD, call a different
80  // sequencer if needed, such as Seq(). Could not find documentation on
81  // page order.
82  LSEQ seq = lset.UIOrder();
83 
84  // aPage starts at 1, not 0
85  if( unsigned( aPage - 1 ) < seq.size() )
86  m_settings.m_layerSet = LSET( seq[aPage - 1] );
87  }
88 
89  if( !m_settings.m_layerSet.any() )
90  return false;
91 
92  extractLayer = m_settings.m_layerSet.ExtractLayer();
93 
94  if( extractLayer == UNDEFINED_LAYER )
95  layer = _( "Multiple Layers" );
96  else
97  layer = LSET::Name( extractLayer );
98 
99  // In Pcbnew we can want the layer EDGE always printed
102 
103  DrawPage( layer, aPage, pageCount );
104 
105  // Restore the original layer set, so the next page can be printed
106  m_settings.m_layerSet = lset;
107 
108  return true;
109 }
bool m_noEdgeLayer
Disable board outline on each page.
virtual void DrawPage(const wxString &aLayerName=wxEmptyString, int aPageNum=1, int aPageCount=1)
Print a page (or a set of pages).
BOARD_PRINTOUT_SETTINGS m_settings
Printout parameters
PCB_LAYER_ID ExtractLayer() const
Find the first set PCB_LAYER_ID.
Definition: lset.cpp:612
PCB_LAYER_ID
A quick note on layer IDs:
Class LSET is a set of PCB_LAYER_IDs.
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Function Name returns the fixed name association with aLayerId.
Definition: lset.cpp:73
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
PCBNEW_PRINTOUT_SETTINGS m_pcbnewSettings
enum PCBNEW_PRINTOUT_SETTINGS::PAGINATION_T m_pagination
Pagination.
LSET m_layerSet
Layers to print.
LSEQ UIOrder() const
Definition: lset.cpp:800
void PCBNEW_PRINTOUT::setupGal ( KIGFX::GAL aGal)
overrideprotectedvirtual

Configures GAL object for a printout

Reimplemented from BOARD_PRINTOUT.

Definition at line 194 of file pcbnew_printout.cpp.

References BOARD_PRINTOUT::setupGal(), and KIGFX::GAL::SetWorldUnitLength().

195 {
196  BOARD_PRINTOUT::setupGal( aGal );
197  aGal->SetWorldUnitLength( 1e-9 /* 1 nm */ / 0.0254 /* 1 inch in meters */ );
198 }
virtual void setupGal(KIGFX::GAL *aGal)
Configures GAL object for a printout
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
void PCBNEW_PRINTOUT::setupPainter ( const std::unique_ptr< KIGFX::PAINTER > &  aPainter)
overrideprotectedvirtual

Configures PAINTER object for a printout

Reimplemented from BOARD_PRINTOUT.

Definition at line 167 of file pcbnew_printout.cpp.

References PCBNEW_PRINTOUT_SETTINGS::FULL_DRILL_SHAPE, LAYER_NON_PLATEDHOLES, LAYER_PADS_PLATEDHOLES, LAYER_VIAS_HOLES, PCBNEW_PRINTOUT_SETTINGS::m_drillMarks, m_pcbnewSettings, PCBNEW_PRINTOUT_SETTINGS::NO_DRILL_SHAPE, BOARD_PRINTOUT::setupPainter(), PCBNEW_PRINTOUT_SETTINGS::SMALL_DRILL_SHAPE, and WHITE.

168 {
169  BOARD_PRINTOUT::setupPainter( aPainter );
170 
171  auto painter = static_cast<KIGFX::PCB_PRINT_PAINTER*>( aPainter.get() );
172 
174  {
176  painter->SetDrillMarks( false, 0 );
177  break;
178 
180  painter->SetDrillMarks( false, Millimeter2iu( 0.3 ) );
181  break;
182 
184  painter->SetDrillMarks( true );
185  break;
186  }
187 
188  painter->GetSettings()->SetLayerColor( LAYER_PADS_PLATEDHOLES, COLOR4D::WHITE );
189  painter->GetSettings()->SetLayerColor( LAYER_NON_PLATEDHOLES, COLOR4D::WHITE );
190  painter->GetSettings()->SetLayerColor( LAYER_VIAS_HOLES, COLOR4D::WHITE );
191 }
handle color for not plated holes (holes, not pads)
Special flavor of PCB_PAINTER that contains modifications to handle printing options.
to draw via holes (pad holes do not use this layer)
virtual void setupPainter(const std::unique_ptr< KIGFX::PAINTER > &aPainter)
Configures PAINTER object for a printout
PCBNEW_PRINTOUT_SETTINGS m_pcbnewSettings
Definition: colors.h:49
enum PCBNEW_PRINTOUT_SETTINGS::DRILL_MARK_SHAPE_T m_drillMarks
Drill marks shape.
void PCBNEW_PRINTOUT::setupViewLayers ( const std::unique_ptr< KIGFX::VIEW > &  aView,
const LSET aLayerSet 
)
overrideprotectedvirtual

Enables layers visibility for a printout

Reimplemented from BOARD_PRINTOUT.

Definition at line 118 of file pcbnew_printout.cpp.

References LSET::AllCuMask(), B_Cu, F_Cu, LAYER_MOD_BK, LAYER_MOD_FR, LAYER_MOD_REFERENCES, LAYER_MOD_TEXT_BK, LAYER_MOD_TEXT_FR, LAYER_MOD_VALUES, LAYER_NON_PLATEDHOLES, LAYER_PAD_BK, LAYER_PAD_FR, LAYER_PADS_PLATEDHOLES, LAYER_PADS_TH, LAYER_TRACKS, LAYER_VIA_BBLIND, LAYER_VIA_MICROVIA, LAYER_VIA_THROUGH, LAYER_VIAS_HOLES, PCBNEW_PRINTOUT_SETTINGS::m_drillMarks, BOARD_PRINTOUT_SETTINGS::m_layerSet, m_pcbnewSettings, BOARD_PRINTOUT::m_settings, PCBNEW_PRINTOUT_SETTINGS::NO_DRILL_SHAPE, PCBNEW_LAYER_ID_START, LSET::Seq(), and BOARD_PRINTOUT::setupViewLayers().

120 {
121  BOARD_PRINTOUT::setupViewLayers( aView, aLayerSet );
122 
123  for( LSEQ layerSeq = m_settings.m_layerSet.Seq(); layerSeq; ++layerSeq )
124  aView->SetLayerVisible( PCBNEW_LAYER_ID_START + *layerSeq, true );
125 
126  // Enable pad layers corresponding to the selected copper layers
127  if( aLayerSet.test( F_Cu ) )
128  aView->SetLayerVisible( LAYER_PAD_FR, true );
129 
130  if( aLayerSet.test( B_Cu ) )
131  aView->SetLayerVisible( LAYER_PAD_BK, true );
132 
133  if( ( aLayerSet & LSET::AllCuMask() ).any() ) // Items visible on any copper layer
134  {
135  // Enable items on copper layers, but do not draw holes
136  for( auto item : { LAYER_PADS_TH, LAYER_VIA_MICROVIA,
138  {
139  aView->SetLayerVisible( item, true );
140  }
141 
143  {
144  // Enable hole layers to draw drill marks
145  for( auto holeLayer : { LAYER_PADS_PLATEDHOLES,
147  {
148  aView->SetLayerVisible( holeLayer, true );
149  aView->SetTopLayer( holeLayer, true );
150  }
151  }
152 
153  }
154 
155 
156  // Keep certain items always enabled/disabled and just rely on the layer visibility
157  const int alwaysEnabled[] = {
160  };
161 
162  for( int item : alwaysEnabled )
163  aView->SetLayerVisible( item, true );
164 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:673
to draw blind/buried vias
multilayer pads, usually with holes
handle color for not plated holes (holes, not pads)
show modules on back
to draw via holes (pad holes do not use this layer)
show modules values (when texts are visibles)
smd pads, back layer
BOARD_PRINTOUT_SETTINGS m_settings
Printout parameters
show modules on front
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Function Seq returns an LSEQ from the union of this LSET and a desired sequence.
Definition: lset.cpp:364
to draw usual through hole vias
Class LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
smd pads, front layer
virtual void setupViewLayers(const std::unique_ptr< KIGFX::VIEW > &aView, const LSET &aLayerSet)
Enables layers visibility for a printout
PCBNEW_PRINTOUT_SETTINGS m_pcbnewSettings
enum PCBNEW_PRINTOUT_SETTINGS::DRILL_MARK_SHAPE_T m_drillMarks
Drill marks shape.
show modules references (when texts are visibles)
LSET m_layerSet
Layers to print.

Member Data Documentation

BOARD* PCBNEW_PRINTOUT::m_board
private

Definition at line 72 of file pcbnew_printout.h.

Referenced by getBoundingBox(), and PCBNEW_PRINTOUT().

PCBNEW_PRINTOUT_SETTINGS PCBNEW_PRINTOUT::m_pcbnewSettings
private

Definition at line 74 of file pcbnew_printout.h.

Referenced by OnPrintPage(), setupPainter(), and setupViewLayers().

const KIGFX::VIEW* BOARD_PRINTOUT::m_view
protectedinherited

Source VIEW object (note that actual printing only refers to this object)

Definition at line 110 of file board_printout.h.

Referenced by BOARD_PRINTOUT::BOARD_PRINTOUT(), and BOARD_PRINTOUT::DrawPage().


The documentation for this class was generated from the following files: