Pcbnew 3D: Add a toggle for plated barrel visibility

This can be useful when checking 3D models and/or generating
images of components in place on board, or if a dense via field is
in the way when looking at something on an inner layer.
This commit is contained in:
John Beard 2025-08-05 19:36:50 +08:00
parent 71750aa87e
commit e82d19eeb7
6 changed files with 35 additions and 13 deletions

View File

@ -759,6 +759,7 @@ void BOARD_ADAPTER::SetLayerColors( const std::map<int, COLOR4D>& aColors )
void BOARD_ADAPTER::SetVisibleLayers( const std::bitset<LAYER_3D_END>& aLayers ) void BOARD_ADAPTER::SetVisibleLayers( const std::bitset<LAYER_3D_END>& aLayers )
{ {
m_Cfg->m_Render.show_board_body = aLayers.test( LAYER_3D_BOARD ); m_Cfg->m_Render.show_board_body = aLayers.test( LAYER_3D_BOARD );
m_Cfg->m_Render.show_plated_barrels = aLayers.test( LAYER_3D_PLATED_BARRELS );
m_Cfg->m_Render.show_copper_top = aLayers.test( LAYER_3D_COPPER_TOP ); m_Cfg->m_Render.show_copper_top = aLayers.test( LAYER_3D_COPPER_TOP );
m_Cfg->m_Render.show_copper_bottom = aLayers.test( LAYER_3D_COPPER_BOTTOM ); m_Cfg->m_Render.show_copper_bottom = aLayers.test( LAYER_3D_COPPER_BOTTOM );
m_Cfg->m_Render.show_silkscreen_top = aLayers.test( LAYER_3D_SILKSCREEN_TOP ); m_Cfg->m_Render.show_silkscreen_top = aLayers.test( LAYER_3D_SILKSCREEN_TOP );
@ -806,6 +807,7 @@ std::bitset<LAYER_3D_END> BOARD_ADAPTER::GetVisibleLayers() const
ret.set( LAYER_3D_ADHESIVE, m_Cfg->m_Render.show_adhesive ); ret.set( LAYER_3D_ADHESIVE, m_Cfg->m_Render.show_adhesive );
} }
ret.set( LAYER_3D_PLATED_BARRELS, true );
ret.set( LAYER_3D_COPPER_TOP, true ); ret.set( LAYER_3D_COPPER_TOP, true );
ret.set( LAYER_3D_COPPER_BOTTOM, true ); ret.set( LAYER_3D_COPPER_BOTTOM, true );
ret.set( LAYER_3D_SILKSCREEN_TOP, true ); ret.set( LAYER_3D_SILKSCREEN_TOP, true );
@ -836,6 +838,7 @@ std::bitset<LAYER_3D_END> BOARD_ADAPTER::GetVisibleLayers() const
} }
ret.set( LAYER_3D_BOARD, m_Cfg->m_Render.show_board_body ); ret.set( LAYER_3D_BOARD, m_Cfg->m_Render.show_board_body );
ret.set( LAYER_3D_PLATED_BARRELS, m_Cfg->m_Render.show_plated_barrels );
ret.set( LAYER_3D_COPPER_TOP, m_Cfg->m_Render.show_copper_top ); ret.set( LAYER_3D_COPPER_TOP, m_Cfg->m_Render.show_copper_top );
ret.set( LAYER_3D_COPPER_BOTTOM, m_Cfg->m_Render.show_copper_bottom ); ret.set( LAYER_3D_COPPER_BOTTOM, m_Cfg->m_Render.show_copper_bottom );
ret.set( LAYER_3D_SILKSCREEN_TOP, m_Cfg->m_Render.show_silkscreen_top ); ret.set( LAYER_3D_SILKSCREEN_TOP, m_Cfg->m_Render.show_silkscreen_top );
@ -934,6 +937,7 @@ std::bitset<LAYER_3D_END> BOARD_ADAPTER::GetDefaultVisibleLayers() const
std::bitset<LAYER_3D_END> ret; std::bitset<LAYER_3D_END> ret;
ret.set( LAYER_3D_BOARD, true ); ret.set( LAYER_3D_BOARD, true );
ret.set( LAYER_3D_PLATED_BARRELS, true );
ret.set( LAYER_3D_COPPER_TOP, true ); ret.set( LAYER_3D_COPPER_TOP, true );
ret.set( LAYER_3D_COPPER_BOTTOM, true ); ret.set( LAYER_3D_COPPER_BOTTOM, true );
ret.set( LAYER_3D_SILKSCREEN_TOP, true ); ret.set( LAYER_3D_SILKSCREEN_TOP, true );

View File

