Moved DRC::doEdgeZoneDrc to drc_clearance_test_functions.cpp
This commit is contained in:
parent
9b5dc5c215
commit
f7072cc7c6
|
@ -585,10 +585,106 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads )
|
|||
}
|
||||
|
||||
|
||||
/* test DRC between 2 pads.
|
||||
* this function can be also used to test DRC between a pad and a hole,
|
||||
* because a hole is like a round or oval pad.
|
||||
*/
|
||||
bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
|
||||
{
|
||||
if( !aArea->IsOnCopperLayer() ) // Cannot have a Drc error if not on copper layer
|
||||
return true;
|
||||
// Get polygon, contour and vertex index.
|
||||
SHAPE_POLY_SET::VERTEX_INDEX index;
|
||||
|
||||
// If the vertex does not exist, there is no conflict
|
||||
if( !aArea->Outline()->GetRelativeIndices( aCornerIndex, &index ) )
|
||||
return true;
|
||||
|
||||
// Retrieve the selected contour
|
||||
SHAPE_LINE_CHAIN contour;
|
||||
contour = aArea->Outline()->Polygon( index.m_polygon )[index.m_contour];
|
||||
|
||||
// Retrieve the segment that starts at aCornerIndex-th corner.
|
||||
SEG selectedSegment = contour.Segment( index.m_vertex );
|
||||
|
||||
VECTOR2I start = selectedSegment.A;
|
||||
VECTOR2I end = selectedSegment.B;
|
||||
|
||||
// iterate through all areas
|
||||
for( int ia2 = 0; ia2 < m_pcb->GetAreaCount(); ia2++ )
|
||||
{
|
||||
ZONE_CONTAINER* area_to_test = m_pcb->GetArea( ia2 );
|
||||
int zone_clearance = std::max( area_to_test->GetZoneClearance(),
|
||||
aArea->GetZoneClearance() );
|
||||
|
||||
// test for same layer
|
||||
if( area_to_test->GetLayer() != aArea->GetLayer() )
|
||||
continue;
|
||||
|
||||
// Test for same net
|
||||
if( ( aArea->GetNetCode() == area_to_test->GetNetCode() ) && (aArea->GetNetCode() >= 0) )
|
||||
continue;
|
||||
|
||||
// test for same priority
|
||||
if( area_to_test->GetPriority() != aArea->GetPriority() )
|
||||
continue;
|
||||
|
||||
// test for same type
|
||||
if( area_to_test->GetIsKeepout() != aArea->GetIsKeepout() )
|
||||
continue;
|
||||
|
||||
// For keepout, there is no clearance, so use a minimal value for it
|
||||
// use 1, not 0 as value to avoid some issues in tests
|
||||
if( area_to_test->GetIsKeepout() )
|
||||
zone_clearance = 1;
|
||||
|
||||
// test for ending line inside area_to_test
|
||||
if( area_to_test->Outline()->Contains( end ) )
|
||||
{
|
||||
// COPPERAREA_COPPERAREA error: corner inside copper area
|
||||
m_currentMarker = fillMarker( aArea, static_cast<wxPoint>( end ),
|
||||
COPPERAREA_INSIDE_COPPERAREA,
|
||||
m_currentMarker );
|
||||
return false;
|
||||
}
|
||||
|
||||
// now test spacing between areas
|
||||
int ax1 = start.x;
|
||||
int ay1 = start.y;
|
||||
int ax2 = end.x;
|
||||
int ay2 = end.y;
|
||||
|
||||
// Iterate through all edges in the polygon.
|
||||
SHAPE_POLY_SET::SEGMENT_ITERATOR iterator;
|
||||
for( iterator = area_to_test->Outline()->IterateSegmentsWithHoles(); iterator; iterator++ )
|
||||
{
|
||||
SEG segment = *iterator;
|
||||
|
||||
int bx1 = segment.A.x;
|
||||
int by1 = segment.A.y;
|
||||
int bx2 = segment.B.x;
|
||||
int by2 = segment.B.y;
|
||||
|
||||
int x, y; // variables containing the intersecting point coordinates
|
||||
int d = GetClearanceBetweenSegments( bx1, by1, bx2, by2,
|
||||
0,
|
||||
ax1, ay1, ax2, ay2,
|
||||
0,
|
||||
zone_clearance,
|
||||
&x, &y );
|
||||
|
||||
if( d < zone_clearance )
|
||||
{
|
||||
// COPPERAREA_COPPERAREA error : edge intersect or too close
|
||||
m_currentMarker = fillMarker( aArea, wxPoint( x, y ),
|
||||
COPPERAREA_CLOSE_TO_COPPERAREA,
|
||||
m_currentMarker );
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad )
|
||||
{
|
||||
int dist;
|
||||
|
|
|
@ -284,101 +284,3 @@ bool BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_
|
|||
}
|
||||
|
||||
|
||||
bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
|
||||
{
|
||||
if( !aArea->IsOnCopperLayer() ) // Cannot have a Drc error if not on copper layer
|
||||
return true;
|
||||
// Get polygon, contour and vertex index.
|
||||
SHAPE_POLY_SET::VERTEX_INDEX index;
|
||||
|
||||
// If the vertex does not exist, there is no conflict
|
||||
if( !aArea->Outline()->GetRelativeIndices( aCornerIndex, &index ) )
|
||||
return true;
|
||||
|
||||
// Retrieve the selected contour
|
||||
SHAPE_LINE_CHAIN contour;
|
||||
contour = aArea->Outline()->Polygon( index.m_polygon )[index.m_contour];
|
||||
|
||||
// Retrieve the segment that starts at aCornerIndex-th corner.
|
||||
SEG selectedSegment = contour.Segment( index.m_vertex );
|
||||
|
||||
VECTOR2I start = selectedSegment.A;
|
||||
VECTOR2I end = selectedSegment.B;
|
||||
|
||||
// iterate through all areas
|
||||
for( int ia2 = 0; ia2 < m_pcb->GetAreaCount(); ia2++ )
|
||||
{
|
||||
ZONE_CONTAINER* area_to_test = m_pcb->GetArea( ia2 );
|
||||
int zone_clearance = std::max( area_to_test->GetZoneClearance(),
|
||||
aArea->GetZoneClearance() );
|
||||
|
||||
// test for same layer
|
||||
if( area_to_test->GetLayer() != aArea->GetLayer() )
|
||||
continue;
|
||||
|
||||
// Test for same net
|
||||
if( ( aArea->GetNetCode() == area_to_test->GetNetCode() ) && (aArea->GetNetCode() >= 0) )
|
||||
continue;
|
||||
|
||||
// test for same priority
|
||||
if( area_to_test->GetPriority() != aArea->GetPriority() )
|
||||
continue;
|
||||
|
||||
// test for same type
|
||||
if( area_to_test->GetIsKeepout() != aArea->GetIsKeepout() )
|
||||
continue;
|
||||
|
||||
// For keepout, there is no clearance, so use a minimal value for it
|
||||
// use 1, not 0 as value to avoid some issues in tests
|
||||
if( area_to_test->GetIsKeepout() )
|
||||
zone_clearance = 1;
|
||||
|
||||
// test for ending line inside area_to_test
|
||||
if( area_to_test->Outline()->Contains( end ) )
|
||||
{
|
||||
// COPPERAREA_COPPERAREA error: corner inside copper area
|
||||
m_currentMarker = fillMarker( aArea, static_cast<wxPoint>( end ),
|
||||
COPPERAREA_INSIDE_COPPERAREA,
|
||||
m_currentMarker );
|
||||
return false;
|
||||
}
|
||||
|
||||
// now test spacing between areas
|
||||
int ax1 = start.x;
|
||||
int ay1 = start.y;
|
||||
int ax2 = end.x;
|
||||
int ay2 = end.y;
|
||||
|
||||
// Iterate through all edges in the polygon.
|
||||
SHAPE_POLY_SET::SEGMENT_ITERATOR iterator;
|
||||
for( iterator = area_to_test->Outline()->IterateSegmentsWithHoles(); iterator; iterator++ )
|
||||
{
|
||||
SEG segment = *iterator;
|
||||
|
||||
int bx1 = segment.A.x;
|
||||
int by1 = segment.A.y;
|
||||
int bx2 = segment.B.x;
|
||||
int by2 = segment.B.y;
|
||||
|
||||
int x, y; // variables containing the intersecting point coordinates
|
||||
int d = GetClearanceBetweenSegments( bx1, by1, bx2, by2,
|
||||
0,
|
||||
ax1, ay1, ax2, ay2,
|
||||
0,
|
||||
zone_clearance,
|
||||
&x, &y );
|
||||
|
||||
if( d < zone_clearance )
|
||||
{
|
||||
// COPPERAREA_COPPERAREA error : edge intersect or too close
|
||||
m_currentMarker = fillMarker( aArea, wxPoint( x, y ),
|
||||
COPPERAREA_CLOSE_TO_COPPERAREA,
|
||||
m_currentMarker );
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue