3D viewer: apply patch from master 04d6ea982.

The 3D viewer does not show the issue on solder paste layer having
negative clearance.
However the bug was here and not seen just because some draw code was different:
The code tried to draw outlines with segments having a negative thickness.
It happens mainly on solder paste layers.
This commit is contained in:
jean-pierre charras 2020-03-27 10:30:03 +01:00
parent 6b2a8f54a1
commit 85fa6d8025
1 changed files with 30 additions and 14 deletions

View File

@ -386,9 +386,22 @@ void CINFO3D_VISU::createNewPadWithClearance( const D_PAD* aPad,
case PAD_SHAPE_RECT: case PAD_SHAPE_RECT:
{ {
// see pcbnew/board_items_to_polygon_shape_transform.cpp // see pcbnew/board_items_to_polygon_shape_transform.cpp
wxPoint corners[4]; wxPoint corners[4];
aPad->BuildPadPolygon( corners, aClearanceValue, aPad->GetOrientation() ); bool drawOutline;
// For aClearanceValue.x == aClearanceValue.y and > 0 we use the pad shape
// and draw outlines with thicknes = aClearanceValue.
// Otherwise we draw only the inflated/deflated shape
if( aClearanceValue.x > 0 && aClearanceValue.x == aClearanceValue.y )
{
drawOutline = true;
aPad->BuildPadPolygon( corners, wxSize( 0, 0 ), aPad->GetOrientation() );
}
else
{
drawOutline = false;
aPad->BuildPadPolygon( corners, aClearanceValue, aPad->GetOrientation() );
}
SFVEC2F corners3DU[4]; SFVEC2F corners3DU[4];
@ -416,20 +429,23 @@ void CINFO3D_VISU::createNewPadWithClearance( const D_PAD* aPad,
// Add the PAD contours // Add the PAD contours
// Round segments cannot have 0-length elements, so we approximate them // Round segments cannot have 0-length elements, so we approximate them
// as a small circle // as a small circle
for( int i = 1; i <= 4; i++ ) if( drawOutline )
{ {
if( Is_segment_a_circle( corners3DU[i - 1], corners3DU[i & 3] ) ) for( int i = 1; i <= 4; i++ )
{ {
aDstContainer->Add( new CFILLEDCIRCLE2D( corners3DU[i - 1], if( Is_segment_a_circle( corners3DU[i - 1], corners3DU[i & 3] ) )
aClearanceValue.x * m_biuTo3Dunits, {
*aPad ) ); aDstContainer->Add( new CFILLEDCIRCLE2D( corners3DU[i - 1],
} aClearanceValue.x * m_biuTo3Dunits,
else *aPad ) );
{ }
aDstContainer->Add( new CROUNDSEGMENT2D( corners3DU[i - 1], else
corners3DU[i & 3], {
aClearanceValue.x * 2.0f * m_biuTo3Dunits, aDstContainer->Add( new CROUNDSEGMENT2D( corners3DU[i - 1],
*aPad ) ); corners3DU[i & 3],
aClearanceValue.x * 2.0f * m_biuTo3Dunits,
*aPad ) );
}
} }
} }
} }