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];
// 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 );

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
{
if( IsLayerEnabled( aLayer ) )

View File

@ -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.
*

View File

@ -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:

View File

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

View File

@ -25,6 +25,7 @@
#include <font/font.h>
#include <widgets/msgpanel.h>
#include <string_utils.h>
#include <board.h>
#include <pcb_table.h>
#include <pcb_tablecell.h>
@ -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<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() ) );
SetItalic( settings.GetTextItalic( 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() ) );
SetItalic( settings.GetTextItalic( 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 );
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;
}