BOARD::GetBoardPolygonOutlines(): add option to add NPTH as board holes.
Used in 3D viewer to truncate plated holes intersecting NPTH. Fixes #16325 https://gitlab.com/kicad/code/kicad/-/issues/16325
This commit is contained in:
parent
4b38af36ab
commit
427de4cda6
|
@ -898,7 +898,7 @@ bool BOARD_ADAPTER::createBoardPolygon( wxString* aErrorMsg )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
success = m_board->GetBoardPolygonOutlines( m_board_poly );
|
success = m_board->GetBoardPolygonOutlines( m_board_poly, nullptr, false, true );
|
||||||
|
|
||||||
if( !success && aErrorMsg )
|
if( !success && aErrorMsg )
|
||||||
*aErrorMsg = _( "Board outline is missing or malformed. Run DRC for a full analysis." );
|
*aErrorMsg = _( "Board outline is missing or malformed. Run DRC for a full analysis." );
|
||||||
|
|
|
@ -2200,13 +2200,46 @@ ZONE* BOARD::AddArea( PICKED_ITEMS_LIST* aNewZonesList, int aNetcode, PCB_LAYER_
|
||||||
|
|
||||||
bool BOARD::GetBoardPolygonOutlines( SHAPE_POLY_SET& aOutlines,
|
bool BOARD::GetBoardPolygonOutlines( SHAPE_POLY_SET& aOutlines,
|
||||||
OUTLINE_ERROR_HANDLER* aErrorHandler,
|
OUTLINE_ERROR_HANDLER* aErrorHandler,
|
||||||
bool aAllowUseArcsInPolygons )
|
bool aAllowUseArcsInPolygons,
|
||||||
|
bool aIncludeNPTHAsOutlines )
|
||||||
{
|
{
|
||||||
// max dist from one endPt to next startPt: use the current value
|
// max dist from one endPt to next startPt: use the current value
|
||||||
int chainingEpsilon = GetOutlinesChainingEpsilon();
|
int chainingEpsilon = GetOutlinesChainingEpsilon();
|
||||||
|
|
||||||
bool success = BuildBoardPolygonOutlines( this, aOutlines, GetDesignSettings().m_MaxError,
|
bool success = BuildBoardPolygonOutlines( this, aOutlines, GetDesignSettings().m_MaxError,
|
||||||
chainingEpsilon, aErrorHandler, aAllowUseArcsInPolygons );
|
chainingEpsilon, aErrorHandler,
|
||||||
|
aAllowUseArcsInPolygons );
|
||||||
|
|
||||||
|
// Now add NPTH oval holes as holes in outlines if required
|
||||||
|
if( aIncludeNPTHAsOutlines )
|
||||||
|
{
|
||||||
|
for( FOOTPRINT* fp : Footprints() )
|
||||||
|
{
|
||||||
|
for( PAD* pad : fp->Pads() )
|
||||||
|
{
|
||||||
|
if( pad->GetAttribute () != PAD_ATTRIB::NPTH )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SHAPE_POLY_SET hole;
|
||||||
|
pad->TransformHoleToPolygon( hole, 0, GetDesignSettings().m_MaxError, ERROR_INSIDE );
|
||||||
|
|
||||||
|
// Add this pad hole to the main outline
|
||||||
|
// But we can have more than one main outline (i.e. more than one board), so
|
||||||
|
// search the right main outline i.e. the outline that contains the pad hole
|
||||||
|
SHAPE_LINE_CHAIN& pad_hole = hole.Outline( 0 );
|
||||||
|
const VECTOR2I holePt = pad_hole.CPoint( 0 );
|
||||||
|
|
||||||
|
for( int jj = 0; jj < aOutlines.OutlineCount(); ++jj )
|
||||||
|
{
|
||||||
|
if( aOutlines.Outline( jj ).PointInside( holePt ) )
|
||||||
|
{
|
||||||
|
aOutlines.AddHole( pad_hole, jj );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Make polygon strictly simple to avoid issues (especially in 3D viewer)
|
// Make polygon strictly simple to avoid issues (especially in 3D viewer)
|
||||||
aOutlines.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
aOutlines.Simplify( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
||||||
|
|
|
@ -679,11 +679,15 @@ public:
|
||||||
* @param aAllowUseArcsInPolygons = an optional option to allow adding arcs in
|
* @param aAllowUseArcsInPolygons = an optional option to allow adding arcs in
|
||||||
* SHAPE_LINE_CHAIN polylines/polygons when building outlines from aShapeList
|
* SHAPE_LINE_CHAIN polylines/polygons when building outlines from aShapeList
|
||||||
* This is mainly for export to STEP files
|
* This is mainly for export to STEP files
|
||||||
|
* @param aIncludeNPTHAsOutlines = an optional option to include NPTH pad holes
|
||||||
|
* in board outlines. These holes can be seen like holes created by closed shapes
|
||||||
|
* drawn on edge cut layer inside the board main outline.
|
||||||
* @return true if success, false if a contour is not valid
|
* @return true if success, false if a contour is not valid
|
||||||
*/
|
*/
|
||||||
bool GetBoardPolygonOutlines( SHAPE_POLY_SET& aOutlines,
|
bool GetBoardPolygonOutlines( SHAPE_POLY_SET& aOutlines,
|
||||||
OUTLINE_ERROR_HANDLER* aErrorHandler = nullptr,
|
OUTLINE_ERROR_HANDLER* aErrorHandler = nullptr,
|
||||||
bool aAllowUseArcsInPolygons = false );
|
bool aAllowUseArcsInPolygons = false,
|
||||||
|
bool aIncludeNPTHAsOutlines = false );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a epsilon value that is the max distance between 2 points to see them
|
* @return a epsilon value that is the max distance between 2 points to see them
|
||||||
|
|
Loading…
Reference in New Issue