FABMASTER: Handle flipped custom pads and rounded rects
Adds error messages for more cases and fallback for custom pads to prevent invalid pad generation
This commit is contained in:
parent
ea08f1b8cb
commit
22d78a5827
|
@ -189,7 +189,10 @@ FABMASTER::section_type FABMASTER::detectType( size_t aOffset )
|
||||||
if( row1 == "LAYERSORT" )
|
if( row1 == "LAYERSORT" )
|
||||||
return EXTRACT_FULL_LAYERS;
|
return EXTRACT_FULL_LAYERS;
|
||||||
|
|
||||||
std::cout << "UNKNOWN Columns " << row1 << " : " << row2 << std::endl;
|
wxLogError
|
||||||
|
(
|
||||||
|
wxString::Format( _( "Unknown FABMASTER section %s:%s at row %zu." ), row1.c_str(),
|
||||||
|
row2.c_str(), aOffset ) );
|
||||||
return UNKNOWN_EXTRACT;
|
return UNKNOWN_EXTRACT;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -546,6 +549,10 @@ size_t FABMASTER::processPadStacks( size_t aRow )
|
||||||
{
|
{
|
||||||
pad->shape = PAD_SHAPE_RECT;
|
pad->shape = PAD_SHAPE_RECT;
|
||||||
}
|
}
|
||||||
|
else if( pad_shape == "ROUNDED_RECT" )
|
||||||
|
{
|
||||||
|
pad->shape = PAD_SHAPE_ROUNDRECT;
|
||||||
|
}
|
||||||
else if( pad_shape == "SQUARE" )
|
else if( pad_shape == "SQUARE" )
|
||||||
{
|
{
|
||||||
pad->shape = PAD_SHAPE_RECT;
|
pad->shape = PAD_SHAPE_RECT;
|
||||||
|
@ -565,8 +572,8 @@ size_t FABMASTER::processPadStacks( size_t aRow )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxLogError( wxString::Format( _( "Unknown pad shape name %s at line %zu" ),
|
wxLogError( wxString::Format( _( "Unknown pad shape name '%s' on layer '%s' at line %zu" ),
|
||||||
pad_shapename.c_str(), rownum ) );
|
pad_shape.c_str(), pad_layer.c_str(), rownum ) );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2084,7 +2091,11 @@ bool FABMASTER::loadFootprints( BOARD* aBoard )
|
||||||
|
|
||||||
if( pad.shape == PAD_SHAPE_CUSTOM )
|
if( pad.shape == PAD_SHAPE_CUSTOM )
|
||||||
{
|
{
|
||||||
newpad->SetSize( wxSize( pad.width / 2, pad.height / 2 ) );
|
// Choose the smaller dimension to ensure the base pad
|
||||||
|
// is fully hidden by the custom pad
|
||||||
|
int pad_size = std::min( pad.width, pad.height );
|
||||||
|
|
||||||
|
newpad->SetSize( wxSize( pad_size / 2, pad_size / 2 ) );
|
||||||
|
|
||||||
std::string custom_name = pad.custom_name + "_" + pin->refdes + "_" + pin->pin_number;
|
std::string custom_name = pad.custom_name + "_" + pin->refdes + "_" + pin->pin_number;
|
||||||
auto custom_it = pad_shapes.find( custom_name );
|
auto custom_it = pad_shapes.find( custom_name );
|
||||||
|
@ -2104,7 +2115,9 @@ bool FABMASTER::loadFootprints( BOARD* aBoard )
|
||||||
{
|
{
|
||||||
// For now, we are only processing the custom pad for the top layer
|
// For now, we are only processing the custom pad for the top layer
|
||||||
// TODO: Use full padstacks when implementing in KiCad
|
// TODO: Use full padstacks when implementing in KiCad
|
||||||
if( getLayer( ( *( el.second.begin() ) )->layer ) != F_Cu )
|
PCB_LAYER_ID primary_layer = src->mirror ? B_Cu : F_Cu;
|
||||||
|
|
||||||
|
if( getLayer( ( *( el.second.begin() ) )->layer ) != primary_layer )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for( const auto& seg : el.second )
|
for( const auto& seg : el.second )
|
||||||
|
@ -2133,16 +2146,33 @@ bool FABMASTER::loadFootprints( BOARD* aBoard )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
poly_outline.Fracture( SHAPE_POLY_SET::POLYGON_MODE::PM_FAST );
|
|
||||||
|
|
||||||
poly_outline.Move( -newpad->GetPosition() );
|
if( poly_outline.OutlineCount() < 1
|
||||||
|
|| poly_outline.Outline( 0 ).PointCount() < 3 )
|
||||||
if( src->mirror )
|
{
|
||||||
poly_outline.Rotate( ( -src->rotate + pin->rotation ) * M_PI / 180.0 );
|
wxLogError( wxString::Format(
|
||||||
|
_( "Invalid custom pad named '%s'. Replacing with circlular pad." ),
|
||||||
|
custom_name.c_str() ) );
|
||||||
|
newpad->SetShape( PAD_SHAPE_CIRCLE );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
poly_outline.Rotate( ( src->rotate - pin->rotation ) * M_PI / 180.0 );
|
{
|
||||||
|
poly_outline.Fracture( SHAPE_POLY_SET::POLYGON_MODE::PM_FAST );
|
||||||
|
|
||||||
newpad->AddPrimitivePoly( poly_outline, 0, true );
|
poly_outline.Move( -newpad->GetPosition() );
|
||||||
|
|
||||||
|
if( src->mirror )
|
||||||
|
poly_outline.Rotate( ( -src->rotate + pin->rotation ) * M_PI / 180.0 );
|
||||||
|
else
|
||||||
|
poly_outline.Rotate( ( src->rotate - pin->rotation ) * M_PI / 180.0 );
|
||||||
|
|
||||||
|
newpad->AddPrimitivePoly( poly_outline, 0, true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxLogError( wxString::Format( _( "Could not find custom pad named %s" ),
|
||||||
|
custom_name.c_str() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue