Eagle PCB import: handle 'roundness' DRC rule (SMD rounded rectangles)

Fixes: lp:1754138
* https://bugs.launchpad.net/kicad/+bug/1754138
This commit is contained in:
Maciej Suminski 2018-03-14 10:06:40 +01:00
parent 5896723c60
commit d432a985ab
2 changed files with 27 additions and 2 deletions

View File

@ -135,6 +135,13 @@ void ERULES::parse( wxXmlNode* aRules )
else if( name == "mlMaxCreamFrame" )
mlMaxCreamFrame = parseEagle( value );
else if( name == "srRoundness" )
value.ToDouble( &srRoundness );
else if( name == "srMinRoundness" )
srMinRoundness = parseEagle( value );
else if( name == "srMaxRoundness" )
srMaxRoundness = parseEagle( value );
else if( name == "rvPadTop" )
value.ToDouble( &rvPadTop );
else if( name == "rlMinPadTop" )
@ -1660,12 +1667,22 @@ void EAGLE_PLUGIN::packageSMD( MODULE* aModule, wxXmlNode* aTree ) const
else if( layer == B_Cu )
pad->SetLayerSet( back );
int minPadSize = std::min( padSize.x, padSize.y );
// Rounded rectangle pads
if( e.roundness )
int roundRadius = Clamp( m_rules->srMinRoundness * 2,
(int)( minPadSize * m_rules->srRoundness ), m_rules->srMaxRoundness * 2 );
if( e.roundness || roundRadius > 0 )
{
double roundRatio = (double) roundRadius / minPadSize / 2.0;
// Eagle uses a different definition of roundness, hence division by 200
pad->SetRoundRectRadiusRatio( *e.roundness / 200.0 );
if( e.roundness )
roundRatio = std::fmax( *e.roundness / 200.0, roundRatio );
pad->SetShape( PAD_SHAPE_ROUNDRECT );
pad->SetRoundRectRadiusRatio( roundRatio );
}
if( e.rot )

View File

@ -54,6 +54,10 @@ struct ERULES
int mlMinCreamFrame; ///< solder paste mask, minimum size (Eagle mils, here nanometers)
int mlMaxCreamFrame; ///< solder paste mask, maximum size (Eagle mils, here nanometers)
double srRoundness; ///< corner rounding ratio for SMD pads (percentage)
int srMinRoundness; ///< corner rounding radius, minimum size (Eagle mils, here nanometers)
int srMaxRoundness; ///< corner rounding radius, maximum size (Eagle mils, here nanometers)
double rvPadTop; ///< top pad size as percent of drill size
// double rvPadBottom; ///< bottom pad size as percent of drill size
@ -77,6 +81,10 @@ struct ERULES
mlMinCreamFrame ( Mils2iu( 0.0 ) ),
mlMaxCreamFrame ( Mils2iu( 0.0 ) ),
srRoundness ( 0.0 ),
srMinRoundness ( Mils2iu( 0.0 ) ),
srMaxRoundness ( Mils2iu( 0.0 ) ),
rvPadTop ( 0.25 ),
// rvPadBottom ( 0.25 ),
rlMinPadTop ( Mils2iu( 10 ) ),