56 if( !
reportPhase(
_(
"Checking pad, via and zone connections..." ) ) )
60 std::shared_ptr<CONNECTIVITY_DATA> connectivity = board->
GetConnectivity();
62 int progressDelta = 250;
74 if( exceedV && exceedT )
76 else if( track->Type() ==
PCB_VIA_T && exceedV )
88 if( connectivity->TestTrackEndpointDangling( track,
true, &pos ) )
90 std::shared_ptr<DRC_ITEM> drcItem;
101 drcItem->SetViolatingRule( constraint.GetParentRule() );
108 drcItem->SetItems( track );
128 const std::list<CN_ITEM*>& items = connectivity->GetConnectivityAlgo()->ItemEntry( track ).GetItems();
133 CN_ITEM* citem = items.front();
135 if( !citem->
Valid() )
145 bool isPostMachined =
false;
150 isPostMachined =
pad->IsBackdrilledOrPostMachined( layer );
155 isPostMachined =
via->IsBackdrilledOrPostMachined( layer );
161 drcItem->SetItems( track, item );
163 VECTOR2I pos = ( track->GetStart() + track->GetEnd() ) / 2;
166 if( item->
HitTest( track->GetStart() ) )
167 pos = track->GetStart();
168 else if( item->
HitTest( track->GetEnd() ) )
169 pos = track->GetEnd();
188 const std::list<CN_ITEM*>& items = connectivity->GetConnectivityAlgo()->ItemEntry( track ).GetItems();
193 CN_ITEM* citem = items.front();
195 if( !citem->
Valid() )
211 bool startInVia =
via->HitTest( track->GetStart() );
212 bool endInVia =
via->HitTest( track->GetEnd() );
214 if( !startInVia && !endInVia )
219 bool layerHasCenteredTrack =
false;
222 const std::list<CN_ITEM*>& viaEntries =
223 connectivity->GetConnectivityAlgo()->ItemEntry(
via ).GetItems();
225 if( !viaEntries.empty() )
227 for(
CN_ITEM* viaConnected : viaEntries.front()->ConnectedItems() )
236 if( connTrack->
GetLayer() != trackLayer )
239 if( connTrack->
GetStart() == viaPos || connTrack->
GetEnd() == viaPos )
241 layerHasCenteredTrack =
true;
247 if( layerHasCenteredTrack )
250 if( ( startInVia && track->GetStart() != viaPos ) || ( endInVia && track->GetEnd() != viaPos ) )
252 bool startViolation = startInVia && track->GetStart() != viaPos;
253 VECTOR2I pos = startViolation ? track->GetStart() : track->GetEnd();
256 drcItem->SetItems( track,
via );
276 if( zone->IsCopperThieving() )
279 for(
const auto& [ layer, layerIslands ] : zoneIslands )
284 for(
int polyIdx : layerIslands.m_IsolatedOutlines )
289 std::shared_ptr<SHAPE_POLY_SET> poly = zone->GetFilledPolysList( layer );
292 drcItem->SetItems( zone );
293 reportViolation( drcItem, poly->Outline( polyIdx ).CPoint( 0 ), layer );
301 if( !
reportPhase(
_(
"Checking net connections..." ) ) )
305 count = connectivity->GetUnconnectedCount(
false );
307 connectivity->RunOnUnconnectedEdges(