EEschema: avoid DNP and EXCLUDE from SIM markers blinking when moving an object

They were redrawn multiple times, and not always on the right graphic layer, thus
creating draw artifacts.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20483
This commit is contained in:
jean-pierre charras 2025-07-07 16:38:50 +02:00
parent c71adb0a89
commit b8d2bdb3d2

View File

@ -2286,8 +2286,7 @@ void SCH_PAINTER::draw( const SCH_SYMBOL* aSymbol, int aLayer )
tempPin->SetOperatingPoint( symbolPin->GetOperatingPoint() );
}
draw( &tempSymbol, aLayer, false, aSymbol->GetUnit(), aSymbol->GetBodyStyle(),
DNP );
draw( &tempSymbol, aLayer, false, aSymbol->GetUnit(), aSymbol->GetBodyStyle(), DNP );
for( unsigned i = 0; i < tempPins.size(); ++i )
{
@ -2300,9 +2299,12 @@ void SCH_PAINTER::draw( const SCH_SYMBOL* aSymbol, int aLayer )
// IS_SHOWN_AS_BITMAP
}
if( DNP )
// Draw DNP and EXCLUDE from SIM markers.
// These drawings are associated to the symbol body, so draw them only when the LAYER_DEVICE
// is drawn (to avoid draw artifacts).
if( DNP && aLayer == LAYER_DEVICE )
{
int layer = LAYER_DNP_MARKER;
COLOR4D marker_color = m_schSettings.GetLayerColor( LAYER_DNP_MARKER );
BOX2I bbox = aSymbol->GetBodyBoundingBox();
BOX2I pins = aSymbol->GetBodyAndPinsBoundingBox();
VECTOR2D margins( std::max( bbox.GetX() - pins.GetX(), pins.GetEnd().x - bbox.GetEnd().x ),
@ -2321,17 +2323,17 @@ void SCH_PAINTER::draw( const SCH_SYMBOL* aSymbol, int aLayer )
m_gal->AdvanceDepth();
m_gal->SetIsStroke( true );
m_gal->SetIsFill( true );
m_gal->SetStrokeColor( m_schSettings.GetLayerColor( layer ) );
m_gal->SetFillColor( m_schSettings.GetLayerColor( layer ) );
m_gal->SetStrokeColor( marker_color );
m_gal->SetFillColor( marker_color );
m_gal->DrawSegment( pt1, pt2, strokeWidth );
std::swap( pt1.x, pt2.x );
m_gal->DrawSegment( pt1, pt2, strokeWidth );
}
if( markExclusion )
if( markExclusion && aLayer == LAYER_DEVICE )
{
int layer = LAYER_EXCLUDED_FROM_SIM;
COLOR4D marker_color = m_schSettings.GetLayerColor( LAYER_EXCLUDED_FROM_SIM );
BOX2I bbox = aSymbol->GetBodyBoundingBox();
int strokeWidth = schIUScale.MilsToIU( ADVANCED_CFG::GetCfg().m_ExcludeFromSimulationLineWidth );
@ -2341,8 +2343,8 @@ void SCH_PAINTER::draw( const SCH_SYMBOL* aSymbol, int aLayer )
m_gal->AdvanceDepth();
m_gal->SetIsStroke( true );
m_gal->SetIsFill( true );
m_gal->SetStrokeColor( m_schSettings.GetLayerColor( layer ).WithAlpha( 0.5 ) );
m_gal->SetFillColor( m_schSettings.GetLayerColor( layer ).WithAlpha( 0.5 ) );
m_gal->SetStrokeColor( marker_color );
m_gal->SetFillColor( marker_color );
m_gal->DrawSegment( bbox.GetPosition(), VECTOR2D( bbox.GetEnd().x, bbox.GetY() ), strokeWidth );
m_gal->DrawSegment( VECTOR2D( bbox.GetEnd().x, bbox.GetY() ), bbox.GetEnd(), strokeWidth );
@ -2356,10 +2358,10 @@ void SCH_PAINTER::draw( const SCH_SYMBOL* aSymbol, int aLayer )
VECTOR2D top = center + VECTOR2D( 0, offset );
VECTOR2D bottom = center + VECTOR2D( 0, -offset );
m_gal->SetFillColor( m_schSettings.GetLayerColor( layer ).WithAlpha( 0.1 ) );
m_gal->SetFillColor( marker_color.WithAlpha( 0.1 ) );
m_gal->DrawCircle( center, offset );
m_gal->AdvanceDepth();
m_gal->SetFillColor( m_schSettings.GetLayerColor( layer ).WithAlpha( 0.5 ) );
m_gal->SetFillColor( marker_color );
m_gal->DrawCurve( left, top, bottom, right, 1 );
}
}