35#include <wx/clipbrd.h>
36#include <wx/wupdlock.h>
37#include <wx/richmsgdlg.h>
46#include <wx/textdlg.h>
54#define ID_INCREMENT 256
72static void drawBitmap( wxBitmap& aBitmap, wxColor aColor );
142 [&]( wxTextCtrl* aTextCtrl )
144 wxString str = aTextCtrl->GetValue();
150 aTextCtrl->ChangeValue( str );
158 convert(
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl ) );
184 std::vector< BOARD_STACKUP_ROW_UI_ITEM* > items_candidate;
188 int min_thickness = 0;
198 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_item.m_ThicknessLockCtrl );
200 if( cb_box && !cb_box->GetValue() )
202 items_candidate.push_back( &ui_item );
206 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
209 min_thickness += item_thickness;
214 if( min_thickness == 0 )
216 title.Printf(
_(
"Enter board thickness in %s:" ),
221 title.Printf(
_(
"Enter expected board thickness (min value %s):" ),
225 wxTextEntryDialog dlg(
this, title,
_(
"Adjust Unlocked Dielectric Layers" ) );
227 if( dlg.ShowModal() != wxID_OK )
232 if( iu_thickness < min_thickness )
234 wxMessageBox( wxString::Format(
_(
"Value too small (min value %s)." ),
241 if( items_candidate.size() )
244 wxMessageBox(
_(
"All dielectric thickness layers are locked" ) );
255 wxBitmapComboBox* cb =
dynamic_cast<wxBitmapComboBox*
>( item );
259 cb->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED,
264 wxButton* matButt =
dynamic_cast<wxButton*
>( item );
268 matButt->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED,
273 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( item );
277 textCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED,
287 wxArrayString headers;
288 headers.Add(
_(
"Layers" ) );
291 std::vector<wxArrayString> d_list;
292 std::vector<int> rows;
299 if( !item.m_isEnabled )
306 wxArrayString d_item;
310 d_item.Add( wxString::Format(
_(
"Layer '%s' (sublayer %d/%d)" ),
320 d_list.emplace_back( d_item );
321 rows.push_back( row );
326 headers, d_list, wxEmptyString,
331 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
349 wxArrayString headers;
350 headers.Add(
_(
"Layers" ) );
355 std::vector<wxArrayString> d_list;
356 std::vector<int> rows;
363 item->GetSublayersCount() <= 1 )
369 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
371 wxArrayString d_item;
373 d_item.Add( wxString::Format(
_(
"Layer '%s' sublayer %d/%d" ),
374 item->FormatDielectricLayerName(),
376 item->GetSublayersCount() ) );
378 d_list.emplace_back( d_item );
379 rows.push_back( row++ );
384 headers, d_list, wxEmptyString,
389 if( dlg.ShowModal() == wxID_OK && dlg.
GetSelection() >= 0 )
413 if( item->GetSublayersCount() > 1 )
415 event.Enable(
true );
420 event.Enable(
false );
436 if( wxTheClipboard->Open() )
440 wxTheClipboard->SetData(
new wxTextDataObject( report ) );
441 wxTheClipboard->Flush();
442 wxTheClipboard->Close();
451 const wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( row.
m_ColorCtrl );
452 int idx = choice ? choice->GetSelection() : 0;
474 wxASSERT( copperLayerCount % 2 == 0 );
476 int dielectricLayerCount = copperLayerCount - 1;
477 int coreLayerCount = copperLayerCount / 2 - 1;
479 wxASSERT( dielectricLayerCount > 0 );
481 bool currentLayerIsCore =
false;
484 if( copperLayerCount == 2 )
487 currentLayerIsCore =
true;
490 wxASSERT( coreLayerCount > 0 );
492 int prePregLayerCount = dielectricLayerCount - coreLayerCount;
494 int totalWidthOfFixedItems = 0;
503 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
504 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
509 || ( cbLock && cbLock->GetValue() ) )
513 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
516 totalWidthOfFixedItems += item_thickness;
521 int remainingWidth = targetThickness
522 - totalWidthOfFixedItems
523 - ( prePregDefaultThickness * prePregLayerCount );
525 int prePregThickness = prePregDefaultThickness;
526 int coreThickness = remainingWidth / coreLayerCount;
528 if( coreThickness < prePregThickness )
531 remainingWidth = targetThickness - totalWidthOfFixedItems;
532 prePregThickness = coreThickness = std::max( 0, remainingWidth / dielectricLayerCount );
542 wxChoice* layerType =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
550 wxCheckBox* cbLock =
dynamic_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
552 if( cbLock && cbLock->GetValue() )
554 currentLayerIsCore = !currentLayerIsCore;
560 int layerThickness = currentLayerIsCore ? coreThickness : prePregThickness;
562 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
563 layerType->SetSelection( currentLayerIsCore ? 0 : 1 );
566 currentLayerIsCore = !currentLayerIsCore;
582 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
585 thickness += item_thickness;
608 wxASSERT( copperCount >= 2 );
613 for(
int i = 1; i < copperCount - 1; i++ )
631 int sub_item = ui_row_item.m_SubItem;
635 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_row_item.m_LayerTypeCtrl );
643 wxTextCtrl* matName =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_MaterialCtrl );
648 matName->ChangeValue( item->
GetMaterial( sub_item ) );
656 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_ThicknessCtrl );
663 wxCheckBox* cb_box =
dynamic_cast<wxCheckBox*
> ( ui_row_item.m_ThicknessLockCtrl );
672 auto bm_combo =
dynamic_cast<wxBitmapComboBox*
>( ui_row_item.m_ColorCtrl );
675 if( item->
GetColor( sub_item ).StartsWith( wxT(
"#" ) ) )
679 ui_row_item.m_UserColor = custom_color;
685 bm_combo->SetString( selected, item->
GetColor( sub_item ) );
688 bm_combo->SetItemBitmap( selected, layerbmp );
709 bm_combo->SetSelection( selected );
715 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_EpsilonCtrl );
718 textCtrl->ChangeValue( txt );
724 wxTextCtrl* textCtrl =
dynamic_cast<wxTextCtrl*
>( ui_row_item.m_LossTgCtrl );
727 textCtrl->ChangeValue( txt );
745 int copperLayersCount = copperMask.
count();
761 ui_row_item.m_isEnabled = show_item;
769 if( show_item && !ui_row_item.m_Icon )
772 if( ui_row_item.m_Icon )
775 ui_row_item.m_Icon->Show( show_item );
776 ui_row_item.m_LayerName->Show( show_item );
777 ui_row_item.m_LayerTypeCtrl->Show( show_item );
778 ui_row_item.m_MaterialCtrl->Show( show_item );
780 if( ui_row_item.m_MaterialButt )
781 ui_row_item.m_MaterialButt->Show( show_item );
783 ui_row_item.m_ThicknessCtrl->Show( show_item );
784 ui_row_item.m_ThicknessLockCtrl->Show( show_item );
785 ui_row_item.m_ColorCtrl->Show( show_item );
786 ui_row_item.m_EpsilonCtrl->Show( show_item );
787 ui_row_item.m_LossTgCtrl->Show( show_item );
795 wxStaticText* emptyText =
new wxStaticText(
m_scGridWin, wxID_ANY, wxEmptyString );
796 m_fgGridSizer->Insert( aPos, emptyText, 0, wxALIGN_CENTER_VERTICAL );
806 int row = ui_row_item.
m_Row;
810 wxStaticBitmap* bitmap =
new wxStaticBitmap(
m_scGridWin, wxID_ANY, wxNullBitmap );
811 m_fgGridSizer->Insert( aPos++, bitmap, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 4 );
812 ui_row_item.
m_Icon = bitmap;
820 lname << wxT(
" (" ) << sublayerIdx +1 << wxT(
"/" )
824 wxStaticText* st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
825 m_fgGridSizer->Insert( aPos++, st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
830 if( sublayerIdx == 0 )
832 wxChoice* choice =
new wxChoice(
m_scGridWin, wxID_ANY, wxDefaultPosition,
835 m_fgGridSizer->Insert( aPos++, choice, 1, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
848 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 1 );
849 st_text->Show(
true );
855 lname =
_(
"Copper" );
859 st_text =
new wxStaticText(
m_scGridWin, wxID_ANY, lname );
860 m_fgGridSizer->Insert( aPos++, st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
866 wxString matName = item->
GetMaterial( sublayerIdx );
868 wxBoxSizer* bSizerMat =
new wxBoxSizer( wxHORIZONTAL );
869 m_fgGridSizer->Insert( aPos++, bSizerMat, 1, wxRIGHT|wxEXPAND, 4 );
870 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY );
873 textCtrl->ChangeValue( matName );
878 bSizerMat->Add( textCtrl, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
881 wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT );
882 bSizerMat->Add( m_buttonMat, 0, wxALIGN_CENTER_VERTICAL, 2 );
884 m_buttonMat->Connect( wxEVT_COMMAND_BUTTON_CLICKED,
903 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
905 textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
917 wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL, 2 );
934 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
944 m_fgGridSizer->Insert( aPos++, bm_combo, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
946 if( item->
GetColor( sublayerIdx ).StartsWith( wxT(
"#" ) ) )
949 bm_combo->SetString( selected, item->
GetColor( sublayerIdx ) );
964 bm_combo->SetSelection( selected );
975 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
977 textCtrl->ChangeValue( txt );
978 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
989 wxTextCtrl* textCtrl =
new wxTextCtrl(
m_scGridWin, wxID_ANY, wxEmptyString,
991 textCtrl->ChangeValue( txt );
992 m_fgGridSizer->Insert( aPos++, textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
1018 if( ui_item.m_MaterialCtrl )
1019 ui_item.m_MaterialCtrl->SetSizer(
nullptr );
1022 delete ui_item.m_Icon;
1023 delete ui_item.m_LayerName;
1024 delete ui_item.m_LayerTypeCtrl;
1025 delete ui_item.m_MaterialCtrl;
1026 delete ui_item.m_MaterialButt;
1027 delete ui_item.m_ThicknessCtrl;
1028 delete ui_item.m_ThicknessLockCtrl;
1029 delete ui_item.m_ColorCtrl;
1030 delete ui_item.m_EpsilonCtrl;
1031 delete ui_item.m_LossTgCtrl;
1043 m_fgGridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
1048 const int sizer_flags = wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_CENTER_HORIZONTAL;
1074 bool aRelinkStackup )
1078 if( aCreateInitialStackup || aRelinkStackup )
1080 if( aCreateInitialStackup )
1099 if( item->GetBrdLayerId() == board_item->GetBrdLayerId() )
1101 *item = *board_item;
1111 if( item->GetDielectricLayerId() == board_item->GetDielectricLayerId() )
1113 *item = *board_item;
1125 for(
int sub_idx = 0; sub_idx < item->GetSublayersCount(); sub_idx++ )
1138 bool success =
true;
1144 if( !ui_item.m_isEnabled )
1150 int sub_item = ui_item.m_SubItem;
1161 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_EpsilonCtrl );
1162 wxString txt = textCtrl->GetValue();
1164 if( txt.ToDouble( &value ) && value >= 0.0 )
1166 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1171 error_msg <<
_(
"Incorrect value for Epsilon R (Epsilon R must be positive or "
1172 "null if not used)" );
1178 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_LossTgCtrl );
1179 wxString txt = textCtrl->GetValue();
1181 if( txt.ToDouble( &value ) && value >= 0.0 )
1183 else if( txt.ToCDouble( &value ) && value >= 0.0 )
1189 if( !error_msg.IsEmpty() )
1190 error_msg << wxT(
"\n" );
1192 error_msg <<
_(
"Incorrect value for Loss tg (Loss tg must be positive or null "
1199 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_MaterialCtrl );
1200 item->
SetMaterial( textCtrl->GetValue(), sub_item );
1211 wxChoice* choice =
dynamic_cast<wxChoice*
>( ui_item.m_LayerTypeCtrl );
1215 int idx = choice->GetSelection();
1226 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>( ui_item.m_ThicknessCtrl );
1231 if( new_thickness < 0 )
1235 if( !error_msg.IsEmpty() )
1236 error_msg << wxT(
"\n" );
1238 error_msg <<
_(
"A layer thickness is < 0. Fix it" );
1244 wxCheckBox* cb_box =
static_cast<wxCheckBox*
>( ui_item.m_ThicknessLockCtrl );
1251 wxBitmapComboBox* choice =
dynamic_cast<wxBitmapComboBox*
>( ui_item.m_ColorCtrl );
1255 int idx = choice->GetSelection();
1258 item->
SetColor( ui_item.m_UserColor.ToHexString(), sub_item );
1267 wxMessageBox( error_msg,
_(
"Errors" ) );
1299 if( item->IsEnabled() )
1381 int idx =
event.GetSelection();
1382 int item_id =
event.GetId();
1397 if( dlg.ShowModal() == wxID_OK )
1399 wxBitmapComboBox* combo =
static_cast<wxBitmapComboBox*
>( FindWindowById( item_id ) );
1404 combo->SetString( idx,
color.ToHexString() );
1408 combo->SetItemBitmap( combo->GetCount() - 1, layerbmp );
1410 combo->SetSelection( idx );
1439 for(
int ii = 0; ii < item->GetSublayersCount(); ii++ )
1442 item->GetEpsilonR( ii ),
1443 item->GetLossTangent( ii ) );
1445 if( idx < 0 && !item->GetMaterial().IsEmpty() )
1449 new_mat.
m_Name = item->GetMaterial( ii );
1450 new_mat.
m_EpsilonR = item->GetEpsilonR( ii );
1467 default: item_mat_list =
nullptr;
break;
1470 wxCHECK( item_mat_list, );
1474 if( dlg.ShowModal() != wxID_OK )
1479 if( substrate.
m_Name.IsEmpty() )
1487 wxTextCtrl* textCtrl =
static_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_MaterialCtrl );
1488 textCtrl->ChangeValue( item->
GetMaterial( sub_item ) );
1491 && !item->
GetColor( sub_item ).StartsWith(
"#" ) )
1493 if( substrate.
m_Name.IsSameAs(
"PTFE" )
1494 || substrate.
m_Name.IsSameAs(
"Teflon" ) )
1496 item->
SetColor(
"PTFE natural", sub_item );
1498 else if( substrate.
m_Name.IsSameAs(
"Polyimide" )
1499 || substrate.
m_Name.IsSameAs(
"Kapton" ) )
1501 item->
SetColor(
"Polyimide", sub_item );
1503 else if( substrate.
m_Name.IsSameAs(
"Al" ) )
1505 item->
SetColor(
"Aluminum", sub_item );
1509 item->
SetColor(
"FR4 natural", sub_item );
1513 wxBitmapComboBox* picker =
static_cast<wxBitmapComboBox*
>(
m_rowUiItemsList[row].m_ColorCtrl );
1519 picker->SetSelection( ii );
1527 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_EpsilonCtrl );
1536 textCtrl =
dynamic_cast<wxTextCtrl*
>(
m_rowUiItemsList[row].m_LossTgCtrl );
1547 wxString value =
event.GetString();
1574 wxASSERT( st_item );
1590 wxFAIL_MSG( wxT(
"PANEL_SETUP_BOARD_STACKUP::getColorIconItem: unrecognized item type" ) );
1594 wxASSERT_MSG(
color.IsOk(), wxT(
"Invalid color in PCB stackup" ) );
1603 const int bitmap_depth = 24;
1611 st_bitmap->SetBitmap( bmp );
1631 wxEmptyString, wxDefaultPosition,
1632 wxDefaultSize, 0,
nullptr, wxCB_READONLY );
1645 && aStackupItem && aStackupItem->
GetColor().StartsWith( wxT(
"#" ) ) )
1648 curr_color =
COLOR4D( label );
1659 combo->Append( label, layerbmp );
1667 int sel = combo->GetSelection();
1668 combo->SetSelection( combo->GetCount() - 1 );
1670 combo->SetMinSize( wxSize( -1, -1 ) );
1671 wxSize bestSize = combo->GetBestSize();
1674 combo->SetMinSize( bestSize );
1675 combo->SetSelection( sel );
1681 combo->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED,
1685 combo->Bind( wxEVT_COMBOBOX_DROPDOWN,
1686 [combo]( wxCommandEvent& aEvent )
1688 combo->SetString( combo->GetCount() - 1,
_(
"Custom..." ) );
1697 wxNativePixelData data( aBitmap );
1698 wxNativePixelData::Iterator p( data );
1700 for(
int yy = 0; yy < data.GetHeight(); yy++ )
1702 wxNativePixelData::Iterator rowStart = p;
1704 for(
int xx = 0; xx < data.GetWidth(); xx++ )
1706 p.Red() = aColor.Red();
1707 p.Green() = aColor.Green();
1708 p.Blue() = aColor.Blue();
1713 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