diff --git a/pcbnew/board_stackup_manager/board_stackup_reporter.cpp b/pcbnew/board_stackup_manager/board_stackup_reporter.cpp index a7f3fba684..b9cf08fe1c 100644 --- a/pcbnew/board_stackup_manager/board_stackup_reporter.cpp +++ b/pcbnew/board_stackup_manager/board_stackup_reporter.cpp @@ -48,13 +48,13 @@ wxString BuildStackupReport( BOARD_STACKUP& aStackup, EDA_UNITS_T aUnits ) for( const auto item : aStackup.GetList() ) { // Skip stackup items useless for the current board - if( !item->m_Enabled ) + if( !item->IsEnabled() ) { row++; continue; } - txt.Printf( "layer \"%s\" type \"%s\"", item->m_LayerName, item->m_TypeName ); + txt.Printf( "layer \"%s\" type \"%s\"", item->GetLayerName(), item->GetTypeName() ); report << txt; if( item->HasEpsilonRValue() ) @@ -71,23 +71,23 @@ wxString BuildStackupReport( BOARD_STACKUP& aStackup, EDA_UNITS_T aUnits ) if( item->IsMaterialEditable() ) { - txt.Printf( " Material \"%s\"", item->m_Material ); + txt.Printf( " Material \"%s\"", item->GetMaterial() ); report << txt; } - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { - txt.Printf( " \"%s\"", item->m_TypeName ); + txt.Printf( " \"%s\"", item->GetTypeName() ); report << txt; } if( item->IsThicknessEditable() ) { txt.Printf( " Thickness %s", - StringFromValue( aUnits, item->m_Thickness, true, true ) ); + StringFromValue( aUnits, item->GetThickness(), true, true ) ); report << txt; - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC && item->m_ThicknessLocked ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC && item->IsThicknessLocked() ) { txt.Printf( " Locked" ); report << txt; @@ -96,7 +96,7 @@ wxString BuildStackupReport( BOARD_STACKUP& aStackup, EDA_UNITS_T aUnits ) if( item->IsColorEditable() ) { - txt.Printf( " Color \"%s\"", item->m_Color ); + txt.Printf( " Color \"%s\"", item->GetColor() ); report << txt; } row++; diff --git a/pcbnew/board_stackup_manager/class_board_stackup.cpp b/pcbnew/board_stackup_manager/class_board_stackup.cpp index fb41371e00..b1d047aa90 100644 --- a/pcbnew/board_stackup_manager/class_board_stackup.cpp +++ b/pcbnew/board_stackup_manager/class_board_stackup.cpp @@ -31,55 +31,48 @@ BOARD_STACKUP_ITEM::BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM_TYPE aType ) { + DIELECTRIC_PRMS item_prms; + m_DielectricPrmsList.emplace_back( item_prms ); m_LayerId = UNDEFINED_LAYER; m_Type = aType; - m_Enabled = true; - m_DielectricLayerId = 0; - m_EpsilonR = 0; - m_LossTangent = 0.0; - m_ThicknessLocked = false; + SetEnabled( true ); // Initialize parameters to a usual value for allowed types: switch( m_Type ) { case BS_ITEM_TYPE_COPPER: m_TypeName = KEY_COPPER; - m_Thickness = GetCopperDefaultThickness(); + SetThickness( GetCopperDefaultThickness() ); break; case BS_ITEM_TYPE_DIELECTRIC: m_TypeName = KEY_CORE; // or prepreg - m_Material = "FR4"; // or other dielectric name - m_DielectricLayerId = 1; - m_Thickness = 0; // will be set later - m_LossTangent = 0.02; // for FR4 - m_EpsilonR = 4.5; // for FR4 + SetMaterial( "FR4" ); // or other dielectric name + SetDielectricLayerId( 1 ); + SetLossTangent( 0.02 ); // for FR4 + SetEpsilonR( 4.5 ); // for FR4 break; case BS_ITEM_TYPE_SOLDERPASTE: m_TypeName = "solderpaste"; - m_Thickness = 0.0; // Not used break; case BS_ITEM_TYPE_SOLDERMASK: m_TypeName = "soldermask"; m_Color = "Green"; - m_Material = NotSpecifiedPrm(); // or other solder mask material name - m_Thickness = GetMaskDefaultThickness(); - m_EpsilonR = DEFAULT_EPSILON_R_SOLDERMASK; - m_LossTangent = 0.0; + SetMaterial( NotSpecifiedPrm() ); // or other solder mask material name + SetThickness( GetMaskDefaultThickness() ); + SetEpsilonR( DEFAULT_EPSILON_R_SOLDERMASK ); break; case BS_ITEM_TYPE_SILKSCREEN: m_TypeName = "silkscreen"; m_Color = NotSpecifiedPrm(); - m_Material = NotSpecifiedPrm(); // or other silkscreen material name - m_EpsilonR = DEFAULT_EPSILON_R_SILKSCREEN; - m_Thickness = 0.0; // to be specified + SetMaterial( NotSpecifiedPrm() ); // or other silkscreen material name + SetEpsilonR( DEFAULT_EPSILON_R_SILKSCREEN ); break; case BS_ITEM_TYPE_UNDEFINED: - m_Thickness = 0.0; break; } } @@ -89,16 +82,11 @@ BOARD_STACKUP_ITEM::BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM& aOther ) { m_LayerId = aOther.m_LayerId; m_Type = aOther.m_Type; - m_Enabled = aOther.m_Enabled; - m_DielectricLayerId = aOther.m_DielectricLayerId; + m_enabled = aOther.m_enabled; + m_DielectricPrmsList = aOther.m_DielectricPrmsList; m_TypeName = aOther.m_TypeName; m_LayerName = aOther.m_LayerName; - m_Material = aOther.m_Material; - m_Color = aOther.m_Color; - m_Thickness = aOther.m_Thickness; - m_ThicknessLocked = aOther.m_ThicknessLocked; - m_EpsilonR = aOther.m_EpsilonR; - m_LossTangent = aOther.m_LossTangent; + m_Color = aOther.GetColor(); } @@ -115,6 +103,79 @@ int BOARD_STACKUP_ITEM::GetMaskDefaultThickness() return Millimeter2iu( 0.01 ); } +// Getters: +int BOARD_STACKUP_ITEM::GetThickness( int aDielectricSubLayer ) +{ + return m_DielectricPrmsList[aDielectricSubLayer].m_Thickness; +} + + +double BOARD_STACKUP_ITEM::GetLossTangent( int aDielectricSubLayer ) +{ + return m_DielectricPrmsList[aDielectricSubLayer].m_LossTangent; +} + + +double BOARD_STACKUP_ITEM::GetEpsilonR( int aDielectricSubLayer ) +{ + return m_DielectricPrmsList[aDielectricSubLayer].m_EpsilonR; +} + + +bool BOARD_STACKUP_ITEM::IsThicknessLocked( int aDielectricSubLayer ) +{ + return m_DielectricPrmsList[aDielectricSubLayer].m_ThicknessLocked; +} + + +int BOARD_STACKUP_ITEM::GetDielectricLayerId( int aDielectricSubLayer ) +{ + return m_DielectricPrmsList[aDielectricSubLayer].m_DielectricLayerId; +} + + +wxString BOARD_STACKUP_ITEM::GetMaterial( int aDielectricSubLayer ) +{ + return m_DielectricPrmsList[aDielectricSubLayer].m_Material; +} + + +// Setters: +void BOARD_STACKUP_ITEM::SetThickness( int aThickness, int aDielectricSubLayer ) +{ + m_DielectricPrmsList[aDielectricSubLayer].m_Thickness = aThickness; +} + + +void BOARD_STACKUP_ITEM::SetLossTangent( double aTg, int aDielectricSubLayer ) +{ + m_DielectricPrmsList[aDielectricSubLayer].m_LossTangent = aTg; +} + + +void BOARD_STACKUP_ITEM::SetEpsilonR( double aEpsilon, int aDielectricSubLayer ) +{ + m_DielectricPrmsList[aDielectricSubLayer].m_EpsilonR = aEpsilon; +} + + +void BOARD_STACKUP_ITEM::SetThicknessLocked( bool aLocked, int aDielectricSubLayer ) +{ + m_DielectricPrmsList[aDielectricSubLayer].m_ThicknessLocked = aLocked; +} + + +void BOARD_STACKUP_ITEM::SetDielectricLayerId( int aLayerId, int aDielectricSubLayer ) +{ + m_DielectricPrmsList[aDielectricSubLayer].m_DielectricLayerId = aLayerId; +} + + +void BOARD_STACKUP_ITEM::SetMaterial( const wxString& aName, int aDielectricSubLayer ) +{ + m_DielectricPrmsList[aDielectricSubLayer].m_Material = aName; +} + bool BOARD_STACKUP_ITEM::HasEpsilonRValue() { @@ -137,7 +198,7 @@ bool BOARD_STACKUP_ITEM::HasLossTangentValue() bool BOARD_STACKUP_ITEM::HasMaterialValue() { // return true if the material is specified - return IsMaterialEditable() && IsPrmSpecified( m_Material ); + return IsMaterialEditable() && IsPrmSpecified( GetMaterial() ); } @@ -187,7 +248,7 @@ wxString BOARD_STACKUP_ITEM::FormatEpsilonR() { // return a wxString to print/display Epsilon R wxString txt; - txt.Printf( "%.1f", m_EpsilonR ); + txt.Printf( "%.1f", GetEpsilonR() ); return txt; } @@ -196,11 +257,20 @@ wxString BOARD_STACKUP_ITEM::FormatLossTangent() { // return a wxString to print/display Loss Tangent wxString txt; - txt.Printf( "%g", m_LossTangent ); + txt.Printf( "%g", GetLossTangent() ); return txt; } +wxString BOARD_STACKUP_ITEM::FormatDielectricLayerName() +{ + // return a wxString to print/display a dielectriv name + wxString lname; + lname.Printf( _( "Dielectric %d" ), GetDielectricLayerId() ); + + return lname; +} + BOARD_STACKUP::BOARD_STACKUP() { @@ -279,8 +349,8 @@ int BOARD_STACKUP::BuildBoardTicknessFromStackup() const for( auto item : m_list ) { - if( item->IsThicknessEditable() && item->m_Enabled ) - thickness += item->m_Thickness; + if( item->IsThicknessEditable() && item->IsEnabled() ) + thickness += item->GetThickness(); } return thickness; @@ -301,7 +371,7 @@ bool BOARD_STACKUP::SynchronizeWithBoard( BOARD_DESIGN_SETTINGS* aSettings ) for( BOARD_STACKUP_ITEM* item: stackup.GetList() ) { - if( item->m_LayerId == old_item->m_LayerId ) + if( item->GetBrdLayerId() == old_item->GetBrdLayerId() ) { found = true; break; @@ -322,9 +392,9 @@ bool BOARD_STACKUP::SynchronizeWithBoard( BOARD_DESIGN_SETTINGS* aSettings ) // Search for initial settings: for( BOARD_STACKUP_ITEM* initial_item: m_list ) { - if( item->m_LayerId != UNDEFINED_LAYER ) + if( item->GetBrdLayerId() != UNDEFINED_LAYER ) { - if( item->m_LayerId == initial_item->m_LayerId ) + if( item->GetBrdLayerId() == initial_item->GetBrdLayerId() ) { *item = *initial_item; found = true; @@ -333,7 +403,7 @@ bool BOARD_STACKUP::SynchronizeWithBoard( BOARD_DESIGN_SETTINGS* aSettings ) } else // dielectric layer: see m_DielectricLayerId for identification { - if( item->m_DielectricLayerId == initial_item->m_DielectricLayerId ) + if( item->GetDielectricLayerId() == initial_item->GetDielectricLayerId() ) { *item = *initial_item; found = true; @@ -393,24 +463,24 @@ void BOARD_STACKUP::BuildDefaultStackupList( BOARD_DESIGN_SETTINGS* aSettings, if( enabledLayer[F_SilkS] ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SILKSCREEN ); - item->m_LayerId = F_SilkS; - item->m_TypeName = _HKI( "Top Silk Screen" ); + item->SetBrdLayerId( F_SilkS ); + item->SetTypeName( _HKI( "Top Silk Screen" ) ); Add( item ); } if( enabledLayer[F_Paste] ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERPASTE ); - item->m_LayerId = F_Paste; - item->m_TypeName = _HKI( "Top Solder Paste" ); + item->SetBrdLayerId( F_Paste ); + item->SetTypeName( _HKI( "Top Solder Paste" ) ); Add( item ); } if( enabledLayer[F_Mask] ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERMASK ); - item->m_LayerId = F_Mask; - item->m_TypeName = _HKI( "Top Solder Mask" ); + item->SetBrdLayerId( F_Mask ); + item->SetTypeName( _HKI( "Top Solder Mask" ) ); Add( item ); } @@ -418,31 +488,31 @@ void BOARD_STACKUP::BuildDefaultStackupList( BOARD_DESIGN_SETTINGS* aSettings, for( int ii = 0; ii < copperLayerCount; ii++ ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_COPPER ); - item->m_LayerId = ( PCB_LAYER_ID )ii; - item->m_TypeName = KEY_COPPER; + item->SetBrdLayerId( ( PCB_LAYER_ID )ii ); + item->SetTypeName( KEY_COPPER ); Add( item ); if( ii == copperLayerCount-1 ) { - item->m_LayerId = B_Cu; + item->SetBrdLayerId( B_Cu ); break; } // Add the dielectric layer: item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_DIELECTRIC ); - item->m_Thickness = diel_thickness; - item->m_DielectricLayerId = dielectric_idx + 1; + item->SetThickness( diel_thickness ); + item->SetDielectricLayerId( dielectric_idx + 1 ); // Display a dielectric default layer name: if( (dielectric_idx & 1) == 0 ) { - item->m_TypeName = KEY_CORE; - item->m_Material = "FR4"; + item->SetTypeName( KEY_CORE ); + item->SetMaterial( "FR4" ); } else { - item->m_TypeName = KEY_PREPREG; - item->m_Material = "FR4"; + item->SetTypeName( KEY_PREPREG ); + item->SetMaterial( "FR4" ); } Add( item ); @@ -453,24 +523,24 @@ void BOARD_STACKUP::BuildDefaultStackupList( BOARD_DESIGN_SETTINGS* aSettings, if( enabledLayer[B_Mask] ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERMASK ); - item->m_LayerId = B_Mask; - item->m_TypeName = _HKI( "Bottom Solder Mask" ); + item->SetBrdLayerId( B_Mask ); + item->SetTypeName( _HKI( "Bottom Solder Mask" ) ); Add( item ); } if( enabledLayer[B_Paste] ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERPASTE ); - item->m_LayerId = B_Paste; - item->m_TypeName = _HKI( "Bottom Solder Paste" ); + item->SetBrdLayerId( B_Paste ); + item->SetTypeName( _HKI( "Bottom Solder Paste" ) ); Add( item ); } if( enabledLayer[B_SilkS] ) { BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SILKSCREEN ); - item->m_LayerId = B_SilkS; - item->m_TypeName = _HKI( "Bottom Silk Screen" ); + item->SetBrdLayerId( B_SilkS ); + item->SetTypeName( _HKI( "Bottom Silk Screen" ) ); Add( item ); } @@ -505,41 +575,41 @@ void BOARD_STACKUP::FormatBoardStackup( OUTPUTFORMATTER* aFormatter, { wxString layer_name; - if( item->m_LayerId == UNDEFINED_LAYER ) + if( item->GetBrdLayerId() == UNDEFINED_LAYER ) { - layer_name.Printf( "dielectric %d", item->m_DielectricLayerId ); + layer_name.Printf( "dielectric %d", item->GetDielectricLayerId() ); } else - layer_name = aBoard->GetLayerName( item->m_LayerId ); + layer_name = aBoard->GetLayerName( item->GetBrdLayerId() ); aFormatter->Print( nest_level, "(layer %s (type %s)", aFormatter->Quotew( layer_name ).c_str(), - aFormatter->Quotew( item->m_TypeName ).c_str() ); + aFormatter->Quotew( item->GetTypeName() ).c_str() ); if( item->IsThicknessEditable() ) { - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC && item->m_ThicknessLocked ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC && item->IsThicknessLocked() ) aFormatter->Print( 0, " (thickness %s locked)", - FormatInternalUnits( (int)item->m_Thickness ).c_str() ); + FormatInternalUnits( item->GetThickness() ).c_str() ); else aFormatter->Print( 0, " (thickness %s)", - FormatInternalUnits( (int)item->m_Thickness ).c_str() ); + FormatInternalUnits( item->GetThickness() ).c_str() ); } if( item->HasMaterialValue() ) aFormatter->Print( 0, " (material %s)", - aFormatter->Quotew( item->m_Material ).c_str() ); + aFormatter->Quotew( item->GetMaterial() ).c_str() ); if( item->HasEpsilonRValue() && item->HasMaterialValue() ) - aFormatter->Print( 0, " (epsilon_r %g)", item->m_EpsilonR ); + aFormatter->Print( 0, " (epsilon_r %g)", item->GetEpsilonR() ); if( item->HasLossTangentValue() && item->HasMaterialValue() ) aFormatter->Print( 0, " (loss_tangent %s)", - Double2Str(item->m_LossTangent ).c_str() ); + Double2Str(item->GetLossTangent() ).c_str() ); - if( item->IsColorEditable() && IsPrmSpecified( item->m_Color ) ) + if( item->IsColorEditable() && IsPrmSpecified( item->GetColor() ) ) aFormatter->Print( 0, " (color %s)", - aFormatter->Quotew( item->m_Color ).c_str() ); + aFormatter->Quotew( item->GetColor() ).c_str() ); aFormatter->Print( 0, ")\n" ); } diff --git a/pcbnew/board_stackup_manager/class_board_stackup.h b/pcbnew/board_stackup_manager/class_board_stackup.h index 97e124cf58..b93f3dfc41 100644 --- a/pcbnew/board_stackup_manager/class_board_stackup.h +++ b/pcbnew/board_stackup_manager/class_board_stackup.h @@ -56,6 +56,33 @@ enum BS_EDGE_CONNECTOR_CONSTRAINTS BS_EDGE_CONNECTOR_BEVELLED // Some connector in board, and the connector must be bevelled }; + +/** + * A helper class to manage a dielectric parameters + */ +class DIELECTRIC_PRMS +{ + friend class BOARD_STACKUP_ITEM; + +private: + int m_DielectricLayerId;/// the "layer" id for dielectric layers, + /// from 1 (top) to 31 (bottom) + wxString m_Material; /// type of material (for dielectric and solder mask) + int m_Thickness; /// the physical layer thickness in internal units + bool m_ThicknessLocked; /// true for dielectric layers with a fixed thickness + /// (for impendace controled purposes), unused for other layers + double m_EpsilonR; /// For dielectric (and solder mask) the dielectric constant + double m_LossTangent; /// For dielectric (and solder mask) the dielectric loss + +public: + DIELECTRIC_PRMS() : + m_DielectricLayerId(-1), + m_Thickness(0), m_ThicknessLocked( false ), + m_EpsilonR( 1.0 ), m_LossTangent( 0.0 ) + {} +}; + + /** * this class manage one layer needed to make a physical board * it can be a solder mask, silk screen, copper or a dielectric @@ -66,24 +93,25 @@ public: BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM_TYPE aType ); BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM& aOther ); + +private: BOARD_STACKUP_ITEM_TYPE m_Type; - bool m_Enabled; /// true if this stackup item must be taken in account, - /// false to ignore it. Mainly used in dialog stackup editor. wxString m_LayerName; /// name of layer as shown in layer manager. Usefull to create reports wxString m_TypeName; /// type name of layer (copper, silk screen, core, prepreg ...) - wxString m_Material; /// type of material (has meaning only for dielectric and solder mask) - int m_DielectricLayerId;/// the "layer" id for dielectric layers, - /// from 1 (top) to 31 (bottom) wxString m_Color; /// mainly for silkscreen and solder mask - int m_Thickness; /// the physical layer thickness in internal units - bool m_ThicknessLocked; /// true for dielectric layers with a fixed thickness - /// (for impendace controled purposes), unused for other layers - double m_EpsilonR; /// For dielectric (and solder mask) the dielectric constant - double m_LossTangent; /// For dielectric (and solder mask) the dielectric loss PCB_LAYER_ID m_LayerId; /// the layer id (F.Cu to B.Cu, F.Silk, B.silk, F.Mask, B.Mask) /// and UNDEFINED_LAYER (-1) for dielectic layers that are not /// really layers for the board editor + /// List of dielectric parameters + /// usually only one item, but in complex (microwave) boards, one can have + /// more than one dielectic layer between 2 copper layers, and therfore + /// more than one item in list + std::vector m_DielectricPrmsList; + bool m_enabled; /// true if this stackup item must be taken in account, + /// false to ignore it. Mainly used in dialog stackup editor. + +public: /// @return true if the layer has a meaningfull Epsilon R parameter /// namely dielectric layers: dielectric and solder mask bool HasEpsilonRValue(); @@ -115,6 +143,39 @@ public: /// @return a wxString to print/display Loss Tangent wxString FormatLossTangent(); + + /// @return a wxString to print/display a dielectric name + wxString FormatDielectricLayerName(); + + // Getters: + bool IsEnabled() {return m_enabled; } + + BOARD_STACKUP_ITEM_TYPE GetType() { return m_Type; } + PCB_LAYER_ID GetBrdLayerId() { return m_LayerId; } + wxString GetColor(){ return m_Color; } + wxString GetLayerName() { return m_LayerName; } + wxString GetTypeName() { return m_TypeName; } + + int GetThickness( int aDielectricSubLayer = 0 ); + bool IsThicknessLocked( int aDielectricSubLayer = 0 ); + double GetEpsilonR( int aDielectricSubLayer = 0 ); + double GetLossTangent( int aDielectricSubLayer = 0 ); + int GetDielectricLayerId( int aDielectricSubLayer = 0 ); + wxString GetMaterial( int aDielectricSubLayer = 0 ); + + // Setters: + void SetEnabled( bool aEnable) { m_enabled = aEnable; } + void SetBrdLayerId( PCB_LAYER_ID aBrdLayerId ) { m_LayerId = aBrdLayerId; } + void SetColor( const wxString& aColorName ){ m_Color = aColorName; } + void SetLayerName( const wxString& aName ) { m_LayerName = aName; } + void SetTypeName( const wxString& aName ) { m_TypeName = aName; } + + void SetThickness( int aThickness, int aDielectricSubLayer = 0 ); + void SetThicknessLocked( bool aLocked, int aDielectricSubLayer = 0 ); + void SetEpsilonR( double aEpsilon, int aDielectricSubLayer = 0 ); + void SetLossTangent( double aTg, int aDielectricSubLayer = 0 ); + void SetDielectricLayerId( int aLayerId, int aDielectricSubLayer = 0 ); + void SetMaterial( const wxString& aName, int aDielectricSubLayer = 0 ); }; diff --git a/pcbnew/board_stackup_manager/panel_board_stackup.cpp b/pcbnew/board_stackup_manager/panel_board_stackup.cpp index 67975c3b16..079690eb4b 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup.cpp +++ b/pcbnew/board_stackup_manager/panel_board_stackup.cpp @@ -102,6 +102,10 @@ PANEL_SETUP_BOARD_STACKUP::PANEL_SETUP_BOARD_STACKUP( PAGED_DIALOG* aParent, PCB buildLayerStackPanel(); synchronizeWithBoard( true ); + + // Currently: disable not yet usable buttons: + m_buttonAddDielectricLayer->Hide(); + m_buttonRemoveDielectricLayer->Hide(); } @@ -140,6 +144,98 @@ void PANEL_SETUP_BOARD_STACKUP::disconnectEvents() } +void PANEL_SETUP_BOARD_STACKUP::onAddDielectricLayer( wxCommandEvent& event ) +{ + // Build Dielectric layers list: + wxArrayString d_list; + + for( BOARD_STACKUP_ROW_UI_ITEM& item : m_rowUiItemsList ) + { + if( !item.m_isEnabled ) + continue; + + if( item.m_Item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) + d_list.Add( item.m_LayerName->GetLabel() ); + } + + // Show list + int index = wxGetSingleChoiceIndex( wxEmptyString, _("Dielectric Layers List"), + d_list); + + if( index < 0 ) + return; +} + + +void PANEL_SETUP_BOARD_STACKUP::onRemoveDielectricLayer( wxCommandEvent& event ) +{ + // Build deletable Dielectric layers list. + // A lyer can be deleted if there are 2 (or more) dielectric layers + // between 2 copper layers + wxArrayString d_list; + wxString previousD_Layer; + int dielectric_layer_count = 0; + + for( auto item : m_stackup.GetList() ) + { + if( !item->IsEnabled() ) + continue; + + if( item->GetType() == BS_ITEM_TYPE_COPPER ) + dielectric_layer_count = 0; + else if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) + { + dielectric_layer_count++; + + if( dielectric_layer_count == 1 ) + previousD_Layer = item->FormatDielectricLayerName(); + + if( dielectric_layer_count == 2 ) + d_list.Add( previousD_Layer ); + + if( dielectric_layer_count >= 2 ) + d_list.Add( item->FormatDielectricLayerName() ); + } + } + + // Show list + int index = wxGetSingleChoiceIndex( wxEmptyString, _("Dielectric Layers List"), + d_list); + + if( index < 0 ) + return; +} + + +void PANEL_SETUP_BOARD_STACKUP::onRemoveDielUI( wxUpdateUIEvent& event ) +{ + // The m_buttonRemoveDielectricLayer wxButton is enabled only if a dielectric + // layer can be removed, i.e. if 2 (or more) dielectric layers are found + // between 3 copper layers + int dielectric_layer_count = 0; + + for( auto item : m_stackup.GetList() ) + { + if( !item->IsEnabled() ) + continue; + + if( item->GetType() == BS_ITEM_TYPE_COPPER ) + dielectric_layer_count = 0; + + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) + dielectric_layer_count++; + + if( dielectric_layer_count >= 2 ) + { + m_buttonRemoveDielectricLayer->Enable( true ); + return; + } + } + + m_buttonRemoveDielectricLayer->Enable( false ); +} + + void PANEL_SETUP_BOARD_STACKUP::onExportToClipboard( wxCommandEvent& event ) { if( !transferDataFromUIToStackup() ) @@ -178,8 +274,8 @@ void PANEL_SETUP_BOARD_STACKUP::onUpdateThicknessValue( wxUpdateUIEvent& event ) for( auto item : m_stackup.GetList() ) { - if( item->IsThicknessEditable() && item->m_Enabled ) - thickness += item->m_Thickness; + if( item->IsThicknessEditable() && item->IsEnabled() ) + thickness += item->GetThickness(); } m_tcCTValue->SetValue( StringFromValue( m_units, thickness, true, true ) ); @@ -239,16 +335,16 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) // test for existing stackup items in board: for( BOARD_STACKUP_ITEM* brd_item : brd_stackup.GetList() ) { - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { // Compare only BS_ITEM_TYPE_DIELECTRIC items - if( brd_item->m_Type != BS_ITEM_TYPE_DIELECTRIC ) + if( brd_item->GetType() != BS_ITEM_TYPE_DIELECTRIC ) continue; - if( item->m_DielectricLayerId == brd_item->m_DielectricLayerId ) + if( item->GetDielectricLayerId() == brd_item->GetDielectricLayerId() ) brd_stack_item = brd_item; } - else if( item->m_LayerId == brd_item->m_LayerId ) + else if( item->GetBrdLayerId() == brd_item->GetBrdLayerId() ) brd_stack_item = brd_item; if( brd_stack_item ) @@ -267,8 +363,8 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) if( matName ) { - if( IsPrmSpecified( item->m_Material ) ) - matName->SetValue( item->m_Material ); + if( IsPrmSpecified( item->GetMaterial() ) ) + matName->SetValue( item->GetMaterial() ); else matName->SetValue( wxGetTranslation( NotSpecifiedPrm() ) ); } @@ -279,14 +375,14 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) wxTextCtrl* textCtrl = dynamic_cast( ui_row_item.m_ThicknessCtrl ); if( textCtrl ) - textCtrl->SetValue( StringFromValue( m_units, item->m_Thickness, true, true ) ); + textCtrl->SetValue( StringFromValue( m_units, item->GetThickness(), true, true ) ); - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { wxCheckBox* cb_box = dynamic_cast ( ui_row_item.m_ThicknessLockCtrl ); if( cb_box ) - cb_box->SetValue( item->m_ThicknessLocked ); + cb_box->SetValue( item->IsThicknessLocked() ); } } @@ -295,9 +391,9 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) auto bm_combo = dynamic_cast( ui_row_item.m_ColorCtrl ); int color_idx = 0; - if( item->m_Color.StartsWith( "#" ) ) // User defined color + if( item->GetColor().StartsWith( "#" ) ) // User defined color { - wxColour color( item->m_Color ); + wxColour color( item->GetColor() ); m_UserColors[row] = color; color_idx = GetColorUserDefinedListIdx(); @@ -315,7 +411,7 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) for( int ii = 0; ii < GetColorStandardListCount(); ii++ ) { - if( color_list[ii].m_ColorName == item->m_Color ) + if( color_list[ii].m_ColorName == item->GetColor() ) { color_idx = ii; break; @@ -330,7 +426,7 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) if( item->HasEpsilonRValue() ) { wxString txt; - txt.Printf( "%.1f", item->m_EpsilonR ); + txt.Printf( "%.1f", item->GetEpsilonR() ); wxTextCtrl* textCtrl = dynamic_cast( ui_row_item.m_EpsilonCtrl ); if( textCtrl ) @@ -340,7 +436,7 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) if( item->HasLossTangentValue() ) { wxString txt; - txt.Printf( "%g", item->m_LossTangent ); + txt.Printf( "%g", item->GetLossTangent() ); wxTextCtrl* textCtrl = dynamic_cast( ui_row_item.m_LossTgCtrl ); if( textCtrl ) @@ -351,13 +447,13 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync ) // Now enable/disable stackup items, according to the m_enabledLayers config bool show_item; - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) // the m_DielectricLayerId is not a copper layer id, it is a dielectric idx from 1 - show_item = item->m_DielectricLayerId < copperLayersCount; + show_item = item->GetDielectricLayerId() < copperLayersCount; else - show_item = m_enabledLayers[item->m_LayerId]; + show_item = m_enabledLayers[item->GetBrdLayerId()]; - item->m_Enabled = show_item; + item->SetEnabled( show_item ); ui_row_item.m_isEnabled = show_item; @@ -440,9 +536,9 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() const FAB_LAYER_COLOR* color_list = GetColorStandardList(); - for( auto item : m_stackup.GetList() ) + for( BOARD_STACKUP_ITEM* item : m_stackup.GetList() ) { - BOARD_STACKUP_ROW_UI_ITEM ui_row_item; + BOARD_STACKUP_ROW_UI_ITEM ui_row_item( item ); bool show_item = true;//false; ui_row_item.m_isEnabled = true; @@ -456,35 +552,34 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() m_fgGridSizer->Add( bitmap, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT ); ui_row_item.m_Icon = bitmap; - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { - wxString lname; - lname.Printf( _( "Dielectric %d" ), item->m_DielectricLayerId ); + wxString lname = item->FormatDielectricLayerName(); wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, lname ); m_fgGridSizer->Add( st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 ); ui_row_item.m_LayerName = st_text; wxChoice* choice = new wxChoice( m_scGridWin, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_core_prepreg_choice ); - choice->SetSelection( item->m_TypeName == KEY_CORE ? 0 : 1 ); + choice->SetSelection( item->GetTypeName() == KEY_CORE ? 0 : 1 ); m_fgGridSizer->Add( choice, 0, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 ); ui_row_item.m_LayerTypeCtrl = choice; } else { - item->m_LayerName = m_board->GetLayerName( item->m_LayerId ); - wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, item->m_LayerName ); + item->GetLayerName() = m_board->GetLayerName( item->GetBrdLayerId() ); + wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, item->GetLayerName() ); m_fgGridSizer->Add( st_text, 0, wxALL|wxALIGN_CENTER_VERTICAL, 1 ); st_text->Show( show_item ); ui_row_item.m_LayerName = st_text; wxString lname; - if( item->m_TypeName == KEY_COPPER ) + if( item->GetTypeName() == KEY_COPPER ) lname = _( "Copper" ); else - lname = wxGetTranslation( item->m_TypeName ); + lname = wxGetTranslation( item->GetTypeName() ); st_text = new wxStaticText( m_scGridWin, wxID_ANY, lname ); m_fgGridSizer->Add( st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 ); @@ -493,7 +588,8 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() if( item->IsMaterialEditable() ) { - addMaterialChooser( ID_ITEM_MATERIAL+row, &item->m_Material, ui_row_item ); + wxString matName = item->GetMaterial(); + addMaterialChooser( ID_ITEM_MATERIAL+row, &matName, ui_row_item ); } else { @@ -504,7 +600,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() { wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, ID_ITEM_THICKNESS+row ); textCtrl->SetMinSize( m_numericTextCtrlSize ); - textCtrl->SetValue( StringFromValue( m_units, item->m_Thickness, true, true ) ); + textCtrl->SetValue( StringFromValue( m_units, item->GetThickness(), true, true ) ); m_fgGridSizer->Add( textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 ); m_controlItemsList.push_back( textCtrl ); textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, @@ -512,11 +608,11 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() NULL, this ); ui_row_item.m_ThicknessCtrl = textCtrl; - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { wxCheckBox* cb_box = new wxCheckBox( m_scGridWin, ID_ITEM_THICKNESS_LOCKED+row, wxEmptyString ); - cb_box->SetValue( item->m_ThicknessLocked ); + cb_box->SetValue( item->IsThicknessLocked() ); m_fgGridSizer->Add( cb_box, 0, wxALIGN_CENTER_VERTICAL, 2 ); ui_row_item.m_ThicknessLockCtrl = cb_box; } @@ -535,9 +631,9 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() { int color_idx = 0; - if( item->m_Color.StartsWith( "#" ) ) // User defined color + if( item->GetColor().StartsWith( "#" ) ) // User defined color { - wxColour color( item->m_Color ); + wxColour color( item->GetColor() ); m_UserColors[row] = color; color_idx = GetColorUserDefinedListIdx(); } @@ -545,7 +641,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() { for( int ii = 0; ii < GetColorStandardListCount(); ii++ ) { - if( color_list[ii].m_ColorName == item->m_Color ) + if( color_list[ii].m_ColorName == item->GetColor() ) { color_idx = ii; break; @@ -568,7 +664,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() if( item->HasEpsilonRValue() ) { wxString txt; - txt.Printf( "%.1f", item->m_EpsilonR ); + txt.Printf( "%.1f", item->GetEpsilonR() ); wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, wxID_ANY, wxEmptyString, wxDefaultPosition, m_numericFieldsSize ); textCtrl->SetValue( txt ); @@ -583,7 +679,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel() if( item->HasLossTangentValue() ) { wxString txt; - txt.Printf( "%g", item->m_LossTangent ); + txt.Printf( "%g", item->GetLossTangent() ); wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, wxID_ANY, wxEmptyString, wxDefaultPosition, m_numericFieldsSize ); textCtrl->SetValue( txt ); @@ -635,11 +731,11 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() for( auto item : m_stackup.GetList() ) { - if( item->IsThicknessEditable() && item->m_Enabled ) + if( item->IsThicknessEditable() && item->IsEnabled() ) { - stackup_thickness += item->m_Thickness; + stackup_thickness += item->GetThickness(); - if( item->m_Thickness < 0 ) + if( item->GetThickness() < 0 ) thickness_error = true; } } @@ -680,13 +776,13 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() for( auto item : m_stackup.GetList() ) { // Skip stackup items useless for the current board - if( !item->m_Enabled ) + if( !item->IsEnabled() ) { row++; continue; } - item->m_LayerName = m_rowUiItemsList[row].m_LayerName->GetLabel(); + item->SetLayerName( m_rowUiItemsList[row].m_LayerName->GetLabel() ); if( item->HasEpsilonRValue() ) { @@ -694,9 +790,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() txt = textCtrl->GetValue(); if( txt.ToDouble( &value ) && value >= 0.0 ) - item->m_EpsilonR = value; + item->SetEpsilonR( value ); else if( txt.ToCDouble( &value ) && value >= 0.0 ) - item->m_EpsilonR = value; + item->SetEpsilonR( value ); else { success = false; @@ -710,9 +806,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() txt = textCtrl->GetValue(); if( txt.ToDouble( &value ) && value >= 0.0 ) - item->m_LossTangent = value; + item->SetLossTangent( value ); else if( txt.ToCDouble( &value ) && value >= 0.0 ) - item->m_LossTangent = value; + item->SetLossTangent( value ); else { success = false; @@ -725,15 +821,15 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() if( item->IsMaterialEditable() ) { wxTextCtrl* textCtrl = static_cast( m_rowUiItemsList[row].m_MaterialCtrl ); - item->m_Material = textCtrl->GetValue(); + item->SetMaterial( textCtrl->GetValue() ); // Ensure the not specified mat name is the keyword, not its translation // to avoid any issue is the language setting changes - if( !IsPrmSpecified( item->m_Material ) ) - item->m_Material = NotSpecifiedPrm(); + if( !IsPrmSpecified( item->GetMaterial() ) ) + item->SetMaterial( NotSpecifiedPrm() ); } - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { // Choice is Core or Prepreg: wxChoice* choice = static_cast( m_rowUiItemsList[row].m_LayerTypeCtrl ); @@ -741,9 +837,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() int idx = choice->GetSelection(); if( idx == 0 ) - item->m_TypeName = KEY_CORE; + item->SetTypeName( KEY_CORE ); else - item->m_TypeName = KEY_PREPREG; + item->SetTypeName( KEY_PREPREG ); } if( item->IsThicknessEditable() ) @@ -751,14 +847,14 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() wxTextCtrl* textCtrl = static_cast( m_rowUiItemsList[row].m_ThicknessCtrl ); txt = textCtrl->GetValue(); - item->m_Thickness = ValueFromString( m_frame->GetUserUnits(), txt, true ); + item->SetThickness( ValueFromString( m_frame->GetUserUnits(), txt, true ) ); - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { // Dielectric thickness layer can have a locked thickness: wxCheckBox* cb_box = static_cast ( m_rowUiItemsList[row].m_ThicknessLockCtrl ); - item->m_ThicknessLocked = cb_box && cb_box->GetValue(); + item->SetThicknessLocked( cb_box && cb_box->GetValue() ); } } @@ -770,9 +866,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup() int idx = choice->GetSelection(); if( idx == GetColorUserDefinedListIdx() ) - item->m_Color = m_UserColors[row].GetAsString( wxC2S_HTML_SYNTAX ); + item->SetColor( m_UserColors[row].GetAsString( wxC2S_HTML_SYNTAX ) ); else - item->m_Color = color_list[idx].m_ColorName; + item->SetColor( color_list[idx].m_ColorName ); } row++; } @@ -813,7 +909,7 @@ bool PANEL_SETUP_BOARD_STACKUP::TransferDataFromWindow() for( auto item : m_stackup.GetList() ) { - if( item->m_Enabled ) + if( item->IsEnabled() ) brd_stackup.Add( new BOARD_STACKUP_ITEM( *item ) ); } @@ -872,13 +968,13 @@ void PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness( wxCommandEvent& int row = 0; for( auto item : m_stackup.GetList() ) { - if( !item->IsThicknessEditable() || !item->m_Enabled ) + if( !item->IsThicknessEditable() || !item->IsEnabled() ) { row++; continue; } - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { wxCheckBox* checkBox = static_cast( m_rowUiItemsList[row].m_ThicknessLockCtrl ); @@ -891,12 +987,12 @@ void PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness( wxCommandEvent& { fixed_thickness_cnt++; - if( item->m_Thickness < 0 ) + if( item->GetThickness() < 0 ) thickness_error = true; } } - thickness += item->m_Thickness; + thickness += item->GetThickness(); row++; } @@ -936,15 +1032,15 @@ void PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness( wxCommandEvent& row = 0; for( auto item : m_stackup.GetList() ) { - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC && item->m_Enabled ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC && item->IsEnabled() ) { wxCheckBox* checkBox = static_cast( m_rowUiItemsList[row].m_ThicknessLockCtrl ); if( !checkBox->GetValue() ) // Not locked thickness: can be modified { - item->m_Thickness = dielectric_thickness; + item->SetThickness( dielectric_thickness ); wxTextCtrl* textCtrl = static_cast( m_rowUiItemsList[row].m_ThicknessCtrl ); - textCtrl->SetValue( StringFromValue( m_units, item->m_Thickness, true, true ) ); + textCtrl->SetValue( StringFromValue( m_units, item->GetThickness(), true, true ) ); } } @@ -995,27 +1091,27 @@ void PANEL_SETUP_BOARD_STACKUP::onMaterialChange( wxCommandEvent& event ) { DIELECTRIC_SUBSTRATE_LIST* mat_list = nullptr; - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) mat_list = &m_delectricMatList; - else if( item->m_Type == BS_ITEM_TYPE_SOLDERMASK ) + else if( item->GetType() == BS_ITEM_TYPE_SOLDERMASK ) mat_list = &m_solderMaskMatList; - else if( item->m_Type == BS_ITEM_TYPE_SILKSCREEN ) + else if( item->GetType() == BS_ITEM_TYPE_SILKSCREEN ) mat_list = &m_silkscreenMatList; else continue; - int idx = mat_list->FindSubstrate( item->m_Material, - item->m_EpsilonR, - item->m_LossTangent ); + int idx = mat_list->FindSubstrate( item->GetMaterial(), + item->GetEpsilonR(), + item->GetLossTangent() ); - if( idx < 0 && !item->m_Material.IsEmpty() ) + if( idx < 0 && !item->GetMaterial().IsEmpty() ) { // This material is not in list: add it DIELECTRIC_SUBSTRATE new_mat; - new_mat.m_Name = item->m_Material; - new_mat.m_EpsilonR = item->m_EpsilonR; - new_mat.m_LossTangent = item->m_LossTangent; + new_mat.m_Name = item->GetMaterial(); + new_mat.m_EpsilonR = item->GetEpsilonR(); + new_mat.m_LossTangent = item->GetLossTangent(); mat_list->AppendSubstrate( new_mat ); } } @@ -1024,7 +1120,7 @@ void PANEL_SETUP_BOARD_STACKUP::onMaterialChange( wxCommandEvent& event ) BOARD_STACKUP_ITEM* item = GetStackupItem( row ); DIELECTRIC_SUBSTRATE_LIST* item_mat_list = nullptr; - switch( item->m_Type ) + switch( item->GetType() ) { case BS_ITEM_TYPE_DIELECTRIC: item_mat_list = &m_delectricMatList; @@ -1054,13 +1150,13 @@ void PANEL_SETUP_BOARD_STACKUP::onMaterialChange( wxCommandEvent& event ) return; // Update Name, Epsilon R and Loss tg - item->m_Material = substrate.m_Name; - item->m_EpsilonR = substrate.m_EpsilonR; - item->m_LossTangent = substrate.m_LossTangent; + item->SetMaterial( substrate.m_Name ); + item->SetEpsilonR( substrate.m_EpsilonR ); + item->SetLossTangent( substrate.m_LossTangent ); wxTextCtrl* textCtrl; textCtrl = static_cast( m_rowUiItemsList[row].m_MaterialCtrl ); - textCtrl->SetValue( item->m_Material ); + textCtrl->SetValue( item->GetMaterial() ); // some layers have a material choice but not EpsilonR ctrl if( item->HasEpsilonRValue() ) @@ -1088,7 +1184,7 @@ void PANEL_SETUP_BOARD_STACKUP::onThicknessChange( wxCommandEvent& event ) wxString value = event.GetString(); BOARD_STACKUP_ITEM* item = GetStackupItem( row ); - item->m_Thickness = ValueFromString( m_frame->GetUserUnits(), value, true ); + item->SetThickness( ValueFromString( m_frame->GetUserUnits(), value, true ) ); } @@ -1103,7 +1199,7 @@ wxColor PANEL_SETUP_BOARD_STACKUP::getColorIconItem( int aRow ) BOARD_STACKUP_ITEM* layer = GetStackupItem( aRow ); wxColor color; - switch( layer->m_Type ) + switch( layer->GetType() ) { case BS_ITEM_TYPE_COPPER: color = copperColor; @@ -1176,10 +1272,10 @@ wxBitmapComboBox* PANEL_SETUP_BOARD_STACKUP::createBmComboBox( BOARD_STACKUP_ITE label = wxGetTranslation( item.m_ColorName ); else // Append the user color, if specified, else add a default user color { - if( aStackupItem && aStackupItem->m_Color.StartsWith( "#" ) ) + if( aStackupItem && aStackupItem->GetColor().StartsWith( "#" ) ) { - curr_color = wxColour( aStackupItem->m_Color ); - label = aStackupItem->m_Color; + curr_color = wxColour( aStackupItem->GetColor() ); + label = aStackupItem->GetColor(); } else label = curr_color.GetAsString( wxC2S_HTML_SYNTAX ); diff --git a/pcbnew/board_stackup_manager/panel_board_stackup.h b/pcbnew/board_stackup_manager/panel_board_stackup.h index abc675c1de..b5ede324b1 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup.h +++ b/pcbnew/board_stackup_manager/panel_board_stackup.h @@ -48,6 +48,7 @@ class PANEL_SETUP_LAYERS; // row by row struct BOARD_STACKUP_ROW_UI_ITEM { + BOARD_STACKUP_ITEM* m_Item; // The BOARD_STACKUP_ITEM managed by this BOARD_STACKUP_ROW_UI_ITEM bool m_isEnabled; // True if the row is in board // false if not (this row is not shown on the panel) wxStaticBitmap* m_Icon; // Color icon in first column (column 1) @@ -61,7 +62,8 @@ struct BOARD_STACKUP_ROW_UI_ITEM wxControl* m_EpsilonCtrl; // control shown in column 8 wxControl* m_LossTgCtrl; // control shown in column 9 - BOARD_STACKUP_ROW_UI_ITEM() : + BOARD_STACKUP_ROW_UI_ITEM( BOARD_STACKUP_ITEM* aItem ) : + m_Item( aItem ), m_isEnabled( true ), m_Icon( nullptr ), m_LayerName( nullptr ), m_LayerTypeCtrl( nullptr ), m_MaterialCtrl( nullptr ),m_MaterialButt( nullptr ), @@ -141,13 +143,16 @@ private: */ bool transferDataFromUIToStackup(); - void onUpdateThicknessValue( wxUpdateUIEvent& event ) override; - void onCalculateDielectricThickness( wxCommandEvent& event ) override; + void onUpdateThicknessValue( wxUpdateUIEvent& event ) override; + void onCalculateDielectricThickness( wxCommandEvent& event ) override; void onColorSelected( wxCommandEvent& event ); - void onMaterialChange( wxCommandEvent& event ); - void onThicknessChange( wxCommandEvent& event ); - void onExportToClipboard( wxCommandEvent& event ) override; + void onMaterialChange( wxCommandEvent& event ); + void onThicknessChange( wxCommandEvent& event ); + void onExportToClipboard( wxCommandEvent& event ) override; + void onAddDielectricLayer( wxCommandEvent& event ) override; + void onRemoveDielectricLayer( wxCommandEvent& event ) override; + void onRemoveDielUI( wxUpdateUIEvent& event ) override; /** Update the icons color (swatches in first grid column) * @param aRow is the row (index in m_rowUiItemsList) that manages the icon to update. diff --git a/pcbnew/board_stackup_manager/panel_board_stackup_base.cpp b/pcbnew/board_stackup_manager/panel_board_stackup_base.cpp index e3e3e96d86..97829631e5 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup_base.cpp +++ b/pcbnew/board_stackup_manager/panel_board_stackup_base.cpp @@ -130,11 +130,20 @@ PANEL_SETUP_BOARD_STACKUP_BASE::PANEL_SETUP_BOARD_STACKUP_BASE( wxWindow* parent bSizerRight->Add( m_rbDielectricConstraint, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonAddDielectricLayer = new wxButton( this, wxID_ANY, _("Add Dielectric Layer"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerRight->Add( m_buttonAddDielectricLayer, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + m_buttonRemoveDielectricLayer = new wxButton( this, wxID_ANY, _("Remove Dielectric Layer"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerRight->Add( m_buttonRemoveDielectricLayer, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 5 ); + + m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerRight->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + wxStaticBoxSizer* sbSizerBrdOptions; sbSizerBrdOptions = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Board Finish") ), wxVERTICAL ); m_cbCastellatedPads = new wxCheckBox( sbSizerBrdOptions->GetStaticBox(), wxID_ANY, _("Has castellated pads"), wxDefaultPosition, wxDefaultSize, 0 ); - sbSizerBrdOptions->Add( m_cbCastellatedPads, 0, wxBOTTOM, 5 ); + sbSizerBrdOptions->Add( m_cbCastellatedPads, 0, wxTOP|wxBOTTOM, 5 ); m_cbEgdesPlated = new wxCheckBox( sbSizerBrdOptions->GetStaticBox(), wxID_ANY, _("Plated board edge"), wxDefaultPosition, wxDefaultSize, 0 ); sbSizerBrdOptions->Add( m_cbEgdesPlated, 0, wxBOTTOM, 5 ); @@ -161,7 +170,10 @@ PANEL_SETUP_BOARD_STACKUP_BASE::PANEL_SETUP_BOARD_STACKUP_BASE( wxWindow* parent sbSizerBrdOptions->Add( m_choiceEdgeConn, 0, wxEXPAND|wxTOP|wxBOTTOM, 2 ); - bSizerRight->Add( sbSizerBrdOptions, 1, wxEXPAND|wxRIGHT, 5 ); + bSizerRight->Add( sbSizerBrdOptions, 0, wxEXPAND|wxTOP|wxRIGHT, 5 ); + + + bSizerRight->Add( 0, 0, 1, wxEXPAND, 5 ); m_buttonExport = new wxButton( this, wxID_ANY, _("Export to Clipboard"), wxDefaultPosition, wxDefaultSize, 0 ); bSizerRight->Add( m_buttonExport, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 ); @@ -175,11 +187,13 @@ PANEL_SETUP_BOARD_STACKUP_BASE::PANEL_SETUP_BOARD_STACKUP_BASE( wxWindow* parent this->SetSizer( bMainSizer ); this->Layout(); - bMainSizer->Fit( this ); // Connect Events m_thicknessCtrl->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onUpdateThicknessValue ), NULL, this ); m_buttonSetDielectricThickness->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onCalculateDielectricThickness ), NULL, this ); + m_buttonAddDielectricLayer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onAddDielectricLayer ), NULL, this ); + m_buttonRemoveDielectricLayer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onRemoveDielectricLayer ), NULL, this ); + m_buttonRemoveDielectricLayer->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onRemoveDielUI ), NULL, this ); m_buttonExport->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onExportToClipboard ), NULL, this ); } @@ -188,6 +202,9 @@ PANEL_SETUP_BOARD_STACKUP_BASE::~PANEL_SETUP_BOARD_STACKUP_BASE() // Disconnect Events m_thicknessCtrl->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onUpdateThicknessValue ), NULL, this ); m_buttonSetDielectricThickness->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onCalculateDielectricThickness ), NULL, this ); + m_buttonAddDielectricLayer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onAddDielectricLayer ), NULL, this ); + m_buttonRemoveDielectricLayer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onRemoveDielectricLayer ), NULL, this ); + m_buttonRemoveDielectricLayer->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onRemoveDielUI ), NULL, this ); m_buttonExport->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onExportToClipboard ), NULL, this ); } diff --git a/pcbnew/board_stackup_manager/panel_board_stackup_base.fbp b/pcbnew/board_stackup_manager/panel_board_stackup_base.fbp index 459b95ce78..77a0a8442e 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup_base.fbp +++ b/pcbnew/board_stackup_manager/panel_board_stackup_base.fbp @@ -45,7 +45,7 @@ PANEL_SETUP_BOARD_STACKUP_BASE - -1,-1 + 670,420 ; ; forward_declare @@ -1184,8 +1184,213 @@ 5 - wxEXPAND|wxRIGHT - 1 + wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Add Dielectric Layer + + 0 + + 0 + + + 0 + + 1 + m_buttonAddDielectricLayer + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onAddDielectricLayer + + + + 5 + wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Remove Dielectric Layer + + 0 + + 0 + + + 0 + + 1 + m_buttonRemoveDielectricLayer + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onRemoveDielectricLayer + onRemoveDielUI + + + + 5 + wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline2 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + ; ; forward_declare + 0 + + + + + + + + 5 + wxEXPAND|wxTOP|wxRIGHT + 0 wxID_ANY Board Finish @@ -1196,7 +1401,7 @@ none 5 - wxBOTTOM + wxTOP|wxBOTTOM 0 1 @@ -1574,6 +1779,16 @@ + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + 5 wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT diff --git a/pcbnew/board_stackup_manager/panel_board_stackup_base.h b/pcbnew/board_stackup_manager/panel_board_stackup_base.h index e6c4af758f..186018055c 100644 --- a/pcbnew/board_stackup_manager/panel_board_stackup_base.h +++ b/pcbnew/board_stackup_manager/panel_board_stackup_base.h @@ -61,6 +61,9 @@ class PANEL_SETUP_BOARD_STACKUP_BASE : public wxPanel wxStaticText* m_staticTextEpsilonR; wxStaticText* m_staticTextLossTg; wxRadioBox* m_rbDielectricConstraint; + wxButton* m_buttonAddDielectricLayer; + wxButton* m_buttonRemoveDielectricLayer; + wxStaticLine* m_staticline2; wxCheckBox* m_cbCastellatedPads; wxCheckBox* m_cbEgdesPlated; wxStaticText* m_staticTextFinish; @@ -72,12 +75,15 @@ class PANEL_SETUP_BOARD_STACKUP_BASE : public wxPanel // Virtual event handlers, overide them in your derived class virtual void onUpdateThicknessValue( wxUpdateUIEvent& event ) { event.Skip(); } virtual void onCalculateDielectricThickness( wxCommandEvent& event ) { event.Skip(); } + virtual void onAddDielectricLayer( wxCommandEvent& event ) { event.Skip(); } + virtual void onRemoveDielectricLayer( wxCommandEvent& event ) { event.Skip(); } + virtual void onRemoveDielUI( wxUpdateUIEvent& event ) { event.Skip(); } virtual void onExportToClipboard( wxCommandEvent& event ) { event.Skip(); } public: - PANEL_SETUP_BOARD_STACKUP_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); + PANEL_SETUP_BOARD_STACKUP_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 670,420 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); ~PANEL_SETUP_BOARD_STACKUP_BASE(); }; diff --git a/pcbnew/exporters/gerber_jobfile_writer.cpp b/pcbnew/exporters/gerber_jobfile_writer.cpp index 90d385dceb..eec21cb4f6 100644 --- a/pcbnew/exporters/gerber_jobfile_writer.cpp +++ b/pcbnew/exporters/gerber_jobfile_writer.cpp @@ -614,31 +614,31 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() for( int ii = 0; ii < brd_stackup.GetCount(); ++ii ) { BOARD_STACKUP_ITEM* item = brd_stackup.GetStackupLayer( ii ); - double thickness = item->m_Thickness*m_conversionUnits; // layer thickness is always in mm + double thickness = item->GetThickness()*m_conversionUnits; // layer thickness is always in mm wxString layer_type; std::string layer_name; // for comment - switch( item->m_Type ) + switch( item->GetType() ) { case BS_ITEM_TYPE_COPPER: layer_type = "Copper"; - layer_name = formatStringFromUTF32( m_pcb->GetLayerName( item->m_LayerId ) ); - last_copper_layer = item->m_LayerId; + layer_name = formatStringFromUTF32( m_pcb->GetLayerName( item->GetBrdLayerId() ) ); + last_copper_layer = item->GetBrdLayerId(); break; case BS_ITEM_TYPE_SILKSCREEN: layer_type = "Legend"; - layer_name = formatStringFromUTF32( item->m_TypeName ); + layer_name = formatStringFromUTF32( item->GetTypeName() ); break; case BS_ITEM_TYPE_SOLDERMASK: layer_type = "SolderMask"; - layer_name = formatStringFromUTF32( item->m_TypeName ); + layer_name = formatStringFromUTF32( item->GetTypeName() ); break; case BS_ITEM_TYPE_SOLDERPASTE: layer_type = "SolderPaste"; - layer_name = formatStringFromUTF32( item->m_TypeName ); + layer_name = formatStringFromUTF32( item->GetTypeName() ); break; case BS_ITEM_TYPE_DIELECTRIC: @@ -646,7 +646,7 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() // The option core or prepreg is not added here, as it creates constraints // in build process, not necessary wanted. layer_name = formatStringFromUTF32( wxString::Format( "dielectric layer %d", - item->m_DielectricLayerId ) ); + item->GetDielectricLayerId() ) ); break; default: @@ -658,9 +658,9 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() if( item->IsColorEditable() && uptodate ) { - if( IsPrmSpecified( item->m_Color ) ) + if( IsPrmSpecified( item->GetColor() ) ) { - wxString colorName = item->m_Color; + wxString colorName = item->GetColor(); if( colorName.StartsWith( "#" ) ) // This is a user defined color. { @@ -676,11 +676,11 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() if( item->IsThicknessEditable() && uptodate ) addJSONObject( wxString::Format( "\"Thickness\": %.3f,\n", thickness ) ); - if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC ) + if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC ) { if( item->HasMaterialValue() ) { - addJSONObject( wxString::Format( "\"Material\": \"%s\",\n", item->m_Material ) ); + addJSONObject( wxString::Format( "\"Material\": \"%s\",\n", item->GetMaterial() ) ); // These constrains are only written if the board has impedance controlled tracks. // If the board is not impedance controlled, they are useless. @@ -689,13 +689,15 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() { // Generate Epsilon R if > 1.0 (value <= 1.0 means not specified: it is not // a possible value - if( item->m_EpsilonR > 1.0 ) - addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n", item->FormatEpsilonR() ) ); + if( item->GetEpsilonR() > 1.0 ) + addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n", + item->FormatEpsilonR() ) ); // Generate LossTangent > 0.0 (value <= 0.0 means not specified: it is not // a possible value - if( item->m_LossTangent > 0.0 ) - addJSONObject( wxString::Format( "\"LossTangent\": %s,\n", item->FormatLossTangent() ) ); + if( item->GetLossTangent() > 0.0 ) + addJSONObject( wxString::Format( "\"LossTangent\": %s,\n", + item->FormatLossTangent() ) ); } } @@ -722,11 +724,11 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() addJSONObject( note ); } - else if( item->m_Type == BS_ITEM_TYPE_SOLDERMASK || item->m_Type == BS_ITEM_TYPE_SILKSCREEN ) + else if( item->GetType() == BS_ITEM_TYPE_SOLDERMASK || item->GetType() == BS_ITEM_TYPE_SILKSCREEN ) { if( item->HasMaterialValue() ) { - addJSONObject( wxString::Format( "\"Material\": \"%s\",\n", item->m_Material ) ); + addJSONObject( wxString::Format( "\"Material\": \"%s\",\n", item->GetMaterial() ) ); // These constrains are only written if the board has impedance controlled tracks. // If the board is not impedance controlled, they are useless. @@ -735,13 +737,15 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup() { // Generate Epsilon R if > 1.0 (value <= 1.0 means not specified: it is not // a possible value - if( item->m_EpsilonR > 1.0 ) - addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n", item->FormatEpsilonR() ) ); + if( item->GetEpsilonR() > 1.0 ) + addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n", + item->FormatEpsilonR() ) ); // Generate LossTangent > 0.0 (value <= 0.0 means not specified: it is not // a possible value - if( item->m_LossTangent > 0.0 ) - addJSONObject( wxString::Format( "\"LossTangent\": %s,\n", item->FormatLossTangent() ) ); + if( item->GetLossTangent() > 0.0 ) + addJSONObject( wxString::Format( "\"LossTangent\": %s,\n", + item->FormatLossTangent() ) ); } } diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index 851dd09fc7..5920e01e80 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -74,7 +74,7 @@ void PCB_PARSER::init() } m_layerMasks[ "*.Cu" ] = LSET::AllCuMask(); - m_layerMasks["*In.Cu"] = LSET::InternalCuMask(); + m_layerMasks["*In.Cu"] = LSET::InternalCuMask(); m_layerMasks[ "F&B.Cu" ] = LSET( 2, F_Cu, B_Cu ); m_layerMasks[ "*.Adhes" ] = LSET( 2, B_Adhes, F_Adhes ); m_layerMasks[ "*.Paste" ] = LSET( 2, B_Paste, F_Paste ); @@ -591,7 +591,7 @@ BOARD* PCB_PARSER::parseBOARD_unchecked() break; case T_zone: - m_board->Add( parseZONE_CONTAINER( m_board ), ADD_APPEND ); + m_board->Add( parseZONE_CONTAINER( m_board ), ADD_APPEND ); break; case T_target: @@ -1065,10 +1065,10 @@ void PCB_PARSER::parseBoardStackup() if( type != BS_ITEM_TYPE_UNDEFINED ) { item = new BOARD_STACKUP_ITEM( type ); - item->m_LayerId = layerId; + item->SetBrdLayerId( layerId ); if( type == BS_ITEM_TYPE_DIELECTRIC ) - item->m_DielectricLayerId = dielectric_idx++; + item->SetDielectricLayerId( dielectric_idx++ ); stackup.Add( item ); } @@ -1088,15 +1088,17 @@ void PCB_PARSER::parseBoardStackup() { case T_type: NeedSYMBOL(); - item->m_TypeName = FromUTF8(); + item->SetTypeName( FromUTF8() ); NeedRIGHT(); break; case T_thickness: - item->m_Thickness = parseBoardUnits( T_thickness ); + item->SetThickness( parseBoardUnits( T_thickness ) ); token = NextTok(); + if( token == T_LEFT ) break; + if( token == T_locked ) { thickness_locked = true; @@ -1106,25 +1108,25 @@ void PCB_PARSER::parseBoardStackup() case T_material: NeedSYMBOL(); - item->m_Material = FromUTF8(); + item->SetMaterial( FromUTF8() ); NeedRIGHT(); break; case T_epsilon_r: NextTok(); - item->m_EpsilonR = parseDouble(); + item->SetEpsilonR( parseDouble() ); NeedRIGHT(); break; case T_loss_tangent: NextTok(); - item->m_LossTangent = parseDouble(); + item->SetLossTangent( parseDouble() ); NeedRIGHT(); break; case T_color: NeedSYMBOL(); - item->m_Color = FromUTF8(); + item->SetColor( FromUTF8() ); NeedRIGHT(); break; @@ -1138,7 +1140,7 @@ void PCB_PARSER::parseBoardStackup() } if( type == BS_ITEM_TYPE_DIELECTRIC && thickness_locked ) - item->m_ThicknessLocked = true; + item->SetThicknessLocked( true ); } if( token != T_RIGHT ) @@ -2512,21 +2514,21 @@ MODULE* PCB_PARSER::parseMODULE_unchecked( wxArrayString* aInitialComments ) module->Add3DModel( parse3DModel() ); break; - case T_zone: - { - ZONE_CONTAINER* zone = parseZONE_CONTAINER( module.get() ); - module->Add( zone, ADD_APPEND ); - } - break; - + case T_zone: + { + ZONE_CONTAINER* zone = parseZONE_CONTAINER( module.get() ); + module->Add( zone, ADD_APPEND ); + } + break; + default: - Expecting( - "locked, placed, tedit, tstamp, at, descr, tags, path, " - "autoplace_cost90, autoplace_cost180, solder_mask_margin, " - "solder_paste_margin, solder_paste_ratio, clearance, " - "zone_connect, thermal_width, thermal_gap, attr, fp_text, " - "fp_arc, fp_circle, fp_curve, fp_line, fp_poly, pad, " - "zone, or model" ); + Expecting( + "locked, placed, tedit, tstamp, at, descr, tags, path, " + "autoplace_cost90, autoplace_cost180, solder_mask_margin, " + "solder_paste_margin, solder_paste_ratio, clearance, " + "zone_connect, thermal_width, thermal_gap, attr, fp_text, " + "fp_arc, fp_circle, fp_curve, fp_line, fp_poly, pad, " + "zone, or model" ); } } @@ -3400,7 +3402,7 @@ VIA* PCB_PARSER::parseVIA() } -ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER( BOARD_ITEM_CONTAINER* aParent ) +ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER( BOARD_ITEM_CONTAINER* aParent ) { wxCHECK_MSG( CurTok() == T_zone, NULL, wxT( "Cannot parse " ) + GetTokenString( CurTok() ) +