From 0495828a55723176368e6d4dfe37f86e5025c028 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Wed, 16 Jul 2025 12:14:20 +0100 Subject: [PATCH] Honour front/back layer types for user layer. Fixes https://gitlab.com/kicad/code/kicad/-/issues/21284 --- 3d-viewer/3d_canvas/board_adapter.cpp | 34 ++++++++++++++------------- pcbnew/board.cpp | 12 ++++++++++ pcbnew/board.h | 10 ++++++++ pcbnew/pcb_fields_grid_table.cpp | 7 +++++- pcbnew/pcb_io/odbpp/odb_entity.cpp | 8 +++---- pcbnew/pcb_tablecell.cpp | 7 ++++-- pcbnew/pcb_text.cpp | 6 ++++- pcbnew/pcb_textbox.cpp | 6 ++++- pcbnew/tools/drawing_tool.cpp | 10 ++++---- 9 files changed, 70 insertions(+), 30 deletions(-) diff --git a/3d-viewer/3d_canvas/board_adapter.cpp b/3d-viewer/3d_canvas/board_adapter.cpp index 7bed7ebe55..a9e612c3af 100644 --- a/3d-viewer/3d_canvas/board_adapter.cpp +++ b/3d-viewer/3d_canvas/board_adapter.cpp @@ -485,26 +485,18 @@ void BOARD_ADAPTER::InitSettings( REPORTER* aStatusReporter, REPORTER* aWarningR const float zpos_copperTop_front = m_layerZcoordTop[F_Cu]; // Fill not copper layers zpos - for( int layer_id = 0; layer_id < PCB_LAYER_ID_COUNT; layer_id++ ) + for( int layer = 0; layer < PCB_LAYER_ID_COUNT; layer++ ) { - if( IsCopperLayer( (PCB_LAYER_ID)layer_id ) ) + PCB_LAYER_ID layer_id = ToLAYER_ID( layer ); + + if( IsCopperLayer( layer_id ) ) continue; - float zposBottom = zpos_copperTop_front + 2.0f * zpos_offset; - float zposTop = zposBottom + m_frontCopperThickness3DU; + float zposBottom; + float zposTop; switch( layer_id ) { - case B_Adhes: - zposBottom = zpos_copperTop_back - 2.0f * zpos_offset; - zposTop = zposBottom - m_nonCopperLayerThickness3DU; - break; - - case F_Adhes: - zposBottom = zpos_copperTop_front + 2.0f * zpos_offset; - zposTop = zposBottom + m_nonCopperLayerThickness3DU; - break; - case B_Mask: zposBottom = zpos_copperTop_back; zposTop = zpos_copperTop_back - m_backMaskThickness3DU; @@ -536,11 +528,21 @@ void BOARD_ADAPTER::InitSettings( REPORTER* aStatusReporter, REPORTER* aWarningR break; default: + if( m_board->IsBackLayer( layer_id ) ) + { + zposBottom = zpos_copperTop_back - 2.0f * zpos_offset; + zposTop = zposBottom - m_nonCopperLayerThickness3DU; + } + else + { + zposBottom = zpos_copperTop_front + 2.0f * zpos_offset; + zposTop = zposBottom + m_nonCopperLayerThickness3DU; + } break; } - m_layerZcoordTop[(PCB_LAYER_ID)layer_id] = zposTop; - m_layerZcoordBottom[(PCB_LAYER_ID)layer_id] = zposBottom; + m_layerZcoordTop[layer_id] = zposTop; + m_layerZcoordBottom[layer_id] = zposBottom; } m_boardCenter = SFVEC3F( m_boardPos.x * m_biuTo3Dunits, m_boardPos.y * m_biuTo3Dunits, 0.0f ); diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index 2e005bf669..da3457a96b 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -714,6 +714,18 @@ bool BOARD::SetLayerName( PCB_LAYER_ID aLayer, const wxString& aLayerName ) } +bool BOARD::IsFrontLayer( PCB_LAYER_ID aLayer ) const +{ + return ::IsFrontLayer( aLayer ) || GetLayerType( aLayer ) == LT_FRONT; +} + + +bool BOARD::IsBackLayer( PCB_LAYER_ID aLayer ) const +{ + return ::IsBackLayer( aLayer ) || GetLayerType( aLayer ) == LT_BACK; +} + + LAYER_T BOARD::GetLayerType( PCB_LAYER_ID aLayer ) const { if( IsLayerEnabled( aLayer ) ) diff --git a/pcbnew/board.h b/pcbnew/board.h index fc2845eed3..cc91c851ae 100644 --- a/pcbnew/board.h +++ b/pcbnew/board.h @@ -849,6 +849,16 @@ public: */ bool SetLayerDescr( PCB_LAYER_ID aIndex, const LAYER& aLayer ); + /** + * @return true if the layer is a front layer, or a user layer designated "Off-board, front" + */ + bool IsFrontLayer( PCB_LAYER_ID aLayer ) const; + + /** + * @return true if the layer is a back layer, or a user layer designated "Off-board, back" + */ + bool IsBackLayer( PCB_LAYER_ID aLayer ) const; + /** * Return the type of the copper layer given by aLayer. * diff --git a/pcbnew/pcb_fields_grid_table.cpp b/pcbnew/pcb_fields_grid_table.cpp index f0abd71322..53ddcf5413 100644 --- a/pcbnew/pcb_fields_grid_table.cpp +++ b/pcbnew/pcb_fields_grid_table.cpp @@ -430,7 +430,12 @@ void PCB_FIELDS_GRID_TABLE::SetValueAsLong( int aRow, int aCol, long aValue ) { case PFC_LAYER: field.SetLayer( ToLAYER_ID( (int) aValue ) ); - field.SetMirrored( IsBackLayer( field.GetLayer() ) ); + + if( BOARD* board = field.GetBoard() ) + field.SetMirrored( board->IsBackLayer( field.GetLayer() ) ); + else + field.SetMirrored( IsBackLayer( field.GetLayer() ) ); + break; default: diff --git a/pcbnew/pcb_io/odbpp/odb_entity.cpp b/pcbnew/pcb_io/odbpp/odb_entity.cpp index 817916f390..e40c8b831c 100644 --- a/pcbnew/pcb_io/odbpp/odb_entity.cpp +++ b/pcbnew/pcb_io/odbpp/odb_entity.cpp @@ -458,9 +458,9 @@ void ODB_MATRIX_ENTITY::AddAuxilliaryMatrixLayer() } else { - if( IsFrontLayer( std::get<1>( aLayerPair ) ) ) + if( m_board->IsFrontLayer( std::get<1>( aLayerPair ) ) ) dLayerName = wxString::Format( "%s_front", featureName ); - else if( IsBackLayer( std::get<1>( aLayerPair ) ) ) + else if( m_board->IsBackLayer( std::get<1>( aLayerPair ) ) ) dLayerName = wxString::Format( "%s_back", featureName ); else return; @@ -775,9 +775,9 @@ void ODB_LAYER_ENTITY::InitAuxilliaryData() } else { - if( IsFrontLayer( std::get<1>( layer_pair ) ) ) + if( m_board->IsFrontLayer( std::get<1>( layer_pair ) ) ) dLayerName = wxString::Format( "%s_front", featureName ); - else if( IsBackLayer( std::get<1>( layer_pair ) ) ) + else if( m_board->IsBackLayer( std::get<1>( layer_pair ) ) ) dLayerName = wxString::Format( "%s_back", featureName ); else return; diff --git a/pcbnew/pcb_tablecell.cpp b/pcbnew/pcb_tablecell.cpp index cadf3f20a8..1f4055df4f 100644 --- a/pcbnew/pcb_tablecell.cpp +++ b/pcbnew/pcb_tablecell.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -34,8 +35,10 @@ PCB_TABLECELL::PCB_TABLECELL( BOARD_ITEM* aParent ) : m_colSpan( 1 ), m_rowSpan( 1 ) { - if( IsBackLayer( aParent->GetLayer() ) ) - SetMirrored( true ); + if( BOARD* board = GetBoard() ) + SetMirrored( board->IsBackLayer( aParent->GetLayer() ) ); + else + SetMirrored( IsBackLayer( aParent->GetLayer() ) ); SetRectangleHeight( std::numeric_limits::max() / 2 ); SetRectangleWidth( std::numeric_limits::max() / 2 ); diff --git a/pcbnew/pcb_text.cpp b/pcbnew/pcb_text.cpp index ada162d32b..9d3d232741 100644 --- a/pcbnew/pcb_text.cpp +++ b/pcbnew/pcb_text.cpp @@ -313,7 +313,11 @@ void PCB_TEXT::StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings ) SetTextThickness( settings.GetTextThickness( GetLayer() ) ); SetItalic( settings.GetTextItalic( GetLayer() ) ); SetKeepUpright( settings.GetTextUpright( GetLayer() ) ); - SetMirrored( IsBackLayer( GetLayer() ) ); + + if( BOARD* board = GetBoard() ) + SetMirrored( board->IsBackLayer( GetLayer() ) ); + else + SetMirrored( IsBackLayer( GetLayer() ) ); } diff --git a/pcbnew/pcb_textbox.cpp b/pcbnew/pcb_textbox.cpp index 1474482951..f4efe11c36 100644 --- a/pcbnew/pcb_textbox.cpp +++ b/pcbnew/pcb_textbox.cpp @@ -174,7 +174,11 @@ void PCB_TEXTBOX::StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings ) SetTextThickness( settings.GetTextThickness( GetLayer() ) ); SetItalic( settings.GetTextItalic( GetLayer() ) ); SetKeepUpright( settings.GetTextUpright( GetLayer() ) ); - SetMirrored( IsBackLayer( GetLayer() ) ); + + if( BOARD* board = GetBoard() ) + SetMirrored( board->IsBackLayer( GetLayer() ) ); + else + SetMirrored( IsBackLayer( GetLayer() ) ); } diff --git a/pcbnew/tools/drawing_tool.cpp b/pcbnew/tools/drawing_tool.cpp index 382b8e5f8d..e4ca513954 100644 --- a/pcbnew/tools/drawing_tool.cpp +++ b/pcbnew/tools/drawing_tool.cpp @@ -316,7 +316,7 @@ void DRAWING_TOOL::Reset( RESET_REASON aReason ) InferBold( &m_textAttrs ); m_textAttrs.m_Italic = bds.GetTextItalic( m_layer ); m_textAttrs.m_KeepUpright = bds.GetTextUpright( m_layer ); - m_textAttrs.m_Mirrored = IsBackLayer( m_layer ); + m_textAttrs.m_Mirrored = m_board->IsBackLayer( m_layer ); m_textAttrs.m_Halign = GR_TEXT_H_ALIGN_LEFT; m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP; @@ -978,7 +978,7 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent ) InferBold( &textAttrs ); textAttrs.m_Italic = bds.GetTextItalic( layer ); textAttrs.m_KeepUpright = bds.GetTextUpright( layer ); - textAttrs.m_Mirrored = IsBackLayer( layer ); + textAttrs.m_Mirrored = m_board->IsBackLayer( layer ); textAttrs.m_Halign = GR_TEXT_H_ALIGN_LEFT; textAttrs.m_Valign = GR_TEXT_V_ALIGN_BOTTOM; @@ -1538,7 +1538,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent ) t = dimension->Type(); dimension->SetLayer( layer ); - dimension->SetMirrored( IsBackLayer( layer ) ); + dimension->SetMirrored( m_board->IsBackLayer( layer ) ); dimension->SetTextSize( boardSettings.GetTextSize( layer ) ); dimension->SetTextThickness( boardSettings.GetTextThickness( layer ) ); dimension->SetItalic( boardSettings.GetTextItalic( layer ) ); @@ -2124,7 +2124,7 @@ bool DRAWING_TOOL::drawShape( const TOOL_EVENT& aTool, PCB_SHAPE** aGraphic, InferBold( &m_textAttrs ); m_textAttrs.m_Italic = bds.GetTextItalic( m_layer ); m_textAttrs.m_KeepUpright = bds.GetTextUpright( m_layer ); - m_textAttrs.m_Mirrored = IsBackLayer( m_layer ); + m_textAttrs.m_Mirrored = m_board->IsBackLayer( m_layer ); m_textAttrs.m_Halign = GR_TEXT_H_ALIGN_LEFT; m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP; } @@ -2248,7 +2248,7 @@ bool DRAWING_TOOL::drawShape( const TOOL_EVENT& aTool, PCB_SHAPE** aGraphic, InferBold( &m_textAttrs ); m_textAttrs.m_Italic = bds.GetTextItalic( m_layer ); m_textAttrs.m_KeepUpright = bds.GetTextUpright( m_layer ); - m_textAttrs.m_Mirrored = IsBackLayer( m_layer ); + m_textAttrs.m_Mirrored = m_board->IsBackLayer( m_layer ); m_textAttrs.m_Halign = GR_TEXT_H_ALIGN_LEFT; m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP; }