Repair drill mark printing.

1) Make sure that layer dependencies don't prevent us from drawing
drill marks.
2) Don't draw pad shapes when their particular layer isn't enabled
(a side effect from the above)
3) Allow the printout painter to set a different hole colour (the
special case for through-hole pads was handled twice anyway -- once
in LoadColors() and once in draw( D_PAD ).
4) Replace the call to getDrillSize() which handles swapping in the
small mark size if set.

Fixes https://gitlab.com/kicad/code/kicad/issues/4847
This commit is contained in:
Jeff Young 2020-10-19 23:14:46 +01:00
parent 8f67557a65
commit 4233886a05
4 changed files with 74 additions and 55 deletions

View File

@ -253,7 +253,7 @@ public:
void SetSelectFactor( float aFactor ) { m_selectFactor = aFactor; } void SetSelectFactor( float aFactor ) { m_selectFactor = aFactor; }
void SetHighContrastFactor( float aFactor ) { m_hiContrastFactor = aFactor; } void SetHighContrastFactor( float aFactor ) { m_hiContrastFactor = aFactor; }
// TODO: these can go away once we have Cairo-based printing // TODO: these can go away once the worksheet is moved to Cairo-based printing
wxDC* GetPrintDC() { return m_printDC; } wxDC* GetPrintDC() { return m_printDC; }
void SetPrintDC( wxDC* aDC ) { m_printDC = aDC; } void SetPrintDC( wxDC* aDC ) { m_printDC = aDC; }
@ -294,7 +294,8 @@ protected:
// lines. This sets an absolute minimum. // lines. This sets an absolute minimum.
bool m_showPageLimits; bool m_showPageLimits;
wxDC* m_printDC; // This can go away once we have Cairo-based printing. wxDC* m_printDC; // This can go away once the worksheet is moved to
// Cairo-based printing.
}; };
} }

View File

@ -548,11 +548,13 @@ void PCB_DRAW_PANEL_GAL::setDefaultLayerDeps()
m_view->SetLayerDisplayOnly( LAYER_ANCHOR ); m_view->SetLayerDisplayOnly( LAYER_ANCHOR );
// Some more required layers settings // Some more required layers settings
m_view->SetRequired( LAYER_VIAS_HOLES, LAYER_VIA_THROUGH ); m_view->SetRequired( LAYER_VIAS_NETNAMES, LAYER_VIAS );
m_view->SetRequired( LAYER_VIAS_NETNAMES, LAYER_VIA_THROUGH ); m_view->SetRequired( LAYER_PADS_NETNAMES, LAYER_PADS );
m_view->SetRequired( LAYER_PADS_PLATEDHOLES, LAYER_PADS_TH );
m_view->SetRequired( LAYER_NON_PLATEDHOLES, LAYER_PADS_TH ); // Holes can be independent of their host objects (cf: printing drill marks)
m_view->SetRequired( LAYER_PADS_NETNAMES, LAYER_PADS_TH ); m_view->SetRequired( LAYER_VIAS_HOLES, LAYER_VIAS );
m_view->SetRequired( LAYER_PADS_PLATEDHOLES, LAYER_PADS );
m_view->SetRequired( LAYER_NON_PLATEDHOLES, LAYER_PADS );
// Via visibility // Via visibility
m_view->SetRequired( LAYER_VIA_MICROVIA, LAYER_VIAS ); m_view->SetRequired( LAYER_VIA_MICROVIA, LAYER_VIAS );

View File

