40 int& largestClearance =
m_board->m_DRCMaxClearance;
41 int& largestPhysicalClearance =
m_board->m_DRCMaxPhysicalClearance;
46 largestClearance = std::max( largestClearance,
m_board->GetMaxClearanceValue() );
49 largestPhysicalClearance = worstConstraint.
GetValue().
Min();
52 largestPhysicalClearance = std::max( largestPhysicalClearance, worstConstraint.
GetValue().
Min() );
55 largestClearance = std::min( largestClearance, INT_MAX / 3 );
56 largestPhysicalClearance = std::min( largestPhysicalClearance, INT_MAX / 3 );
58 std::set<ZONE*> allZones;
61 [](
ZONE* zone,
const LSET& copperLayers )
68 fill->BuildBBoxCaches();
74 allZones.insert( zone );
78 m_board->m_DRCZones.push_back( zone );
82 if( zoneCopperLayers.any() )
84 cacheBBoxes( zone, zoneCopperLayers );
85 m_board->m_DRCCopperZones.push_back( zone );
92 for(
ZONE* zone : footprint->Zones() )
94 allZones.insert( zone );
98 m_board->m_DRCZones.push_back( zone );
102 if( zoneCopperLayers.any() )
104 cacheBBoxes( zone, zoneCopperLayers );
105 m_board->m_DRCCopperZones.push_back( zone );
112 std::atomic<size_t> done( 1 );
121 auto addToCopperTree =
127 LSET copperLayers = item->GetLayerSet() & boardCopperLayers;
135 copperLayers = boardCopperLayers;
141 m_board->m_CopperItemRTreeCache->Insert( item, layer, largestClearance );
151 static const std::vector<KICAD_T> itemTypes = {
163 std::future<void> retn =
tp.submit_task(
166 std::unique_lock<std::shared_mutex> writeLock(
m_board->m_CachesMutex );
168 if( !
m_board->m_CopperItemRTreeCache )
169 m_board->m_CopperItemRTreeCache = std::make_shared<DRC_RTREE>();
174 std::future_status status = retn.wait_for( std::chrono::milliseconds( 250 ) );
176 while( status != std::future_status::ready )
179 status = retn.wait_for( std::chrono::milliseconds( 250 ) );
182 if( !
reportPhase(
_(
"Tessellating copper zones..." ) ) )
190 footprint->BuildCourtyardCaches();
191 footprint->BuildNetTieCache();
194 std::vector<std::future<size_t>> returns;
196 returns.reserve( allZones.size() );
199 [
this, &done](
ZONE* aZone ) ->
size_t
204 aZone->CacheBoundingBox();
205 aZone->CacheTriangulation();
207 if( !aZone->GetIsRuleArea() && aZone->IsOnCopperLayer() )
209 std::unique_ptr<DRC_RTREE> rtree = std::make_unique<DRC_RTREE>();
211 aZone->GetLayerSet().RunOnLayers(
215 rtree->Insert( aZone, layer );
219 std::unique_lock<std::shared_mutex> writeLock(
m_board->m_CachesMutex );
220 m_board->m_CopperZoneRTreeCache[ aZone ] = std::move( rtree );
229 for(
ZONE* zone : allZones )
231 returns.emplace_back(
tp.submit_task(
234 return cache_zones( zone );
240 for(
const std::future<size_t>& ret : returns )
242 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
244 while( status != std::future_status::ready )
247 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
251 m_board->m_ZoneIsolatedIslandsMap.clear();
268 m_board->BoardOutline()->GetOutline().BuildBBoxCaches();
270 std::shared_ptr<CONNECTIVITY_DATA> connectivity =
m_board->GetConnectivity();
272 connectivity->ClearRatsnest();
274 connectivity->FillIsolatedIslandsMap(
m_board->m_ZoneIsolatedIslandsMap,
true );