32#include <google/protobuf/any.pb.h> 
   33#include <api/board/board.pb.h> 
  149            || aDielectricPrmsIdx < 0
 
 
  177    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  184    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  192    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  200    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  208    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  216    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  225    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  234    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  243    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  252    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  261    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  270    wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer < 
GetSublayersCount() );
 
 
  409    if( !std::equal( std::begin( 
m_list ), std::end( 
m_list ), std::begin( aOther.
m_list ),
 
 
  425    BoardStackup stackup;
 
  429        BoardStackupLayer* layer = stackup.mutable_layers()->Add();
 
  431        layer->mutable_thickness()->set_value_nm( item->GetThickness() );
 
  436        switch( item->GetType() )
 
  440            layer->set_material_name( 
"copper" );
 
  447            BoardStackupDielectricLayer* dielectric = layer->mutable_dielectric()->New();
 
  449            for( 
int i = 0; i < item->GetSublayersCount(); ++i )
 
  451                BoardStackupDielectricProperties* props = dielectric->mutable_layer()->Add();
 
  452                props->set_epsilon_r( item->GetEpsilonR( i ) );
 
  453                props->set_loss_tangent( item->GetLossTangent( i ) );
 
  454                props->set_material_name( item->GetMaterial( i ).ToUTF8() );
 
  455                props->mutable_thickness()->set_value_nm( item->GetThickness( i ) );
 
  466    aContainer.PackFrom( stackup );
 
 
  488    if( aIndex < 0 || aIndex >= 
GetCount() )
 
 
  502        if( item->IsThicknessEditable() && item->IsEnabled() )
 
  504            thickness += item->GetThickness();
 
  508            for( 
int idx = 1; idx < item->GetSublayersCount(); idx++ )
 
  510                thickness += item->GetThickness( idx );
 
 
  535                if( item->GetBrdLayerId() == curr_item->GetBrdLayerId() )
 
  546                if( item->GetDielectricLayerId() == curr_item->GetDielectricLayerId() )
 
  570                if( item->GetBrdLayerId() == initial_item->GetBrdLayerId() )
 
  572                    *item = *initial_item;
 
  583                if( item->GetDielectricLayerId() == initial_item->GetDielectricLayerId() )
 
  585                    *item = *initial_item;
 
 
  613                                             int aActiveCopperLayersCount )
 
  626    int activeCuLayerCount = copperLayerCount;
 
  628    if( aSettings == 
nullptr && aActiveCopperLayersCount > 0 )
 
  629        activeCuLayerCount = aActiveCopperLayersCount;
 
  632    int diel_thickness = brd__thickness -
 
  638    diel_thickness /= std::max( 1, activeCuLayerCount - 1 );
 
  640    int dielectric_idx = 0;
 
  659    if( enabledLayer[
F_Mask] )
 
  684        if( (dielectric_idx & 1) == 0 )
 
  700    if( enabledLayer[
B_Mask] )
 
 
  743    aFormatter->
Print( 
"(stackup" );
 
  752            layer_name.Printf( wxT( 
"dielectric %d" ), item->GetDielectricLayerId() );
 
  754            layer_name = 
LSET::Name( item->GetBrdLayerId() );
 
  756        aFormatter->
Print( 
"(layer %s (type %s)",
 
  757                           aFormatter->
Quotew( layer_name ).c_str(),
 
  758                           aFormatter->
Quotew( item->GetTypeName() ).c_str() );
 
  761        for( 
int idx = 0; idx < item->GetSublayersCount(); idx++ )
 
  764                aFormatter->
Print( 
" addsublayer" );
 
  766            if( item->IsColorEditable() && 
IsPrmSpecified( item->GetColor( idx ) ) )
 
  768                aFormatter->
Print( 
"(color %s)",
 
  769                                   aFormatter->
Quotew( item->GetColor( idx ) ).c_str() );
 
  772            if( item->IsThicknessEditable() )
 
  774                aFormatter->
Print( 
"(thickness %s",
 
  778                    aFormatter->
Print( 
" locked" );
 
  780                aFormatter->
Print( 
")" );
 
  783            if( item->HasMaterialValue( idx ) )
 
  785                aFormatter->
Print( 
"(material %s)",
 
  786                                   aFormatter->
Quotew( item->GetMaterial( idx ) ).c_str() );
 
  789            if( item->HasEpsilonRValue() && item->HasMaterialValue( idx ) )
 
  792            if( item->HasLossTangentValue() && item->HasMaterialValue( idx ) )
 
  794                aFormatter->
Print( 
"(loss_tangent %s)",
 
  799        aFormatter->
Print( 
")" );
 
  810        aFormatter->
Print( 
"(edge_connector %s)",
 
  817    aFormatter->
Print( 
")" );
 
 
  825    if( aFirstLayer == aSecondLayer )
 
  829    if( aSecondLayer != 
B_Cu && ( aSecondLayer < aFirstLayer || aFirstLayer == 
B_Cu ) )
 
  830        std::swap( aFirstLayer, aSecondLayer );
 
  849        for( 
int sublayer = 0; sublayer < item->GetSublayersCount(); sublayer++ )
 
  851            total += item->GetThickness( sublayer );
 
 
  866    if( !aPrmValue.IsEmpty()
 
 
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
 
constexpr EDA_IU_SCALE pcbIUScale
 
bool IsPrmSpecified(const wxString &aPrmValue)
 
@ BS_ITEM_TYPE_SILKSCREEN
 
@ BS_ITEM_TYPE_DIELECTRIC
 
@ BS_ITEM_TYPE_SOLDERPASTE
 
@ BS_ITEM_TYPE_SOLDERMASK
 
Container for design settings for a BOARD object.
 
const LSET & GetEnabledLayers() const
Return a bit-mask of all the layers that are enabled.
 
int GetBoardThickness() const
The full thickness of the board including copper and masks.
 
BOARD_STACKUP & GetStackupDescriptor()
 
int GetCopperLayerCount() const
 
Manage one layer needed to make a physical board.
 
void AddDielectricPrms(int aDielectricPrmsIdx)
Add (insert) a DIELECTRIC_PRMS item to m_DielectricPrmsList all values are set to default.
 
PCB_LAYER_ID m_LayerId
type name of layer (copper, silk screen, core, prepreg ...)
 
int GetSublayersCount() const
 
void SetDielectricLayerId(int aLayerId)
 
double GetEpsilonR(int aDielectricSubLayer=0) const
 
wxString GetColor(int aDielectricSubLayer=0) const
 
bool HasEpsilonRValue() const
 
void SetThickness(int aThickness, int aDielectricSubLayer=0)
 
bool IsMaterialEditable() const
 
BOARD_STACKUP_ITEM_TYPE m_Type
 
bool HasMaterialValue(int aDielectricSubLayer=0) const
 
void SetThicknessLocked(bool aLocked, int aDielectricSubLayer=0)
 
wxString FormatDielectricLayerName() const
 
void SetMaterial(const wxString &aName, int aDielectricSubLayer=0)
 
BOARD_STACKUP_ITEM(BOARD_STACKUP_ITEM_TYPE aType)
 
bool HasLossTangentValue() const
 
bool IsThicknessEditable() const
 
void SetLossTangent(double aTg, int aDielectricSubLayer=0)
 
int GetThickness(int aDielectricSubLayer=0) const
 
void SetEnabled(bool aEnable)
 
std::vector< DIELECTRIC_PRMS > m_DielectricPrmsList
the "layer" id for dielectric layers, from 1 (top) to 31 (bottom) (only 31 dielectric layers for 32 c...
 
static int GetMaskDefaultThickness()
 
wxString GetMaterial(int aDielectricSubLayer=0) const
 
wxString m_TypeName
name of layer as shown in layer manager. Useful to create reports
 
void SetBrdLayerId(PCB_LAYER_ID aBrdLayerId)
 
void SetTypeName(const wxString &aName)
 
bool IsThicknessLocked(int aDielectricSubLayer=0) const
 
wxString FormatEpsilonR(int aDielectricSubLayer=0) const
 
int m_DielectricLayerId
the layer id (F.Cu to B.Cu, F.Silk, B.silk, F.Mask, B.Mask) and UNDEFINED_LAYER (-1) for dielectric l...
 
void SetColor(const wxString &aColorName, int aDielectricSubLayer=0)
 
void SetEpsilonR(double aEpsilon, int aDielectricSubLayer=0)
 
void RemoveDielectricPrms(int aDielectricPrmsIdx)
Remove a DIELECTRIC_PRMS item from m_DielectricPrmsList.
 
int GetDielectricLayerId() const
 
bool operator==(const BOARD_STACKUP_ITEM &aOther) const
 
bool IsColorEditable() const
 
wxString FormatLossTangent(int aDielectricSubLayer=0) const
 
double GetLossTangent(int aDielectricSubLayer=0) const
 
static int GetCopperDefaultThickness()
 
void RemoveAll()
Delete all items in list and clear the list.
 
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
 
static LSET StackupAllowedBrdLayers()
 
bool SynchronizeWithBoard(BOARD_DESIGN_SETTINGS *aSettings)
Synchronize the BOARD_STACKUP_ITEM* list with the board.
 
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
 
bool operator==(const BOARD_STACKUP &aOther) const
 
int BuildBoardThicknessFromStackup() const
 
bool m_HasDielectricConstrains
True if some layers have impedance controlled tracks or have specific constrains for micro-wave appli...
 
void Add(BOARD_STACKUP_ITEM *aItem)
Add a new item in stackup layer.
 
void BuildDefaultStackupList(const BOARD_DESIGN_SETTINGS *aSettings, int aActiveCopperLayersCount=0)
Create a default stackup, according to the current BOARD_DESIGN_SETTINGS settings.
 
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
 
BOARD_STACKUP & operator=(const BOARD_STACKUP &aOther)
 
BOARD_STACKUP_ITEM * GetStackupLayer(int aIndex)
 
int GetLayerDistance(PCB_LAYER_ID aFirstLayer, PCB_LAYER_ID aSecondLayer) const
Calculate the distance (height) between the two given copper layers.
 
std::vector< BOARD_STACKUP_ITEM * > m_list
 
bool m_EdgePlating
True if the edge board is plated.
 
BS_EDGE_CONNECTOR_CONSTRAINTS m_EdgeConnectorConstraints
If the board has edge connector cards, some constrains can be specified in job file: BS_EDGE_CONNECTO...
 
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, const BOARD *aBoard) const
Write the stackup info on board file.
 
bool m_HasThicknessConstrains
True if some layers (copper and/or dielectric) have specific thickness.
 
wxString m_FinishType
The name of external copper finish.
 
Information pertinent to a Pcbnew printed circuit board.
 
A helper class to manage a dielectric layer set of parameters.
 
double m_EpsilonR
true for dielectric layers with a fixed thickness (for impedance controlled purposes),...
 
int m_Thickness
type of material (for dielectric and solder mask)
 
bool operator==(const DIELECTRIC_PRMS &aOther) const
 
wxString m_Color
For dielectric (and solder mask) the dielectric loss.
 
bool m_ThicknessLocked
the physical layer thickness in internal units
 
double m_LossTangent
For dielectric (and solder mask) the dielectric constant.
 
LSET is a set of PCB_LAYER_IDs.
 
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
 
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
 
Some functions to handle hotkeys in KiCad.
 
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
KICOMMON_API std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue, EDA_DATA_TYPE aDataType=EDA_DATA_TYPE::DISTANCE)
Converts aValue from internal units to a string appropriate for writing to file.
 
wxString NotSpecifiedPrm()
 
#define DEFAULT_EPSILON_R_SILKSCREEN
 
#define DEFAULT_EPSILON_R_SOLDERMASK
 
std::string UIDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 We want to avoid scientific ...
 
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...