@ -666,17 +666,25 @@ void PCB_PAINTER::draw( const VIA* aVia, int aLayer )
return; return;
} }
else if( aLayer == LAYER_VIAS_HOLES )
// Choose drawing settings depending on if we are drawing via's pad or hole {
if( aLayer == LAYER_VIAS_HOLES )
radius = getDrillSize( aVia ) / 2.0; radius = getDrillSize( aVia ) / 2.0;
else }
else if( ( aLayer == LAYER_VIA_THROUGH && aVia->GetViaType() == VIATYPE::THROUGH )
|| ( aLayer == LAYER_VIA_BBLIND && aVia->GetViaType() == VIATYPE::BLIND_BURIED )
|| ( aLayer == LAYER_VIA_MICROVIA && aVia->GetViaType() == VIATYPE::MICROVIA ) )
{
radius = aVia->GetWidth() / 2.0; radius = aVia->GetWidth() / 2.0;
}
else
{
return;
}
/// Vias not connected to copper are optionally not drawn /// Vias not connected to copper are optionally not drawn
/// We draw instead the hole size to ensure we show the proper clearance /// We draw instead the hole size to ensure we show the proper clearance
if( IsCopperLayer( aLayer ) && !aVia->FlashLayer( aLayer ) ) if( IsCopperLayer( aLayer ) && !aVia->FlashLayer( aLayer ) )
radius = getDrillSize(aVia) / 2.0 ; radius = getDrillSize( aVia ) / 2.0 ;
bool sketchMode = false; bool sketchMode = false;
COLOR4D color = m_pcbSettings.GetColor( aVia, aLayer ); COLOR4D color = m_pcbSettings.GetColor( aVia, aLayer );
@ -878,10 +886,10 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )
COLOR4D color; COLOR4D color;
// Pad hole color is pad-type-specific: the background color for plated holes and the // Pad hole color is pad-type-specific: the background color for plated holes and the
// pad color for NPTHs. Note the extra check for "should be" NPTHs to keep mis-marked // pad color for NPTHs. However if a pad is mis-marked as plated but has no annular ring
// holes with no annular ring from getting "lost" in the background. // then it will get "lost" in the background.
if( ( aLayer == LAYER_PADS_PLATEDHOLES ) && !aPad->PadShouldBeNPTH() ) if( aLayer == LAYER_PADS_PLATEDHOLES && aPad->PadShouldBeNPTH() )
color = m_pcbSettings.GetBackgroundColor(); color = m_pcbSettings.GetColor( aPad, LAYER_NON_PLATEDHOLES );
else else
color = m_pcbSettings.GetColor( aPad, aLayer ); color = m_pcbSettings.GetColor( aPad, aLayer );
@ -907,7 +915,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )
const SHAPE_SEGMENT* seg = aPad->GetEffectiveHoleShape(); const SHAPE_SEGMENT* seg = aPad->GetEffectiveHoleShape();
if( seg->GetSeg().A == seg->GetSeg().B ) // Circular hole if( seg->GetSeg().A == seg->GetSeg().B ) // Circular hole
m_gal->DrawCircle( seg->GetSeg().A, seg->GetWidth()/2 ); m_gal->DrawCircle( seg->GetSeg().A, getDrillSize( aPad ).x / 2 );
else else
m_gal->DrawSegment( seg->GetSeg().A, seg->GetSeg().B, seg->GetWidth() ); m_gal->DrawSegment( seg->GetSeg().A, seg->GetSeg().B, seg->GetWidth() );
} }

View File

