mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
CHANGED: moved footprint lock shadows to children.
A full bounding hull wash gets overwhelming on boards with lots of mechanically-constrained objects. Fixes https://gitlab.com/kicad/code/kicad/-/issues/14007
This commit is contained in:
parent
2e556d0abc
commit
661d002234
@ -2235,9 +2235,6 @@ std::vector<int> FOOTPRINT::ViewGetLayers() const
|
||||
break;
|
||||
}
|
||||
|
||||
if( IsLocked() )
|
||||
layers.push_back( LAYER_LOCKED_ITEM_SHADOW );
|
||||
|
||||
if( IsConflicting() )
|
||||
layers.push_back( LAYER_CONFLICTS_SHADOW );
|
||||
|
||||
@ -2270,18 +2267,6 @@ std::vector<int> FOOTPRINT::ViewGetLayers() const
|
||||
|
||||
double FOOTPRINT::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
|
||||
{
|
||||
if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
|
||||
{
|
||||
// The locked shadow shape is shown only if the footprint itself is visible
|
||||
if( ( m_layer == F_Cu ) && aView->IsLayerVisible( LAYER_FOOTPRINTS_FR ) )
|
||||
return LOD_SHOW;
|
||||
|
||||
if( ( m_layer == B_Cu ) && aView->IsLayerVisible( LAYER_FOOTPRINTS_BK ) )
|
||||
return LOD_SHOW;
|
||||
|
||||
return LOD_HIDE;
|
||||
}
|
||||
|
||||
if( aLayer == LAYER_CONFLICTS_SHADOW && IsConflicting() )
|
||||
{
|
||||
// The locked shadow shape is shown only if the footprint itself is visible
|
||||
|
@ -1692,6 +1692,10 @@ std::vector<int> PAD::ViewGetLayers() const
|
||||
if( m_attribute == PAD_ATTRIB::NPTH )
|
||||
layers.push_back( LAYER_NON_PLATEDHOLES );
|
||||
|
||||
|
||||
if( IsLocked() || ( GetParentFootprint() && GetParentFootprint()->IsLocked() ) )
|
||||
layers.push_back( LAYER_LOCKED_ITEM_SHADOW );
|
||||
|
||||
LSET cuLayers = ( m_padStack.LayerSet() & LSET::AllCuMask() );
|
||||
|
||||
// Don't spend cycles rendering layers that aren't visible
|
||||
|
@ -201,10 +201,12 @@ COLOR4D PCB_RENDER_SETTINGS::GetColor( const BOARD_ITEM* aItem, int aLayer ) con
|
||||
int netCode = -1;
|
||||
int originalLayer = aLayer;
|
||||
|
||||
// Marker shadows
|
||||
if( aLayer == LAYER_MARKER_SHADOWS )
|
||||
return m_backgroundColor.WithAlpha( 0.6 );
|
||||
|
||||
if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
|
||||
return m_layerColors.at( aLayer );
|
||||
|
||||
// SMD pads use the copper netname layer
|
||||
if( aLayer == LAYER_PAD_FR_NETNAMES )
|
||||
aLayer = GetNetnameLayer( F_Cu );
|
||||
@ -297,10 +299,10 @@ COLOR4D PCB_RENDER_SETTINGS::GetColor( const BOARD_ITEM* aItem, int aLayer ) con
|
||||
|
||||
// Some graphic objects are BOARD_CONNECTED_ITEM, but they are seen here as
|
||||
// actually board connected objects only if on a copper layer
|
||||
const BOARD_CONNECTED_ITEM* conItem =
|
||||
aItem->IsConnected() && aItem->IsOnCopperLayer()
|
||||
? static_cast<const BOARD_CONNECTED_ITEM*>( aItem )
|
||||
: nullptr;
|
||||
const BOARD_CONNECTED_ITEM* conItem = nullptr;
|
||||
|
||||
if( aItem->IsConnected() && aItem->IsOnCopperLayer() )
|
||||
conItem = static_cast<const BOARD_CONNECTED_ITEM*>( aItem );
|
||||
|
||||
// Try to obtain the netcode for the aItem
|
||||
if( conItem )
|
||||
@ -1461,6 +1463,28 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
|
||||
if( m_pcbSettings.m_ForcePadSketchModeOn )
|
||||
outline_mode = true;
|
||||
|
||||
bool drawShape = false;
|
||||
|
||||
if( m_pcbSettings.IsPrinting() )
|
||||
{
|
||||
drawShape = aPad->FlashLayer( m_pcbSettings.GetPrintLayers() );
|
||||
}
|
||||
else if( ( aLayer < PCB_LAYER_ID_COUNT || IsPadCopperLayer( aLayer ) )
|
||||
&& aPad->FlashLayer( pcbLayer ) )
|
||||
{
|
||||
drawShape = true;
|
||||
}
|
||||
else if( aPad->IsSelected() )
|
||||
{
|
||||
drawShape = true;
|
||||
outline_mode = true;
|
||||
}
|
||||
else if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
|
||||
{
|
||||
drawShape = true;
|
||||
outline_mode = false;
|
||||
}
|
||||
|
||||
if( outline_mode )
|
||||
{
|
||||
// Outline mode
|
||||
@ -1477,8 +1501,6 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
|
||||
m_gal->SetFillColor( color );
|
||||
}
|
||||
|
||||
bool drawShape = false;
|
||||
|
||||
if( aLayer == LAYER_PAD_PLATEDHOLES || aLayer == LAYER_NON_PLATEDHOLES )
|
||||
{
|
||||
SHAPE_SEGMENT slot = getPadHoleShape( aPad );
|
||||
@ -1488,52 +1510,53 @@ void PCB_PAINTER::draw( const PAD* aPad, int aLayer )
|
||||
else
|
||||
m_gal->DrawSegment( slot.GetSeg().A, slot.GetSeg().B, slot.GetWidth() );
|
||||
}
|
||||
else if( m_pcbSettings.IsPrinting() )
|
||||
{
|
||||
drawShape = aPad->FlashLayer( m_pcbSettings.GetPrintLayers() );
|
||||
}
|
||||
else if( ( aLayer < PCB_LAYER_ID_COUNT || IsPadCopperLayer( aLayer ) )
|
||||
&& aPad->FlashLayer( pcbLayer ) )
|
||||
{
|
||||
drawShape = true;
|
||||
}
|
||||
else if( aPad->IsSelected() )
|
||||
{
|
||||
drawShape = true;
|
||||
outline_mode = true;
|
||||
}
|
||||
|
||||
if( outline_mode )
|
||||
{
|
||||
// Outline mode
|
||||
m_gal->SetIsFill( false );
|
||||
m_gal->SetIsStroke( true );
|
||||
m_gal->SetLineWidth( m_pcbSettings.m_outlineWidth );
|
||||
m_gal->SetStrokeColor( color );
|
||||
}
|
||||
|
||||
if( drawShape )
|
||||
else if( drawShape )
|
||||
{
|
||||
VECTOR2I pad_size = aPad->GetSize( pcbLayer );
|
||||
VECTOR2I margin;
|
||||
|
||||
auto getExpansion =
|
||||
[&]( PCB_LAYER_ID layer )
|
||||
{
|
||||
VECTOR2I expansion;
|
||||
|
||||
switch( aLayer )
|
||||
{
|
||||
case F_Mask:
|
||||
case B_Mask:
|
||||
margin.x = margin.y = aPad->GetSolderMaskExpansion( pcbLayer );
|
||||
expansion.x = expansion.y = aPad->GetSolderMaskExpansion( layer );
|
||||
break;
|
||||
|
||||
case F_Paste:
|
||||
case B_Paste:
|
||||
margin = aPad->GetSolderPasteMargin( pcbLayer );
|
||||
expansion = aPad->GetSolderPasteMargin( layer );
|
||||
break;
|
||||
|
||||
default:
|
||||
margin.x = margin.y = 0;
|
||||
expansion.x = expansion.y = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return expansion;
|
||||
};
|
||||
|
||||
if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
|
||||
{
|
||||
LSET visibleLayers = aPad->GetBoard()->GetVisibleLayers()
|
||||
& aPad->GetBoard()->GetEnabledLayers()
|
||||
& aPad->GetLayerSet();
|
||||
|
||||
for( PCB_LAYER_ID layer : visibleLayers )
|
||||
margin = std::max( margin, getExpansion( layer ) );
|
||||
|
||||
margin.x += m_lockedShadowMargin / 2;
|
||||
margin.y += m_lockedShadowMargin / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
margin = getExpansion( pcbLayer );
|
||||
}
|
||||
|
||||
std::unique_ptr<PAD> dummyPad;
|
||||
std::shared_ptr<SHAPE_COMPOUND> shapes;
|
||||
|
||||
|
@ -697,7 +697,7 @@ std::vector<int> PCB_SHAPE::ViewGetLayers() const
|
||||
}
|
||||
}
|
||||
|
||||
if( IsLocked() )
|
||||
if( IsLocked() || ( GetParentFootprint() && GetParentFootprint()->IsLocked() ) )
|
||||
layers.push_back( LAYER_LOCKED_ITEM_SHADOW );
|
||||
|
||||
return layers;
|
||||
|
@ -209,7 +209,7 @@ const BOX2I PCB_TEXT::ViewBBox() const
|
||||
|
||||
std::vector<int> PCB_TEXT::ViewGetLayers() const
|
||||
{
|
||||
if( IsLocked() )
|
||||
if( IsLocked() || ( GetParentFootprint() && GetParentFootprint()->IsLocked() ) )
|
||||
return { GetLayer(), LAYER_LOCKED_ITEM_SHADOW };
|
||||
|
||||
return { GetLayer() };
|
||||
|
@ -401,7 +401,7 @@ double PCB_TEXTBOX::ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const
|
||||
|
||||
std::vector<int> PCB_TEXTBOX::ViewGetLayers() const
|
||||
{
|
||||
if( IsLocked() )
|
||||
if( IsLocked() || ( GetParentFootprint() && GetParentFootprint()->IsLocked() ) )
|
||||
return { GetLayer(), LAYER_LOCKED_ITEM_SHADOW };
|
||||
|
||||
return { GetLayer() };
|
||||
|
Loading…
x
Reference in New Issue
Block a user