PcbNew: Improved DRC marker display

Add shadows and slightly reduce size

Fixes https://gitlab.com/kicad/code/kicad/-/issues/5936
This commit is contained in:
Jon Evans 2020-10-12 18:24:35 -04:00
parent a1c75748a0
commit 4b436fa573
9 changed files with 68 additions and 18 deletions

View File

@ -161,6 +161,7 @@ wxString LayerName( int aLayer )
case LAYER_DRC_WARNING: return _( "DRC Warnings" );
case LAYER_DRC_ERROR: return _( "DRC Errors" );
case LAYER_DRC_EXCLUSION: return _( "DRC Exclusions" );
case LAYER_MARKER_SHADOWS: return _( "DRC Marker Shadows" );
case LAYER_ANCHOR: return _( "Anchors" );
case LAYER_WORKSHEET: return _( "Worksheet" );
case LAYER_CURSOR: return _( "Cursor" );

View File

@ -106,10 +106,13 @@ bool MARKER_BASE::HitTestMarker( const wxPoint& aHitPosition, int aAccuracy ) co
}
void MARKER_BASE::ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon) const
void MARKER_BASE::ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon, int aScale ) const
{
if( aScale < 0 )
aScale = MarkerScale();
for( const VECTOR2I& corner : MarkerShapeCorners )
aPolygon.Append( corner * MarkerScale() );
aPolygon.Append( corner * aScale );
// Be sure aPolygon is seen as a closed polyline:
aPolygon.SetClosed( true );

View File

@ -205,6 +205,7 @@ enum GAL_LAYER_ID: int
LAYER_DRC_ERROR, ///< layer for drc markers with SEVERITY_ERROR
LAYER_DRC_WARNING, ///< layer for drc markers with SEVERITY_WARNING
LAYER_DRC_EXCLUSION, ///< layer for drc markers which have been individually excluded
LAYER_MARKER_SHADOWS, ///< shadows for drc markers
LAYER_WORKSHEET, ///< worksheet frame
LAYER_GP_OVERLAY, ///< general purpose overlay
LAYER_SELECT_OVERLAY, ///< currently selected items overlay

View File

@ -84,7 +84,7 @@ public:
* the coordinates are relatives to the marker position (are not absolute)
* @param aPolygon is the SHAPE_LINE_CHAIN to fill with the shape
*/
void ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon) const;
void ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon, int aScale = -1 ) const;
/**
* Function PrintMarker

View File

@ -38,7 +38,7 @@
/// Factor to convert the maker unit shape to internal units:
#define SCALING_FACTOR Millimeter2iu( 0.1 )
#define SCALING_FACTOR Millimeter2iu( 0.075 )
@ -144,7 +144,9 @@ BITMAP_DEF MARKER_PCB::GetMenuImage() const
void MARKER_PCB::ViewGetLayers( int aLayers[], int& aCount ) const
{
aCount = 1;
aCount = 2;
aLayers[1] = LAYER_MARKER_SHADOWS;
if( IsExcluded() )
{

View File

@ -363,7 +363,8 @@ std::set<int> g_excludedLayers =
LAYER_MOD_TEXT_BK,
LAYER_PADS_PLATEDHOLES,
LAYER_GP_OVERLAY,
LAYER_DRAW_BITMAPS
LAYER_DRAW_BITMAPS,
LAYER_MARKER_SHADOWS
};

View File

@ -53,7 +53,7 @@ const LAYER_NUM GAL_LAYER_ORDER[] =
{
LAYER_GP_OVERLAY,
LAYER_SELECT_OVERLAY,
LAYER_DRC_ERROR, LAYER_DRC_WARNING, LAYER_DRC_EXCLUSION,
LAYER_DRC_ERROR, LAYER_DRC_WARNING, LAYER_DRC_EXCLUSION, LAYER_MARKER_SHADOWS,
LAYER_PADS_NETNAMES, LAYER_VIAS_NETNAMES,
Dwgs_User, Cmts_User, Eco1_User, Eco2_User, Edge_Cuts,
@ -279,7 +279,7 @@ void PCB_DRAW_PANEL_GAL::SetHighContrastLayer( PCB_LAYER_ID aLayer )
LAYER_PADS_TH, LAYER_PADS_PLATEDHOLES, LAYER_PADS_NETNAMES,
LAYER_DRC_ERROR, LAYER_DRC_WARNING, LAYER_DRC_EXCLUSION,
LAYER_NON_PLATEDHOLES, LAYER_SELECT_OVERLAY, LAYER_GP_OVERLAY,
LAYER_RATSNEST, LAYER_CURSOR, LAYER_ANCHOR
LAYER_RATSNEST, LAYER_CURSOR, LAYER_ANCHOR, LAYER_MARKER_SHADOWS
};
for( unsigned int i : layers )
@ -315,7 +315,7 @@ void PCB_DRAW_PANEL_GAL::SetTopLayer( PCB_LAYER_ID aLayer )
LAYER_VIA_THROUGH, LAYER_VIAS_HOLES, LAYER_VIAS_NETNAMES, LAYER_PADS_TH,
LAYER_PADS_PLATEDHOLES, LAYER_PADS_NETNAMES, LAYER_NON_PLATEDHOLES,
LAYER_SELECT_OVERLAY, LAYER_GP_OVERLAY, LAYER_RATSNEST, LAYER_DRC_ERROR,
LAYER_DRC_WARNING, LAYER_DRC_EXCLUSION
LAYER_DRC_WARNING, LAYER_DRC_EXCLUSION, LAYER_MARKER_SHADOWS
};
for( auto layer : layers )
@ -406,6 +406,7 @@ void PCB_DRAW_PANEL_GAL::SyncLayersVisibility( const BOARD* aBoard )
m_view->SetLayerVisible( LAYER_GP_OVERLAY, true );
m_view->SetLayerVisible( LAYER_SELECT_OVERLAY, true );
m_view->SetLayerVisible( LAYER_RATSNEST, true );
m_view->SetLayerVisible( LAYER_MARKER_SHADOWS, true );
}
@ -573,13 +574,22 @@ void PCB_DRAW_PANEL_GAL::setDefaultLayerDeps()
m_view->SetRequired( LAYER_MOD_TEXT_BK, LAYER_MOD_BK );
m_view->SetRequired( LAYER_PAD_BK_NETNAMES, LAYER_PAD_BK );
m_view->SetLayerTarget( LAYER_SELECT_OVERLAY , KIGFX::TARGET_OVERLAY );
m_view->SetLayerTarget( LAYER_SELECT_OVERLAY, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_SELECT_OVERLAY ) ;
m_view->SetLayerTarget( LAYER_GP_OVERLAY , KIGFX::TARGET_OVERLAY );
m_view->SetLayerTarget( LAYER_GP_OVERLAY, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_GP_OVERLAY ) ;
m_view->SetLayerTarget( LAYER_RATSNEST, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_RATSNEST );
m_view->SetLayerTarget( LAYER_DRC_ERROR, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_DRC_ERROR );
m_view->SetLayerTarget( LAYER_DRC_WARNING, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_DRC_WARNING );
m_view->SetLayerTarget( LAYER_DRC_EXCLUSION, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_DRC_EXCLUSION );
m_view->SetLayerTarget( LAYER_MARKER_SHADOWS, KIGFX::TARGET_OVERLAY );
m_view->SetLayerDisplayOnly( LAYER_MARKER_SHADOWS );
m_view->SetLayerTarget( LAYER_WORKSHEET, KIGFX::TARGET_NONCACHED );
m_view->SetLayerDisplayOnly( LAYER_WORKSHEET ) ;
m_view->SetLayerDisplayOnly( LAYER_GRID );

View File

@ -240,6 +240,17 @@ COLOR4D PCB_RENDER_SETTINGS::GetColor( const VIEW_ITEM* aItem, int aLayer ) cons
if( m_hiContrastEnabled && IsNetnameLayer( aLayer ) && m_highContrastLayers.count( aLayer ) == 0 )
return COLOR4D::CLEAR;
// Marker shadows
if( aLayer == LAYER_MARKER_SHADOWS )
{
COLOR4D shadowColor = m_backgroundColor.WithAlpha( 0.6 );
if( item && item->IsSelected() )
shadowColor.Brighten( m_selectFactor );
return shadowColor;
}
// Normal path: get the layer base color
COLOR4D color = m_layerColors[aLayer];
@ -461,7 +472,7 @@ bool PCB_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer )
break;
case PCB_MARKER_T:
draw( static_cast<const MARKER_PCB*>( item ) );
draw( static_cast<const MARKER_PCB*>( item ), aLayer );
break;
default:
@ -1555,18 +1566,39 @@ void PCB_PAINTER::draw( const PCB_TARGET* aTarget )
}
void PCB_PAINTER::draw( const MARKER_PCB* aMarker )
void PCB_PAINTER::draw( const MARKER_PCB* aMarker, int aLayer )
{
bool isShadow = aLayer == LAYER_MARKER_SHADOWS;
// Don't paint shadows for invisible markers.
// It would be nice to do this through layer dependencies but we can't do an "or" there today
if( isShadow && aMarker->GetBoard() &&
!aMarker->GetBoard()->IsElementVisible( aMarker->GetColorLayer() ) )
return;
SHAPE_LINE_CHAIN polygon;
aMarker->ShapeToPolygon( polygon );
auto strokeColor = m_pcbSettings.GetColor( aMarker, aMarker->GetColorLayer() );
COLOR4D color = m_pcbSettings.GetColor( aMarker, isShadow ? LAYER_MARKER_SHADOWS
: aMarker->GetColorLayer() );
m_gal->Save();
m_gal->Translate( aMarker->GetPosition() );
m_gal->SetFillColor( strokeColor );
m_gal->SetIsFill( true );
m_gal->SetIsStroke( false );
if( isShadow )
{
m_gal->SetStrokeColor( color );
m_gal->SetIsStroke( true );
m_gal->SetLineWidth( aMarker->MarkerScale() );
}
else
{
m_gal->SetFillColor( color );
m_gal->SetIsFill( true );
}
m_gal->DrawPolygon( polygon );
m_gal->Restore();
}

View File

@ -293,7 +293,7 @@ protected:
void draw( const ZONE_CONTAINER* aZone, int aLayer );
void draw( const DIMENSION* aDimension, int aLayer );
void draw( const PCB_TARGET* aTarget );
void draw( const MARKER_PCB* aMarker );
void draw( const MARKER_PCB* aMarker, int aLayer );
/**
* Function getLineThickness()