108 || aDielectricPrmsIdx < 0
136 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
143 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
151 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
159 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
167 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
175 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
184 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
193 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
202 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
211 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
220 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
229 wxASSERT( aDielectricSubLayer >= 0 && aDielectricSubLayer <
GetSublayersCount() );
374 if( aIndex < 0 || aIndex >=
GetCount() )
388 if( item->IsThicknessEditable() && item->IsEnabled() )
390 thickness += item->GetThickness();
394 for(
int idx = 1; idx < item->GetSublayersCount(); idx++ )
396 thickness += item->GetThickness( idx );
421 if( item->GetBrdLayerId() == curr_item->GetBrdLayerId() )
432 if( item->GetDielectricLayerId() == curr_item->GetDielectricLayerId() )
456 if( item->GetBrdLayerId() == initial_item->GetBrdLayerId() )
458 *item = *initial_item;
469 if( item->GetDielectricLayerId() == initial_item->GetDielectricLayerId() )
471 *item = *initial_item;
500 int aActiveCopperLayersCount )
513 int activeCuLayerCount = copperLayerCount;
515 if( aSettings ==
nullptr && aActiveCopperLayersCount > 0 )
516 activeCuLayerCount = aActiveCopperLayersCount;
519 int diel_thickness = brd__thickness -
525 diel_thickness /= std::max( 1, activeCuLayerCount - 1 );
527 int dielectric_idx = 0;
546 if( enabledLayer[
F_Mask] )
555 for(
int ii = 0; ii < copperLayerCount; ii++ )
562 if( ii == copperLayerCount-1 )
574 if( (dielectric_idx & 1) == 0 )
590 if( enabledLayer[
B_Mask] )
627 const BOARD* aBoard,
int aNestLevel )
const
634 aFormatter->
Print( aNestLevel,
"(stackup\n" );
635 int nest_level = aNestLevel+1;
644 layer_name.Printf( wxT(
"dielectric %d" ), item->GetDielectricLayerId() );
646 layer_name =
LSET::Name( item->GetBrdLayerId() );
648 aFormatter->
Print( nest_level,
"(layer %s (type %s)",
649 aFormatter->
Quotew( layer_name ).c_str(),
650 aFormatter->
Quotew( item->GetTypeName() ).c_str() );
653 for(
int idx = 0; idx < item->GetSublayersCount(); idx++ )
657 aFormatter->
Print( 0,
"\n" );
658 aFormatter->
Print( nest_level+1,
"addsublayer" );
661 if( item->IsColorEditable() &&
IsPrmSpecified( item->GetColor( idx ) ) )
663 aFormatter->
Print( 0,
" (color %s)",
664 aFormatter->
Quotew( item->GetColor( idx ) ).c_str() );
667 if( item->IsThicknessEditable() )
670 aFormatter->
Print( 0,
" (thickness %s locked)",
673 aFormatter->
Print( 0,
" (thickness %s)",
677 if( item->HasMaterialValue( idx ) )
678 aFormatter->
Print( 0,
" (material %s)",
679 aFormatter->
Quotew( item->GetMaterial( idx ) ).c_str() );
681 if( item->HasEpsilonRValue() && item->HasMaterialValue( idx ) )
682 aFormatter->
Print( 0,
" (epsilon_r %g)", item->GetEpsilonR( idx ) );
684 if( item->HasLossTangentValue() && item->HasMaterialValue( idx ) )
685 aFormatter->
Print( 0,
" (loss_tangent %s)",
689 aFormatter->
Print( 0,
")\n" );
695 aFormatter->
Print( nest_level,
"(copper_finish %s)\n",
699 aFormatter->
Print( nest_level,
"(dielectric_constraints %s)\n",
704 aFormatter->
Print( nest_level,
"(edge_connector %s)\n",
709 aFormatter->
Print( nest_level,
"(castellated_pads yes)\n" );
712 aFormatter->
Print( nest_level,
"(edge_plating yes)\n" );
714 aFormatter->
Print( aNestLevel,
")\n" );
722 if( aFirstLayer == aSecondLayer )
725 if( aSecondLayer < aFirstLayer )
726 std::swap( aFirstLayer, aSecondLayer );
753 for(
int sublayer = 0; sublayer < item->GetSublayersCount(); sublayer++ )
755 int subThickness = item->GetThickness( sublayer );
756 total += half ? ( subThickness / 2 ) : subThickness;
773 if( !aPrmValue.IsEmpty()
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.
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 IsColorEditable() const
wxString FormatLossTangent(int aDielectricSubLayer=0) const
double GetLossTangent(int aDielectricSubLayer=0) const
static int GetCopperDefaultThickness()
Manage layers needed to make a physical board.
void RemoveAll()
Delete all items in list and clear the list.
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, const BOARD *aBoard, int aNestLevel) const
Write the stackup info on board file.
bool m_CastellatedPads
True if castellated pads exist.
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.
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.
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...
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.
LSET is a set of PCB_LAYER_IDs.
static const wxChar * Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Some functions to handle hotkeys in KiCad.
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue)
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...
constexpr int mmToIU(double mm) const