mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 10:13:19 +02:00
Board stackup manager: prepare code to allow multiple dielectric material by layer.
For advanced microwave applications, sometime a dielectric between 2 copper layers must be itself created by a stack of different materials.
This commit is contained in:
parent
f333d1b974
commit
2b201487e1
@ -48,13 +48,13 @@ wxString BuildStackupReport( BOARD_STACKUP& aStackup, EDA_UNITS_T aUnits )
|
|||||||
for( const auto item : aStackup.GetList() )
|
for( const auto item : aStackup.GetList() )
|
||||||
{
|
{
|
||||||
// Skip stackup items useless for the current board
|
// Skip stackup items useless for the current board
|
||||||
if( !item->m_Enabled )
|
if( !item->IsEnabled() )
|
||||||
{
|
{
|
||||||
row++;
|
row++;
|
||||||
continue;
|
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;
|
report << txt;
|
||||||
|
|
||||||
if( item->HasEpsilonRValue() )
|
if( item->HasEpsilonRValue() )
|
||||||
@ -71,23 +71,23 @@ wxString BuildStackupReport( BOARD_STACKUP& aStackup, EDA_UNITS_T aUnits )
|
|||||||
|
|
||||||
if( item->IsMaterialEditable() )
|
if( item->IsMaterialEditable() )
|
||||||
{
|
{
|
||||||
txt.Printf( " Material \"%s\"", item->m_Material );
|
txt.Printf( " Material \"%s\"", item->GetMaterial() );
|
||||||
report << txt;
|
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;
|
report << txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( item->IsThicknessEditable() )
|
if( item->IsThicknessEditable() )
|
||||||
{
|
{
|
||||||
txt.Printf( " Thickness %s",
|
txt.Printf( " Thickness %s",
|
||||||
StringFromValue( aUnits, item->m_Thickness, true, true ) );
|
StringFromValue( aUnits, item->GetThickness(), true, true ) );
|
||||||
report << txt;
|
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" );
|
txt.Printf( " Locked" );
|
||||||
report << txt;
|
report << txt;
|
||||||
@ -96,7 +96,7 @@ wxString BuildStackupReport( BOARD_STACKUP& aStackup, EDA_UNITS_T aUnits )
|
|||||||
|
|
||||||
if( item->IsColorEditable() )
|
if( item->IsColorEditable() )
|
||||||
{
|
{
|
||||||
txt.Printf( " Color \"%s\"", item->m_Color );
|
txt.Printf( " Color \"%s\"", item->GetColor() );
|
||||||
report << txt;
|
report << txt;
|
||||||
}
|
}
|
||||||
row++;
|
row++;
|
||||||
|
@ -31,55 +31,48 @@
|
|||||||
|
|
||||||
BOARD_STACKUP_ITEM::BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM_TYPE aType )
|
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_LayerId = UNDEFINED_LAYER;
|
||||||
m_Type = aType;
|
m_Type = aType;
|
||||||
m_Enabled = true;
|
SetEnabled( true );
|
||||||
m_DielectricLayerId = 0;
|
|
||||||
m_EpsilonR = 0;
|
|
||||||
m_LossTangent = 0.0;
|
|
||||||
m_ThicknessLocked = false;
|
|
||||||
|
|
||||||
// Initialize parameters to a usual value for allowed types:
|
// Initialize parameters to a usual value for allowed types:
|
||||||
switch( m_Type )
|
switch( m_Type )
|
||||||
{
|
{
|
||||||
case BS_ITEM_TYPE_COPPER:
|
case BS_ITEM_TYPE_COPPER:
|
||||||
m_TypeName = KEY_COPPER;
|
m_TypeName = KEY_COPPER;
|
||||||
m_Thickness = GetCopperDefaultThickness();
|
SetThickness( GetCopperDefaultThickness() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_DIELECTRIC:
|
case BS_ITEM_TYPE_DIELECTRIC:
|
||||||
m_TypeName = KEY_CORE; // or prepreg
|
m_TypeName = KEY_CORE; // or prepreg
|
||||||
m_Material = "FR4"; // or other dielectric name
|
SetMaterial( "FR4" ); // or other dielectric name
|
||||||
m_DielectricLayerId = 1;
|
SetDielectricLayerId( 1 );
|
||||||
m_Thickness = 0; // will be set later
|
SetLossTangent( 0.02 ); // for FR4
|
||||||
m_LossTangent = 0.02; // for FR4
|
SetEpsilonR( 4.5 ); // for FR4
|
||||||
m_EpsilonR = 4.5; // for FR4
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_SOLDERPASTE:
|
case BS_ITEM_TYPE_SOLDERPASTE:
|
||||||
m_TypeName = "solderpaste";
|
m_TypeName = "solderpaste";
|
||||||
m_Thickness = 0.0; // Not used
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_SOLDERMASK:
|
case BS_ITEM_TYPE_SOLDERMASK:
|
||||||
m_TypeName = "soldermask";
|
m_TypeName = "soldermask";
|
||||||
m_Color = "Green";
|
m_Color = "Green";
|
||||||
m_Material = NotSpecifiedPrm(); // or other solder mask material name
|
SetMaterial( NotSpecifiedPrm() ); // or other solder mask material name
|
||||||
m_Thickness = GetMaskDefaultThickness();
|
SetThickness( GetMaskDefaultThickness() );
|
||||||
m_EpsilonR = DEFAULT_EPSILON_R_SOLDERMASK;
|
SetEpsilonR( DEFAULT_EPSILON_R_SOLDERMASK );
|
||||||
m_LossTangent = 0.0;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_SILKSCREEN:
|
case BS_ITEM_TYPE_SILKSCREEN:
|
||||||
m_TypeName = "silkscreen";
|
m_TypeName = "silkscreen";
|
||||||
m_Color = NotSpecifiedPrm();
|
m_Color = NotSpecifiedPrm();
|
||||||
m_Material = NotSpecifiedPrm(); // or other silkscreen material name
|
SetMaterial( NotSpecifiedPrm() ); // or other silkscreen material name
|
||||||
m_EpsilonR = DEFAULT_EPSILON_R_SILKSCREEN;
|
SetEpsilonR( DEFAULT_EPSILON_R_SILKSCREEN );
|
||||||
m_Thickness = 0.0; // to be specified
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_UNDEFINED:
|
case BS_ITEM_TYPE_UNDEFINED:
|
||||||
m_Thickness = 0.0;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,16 +82,11 @@ BOARD_STACKUP_ITEM::BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM& aOther )
|
|||||||
{
|
{
|
||||||
m_LayerId = aOther.m_LayerId;
|
m_LayerId = aOther.m_LayerId;
|
||||||
m_Type = aOther.m_Type;
|
m_Type = aOther.m_Type;
|
||||||
m_Enabled = aOther.m_Enabled;
|
m_enabled = aOther.m_enabled;
|
||||||
m_DielectricLayerId = aOther.m_DielectricLayerId;
|
m_DielectricPrmsList = aOther.m_DielectricPrmsList;
|
||||||
m_TypeName = aOther.m_TypeName;
|
m_TypeName = aOther.m_TypeName;
|
||||||
m_LayerName = aOther.m_LayerName;
|
m_LayerName = aOther.m_LayerName;
|
||||||
m_Material = aOther.m_Material;
|
m_Color = aOther.GetColor();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -115,6 +103,79 @@ int BOARD_STACKUP_ITEM::GetMaskDefaultThickness()
|
|||||||
return Millimeter2iu( 0.01 );
|
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()
|
bool BOARD_STACKUP_ITEM::HasEpsilonRValue()
|
||||||
{
|
{
|
||||||
@ -137,7 +198,7 @@ bool BOARD_STACKUP_ITEM::HasLossTangentValue()
|
|||||||
bool BOARD_STACKUP_ITEM::HasMaterialValue()
|
bool BOARD_STACKUP_ITEM::HasMaterialValue()
|
||||||
{
|
{
|
||||||
// return true if the material is specified
|
// 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
|
// return a wxString to print/display Epsilon R
|
||||||
wxString txt;
|
wxString txt;
|
||||||
txt.Printf( "%.1f", m_EpsilonR );
|
txt.Printf( "%.1f", GetEpsilonR() );
|
||||||
return txt;
|
return txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,11 +257,20 @@ wxString BOARD_STACKUP_ITEM::FormatLossTangent()
|
|||||||
{
|
{
|
||||||
// return a wxString to print/display Loss Tangent
|
// return a wxString to print/display Loss Tangent
|
||||||
wxString txt;
|
wxString txt;
|
||||||
txt.Printf( "%g", m_LossTangent );
|
txt.Printf( "%g", GetLossTangent() );
|
||||||
return txt;
|
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()
|
BOARD_STACKUP::BOARD_STACKUP()
|
||||||
{
|
{
|
||||||
@ -279,8 +349,8 @@ int BOARD_STACKUP::BuildBoardTicknessFromStackup() const
|
|||||||
|
|
||||||
for( auto item : m_list )
|
for( auto item : m_list )
|
||||||
{
|
{
|
||||||
if( item->IsThicknessEditable() && item->m_Enabled )
|
if( item->IsThicknessEditable() && item->IsEnabled() )
|
||||||
thickness += item->m_Thickness;
|
thickness += item->GetThickness();
|
||||||
}
|
}
|
||||||
|
|
||||||
return thickness;
|
return thickness;
|
||||||
@ -301,7 +371,7 @@ bool BOARD_STACKUP::SynchronizeWithBoard( BOARD_DESIGN_SETTINGS* aSettings )
|
|||||||
|
|
||||||
for( BOARD_STACKUP_ITEM* item: stackup.GetList() )
|
for( BOARD_STACKUP_ITEM* item: stackup.GetList() )
|
||||||
{
|
{
|
||||||
if( item->m_LayerId == old_item->m_LayerId )
|
if( item->GetBrdLayerId() == old_item->GetBrdLayerId() )
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
@ -322,9 +392,9 @@ bool BOARD_STACKUP::SynchronizeWithBoard( BOARD_DESIGN_SETTINGS* aSettings )
|
|||||||
// Search for initial settings:
|
// Search for initial settings:
|
||||||
for( BOARD_STACKUP_ITEM* initial_item: m_list )
|
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;
|
*item = *initial_item;
|
||||||
found = true;
|
found = true;
|
||||||
@ -333,7 +403,7 @@ bool BOARD_STACKUP::SynchronizeWithBoard( BOARD_DESIGN_SETTINGS* aSettings )
|
|||||||
}
|
}
|
||||||
else // dielectric layer: see m_DielectricLayerId for identification
|
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;
|
*item = *initial_item;
|
||||||
found = true;
|
found = true;
|
||||||
@ -393,24 +463,24 @@ void BOARD_STACKUP::BuildDefaultStackupList( BOARD_DESIGN_SETTINGS* aSettings,
|
|||||||
if( enabledLayer[F_SilkS] )
|
if( enabledLayer[F_SilkS] )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SILKSCREEN );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SILKSCREEN );
|
||||||
item->m_LayerId = F_SilkS;
|
item->SetBrdLayerId( F_SilkS );
|
||||||
item->m_TypeName = _HKI( "Top Silk Screen" );
|
item->SetTypeName( _HKI( "Top Silk Screen" ) );
|
||||||
Add( item );
|
Add( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( enabledLayer[F_Paste] )
|
if( enabledLayer[F_Paste] )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERPASTE );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERPASTE );
|
||||||
item->m_LayerId = F_Paste;
|
item->SetBrdLayerId( F_Paste );
|
||||||
item->m_TypeName = _HKI( "Top Solder Paste" );
|
item->SetTypeName( _HKI( "Top Solder Paste" ) );
|
||||||
Add( item );
|
Add( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( enabledLayer[F_Mask] )
|
if( enabledLayer[F_Mask] )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERMASK );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERMASK );
|
||||||
item->m_LayerId = F_Mask;
|
item->SetBrdLayerId( F_Mask );
|
||||||
item->m_TypeName = _HKI( "Top Solder Mask" );
|
item->SetTypeName( _HKI( "Top Solder Mask" ) );
|
||||||
Add( item );
|
Add( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,31 +488,31 @@ void BOARD_STACKUP::BuildDefaultStackupList( BOARD_DESIGN_SETTINGS* aSettings,
|
|||||||
for( int ii = 0; ii < copperLayerCount; ii++ )
|
for( int ii = 0; ii < copperLayerCount; ii++ )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_COPPER );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_COPPER );
|
||||||
item->m_LayerId = ( PCB_LAYER_ID )ii;
|
item->SetBrdLayerId( ( PCB_LAYER_ID )ii );
|
||||||
item->m_TypeName = KEY_COPPER;
|
item->SetTypeName( KEY_COPPER );
|
||||||
Add( item );
|
Add( item );
|
||||||
|
|
||||||
if( ii == copperLayerCount-1 )
|
if( ii == copperLayerCount-1 )
|
||||||
{
|
{
|
||||||
item->m_LayerId = B_Cu;
|
item->SetBrdLayerId( B_Cu );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the dielectric layer:
|
// Add the dielectric layer:
|
||||||
item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_DIELECTRIC );
|
item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_DIELECTRIC );
|
||||||
item->m_Thickness = diel_thickness;
|
item->SetThickness( diel_thickness );
|
||||||
item->m_DielectricLayerId = dielectric_idx + 1;
|
item->SetDielectricLayerId( dielectric_idx + 1 );
|
||||||
|
|
||||||
// Display a dielectric default layer name:
|
// Display a dielectric default layer name:
|
||||||
if( (dielectric_idx & 1) == 0 )
|
if( (dielectric_idx & 1) == 0 )
|
||||||
{
|
{
|
||||||
item->m_TypeName = KEY_CORE;
|
item->SetTypeName( KEY_CORE );
|
||||||
item->m_Material = "FR4";
|
item->SetMaterial( "FR4" );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
item->m_TypeName = KEY_PREPREG;
|
item->SetTypeName( KEY_PREPREG );
|
||||||
item->m_Material = "FR4";
|
item->SetMaterial( "FR4" );
|
||||||
}
|
}
|
||||||
|
|
||||||
Add( item );
|
Add( item );
|
||||||
@ -453,24 +523,24 @@ void BOARD_STACKUP::BuildDefaultStackupList( BOARD_DESIGN_SETTINGS* aSettings,
|
|||||||
if( enabledLayer[B_Mask] )
|
if( enabledLayer[B_Mask] )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERMASK );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERMASK );
|
||||||
item->m_LayerId = B_Mask;
|
item->SetBrdLayerId( B_Mask );
|
||||||
item->m_TypeName = _HKI( "Bottom Solder Mask" );
|
item->SetTypeName( _HKI( "Bottom Solder Mask" ) );
|
||||||
Add( item );
|
Add( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( enabledLayer[B_Paste] )
|
if( enabledLayer[B_Paste] )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERPASTE );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SOLDERPASTE );
|
||||||
item->m_LayerId = B_Paste;
|
item->SetBrdLayerId( B_Paste );
|
||||||
item->m_TypeName = _HKI( "Bottom Solder Paste" );
|
item->SetTypeName( _HKI( "Bottom Solder Paste" ) );
|
||||||
Add( item );
|
Add( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( enabledLayer[B_SilkS] )
|
if( enabledLayer[B_SilkS] )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SILKSCREEN );
|
BOARD_STACKUP_ITEM* item = new BOARD_STACKUP_ITEM( BS_ITEM_TYPE_SILKSCREEN );
|
||||||
item->m_LayerId = B_SilkS;
|
item->SetBrdLayerId( B_SilkS );
|
||||||
item->m_TypeName = _HKI( "Bottom Silk Screen" );
|
item->SetTypeName( _HKI( "Bottom Silk Screen" ) );
|
||||||
Add( item );
|
Add( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,41 +575,41 @@ void BOARD_STACKUP::FormatBoardStackup( OUTPUTFORMATTER* aFormatter,
|
|||||||
{
|
{
|
||||||
wxString layer_name;
|
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
|
else
|
||||||
layer_name = aBoard->GetLayerName( item->m_LayerId );
|
layer_name = aBoard->GetLayerName( item->GetBrdLayerId() );
|
||||||
|
|
||||||
aFormatter->Print( nest_level, "(layer %s (type %s)",
|
aFormatter->Print( nest_level, "(layer %s (type %s)",
|
||||||
aFormatter->Quotew( layer_name ).c_str(),
|
aFormatter->Quotew( layer_name ).c_str(),
|
||||||
aFormatter->Quotew( item->m_TypeName ).c_str() );
|
aFormatter->Quotew( item->GetTypeName() ).c_str() );
|
||||||
|
|
||||||
if( item->IsThicknessEditable() )
|
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)",
|
aFormatter->Print( 0, " (thickness %s locked)",
|
||||||
FormatInternalUnits( (int)item->m_Thickness ).c_str() );
|
FormatInternalUnits( item->GetThickness() ).c_str() );
|
||||||
else
|
else
|
||||||
aFormatter->Print( 0, " (thickness %s)",
|
aFormatter->Print( 0, " (thickness %s)",
|
||||||
FormatInternalUnits( (int)item->m_Thickness ).c_str() );
|
FormatInternalUnits( item->GetThickness() ).c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( item->HasMaterialValue() )
|
if( item->HasMaterialValue() )
|
||||||
aFormatter->Print( 0, " (material %s)",
|
aFormatter->Print( 0, " (material %s)",
|
||||||
aFormatter->Quotew( item->m_Material ).c_str() );
|
aFormatter->Quotew( item->GetMaterial() ).c_str() );
|
||||||
|
|
||||||
if( item->HasEpsilonRValue() && item->HasMaterialValue() )
|
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() )
|
if( item->HasLossTangentValue() && item->HasMaterialValue() )
|
||||||
aFormatter->Print( 0, " (loss_tangent %s)",
|
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->Print( 0, " (color %s)",
|
||||||
aFormatter->Quotew( item->m_Color ).c_str() );
|
aFormatter->Quotew( item->GetColor() ).c_str() );
|
||||||
|
|
||||||
aFormatter->Print( 0, ")\n" );
|
aFormatter->Print( 0, ")\n" );
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,33 @@ enum BS_EDGE_CONNECTOR_CONSTRAINTS
|
|||||||
BS_EDGE_CONNECTOR_BEVELLED // Some connector in board, and the connector must be bevelled
|
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
|
* this class manage one layer needed to make a physical board
|
||||||
* it can be a solder mask, silk screen, copper or a dielectric
|
* 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_TYPE aType );
|
||||||
BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM& aOther );
|
BOARD_STACKUP_ITEM( BOARD_STACKUP_ITEM& aOther );
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
BOARD_STACKUP_ITEM_TYPE m_Type;
|
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_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_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
|
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)
|
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
|
/// and UNDEFINED_LAYER (-1) for dielectic layers that are not
|
||||||
/// really layers for the board editor
|
/// 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<DIELECTRIC_PRMS> 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
|
/// @return true if the layer has a meaningfull Epsilon R parameter
|
||||||
/// namely dielectric layers: dielectric and solder mask
|
/// namely dielectric layers: dielectric and solder mask
|
||||||
bool HasEpsilonRValue();
|
bool HasEpsilonRValue();
|
||||||
@ -115,6 +143,39 @@ public:
|
|||||||
|
|
||||||
/// @return a wxString to print/display Loss Tangent
|
/// @return a wxString to print/display Loss Tangent
|
||||||
wxString FormatLossTangent();
|
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 );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -102,6 +102,10 @@ PANEL_SETUP_BOARD_STACKUP::PANEL_SETUP_BOARD_STACKUP( PAGED_DIALOG* aParent, PCB
|
|||||||
|
|
||||||
buildLayerStackPanel();
|
buildLayerStackPanel();
|
||||||
synchronizeWithBoard( true );
|
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 )
|
void PANEL_SETUP_BOARD_STACKUP::onExportToClipboard( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
if( !transferDataFromUIToStackup() )
|
if( !transferDataFromUIToStackup() )
|
||||||
@ -178,8 +274,8 @@ void PANEL_SETUP_BOARD_STACKUP::onUpdateThicknessValue( wxUpdateUIEvent& event )
|
|||||||
|
|
||||||
for( auto item : m_stackup.GetList() )
|
for( auto item : m_stackup.GetList() )
|
||||||
{
|
{
|
||||||
if( item->IsThicknessEditable() && item->m_Enabled )
|
if( item->IsThicknessEditable() && item->IsEnabled() )
|
||||||
thickness += item->m_Thickness;
|
thickness += item->GetThickness();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_tcCTValue->SetValue( StringFromValue( m_units, thickness, true, true ) );
|
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:
|
// test for existing stackup items in board:
|
||||||
for( BOARD_STACKUP_ITEM* brd_item : brd_stackup.GetList() )
|
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
|
// 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;
|
continue;
|
||||||
|
|
||||||
if( item->m_DielectricLayerId == brd_item->m_DielectricLayerId )
|
if( item->GetDielectricLayerId() == brd_item->GetDielectricLayerId() )
|
||||||
brd_stack_item = brd_item;
|
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;
|
brd_stack_item = brd_item;
|
||||||
|
|
||||||
if( brd_stack_item )
|
if( brd_stack_item )
|
||||||
@ -267,8 +363,8 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync )
|
|||||||
|
|
||||||
if( matName )
|
if( matName )
|
||||||
{
|
{
|
||||||
if( IsPrmSpecified( item->m_Material ) )
|
if( IsPrmSpecified( item->GetMaterial() ) )
|
||||||
matName->SetValue( item->m_Material );
|
matName->SetValue( item->GetMaterial() );
|
||||||
else
|
else
|
||||||
matName->SetValue( wxGetTranslation( NotSpecifiedPrm() ) );
|
matName->SetValue( wxGetTranslation( NotSpecifiedPrm() ) );
|
||||||
}
|
}
|
||||||
@ -279,14 +375,14 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync )
|
|||||||
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( ui_row_item.m_ThicknessCtrl );
|
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( ui_row_item.m_ThicknessCtrl );
|
||||||
|
|
||||||
if( textCtrl )
|
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<wxCheckBox*> ( ui_row_item.m_ThicknessLockCtrl );
|
wxCheckBox* cb_box = dynamic_cast<wxCheckBox*> ( ui_row_item.m_ThicknessLockCtrl );
|
||||||
|
|
||||||
if( cb_box )
|
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<wxBitmapComboBox*>( ui_row_item.m_ColorCtrl );
|
auto bm_combo = dynamic_cast<wxBitmapComboBox*>( ui_row_item.m_ColorCtrl );
|
||||||
int color_idx = 0;
|
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;
|
m_UserColors[row] = color;
|
||||||
color_idx = GetColorUserDefinedListIdx();
|
color_idx = GetColorUserDefinedListIdx();
|
||||||
|
|
||||||
@ -315,7 +411,7 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync )
|
|||||||
|
|
||||||
for( int ii = 0; ii < GetColorStandardListCount(); ii++ )
|
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;
|
color_idx = ii;
|
||||||
break;
|
break;
|
||||||
@ -330,7 +426,7 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync )
|
|||||||
if( item->HasEpsilonRValue() )
|
if( item->HasEpsilonRValue() )
|
||||||
{
|
{
|
||||||
wxString txt;
|
wxString txt;
|
||||||
txt.Printf( "%.1f", item->m_EpsilonR );
|
txt.Printf( "%.1f", item->GetEpsilonR() );
|
||||||
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( ui_row_item.m_EpsilonCtrl );
|
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( ui_row_item.m_EpsilonCtrl );
|
||||||
|
|
||||||
if( textCtrl )
|
if( textCtrl )
|
||||||
@ -340,7 +436,7 @@ void PANEL_SETUP_BOARD_STACKUP::synchronizeWithBoard( bool aFullSync )
|
|||||||
if( item->HasLossTangentValue() )
|
if( item->HasLossTangentValue() )
|
||||||
{
|
{
|
||||||
wxString txt;
|
wxString txt;
|
||||||
txt.Printf( "%g", item->m_LossTangent );
|
txt.Printf( "%g", item->GetLossTangent() );
|
||||||
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( ui_row_item.m_LossTgCtrl );
|
wxTextCtrl* textCtrl = dynamic_cast<wxTextCtrl*>( ui_row_item.m_LossTgCtrl );
|
||||||
|
|
||||||
if( textCtrl )
|
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
|
// Now enable/disable stackup items, according to the m_enabledLayers config
|
||||||
bool show_item;
|
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
|
// 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
|
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;
|
ui_row_item.m_isEnabled = show_item;
|
||||||
|
|
||||||
@ -440,9 +536,9 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
|
|
||||||
const FAB_LAYER_COLOR* color_list = GetColorStandardList();
|
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;
|
bool show_item = true;//false;
|
||||||
ui_row_item.m_isEnabled = true;
|
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 );
|
m_fgGridSizer->Add( bitmap, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT );
|
||||||
ui_row_item.m_Icon = bitmap;
|
ui_row_item.m_Icon = bitmap;
|
||||||
|
|
||||||
if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC )
|
if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC )
|
||||||
{
|
{
|
||||||
wxString lname;
|
wxString lname = item->FormatDielectricLayerName();
|
||||||
lname.Printf( _( "Dielectric %d" ), item->m_DielectricLayerId );
|
|
||||||
wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, lname );
|
wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, lname );
|
||||||
m_fgGridSizer->Add( st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
|
m_fgGridSizer->Add( st_text, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
|
||||||
ui_row_item.m_LayerName = st_text;
|
ui_row_item.m_LayerName = st_text;
|
||||||
|
|
||||||
wxChoice* choice = new wxChoice( m_scGridWin, wxID_ANY, wxDefaultPosition,
|
wxChoice* choice = new wxChoice( m_scGridWin, wxID_ANY, wxDefaultPosition,
|
||||||
wxDefaultSize, m_core_prepreg_choice );
|
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 );
|
m_fgGridSizer->Add( choice, 0, wxEXPAND|wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
|
||||||
|
|
||||||
ui_row_item.m_LayerTypeCtrl = choice;
|
ui_row_item.m_LayerTypeCtrl = choice;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
item->m_LayerName = m_board->GetLayerName( item->m_LayerId );
|
item->GetLayerName() = m_board->GetLayerName( item->GetBrdLayerId() );
|
||||||
wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, item->m_LayerName );
|
wxStaticText* st_text = new wxStaticText( m_scGridWin, wxID_ANY, item->GetLayerName() );
|
||||||
m_fgGridSizer->Add( st_text, 0, wxALL|wxALIGN_CENTER_VERTICAL, 1 );
|
m_fgGridSizer->Add( st_text, 0, wxALL|wxALIGN_CENTER_VERTICAL, 1 );
|
||||||
st_text->Show( show_item );
|
st_text->Show( show_item );
|
||||||
ui_row_item.m_LayerName = st_text;
|
ui_row_item.m_LayerName = st_text;
|
||||||
|
|
||||||
wxString lname;
|
wxString lname;
|
||||||
|
|
||||||
if( item->m_TypeName == KEY_COPPER )
|
if( item->GetTypeName() == KEY_COPPER )
|
||||||
lname = _( "Copper" );
|
lname = _( "Copper" );
|
||||||
else
|
else
|
||||||
lname = wxGetTranslation( item->m_TypeName );
|
lname = wxGetTranslation( item->GetTypeName() );
|
||||||
|
|
||||||
st_text = new wxStaticText( m_scGridWin, wxID_ANY, lname );
|
st_text = new wxStaticText( m_scGridWin, wxID_ANY, lname );
|
||||||
m_fgGridSizer->Add( st_text, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
|
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() )
|
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
|
else
|
||||||
{
|
{
|
||||||
@ -504,7 +600,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
{
|
{
|
||||||
wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, ID_ITEM_THICKNESS+row );
|
wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, ID_ITEM_THICKNESS+row );
|
||||||
textCtrl->SetMinSize( m_numericTextCtrlSize );
|
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_fgGridSizer->Add( textCtrl, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 2 );
|
||||||
m_controlItemsList.push_back( textCtrl );
|
m_controlItemsList.push_back( textCtrl );
|
||||||
textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
|
textCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED,
|
||||||
@ -512,11 +608,11 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
NULL, this );
|
NULL, this );
|
||||||
ui_row_item.m_ThicknessCtrl = textCtrl;
|
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,
|
wxCheckBox* cb_box = new wxCheckBox( m_scGridWin, ID_ITEM_THICKNESS_LOCKED+row,
|
||||||
wxEmptyString );
|
wxEmptyString );
|
||||||
cb_box->SetValue( item->m_ThicknessLocked );
|
cb_box->SetValue( item->IsThicknessLocked() );
|
||||||
m_fgGridSizer->Add( cb_box, 0, wxALIGN_CENTER_VERTICAL, 2 );
|
m_fgGridSizer->Add( cb_box, 0, wxALIGN_CENTER_VERTICAL, 2 );
|
||||||
ui_row_item.m_ThicknessLockCtrl = cb_box;
|
ui_row_item.m_ThicknessLockCtrl = cb_box;
|
||||||
}
|
}
|
||||||
@ -535,9 +631,9 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
{
|
{
|
||||||
int color_idx = 0;
|
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;
|
m_UserColors[row] = color;
|
||||||
color_idx = GetColorUserDefinedListIdx();
|
color_idx = GetColorUserDefinedListIdx();
|
||||||
}
|
}
|
||||||
@ -545,7 +641,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
{
|
{
|
||||||
for( int ii = 0; ii < GetColorStandardListCount(); ii++ )
|
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;
|
color_idx = ii;
|
||||||
break;
|
break;
|
||||||
@ -568,7 +664,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
if( item->HasEpsilonRValue() )
|
if( item->HasEpsilonRValue() )
|
||||||
{
|
{
|
||||||
wxString txt;
|
wxString txt;
|
||||||
txt.Printf( "%.1f", item->m_EpsilonR );
|
txt.Printf( "%.1f", item->GetEpsilonR() );
|
||||||
wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, wxID_ANY, wxEmptyString,
|
wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, wxID_ANY, wxEmptyString,
|
||||||
wxDefaultPosition, m_numericFieldsSize );
|
wxDefaultPosition, m_numericFieldsSize );
|
||||||
textCtrl->SetValue( txt );
|
textCtrl->SetValue( txt );
|
||||||
@ -583,7 +679,7 @@ void PANEL_SETUP_BOARD_STACKUP::buildLayerStackPanel()
|
|||||||
if( item->HasLossTangentValue() )
|
if( item->HasLossTangentValue() )
|
||||||
{
|
{
|
||||||
wxString txt;
|
wxString txt;
|
||||||
txt.Printf( "%g", item->m_LossTangent );
|
txt.Printf( "%g", item->GetLossTangent() );
|
||||||
wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, wxID_ANY, wxEmptyString,
|
wxTextCtrl* textCtrl = new wxTextCtrl( m_scGridWin, wxID_ANY, wxEmptyString,
|
||||||
wxDefaultPosition, m_numericFieldsSize );
|
wxDefaultPosition, m_numericFieldsSize );
|
||||||
textCtrl->SetValue( txt );
|
textCtrl->SetValue( txt );
|
||||||
@ -635,11 +731,11 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
|
|
||||||
for( auto item : m_stackup.GetList() )
|
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;
|
thickness_error = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -680,13 +776,13 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
for( auto item : m_stackup.GetList() )
|
for( auto item : m_stackup.GetList() )
|
||||||
{
|
{
|
||||||
// Skip stackup items useless for the current board
|
// Skip stackup items useless for the current board
|
||||||
if( !item->m_Enabled )
|
if( !item->IsEnabled() )
|
||||||
{
|
{
|
||||||
row++;
|
row++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
item->m_LayerName = m_rowUiItemsList[row].m_LayerName->GetLabel();
|
item->SetLayerName( m_rowUiItemsList[row].m_LayerName->GetLabel() );
|
||||||
|
|
||||||
if( item->HasEpsilonRValue() )
|
if( item->HasEpsilonRValue() )
|
||||||
{
|
{
|
||||||
@ -694,9 +790,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
txt = textCtrl->GetValue();
|
txt = textCtrl->GetValue();
|
||||||
|
|
||||||
if( txt.ToDouble( &value ) && value >= 0.0 )
|
if( txt.ToDouble( &value ) && value >= 0.0 )
|
||||||
item->m_EpsilonR = value;
|
item->SetEpsilonR( value );
|
||||||
else if( txt.ToCDouble( &value ) && value >= 0.0 )
|
else if( txt.ToCDouble( &value ) && value >= 0.0 )
|
||||||
item->m_EpsilonR = value;
|
item->SetEpsilonR( value );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
success = false;
|
success = false;
|
||||||
@ -710,9 +806,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
txt = textCtrl->GetValue();
|
txt = textCtrl->GetValue();
|
||||||
|
|
||||||
if( txt.ToDouble( &value ) && value >= 0.0 )
|
if( txt.ToDouble( &value ) && value >= 0.0 )
|
||||||
item->m_LossTangent = value;
|
item->SetLossTangent( value );
|
||||||
else if( txt.ToCDouble( &value ) && value >= 0.0 )
|
else if( txt.ToCDouble( &value ) && value >= 0.0 )
|
||||||
item->m_LossTangent = value;
|
item->SetLossTangent( value );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
success = false;
|
success = false;
|
||||||
@ -725,15 +821,15 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
if( item->IsMaterialEditable() )
|
if( item->IsMaterialEditable() )
|
||||||
{
|
{
|
||||||
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( m_rowUiItemsList[row].m_MaterialCtrl );
|
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( 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
|
// Ensure the not specified mat name is the keyword, not its translation
|
||||||
// to avoid any issue is the language setting changes
|
// to avoid any issue is the language setting changes
|
||||||
if( !IsPrmSpecified( item->m_Material ) )
|
if( !IsPrmSpecified( item->GetMaterial() ) )
|
||||||
item->m_Material = NotSpecifiedPrm();
|
item->SetMaterial( NotSpecifiedPrm() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC )
|
if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC )
|
||||||
{
|
{
|
||||||
// Choice is Core or Prepreg:
|
// Choice is Core or Prepreg:
|
||||||
wxChoice* choice = static_cast<wxChoice*>( m_rowUiItemsList[row].m_LayerTypeCtrl );
|
wxChoice* choice = static_cast<wxChoice*>( m_rowUiItemsList[row].m_LayerTypeCtrl );
|
||||||
@ -741,9 +837,9 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
int idx = choice->GetSelection();
|
int idx = choice->GetSelection();
|
||||||
|
|
||||||
if( idx == 0 )
|
if( idx == 0 )
|
||||||
item->m_TypeName = KEY_CORE;
|
item->SetTypeName( KEY_CORE );
|
||||||
else
|
else
|
||||||
item->m_TypeName = KEY_PREPREG;
|
item->SetTypeName( KEY_PREPREG );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( item->IsThicknessEditable() )
|
if( item->IsThicknessEditable() )
|
||||||
@ -751,14 +847,14 @@ bool PANEL_SETUP_BOARD_STACKUP::transferDataFromUIToStackup()
|
|||||||
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( m_rowUiItemsList[row].m_ThicknessCtrl );
|
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( m_rowUiItemsList[row].m_ThicknessCtrl );
|
||||||
txt = textCtrl->GetValue();
|
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:
|
// Dielectric thickness layer can have a locked thickness:
|
||||||
wxCheckBox* cb_box = static_cast<wxCheckBox*>
|
wxCheckBox* cb_box = static_cast<wxCheckBox*>
|
||||||
( m_rowUiItemsList[row].m_ThicknessLockCtrl );
|
( 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();
|
int idx = choice->GetSelection();
|
||||||
|
|
||||||
if( idx == GetColorUserDefinedListIdx() )
|
if( idx == GetColorUserDefinedListIdx() )
|
||||||
item->m_Color = m_UserColors[row].GetAsString( wxC2S_HTML_SYNTAX );
|
item->SetColor( m_UserColors[row].GetAsString( wxC2S_HTML_SYNTAX ) );
|
||||||
else
|
else
|
||||||
item->m_Color = color_list[idx].m_ColorName;
|
item->SetColor( color_list[idx].m_ColorName );
|
||||||
}
|
}
|
||||||
row++;
|
row++;
|
||||||
}
|
}
|
||||||
@ -813,7 +909,7 @@ bool PANEL_SETUP_BOARD_STACKUP::TransferDataFromWindow()
|
|||||||
|
|
||||||
for( auto item : m_stackup.GetList() )
|
for( auto item : m_stackup.GetList() )
|
||||||
{
|
{
|
||||||
if( item->m_Enabled )
|
if( item->IsEnabled() )
|
||||||
brd_stackup.Add( new BOARD_STACKUP_ITEM( *item ) );
|
brd_stackup.Add( new BOARD_STACKUP_ITEM( *item ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,13 +968,13 @@ void PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness( wxCommandEvent&
|
|||||||
int row = 0;
|
int row = 0;
|
||||||
for( auto item : m_stackup.GetList() )
|
for( auto item : m_stackup.GetList() )
|
||||||
{
|
{
|
||||||
if( !item->IsThicknessEditable() || !item->m_Enabled )
|
if( !item->IsThicknessEditable() || !item->IsEnabled() )
|
||||||
{
|
{
|
||||||
row++;
|
row++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( item->m_Type == BS_ITEM_TYPE_DIELECTRIC )
|
if( item->GetType() == BS_ITEM_TYPE_DIELECTRIC )
|
||||||
{
|
{
|
||||||
wxCheckBox* checkBox = static_cast<wxCheckBox*>( m_rowUiItemsList[row].m_ThicknessLockCtrl );
|
wxCheckBox* checkBox = static_cast<wxCheckBox*>( m_rowUiItemsList[row].m_ThicknessLockCtrl );
|
||||||
|
|
||||||
@ -891,12 +987,12 @@ void PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness( wxCommandEvent&
|
|||||||
{
|
{
|
||||||
fixed_thickness_cnt++;
|
fixed_thickness_cnt++;
|
||||||
|
|
||||||
if( item->m_Thickness < 0 )
|
if( item->GetThickness() < 0 )
|
||||||
thickness_error = true;
|
thickness_error = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
thickness += item->m_Thickness;
|
thickness += item->GetThickness();
|
||||||
row++;
|
row++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -936,15 +1032,15 @@ void PANEL_SETUP_BOARD_STACKUP::onCalculateDielectricThickness( wxCommandEvent&
|
|||||||
row = 0;
|
row = 0;
|
||||||
for( auto item : m_stackup.GetList() )
|
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<wxCheckBox*>( m_rowUiItemsList[row].m_ThicknessLockCtrl );
|
wxCheckBox* checkBox = static_cast<wxCheckBox*>( m_rowUiItemsList[row].m_ThicknessLockCtrl );
|
||||||
|
|
||||||
if( !checkBox->GetValue() ) // Not locked thickness: can be modified
|
if( !checkBox->GetValue() ) // Not locked thickness: can be modified
|
||||||
{
|
{
|
||||||
item->m_Thickness = dielectric_thickness;
|
item->SetThickness( dielectric_thickness );
|
||||||
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( m_rowUiItemsList[row].m_ThicknessCtrl );
|
wxTextCtrl* textCtrl = static_cast<wxTextCtrl*>( 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;
|
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;
|
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;
|
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;
|
mat_list = &m_silkscreenMatList;
|
||||||
|
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int idx = mat_list->FindSubstrate( item->m_Material,
|
int idx = mat_list->FindSubstrate( item->GetMaterial(),
|
||||||
item->m_EpsilonR,
|
item->GetEpsilonR(),
|
||||||
item->m_LossTangent );
|
item->GetLossTangent() );
|
||||||
|
|
||||||
if( idx < 0 && !item->m_Material.IsEmpty() )
|
if( idx < 0 && !item->GetMaterial().IsEmpty() )
|
||||||
{
|
{
|
||||||
// This material is not in list: add it
|
// This material is not in list: add it
|
||||||
DIELECTRIC_SUBSTRATE new_mat;
|
DIELECTRIC_SUBSTRATE new_mat;
|
||||||
new_mat.m_Name = item->m_Material;
|
new_mat.m_Name = item->GetMaterial();
|
||||||
new_mat.m_EpsilonR = item->m_EpsilonR;
|
new_mat.m_EpsilonR = item->GetEpsilonR();
|
||||||
new_mat.m_LossTangent = item->m_LossTangent;
|
new_mat.m_LossTangent = item->GetLossTangent();
|
||||||
mat_list->AppendSubstrate( new_mat );
|
mat_list->AppendSubstrate( new_mat );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1024,7 +1120,7 @@ void PANEL_SETUP_BOARD_STACKUP::onMaterialChange( wxCommandEvent& event )
|
|||||||
BOARD_STACKUP_ITEM* item = GetStackupItem( row );
|
BOARD_STACKUP_ITEM* item = GetStackupItem( row );
|
||||||
DIELECTRIC_SUBSTRATE_LIST* item_mat_list = nullptr;
|
DIELECTRIC_SUBSTRATE_LIST* item_mat_list = nullptr;
|
||||||
|
|
||||||
switch( item->m_Type )
|
switch( item->GetType() )
|
||||||
{
|
{
|
||||||
case BS_ITEM_TYPE_DIELECTRIC:
|
case BS_ITEM_TYPE_DIELECTRIC:
|
||||||
item_mat_list = &m_delectricMatList;
|
item_mat_list = &m_delectricMatList;
|
||||||
@ -1054,13 +1150,13 @@ void PANEL_SETUP_BOARD_STACKUP::onMaterialChange( wxCommandEvent& event )
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Update Name, Epsilon R and Loss tg
|
// Update Name, Epsilon R and Loss tg
|
||||||
item->m_Material = substrate.m_Name;
|
item->SetMaterial( substrate.m_Name );
|
||||||
item->m_EpsilonR = substrate.m_EpsilonR;
|
item->SetEpsilonR( substrate.m_EpsilonR );
|
||||||
item->m_LossTangent = substrate.m_LossTangent;
|
item->SetLossTangent( substrate.m_LossTangent );
|
||||||
|
|
||||||
wxTextCtrl* textCtrl;
|
wxTextCtrl* textCtrl;
|
||||||
textCtrl = static_cast<wxTextCtrl*>( m_rowUiItemsList[row].m_MaterialCtrl );
|
textCtrl = static_cast<wxTextCtrl*>( m_rowUiItemsList[row].m_MaterialCtrl );
|
||||||
textCtrl->SetValue( item->m_Material );
|
textCtrl->SetValue( item->GetMaterial() );
|
||||||
|
|
||||||
// some layers have a material choice but not EpsilonR ctrl
|
// some layers have a material choice but not EpsilonR ctrl
|
||||||
if( item->HasEpsilonRValue() )
|
if( item->HasEpsilonRValue() )
|
||||||
@ -1088,7 +1184,7 @@ void PANEL_SETUP_BOARD_STACKUP::onThicknessChange( wxCommandEvent& event )
|
|||||||
wxString value = event.GetString();
|
wxString value = event.GetString();
|
||||||
|
|
||||||
BOARD_STACKUP_ITEM* item = GetStackupItem( row );
|
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 );
|
BOARD_STACKUP_ITEM* layer = GetStackupItem( aRow );
|
||||||
wxColor color;
|
wxColor color;
|
||||||
|
|
||||||
switch( layer->m_Type )
|
switch( layer->GetType() )
|
||||||
{
|
{
|
||||||
case BS_ITEM_TYPE_COPPER:
|
case BS_ITEM_TYPE_COPPER:
|
||||||
color = copperColor;
|
color = copperColor;
|
||||||
@ -1176,10 +1272,10 @@ wxBitmapComboBox* PANEL_SETUP_BOARD_STACKUP::createBmComboBox( BOARD_STACKUP_ITE
|
|||||||
label = wxGetTranslation( item.m_ColorName );
|
label = wxGetTranslation( item.m_ColorName );
|
||||||
else // Append the user color, if specified, else add a default user color
|
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 );
|
curr_color = wxColour( aStackupItem->GetColor() );
|
||||||
label = aStackupItem->m_Color;
|
label = aStackupItem->GetColor();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
label = curr_color.GetAsString( wxC2S_HTML_SYNTAX );
|
label = curr_color.GetAsString( wxC2S_HTML_SYNTAX );
|
||||||
|
@ -48,6 +48,7 @@ class PANEL_SETUP_LAYERS;
|
|||||||
// row by row
|
// row by row
|
||||||
struct BOARD_STACKUP_ROW_UI_ITEM
|
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
|
bool m_isEnabled; // True if the row is in board
|
||||||
// false if not (this row is not shown on the panel)
|
// false if not (this row is not shown on the panel)
|
||||||
wxStaticBitmap* m_Icon; // Color icon in first column (column 1)
|
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_EpsilonCtrl; // control shown in column 8
|
||||||
wxControl* m_LossTgCtrl; // control shown in column 9
|
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_isEnabled( true ), m_Icon( nullptr ), m_LayerName( nullptr ),
|
||||||
m_LayerTypeCtrl( nullptr ),
|
m_LayerTypeCtrl( nullptr ),
|
||||||
m_MaterialCtrl( nullptr ),m_MaterialButt( nullptr ),
|
m_MaterialCtrl( nullptr ),m_MaterialButt( nullptr ),
|
||||||
@ -141,13 +143,16 @@ private:
|
|||||||
*/
|
*/
|
||||||
bool transferDataFromUIToStackup();
|
bool transferDataFromUIToStackup();
|
||||||
|
|
||||||
void onUpdateThicknessValue( wxUpdateUIEvent& event ) override;
|
void onUpdateThicknessValue( wxUpdateUIEvent& event ) override;
|
||||||
void onCalculateDielectricThickness( wxCommandEvent& event ) override;
|
void onCalculateDielectricThickness( wxCommandEvent& event ) override;
|
||||||
|
|
||||||
void onColorSelected( wxCommandEvent& event );
|
void onColorSelected( wxCommandEvent& event );
|
||||||
void onMaterialChange( wxCommandEvent& event );
|
void onMaterialChange( wxCommandEvent& event );
|
||||||
void onThicknessChange( wxCommandEvent& event );
|
void onThicknessChange( wxCommandEvent& event );
|
||||||
void onExportToClipboard( wxCommandEvent& event ) override;
|
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)
|
/** Update the icons color (swatches in first grid column)
|
||||||
* @param aRow is the row (index in m_rowUiItemsList) that manages the icon to update.
|
* @param aRow is the row (index in m_rowUiItemsList) that manages the icon to update.
|
||||||
|
@ -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 );
|
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;
|
wxStaticBoxSizer* sbSizerBrdOptions;
|
||||||
sbSizerBrdOptions = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Board Finish") ), wxVERTICAL );
|
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 );
|
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 );
|
m_cbEgdesPlated = new wxCheckBox( sbSizerBrdOptions->GetStaticBox(), wxID_ANY, _("Plated board edge"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
sbSizerBrdOptions->Add( m_cbEgdesPlated, 0, wxBOTTOM, 5 );
|
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 );
|
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 );
|
m_buttonExport = new wxButton( this, wxID_ANY, _("Export to Clipboard"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
bSizerRight->Add( m_buttonExport, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 );
|
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->SetSizer( bMainSizer );
|
||||||
this->Layout();
|
this->Layout();
|
||||||
bMainSizer->Fit( this );
|
|
||||||
|
|
||||||
// Connect Events
|
// Connect Events
|
||||||
m_thicknessCtrl->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onUpdateThicknessValue ), NULL, this );
|
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_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 );
|
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
|
// Disconnect Events
|
||||||
m_thicknessCtrl->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onUpdateThicknessValue ), NULL, this );
|
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_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 );
|
m_buttonExport->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SETUP_BOARD_STACKUP_BASE::onExportToClipboard ), NULL, this );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="name">PANEL_SETUP_BOARD_STACKUP_BASE</property>
|
<property name="name">PANEL_SETUP_BOARD_STACKUP_BASE</property>
|
||||||
<property name="pos"></property>
|
<property name="pos"></property>
|
||||||
<property name="size">-1,-1</property>
|
<property name="size">670,420</property>
|
||||||
<property name="subclass">; ; forward_declare</property>
|
<property name="subclass">; ; forward_declare</property>
|
||||||
<property name="tooltip"></property>
|
<property name="tooltip"></property>
|
||||||
<property name="window_extra_style"></property>
|
<property name="window_extra_style"></property>
|
||||||
@ -1184,8 +1184,213 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND|wxRIGHT</property>
|
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||||
<property name="proportion">1</property>
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxButton" expanded="1">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="bitmap"></property>
|
||||||
|
<property name="caption"></property>
|
||||||
|
<property name="caption_visible">1</property>
|
||||||
|
<property name="center_pane">0</property>
|
||||||
|
<property name="close_button">1</property>
|
||||||
|
<property name="context_help"></property>
|
||||||
|
<property name="context_menu">1</property>
|
||||||
|
<property name="current"></property>
|
||||||
|
<property name="default">0</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="disabled"></property>
|
||||||
|
<property name="dock">Dock</property>
|
||||||
|
<property name="dock_fixed">0</property>
|
||||||
|
<property name="docking">Left</property>
|
||||||
|
<property name="enabled">1</property>
|
||||||
|
<property name="fg"></property>
|
||||||
|
<property name="floatable">1</property>
|
||||||
|
<property name="focus"></property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Add Dielectric Layer</property>
|
||||||
|
<property name="margins"></property>
|
||||||
|
<property name="markup">0</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></property>
|
||||||
|
<property name="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_buttonAddDielectricLayer</property>
|
||||||
|
<property name="pane_border">1</property>
|
||||||
|
<property name="pane_position"></property>
|
||||||
|
<property name="pane_size"></property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="pin_button">1</property>
|
||||||
|
<property name="pos"></property>
|
||||||
|
<property name="position"></property>
|
||||||
|
<property name="pressed"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style"></property>
|
||||||
|
<property name="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<property name="validator_data_type"></property>
|
||||||
|
<property name="validator_style">wxFILTER_NONE</property>
|
||||||
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
<property name="validator_variable"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
<event name="OnButtonClick">onAddDielectricLayer</event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxButton" expanded="1">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="bitmap"></property>
|
||||||
|
<property name="caption"></property>
|
||||||
|
<property name="caption_visible">1</property>
|
||||||
|
<property name="center_pane">0</property>
|
||||||
|
<property name="close_button">1</property>
|
||||||
|
<property name="context_help"></property>
|
||||||
|
<property name="context_menu">1</property>
|
||||||
|
<property name="current"></property>
|
||||||
|
<property name="default">0</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="disabled"></property>
|
||||||
|
<property name="dock">Dock</property>
|
||||||
|
<property name="dock_fixed">0</property>
|
||||||
|
<property name="docking">Left</property>
|
||||||
|
<property name="enabled">1</property>
|
||||||
|
<property name="fg"></property>
|
||||||
|
<property name="floatable">1</property>
|
||||||
|
<property name="focus"></property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Remove Dielectric Layer</property>
|
||||||
|
<property name="margins"></property>
|
||||||
|
<property name="markup">0</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></property>
|
||||||
|
<property name="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_buttonRemoveDielectricLayer</property>
|
||||||
|
<property name="pane_border">1</property>
|
||||||
|
<property name="pane_position"></property>
|
||||||
|
<property name="pane_size"></property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="pin_button">1</property>
|
||||||
|
<property name="pos"></property>
|
||||||
|
<property name="position"></property>
|
||||||
|
<property name="pressed"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style"></property>
|
||||||
|
<property name="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<property name="validator_data_type"></property>
|
||||||
|
<property name="validator_style">wxFILTER_NONE</property>
|
||||||
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
<property name="validator_variable"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
<event name="OnButtonClick">onRemoveDielectricLayer</event>
|
||||||
|
<event name="OnUpdateUI">onRemoveDielUI</event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxStaticLine" expanded="1">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="caption"></property>
|
||||||
|
<property name="caption_visible">1</property>
|
||||||
|
<property name="center_pane">0</property>
|
||||||
|
<property name="close_button">1</property>
|
||||||
|
<property name="context_help"></property>
|
||||||
|
<property name="context_menu">1</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="dock">Dock</property>
|
||||||
|
<property name="dock_fixed">0</property>
|
||||||
|
<property name="docking">Left</property>
|
||||||
|
<property name="enabled">1</property>
|
||||||
|
<property name="fg"></property>
|
||||||
|
<property name="floatable">1</property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></property>
|
||||||
|
<property name="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_staticline2</property>
|
||||||
|
<property name="pane_border">1</property>
|
||||||
|
<property name="pane_position"></property>
|
||||||
|
<property name="pane_size"></property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="pin_button">1</property>
|
||||||
|
<property name="pos"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style">wxLI_HORIZONTAL</property>
|
||||||
|
<property name="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxEXPAND|wxTOP|wxRIGHT</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
<object class="wxStaticBoxSizer" expanded="1">
|
<object class="wxStaticBoxSizer" expanded="1">
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
<property name="label">Board Finish</property>
|
<property name="label">Board Finish</property>
|
||||||
@ -1196,7 +1401,7 @@
|
|||||||
<property name="permission">none</property>
|
<property name="permission">none</property>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxBOTTOM</property>
|
<property name="flag">wxTOP|wxBOTTOM</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxCheckBox" expanded="1">
|
<object class="wxCheckBox" expanded="1">
|
||||||
<property name="BottomDockable">1</property>
|
<property name="BottomDockable">1</property>
|
||||||
@ -1574,6 +1779,16 @@
|
|||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxEXPAND</property>
|
||||||
|
<property name="proportion">1</property>
|
||||||
|
<object class="spacer" expanded="1">
|
||||||
|
<property name="height">0</property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="width">0</property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property>
|
<property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property>
|
||||||
|
@ -61,6 +61,9 @@ class PANEL_SETUP_BOARD_STACKUP_BASE : public wxPanel
|
|||||||
wxStaticText* m_staticTextEpsilonR;
|
wxStaticText* m_staticTextEpsilonR;
|
||||||
wxStaticText* m_staticTextLossTg;
|
wxStaticText* m_staticTextLossTg;
|
||||||
wxRadioBox* m_rbDielectricConstraint;
|
wxRadioBox* m_rbDielectricConstraint;
|
||||||
|
wxButton* m_buttonAddDielectricLayer;
|
||||||
|
wxButton* m_buttonRemoveDielectricLayer;
|
||||||
|
wxStaticLine* m_staticline2;
|
||||||
wxCheckBox* m_cbCastellatedPads;
|
wxCheckBox* m_cbCastellatedPads;
|
||||||
wxCheckBox* m_cbEgdesPlated;
|
wxCheckBox* m_cbEgdesPlated;
|
||||||
wxStaticText* m_staticTextFinish;
|
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 event handlers, overide them in your derived class
|
||||||
virtual void onUpdateThicknessValue( wxUpdateUIEvent& event ) { event.Skip(); }
|
virtual void onUpdateThicknessValue( wxUpdateUIEvent& event ) { event.Skip(); }
|
||||||
virtual void onCalculateDielectricThickness( wxCommandEvent& 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(); }
|
virtual void onExportToClipboard( wxCommandEvent& event ) { event.Skip(); }
|
||||||
|
|
||||||
|
|
||||||
public:
|
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();
|
~PANEL_SETUP_BOARD_STACKUP_BASE();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -614,31 +614,31 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup()
|
|||||||
for( int ii = 0; ii < brd_stackup.GetCount(); ++ii )
|
for( int ii = 0; ii < brd_stackup.GetCount(); ++ii )
|
||||||
{
|
{
|
||||||
BOARD_STACKUP_ITEM* item = brd_stackup.GetStackupLayer( 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;
|
wxString layer_type;
|
||||||
std::string layer_name; // for comment
|
std::string layer_name; // for comment
|
||||||
|
|
||||||
switch( item->m_Type )
|
switch( item->GetType() )
|
||||||
{
|
{
|
||||||
case BS_ITEM_TYPE_COPPER:
|
case BS_ITEM_TYPE_COPPER:
|
||||||
layer_type = "Copper";
|
layer_type = "Copper";
|
||||||
layer_name = formatStringFromUTF32( m_pcb->GetLayerName( item->m_LayerId ) );
|
layer_name = formatStringFromUTF32( m_pcb->GetLayerName( item->GetBrdLayerId() ) );
|
||||||
last_copper_layer = item->m_LayerId;
|
last_copper_layer = item->GetBrdLayerId();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_SILKSCREEN:
|
case BS_ITEM_TYPE_SILKSCREEN:
|
||||||
layer_type = "Legend";
|
layer_type = "Legend";
|
||||||
layer_name = formatStringFromUTF32( item->m_TypeName );
|
layer_name = formatStringFromUTF32( item->GetTypeName() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_SOLDERMASK:
|
case BS_ITEM_TYPE_SOLDERMASK:
|
||||||
layer_type = "SolderMask";
|
layer_type = "SolderMask";
|
||||||
layer_name = formatStringFromUTF32( item->m_TypeName );
|
layer_name = formatStringFromUTF32( item->GetTypeName() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_SOLDERPASTE:
|
case BS_ITEM_TYPE_SOLDERPASTE:
|
||||||
layer_type = "SolderPaste";
|
layer_type = "SolderPaste";
|
||||||
layer_name = formatStringFromUTF32( item->m_TypeName );
|
layer_name = formatStringFromUTF32( item->GetTypeName() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BS_ITEM_TYPE_DIELECTRIC:
|
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
|
// The option core or prepreg is not added here, as it creates constraints
|
||||||
// in build process, not necessary wanted.
|
// in build process, not necessary wanted.
|
||||||
layer_name = formatStringFromUTF32( wxString::Format( "dielectric layer %d",
|
layer_name = formatStringFromUTF32( wxString::Format( "dielectric layer %d",
|
||||||
item->m_DielectricLayerId ) );
|
item->GetDielectricLayerId() ) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -658,9 +658,9 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup()
|
|||||||
|
|
||||||
if( item->IsColorEditable() && uptodate )
|
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.
|
if( colorName.StartsWith( "#" ) ) // This is a user defined color.
|
||||||
{
|
{
|
||||||
@ -676,11 +676,11 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup()
|
|||||||
if( item->IsThicknessEditable() && uptodate )
|
if( item->IsThicknessEditable() && uptodate )
|
||||||
addJSONObject( wxString::Format( "\"Thickness\": %.3f,\n", thickness ) );
|
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() )
|
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.
|
// These constrains are only written if the board has impedance controlled tracks.
|
||||||
// If the board is not impedance controlled, they are useless.
|
// 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
|
// Generate Epsilon R if > 1.0 (value <= 1.0 means not specified: it is not
|
||||||
// a possible value
|
// a possible value
|
||||||
if( item->m_EpsilonR > 1.0 )
|
if( item->GetEpsilonR() > 1.0 )
|
||||||
addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n", item->FormatEpsilonR() ) );
|
addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n",
|
||||||
|
item->FormatEpsilonR() ) );
|
||||||
|
|
||||||
// Generate LossTangent > 0.0 (value <= 0.0 means not specified: it is not
|
// Generate LossTangent > 0.0 (value <= 0.0 means not specified: it is not
|
||||||
// a possible value
|
// a possible value
|
||||||
if( item->m_LossTangent > 0.0 )
|
if( item->GetLossTangent() > 0.0 )
|
||||||
addJSONObject( wxString::Format( "\"LossTangent\": %s,\n", item->FormatLossTangent() ) );
|
addJSONObject( wxString::Format( "\"LossTangent\": %s,\n",
|
||||||
|
item->FormatLossTangent() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,11 +724,11 @@ void GERBER_JOBFILE_WRITER::addJSONMaterialStackup()
|
|||||||
|
|
||||||
addJSONObject( note );
|
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() )
|
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.
|
// These constrains are only written if the board has impedance controlled tracks.
|
||||||
// If the board is not impedance controlled, they are useless.
|
// 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
|
// Generate Epsilon R if > 1.0 (value <= 1.0 means not specified: it is not
|
||||||
// a possible value
|
// a possible value
|
||||||
if( item->m_EpsilonR > 1.0 )
|
if( item->GetEpsilonR() > 1.0 )
|
||||||
addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n", item->FormatEpsilonR() ) );
|
addJSONObject( wxString::Format( "\"DielectricConstant\": %s,\n",
|
||||||
|
item->FormatEpsilonR() ) );
|
||||||
|
|
||||||
// Generate LossTangent > 0.0 (value <= 0.0 means not specified: it is not
|
// Generate LossTangent > 0.0 (value <= 0.0 means not specified: it is not
|
||||||
// a possible value
|
// a possible value
|
||||||
if( item->m_LossTangent > 0.0 )
|
if( item->GetLossTangent() > 0.0 )
|
||||||
addJSONObject( wxString::Format( "\"LossTangent\": %s,\n", item->FormatLossTangent() ) );
|
addJSONObject( wxString::Format( "\"LossTangent\": %s,\n",
|
||||||
|
item->FormatLossTangent() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ void PCB_PARSER::init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_layerMasks[ "*.Cu" ] = LSET::AllCuMask();
|
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[ "F&B.Cu" ] = LSET( 2, F_Cu, B_Cu );
|
||||||
m_layerMasks[ "*.Adhes" ] = LSET( 2, B_Adhes, F_Adhes );
|
m_layerMasks[ "*.Adhes" ] = LSET( 2, B_Adhes, F_Adhes );
|
||||||
m_layerMasks[ "*.Paste" ] = LSET( 2, B_Paste, F_Paste );
|
m_layerMasks[ "*.Paste" ] = LSET( 2, B_Paste, F_Paste );
|
||||||
@ -591,7 +591,7 @@ BOARD* PCB_PARSER::parseBOARD_unchecked()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case T_zone:
|
case T_zone:
|
||||||
m_board->Add( parseZONE_CONTAINER( m_board ), ADD_APPEND );
|
m_board->Add( parseZONE_CONTAINER( m_board ), ADD_APPEND );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_target:
|
case T_target:
|
||||||
@ -1065,10 +1065,10 @@ void PCB_PARSER::parseBoardStackup()
|
|||||||
if( type != BS_ITEM_TYPE_UNDEFINED )
|
if( type != BS_ITEM_TYPE_UNDEFINED )
|
||||||
{
|
{
|
||||||
item = new BOARD_STACKUP_ITEM( type );
|
item = new BOARD_STACKUP_ITEM( type );
|
||||||
item->m_LayerId = layerId;
|
item->SetBrdLayerId( layerId );
|
||||||
|
|
||||||
if( type == BS_ITEM_TYPE_DIELECTRIC )
|
if( type == BS_ITEM_TYPE_DIELECTRIC )
|
||||||
item->m_DielectricLayerId = dielectric_idx++;
|
item->SetDielectricLayerId( dielectric_idx++ );
|
||||||
|
|
||||||
stackup.Add( item );
|
stackup.Add( item );
|
||||||
}
|
}
|
||||||
@ -1088,15 +1088,17 @@ void PCB_PARSER::parseBoardStackup()
|
|||||||
{
|
{
|
||||||
case T_type:
|
case T_type:
|
||||||
NeedSYMBOL();
|
NeedSYMBOL();
|
||||||
item->m_TypeName = FromUTF8();
|
item->SetTypeName( FromUTF8() );
|
||||||
NeedRIGHT();
|
NeedRIGHT();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_thickness:
|
case T_thickness:
|
||||||
item->m_Thickness = parseBoardUnits( T_thickness );
|
item->SetThickness( parseBoardUnits( T_thickness ) );
|
||||||
token = NextTok();
|
token = NextTok();
|
||||||
|
|
||||||
if( token == T_LEFT )
|
if( token == T_LEFT )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if( token == T_locked )
|
if( token == T_locked )
|
||||||
{
|
{
|
||||||
thickness_locked = true;
|
thickness_locked = true;
|
||||||
@ -1106,25 +1108,25 @@ void PCB_PARSER::parseBoardStackup()
|
|||||||
|
|
||||||
case T_material:
|
case T_material:
|
||||||
NeedSYMBOL();
|
NeedSYMBOL();
|
||||||
item->m_Material = FromUTF8();
|
item->SetMaterial( FromUTF8() );
|
||||||
NeedRIGHT();
|
NeedRIGHT();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_epsilon_r:
|
case T_epsilon_r:
|
||||||
NextTok();
|
NextTok();
|
||||||
item->m_EpsilonR = parseDouble();
|
item->SetEpsilonR( parseDouble() );
|
||||||
NeedRIGHT();
|
NeedRIGHT();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_loss_tangent:
|
case T_loss_tangent:
|
||||||
NextTok();
|
NextTok();
|
||||||
item->m_LossTangent = parseDouble();
|
item->SetLossTangent( parseDouble() );
|
||||||
NeedRIGHT();
|
NeedRIGHT();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_color:
|
case T_color:
|
||||||
NeedSYMBOL();
|
NeedSYMBOL();
|
||||||
item->m_Color = FromUTF8();
|
item->SetColor( FromUTF8() );
|
||||||
NeedRIGHT();
|
NeedRIGHT();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1138,7 +1140,7 @@ void PCB_PARSER::parseBoardStackup()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( type == BS_ITEM_TYPE_DIELECTRIC && thickness_locked )
|
if( type == BS_ITEM_TYPE_DIELECTRIC && thickness_locked )
|
||||||
item->m_ThicknessLocked = true;
|
item->SetThicknessLocked( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( token != T_RIGHT )
|
if( token != T_RIGHT )
|
||||||
@ -2512,21 +2514,21 @@ MODULE* PCB_PARSER::parseMODULE_unchecked( wxArrayString* aInitialComments )
|
|||||||
module->Add3DModel( parse3DModel() );
|
module->Add3DModel( parse3DModel() );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_zone:
|
case T_zone:
|
||||||
{
|
{
|
||||||
ZONE_CONTAINER* zone = parseZONE_CONTAINER( module.get() );
|
ZONE_CONTAINER* zone = parseZONE_CONTAINER( module.get() );
|
||||||
module->Add( zone, ADD_APPEND );
|
module->Add( zone, ADD_APPEND );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Expecting(
|
Expecting(
|
||||||
"locked, placed, tedit, tstamp, at, descr, tags, path, "
|
"locked, placed, tedit, tstamp, at, descr, tags, path, "
|
||||||
"autoplace_cost90, autoplace_cost180, solder_mask_margin, "
|
"autoplace_cost90, autoplace_cost180, solder_mask_margin, "
|
||||||
"solder_paste_margin, solder_paste_ratio, clearance, "
|
"solder_paste_margin, solder_paste_ratio, clearance, "
|
||||||
"zone_connect, thermal_width, thermal_gap, attr, fp_text, "
|
"zone_connect, thermal_width, thermal_gap, attr, fp_text, "
|
||||||
"fp_arc, fp_circle, fp_curve, fp_line, fp_poly, pad, "
|
"fp_arc, fp_circle, fp_curve, fp_line, fp_poly, pad, "
|
||||||
"zone, or model" );
|
"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,
|
wxCHECK_MSG( CurTok() == T_zone, NULL,
|
||||||
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) +
|
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) +
|
||||||
|
Loading…
x
Reference in New Issue
Block a user