33#include <wx/bmpcbox.h>
36#include <wx/clipbrd.h>
37#include <wx/wupdlock.h>
38#include <wx/richmsgdlg.h>
47#include <wx/textdlg.h>
55#define ID_INCREMENT 256
73static void drawBitmap( wxBitmap& aBitmap, wxColor aColor );
143 [&]( wxTextCtrl* aTextCtrl )
145 wxString str = aTextCtrl->GetValue();
151 aTextCtrl->ChangeValue( str );
159 convert(
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl ) );
185 std::vector< BOARD_STACKUP_ROW_UI_ITEM* > items_candidate;
189 int min_thickness = 0;
199 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_item.m_ThicknessLockCtrl );
201 if( cb_box && !cb_box->GetValue() )
203 items_candidate.push_back( &ui_item );
207 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
210 min_thickness += item_thickness;
215 if( min_thickness == 0 )
217 title.Printf(
_(
"Enter board thickness in %s:" ),
222 title.Printf(
_(
"Enter expected board thickness (min value %s):" ),
226 wxTextEntryDialog dlg(
this, title,
_(
"Adjust Unlocked Dielectric Layers" ) );
228 if( dlg.ShowModal() != wxID_OK )
233 if( iu_thickness < min_thickness )
235 wxMessageBox( wxString::Format(
_(
"Value too small (min value %s)." ),
242 if( items_candidate.size() )
245 wxMessageBox(
_(
"All dielectric thickness layers are locked" ) );
256 wxBitmapComboBox* cb =
dynamic_cast<wxBitmapComboBox*
>( item );
260 cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
265 wxButton* matButt =
dynamic_cast<wxButton*
>( item );
269 matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
274 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( item );
278 textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
288 wxArrayString headers;
289 headers.Add(
_(
"Layers" ) );
292 std::vector<wxArrayString> d_list;
293 std::vector<int> rows;
300 if( !item.m_isEnabled )
307 wxArrayString d_item;
311 d_item.Add( wxString::Format(
_(
"Layer '%s' (sublayer %d/%d)" ),
321 d_list.emplace_back( d_item );
322 rows.push_back( row );
327 headers, d_list, wxEmptyString,
332 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
350 wxArrayString headers;
351 headers.Add(
_(
"Layers" ) );
356 std::vector<wxArrayString> d_list;
357 std::vector<int> rows;
364 item->GetSublayersCount() <= 1 )
370 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
372 wxArrayString d_item;
374 d_item.Add( wxString::Format(
_(
"Layer '%s' sublayer %d/%d" ),
375 item->FormatDielectricLayerName(),
377 item->GetSublayersCount() ) );
379 d_list.emplace_back( d_item );
380 rows.push_back( row++ );
385 headers, d_list, wxEmptyString,
390 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
414 if( item->GetSublayersCount() > 1 )
416 event.Enable(
true );
421 event.Enable(
false );
437 if( wxTheClipboard->Open() )
441 wxTheClipboard->SetData(
new wxTextDataObject( report ) );
442 wxTheClipboard->Flush();
443 wxTheClipboard->Close();
452 const wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( row.
m_ColorCtrl );
453 int idx = choice ? choice->GetSelection() : 0;
475 wxASSERT( copperLayerCount % 2 == 0 );
477 int dielectricLayerCount = copperLayerCount - 1;
478 int coreLayerCount = copperLayerCount / 2 - 1;
480 wxASSERT( dielectricLayerCount > 0 );
482 bool currentLayerIsCore =
false;
485 if( copperLayerCount == 2 )
488 currentLayerIsCore =
true;
491 wxASSERT( coreLayerCount > 0 );
493 int prePregLayerCount = dielectricLayerCount - coreLayerCount;
495 int totalWidthOfFixedItems = 0;
504 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
505 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
510 || ( cbLock && cbLock->GetValue() ) )
514 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
517 totalWidthOfFixedItems += item_thickness;
522 int remainingWidth = targetThickness
523 - totalWidthOfFixedItems
524 - ( prePregDefaultThickness * prePregLayerCount );
526 int prePregThickness = prePregDefaultThickness;
527 int coreThickness = remainingWidth / coreLayerCount;
529 if( coreThickness < prePregThickness )
532 remainingWidth = targetThickness - totalWidthOfFixedItems;
533 prePregThickness = coreThickness = std::max( 0, remainingWidth / dielectricLayerCount );
543 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
551 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
553 if( cbLock && cbLock->GetValue() )
555 currentLayerIsCore = !currentLayerIsCore;
561 int layerThickness = currentLayerIsCore ? coreThickness : prePregThickness;
563 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
564 layerType->SetSelection( currentLayerIsCore ? 0 : 1 );
567 currentLayerIsCore = !currentLayerIsCore;
583 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
586 thickness += item_thickness;
609 wxASSERT( copperCount >= 2 );
614 for(
int i = 1; i < copperCount - 1; i++ )
632 int sub_item = ui_row_item.m_SubItem;
636 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_row_item.m_LayerTypeCtrl );
644 wxTextCtrl* matName =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_MaterialCtrl );
649 matName->ChangeValue( item->
GetMaterial( sub_item ) );
657 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_ThicknessCtrl );
664 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_row_item.m_ThicknessLockCtrl );
673 auto bm_combo =
dynamic_cast<wxBitmapComboBox*
>( ui_row_item.m_ColorCtrl );
676 if( item->
GetColor( sub_item ).StartsWith( wxT(
"#" ) ) )
680 ui_row_item.m_UserColor = custom_color;
686 bm_combo->SetString( selected, item->
GetColor( sub_item ) );
689 bm_combo->SetItemBitmap( selected, layerbmp );
710 bm_combo->SetSelection( selected );
716 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_EpsilonCtrl );
719 textCtrl->ChangeValue( txt );
725 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_LossTgCtrl );
728 textCtrl->ChangeValue( txt );
746 int copperLayersCount = copperMask.
count();
762 ui_row_item.m_isEnabled = show_item;
770 if( show_item && !ui_row_item.m_Icon )
773 if( ui_row_item.m_Icon )
776 ui_row_item.m_Icon->Show( show_item );
777 ui_row_item.m_LayerName->Show( show_item );
778 ui_row_item.m_LayerTypeCtrl->Show( show_item );
779 ui_row_item.m_MaterialCtrl->Show( show_item );
781 if( ui_row_item.m_MaterialButt )
782 ui_row_item.m_MaterialButt->Show( show_item );
784 ui_row_item.m_ThicknessCtrl->Show( show_item );
785 ui_row_item.m_ThicknessLockCtrl->Show( show_item );
786 ui_row_item.m_ColorCtrl->Show( show_item );
787 ui_row_item.m_EpsilonCtrl->Show( show_item );
788 ui_row_item.m_LossTgCtrl->Show( show_item );
796 wxStaticText* emptyText =
new wxStaticText(
m_scGridWin, wxID_ANY, wxEmptyString );
797 m_fgGridSizer->Insert( aPos, emptyText, 0, wxALIGN_CENTER_VERTICAL );
807 int row = ui_row_item.
m_Row;
811 wxStaticBitmap* bitmap =
new wxStaticBitmap(
m_scGridWin, wxID_ANY, wxNullBitmap );
812 m_fgGridSizer->Insert( aPos++, bitmap, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 4 );
813 ui_row_item.
m_Icon = bitmap;
821 lname << wxT(
" (" ) << sublayerIdx +1 << wxT(
"/" )
825 wxStaticText* st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
826 m_fgGridSizer->Insert( aPos++, st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
831 if( sublayerIdx == 0 )
833 wxChoice* choice =
new wxChoice(
m_scGridWin, wxID_ANY, wxDefaultPosition,
836 m_fgGridSizer->Insert( aPos++, choice, 1, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
849 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 1 );
850 st_text->Show(
true );
856 lname =
_(
"Copper" );
860 st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
861 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
867 wxString matName = item->
GetMaterial( sublayerIdx );
869 wxBoxSizer* bSizerMat =
new wxBoxSizer( wxHORIZONTAL );
870 m_fgGridSizer->Insert( aPos++, bSizerMat, 1, wxRIGHT|wxEXPAND, 4 );
871 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY );
874 textCtrl->ChangeValue( matName );
879 bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
882 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
883 bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
885 m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
904 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
906 textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
918 wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL, 2 );
935 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
945 m_fgGridSizer->Insert( aPos++, bm_combo, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
947 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
950 bm_combo->SetString( selected, item->
GetColor( sublayerIdx ) );
965 bm_combo->SetSelection( selected );
976 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
978 textCtrl->ChangeValue( txt );
979 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
990 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
992 textCtrl->ChangeValue( txt );
993 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1019 if( ui_item.m_MaterialCtrl )
1020 ui_item.m_MaterialCtrl->SetSizer(
nullptr );
1023 delete ui_item.m_Icon;
1024 delete ui_item.m_LayerName;
1025 delete ui_item.m_LayerTypeCtrl;
1026 delete ui_item.m_MaterialCtrl;
1027 delete ui_item.m_MaterialButt;
1028 delete ui_item.m_ThicknessCtrl;
1029 delete ui_item.m_ThicknessLockCtrl;
1030 delete ui_item.m_ColorCtrl;
1031 delete ui_item.m_EpsilonCtrl;
1032 delete ui_item.m_LossTgCtrl;
1044 m_fgGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
1049 const int sizer_flags = wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_CENTER_HORIZONTAL;
1075 bool aRelinkStackup )
1079 if( aCreateInitialStackup || aRelinkStackup )
1081 if( aCreateInitialStackup )
1100 if( item->GetBrdLayerId() == board_item->GetBrdLayerId() )
1102 *item = *board_item;
1112 if( item->GetDielectricLayerId() == board_item->GetDielectricLayerId() )
1114 *item = *board_item;
1126 for(
int sub_idx = 0; sub_idx < item->GetSublayersCount(); sub_idx++ )
1139 bool success =
true;
1145 if( !ui_item.m_isEnabled )
1151 int sub_item = ui_item.m_SubItem;
1162 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_EpsilonCtrl );
1163 wxString txt = textCtrl->GetValue();
1165 if( txt.ToDouble( &value ) && value >= 0.0 )
1167 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1172 error_msg <<
_(
"Incorrect value for Epsilon R (Epsilon R must be positive or "
1173 "null if not used)" );
1179 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_LossTgCtrl );
1180 wxString txt = textCtrl->GetValue();
1182 if( txt.ToDouble( &value ) && value >= 0.0 )
1184 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1190 if( !error_msg.IsEmpty() )
1191 error_msg << wxT(
"\n" );
1193 error_msg <<
_(
"Incorrect value for Loss tg (Loss tg must be positive or null "
1200 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_MaterialCtrl );
1201 item->
SetMaterial( textCtrl->GetValue(), sub_item );
1212 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
1216 int idx = choice->GetSelection();
1227 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
1232 if( new_thickness < 0 )
1236 if( !error_msg.IsEmpty() )
1237 error_msg << wxT(
"\n" );
1239 error_msg <<
_(
"A layer thickness is < 0. Fix it" );
1245 wxCheckBox* cb_box =
static_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
1252 wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( ui_item.m_ColorCtrl );
1256 int idx = choice->GetSelection();
1259 item->
SetColor( ui_item.m_UserColor.ToHexString(), sub_item );
1268 wxMessageBox( error_msg,
_(
"Errors" ) );
1300 if( item->IsEnabled() )
1382 int idx =
event.GetSelection();
1383 int item_id =
event.GetId();
1398 if( dlg.ShowModal() == wxID_OK )
1400 wxBitmapComboBox* combo =
static_cast<wxBitmapComboBox*
>( FindWindowById( item_id ) );
1405 combo->SetString( idx,
color.ToHexString() );
1409 combo->SetItemBitmap( combo->GetCount() - 1, layerbmp );
1411 combo->SetSelection( idx );
1440 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
1443 item->GetEpsilonR( ii ),
1444 item->GetLossTangent( ii ) );
1446 if( idx < 0 && !item->GetMaterial().IsEmpty() )
1450 new_mat.
m_Name = item->GetMaterial( ii );
1451 new_mat.
m_EpsilonR = item->GetEpsilonR( ii );
1468 default: item_mat_list =
nullptr;
break;
1471 wxCHECK( item_mat_list, );
1475 if( dlg.ShowModal() != wxID_OK )
1480 if( substrate.
m_Name.IsEmpty() )
1488 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_MaterialCtrl );
1489 textCtrl->ChangeValue( item->
GetMaterial( sub_item ) );
1492 && !item->
GetColor( sub_item ).StartsWith(
"#" ) )
1494 if( substrate.
m_Name.IsSameAs(
"PTFE" )
1495 || substrate.
m_Name.IsSameAs(
"Teflon" ) )
1497 item->
SetColor(
"PTFE natural", sub_item );
1499 else if( substrate.
m_Name.IsSameAs(
"Polyimide" )
1500 || substrate.
m_Name.IsSameAs(
"Kapton" ) )
1502 item->
SetColor(
"Polyimide", sub_item );
1504 else if( substrate.
m_Name.IsSameAs(
"Al" ) )
1506 item->
SetColor(
"Aluminum", sub_item );
1510 item->
SetColor(
"FR4 natural", sub_item );
1514 wxBitmapComboBox* picker =
static_cast<wxBitmapComboBox*
>(
m_rowUiItemsList[row].m_ColorCtrl );
1520 picker->SetSelection( ii );
1528 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_EpsilonCtrl );
1537 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_LossTgCtrl );
1548 wxString value =
event.GetString();
1575 wxASSERT( st_item );
1591 wxFAIL_MSG( wxT(
"PANEL_SETUP_BOARD_STACKUP::getColorIconItem: unrecognized item type" ) );
1595 wxASSERT_MSG(
color.IsOk(), wxT(
"Invalid color in PCB stackup" ) );
1604 const int bitmap_depth = 24;
1612 st_bitmap->SetBitmap( bmp );
1632 wxEmptyString, wxDefaultPosition,
1633 wxDefaultSize, 0,
nullptr, wxCB_READONLY );
1646 && aStackupItem && aStackupItem->
GetColor().StartsWith( wxT(
"#" ) ) )
1649 curr_color =
COLOR4D( label );
1660 combo->Append( label, layerbmp );
1668 int sel = combo->GetSelection();
1669 combo->SetSelection( combo->GetCount() - 1 );
1671 combo->SetMinSize( wxSize( -1, -1 ) );
1672 wxSize bestSize = combo->GetBestSize();
1675 combo->SetMinSize( bestSize );
1676 combo->SetSelection( sel );
1682 combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
1686 combo->Bind( wxEVT_COMBOBOX_DROPDOWN,
1687 [combo]( wxCommandEvent& aEvent )
1689 combo->SetString( combo->GetCount() - 1,
_(
"Custom..." ) );
1698 wxNativePixelData data( aBitmap );
1699 wxNativePixelData::Iterator p( data );
1701 for(
int yy = 0; yy < data.GetHeight(); yy++ )
1703 wxNativePixelData::Iterator rowStart = p;
1705 for(
int xx = 0; xx < data.GetWidth(); xx++ )
1707 p.Red() = aColor.Red();
1708 p.Green() = aColor.Green();
1709 p.Blue() = aColor.Blue();
1714 p.OffsetY( data, 1 );
constexpr EDA_IU_SCALE pcbIUScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
bool IsPrmSpecified(const wxString &aPrmValue)
@ BS_ITEM_TYPE_SILKSCREEN
@ BS_ITEM_TYPE_DIELECTRIC
@ BS_ITEM_TYPE_SOLDERPASTE
@ BS_ITEM_TYPE_SOLDERMASK
wxString BuildStackupReport(BOARD_STACKUP &aStackup, EDA_UNITS aUnits)
BASE_SET & set(size_t pos=std::numeric_limits< size_t >::max(), bool value=true)
Container for design settings for a BOARD object.
int GetBoardThickness() const
The full thickness of the board including copper and masks.
BOARD_STACKUP & GetStackupDescriptor()
int GetCopperLayerCount() const
void SetBoardThickness(int aThickness)
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.
wxString GetTypeName() const
int GetSublayersCount() const
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
void SetThicknessLocked(bool aLocked, int aDielectricSubLayer=0)
wxString FormatDielectricLayerName() const
wxString GetLayerName() const
void SetMaterial(const wxString &aName, int aDielectricSubLayer=0)
bool HasLossTangentValue() const
PCB_LAYER_ID GetBrdLayerId() const
bool IsThicknessEditable() const
void SetLossTangent(double aTg, int aDielectricSubLayer=0)
int GetThickness(int aDielectricSubLayer=0) const
void SetEnabled(bool aEnable)
BOARD_STACKUP_ITEM_TYPE GetType() const
wxString GetMaterial(int aDielectricSubLayer=0) const
void SetTypeName(const wxString &aName)
bool IsThicknessLocked(int aDielectricSubLayer=0) const
wxString FormatEpsilonR(int aDielectricSubLayer=0) const
void SetColor(const wxString &aColorName, int aDielectricSubLayer=0)
void SetEpsilonR(double aEpsilon, int aDielectricSubLayer=0)
void SetLayerName(const wxString &aName)
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
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.
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
static LSET StackupAllowedBrdLayers()
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.
Information pertinent to a Pcbnew printed circuit board.
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
int GetCopperLayerCount() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
KIGFX::COLOR4D GetColor()
a Dialog to select/change/add a dielectric material from a material list
DIELECTRIC_SUBSTRATE GetSelectedSubstrate()
int AppendSubstrate(DIELECTRIC_SUBSTRATE &aItem)
Append a item in list similar to aItem.
int FindSubstrate(DIELECTRIC_SUBSTRATE *aItem)
Find a item in list similar to aItem.
void SetListLabel(const wxString &aLabel)
A color representation with 4 components: red, green, blue, alpha.
wxColour ToColour() const
static void DrawColorSwatch(wxBitmap &aLayerbmp, const COLOR4D &aBackground, const COLOR4D &aColor)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
LSET is a set of PCB_LAYER_IDs.
static LSET ExternalCuMask()
Return a mask holding the Front and Bottom layers.
static LSET InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
static PAGED_DIALOG * GetDialog(wxWindow *aWindow)
bool TransferDataFromWindow() override
Class PANEL_SETUP_BOARD_STACKUP_BASE.
wxScrolledWindow * m_scGridWin
wxStaticText * m_staticTextLayer
wxStaticText * m_staticTextMaterial
wxStaticText * m_staticTextLayerId
wxStaticBitmap * m_bitmapLockThickness
wxStaticText * m_staticTextColor
wxCheckBox * m_impedanceControlled
wxStaticText * m_staticTextType
wxStaticText * m_staticTextThickness
wxFlexGridSizer * m_fgGridSizer
wxStaticText * m_staticTextLossTg
wxStaticText * m_staticTextEpsilonR
wxChoice * m_choiceCopperLayers
int GetSublayerId(int aRow)
void onAddDielectricLayer(wxCommandEvent &event) override
DIELECTRIC_SUBSTRATE_LIST m_silkscreenMatList
wxArrayString m_core_prepreg_choice
void onExportToClipboard(wxCommandEvent &event) override
bool transferDataFromUIToStackup()
Transfer current UI settings to m_stackup but not to the board.
PANEL_SETUP_BOARD_STACKUP(wxWindow *aParentWindow, PCB_EDIT_FRAME *aFrame, PANEL_SETUP_LAYERS *aPanelLayers, PANEL_SETUP_BOARD_FINISH *aPanelFinish)
wxSize m_numericTextCtrlSize
std::vector< wxControl * > m_controlItemsList
void onColorSelected(wxCommandEvent &event)
bool TransferDataFromWindow() override
void onCopperLayersSelCount(wxCommandEvent &event) override
void onUnitsChanged(wxCommandEvent &event)
void ImportSettingsFrom(BOARD *aBoard)
wxColor getColorIconItem(int aRow)
void OnLayersOptionsChanged(LSET aNewLayerSet)
Must be called if the copper layers count has changed or solder mask, solder paste or silkscreen laye...
PANEL_SETUP_BOARD_FINISH * m_panelFinish
void updateIconColor(int aRow=-1)
Update the icons color (swatches in first grid column)
void updateCopperLayerCount()
Updates the enabled copper layers when the dropdown is changed.
wxColor GetSelectedColor(int aRow) const
Return the color currently selected for the row aRow.
void onRemoveDielectricLayer(wxCommandEvent &event) override
wxControl * addSpacer(int aPos)
add a Spacer in m_fgGridSizer when a empty cell is needed
int computeBoardThickness()
Recompute the board thickness and update the textbox.
void setDefaultLayerWidths(int targetThickness)
Set the widths of dielectric layers to sensible defaults.
void synchronizeWithBoard(bool aFullSync)
Synchronize the full stackup shown in m_fgGridSizer according to the stackup of the current board and...
void buildLayerStackPanel(bool aCreateInitialStackup=false, bool aRelinkStackup=false)
Populate m_fgGridSizer with items to handle stackup parameters This is a full list: all copper layers...
void onThicknessChange(wxCommandEvent &event)
BOARD_DESIGN_SETTINGS * m_brdSettings
int GetCopperLayerCount() const
BOARD_STACKUP_ITEM * GetStackupItem(int aRow)
void showOnlyActiveLayers()
Show or do not show items in m_fgGridSizer according to the stackup of the current board.
DIELECTRIC_SUBSTRATE_LIST m_solderMaskMatList
std::vector< BOARD_STACKUP_ROW_UI_ITEM > m_rowUiItemsList
PANEL_SETUP_LAYERS * m_panelLayers
void onRemoveDielUI(wxUpdateUIEvent &event) override
void lazyBuildRowUI(BOARD_STACKUP_ROW_UI_ITEM &ui_row_item, int aPos)
Creates the controls in a BOARD_STACKUP_ROW_UI_ITEM relative to the aStackupItem.
DIELECTRIC_SUBSTRATE_LIST m_delectricMatList
wxBitmapComboBox * createColorBox(BOARD_STACKUP_ITEM *aStackupItem, int aRow)
creates a bitmap combobox to select a layer color
wxSize m_numericFieldsSize
void disconnectEvents()
disconnect event handlers connected to wxControl items found in list m_controlItemsList
void onAdjustDielectricThickness(wxCommandEvent &event) override
~PANEL_SETUP_BOARD_STACKUP()
void onMaterialChange(wxCommandEvent &event)
wxSize m_colorSwatchesSize
void rebuildLayerStackPanel(bool aRelinkItems=false)
Populate m_fgGridSizer with items to handle stackup parameters If previous items are in list,...
bool IsInitialized() const
void SetPhysicalStackupPanel(PANEL_SETUP_BOARD_STACKUP *aPanel)
The main frame for Pcbnew.
void OnModify() override
Must be called after a board change to set the modified flag.
const EDA_IU_SCALE & GetIuScale() const
EDA_UNITS GetUserUnits() const
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
int ValueFromString(const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aTextValue in aUnits to internal units used by the frame.
void SetBorders(bool aLeft, bool aRight, bool aTop, bool aBottom)
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API long long int ValueFromString(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, const wxString &aTextValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Function ValueFromString converts aTextValue in aUnits to internal units used by the application.
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Returns the string from aValue according to aUnits (inch, mm ...) for display.
KICOMMON_API wxString GetText(EDA_UNITS aUnits, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Get the units string for a given units type.
static wxColor pasteColor(200, 200, 200)
static wxColor copperColor(220, 180, 30)
static wxColor dielectricColor(75, 120, 75)
static void drawBitmap(wxBitmap &aBitmap, wxColor aColor)
@ ID_ITEM_THICKNESS_LOCKED
int GetUserUnits()
Return the currently selected user unit value for the interface.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
std::vector< FAB_LAYER_COLOR > dummy
const std::vector< FAB_LAYER_COLOR > & GetStandardColors(BOARD_STACKUP_ITEM_TYPE aType)
int GetColorUserDefinedListIdx(BOARD_STACKUP_ITEM_TYPE aType)
bool IsCustomColorIdx(BOARD_STACKUP_ITEM_TYPE aType, int aIdx)
KIGFX::COLOR4D GetStandardColor(BOARD_STACKUP_ITEM_TYPE aType, int aIdx)
wxString NotSpecifiedPrm()
const wxString & GetStandardColorName(BOARD_STACKUP_ITEM_TYPE aType, int aIdx)
KIGFX::COLOR4D GetDefaultUserColor(BOARD_STACKUP_ITEM_TYPE aType)
std::string UIDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 We want to avoid scientific ...
wxControl * m_ThicknessCtrl
wxStaticText * m_LayerName
wxControl * m_ThicknessLockCtrl
wxControl * m_EpsilonCtrl
wxButton * m_MaterialButt
wxControl * m_MaterialCtrl
wxControl * m_LayerTypeCtrl
BOARD_STACKUP_ITEM * m_Item
constexpr int mmToIU(double mm) const