81 m_LegacyDesignSettingsLoaded( false ),
82 m_LegacyCopperEdgeClearanceLoaded( false ),
83 m_LegacyNetclassesLoaded( false ),
91 m_embedFonts( false ),
92 m_embeddedFilesDelegate( nullptr ),
113 else if( layer >=
User_1 && layer & 1 )
126 int infinity = ( std::numeric_limits<int>::max() / 2 ) -
pcbIUScale.
mmToIU( 1 );
139 _(
"This is the default net class." ) );
171 ownedItems.insert( g );
203 if( aProject && !aReferenceOnly )
220 std::shared_ptr<NET_SETTINGS>& projectSettings =
project.NetSettings();
222 projectSettings->SetDefaultNetclass( legacySettings->GetDefaultNetclass() );
223 projectSettings->SetNetclasses( legacySettings->GetNetclasses() );
224 projectSettings->SetNetclassPatternAssignments(
225 std::move( legacySettings->GetNetclassPatternAssignments() ) );
245 project.m_BoardSettings =
nullptr;
256 std::unique_lock<std::shared_mutex> writeLock(
m_CachesMutex );
300 std::set<std::pair<KIID, KIID>> m_ratsnestExclusions;
306 const std::shared_ptr<RC_ITEM>& rcItem = marker->GetRCItem();
307 m_ratsnestExclusions.emplace( rcItem->GetMainItemID(), rcItem->GetAuxItemID() );
308 m_ratsnestExclusions.emplace( rcItem->GetAuxItemID(), rcItem->GetMainItemID() );
318 std::pair<KIID, KIID> ids = { aEdge.GetSourceNode()->Parent()->m_Uuid,
319 aEdge.GetTargetNode()->Parent()->m_Uuid };
321 aEdge.
SetVisible( m_ratsnestExclusions.count( ids ) == 0 );
336 if( marker->IsExcluded() )
338 wxString serialized = marker->SerializeToString();
340 m_designSettings->m_DrcExclusionComments[ serialized ] = marker->GetComment();
351 prjSettings->m_DrcExclusionComments =
m_designSettings->m_DrcExclusionComments;
357std::set<wxString>::iterator
FindByFirstNFields( std::set<wxString>& strSet,
const wxString& searchStr,
char delimiter,
360 wxString searchPrefix = searchStr;
363 int delimiterCount = 0;
366 while( pos < searchPrefix.length() && delimiterCount < n )
368 if( searchPrefix[pos] == delimiter )
374 if( delimiterCount == n )
375 searchPrefix = searchPrefix.Left( pos - 1 );
377 for(
auto it = strSet.begin(); it != strSet.end(); ++it )
379 if( it->StartsWith( searchPrefix + delimiter ) || *it == searchPrefix )
389 std::map<wxString, wxString> comments =
m_designSettings->m_DrcExclusionComments;
396 std::set<wxString>::iterator it;
397 wxString serialized = marker->SerializeToString();
398 wxString matchedExclusion;
400 if( !serialized.Contains(
"unconnected_items" ) )
402 it = exclusions.find( serialized );
404 if( it != exclusions.end() )
405 matchedExclusion = *it;
409 const int numberOfFieldsExcludingIds = 3;
410 const char delimiter =
'|';
411 it =
FindByFirstNFields( exclusions, serialized, delimiter, numberOfFieldsExcludingIds );
413 if( it != exclusions.end() )
414 matchedExclusion = *it;
417 if( it != exclusions.end() )
419 marker->SetExcluded(
true, comments[matchedExclusion] );
423 m_designSettings->m_DrcExclusionComments[matchedExclusion] = comments[matchedExclusion];
425 exclusions.erase( it );
429 std::vector<PCB_MARKER*> newMarkers;
433 for(
const wxString& serialized : exclusions )
440 std::vector<KIID> ids = marker->
GetRCItem()->GetIDs();
444 for(
const KIID& uuid : ids )
446 if( uuidCount < 1 || uuid !=
niluuid )
460 marker->
SetExcluded(
true, comments[ serialized ] );
461 newMarkers.push_back( marker );
465 m_designSettings->m_DrcExclusionComments[ serialized ] = comments[ serialized ];
477 [&](
const wxString& aVar )
480 aVars->push_back( aVar );
483 add( wxT(
"LAYER" ) );
484 add( wxT(
"FILENAME" ) );
485 add( wxT(
"FILEPATH" ) );
486 add( wxT(
"PROJECTNAME" ) );
487 add( wxT(
"DRC_ERROR <message_text>" ) );
488 add( wxT(
"DRC_WARNING <message_text>" ) );
494 for( std::pair<wxString, wxString> entry :
GetProject()->GetTextVars() )
502 if( token->Contains(
':' ) )
505 wxString ref = token->BeforeFirst(
':', &remainder );
514 *token = std::move( remainder );
520 if( token->IsSameAs( wxT(
"FILENAME" ) ) )
523 *token = fn.GetFullName();
526 else if( token->IsSameAs( wxT(
"FILEPATH" ) ) )
529 *token = fn.GetFullPath();
532 else if( token->IsSameAs( wxT(
"PROJECTNAME" ) ) &&
GetProject() )
538 wxString var = *token;
565 wxLogWarning( wxT(
"This should not be called on the BOARD object") );
572 [&] (
EDA_ITEM* item,
void* testData )
581 board_item->
Move( aMoveVector );
584 return INSPECT_RESULT::CONTINUE;
609 aFunction( footprint );
611 if( aMode == RECURSE_MODE::RECURSE )
612 footprint->RunOnChildren( aFunction, RECURSE_MODE::RECURSE );
617 aFunction( drawing );
619 if( aMode == RECURSE_MODE::RECURSE )
620 drawing->RunOnChildren( aFunction, RECURSE_MODE::RECURSE );
623 catch( std::bad_function_call& )
625 wxFAIL_MSG( wxT(
"Error running BOARD::RunOnChildren" ) );
641 return INSPECT_RESULT::CONTINUE;
663 for(
auto& [ layer_id, layer ] :
m_layers )
665 if( layer.m_name == aLayerName || layer.m_userName == aLayerName )
690 if( it !=
m_layers.end() && !it->second.m_userName.IsEmpty() )
691 return it->second.m_userName;
700 if( !aLayerName.IsEmpty() )
703 if( aLayerName.Find( wxChar(
'"' ) ) != wxNOT_FOUND )
708 m_layers[aLayer].m_userName = aLayerName;
737 return it->second.m_type;
753 m_layers[aLayer].m_type = aLayerType;
771 case LT_AUX:
return "auxiliary";
780 if( strcmp( aType,
"signal" ) == 0 )
return LT_SIGNAL;
781 else if( strcmp( aType,
"power" ) == 0 )
return LT_POWER;
782 else if( strcmp( aType,
"mixed" ) == 0 )
return LT_MIXED;
783 else if( strcmp( aType,
"jumper" ) == 0 )
return LT_JUMPER;
784 else if( strcmp( aType,
"auxiliary" ) == 0 )
return LT_AUX;
785 else if( strcmp( aType,
"front" ) == 0 )
return LT_FRONT;
786 else if( strcmp( aType,
"back" ) == 0 )
return LT_BACK;
799 if(
m_layers[layer].m_opposite != layer )
805 wxString principalName =
m_layers[layer].m_userName.AfterFirst(
'.' );
818 wxString candidate =
m_layers[ii].m_userName.AfterFirst(
'.' );
820 if( !candidate.IsEmpty() && candidate == principalName )
832 int next = layer + 2;
897 if( aStartLayer > aEndLayer )
898 std::swap( aStartLayer, aEndLayer );
900 if( aEndLayer ==
B_Cu )
903 return aEndLayer - aStartLayer;
951 for(
size_t i = 0; i < aSet.size(); i++ )
992 track->SetLocalRatsnestVisible( isEnabled );
996 for(
PAD*
pad : footprint->Pads() )
997 pad->SetLocalRatsnestVisible( isEnabled );
1001 zone->SetLocalRatsnestVisible( isEnabled );
1018 default: wxFAIL_MSG( wxT(
"BOARD::IsModuleLayerVisible(): bad layer" ) );
return true;
1040 std::unique_lock<std::shared_mutex> writeLock(
m_CachesMutex );
1045 worstClearance = std::max( worstClearance, zone->GetLocalClearance().value() );
1049 for(
PAD*
pad : footprint->Pads() )
1051 std::optional<int>
override =
pad->GetClearanceOverrides(
nullptr );
1053 if(
override.has_value() )
1054 worstClearance = std::max( worstClearance,
override.value() );
1057 for(
ZONE* zone : footprint->Zones() )
1058 worstClearance = std::max( worstClearance, zone->GetLocalClearance().value() );
1070 std::vector<ZONE*> zones = aZones;
1079 aReporter->
Report(
_(
"Tessellating copper zones..." ) );
1082 std::vector<std::future<size_t>> returns;
1084 returns.reserve( zones.size() );
1087 [aReporter](
ZONE* aZone ) ->
size_t
1092 aZone->CacheTriangulation();
1100 for(
ZONE* zone : zones )
1101 returns.emplace_back(
tp.submit( cache_zones, zone ) );
1104 for(
const std::future<size_t>& ret : returns )
1106 std::future_status status = ret.wait_for( std::chrono::milliseconds( 250 ) );
1108 while( status != std::future_status::ready )
1113 status = ret.wait_for( std::chrono::milliseconds( 250 ) );
1122 aFunction( footprint->GetEmbeddedFiles() );
1133 EMBEDDED_FILES::EMBEDDED_FILE* file = GetEmbeddedFile( filename );
1137 embeddedFile->compressedEncodedData = file->compressedEncodedData;
1138 embeddedFile->decompressedData = file->decompressedData;
1139 embeddedFile->data_hash = file->data_hash;
1140 embeddedFile->is_valid = file->is_valid;
1149 if( aBoardItem ==
nullptr )
1151 wxFAIL_MSG( wxT(
"BOARD::Add() param error: aBoardItem nullptr" ) );
1157 switch( aBoardItem->
Type() )
1184 if( aMode == ADD_MODE::APPEND || aMode == ADD_MODE::BULK_APPEND )
1198 wxFAIL_MSG( wxString::Format(
"BOARD::Add() Cannot place Track on non-copper layer: %d = %s",
1199 static_cast<int>( aBoardItem->
GetLayer() ),
1204 if( aMode == ADD_MODE::APPEND || aMode == ADD_MODE::BULK_APPEND )
1215 if( aMode == ADD_MODE::APPEND || aMode == ADD_MODE::BULK_APPEND )
1224 RECURSE_MODE::NO_RECURSE );
1241 if( aMode == ADD_MODE::APPEND || aMode == ADD_MODE::BULK_APPEND )
1254 RECURSE_MODE::NO_RECURSE );
1265 wxFAIL_MSG( wxString::Format( wxT(
"BOARD::Add() item type %s not handled" ),
1273 if( !aSkipConnectivity )
1276 if( aMode != ADD_MODE::BULK_INSERT && aMode != ADD_MODE::BULK_APPEND )
1295 for(
int ii = (
int)
m_zones.size() - 1; ii >= 0; --ii )
1313 wxASSERT( aBoardItem );
1317 switch( aBoardItem->
Type() )
1326 if( boardItem->GetNet() == netItem )
1327 boardItem->SetNet( unconnected );
1339 std::erase(
m_groups, aBoardItem );
1343 std::erase(
m_zones, aBoardItem );
1359 RECURSE_MODE::NO_RECURSE );
1367 std::erase(
m_tracks, aBoardItem );
1393 RECURSE_MODE::NO_RECURSE );
1405 wxFAIL_MSG( wxString::Format( wxT(
"BOARD::Remove() item type %s not handled" ),
1413 if( aRemoveMode != REMOVE_MODE::BULK )
1420 std::vector<BOARD_ITEM*> removed;
1422 for(
const KICAD_T& type : aTypes )
1428 removed.emplace_back( item );
1439 std::copy(
m_groups.begin(),
m_groups.end(), std::back_inserter( removed ) );
1444 std::copy(
m_zones.begin(),
m_zones.end(), std::back_inserter( removed ) );
1459 std::copy(
m_tracks.begin(),
m_tracks.end(), std::back_inserter( removed ) );
1465 wxFAIL_MSG( wxT(
"Use PCB_TRACE_T to remove all tracks, arcs, and vias" ) );
1484 wxFAIL_MSG( wxT(
"Use PCB_SHAPE_T to remove all graphics and text" ) );
1488 wxFAIL_MSG( wxT(
"BOARD::RemoveAll() needs more ::Type() support" ) );
1500 return wxString::Format(
_(
"PCB" ) );
1507 [&](
EDA_ITEM* descendant,
void* aTestData )
1511 if( dimension->
GetUnitsMode() == DIM_UNITS_MODE::AUTOMATIC )
1516 aView->
Update( dimension );
1519 return INSPECT_RESULT::CONTINUE;
1543 std::vector<PCB_MARKER*> remaining;
1554 remaining.push_back( marker );
1576 footprint->SetParent(
nullptr );
1597 if(
group->m_Uuid == aID )
1603 if( generator->m_Uuid == aID )
1609 if( track->m_Uuid == aID )
1615 if( footprint->m_Uuid == aID )
1618 for(
PAD*
pad : footprint->Pads() )
1620 if(
pad->m_Uuid == aID )
1624 for(
PCB_FIELD* field : footprint->GetFields() )
1626 if( field && field->m_Uuid == aID )
1630 for(
BOARD_ITEM* drawing : footprint->GraphicalItems() )
1632 if( drawing->m_Uuid == aID )
1638 if( zone->m_Uuid == aID )
1644 if(
group->m_Uuid == aID )
1651 if( zone->m_Uuid == aID )
1661 if( cell->m_Uuid == aID )
1666 if( drawing->m_Uuid == aID )
1672 if( marker->m_Uuid == aID )
1678 if( netInfo->m_Uuid == aID )
1683 return const_cast<BOARD*
>( this );
1686 if( aAllowNullptrReturn )
1699 aMap[ track->m_Uuid ] = track;
1703 aMap[ footprint->m_Uuid ] = footprint;
1705 for(
PAD*
pad : footprint->Pads() )
1706 aMap[
pad->m_Uuid ] =
pad;
1708 aMap[ footprint->Reference().m_Uuid ] = &footprint->Reference();
1709 aMap[ footprint->Value().m_Uuid ] = &footprint->Value();
1711 for(
BOARD_ITEM* drawing : footprint->GraphicalItems() )
1712 aMap[ drawing->m_Uuid ] = drawing;
1716 aMap[ zone->m_Uuid ] = zone;
1719 aMap[ drawing->m_Uuid ] = drawing;
1722 aMap[ marker->m_Uuid ] = marker;
1728 aMap[ generator->m_Uuid ] = generator;
1735 size_t sourceLen = aSource.length();
1737 for(
size_t i = 0; i < sourceLen; ++i )
1739 if( aSource[i] ==
'$' && i + 1 < sourceLen && aSource[i+1] ==
'{' )
1742 bool isCrossRef =
false;
1744 for( i = i + 2; i < sourceLen; ++i )
1746 if( aSource[i] ==
'}' )
1749 if( aSource[i] ==
':' )
1752 token.append( aSource[i] );
1758 wxString ref = token.BeforeFirst(
':', &remainder );
1762 if( footprint->GetReference().CmpNoCase( ref ) == 0 )
1764 wxString
test( remainder );
1766 if( footprint->ResolveTextVar( &
test ) )
1767 token = footprint->m_Uuid.AsString() + wxT(
":" ) + remainder;
1774 newbuf.append( wxT(
"${" ) + token + wxT(
"}" ) );
1778 newbuf.append( aSource[i] );
1789 size_t sourceLen = aSource.length();
1791 for(
size_t i = 0; i < sourceLen; ++i )
1793 if( aSource[i] ==
'$' && i + 1 < sourceLen && aSource[i+1] ==
'{' )
1796 bool isCrossRef =
false;
1798 for( i = i + 2; i < sourceLen; ++i )
1800 if( aSource[i] ==
'}' )
1803 if( aSource[i] ==
':' )
1806 token.append( aSource[i] );
1812 wxString ref = token.BeforeFirst(
':', &remainder );
1817 token =
static_cast<FOOTPRINT*
>( refItem )->GetReference() + wxT(
":" )
1822 newbuf.append( wxT(
"${" ) + token + wxT(
"}" ) );
1826 newbuf.append( aSource[i] );
1836 unsigned retval = 0;
1840 for(
PAD*
pad : footprint->Pads() )
1842 if( ( aNet == -1 &&
pad->GetNetCode() > 0 ) || aNet ==
pad->GetNetCode() )
1861 if( aBoardEdgesOnly )
1870 if( ( item->GetLayerSet() & visible ).any() )
1871 bbox.
Merge( item->GetBoundingBox() );
1877 if( aBoardEdgesOnly )
1879 for(
const BOARD_ITEM* edge : footprint->GraphicalItems() )
1882 bbox.
Merge( edge->GetBoundingBox() );
1885 else if( ( footprint->GetLayerSet() & visible ).any() )
1887 bbox.
Merge( footprint->GetBoundingBox(
true ) );
1891 if( !aBoardEdgesOnly )
1896 if( ( track->GetLayerSet() & visible ).any() )
1897 bbox.
Merge( track->GetBoundingBox() );
1903 if( ( aZone->GetLayerSet() & visible ).any() )
1904 bbox.
Merge( aZone->GetBoundingBox() );
1916 int trackSegmentCount = 0;
1917 std::set<int> netCodes;
1925 trackSegmentCount++;
1927 if( item->GetNetCode() > 0 )
1928 netCodes.insert( item->GetNetCode() );
1933 for(
PAD*
pad : footprint->Pads() )
1937 if(
pad->GetNetCode() > 0 )
1938 netCodes.insert(
pad->GetNetCode() );
1942 aList.emplace_back(
_(
"Pads" ), wxString::Format( wxT(
"%d" ), padCount ) );
1943 aList.emplace_back(
_(
"Vias" ), wxString::Format( wxT(
"%d" ), viaCount ) );
1944 aList.emplace_back(
_(
"Track Segments" ), wxString::Format( wxT(
"%d" ), trackSegmentCount ) );
1945 aList.emplace_back(
_(
"Nets" ), wxString::Format( wxT(
"%d" ), (
int) netCodes.size() ) );
1946 aList.emplace_back(
_(
"Unrouted" ), wxString::Format( wxT(
"%d" ), unconnected ) );
1951 const std::vector<KICAD_T>& scanTypes )
1953#if 0 && defined(DEBUG)
1954 std::cout <<
GetClass().mb_str() <<
' ';
1957 bool footprintsScanned =
false;
1958 bool drawingsScanned =
false;
1959 bool tracksScanned =
false;
1961 for(
KICAD_T scanType : scanTypes )
1966 if( inspector(
this, testData ) == INSPECT_RESULT::QUIT )
1967 return INSPECT_RESULT::QUIT;
1992 if( !footprintsScanned )
1994 if( IterateForward<FOOTPRINT*>(
m_footprints, inspector, testData, scanTypes )
1995 == INSPECT_RESULT::QUIT )
1997 return INSPECT_RESULT::QUIT;
2000 footprintsScanned =
true;
2003 if( !drawingsScanned )
2005 if( IterateForward<BOARD_ITEM*>(
m_drawings, inspector, testData, scanTypes )
2006 == INSPECT_RESULT::QUIT )
2008 return INSPECT_RESULT::QUIT;
2011 drawingsScanned =
true;
2019 if( !tracksScanned )
2021 if( IterateForward<PCB_TRACK*>(
m_tracks, inspector, testData, scanTypes )
2022 == INSPECT_RESULT::QUIT )
2024 return INSPECT_RESULT::QUIT;
2027 tracksScanned =
true;
2035 if( marker->Visit( inspector, testData, { scanType } ) == INSPECT_RESULT::QUIT )
2036 return INSPECT_RESULT::QUIT;
2042 if( !footprintsScanned )
2044 if( IterateForward<FOOTPRINT*>(
m_footprints, inspector, testData, scanTypes )
2045 == INSPECT_RESULT::QUIT )
2047 return INSPECT_RESULT::QUIT;
2050 footprintsScanned =
true;
2055 if( zone->Visit( inspector, testData, { scanType } ) == INSPECT_RESULT::QUIT )
2056 return INSPECT_RESULT::QUIT;
2062 if( !footprintsScanned )
2064 if( IterateForward<FOOTPRINT*>(
m_footprints, inspector, testData, scanTypes )
2065 == INSPECT_RESULT::QUIT )
2067 return INSPECT_RESULT::QUIT;
2070 footprintsScanned =
true;
2073 if( IterateForward<PCB_GENERATOR*>(
m_generators, inspector, testData, { scanType } )
2074 == INSPECT_RESULT::QUIT )
2076 return INSPECT_RESULT::QUIT;
2082 if( IterateForward<PCB_GROUP*>(
m_groups, inspector, testData, { scanType } )
2083 == INSPECT_RESULT::QUIT )
2085 return INSPECT_RESULT::QUIT;
2095 return INSPECT_RESULT::CONTINUE;
2123 for(
auto it = aNetName.rbegin(); it != aNetName.rend() && rv == 0; ++it, ++count )
2127 if( ( ch >=
'0' && ch <=
'9' ) || ch ==
'_' )
2131 else if( ch ==
'+' )
2133 aComplementNet = wxT(
"-" );
2136 else if( ch ==
'-' )
2138 aComplementNet = wxT(
"+" );
2141 else if( ch ==
'N' )
2143 aComplementNet = wxT(
"P" );
2146 else if ( ch ==
'P' )
2148 aComplementNet = wxT(
"N" );
2157 if( rv != 0 && count >= 1 )
2159 aComplementNet = aNetName.Left( aNetName.length() - count )
2161 + aNetName.Right( count - 1 );
2173 wxString coupledNetName;
2176 return FindNet( coupledNetName );
2187 if( aReference == footprint->GetReference() )
2199 if( footprint->GetPath() == aPath )
2209 std::set<wxString> names;
2213 if( !net->GetNetname().IsEmpty() )
2214 names.insert( net->GetNetname() );
2240 const std::shared_ptr<NETCLASS>& defaultNetClass = bds.
m_NetSettings->GetDefaultNetclass();
2245 net->SetNetClass( bds.
m_NetSettings->GetEffectiveNetClass( net->GetNetname() ) );
2247 if( aResetTrackAndViaSizes )
2266 std::shared_ptr<COMPONENT_CLASS_SETTINGS> settings =
2270 settings->GetComponentClassAssignments(), settings->GetEnableSheetComponentClasses(),
2277 int error_count = 0;
2281 if( !zone->IsOnCopperLayer() )
2287 if( zone->GetNetCode() != 0 )
2300 zone->SetNetCode( -1 );
2315 if( footprint->HitTest( aPosition ) )
2316 pad = footprint->GetPad( aPosition, aLayerSet.any() ? aLayerSet :
LSET::AllCuMask() );
2332 return GetPad( aPosition, lset );
2340 int idxmax = aPadList.size() - 1;
2342 int delta = aPadList.size();
2355 PAD*
pad = aPadList[idx];
2357 if(
pad->GetPosition() == aPosition )
2360 if( ( aLayerSet &
pad->GetLayerSet() ).any() )
2367 for(
int ii = idx+1; ii <= idxmax; ii++ )
2371 if(
pad->GetPosition() != aPosition )
2374 if( ( aLayerSet &
pad->GetLayerSet() ).any() )
2378 for(
int ii = idx - 1 ;ii >=0; ii-- )
2382 if(
pad->GetPosition() != aPosition )
2385 if( ( aLayerSet &
pad->GetLayerSet() ).any() )
2393 if(
pad->GetPosition().x == aPosition.
x )
2395 if(
pad->GetPosition().y < aPosition.
y )
2410 else if(
pad->GetPosition().x < aPosition.
x )
2448 for(
PAD*
pad : footprint->Pads( ) )
2450 if( aNetCode < 0 || pad->GetNetCode() == aNetCode )
2451 aVector.push_back(
pad );
2473 std::vector<LENGTH_DELAY_CALCULATION_ITEM> items;
2479 if( item.
Type() != LENGTH_DELAY_CALCULATION_ITEM::TYPE::UNKNOWN )
2480 items.push_back( std::move( item ) );
2484 .
OptimiseViaLayers =
true, .MergeTracks =
true, .OptimiseTracesInPads =
true, .InferViaInPad =
false
2487 items, opts,
nullptr,
nullptr, LENGTH_DELAY_LAYER_OPT::NO_LAYER_DETAIL,
2488 LENGTH_DELAY_DOMAIN_OPT::WITH_DELAY_DETAIL );
2496 bool aVisibleOnly,
bool aIgnoreLocked )
const
2500 int min_dim = 0x7FFFFFFF;
2501 int alt_min_dim = 0x7FFFFFFF;
2502 bool current_layer_back =
IsBackLayer( aActiveLayer );
2507 if( !candidate->HitTest( aPosition ) )
2511 if( aIgnoreLocked && candidate->IsLocked() )
2519 BOX2I bb = candidate->GetBoundingBox(
false );
2525 int dist = ( aPosition.
x - offx ) * ( aPosition.
x - offx ) +
2526 ( aPosition.
y - offy ) * ( aPosition.
y - offy );
2530 if( dist <= min_dim )
2533 footprint = candidate;
2539 if( dist <= alt_min_dim )
2542 alt_footprint = candidate;
2553 return alt_footprint;
2561 std::list<ZONE*> zones;
2564 zones.push_back( zone );
2566 if( aIncludeZonesInFootprints )
2570 for(
ZONE* zone : footprint->Zones() )
2571 zones.push_back( zone );
2587 m_zones.push_back( new_area );
2596 ITEM_PICKER picker(
nullptr, new_area, UNDO_REDO::NEWITEM );
2606 bool aAllowUseArcsInPolygons,
2607 bool aIncludeNPTHAsOutlines )
2613 chainingEpsilon, aErrorHandler,
2614 aAllowUseArcsInPolygons );
2617 if( aIncludeNPTHAsOutlines )
2621 for(
PAD*
pad : fp->Pads() )
2623 if(
pad->GetAttribute () != PAD_ATTRIB::NPTH )
2641 aOutlines.
AddHole( pad_hole, jj );
2679 std::set<KIFONT::OUTLINE_FONT*>
fonts;
2692 if( permission == PERMISSION::EDITABLE || permission == PERMISSION::INSTALLABLE )
2693 fonts.insert( outlineFont );
2714 std::vector<PAD*> allPads;
2718 for(
PAD*
pad : footprint->Pads() )
2719 allPads.push_back(
pad );
2728 std::vector<BOARD_CONNECTED_ITEM*> items;
2731 items.push_back( track );
2735 for(
PAD*
pad : footprint->Pads() )
2736 items.push_back(
pad );
2740 items.push_back( zone );
2745 items.push_back( bci );
2759 item->SetNet( netInfo );
2763 aDestBoard->
Add( newNet );
2764 item->SetNet( newNet );
2775 if(
FindNet( item->GetNetCode() ) ==
nullptr )
2819 std::vector<BOARD_ITEM*>& aRemovedItems,
2820 std::vector<BOARD_ITEM*>& aChangedItems )
2872 return wxEmptyString;
2891 std::unordered_set<EDA_GROUP*> knownCycleFreeGroups;
2893 std::unordered_set<EDA_GROUP*> currentChainGroups;
2895 std::unordered_set<EDA_GROUP*> toCheckGroups;
2899 toCheckGroups.insert(
group );
2902 toCheckGroups.insert( gen );
2904 while( !toCheckGroups.empty() )
2906 currentChainGroups.clear();
2911 if( currentChainGroups.find(
group ) != currentChainGroups.end() )
2916 return "Cycle detected in group membership";
2918 else if( knownCycleFreeGroups.find(
group ) != knownCycleFreeGroups.end() )
2924 currentChainGroups.insert(
group );
2926 toCheckGroups.erase(
group );
2928 group =
group->AsEdaItem()->GetParentGroup();
2939 knownCycleFreeGroups.insert( currentChainGroups.begin(), currentChainGroups.end() );
2971 if( aFirst->
Type() != aSecond->
Type() )
2972 return aFirst->
Type() < aSecond->
Type();
2981 return shape->
Compare( other );
2987 return text->Compare( other );
2994 return textbox->PCB_SHAPE::Compare( other ) && textbox->EDA_TEXT::Compare( other );
3016 if( !track->IsOnLayer( aLayer ) )
3019 track->TransformShapeToPolygon( aOutlines, aLayer, 0, maxError,
ERROR_INSIDE );
3025 footprint->TransformPadsToPolySet( aOutlines, aLayer, 0, maxError,
ERROR_INSIDE );
3027 footprint->TransformFPShapesToPolySet( aOutlines, aLayer, 0, maxError,
ERROR_INSIDE,
3032 for(
const ZONE* zone : footprint->Zones() )
3034 if( zone->GetLayerSet().test( aLayer ) )
3035 zone->TransformSolidAreasShapesToPolygon( aLayer, aOutlines );
3042 if( zone->GetLayerSet().test( aLayer ) )
3043 zone->TransformSolidAreasShapesToPolygon( aLayer, aOutlines );
3049 if( !item->IsOnLayer( aLayer ) )
3052 switch( item->Type() )
3074 textbox->PCB_SHAPE::TransformShapeToPolygon( aOutlines, aLayer, 0, maxError,
3113 std::copy(
m_tracks.begin(),
m_tracks.end(), std::inserter( items, items.end() ) );
3114 std::copy(
m_zones.begin(),
m_zones.end(), std::inserter( items, items.end() ) );
3117 std::copy(
m_markers.begin(),
m_markers.end(), std::inserter( items, items.end() ) );
3118 std::copy(
m_groups.begin(),
m_groups.end(), std::inserter( items, items.end() ) );
3129 const BOARD& other =
static_cast<const BOARD&
>( aItem );
3140 for(
auto it1 = thisNetNames.begin(), it2 = otherNetNames.begin();
3141 it1 != thisNetNames.end() && it2 != otherNetNames.end(); ++it1, ++it2 )
3145 if( it1->first != it2->first )
3180 wxArrayString ourVars;
3183 wxArrayString otherVars;
3186 if( ourVars != otherVars )
3210 for(
PAD*
pad : footprint->Pads() )
3212 if(
pad->GetProperty() == PAD_PROP::PRESSFIT )
3228 for(
PAD*
pad : footprint->Pads() )
3230 if(
pad->GetProperty() == PAD_PROP::CASTELLATED )
@ NORMAL
Use all material properties from model file.
constexpr EDA_IU_SCALE pcbIUScale
bool sortPadsByXthenYCoord(PAD *const &aLH, PAD *const &aRH)
Used by #GetSortedPadListByXCoord to sort a pad list by X coordinate value.
std::set< wxString >::iterator FindByFirstNFields(std::set< wxString > &strSet, const wxString &searchStr, char delimiter, int n)
#define DEFAULT_CHAINING_EPSILON_MM
BOARD_USE
Flags to specify how the board is being used.
LAYER_T
The allowed types of layers, same as Specctra DSN spec.
std::set< BOARD_ITEM *, CompareByUuid > BOARD_ITEM_SET
Set of BOARD_ITEMs ordered by UUID.
BASE_SET & reset(size_t pos)
BASE_SET & set(size_t pos)
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
Container for design settings for a BOARD object.
void UseCustomTrackViaSize(bool aEnabled)
Enables/disables custom track/via size settings.
void SetCustomDiffPairWidth(int aWidth)
Sets custom track width for differential pairs (i.e.
void SetEnabledLayers(const LSET &aMask)
Change the bit-mask of enabled layers to aMask.
std::shared_ptr< NET_SETTINGS > m_NetSettings
void SetCustomTrackWidth(int aWidth)
Sets custom width for track (i.e.
void SetCustomViaSize(int aSize)
Set custom size for via diameter (i.e.
const LSET & GetEnabledLayers() const
Return a bit-mask of all the layers that are enabled.
void SetCustomDiffPairGap(int aGap)
Sets custom gap for differential pairs (i.e.
bool IsLayerEnabled(PCB_LAYER_ID aLayerId) const
Test whether a given layer aLayerId is enabled.
void SetUserDefinedLayerCount(int aNewLayerCount)
Set the number of user defined layers to aNewLayerCount.
BOARD_STACKUP & GetStackupDescriptor()
void SetCustomViaDrill(int aDrill)
Sets custom size for via drill (i.e.
int GetCopperLayerCount() const
int GetUserDefinedLayerCount() const
void SetCopperLayerCount(int aNewLayerCount)
Set the copper layer count to aNewLayerCount.
void SetCustomDiffPairViaGap(int aGap)
Sets custom via gap for differential pairs (i.e.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void Move(const VECTOR2I &aMoveVector)
Move this object.
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
static VECTOR2I ZeroOffset
A value of wxPoint(0,0) which can be passed to the Draw() functions.
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
virtual void OnBoardNetSettingsChanged(BOARD &aBoard)
virtual void OnBoardItemsAdded(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItem)
virtual void OnBoardRatsnestChanged(BOARD &aBoard)
virtual void OnBoardItemsChanged(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItem)
virtual void OnBoardItemChanged(BOARD &aBoard, BOARD_ITEM *aBoardItem)
virtual void OnBoardItemRemoved(BOARD &aBoard, BOARD_ITEM *aBoardItem)
virtual void OnBoardItemAdded(BOARD &aBoard, BOARD_ITEM *aBoardItem)
virtual void OnBoardHighlightNetChanged(BOARD &aBoard)
virtual void OnBoardCompositeUpdate(BOARD &aBoard, std::vector< BOARD_ITEM * > &aAddedItems, std::vector< BOARD_ITEM * > &aRemovedItems, std::vector< BOARD_ITEM * > &aChangedItems)
virtual void OnBoardItemsRemoved(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItem)
Manage layers needed to make a physical board.
void BuildDefaultStackupList(const BOARD_DESIGN_SETTINGS *aSettings, int aActiveCopperLayersCount=0)
Create a default stackup, according to the current BOARD_DESIGN_SETTINGS settings.
Information pertinent to a Pcbnew printed circuit board.
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &scanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
ZONE * m_SolderMaskBridges
void GetContextualTextVars(wxArrayString *aVars) const
bool IsFootprintLayerVisible(PCB_LAYER_ID aLayer) const
Expect either of the two layers on which a footprint can reside, and returns whether that layer is vi...
BOARD_STACKUP GetStackupOrDefault() const
std::unordered_map< PTR_PTR_LAYER_CACHE_KEY, bool > m_EnclosedByAreaCache
std::map< ZONE *, std::map< PCB_LAYER_ID, ISOLATED_ISLANDS > > m_ZoneIsolatedIslandsMap
PCB_LAYER_ID GetCopperLayerStackMaxId() const
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false, bool aIncludeNPTHAsOutlines=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
void OnItemChanged(BOARD_ITEM *aItem)
Notify the board and its listeners that an item on the board has been modified in some way.
bool m_LegacyDesignSettingsLoaded
True if the legacy board design settings were loaded from a file.
bool IsFootprintHolder() const
Find out if the board is being used to hold a single footprint for editing/viewing.
PAD * GetPad(const VECTOR2I &aPosition, const LSET &aLayerMask) const
Find a pad aPosition on aLayer.
int GetUserDefinedLayerCount() const
void SetPosition(const VECTOR2I &aPos) override
std::map< wxString, wxString > m_properties
EMBEDDED_FILES * GetEmbeddedFiles() override
int m_fileFormatVersionAtLoad
NETINFO_ITEM * DpCoupledNet(const NETINFO_ITEM *aNet)
std::vector< ZONE * > m_DRCCopperZones
void SetVisibleLayers(const LSET &aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings changes the bit-mask of vis...
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
void MapNets(BOARD *aDestBoard)
Map all nets in the given board to nets with the same name (if any) in the destination board.
GAL_SET m_LegacyVisibleItems
LENGTH_DELAY_CALCULATION * GetLengthCalculation() const
Returns the track length calculator.
void RunOnNestedEmbeddedFiles(const std::function< void(EMBEDDED_FILES *)> &aFunction) override
Provide access to nested embedded files, such as symbols in schematics and footprints in boards.
const GENERATORS & Generators() const
static wxString GetStandardLayerName(PCB_LAYER_ID aLayerId)
Return an "English Standard" name of a PCB layer when given aLayerNumber.
const std::vector< BOARD_CONNECTED_ITEM * > AllConnectedItems()
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
int m_outlinesChainingEpsilon
the max distance between 2 end point to see them connected when building the board outlines
std::tuple< int, double, double, double, double > GetTrackLength(const PCB_TRACK &aTrack) const
Return data on the length and number of track segments connected to a given track.
std::set< wxString > GetNetClassAssignmentCandidates() const
Return the set of netname candidates for netclass assignment.
void RemoveAllListeners()
Remove all listeners.
std::unique_ptr< BOARD_DESIGN_SETTINGS > m_designSettings
All of the board design settings are stored as a JSON object inside the project file.
void AddListener(BOARD_LISTENER *aListener)
Add a listener to the board to receive calls whenever something on the board has been modified.
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
void SetProperties(const std::map< wxString, wxString > &aProps)
bool IsBackLayer(PCB_LAYER_ID aLayer) const
GAL_SET GetVisibleElements() const
Return a set of all the element categories that are visible.
void SetHighLightNet(int aNetCode, bool aMulti=false)
Select the netcode to be highlighted.
HIGH_LIGHT_INFO m_highLight
bool SetLayerDescr(PCB_LAYER_ID aIndex, const LAYER &aLayer)
Return the type of the copper layer given by aLayer.
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
void UpdateBoardOutline()
const ZONES & Zones() const
void BulkRemoveStaleTeardrops(BOARD_COMMIT &aCommit)
Remove all teardrop zones with the STRUCT_DELETED flag set.
void InvokeListeners(Func &&aFunc, Args &&... args)
void SetDesignSettings(const BOARD_DESIGN_SETTINGS &aSettings)
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
EMBEDDED_FILES * m_embeddedFilesDelegate
ZONE * AddArea(PICKED_ITEMS_LIST *aNewZonesList, int aNetcode, PCB_LAYER_ID aLayer, VECTOR2I aStartPointPosition, ZONE_BORDER_DISPLAY_STYLE aHatch)
Add an empty copper area to board areas list.
bool IsFrontLayer(PCB_LAYER_ID aLayer) const
const GROUPS & Groups() const
The groups must maintain the following invariants.
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
bool IsLayerEnabled(PCB_LAYER_ID aLayer) const
A proxy function that calls the correspondent function in m_BoardSettings tests whether a given layer...
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Return the type of the copper layer given by aLayer.
void RecordDRCExclusions()
Scan existing markers and record data from any that are Excluded.
void OnItemsCompositeUpdate(std::vector< BOARD_ITEM * > &aAddedItems, std::vector< BOARD_ITEM * > &aRemovedItems, std::vector< BOARD_ITEM * > &aChangedItems)
Notify the board and its listeners that items on the board have been modified in a composite operatio...
int SetAreasNetCodesFromNetNames()
Set the .m_NetCode member of all copper areas, according to the area Net Name The SetNetCodesFromNetN...
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
void SynchronizeTimeDomainProperties()
Ensure that all time domain properties providers are in sync with current settings.
void ResetNetHighLight()
Reset all high light data to the init state.
bool SetLayerName(PCB_LAYER_ID aLayer, const wxString &aLayerName)
Changes the name of the layer given by aLayer.
std::list< ZONE * > GetZoneList(bool aIncludeZonesInFootprints=false) const
void ConvertBrdLayerToPolygonalContours(PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aOutlines) const
Build a set of polygons which are the outlines of copper items (pads, tracks, vias,...
bool ResolveTextVar(wxString *token, int aDepth) const
const MARKERS & Markers() const
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayer) const
const std::vector< PAD * > GetPads() const
Return a reference to a list of all the pads.
void Move(const VECTOR2I &aMoveVector) override
Move this object.
TITLE_BLOCK & GetTitleBlock()
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
void FixupEmbeddedData()
After loading a file from disk, the footprints do not yet contain the full data for their embedded fi...
int GetMaxClearanceValue() const
Returns the maximum clearance value for any object on the board.
PCB_LAYER_ID GetLayerID(const wxString &aLayerName) const
Return the ID of a layer.
HIGH_LIGHT_INFO m_highLightPrevious
LSET m_LegacyVisibleLayers
Visibility settings stored in board prior to 6.0, only used for loading legacy files.
void SetVisibleAlls()
Change the bit-mask of visible element categories and layers.
int GetCopperLayerCount() const
std::vector< BOARD_LISTENER * > m_listeners
std::unordered_map< PTR_PTR_CACHE_KEY, bool > m_IntersectsCourtyardCache
void IncrementTimeStamp()
int MatchDpSuffix(const wxString &aNetName, wxString &aComplementNet)
Fetch the coupled netname for a given net.
std::unordered_map< PTR_PTR_CACHE_KEY, bool > m_IntersectsFCourtyardCache
std::unique_ptr< LENGTH_DELAY_CALCULATION > m_lengthDelayCalc
const FOOTPRINTS & Footprints() const
std::shared_ptr< CONNECTIVITY_DATA > m_connectivity
std::set< KIFONT::OUTLINE_FONT * > GetFonts() const override
Get the list of all outline fonts used in the board.
void RemoveAll(std::initializer_list< KICAD_T > aTypes={ PCB_NETINFO_T, PCB_MARKER_T, PCB_GROUP_T, PCB_ZONE_T, PCB_GENERATOR_T, PCB_FOOTPRINT_T, PCB_TRACE_T, PCB_SHAPE_T })
An efficient way to remove all items of a certain type from the board.
const BOARD_ITEM_SET GetItemSet()
const TRACKS & Tracks() const
int m_DRCMaxPhysicalClearance
FOOTPRINT * FindFootprintByPath(const KIID_PATH &aPath) const
Search for a FOOTPRINT within this board with the given path.
void FinalizeBulkRemove(std::vector< BOARD_ITEM * > &aRemovedItems)
Must be used if Remove() is used using a BULK_x REMOVE_MODE to generate a change event for listeners.
std::unordered_map< wxString, LSET > m_LayerExpressionCache
wxString GroupsSanityCheckInternal(bool repair)
void OnRatsnestChanged()
Notify the board and its listeners that the ratsnest has been recomputed.
wxString ConvertCrossReferencesToKIIDs(const wxString &aSource) const
Convert cross-references back and forth between ${refDes:field} and ${kiid:field}.
wxString GetClass() const override
Return the class name.
std::unique_ptr< COMPONENT_CLASS_MANAGER > m_componentClassManager
bool m_LegacyNetclassesLoaded
True if netclasses were loaded from the file.
void SetCopperLayerCount(int aCount)
std::unordered_map< const ZONE *, BOX2I > m_ZoneBBoxCache
std::unordered_map< PTR_PTR_CACHE_KEY, bool > m_IntersectsBCourtyardCache
TRACKS TracksInNet(int aNetCode)
Collect all the TRACKs and VIAs that are members of a net given by aNetCode.
void SetProject(PROJECT *aProject, bool aReferenceOnly=false)
Link a board to a given project.
FOOTPRINT * GetFootprint(const VECTOR2I &aPosition, PCB_LAYER_ID aActiveLayer, bool aVisibleOnly, bool aIgnoreLocked=false) const
Get a footprint by its bounding rectangle at aPosition on aLayer.
const wxString & GetFileName() const
bool operator==(const BOARD_ITEM &aOther) const override
std::vector< PCB_MARKER * > ResolveDRCExclusions(bool aCreateMarkers)
Rebuild DRC markers from the serialized data in BOARD_DESIGN_SETTINGS.
int GetPadWithCastellatedAttrCount()
FOOTPRINT * FindFootprintByReference(const wxString &aReference) const
Search for a FOOTPRINT within this board with the given reference designator.
unsigned GetNodesCount(int aNet=-1) const
void FillItemMap(std::map< KIID, EDA_ITEM * > &aMap)
void SetElementVisibility(GAL_LAYER_ID aLayer, bool aNewState)
Change the visibility of an element category.
std::shared_ptr< DRC_RTREE > m_CopperItemRTreeCache
bool SetLayerType(PCB_LAYER_ID aLayer, LAYER_T aLayerType)
Change the type of the layer given by aLayer.
void DetachAllFootprints()
Remove all footprints without deleting.
std::map< int, LAYER > m_layers
void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const override
Invoke a function on all children.
int GetOutlinesChainingEpsilon()
void GetSortedPadListByXthenYCoord(std::vector< PAD * > &aVector, int aNetCode=-1) const
First empties then fills the vector with all pads and sorts them by increasing x coordinate,...
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
A proxy function that calls the correspondent function in m_BoardSettings tests whether a given layer...
std::unordered_map< ZONE *, std::unique_ptr< DRC_RTREE > > m_CopperZoneRTreeCache
void FinalizeBulkAdd(std::vector< BOARD_ITEM * > &aNewItems)
Must be used if Add() is used using a BULK_x ADD_MODE to generate a change event for listeners.
int LayerDepth(PCB_LAYER_ID aStartLayer, PCB_LAYER_ID aEndLayer) const
void DeleteAllFootprints()
Remove all footprints from the deque and free the memory associated with them.
PROJECT * GetProject() const
int GetPadWithPressFitAttrCount()
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
std::vector< ZONE * > m_DRCZones
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
void UpdateRatsnestExclusions()
Update the visibility flags on the current unconnected ratsnest lines.
wxString ConvertKIIDsToCrossReferences(const wxString &aSource) const
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
std::unordered_map< KIID, BOARD_ITEM * > m_itemByIdCache
void RemoveListener(BOARD_LISTENER *aListener)
Remove the specified listener.
std::shared_mutex m_CachesMutex
bool SynchronizeComponentClasses(const std::unordered_set< wxString > &aNewSheetPaths) const
Copy component class / component class generator information from the project settings.
void DeleteMARKERs()
Delete all MARKERS from the board.
void Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
std::unordered_map< PTR_PTR_LAYER_CACHE_KEY, bool > m_IntersectsAreaCache
std::optional< int > m_maxClearanceValue
void HighLightON(bool aValue=true)
Enable or disable net highlighting.
void SetEnabledLayers(const LSET &aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings.
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
void OnItemsChanged(std::vector< BOARD_ITEM * > &aItems)
Notify the board and its listeners that an item on the board has been modified in some way.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
VECTOR2I GetPosition() const override
void CacheTriangulation(PROGRESS_REPORTER *aReporter=nullptr, const std::vector< ZONE * > &aZones={})
void SetVisibleElements(const GAL_SET &aMask)
A proxy function that calls the correspondent function in m_BoardSettings.
void EmbedFonts() override
Finds all fonts used in the board and embeds them in the file if permissions allow.
PCB_BOARD_OUTLINE * m_boardOutline
void SetUserDefinedLayerCount(int aCount)
const DRAWINGS & Drawings() const
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr size_type GetHeight() const
CN_EDGE represents a point-to-point connection, whether realized or unrealized (ie: tracks etc.
std::shared_ptr< const CN_ANCHOR > GetSourceNode() const
void SetVisible(bool aVisible)
std::shared_ptr< const CN_ANCHOR > GetTargetNode() const
COMMIT & Removed(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
A class to manage Component Classes in a board context.
static DELETED_BOARD_ITEM * GetInstance()
The base class for create windows for drawing purpose.
A set of EDA_ITEMs (i.e., without duplicates).
A base class for most all the KiCad significant classes used in schematics and boards.
virtual VECTOR2I GetPosition() const
virtual void ClearEditFlags()
void SetFlags(EDA_ITEM_FLAGS aMask)
virtual EDA_GROUP * GetParentGroup() const
KICAD_T Type() const
Returns the type of object.
virtual INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes)
May be re-implemented for each derived class in order to handle all the types given by its member dat...
virtual void SetParent(EDA_ITEM *aParent)
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
int Compare(const EDA_SHAPE *aOther) const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
const std::map< wxString, EMBEDDED_FILE * > & EmbeddedFileMap() const
Helper for storing and iterating over GAL_LAYER_IDs.
static GAL_SET DefaultVisible()
static const std::vector< KICAD_T > BoardLevelItems
A scan list for all primary board items, omitting items which are subordinate to a FOOTPRINT,...
static const std::vector< KICAD_T > Tracks
A scan list for only TRACKs and ARCs.
std::set< int > m_netCodes
FONT is an abstract base class for both outline and stroke fonts.
virtual bool IsOutline() const
Class OUTLINE_FONT implements outline font drawing.
EMBEDDING_PERMISSION GetEmbeddingPermission() const
bool IsBOARD_ITEM() const
virtual wxString GetClass() const =0
Return the class name.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Lightweight class which holds a pad, via, or a routed trace outline.
TYPE Type() const
Gets the routing item type.
Class which calculates lengths (and associated routing statistics) in a BOARD context.
LENGTH_DELAY_CALCULATION_ITEM GetLengthCalculationItem(const BOARD_CONNECTED_ITEM *aBoardItem) const
Return a LENGTH_CALCULATION_ITEM constructed from the given BOARD_CONNECTED_ITEM.
LENGTH_DELAY_STATS CalculateLengthDetails(std::vector< LENGTH_DELAY_CALCULATION_ITEM > &aItems, PATH_OPTIMISATIONS aOptimisations, const PAD *aStartPad=nullptr, const PAD *aEndPad=nullptr, LENGTH_DELAY_LAYER_OPT aLayerOpt=LENGTH_DELAY_LAYER_OPT::NO_LAYER_DETAIL, LENGTH_DELAY_DOMAIN_OPT aDomain=LENGTH_DELAY_DOMAIN_OPT::NO_DELAY_DETAIL) const
Calculates the electrical length of the given items.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllLayersMask()
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
std::shared_ptr< RC_ITEM > GetRCItem() const
void SetExcluded(bool aExcluded, const wxString &aComment=wxEmptyString)
void SetParent(JSON_SETTINGS *aParent, bool aLoadFromFile=true)
static const char Default[]
the name of the default NETCLASS
Handle the data for a net.
wxString GetClass() const override
Return the class name.
const wxString & GetNetname() const
void SetNetCode(int aNetCode)
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
static const int ORPHANED
Constant that forces initialization of a netinfo item to the NETINFO_ITEM ORPHANED (typically -1) whe...
static NETINFO_ITEM * OrphanedItem()
NETINFO_ITEM meaning that there was no net assigned for an item, as there was no board storing net li...
unsigned GetNetCount() const
void RemoveNet(NETINFO_ITEM *aNet)
Remove a net from the net list.
NETINFO_ITEM * GetNetItem(int aNetCode) const
void clear()
Delete the list of nets (and free memory).
void AppendNet(NETINFO_ITEM *aNewElement)
Add aNewElement to the end of the net list.
const NETNAMES_MAP & NetsByName() const
Return the name map, at least for python.
VECTOR2I GetPosition() const override
Describe the page size and margins of a paper page on which to eventually print or plot.
const VECTOR2D & GetSizeMils() const
wxPrintOrientation GetWxOrientation() const
static double GetCustomHeightMils()
wxPaperSize GetPaperId() const
static double GetCustomWidthMils()
const SHAPE_POLY_SET & GetOutline() const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool aIgnoreLineWidth=false) const override
Convert the item shape to a closed polygon.
DIM_UNITS_MODE GetUnitsMode() const
A set of BOARD_ITEMs (i.e., without duplicates).
static PCB_MARKER * DeserializeFromString(const wxString &data)
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
static int Compare(const PCB_TABLE *aTable, const PCB_TABLE *aOther)
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
const VECTOR2I & GetEndPoint(ENDPOINT_T aEndPoint) const
Return the selected endpoint (start or end)
A holder to handle information on schematic or board items.
void PushItem(const ITEM_PICKER &aItem)
Push aItem to the top of the list.
A progress reporter interface for use in multi-threaded environments.
virtual bool IsCancelled() const =0
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.
virtual void AdvanceProgress()=0
Increment the progress bar length (inside the current virtual zone).
The backing store for a PROJECT, in JSON format.
std::shared_ptr< COMPONENT_CLASS_SETTINGS > & ComponentClassSettings()
LSET m_VisibleLayers
Board settings.
GAL_SET m_VisibleItems
The GAL layers (aka items) that are turned on for viewing (.
Container for project specific data.
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
virtual PROJECT_FILE & GetProjectFile() const
virtual std::map< wxString, wxString > & GetTextVars() const
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
bool PointInside(const VECTOR2I &aPt, int aAccuracy=0, bool aUseBBoxCache=false) const override
Check if point aP lies inside a closed shape.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
int AddHole(const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
Adds a new hole to the given outline (default: last) and returns its index.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
int OutlineCount() const
Return the number of outlines in the set.
const wxString & GetComment(int aIdx) const
static void GetContextualTextVars(wxArrayString *aVars)
Handle a list of polygons defining a copper zone.
void SetMinThickness(int aMinThickness)
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
SHAPE_POLY_SET * Outline()
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
void SetLayerSet(const LSET &aLayerSet) override
bool IsTeardropArea() const
bool AppendCorner(VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication=false)
Add a new corner to the zone outline (to the main outline or a hole)
bool BuildBoardPolygonOutlines(BOARD *aBoard, SHAPE_POLY_SET &aOutlines, int aErrorMax, int aChainingEpsilon, OUTLINE_ERROR_HANDLER *aErrorHandler, bool aAllowUseArcsInPolygons)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
const std::function< void(const wxString &msg, BOARD_ITEM *itemA, BOARD_ITEM *itemB, const VECTOR2I &pt)> OUTLINE_ERROR_HANDLER
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
std::function< INSPECT_RESULT(EDA_ITEM *aItem, void *aTestData) > INSPECTOR_FUNC
Used to inspect and possibly collect the (search) results of iterating over a list or tree of KICAD_T...
#define STRUCT_DELETED
flag indication structures to be erased
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
@ GAL_LAYER_ID_BITMASK_END
This is the end of the layers used for visibility bit masks in legacy board files.
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
PCB_LAYER_ID
A quick note on layer IDs:
#define GAL_LAYER_INDEX(x)
Use this macro to convert a #GAL layer to a 0-indexed offset from LAYER_VIAS.
PCB_LAYER_ID ToLAYER_ID(int aLayer)
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Class to handle a set of BOARD_ITEMs.
Class that computes missing connections on a PCB.
bool operator()(const BOARD_ITEM *aFirst, const BOARD_ITEM *aSecond) const
bool operator()(const BOARD_ITEM *aFirst, const BOARD_ITEM *aSecond) const
constexpr int mmToIU(double mm) const
Container to hold information pertinent to a layer of a BOARD.
static LAYER_T ParseType(const char *aType)
Convert a string to a LAYER_T.
static const char * ShowType(LAYER_T aType)
Convert a LAYER_T enum to a string representation of the layer type.
Holds length measurement result details and statistics.
Struct to control which optimisations the length calculation code runs on the given path objects.
bool OptimiseViaLayers
Optimise via layers for height calculations, ensuring only the distance between routed segments is co...
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
BS::thread_pool thread_pool
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_NETINFO_T
class NETINFO_ITEM, a description of a net
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
ZONE_BORDER_DISPLAY_STYLE
Zone border styles.