@ -771,8 +771,11 @@ void RENDER_3D_OPENGL::generateViasAndPads()
wxASSERT( zbot < ztop ); wxASSERT( zbot < ztop );
generateCylinder( via_center, hole_inner_radius, hole_inner_radius + platingThickness3d, if( m_boardAdapter.m_Cfg->m_Render.show_plated_barrels )
ztop, zbot, nrSegments, layerTriangleVIA ); {
generateCylinder( via_center, hole_inner_radius, hole_inner_radius + platingThickness3d,
ztop, zbot, nrSegments, layerTriangleVIA );
}
} }
} }
@ -842,7 +845,7 @@ void RENDER_3D_OPENGL::generateViasAndPads()
const LIST_OBJECT2D& holes2D = holesContainer.GetList(); const LIST_OBJECT2D& holes2D = holesContainer.GetList();
if( holes2D.size() > 0 ) if( holes2D.size() > 0 && m_boardAdapter.m_Cfg->m_Render.show_plated_barrels )
{ {
float layer_z_top, layer_z_bot, dummy; float layer_z_top, layer_z_bot, dummy;

View File

@ -38,6 +38,7 @@ LAYER_PRESET_3D::LAYER_PRESET_3D( const wxString& aName ) :
name( aName ) name( aName )
{ {
layers.set( LAYER_3D_BOARD ); layers.set( LAYER_3D_BOARD );
layers.set( LAYER_3D_PLATED_BARRELS );
layers.set( LAYER_3D_COPPER_TOP ); layers.set( LAYER_3D_COPPER_TOP );
layers.set( LAYER_3D_COPPER_BOTTOM ); layers.set( LAYER_3D_COPPER_BOTTOM );
layers.set( LAYER_3D_SILKSCREEN_TOP ); layers.set( LAYER_3D_SILKSCREEN_TOP );
@ -59,6 +60,7 @@ LAYER_PRESET_3D::LAYER_PRESET_3D( const wxString& aName ) :
colors[ LAYER_3D_BACKGROUND_TOP ] = BOARD_ADAPTER::g_DefaultBackgroundTop; colors[ LAYER_3D_BACKGROUND_TOP ] = BOARD_ADAPTER::g_DefaultBackgroundTop;
colors[ LAYER_3D_BACKGROUND_BOTTOM ] = BOARD_ADAPTER::g_DefaultBackgroundBot; colors[ LAYER_3D_BACKGROUND_BOTTOM ] = BOARD_ADAPTER::g_DefaultBackgroundBot;
colors[ LAYER_3D_BOARD ] = BOARD_ADAPTER::g_DefaultBoardBody; colors[ LAYER_3D_BOARD ] = BOARD_ADAPTER::g_DefaultBoardBody;
colors[ LAYER_3D_PLATED_BARRELS ] = BOARD_ADAPTER::g_DefaultSurfaceFinish;
colors[ LAYER_3D_COPPER_TOP ] = BOARD_ADAPTER::g_DefaultSurfaceFinish; colors[ LAYER_3D_COPPER_TOP ] = BOARD_ADAPTER::g_DefaultSurfaceFinish;
colors[ LAYER_3D_COPPER_BOTTOM ] = BOARD_ADAPTER::g_DefaultSurfaceFinish; colors[ LAYER_3D_COPPER_BOTTOM ] = BOARD_ADAPTER::g_DefaultSurfaceFinish;
colors[ LAYER_3D_SILKSCREEN_TOP ] = BOARD_ADAPTER::g_DefaultSilkscreen; colors[ LAYER_3D_SILKSCREEN_TOP ] = BOARD_ADAPTER::g_DefaultSilkscreen;
@ -91,6 +93,7 @@ PARAM_LAYER_PRESET_3D::PARAM_LAYER_PRESET_3D( const std::string& aPath,
LAYER( "background_bottom", LAYER_3D_BACKGROUND_BOTTOM ); LAYER( "background_bottom", LAYER_3D_BACKGROUND_BOTTOM );
LAYER( "background_top", LAYER_3D_BACKGROUND_TOP ); LAYER( "background_top", LAYER_3D_BACKGROUND_TOP );
LAYER( "board", LAYER_3D_BOARD ); LAYER( "board", LAYER_3D_BOARD );
LAYER( "plated_barrels", LAYER_3D_PLATED_BARRELS );
LAYER( "copper", LAYER_3D_COPPER_TOP ); LAYER( "copper", LAYER_3D_COPPER_TOP );
LAYER( "copper_bottom", LAYER_3D_COPPER_BOTTOM ); LAYER( "copper_bottom", LAYER_3D_COPPER_BOTTOM );
LAYER( "silkscreen_bottom", LAYER_3D_SILKSCREEN_BOTTOM ); LAYER( "silkscreen_bottom", LAYER_3D_SILKSCREEN_BOTTOM );
@ -346,6 +349,8 @@ EDA_3D_VIEWER_SETTINGS::EDA_3D_VIEWER_SETTINGS() :
&m_Render.show_navigator, true ) ); &m_Render.show_navigator, true ) );
m_params.emplace_back( new PARAM<bool>( "render.show_board_body", m_params.emplace_back( new PARAM<bool>( "render.show_board_body",
&m_Render.show_board_body, true ) ); &m_Render.show_board_body, true ) );
m_params.emplace_back( new PARAM<bool>( "render.show_plated_barrels",
&m_Render.show_plated_barrels, true ) );
m_params.emplace_back( new PARAM<bool>( "render.show_comments", m_params.emplace_back( new PARAM<bool>( "render.show_comments",
&m_Render.show_comments, true ) ); &m_Render.show_comments, true ) );
m_params.emplace_back( new PARAM<bool>( "render.show_drawings", m_params.emplace_back( new PARAM<bool>( "render.show_drawings",

View File

@ -128,6 +128,7 @@ public:
bool show_adhesive; bool show_adhesive;
bool show_navigator; bool show_navigator;
bool show_board_body; bool show_board_body;
bool show_plated_barrels;
bool show_comments; bool show_comments;
bool show_drawings; bool show_drawings;
bool show_eco1; bool show_eco1;

View File

@ -53,6 +53,7 @@ const APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D APPEARANCE_CONTROLS_3D::s_la
// text id tooltip // text id tooltip
RR( _HKI( "Board Body" ), LAYER_3D_BOARD, _HKI( "Show board body" ) ), RR( _HKI( "Board Body" ), LAYER_3D_BOARD, _HKI( "Show board body" ) ),
RR( _HKI( "Plated Barrels" ),LAYER_3D_PLATED_BARRELS, _HKI( "Show barrels of plated through-holes and vias" ) ),
RR( wxS( "F.Cu" ), LAYER_3D_COPPER_TOP, _HKI( "Show front copper / surface finish color" ) ), RR( wxS( "F.Cu" ), LAYER_3D_COPPER_TOP, _HKI( "Show front copper / surface finish color" ) ),
RR( wxS( "B.Cu" ), LAYER_3D_COPPER_BOTTOM, _HKI( "Show back copper / surface finish color" ) ), RR( wxS( "B.Cu" ), LAYER_3D_COPPER_BOTTOM, _HKI( "Show back copper / surface finish color" ) ),
RR( _HKI( "Adhesive" ), LAYER_3D_ADHESIVE, _HKI( "Show adhesive" ) ), RR( _HKI( "Adhesive" ), LAYER_3D_ADHESIVE, _HKI( "Show adhesive" ) ),
@ -429,6 +430,7 @@ void APPEARANCE_CONTROLS_3D::OnLayerVisibilityChanged( int aLayer, bool isVisibl
case LAYER_3D_BOARD: case LAYER_3D_BOARD:
case LAYER_3D_COPPER_TOP: case LAYER_3D_COPPER_TOP:
case LAYER_3D_COPPER_BOTTOM: case LAYER_3D_COPPER_BOTTOM:
case LAYER_3D_PLATED_BARRELS:
case LAYER_3D_SILKSCREEN_BOTTOM: case LAYER_3D_SILKSCREEN_BOTTOM:
case LAYER_3D_SILKSCREEN_TOP: case LAYER_3D_SILKSCREEN_TOP:
case LAYER_3D_SOLDERMASK_BOTTOM: case LAYER_3D_SOLDERMASK_BOTTOM:
@ -500,15 +502,23 @@ void APPEARANCE_CONTROLS_3D::onColorSwatchChanged( COLOR_SWATCH* aSwatch )
// be applied to all copper layers. // be applied to all copper layers.
COLOR_SWATCH* otherSwatch = nullptr; COLOR_SWATCH* otherSwatch = nullptr;
if( layer == LAYER_3D_COPPER_TOP ) const std::vector<int> copperIndices{
LAYER_3D_COPPER_TOP,
LAYER_3D_COPPER_BOTTOM,
LAYER_3D_PLATED_BARRELS,
};
// If the changed swatch is one of the copper layers, we need to update the other copper layers
if( std::find( copperIndices.begin(), copperIndices.end(), layer ) != copperIndices.end() )
{ {
colors[ LAYER_3D_COPPER_BOTTOM ] = newColor; for( int index : copperIndices )
otherSwatch = m_layerSettingsMap[LAYER_3D_COPPER_BOTTOM]->m_Ctl_color; {
} if( layer != index && colors.count( index ) )
else if( layer == LAYER_3D_COPPER_BOTTOM ) {
{ colors[index] = newColor;
colors[ LAYER_3D_COPPER_TOP ] = newColor; otherSwatch = m_layerSettingsMap[index]->m_Ctl_color;
otherSwatch = m_layerSettingsMap[LAYER_3D_COPPER_TOP]->m_Ctl_color; }
}
} }
if( otherSwatch ) if( otherSwatch )
@ -1090,5 +1100,3 @@ void APPEARANCE_CONTROLS_3D::passOnFocus()
{ {
m_focusOwner->SetFocus(); m_focusOwner->SetFocus();
} }

View File

@ -605,6 +605,7 @@ enum LAYER_3D_ID : int
LAYER_3D_NAVIGATOR, LAYER_3D_NAVIGATOR,
LAYER_3D_BOUNDING_BOXES, LAYER_3D_BOUNDING_BOXES,
LAYER_3D_OFF_BOARD_SILK, LAYER_3D_OFF_BOARD_SILK,
LAYER_3D_PLATED_BARRELS,
LAYER_3D_END LAYER_3D_END
}; };