From 30d41b33d19c3a47406e596141995b5bef4ac558 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Tue, 25 Sep 2012 09:49:29 +0200 Subject: [PATCH] Finishing code cleaning in plot functions. --- pcbnew/pcbplot.h | 10 ++- pcbnew/plot_board_layers.cpp | 125 +++++++++---------------------- pcbnew/plot_brditems_plotter.cpp | 55 +++++++++++++- 3 files changed, 96 insertions(+), 94 deletions(-) diff --git a/pcbnew/pcbplot.h b/pcbnew/pcbplot.h index 4c57dace42..7de7fe5850 100644 --- a/pcbnew/pcbplot.h +++ b/pcbnew/pcbplot.h @@ -90,7 +90,15 @@ public: void PlotDrawSegment( DRAWSEGMENT* PtSegm ); /** - * lot items like text and graphics, + * Plot a pad. + * unlike other items, a pad had not a specific color, + * and be drawn as a non filled item although the plot mode is filled + * color and plot mode are needed by this function + */ + void PlotPad( D_PAD* aPad, EDA_COLOR_T aColor, EDA_DRAW_MODE_T aPlotMode ); + + /** + * plot items like text and graphics, * but not tracks and modules */ void PlotBoardGraphicItems(); diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index bf6ae6b8ff..a9bf4c8cb8 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -85,8 +85,6 @@ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, if( (masklayer & layersmask_plotpads) == 0 ) continue; - wxPoint shape_pos = pad->ReturnShapePos(); - EDA_COLOR_T color = ColorFromInt(0); if( (layersmask_plotpads & SILKSCREEN_LAYER_BACK) ) color = aBoard->GetLayerColor( SILKSCREEN_N_BACK ); @@ -94,36 +92,7 @@ void PlotSilkScreen( BOARD *aBoard, PLOTTER* aPlotter, long aLayerMask, if((layersmask_plotpads & SILKSCREEN_LAYER_FRONT ) ) color = ColorFromInt( color | aBoard->GetLayerColor( SILKSCREEN_N_FRONT ) ); - // Set plot color (change WHITE to LIGHTGRAY because - // the white items are not seen on a white paper or screen - aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); - - switch( pad->GetShape() ) - { - case PAD_CIRCLE: - aPlotter->FlashPadCircle( shape_pos, pad->GetSize().x, LINE ); - break; - - case PAD_OVAL: - aPlotter->FlashPadOval( shape_pos, pad->GetSize(), - pad->GetOrientation(), LINE ); - break; - - case PAD_TRAPEZOID: - { - wxPoint coord[4]; - pad->BuildPadPolygon( coord, wxSize(0,0), 0 ); - aPlotter->FlashPadTrapez( shape_pos, coord, - pad->GetOrientation(), LINE ); - } - break; - - case PAD_RECT: - default: - aPlotter->FlashPadRect( shape_pos, pad->GetSize(), - pad->GetOrientation(), LINE ); - break; - } + itemplotter.PlotPad( pad, color, LINE ); } } } @@ -302,15 +271,11 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, if( (pad->GetLayerMask() & aLayerMask) == 0 ) continue; - wxPoint shape_pos = pad->ReturnShapePos(); - wxSize margin; double width_adj = 0; if( aLayerMask & ALL_CU_LAYERS ) - { width_adj = itemplotter.getFineWidthAdj(); - } switch( aLayerMask & ( SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT | @@ -330,12 +295,12 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, break; } - wxSize size; - size.x = pad->GetSize().x + ( 2 * margin.x ) + width_adj; - size.y = pad->GetSize().y + ( 2 * margin.y ) + width_adj; + wxSize padPlotsSize; + padPlotsSize.x = pad->GetSize().x + ( 2 * margin.x ) + width_adj; + padPlotsSize.y = pad->GetSize().y + ( 2 * margin.y ) + width_adj; // Don't draw a null size item : - if( size.x <= 0 || size.y <= 0 ) + if( padPlotsSize.x <= 0 || padPlotsSize.y <= 0 ) continue; EDA_COLOR_T color = BLACK; @@ -346,43 +311,27 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, if((pad->GetLayerMask() & LAYER_FRONT ) ) color = ColorFromInt( color | aBoard->GetVisibleElementColor( PAD_FR_VISIBLE ) ); - // Set plot color (change WHITE to LIGHTGRAY because - // the white items are not seen on a white paper or screen - aPlotter->SetColor( color != WHITE ? color : LIGHTGRAY); - + // Temporary set the pad size to the required plot size: + wxSize tmppadsize = pad->GetSize(); + pad->SetSize( padPlotsSize ); switch( pad->GetShape() ) { case PAD_CIRCLE: - if( aPlotOpt.GetSkipPlotNPTH_Pads() && - (pad->GetSize() == pad->GetDrillSize()) && - (pad->GetAttribute() == PAD_HOLE_NOT_PLATED) ) - break; - - aPlotter->FlashPadCircle( shape_pos, size.x, plotMode ); - break; - case PAD_OVAL: if( aPlotOpt.GetSkipPlotNPTH_Pads() && (pad->GetSize() == pad->GetDrillSize()) && (pad->GetAttribute() == PAD_HOLE_NOT_PLATED) ) break; - aPlotter->FlashPadOval( shape_pos, size, pad->GetOrientation(), plotMode ); - break; - + // Fall through: case PAD_TRAPEZOID: - { - wxPoint coord[4]; - pad->BuildPadPolygon( coord, margin, 0 ); - aPlotter->FlashPadTrapez( shape_pos, coord, pad->GetOrientation(), plotMode ); - } - break; - case PAD_RECT: default: - aPlotter->FlashPadRect( shape_pos, size, pad->GetOrientation(), plotMode ); + itemplotter.PlotPad( pad, color, plotMode ); break; } + + pad->SetSize( tmppadsize ); // Restore the pad size } } @@ -663,38 +612,34 @@ PLOTTER *StartPlotBoard( BOARD *aBoard, PCB_PLOT_PARAMS *aPlotOpts, wxASSERT( false ); } - if( the_plotter ) + the_plotter->SetFilename( aFullFileName ); + + // Compute the viewport and set the other options + initializePlotter( the_plotter, aBoard, aPlotOpts ); + + if( the_plotter->StartPlot( output_file ) ) { - the_plotter->SetFilename( aFullFileName ); + // Plot the frame reference if requested + if( aPlotOpts->GetPlotFrameRef() ) + PlotWorkSheet( the_plotter, aBoard->GetTitleBlock(), + aBoard->GetPageSettings(), + 1, 1, // Only one page + aSheetDesc, aBoard->GetFileName() ); - // Compute the viewport and set the other options - initializePlotter( the_plotter, aBoard, aPlotOpts ); - - if( the_plotter->StartPlot( output_file ) ) + /* When plotting a negative board: draw a black rectangle + * (background for plot board in white) and switch the current + * color to WHITE; note the color inversion is actually done + * in the driver (if supported) */ + if( aPlotOpts->GetNegative() ) { - // Plot the frame reference if requested - if( aPlotOpts->GetPlotFrameRef() ) - PlotWorkSheet( the_plotter, aBoard->GetTitleBlock(), - aBoard->GetPageSettings(), - 1, 1, // Only one page - aSheetDesc, aBoard->GetFileName() ); - - /* When plotting a negative board: draw a black rectangle - * (background for plot board in white) and switch the current - * color to WHITE; note the color inversion is actually done - * in the driver (if supported) */ - if( aPlotOpts->GetNegative() ) - { - EDA_RECT bbox = aBoard->ComputeBoundingBox(); - FillNegativeKnockout( the_plotter, bbox ); - } - - return the_plotter; + EDA_RECT bbox = aBoard->ComputeBoundingBox(); + FillNegativeKnockout( the_plotter, bbox ); } + + return the_plotter; } - // error in start_plot( ) or before - wxMessageBox( _("Error creating plot file") ); - delete the_plotter; + // error in start_plot( ) + delete the_plotter; // will close also output_file return NULL; } diff --git a/pcbnew/plot_brditems_plotter.cpp b/pcbnew/plot_brditems_plotter.cpp index 6b8c413882..2de73bfb9e 100644 --- a/pcbnew/plot_brditems_plotter.cpp +++ b/pcbnew/plot_brditems_plotter.cpp @@ -68,6 +68,55 @@ EDA_COLOR_T BRDITEMS_PLOTTER::getColor( int aLayer ) return color; } +/* + * Plot a pad. + * unlike other items, a pad had not a specific color, + * and be drawn as a non filled item although the plot mode is filled + * color and plot mode are needed by this function + */ +void BRDITEMS_PLOTTER::PlotPad( D_PAD* aPad, EDA_COLOR_T aColor, EDA_DRAW_MODE_T aPlotMode ) +{ + wxPoint shape_pos = aPad->ReturnShapePos(); + + // Set plot color (change WHITE to LIGHTGRAY because + // the white items are not seen on a white paper or screen + m_plotter->SetColor( aColor != WHITE ? aColor : LIGHTGRAY); + + switch( aPad->GetShape() ) + { + case PAD_CIRCLE: + m_plotter->FlashPadCircle( shape_pos, aPad->GetSize().x, aPlotMode ); + break; + + case PAD_OVAL: + m_plotter->FlashPadOval( shape_pos, aPad->GetSize(), + aPad->GetOrientation(), aPlotMode ); + break; + + case PAD_TRAPEZOID: + { + wxPoint coord[4]; + aPad->BuildPadPolygon( coord, wxSize(0,0), 0 ); + m_plotter->FlashPadTrapez( shape_pos, coord, + aPad->GetOrientation(), aPlotMode ); + } + break; + + case PAD_RECT: + default: + m_plotter->FlashPadRect( shape_pos, aPad->GetSize(), + aPad->GetOrientation(), aPlotMode ); + break; + } +} + +/* + * Plot field of a module (footprint) + * Reference, Value, and other fields are plotted only if + * the corresponding option is enabled + * Invisible text fields are plotted only if PlotInvisibleText option is set + * usually they are not plotted. + */ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule ) { // see if we want to plot VALUE and REF fields @@ -77,7 +126,7 @@ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule ) TEXTE_MODULE* textModule = aModule->m_Reference; unsigned textLayer = textModule->GetLayer(); - if( textLayer >= 32 ) + if( textLayer >= LAYER_COUNT ) return false; if( ( ( 1 << textLayer ) & m_layerMask ) == 0 ) @@ -89,7 +138,7 @@ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule ) textModule = aModule->m_Value; textLayer = textModule->GetLayer(); - if( textLayer > 32 ) + if( textLayer > LAYER_COUNT ) return false; if( ( (1 << textLayer) & m_layerMask ) == 0 ) @@ -129,7 +178,7 @@ bool BRDITEMS_PLOTTER::PlotAllTextsModule( MODULE* aModule ) textLayer = textModule->GetLayer(); - if( textLayer >= 32 ) + if( textLayer >= LAYER_COUNT ) return false; if( !( ( 1 << textLayer ) & m_layerMask ) )