Commit e6b2f392 authored by jean-pierre charras's avatar jean-pierre charras

Fix minor issue relative to thermal shapes: better shape of thermal having removed stubs.

parent 3fed7b9d
......@@ -47,11 +47,11 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector<CPolyPt>& aCornerBuffe
biggest_clearance = MAX( biggest_clearance, zone_clearance );
zone_boundingbox.Inflate( biggest_clearance );
// Calculate thermal bridge half width
int iDTRC = aZone->m_ThermalReliefCopperBridgeValue / 2;
// half size of the pen used to draw/plot zones outlines
int pen_radius = aZone->m_ZoneMinThickness / 2;
// Calculate thermal bridge half width
int thermbridgeWidth = aZone->m_ThermalReliefCopperBridgeValue / 2;
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
{
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
......@@ -67,27 +67,38 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector<CPolyPt>& aCornerBuffe
if( !( item_boundingbox.Intersects( zone_boundingbox ) ) )
continue;
// test point
int dx = ( pad->m_Size.x / 2 ) + aZone->m_ThermalReliefGapValue;
int dy = ( pad->m_Size.y / 2 ) + aZone->m_ThermalReliefGapValue;
// Thermal bridges are like a segment from a starting point inside the pad
// to an ending point outside the pad
wxPoint startpoint, endpoint;
endpoint.x = ( pad->m_Size.x / 2 ) + aZone->m_ThermalReliefGapValue;
endpoint.y = ( pad->m_Size.y / 2 ) + aZone->m_ThermalReliefGapValue;
int copperThickness = aZone->m_ThermalReliefCopperBridgeValue - aZone->m_ZoneMinThickness;
if( copperThickness < 0 )
copperThickness = 0;
startpoint.x = min( pad->m_Size.x, copperThickness );
startpoint.y = min( pad->m_Size.y, copperThickness );
startpoint.x /= 2;
startpoint.y /= 2;
// This is CIRCLE pad tweak (for circle pads the thermal stubs are at 45 deg)
int fAngle = pad->m_Orient;
if( pad->m_PadShape == PAD_CIRCLE )
{
dx = (int) ( dx * aArcCorrection );
dy = dx;
endpoint.x = (int) ( endpoint.x * aArcCorrection );
endpoint.y = endpoint.x;
fAngle = aRoundPadThermalRotation;
}
// contour line width has to be taken into calculation to avoid "thermal stub bleed"
dx += pen_radius;
dy += pen_radius;
endpoint.x += pen_radius;
endpoint.y += pen_radius;
// compute north, south, west and east points for zone connection.
ptTest[0] = wxPoint( 0, dy );
ptTest[1] = wxPoint( 0, -dy );
ptTest[2] = wxPoint( dx, 0 );
ptTest[3] = wxPoint( -dx, 0 );
ptTest[0] = wxPoint( 0, endpoint.y ); // lower point
ptTest[1] = wxPoint( 0, -endpoint.y ); // upper point
ptTest[2] = wxPoint( endpoint.x, 0 ); // right point
ptTest[3] = wxPoint( -endpoint.x, 0 ); // left point
// Test all sides
for( int i = 0; i < 4; i++ )
......@@ -105,32 +116,32 @@ void BuildUnconnectedThermalStubsPolygonList( std::vector<CPolyPt>& aCornerBuffe
// polygons are rectangles with width of copper bridge value
switch( i )
{
case 0:
corners_buffer.push_back( wxPoint( -iDTRC, dy ) );
corners_buffer.push_back( wxPoint( +iDTRC, dy ) );
corners_buffer.push_back( wxPoint( +iDTRC, iDTRC ) );
corners_buffer.push_back( wxPoint( -iDTRC, iDTRC ) );
case 0: // lower stub
corners_buffer.push_back( wxPoint( -thermbridgeWidth, endpoint.y ) );
corners_buffer.push_back( wxPoint( +thermbridgeWidth, endpoint.y ) );
corners_buffer.push_back( wxPoint( +thermbridgeWidth, startpoint.y ) );
corners_buffer.push_back( wxPoint( -thermbridgeWidth, startpoint.y ) );
break;
case 1:
corners_buffer.push_back( wxPoint( -iDTRC, -dy ) );
corners_buffer.push_back( wxPoint( +iDTRC, -dy ) );
corners_buffer.push_back( wxPoint( +iDTRC, -iDTRC ) );
corners_buffer.push_back( wxPoint( -iDTRC, -iDTRC ) );
case 1: // upper stub
corners_buffer.push_back( wxPoint( -thermbridgeWidth, -endpoint.y ) );
corners_buffer.push_back( wxPoint( +thermbridgeWidth, -endpoint.y ) );
corners_buffer.push_back( wxPoint( +thermbridgeWidth, -startpoint.y ) );
corners_buffer.push_back( wxPoint( -thermbridgeWidth, -startpoint.y ) );
break;
case 2:
corners_buffer.push_back( wxPoint( dx, -iDTRC ) );
corners_buffer.push_back( wxPoint( dx, iDTRC ) );
corners_buffer.push_back( wxPoint( +iDTRC, iDTRC ) );
corners_buffer.push_back( wxPoint( +iDTRC, -iDTRC ) );
case 2: // right stub
corners_buffer.push_back( wxPoint( endpoint.x, -thermbridgeWidth ) );
corners_buffer.push_back( wxPoint( endpoint.x, thermbridgeWidth ) );
corners_buffer.push_back( wxPoint( +startpoint.x, thermbridgeWidth ) );
corners_buffer.push_back( wxPoint( +startpoint.x, -thermbridgeWidth ) );
break;
case 3:
corners_buffer.push_back( wxPoint( -dx, -iDTRC ) );
corners_buffer.push_back( wxPoint( -dx, iDTRC ) );
corners_buffer.push_back( wxPoint( -iDTRC, iDTRC ) );
corners_buffer.push_back( wxPoint( -iDTRC, -iDTRC ) );
case 3: // left stub
corners_buffer.push_back( wxPoint( -endpoint.x, -thermbridgeWidth ) );
corners_buffer.push_back( wxPoint( -endpoint.x, thermbridgeWidth ) );
corners_buffer.push_back( wxPoint( -startpoint.x, thermbridgeWidth ) );
corners_buffer.push_back( wxPoint( -startpoint.x, -thermbridgeWidth ) );
break;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment