37 int& largestClearance =
m_board->m_DRCMaxClearance;
38 int& largestPhysicalClearance =
m_board->m_DRCMaxPhysicalClearance;
43 largestClearance = std::max( largestClearance,
m_board->GetMaxClearanceValue() );
49 largestPhysicalClearance = worstConstraint.
GetValue().
Min();
52 largestPhysicalClearance = std::max( largestPhysicalClearance, worstConstraint.
GetValue().
Min() );
57 if( largestPhysicalClearance <= 0 )
59 int conditionalMax = 0;
65 conditionalMax = std::max( conditionalMax, worstConstraint.
GetValue().
Min() );
67 if( conditionalMax > 0 )
69 if(
m_drcEngine->HasUserDefinedPhysicalConstraint() )
71 largestPhysicalClearance = conditionalMax;
75 bool hasMatchingItems =
false;
80 hasMatchingItems =
true;
84 if( hasMatchingItems )
85 largestPhysicalClearance = conditionalMax;
91 largestClearance = std::min( largestClearance, INT_MAX / 3 );
92 largestPhysicalClearance = std::min( largestPhysicalClearance, INT_MAX / 3 );
94 std::set<ZONE*> allZones;
96 auto cacheBBoxes = [](
ZONE* zone,
const LSET& copperLayers )
104 fill->BuildBBoxCaches();
110 allZones.insert( zone );
114 m_board->m_DRCZones.push_back( zone );
118 if( zoneCopperLayers.any() )
120 cacheBBoxes( zone, zoneCopperLayers );
121 m_board->m_DRCCopperZones.push_back( zone );
128 for(
ZONE* zone : footprint->Zones() )
130 allZones.insert( zone );
134 m_board->m_DRCZones.push_back( zone );
138 if( zoneCopperLayers.any() )
140 cacheBBoxes( zone, zoneCopperLayers );
141 m_board->m_DRCCopperZones.push_back( zone );
152 m_board->m_DRCCopperZonesByLayer[layer].push_back( zone );
156 std::atomic<size_t> done( 1 );
165 auto addToCopperTree =
171 LSET copperLayers = item->GetLayerSet() & boardCopperLayers;
179 copperLayers = boardCopperLayers;
185 m_board->m_CopperItemRTreeCache->Insert( item, layer, largestClearance );
195 static const std::vector<KICAD_T> itemTypes = {
207 std::future<void> retn =
tp.submit_task(
210 std::unique_lock<std::shared_mutex> writeLock(
m_board->m_CachesMutex );
212 if( !
m_board->m_CopperItemRTreeCache )
213 m_board->m_CopperItemRTreeCache = std::make_shared<DRC_RTREE>();
216 m_board->m_CopperItemRTreeCache->Build();
219 std::future_status status = retn.wait_for( std::chrono::milliseconds( 250 ) );
221 while( status != std::future_status::ready )
224 status = retn.wait_for( std::chrono::milliseconds( 250 ) );
227 if( !
reportPhase(
_(
"Tessellating copper zones..." ) ) )
235 footprint->BuildCourtyardCaches();
236 footprint->BuildNetTieCache();
239 std::vector<std::future<size_t>> returns;
241 returns.reserve( allZones.size() );
244 [
this, &done](
ZONE* aZone ) ->
size_t
249 aZone->CacheBoundingBox();
250 aZone->CacheTriangulation();
252 if( !aZone->GetIsRuleArea() && aZone->IsOnCopperLayer() )
254 std::unique_ptr<DRC_RTREE> rtree = std::make_unique<DRC_RTREE>();
256 aZone->GetLayerSet().RunOnLayers(
260 rtree->Insert( aZone, layer );
266 std::unique_lock<std::shared_mutex> writeLock(
m_board->m_CachesMutex );
267 m_board->m_CopperZoneRTreeCache[ aZone ] = std::move( rtree );
276 for(
ZONE* zone : allZones )
278 returns.emplace_back(
tp.submit_task(
281 return cache_zones( zone );
287 for(
const std::future<size_t>& ret : returns )
289 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
291 while( status != std::future_status::ready )
294 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
298 m_board->m_ZoneIsolatedIslandsMap.clear();
315 m_board->BoardOutline()->GetOutline().BuildBBoxCaches();
317 std::shared_ptr<CONNECTIVITY_DATA> connectivity =
m_board->GetConnectivity();
319 connectivity->ClearRatsnest();
321 connectivity->FillIsolatedIslandsMap(
m_board->m_ZoneIsolatedIslandsMap,
true );