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