Honour front/back layer types for user layer.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21284
This commit is contained in:
Jeff Young 2025-07-16 12:14:20 +01:00
parent 9d770fe243
commit 0495828a55
9 changed files with 70 additions and 30 deletions

View File

@ -485,26 +485,18 @@ void BOARD_ADAPTER::InitSettings( REPORTER* aStatusReporter, REPORTER* aWarningR
const float zpos_copperTop_front = m_layerZcoordTop[F_Cu]; const float zpos_copperTop_front = m_layerZcoordTop[F_Cu];
// Fill not copper layers zpos // 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; continue;
float zposBottom = zpos_copperTop_front + 2.0f * zpos_offset; float zposBottom;
float zposTop = zposBottom + m_frontCopperThickness3DU; float zposTop;
switch( layer_id ) 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: case B_Mask:
zposBottom = zpos_copperTop_back; zposBottom = zpos_copperTop_back;
zposTop = zpos_copperTop_back - m_backMaskThickness3DU; zposTop = zpos_copperTop_back - m_backMaskThickness3DU;
@ -536,11 +528,21 @@ void BOARD_ADAPTER::InitSettings( REPORTER* aStatusReporter, REPORTER* aWarningR
break; break;
default: 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; break;
} }
m_layerZcoordTop[(PCB_LAYER_ID)layer_id] = zposTop; m_layerZcoordTop[layer_id] = zposTop;
m_layerZcoordBottom[(PCB_LAYER_ID)layer_id] = zposBottom; m_layerZcoordBottom[layer_id] = zposBottom;
} }
m_boardCenter = SFVEC3F( m_boardPos.x * m_biuTo3Dunits, m_boardPos.y * m_biuTo3Dunits, 0.0f ); m_boardCenter = SFVEC3F( m_boardPos.x * m_biuTo3Dunits, m_boardPos.y * m_biuTo3Dunits, 0.0f );

View File

@ -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 LAYER_T BOARD::GetLayerType( PCB_LAYER_ID aLayer ) const
{ {
if( IsLayerEnabled( aLayer ) ) if( IsLayerEnabled( aLayer ) )

View File

@ -849,6 +849,16 @@ public:
*/ */
bool SetLayerDescr( PCB_LAYER_ID aIndex, const LAYER& aLayer ); 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. * Return the type of the copper layer given by aLayer.
* *

View File

@ -430,7 +430,12 @@ void PCB_FIELDS_GRID_TABLE::SetValueAsLong( int aRow, int aCol, long aValue )
{ {
case PFC_LAYER: case PFC_LAYER:
field.SetLayer( ToLAYER_ID( (int) aValue ) ); 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; break;
default: default:

View File

@ -458,9 +458,9 @@ void ODB_MATRIX_ENTITY::AddAuxilliaryMatrixLayer()
} }
else else
{ {
if( IsFrontLayer( std::get<1>( aLayerPair ) ) ) if( m_board->IsFrontLayer( std::get<1>( aLayerPair ) ) )
dLayerName = wxString::Format( "%s_front", featureName ); 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 ); dLayerName = wxString::Format( "%s_back", featureName );
else else
return; return;
@ -775,9 +775,9 @@ void ODB_LAYER_ENTITY::InitAuxilliaryData()
} }
else else
{ {
if( IsFrontLayer( std::get<1>( layer_pair ) ) ) if( m_board->IsFrontLayer( std::get<1>( layer_pair ) ) )
dLayerName = wxString::Format( "%s_front", featureName ); 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 ); dLayerName = wxString::Format( "%s_back", featureName );
else else
return; return;

View File

@ -25,6 +25,7 @@
#include <font/font.h> #include <font/font.h>
#include <widgets/msgpanel.h> #include <widgets/msgpanel.h>
#include <string_utils.h> #include <string_utils.h>
#include <board.h>
#include <pcb_table.h> #include <pcb_table.h>
#include <pcb_tablecell.h> #include <pcb_tablecell.h>
@ -34,8 +35,10 @@ PCB_TABLECELL::PCB_TABLECELL( BOARD_ITEM* aParent ) :
m_colSpan( 1 ), m_colSpan( 1 ),
m_rowSpan( 1 ) m_rowSpan( 1 )
{ {
if( IsBackLayer( aParent->GetLayer() ) ) if( BOARD* board = GetBoard() )
SetMirrored( true ); SetMirrored( board->IsBackLayer( aParent->GetLayer() ) );
else
SetMirrored( IsBackLayer( aParent->GetLayer() ) );
SetRectangleHeight( std::numeric_limits<int>::max() / 2 ); SetRectangleHeight( std::numeric_limits<int>::max() / 2 );
SetRectangleWidth( std::numeric_limits<int>::max() / 2 ); SetRectangleWidth( std::numeric_limits<int>::max() / 2 );

View File

@ -313,7 +313,11 @@ void PCB_TEXT::StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings )
SetTextThickness( settings.GetTextThickness( GetLayer() ) ); SetTextThickness( settings.GetTextThickness( GetLayer() ) );
SetItalic( settings.GetTextItalic( GetLayer() ) ); SetItalic( settings.GetTextItalic( GetLayer() ) );
SetKeepUpright( settings.GetTextUpright( GetLayer() ) ); SetKeepUpright( settings.GetTextUpright( GetLayer() ) );
SetMirrored( IsBackLayer( GetLayer() ) );
if( BOARD* board = GetBoard() )
SetMirrored( board->IsBackLayer( GetLayer() ) );
else
SetMirrored( IsBackLayer( GetLayer() ) );
} }

View File

@ -174,7 +174,11 @@ void PCB_TEXTBOX::StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings )
SetTextThickness( settings.GetTextThickness( GetLayer() ) ); SetTextThickness( settings.GetTextThickness( GetLayer() ) );
SetItalic( settings.GetTextItalic( GetLayer() ) ); SetItalic( settings.GetTextItalic( GetLayer() ) );
SetKeepUpright( settings.GetTextUpright( GetLayer() ) ); SetKeepUpright( settings.GetTextUpright( GetLayer() ) );
SetMirrored( IsBackLayer( GetLayer() ) );
if( BOARD* board = GetBoard() )
SetMirrored( board->IsBackLayer( GetLayer() ) );
else
SetMirrored( IsBackLayer( GetLayer() ) );
} }

View File

@ -316,7 +316,7 @@ void DRAWING_TOOL::Reset( RESET_REASON aReason )
InferBold( &m_textAttrs ); InferBold( &m_textAttrs );
m_textAttrs.m_Italic = bds.GetTextItalic( m_layer ); m_textAttrs.m_Italic = bds.GetTextItalic( m_layer );
m_textAttrs.m_KeepUpright = bds.GetTextUpright( 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_Halign = GR_TEXT_H_ALIGN_LEFT;
m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP; m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP;
@ -978,7 +978,7 @@ int DRAWING_TOOL::PlaceText( const TOOL_EVENT& aEvent )
InferBold( &textAttrs ); InferBold( &textAttrs );
textAttrs.m_Italic = bds.GetTextItalic( layer ); textAttrs.m_Italic = bds.GetTextItalic( layer );
textAttrs.m_KeepUpright = bds.GetTextUpright( 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_Halign = GR_TEXT_H_ALIGN_LEFT;
textAttrs.m_Valign = GR_TEXT_V_ALIGN_BOTTOM; textAttrs.m_Valign = GR_TEXT_V_ALIGN_BOTTOM;
@ -1538,7 +1538,7 @@ int DRAWING_TOOL::DrawDimension( const TOOL_EVENT& aEvent )
t = dimension->Type(); t = dimension->Type();
dimension->SetLayer( layer ); dimension->SetLayer( layer );
dimension->SetMirrored( IsBackLayer( layer ) ); dimension->SetMirrored( m_board->IsBackLayer( layer ) );
dimension->SetTextSize( boardSettings.GetTextSize( layer ) ); dimension->SetTextSize( boardSettings.GetTextSize( layer ) );
dimension->SetTextThickness( boardSettings.GetTextThickness( layer ) ); dimension->SetTextThickness( boardSettings.GetTextThickness( layer ) );
dimension->SetItalic( boardSettings.GetTextItalic( layer ) ); dimension->SetItalic( boardSettings.GetTextItalic( layer ) );
@ -2124,7 +2124,7 @@ bool DRAWING_TOOL::drawShape( const TOOL_EVENT& aTool, PCB_SHAPE** aGraphic,
InferBold( &m_textAttrs ); InferBold( &m_textAttrs );
m_textAttrs.m_Italic = bds.GetTextItalic( m_layer ); m_textAttrs.m_Italic = bds.GetTextItalic( m_layer );
m_textAttrs.m_KeepUpright = bds.GetTextUpright( 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_Halign = GR_TEXT_H_ALIGN_LEFT;
m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP; 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 ); InferBold( &m_textAttrs );
m_textAttrs.m_Italic = bds.GetTextItalic( m_layer ); m_textAttrs.m_Italic = bds.GetTextItalic( m_layer );
m_textAttrs.m_KeepUpright = bds.GetTextUpright( 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_Halign = GR_TEXT_H_ALIGN_LEFT;
m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP; m_textAttrs.m_Valign = GR_TEXT_V_ALIGN_TOP;
} }