41 int& largestClearance =
m_board->m_DRCMaxClearance;
42 int& largestPhysicalClearance =
m_board->m_DRCMaxPhysicalClearance;
47 largestClearance = std::max( largestClearance,
m_board->GetMaxClearanceValue() );
53 largestPhysicalClearance = worstConstraint.
GetValue().
Min();
56 largestPhysicalClearance = std::max( largestPhysicalClearance, worstConstraint.
GetValue().
Min() );
61 if( largestPhysicalClearance <= 0 )
63 int conditionalMax = 0;
69 conditionalMax = std::max( conditionalMax, worstConstraint.
GetValue().
Min() );
71 if( conditionalMax > 0 )
73 if(
m_drcEngine->HasUserDefinedPhysicalConstraint() )
75 largestPhysicalClearance = conditionalMax;
79 bool hasMatchingItems =
false;
84 hasMatchingItems =
true;
88 if( hasMatchingItems )
89 largestPhysicalClearance = conditionalMax;
95 largestClearance = std::min( largestClearance, INT_MAX / 3 );
96 largestPhysicalClearance = std::min( largestPhysicalClearance, INT_MAX / 3 );
98 std::set<ZONE*> allZones;
101 [](
ZONE* zone,
const LSET& copperLayers )
109 fill->BuildBBoxCaches();
115 allZones.insert( zone );
119 m_board->m_DRCZones.push_back( zone );
123 if( zoneCopperLayers.any() )
125 cacheBBoxes( zone, zoneCopperLayers );
126 m_board->m_DRCCopperZones.push_back( zone );
133 for(
ZONE* zone : footprint->Zones() )
135 allZones.insert( zone );
139 m_board->m_DRCZones.push_back( zone );
143 if( zoneCopperLayers.any() )
145 cacheBBoxes( zone, zoneCopperLayers );
146 m_board->m_DRCCopperZones.push_back( zone );
157 m_board->m_DRCCopperZonesByLayer[layer].push_back( zone );
161 std::atomic<size_t> done( 1 );
170 auto addToCopperTree =
176 LSET copperLayers = item->GetLayerSet() & boardCopperLayers;
184 copperLayers = boardCopperLayers;
201 static const std::vector<KICAD_T> itemTypes = {
213 std::future<void> retn =
tp.submit_task(
216 std::unique_lock<std::shared_mutex> writeLock(
m_board->m_CachesMutex );
220 m_board->m_CopperItemRTreeCache = std::make_shared<DRC_RTREE>();
223 m_board->m_CopperItemRTreeCache->Build();
226 std::future_status status = retn.wait_for( std::chrono::milliseconds( 250 ) );
228 while( status != std::future_status::ready )
231 status = retn.wait_for( std::chrono::milliseconds( 250 ) );
234 if( !
reportPhase(
_(
"Tessellating copper zones..." ) ) )
242 footprint->BuildCourtyardCaches();
243 footprint->BuildNetTieCache();
246 std::vector<std::future<size_t>> returns;
248 returns.reserve( allZones.size() );
251 [
this, &done](
ZONE* aZone ) ->
size_t
256 aZone->CacheBoundingBox();
257 aZone->CacheTriangulation();
259 if( !aZone->GetIsRuleArea() && aZone->IsOnCopperLayer() )
261 std::unique_ptr<DRC_RTREE> rtree = std::make_unique<DRC_RTREE>();
263 aZone->GetLayerSet().RunOnLayers(
273 std::unique_lock<std::shared_mutex> writeLock(
m_board->m_CachesMutex );
274 m_board->m_CopperZoneRTreeCache[ aZone ] = std::move( rtree );
283 for(
ZONE* zone : allZones )
285 returns.emplace_back(
tp.submit_task(
288 return cache_zones( zone );
294 for(
const std::future<size_t>& ret : returns )
296 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
298 while( status != std::future_status::ready )
301 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
305 m_board->m_ZoneIsolatedIslandsMap.clear();
322 m_board->BoardOutline()->GetOutline().BuildBBoxCaches();
324 std::shared_ptr<CONNECTIVITY_DATA> connectivity =
m_board->GetConnectivity();
326 connectivity->ClearRatsnest();
328 connectivity->FillIsolatedIslandsMap(
m_board->m_ZoneIsolatedIslandsMap,
true );