Browse Source

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
pull/18/head
jean-pierre charras 3 months ago
parent
commit
b8d2bdb3d2
  1. 26
      eeschema/sch_painter.cpp

26
eeschema/sch_painter.cpp

@ -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 );
}
}

Loading…
Cancel
Save