@ -142,11 +142,12 @@ void PCBNEW_PRINTOUT::setupViewLayers( KIGFX::VIEW& aView, const LSET& aLayerSet
if( m_pcbnewSettings.m_asItemCheckboxes ) if( m_pcbnewSettings.m_asItemCheckboxes )
{ {
auto setVisibility = [&]( GAL_LAYER_ID aLayer ) auto setVisibility =
{ [&]( GAL_LAYER_ID aLayer )
if( m_board->IsElementVisible( aLayer ) ) {
aView.SetLayerVisible( aLayer ); if( m_board->IsElementVisible( aLayer ) )
}; aView.SetLayerVisible( aLayer );
};
setVisibility( LAYER_MOD_FR ); setVisibility( LAYER_MOD_FR );
setVisibility( LAYER_MOD_BK ); setVisibility( LAYER_MOD_BK );
@ -172,9 +173,11 @@ void PCBNEW_PRINTOUT::setupViewLayers( KIGFX::VIEW& aView, const LSET& aLayerSet
// Keep certain items always enabled and just rely on either the finer or coarser // Keep certain items always enabled and just rely on either the finer or coarser
// visibility controls // visibility controls
const int alwaysEnabled[] = { const int alwaysEnabled[] =
LAYER_ZONES, LAYER_PADS, LAYER_VIA_MICROVIA, LAYER_VIA_BBLIND, LAYER_VIA_THROUGH {
}; LAYER_ZONES, LAYER_PADS, LAYER_VIA_MICROVIA, LAYER_VIA_BBLIND,
LAYER_VIA_THROUGH
};
for( int item : alwaysEnabled ) for( int item : alwaysEnabled )
aView.SetLayerVisible( item, true ); aView.SetLayerVisible( item, true );
@ -191,33 +194,34 @@ void PCBNEW_PRINTOUT::setupViewLayers( KIGFX::VIEW& aView, const LSET& aLayerSet
if( ( aLayerSet & LSET::AllCuMask() ).any() ) // Items visible on any copper layer if( ( aLayerSet & LSET::AllCuMask() ).any() ) // Items visible on any copper layer
{ {
// Enable items on copper layers, but do not draw holes // Enable items on copper layers, but do not draw holes
for( GAL_LAYER_ID item : { LAYER_PADS_TH, LAYER_VIAS } ) for( GAL_LAYER_ID item : { LAYER_PADS_TH, LAYER_VIA_THROUGH } )
{ {
aView.SetLayerVisible( item, true ); aView.SetLayerVisible( item, true );
} }
if( m_pcbnewSettings.m_drillMarks != PCBNEW_PRINTOUT_SETTINGS::NO_DRILL_SHAPE )
{
// Enable hole layers to draw drill marks
for( GAL_LAYER_ID holeLayer : { LAYER_PADS_PLATEDHOLES, LAYER_NON_PLATEDHOLES,
LAYER_VIAS_HOLES } )
{
aView.SetLayerVisible( holeLayer, true );
aView.SetTopLayer( holeLayer, true );
}
}
} }
// Keep certain items always enabled/disabled and just rely on the layer visibility // Keep certain items always enabled/disabled and just rely on the layer visibility
const int alwaysEnabled[] = { const int alwaysEnabled[] =
LAYER_MOD_TEXT_FR, LAYER_MOD_TEXT_BK, LAYER_MOD_FR, LAYER_MOD_BK, {
LAYER_MOD_VALUES, LAYER_MOD_REFERENCES, LAYER_TRACKS, LAYER_ZONES, LAYER_PADS, LAYER_MOD_TEXT_FR, LAYER_MOD_TEXT_BK, LAYER_MOD_FR, LAYER_MOD_BK,
LAYER_VIA_MICROVIA, LAYER_VIA_BBLIND, LAYER_VIA_THROUGH LAYER_MOD_VALUES, LAYER_MOD_REFERENCES, LAYER_TRACKS, LAYER_ZONES, LAYER_PADS,
}; LAYER_VIAS, LAYER_VIA_MICROVIA, LAYER_VIA_BBLIND
};
for( int item : alwaysEnabled ) for( int item : alwaysEnabled )
aView.SetLayerVisible( item, true ); aView.SetLayerVisible( item, true );
} }
if( m_pcbnewSettings.m_drillMarks != PCBNEW_PRINTOUT_SETTINGS::NO_DRILL_SHAPE )
{
// Enable hole layers to draw drill marks
for( GAL_LAYER_ID holeLayer : { LAYER_PADS_PLATEDHOLES, LAYER_NON_PLATEDHOLES,
LAYER_VIAS_HOLES } )
{
aView.SetLayerVisible( holeLayer, true );
aView.SetTopLayer( holeLayer, true );
}
}
} }
@ -229,25 +233,29 @@ void PCBNEW_PRINTOUT::setupPainter( KIGFX::PAINTER& aPainter )
switch( m_pcbnewSettings.m_drillMarks ) switch( m_pcbnewSettings.m_drillMarks )
{ {
case PCBNEW_PRINTOUT_SETTINGS::NO_DRILL_SHAPE: case PCBNEW_PRINTOUT_SETTINGS::NO_DRILL_SHAPE:
painter.SetDrillMarks( false, 0 ); painter.SetDrillMarks( false, 0 );
break; break;
case PCBNEW_PRINTOUT_SETTINGS::SMALL_DRILL_SHAPE: case PCBNEW_PRINTOUT_SETTINGS::SMALL_DRILL_SHAPE:
painter.SetDrillMarks( false, Millimeter2iu( 0.3 ) ); painter.SetDrillMarks( false, Millimeter2iu( 0.3 ) );
break;
case PCBNEW_PRINTOUT_SETTINGS::FULL_DRILL_SHAPE: painter.GetSettings()->SetLayerColor( LAYER_PADS_PLATEDHOLES, COLOR4D::BLACK );
painter.SetDrillMarks( true ); painter.GetSettings()->SetLayerColor( LAYER_NON_PLATEDHOLES, COLOR4D::BLACK );
break; painter.GetSettings()->SetLayerColor( LAYER_VIAS_HOLES, COLOR4D::BLACK );
break;
case PCBNEW_PRINTOUT_SETTINGS::FULL_DRILL_SHAPE:
painter.SetDrillMarks( true );
painter.GetSettings()->SetLayerColor( LAYER_PADS_PLATEDHOLES, COLOR4D::BLACK );
painter.GetSettings()->SetLayerColor( LAYER_NON_PLATEDHOLES, COLOR4D::BLACK );
painter.GetSettings()->SetLayerColor( LAYER_VIAS_HOLES, COLOR4D::BLACK );
break;
} }
painter.GetSettings()->SetDrawIndividualViaLayers( painter.GetSettings()->SetDrawIndividualViaLayers(
m_pcbnewSettings.m_pagination == PCBNEW_PRINTOUT_SETTINGS::LAYER_PER_PAGE ); m_pcbnewSettings.m_pagination == PCBNEW_PRINTOUT_SETTINGS::LAYER_PER_PAGE );
painter.GetSettings()->SetLayerColor( LAYER_PADS_PLATEDHOLES, COLOR4D::WHITE );
painter.GetSettings()->SetLayerColor( LAYER_NON_PLATEDHOLES, COLOR4D::WHITE );
painter.GetSettings()->SetLayerColor( LAYER_VIAS_HOLES, COLOR4D::WHITE );
} }