7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-02 00:26:45 +00:00

API: expand board stackup serialization

This commit is contained in:
Jon Evans 2025-01-04 15:15:42 -05:00
parent ee7323dc42
commit 7db75e4f50
4 changed files with 100 additions and 12 deletions
api/proto/board
pcbnew
api
board_stackup_manager
qa/tests/api

View File

@ -61,14 +61,40 @@ message BoardStackupCopperLayer
}
enum BoardStackupLayerType
{
BSLT_UNKNOWN = 0;
BSLT_COPPER = 1;
BSLT_DIELECTRIC = 2;
BSLT_SILKSCREEN = 3;
BSLT_SOLDERMASK = 4;
BSLT_SOLDERPASTE = 5;
BSLT_UNDEFINED = 7;
}
message BoardStackupDielectricProperties
{
double epsilon_r = 1;
double loss_tangent = 2;
string material_name = 3;
kiapi.common.types.Distance thickness = 4;
}
message BoardStackupDielectricLayer
{
// A single dielectric slot (between copper layers) can be made up of multiple physical layers
repeated BoardStackupDielectricProperties layer = 1;
}
message BoardStackupLayer
{
kiapi.common.types.Distance thickness = 1;
kiapi.board.types.BoardLayer layer = 2;
bool enabled = 3;
oneof item {
BoardStackupCopperLayer copper = 4;
}
BoardStackupLayerType type = 4;
BoardStackupDielectricLayer dielectric = 5;
kiapi.common.types.Color color = 6;
string material_name = 7;
}
message BoardStackup

View File

@ -24,6 +24,7 @@
#include <api/board/board_commands.pb.h>
#include <wx/wx.h>
#include <board_stackup_manager/board_stackup.h>
#include <padstack.h>
#include <pcb_dimension.h>
#include <pcb_track.h>
@ -766,4 +767,42 @@ RATSNEST_MODE FromProtoEnum( commands::RatsnestDisplayMode aValue )
}
}
template<>
BoardStackupLayerType ToProtoEnum( BOARD_STACKUP_ITEM_TYPE aValue )
{
switch( aValue )
{
case BS_ITEM_TYPE_UNDEFINED: return BoardStackupLayerType::BSLT_UNDEFINED;
case BS_ITEM_TYPE_COPPER: return BoardStackupLayerType::BSLT_COPPER;
case BS_ITEM_TYPE_DIELECTRIC: return BoardStackupLayerType::BSLT_DIELECTRIC;
case BS_ITEM_TYPE_SOLDERPASTE: return BoardStackupLayerType::BSLT_SOLDERPASTE;
case BS_ITEM_TYPE_SOLDERMASK: return BoardStackupLayerType::BSLT_SOLDERMASK;
case BS_ITEM_TYPE_SILKSCREEN: return BoardStackupLayerType::BSLT_SILKSCREEN;
default:
wxCHECK_MSG( false, BoardStackupLayerType::BSLT_UNKNOWN,
"Unhandled case in ToProtoEnum<BOARD_STACKUP_ITEM_TYPE>");
}
}
template<>
BOARD_STACKUP_ITEM_TYPE FromProtoEnum( BoardStackupLayerType aValue )
{
switch( aValue )
{
case BoardStackupLayerType::BSLT_UNDEFINED: return BS_ITEM_TYPE_UNDEFINED;
case BoardStackupLayerType::BSLT_COPPER: return BS_ITEM_TYPE_COPPER;
case BoardStackupLayerType::BSLT_DIELECTRIC: return BS_ITEM_TYPE_DIELECTRIC;
case BoardStackupLayerType::BSLT_SOLDERPASTE: return BS_ITEM_TYPE_SOLDERPASTE;
case BoardStackupLayerType::BSLT_SOLDERMASK: return BS_ITEM_TYPE_SOLDERMASK;
case BoardStackupLayerType::BSLT_SILKSCREEN: return BS_ITEM_TYPE_SILKSCREEN;
default:
wxCHECK_MSG( false, BS_ITEM_TYPE_UNDEFINED,
"Unhandled case in FromProtoEnum<BoardStackupLayerType>" );
}
}
// Adding something new here? Add it to test_api_enums.cpp!

View File

@ -425,28 +425,44 @@ bool BOARD_STACKUP::operator==( const BOARD_STACKUP& aOther ) const
void BOARD_STACKUP::Serialize( google::protobuf::Any& aContainer ) const
{
kiapi::board::BoardStackup stackup;
using namespace kiapi::board;
BoardStackup stackup;
for( const BOARD_STACKUP_ITEM* item : m_list )
{
kiapi::board::BoardStackupLayer* layer = stackup.mutable_layers()->Add();
BoardStackupLayer* layer = stackup.mutable_layers()->Add();
// TODO dielectric sub-layers
layer->mutable_thickness()->set_value_nm( item->GetThickness() );
layer->set_layer( ToProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>(
item->GetBrdLayerId() ) );
layer->set_layer( ToProtoEnum<PCB_LAYER_ID, types::BoardLayer>( item->GetBrdLayerId() ) );
layer->set_type(
ToProtoEnum<BOARD_STACKUP_ITEM_TYPE, BoardStackupLayerType>( item->GetType() ) );
switch( item->GetType() )
{
case BOARD_STACKUP_ITEM_TYPE::BS_ITEM_TYPE_COPPER:
case BS_ITEM_TYPE_COPPER:
{
layer->mutable_copper()->New();
layer->set_material_name( "copper" );
// (no copper params yet...)
break;
}
case BS_ITEM_TYPE_DIELECTRIC:
{
BoardStackupDielectricLayer* dielectric = layer->mutable_dielectric()->New();
for( int i = 0; i < item->GetSublayersCount(); ++i )
{
BoardStackupDielectricProperties* props = dielectric->mutable_layer()->Add();
props->set_epsilon_r( item->GetEpsilonR( i ) );
props->set_loss_tangent( item->GetLossTangent( i ) );
props->set_material_name( item->GetMaterial( i ).ToUTF8() );
props->mutable_thickness()->set_value_nm( item->GetThickness( i ) );
}
break;
}
default:
// TODO
break;
}
}
@ -457,7 +473,8 @@ void BOARD_STACKUP::Serialize( google::protobuf::Any& aContainer ) const
bool BOARD_STACKUP::Deserialize( const google::protobuf::Any& aContainer )
{
return true;
// Read-only for now
return false;
}

View File

@ -34,6 +34,7 @@
// Board-specific
#include <api/board/board_types.pb.h>
#include <api/board/board_commands.pb.h>
#include <board_stackup_manager/board_stackup.h>
#include <padstack.h>
#include <pcb_dimension.h>
#include <pcb_track.h>
@ -261,4 +262,9 @@ BOOST_AUTO_TEST_CASE( RatsnestDisplayMode )
testEnums<RATSNEST_MODE, kiapi::board::commands::RatsnestDisplayMode>();
}
BOOST_AUTO_TEST_CASE( BoardStackupLayerType )
{
testEnums<BOARD_STACKUP_ITEM_TYPE, kiapi::board::BoardStackupLayerType>();
}
BOOST_AUTO_TEST_SUITE_END()