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:
Seth Hillbrand 2021-02-02 10:50:41 -08:00
parent ea08f1b8cb
commit 22d78a5827
1 changed files with 42 additions and 12 deletions

View File

@ -189,7 +189,10 @@ FABMASTER::section_type FABMASTER::detectType( size_t aOffset )
if( row1 == "LAYERSORT" )
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;
}
@ -546,6 +549,10 @@ size_t FABMASTER::processPadStacks( size_t aRow )
{
pad->shape = PAD_SHAPE_RECT;
}
else if( pad_shape == "ROUNDED_RECT" )
{
pad->shape = PAD_SHAPE_ROUNDRECT;
}
else if( pad_shape == "SQUARE" )
{
pad->shape = PAD_SHAPE_RECT;
@ -565,8 +572,8 @@ size_t FABMASTER::processPadStacks( size_t aRow )
}
else
{
wxLogError( wxString::Format( _( "Unknown pad shape name %s at line %zu" ),
pad_shapename.c_str(), rownum ) );
wxLogError( wxString::Format( _( "Unknown pad shape name '%s' on layer '%s' at line %zu" ),
pad_shape.c_str(), pad_layer.c_str(), rownum ) );
continue;
}
}
@ -2084,7 +2091,11 @@ bool FABMASTER::loadFootprints( BOARD* aBoard )
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;
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
// 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;
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( src->mirror )
poly_outline.Rotate( ( -src->rotate + pin->rotation ) * M_PI / 180.0 );
if( poly_outline.OutlineCount() < 1
|| poly_outline.Outline( 0 ).PointCount() < 3 )
{
wxLogError( wxString::Format(
_( "Invalid custom pad named '%s'. Replacing with circlular pad." ),
custom_name.c_str() ) );
newpad->SetShape( PAD_SHAPE_CIRCLE );
}
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