26#include <magic_enum.hpp>
29#include <unordered_set>
70#include <google/protobuf/any.pb.h>
71#include <api/board/board_types.pb.h>
174 std::map<EDA_ITEM*, EDA_ITEM*> ptrMap;
182 ptrMap[field] = existingField;
183 *existingField = *field;
189 ptrMap[field] = newField;
197 PAD* newPad =
static_cast<PAD*
>(
pad->Clone() );
198 ptrMap[
pad ] = newPad;
205 ZONE* newZone =
static_cast<ZONE*
>( zone->Clone() );
206 ptrMap[ zone ] = newZone;
220 ptrMap[ item ] = newItem;
228 ptrMap[
group ] = newGroup;
235 ptrMap[ point ] = newPoint;
248 if( ptrMap.count( member ) )
249 newGroup->
AddItem( ptrMap[ member ] );
262 *
this = std::move( aFootprint );
302 board->IncrementTimeStamp();
309 types::FootprintInstance footprint;
311 footprint.mutable_id()->set_value(
m_Uuid.AsStdString() );
312 footprint.mutable_position()->set_x_nm(
GetPosition().x );
313 footprint.mutable_position()->set_y_nm(
GetPosition().y );
316 footprint.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
317 : kiapi::common::types::LockedState::LS_UNLOCKED );
319 google::protobuf::Any buf;
321 buf.UnpackTo( footprint.mutable_reference_field() );
323 buf.UnpackTo( footprint.mutable_value_field() );
325 buf.UnpackTo( footprint.mutable_datasheet_field() );
327 buf.UnpackTo( footprint.mutable_description_field() );
329 types::FootprintAttributes* attrs = footprint.mutable_attributes();
335 attrs->set_do_not_populate(
IsDNP() );
339 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_THROUGH_HOLE );
341 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_SMD );
343 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_UNSPECIFIED );
345 types::Footprint* def = footprint.mutable_definition();
350 def->mutable_attributes()->set_keywords(
GetKeywords().ToStdString() );
354 types::FootprintDesignRuleOverrides* overrides = footprint.mutable_overrides();
368 overrides->set_zone_connection(
373 types::NetTieDefinition* netTie = def->add_net_ties();
374 wxStringTokenizer tokenizer(
group,
", \t\r\n", wxTOKEN_STRTOK );
376 while( tokenizer.HasMoreTokens() )
377 netTie->add_pad_number( tokenizer.GetNextToken().ToStdString() );
385 if( item->IsMandatory() )
388 google::protobuf::Any* itemMsg = def->add_items();
389 item->Serialize( *itemMsg );
392 for(
const PAD* item :
Pads() )
394 google::protobuf::Any* itemMsg = def->add_items();
395 item->Serialize( *itemMsg );
400 google::protobuf::Any* itemMsg = def->add_items();
401 item->Serialize( *itemMsg );
406 google::protobuf::Any* itemMsg = def->add_items();
407 item->Serialize( *itemMsg );
412 google::protobuf::Any* itemMsg = def->add_items();
413 types::Footprint3DModel modelMsg;
414 modelMsg.set_filename(
model.m_Filename.ToUTF8() );
418 modelMsg.set_visible(
model.m_Show );
419 modelMsg.set_opacity(
model.m_Opacity );
420 itemMsg->PackFrom( modelMsg );
425 footprint.set_symbol_sheet_name(
m_sheetname.ToUTF8() );
426 footprint.set_symbol_sheet_filename(
m_sheetfile.ToUTF8() );
427 footprint.set_symbol_footprint_filters(
m_filters.ToUTF8() );
429 aContainer.PackFrom( footprint );
436 types::FootprintInstance footprint;
438 if( !aContainer.UnpackTo( &footprint ) )
445 SetLocked( footprint.locked() == kiapi::common::types::LockedState::LS_LOCKED );
447 google::protobuf::Any buf;
448 types::Field mandatoryField;
450 if( footprint.has_reference_field() )
452 mandatoryField = footprint.reference_field();
454 buf.PackFrom( mandatoryField );
458 if( footprint.has_value_field() )
460 mandatoryField = footprint.value_field();
462 buf.PackFrom( mandatoryField );
466 if( footprint.has_datasheet_field() )
468 mandatoryField = footprint.datasheet_field();
470 buf.PackFrom( mandatoryField );
474 if( footprint.has_description_field() )
476 mandatoryField = footprint.description_field();
478 buf.PackFrom( mandatoryField );
484 switch( footprint.attributes().mounting_style() )
486 case types::FootprintMountingStyle::FMS_THROUGH_HOLE:
490 case types::FootprintMountingStyle::FMS_SMD:
498 SetBoardOnly( footprint.attributes().not_in_schematic() );
502 SetDNP( footprint.attributes().do_not_populate() );
509 SetKeywords( footprint.definition().attributes().keywords() );
511 const types::FootprintDesignRuleOverrides& overrides = footprint.overrides();
513 if( overrides.has_copper_clearance() )
518 if( overrides.has_solder_mask() && overrides.solder_mask().has_solder_mask_margin() )
523 if( overrides.has_solder_paste() )
525 const types::SolderPasteOverrides& pasteSettings = overrides.solder_paste();
527 if( pasteSettings.has_solder_paste_margin() )
532 if( pasteSettings.has_solder_paste_margin_ratio() )
540 for(
const types::NetTieDefinition& netTieMsg : footprint.definition().net_ties() )
544 for(
const std::string&
pad : netTieMsg.pad_number() )
545 group.Append( wxString::Format( wxT(
"%s " ),
pad ) );
553 for(
int layerMsg : footprint.definition().private_layers() )
558 privateLayers.
set( layer );
564 m_sheetname = wxString::FromUTF8( footprint.symbol_sheet_name() );
565 m_sheetfile = wxString::FromUTF8( footprint.symbol_sheet_filename() );
566 m_filters = wxString::FromUTF8( footprint.symbol_footprint_filters() );
571 if( !field->IsMandatory() )
582 for(
const google::protobuf::Any& itemMsg : footprint.definition().items() )
590 if( itemMsg.type_url() ==
"type.googleapis.com/kiapi.board.types.Footprint3DModel" )
592 types::Footprint3DModel modelMsg;
594 if( !itemMsg.UnpackTo( &modelMsg ) )
599 model.m_Filename = wxString::FromUTF8( modelMsg.filename() );
600 model.m_Show = modelMsg.visible();
601 model.m_Opacity = modelMsg.opacity();
610 wxLogTrace(
traceApi, wxString::Format( wxS(
"Attempting to unpack unknown type %s "
611 "from footprint message, skipping" ),
612 itemMsg.type_url() ) );
620 if( item && item->Deserialize( itemMsg ) )
632 if( field->GetId() == aFieldType )
647 if( field->GetId() == aFieldType )
657 return GetField( aFieldName ) !=
nullptr;
665 if( field->GetName() == aFieldName )
681 if( !field->IsVisible() || field->GetText().IsEmpty() )
685 aVector.push_back( field );
688 std::sort( aVector.begin(), aVector.end(),
691 return lhs->GetOrdinal() < rhs->GetOrdinal();
701 ordinal = std::max( ordinal, field->GetOrdinal() + 1 );
708 bool aStyleShapes,
bool aStyleDimensions,
bool aStyleBarcodes )
713 field->StyleFromSettings(
board.GetDesignSettings(),
true );
718 switch( item->Type() )
723 item->StyleFromSettings(
board.GetDesignSettings(),
true );
728 if( aStyleShapes && !item->IsOnCopperLayer() )
729 item->StyleFromSettings(
board.GetDesignSettings(),
true );
738 if( aStyleDimensions )
739 item->StyleFromSettings(
board.GetDesignSettings(),
true );
745 item->StyleFromSettings(
board.GetDesignSettings(),
true );
758 std::vector< BOARD_ITEM* > item_list;
761 item_list.push_back( field );
764 item_list.push_back(
pad );
767 item_list.push_back( gr_item );
772 item_list.push_back(
group );
776 item_list.push_back( zone );
780 item_list.push_back( point );
782 bool changed =
false;
788 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
801 m_pos = aOther.m_pos;
833 for(
PCB_FIELD* field : aOther.m_fields )
836 aOther.m_fields.clear();
844 for(
PAD*
pad : aOther.Pads() )
847 aOther.Pads().clear();
855 for(
ZONE* item : aOther.Zones() )
863 item->SetNetCode( -1 );
866 aOther.Zones().clear();
874 for(
BOARD_ITEM* item : aOther.GraphicalItems() )
877 aOther.GraphicalItems().clear();
888 aOther.Groups().clear();
896 for(
PCB_POINT* point : aOther.Points() )
899 aOther.Points().clear();
912 aOther.m_componentClassCacheProxy->GetStaticComponentClass() );
915 aOther.m_fields.clear();
916 aOther.Pads().clear();
917 aOther.Zones().clear();
918 aOther.GraphicalItems().clear();
919 aOther.m_initial_comments =
nullptr;
955 std::map<EDA_ITEM*, EDA_ITEM*> ptrMap;
966 ptrMap[field] = newField;
979 ptrMap[
pad ] = newPad;
991 ZONE* newZone =
static_cast<ZONE*
>( zone->Clone() );
992 ptrMap[ zone ] = newZone;
1011 ptrMap[ item ] = newItem;
1027 newGroup->
AddItem( ptrMap[ member ] );
1041 ptrMap[ point ] = newItem;
1066 *
this = *
static_cast<const FOOTPRINT*
>( aOther );
1092 aVars->push_back( wxT(
"REFERENCE" ) );
1093 aVars->push_back( wxT(
"VALUE" ) );
1094 aVars->push_back( wxT(
"LAYER" ) );
1095 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
1096 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
1097 aVars->push_back( wxT(
"SHORT_NET_NAME(<pad_number>)" ) );
1098 aVars->push_back( wxT(
"NET_NAME(<pad_number>)" ) );
1099 aVars->push_back( wxT(
"NET_CLASS(<pad_number>)" ) );
1100 aVars->push_back( wxT(
"PIN_NAME(<pad_number>)" ) );
1109 if( token->IsSameAs( wxT(
"REFERENCE" ) ) )
1114 else if( token->IsSameAs( wxT(
"VALUE" ) ) )
1119 else if( token->IsSameAs( wxT(
"LAYER" ) ) )
1124 else if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
1126 *token =
m_fpid.GetUniStringLibNickname();
1129 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
1131 *token =
m_fpid.GetUniStringLibItemName();
1134 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) )
1135 || token->StartsWith( wxT(
"NET_NAME(" ) )
1136 || token->StartsWith( wxT(
"NET_CLASS(" ) )
1137 || token->StartsWith( wxT(
"PIN_NAME(" ) ) )
1139 wxString padNumber = token->AfterFirst(
'(' );
1140 padNumber = padNumber.BeforeLast(
')' );
1144 if(
pad->GetNumber() == padNumber )
1146 if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
1147 *token =
pad->GetShortNetname();
1148 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
1149 *token =
pad->GetNetname();
1150 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
1151 *token =
pad->GetNetClassName();
1153 *token =
pad->GetPinFunction();
1161 *token = field->GetShownText(
false, aDepth + 1 );
1180 return it !=
m_variants.end() ? &it->second :
nullptr;
1188 return it !=
m_variants.end() ? &it->second :
nullptr;
1194 if( aVariant.
GetName().IsEmpty()
1206 it->second = std::move( updated );
1216 if( aVariantName.IsEmpty()
1219 wxASSERT_MSG(
false, wxT(
"Variant name cannot be empty or default." ) );
1233 auto inserted =
m_variants.emplace( aVariantName, std::move( variant ) );
1234 return &inserted.first->second;
1246 if( aNewName.IsEmpty()
1257 auto existingIt =
m_variants.find( aNewName );
1259 if( existingIt !=
m_variants.end() && existingIt != it )
1262 if( it->first == aNewName )
1268 m_variants.emplace( aNewName, std::move( variant ) );
1281 if( aVariantName.IsEmpty()
1288 return variant->
GetDNP();
1298 if( aVariantName.IsEmpty()
1315 if( aVariantName.IsEmpty()
1330 const wxString& aFieldName )
const
1333 if( !aVariantName.IsEmpty()
1344 return field->GetText();
1361 switch( aBoardItem->
Type() )
1387 m_pads.push_back(
static_cast<PAD*
>( aBoardItem ) );
1389 m_pads.push_front(
static_cast<PAD*
>( aBoardItem ) );
1395 m_zones.push_back(
static_cast<ZONE*
>( aBoardItem ) );
1410 wxFAIL_MSG( wxT(
"FOOTPRINT::Add(): Markers go at the board level, even in the footprint editor" ) );
1414 wxFAIL_MSG( wxT(
"FOOTPRINT::Add(): Nested footprints not supported" ) );
1426 wxFAIL_MSG( wxString::Format( wxT(
"FOOTPRINT::Add(): BOARD_ITEM type (%d) not handled" ),
1427 aBoardItem->
Type() ) );
1441 switch( aBoardItem->
Type() )
1446 if( *it == aBoardItem )
1468 if( *it == aBoardItem )
1478 for(
auto it =
m_pads.begin(); it !=
m_pads.end(); ++it )
1480 if( *it ==
static_cast<PAD*
>( aBoardItem ) )
1492 if( *it ==
static_cast<ZONE*
>( aBoardItem ) )
1504 if( *it ==
static_cast<PCB_GROUP*
>( aBoardItem ) )
1516 if( *it ==
static_cast<PCB_POINT*
>( aBoardItem ) )
1528 msg.Printf( wxT(
"FOOTPRINT::Remove() needs work: BOARD_ITEM type (%d) not handled" ),
1529 aBoardItem->
Type() );
1557 switch(
pad->GetProperty() )
1575 switch(
pad->GetAttribute() )
1582 if(
pad->IsOnCopperLayer() )
1610 return _(
"Through hole" );
1612 return _(
"Other" );
1627 if(
dummy.IsFlipped() )
1631 bbox.
Merge(
pad->GetBoundingBox() );
1676 std::vector<PCB_TEXT*> texts;
1677 bool isFPEdit =
board &&
board->IsFootprintHolder();
1698 texts.push_back(
static_cast<PCB_TEXT*
>( item ) );
1716 bbox.
Merge( item->GetBoundingBox() );
1722 if( field->IsReference() || field->IsValue() )
1725 texts.push_back( field );
1729 bbox.
Merge(
pad->GetBoundingBox() );
1732 bbox.
Merge( zone->GetBoundingBox() );
1735 bbox.
Merge( point->GetBoundingBox() );
1740 if( aIncludeText || noDrawItems )
1757 bool valueLayerIsVisible =
true;
1758 bool refLayerIsVisible =
true;
1776 if( (
Value().IsVisible() && valueLayerIsVisible ) || noDrawItems )
1781 if( (
Reference().IsVisible() && refLayerIsVisible ) || noDrawItems )
1789 if( aIncludeText || noDrawItems )
1807 std::vector<PCB_TEXT*> texts;
1809 bool isFPEdit =
board &&
board->IsFootprintHolder();
1819 if( ( aLayers & item->GetLayerSet() ).none() )
1827 bbox.
Merge( item->GetBoundingBox() );
1832 if( ( aLayers &
pad->GetLayerSet() ).none() )
1835 bbox.
Merge(
pad->GetBoundingBox() );
1840 if( ( aLayers & zone->GetLayerSet() ).none() )
1843 bbox.
Merge( zone->GetBoundingBox() );
1851 if( ( aLayers & point->GetLayerSet() ).none() )
1854 bbox.
Merge( point->GetBoundingBox() );
1864 bool isFPEdit =
board &&
board->IsFootprintHolder();
1890 pad->Padstack().ForEachUniqueLayer(
1904 const SHAPE_POLY_SET& layerPoly = *zone->GetFilledPolysList( layer );
1920 const int halfsize =
pcbIUScale.mmToIU( 1.0 );
1931 std::vector<VECTOR2I> convex_hull;
1937 for(
const VECTOR2I& pt : convex_hull )
1950 bool isFPEdit =
board &&
board->IsFootprintHolder();
1960 if( item->IsOnLayer( aLayer ) )
1974 if(
pad->IsOnLayer( aLayer ) )
1980 if( zone->GetIsRuleArea() )
1983 if( zone->IsOnLayer( aLayer ) )
1985 const std::shared_ptr<SHAPE_POLY_SET>& layerPoly = zone->GetFilledPolysList( aLayer );
1987 for(
int ii = 0; ii < layerPoly->OutlineCount(); ii++ )
1988 rawPolys.
AddOutline( layerPoly->COutline( ii ) );
1992 std::vector<VECTOR2I> convex_hull;
1997 for(
const VECTOR2I& pt : convex_hull )
2018 aList.emplace_back(
_(
"Library" ),
GetFPID().GetLibNickname().wx_str() );
2020 aList.emplace_back(
_(
"Footprint Name" ),
GetFPID().GetLibItemName().wx_str() );
2022 aList.emplace_back(
_(
"Pads" ), wxString::Format( wxT(
"%zu" ), padCount ) );
2025 wxString::Format(
_(
"Keywords: %s" ),
GetKeywords() ) );
2034 case F_Cu: aList.emplace_back(
_(
"Board Side" ),
_(
"Front" ) );
break;
2035 case B_Cu: aList.emplace_back(
_(
"Board Side" ),
_(
"Back (Flipped)" ) );
break;
2039 auto addToken = []( wxString* aStr,
const wxString& aAttr )
2041 if( !aStr->IsEmpty() )
2042 *aStr += wxT(
", " );
2051 addToken( &status,
_(
"Locked" ) );
2054 addToken( &status,
_(
"autoplaced" ) );
2057 addToken( &attrs,
_(
"not in schematic" ) );
2060 addToken( &attrs,
_(
"exclude from pos files" ) );
2063 addToken( &attrs,
_(
"exclude from BOM" ) );
2066 addToken( &attrs,
_(
"DNP" ) );
2068 aList.emplace_back(
_(
"Status: " ) + status,
_(
"Attributes:" ) + wxS(
" " ) + attrs );
2070 aList.emplace_back(
_(
"Rotation" ), wxString::Format( wxT(
"%.4g" ),
2076 _(
"Component Class" ),
2080 msg.Printf(
_(
"Footprint: %s" ),
m_fpid.GetUniStringLibId() );
2081 msg2.Printf(
_(
"3D-Shape: %s" ),
m_3D_Drawings.empty() ?
_(
"<none>" )
2083 aList.emplace_back( msg, msg2 );
2087 aList.emplace_back( msg, msg2 );
2095 if(
board->IsFootprintHolder() )
2127 if(
pad->IsOnLayer( aLayer ) )
2133 if( zone->IsOnLayer( aLayer ) )
2139 if( field->IsOnLayer( aLayer ) )
2145 if( item->IsOnLayer( aLayer ) )
2157 if(
pad->IsOnLayer( aLayer ) &&
pad->HitTest( aPosition, aAccuracy ) )
2163 if( zone->IsOnLayer( aLayer ) && zone->HitTest( aPosition, aAccuracy ) )
2169 if( item->Type() !=
PCB_TEXT_T && item->IsOnLayer( aLayer )
2170 && item->HitTest( aPosition, aAccuracy ) )
2182 std::vector<BOARD_ITEM*> items;
2186 if(
pad->IsOnLayer( aLayer ) )
2187 items.push_back(
pad );
2192 if( zone->IsOnLayer( aLayer ) )
2193 items.push_back( zone );
2198 if( item->Type() !=
PCB_TEXT_T && item->IsOnLayer( aLayer ) )
2199 items.push_back( item );
2208 if( !aContained && item->HitTest( aRect, aContained, aAccuracy ) )
2210 else if( aContained && !item->HitTest( aRect, aContained, aAccuracy ) )
2217 return !items.empty() && aContained;
2236 BOX2I arect = aRect;
2256 if(
pad->HitTest( arect,
false, 0 ) )
2262 if( zone->HitTest( arect,
false, 0 ) )
2268 if( point->HitTest( arect,
false, 0 ) )
2279 if( item->Type() !=
PCB_TEXT_T && item->HitTest( arect,
false, 0 ) )
2293 using std::ranges::all_of;
2294 using std::ranges::any_of;
2301 [&](
const auto* aItem )
2303 return aItem && aItem->HitTest( aPoly, aContained );
2309 auto drawings =
m_drawings | std::views::filter( [](
const auto* aItem )
2320 return all_of( drawings, hitTest )
2321 && all_of(
m_pads, hitTest )
2322 && all_of(
m_zones, hitTest );
2327 return any_of( drawings, hitTest )
2328 || any_of(
m_pads, hitTest )
2329 || any_of(
m_zones, hitTest );
2336 bool can_select = aSearchAfterMe ? false :
true;
2340 if( !can_select &&
pad == aSearchAfterMe )
2346 if( can_select &&
pad->GetNumber() == aPadNumber )
2359 if( !(
pad->GetLayerSet() & aLayerMask ).any() )
2362 if(
pad->HitTest( aPosition ) )
2372 std::vector<const PAD*> retv;
2376 if( ( aIgnore && aIgnore ==
pad ) || (
pad->GetNumber() != aPadNumber ) )
2379 retv.push_back(
pad );
2407 std::set<wxString> usedNumbers;
2419 if(
pad->GetNumber().IsEmpty() )
2429 usedNumbers.insert(
pad->GetNumber() );
2444 if(
nullptr == a3DModel )
2472 const std::vector<KICAD_T>& aScanTypes )
2474#if 0 && defined(DEBUG)
2475 std::cout <<
GetClass().mb_str() <<
' ';
2478 bool drawingsScanned =
false;
2480 for(
KICAD_T scanType : aScanTypes )
2528 if( !drawingsScanned )
2536 drawingsScanned =
true;
2572 if( reference.IsEmpty() )
2573 reference =
_(
"<no reference designator>" );
2575 return wxString::Format(
_(
"Footprint %s" ), reference );
2612 aFunction( drawing );
2618 catch( std::bad_function_call& )
2620 wxFAIL_MSG( wxT(
"Error running FOOTPRINT::RunOnChildren" ) );
2627 std::vector<int> layers;
2629 layers.reserve( 6 );
2635 wxASSERT_MSG(
false, wxT(
"Illegal layer" ) );
2653 bool f_silk =
false, b_silk =
false, non_silk =
false;
2657 if( item->GetLayer() ==
F_SilkS )
2659 else if( item->GetLayer() ==
B_SilkS )
2665 if( ( f_silk || b_silk ) && !non_silk &&
m_pads.empty() )
2702 constexpr double MINIMAL_ZOOM_LEVEL_FOR_VISIBILITY = 1.5;
2705 return MINIMAL_ZOOM_LEVEL_FOR_VISIBILITY;
2718 int biggest_clearance =
board->GetMaxClearanceValue();
2719 area.
Inflate( biggest_clearance );
2730 if( aName.find_first_of( invalids ) != std::string::npos )
2744 static const wxChar invalidChars[] = wxT(
"%$<>\t\n\r\"\\/:");
2745 static const wxChar invalidCharsReadable[] = wxT(
"% $ < > 'tab' 'return' 'line feed' \\ \" / :");
2748 return invalidCharsReadable;
2750 return invalidChars;
2756 if( aMoveVector.
x == 0 && aMoveVector.
y == 0 )
2770 EDA_ANGLE newOrientation = orientation + aAngle;
2777 field->KeepUpright();
2782 static_cast<PCB_TEXT*
>( item )->KeepUpright();
2789 wxASSERT( aLayer ==
F_Cu || aLayer ==
B_Cu );
2866 field->EDA_TEXT::Offset(
delta );
2872 zone->Move(
delta );
2875 item->Move(
delta );
2878 point->Move(
delta );
2910 field->Move( moveVector );
2914 pad->Move( moveVector );
2918 item->Move( moveVector );
2922 zone->Move( moveVector );
2990 const BOARD_ITEM* aItem,
bool addToFootprint )
2994 switch( aItem->
Type() )
2998 PAD* new_pad =
new PAD( *
static_cast<const PAD*
>( aItem ) );
3001 if( addToFootprint )
3002 m_pads.push_back( new_pad );
3010 ZONE* new_zone =
new ZONE( *
static_cast<const ZONE*
>( aItem ) );
3013 if( addToFootprint )
3014 m_zones.push_back( new_zone );
3016 new_item = new_zone;
3025 if( addToFootprint )
3028 new_item = new_point;
3040 switch(
static_cast<const PCB_FIELD*
>( aItem )->GetId() )
3049 if( addToFootprint )
3052 new_item = new_text;
3061 if( addToFootprint )
3064 new_item = new_shape;
3073 if( addToFootprint )
3076 new_item = new_barcode;
3085 if( addToFootprint )
3088 new_item = new_image;
3097 if( addToFootprint )
3100 new_item = new_textbox;
3113 if( addToFootprint )
3116 new_item = dimension;
3124 if( addToFootprint )
3126 group->RunOnChildren(
3146 wxFAIL_MSG( wxT(
"Duplication not supported for items of class " ) + aItem->
GetClass() );
3156 std::set<wxString> usedNumbers;
3160 usedNumbers.insert(
pad->GetNumber() );
3167 while( usedNumbers.count( wxString::Format( wxT(
"%s%d" ), prefix, num ) ) )
3170 return wxString::Format( wxT(
"%s%d" ), prefix, num );
3178 if(
group.contains( aPadNumber ) )
3182 return std::nullopt;
3233 for(
int jj = 0; jj < aPolySet.
HoleCount( ii ); jj++ )
3237 return aPolySet.
Area();
3252 return markerShape.
Area();
3256 double combinedArea = 0.0;
3261 return combinedArea;
3312 double width =
static_cast<const PCB_TRACK*
>( aItem )->GetWidth();
3313 return width * width;
3317 static_cast<const PAD*
>( aItem )->Padstack().ForEachUniqueLayer(
3349 for(
int i = 0; i < aCollector.
GetCount(); ++i )
3353 switch( item->
Type() )
3385 double footprintRegionArea =
polygonArea( footprintRegion );
3386 double uncoveredRegionArea = footprintRegionArea -
polygonArea( coveredRegion );
3387 double coveredArea = footprintRegionArea - uncoveredRegionArea;
3390 if( footprintRegionArea == 0 )
3393 double ratio = coveredArea / footprintRegionArea;
3400 return std::min( ratio, 1.0 );
3406 std::shared_ptr<SHAPE_COMPOUND> shape = std::make_shared<SHAPE_COMPOUND>();
3427 shape->AddShape(
pad->GetEffectiveShape( aLayer, aFlash )->Clone() );
3432 shape->AddShape( item->GetEffectiveShape( aLayer, aFlash )->Clone() );
3434 shape->AddShape( item->GetEffectiveShape( aLayer, aFlash )->Clone() );
3474 std::vector<PCB_SHAPE*> list_front;
3475 std::vector<PCB_SHAPE*> list_back;
3476 std::map<int, int> front_width_histogram;
3477 std::map<int, int> back_width_histogram;
3484 list_back.push_back( shape );
3491 list_front.push_back( shape );
3496 if( !list_front.size() && !list_back.size() )
3500 int chainingEpsilon =
pcbIUScale.mmToIU( 0.02 );
3503 true, aErrorHandler ) )
3513 auto max = std::max_element( front_width_histogram.begin(), front_width_histogram.end(),
3514 [](
const std::pair<int, int>& a,
const std::pair<int, int>& b )
3516 return a.second < b.second;
3519 if( max != front_width_histogram.end() )
3542 auto max = std::max_element( back_width_histogram.begin(), back_width_histogram.end(),
3543 [](
const std::pair<int, int>& a,
const std::pair<int, int>& b )
3545 return a.second < b.second;
3548 if( max != back_width_histogram.end() )
3571 std::map<PCB_LAYER_ID, std::vector<PCB_SHAPE*>> layer_shapes;
3577 if( item->Type() != PCB_SHAPE_T )
3580 for( PCB_LAYER_ID layer : item->GetLayerSet() )
3582 if( !IsCopperLayer( layer ) )
3585 if( board && !board->GetEnabledLayers().Contains( layer ) )
3588 layer_shapes[layer].push_back( static_cast<PCB_SHAPE*>( item ) );
3592 for(
size_t ii = 0; ii < m_pads.size(); ++ii )
3595 bool has_nettie =
false;
3597 auto it = map.find(
pad->GetNumber() );
3599 if( it == map.end() || it->second < 0 )
3602 for(
size_t jj = ii + 1; jj < m_pads.size(); ++jj )
3604 PAD* other = m_pads[ jj ];
3606 auto it2 = map.find( other->
GetNumber() );
3608 if( it2 == map.end() || it2->second < 0 )
3611 if( it2->second == it->second )
3613 m_netTieCache[
pad].insert(
pad->GetNetCode() );
3615 m_netTieCache[other].insert( other->
GetNetCode() );
3616 m_netTieCache[other].insert(
pad->GetNetCode() );
3624 for(
auto& [ layer, shapes ] : layer_shapes )
3626 auto pad_shape =
pad->GetEffectiveShape( layer );
3628 for(
auto other_shape : shapes )
3630 auto shape = other_shape->GetEffectiveShape( layer );
3632 if( pad_shape->Collide( shape.get() ) )
3634 std::set<int>& nettie = m_netTieCache[
pad];
3635 m_netTieCache[other_shape].insert( nettie.begin(), nettie.end() );
3645 std::map<wxString, int> padNumberToGroupIdxMap;
3648 padNumberToGroupIdxMap[
pad->GetNumber() ] = -1;
3651 [&]( wxString aPad,
int aGroup )
3653 aPad.Trim(
true ).Trim(
false );
3655 if( !aPad.IsEmpty() )
3656 padNumberToGroupIdxMap[ aPad ] = aGroup;
3665 for( wxUniCharRef ch :
group )
3674 switch(
static_cast<unsigned char>( ch ) )
3681 processPad(
pad, ii );
3691 processPad(
pad, ii );
3694 return padNumberToGroupIdxMap;
3704 int groupIdx = padToNetTieGroupMap[ aPad->
GetNumber() ];
3705 std::vector<PAD*> otherPads;
3711 if( padToNetTieGroupMap[
pad->GetNumber() ] == groupIdx )
3712 otherPads.push_back(
pad );
3725 if( setAttr && likelyAttr && setAttr != likelyAttr )
3729 switch( likelyAttr )
3732 msg.Printf(
_(
"(expected 'Through hole'; actual '%s')" ),
GetTypeName() );
3735 msg.Printf(
_(
"(expected 'SMD'; actual '%s')" ),
GetTypeName() );
3740 (aErrorHandler)( msg );
3746 const std::function<
void(
const PAD*,
int,
3747 const wxString& )>& aErrorHandler )
3749 if( aErrorHandler ==
nullptr )
3754 pad->CheckPad( aUnitsProvider,
false,
3755 [&](
int errorCode,
const wxString& msg )
3757 aErrorHandler(
pad, errorCode, msg );
3765 const VECTOR2I& )>& aErrorHandler )
3767 std::unordered_map<PTR_PTR_CACHE_KEY, int> checkedPairs;
3782 if(
static_cast<void*
>( a ) >
static_cast<void*
>( b ) )
3785 if( checkedPairs.find( { a, b } ) == checkedPairs.end() )
3787 checkedPairs[ { a, b } ] = 1;
3799 std::shared_ptr<SHAPE_SEGMENT> holeA =
pad->GetEffectiveHoleShape();
3802 if( holeA->Collide( holeB->GetSeg(), 0 ) )
3819 SHAPE* padShape =
pad->GetEffectiveShape( l ).get();
3822 if( padShape->
Collide( otherShape, 0,
nullptr, &pos ) )
3835 const VECTOR2I& )>& aErrorHandler )
3844 std::vector<BOARD_ITEM*> copperItems;
3848 if( item->IsOnCopperLayer() )
3849 copperItems.push_back( item );
3851 item->RunOnChildren(
3855 copperItems.push_back( descendent );
3862 if( !zone->GetIsRuleArea() && zone->IsOnCopperLayer() )
3863 copperItems.push_back( zone );
3868 if( field->IsOnCopperLayer() )
3869 copperItems.push_back( field );
3879 std::map<int, std::vector<const PAD*>> outlineIdxToPadsMap;
3883 if( item->IsOnLayer( layer ) )
3893 for(
int ii = 0; ii < copperOutlines.
OutlineCount(); ++ii )
3895 if(
pad->GetEffectiveShape( layer )->Collide( &copperOutlines.
Outline( ii ), 0 ) )
3896 outlineIdxToPadsMap[ ii ].emplace_back(
pad );
3903 for(
const auto& [ outlineIdx, pads ] : outlineIdxToPadsMap )
3905 if( pads.size() > 1 )
3907 const PAD* firstPad = pads[0];
3908 int firstGroupIdx = padNumberToGroupIdxMap[ firstPad->
GetNumber() ];
3910 for(
size_t ii = 1; ii < pads.size(); ++ii )
3912 const PAD* thisPad = pads[ii];
3913 int thisGroupIdx = padNumberToGroupIdxMap[ thisPad->
GetNumber() ];
3915 if( thisGroupIdx < 0 || thisGroupIdx != firstGroupIdx )
3924 if( item->HitTest( pos, 1 ) )
3926 shortingItem = item;
3932 aErrorHandler( shortingItem, firstPad, thisPad, pos );
3934 aErrorHandler( firstPad, thisPad,
nullptr, pos );
3945 std::set<wxString> padNumbers;
3954 msg.Printf(
_(
"(net-tie pad group contains unknown pad number %s)" ), padNumber );
3955 aErrorHandler( msg );
3957 else if( !padNumbers.insert(
pad->GetNumber() ).second )
3959 msg.Printf(
_(
"(pad %s appears in more than one net-tie pad group)" ), padNumber );
3960 aErrorHandler( msg );
3968 const VECTOR2I& aPt )>& aErrorHandler )
3970 auto checkColliding =
3985 if( itemShape->Collide( otherShape.get(), 0, &
actual, &pos ) )
3986 aErrorHandler( item, other, pos );
3995 checkColliding( item, other );
3999 checkColliding( item,
pad );
4010 std::swap( *
this, *
image );
4019 image->RunOnChildren(
4047 return *
this == other;
4056 for(
size_t ii = 0; ii <
m_pads.size(); ++ii )
4065 for(
size_t ii = 0; ii <
m_drawings.size(); ++ii )
4074 for(
size_t ii = 0; ii <
m_zones.size(); ++ii )
4084 std::vector<PCB_FIELD*> fields, otherFields;
4089 if( fields.size() != otherFields.size() )
4092 for(
size_t ii = 0; ii < fields.size(); ++ii )
4096 if( !( *fields[ii] == *otherFields[ii] ) )
4112 double similarity = 1.0;
4121 similarity *=
pad->Similarity( *otherPad );
4133 if( aPtA.
x != aPtB.
x )
4134 return aPtA.
x < aPtB.
x;
4136 if( aPtA.
y != aPtB.
y )
4137 return aPtA.
y < aPtB.
y;
4139 return std::nullopt;
4145 if( itemA->
Type() != itemB->
Type() )
4146 return itemA->
Type() < itemB->
Type();
4151 switch( itemA->
Type() )
4190 for(
int ii = 0; ii < dwgA->
GetPolyShape().TotalVertices(); ++ii )
4192 if( std::optional<bool> cmp =
4249 return itemA < itemB;
4261 std::optional<bool> padCopperMatches;
4264 const PAD* checkPad = aFirst;
4277 padCopperMatches = aFirst->
GetSize( aLayer ).
x < aSecond->
GetSize( aLayer ).
x;
4279 padCopperMatches = aFirst->
GetSize( aLayer ).
y < aSecond->
GetSize( aLayer ).
y;
4281 padCopperMatches = aFirst->
GetShape( aLayer ) < aSecond->
GetShape( aLayer );
4284 if( padCopperMatches.has_value() )
4285 return *padCopperMatches;
4293 return aFirst < aSecond;
4298bool FOOTPRINT::cmp_padstack::operator()(
const PAD* aFirst,
const PAD* aSecond )
const
4338 if( firstShape->VertexCount() != secondShape->VertexCount() )
4339 return firstShape->VertexCount() < secondShape->VertexCount();
4341 for(
int ii = 0; ii < firstShape->VertexCount(); ++ii )
4343 if( std::optional<bool> cmp =
cmp_points_opt( firstShape->CVertex( ii ), secondShape->CVertex( ii ) ) )
4365 for(
int ii = 0; ii < aFirst->
Outline()->TotalVertices(); ++ii )
4367 if( std::optional<bool> cmp =
4377 return aFirst < aSecond;
4382 int aMaxError,
ERROR_LOC aErrorLoc )
const
4393 clearance.x +=
pad->GetSolderMaskExpansion( padLayer );
4394 clearance.y +=
pad->GetSolderMaskExpansion( padLayer );
4417 if( dummySize.
x <= 0 || dummySize.
y <= 0 )
4421 dummy.SetSize( padLayer, dummySize );
4422 dummy.TransformShapeToPolygon( aBuffer, padLayer, 0, aMaxError, aErrorLoc );
4426 pad->TransformShapeToPolygon( aBuffer, padLayer,
clearance.x, aMaxError, aErrorLoc );
4432 if( !
pad->FlashLayer( aLayer ) )
4437 pad->Padstack().ForEachUniqueLayer(
4440 processPad(
pad, l );
4445 processPad(
pad, aLayer );
4452 int aError,
ERROR_LOC aErrorLoc,
bool aIncludeText,
4453 bool aIncludeShapes,
bool aIncludePrivateItems )
const
4460 if( item->Type() ==
PCB_TEXT_T && aIncludeText )
4465 text->TransformTextToPolySet( aBuffer, aClearance, aError, aErrorLoc );
4476 textbox->PCB_SHAPE::TransformShapeToPolygon( aBuffer, aLayer, 0, aError, aErrorLoc );
4483 if( item->Type() ==
PCB_SHAPE_T && aIncludeShapes )
4504 if( ( aLayer ==
UNDEFINED_LAYER || field->GetLayer() == aLayer ) && field->IsVisible() )
4505 field->TransformTextToPolySet( aBuffer, aClearance, aError, aErrorLoc );
4515 std::set<KIFONT::OUTLINE_FONT*>
fonts;
4529 if( permission == PERMISSION::EDITABLE || permission == PERMISSION::INSTALLABLE )
4530 fonts.insert( outlineFont );
4536 processItem( item );
4539 processItem( field );
4584 return wxEmptyString;
4589 const std::unordered_set<wxString>& aComponentClassNames )
4638 LSET padLayers =
pad->GetLayerSet();
4639 padLayers |= boardCopper;
4640 pad->SetLayerSet( padLayers );
4652 if( zcMap.
Choices().GetCount() == 0 )
4664 if( layerEnum.
Choices().GetCount() == 0 )
4672 wxPGChoices fpLayers;
4683 auto isNotFootprintHolder =
4689 return !
board->IsFootprintHolder();
4696 layer->SetChoices( fpLayers );
4697 layer->SetAvailableFunc( isNotFootprintHolder );
4705 const wxString groupFields =
_HKI(
"Fields" );
4730 const wxString groupAttributes =
_HKI(
"Attributes" );
4744 const wxString groupOverrides =
_HKI(
"Overrides" );
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
std::unique_ptr< EDA_ITEM > CreateItemForType(KICAD_T aType, EDA_ITEM *aContainer)
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr EDA_IU_SCALE pcbIUScale
constexpr int ARC_LOW_DEF
BITMAPS
A list of all bitmap identifiers.
#define DEFAULT_COURTYARD_WIDTH
BASE_SET & set(size_t pos)
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
BOARD_ITEM_CONTAINER(BOARD_ITEM *aParent, KICAD_T aType)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const
Create a copy of this BOARD_ITEM.
virtual void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the item shape to a closed polygon.
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
VECTOR2I GetFPRelativePosition() const
virtual void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, KIGFX::RENDER_SETTINGS *aRenderSettings=nullptr) const
Convert the item shape to a polyset.
BOARD_ITEM_CONTAINER * GetParent() const
virtual bool IsOnCopperLayer() const
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Information pertinent to a Pcbnew printed circuit board.
int GetCopperLayerCount() const
COMPONENT_CLASS_MANAGER & GetComponentClassManager()
Gets the component class manager.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr size_type GetWidth() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
constexpr coord_type GetTop() const
constexpr bool Intersects(const BOX2< Vec > &aRect) const
constexpr coord_type GetBottom() const
virtual int Accuracy() const =0
int GetCount() const
Return the number of objects in the list.
const COMPONENT_CLASS * GetStaticComponentClass() const
Gets the static component class.
COMPONENT_CLASS * GetEffectiveStaticComponentClass(const std::unordered_set< wxString > &classNames)
Gets an effective component class for the given constituent class names.
A lightweight representation of a component class.
bool IsType(FRAME_T aType) const
The base class for create windows for drawing purpose.
std::unordered_set< EDA_ITEM * > & GetItems()
void AddItem(EDA_ITEM *aItem)
Add item to group.
virtual void ClearEditFlags()
EDA_ITEM & operator=(const EDA_ITEM &aItem)
Assign the members of aItem to another object.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
static INSPECT_RESULT IterateForward(std::deque< T > &aList, INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &scanTypes)
This changes first parameter to avoid the DList and use the main queue instead.
virtual void SetParent(EDA_ITEM *aParent)
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
const VECTOR2I & GetBezierC2() const
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
const VECTOR2I & GetBezierC1() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const EDA_ANGLE & GetTextAngle() const
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
virtual void SetVisible(bool aVisible)
double GetLineSpacing() const
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
int GetTextThickness() const
VECTOR2I GetTextSize() const
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
EMBEDDED_FILES & operator=(EMBEDDED_FILES &&other) noexcept
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
bool m_embedFonts
If set, fonts will be embedded in the element on save.
ENUM_MAP & Map(T aValue, const wxString &aName)
static ENUM_MAP< T > & Instance()
ENUM_MAP & Undefined(T aValue)
wxString m_Filename
The 3D shape filename in 3D library.
Used when the right click button is pressed, or when the select tool is in effect.
const COLLECTORS_GUIDE * GetGuide() const
Class that other classes need to inherit from, in order to be inspectable.
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
virtual wxString GetClass() const =0
Return the class name.
static constexpr double LOD_HIDE
Return this constant from ViewGetLOD() to hide the item unconditionally.
static constexpr double LOD_SHOW
Return this constant from ViewGetLOD() to show the item unconditionally.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
LSET is a set of PCB_LAYER_IDs.
static const LSET & SideSpecificMask()
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const LSET & AllLayersMask()
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
void ShapeToPolygon(SHAPE_LINE_CHAIN &aPolygon, int aScale=-1) const
Return the shape polygon in internal units in a SHAPE_LINE_CHAIN the coordinates are relatives to the...
static const int ORPHANED
Constant that forces initialization of a netinfo item to the NETINFO_ITEM ORPHANED (typically -1) whe...
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
@ NORMAL
Shape is the same on all layers.
@ CUSTOM
Shapes can be defined on arbitrary layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer, FLASHING flashPTHPads=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
int GetDrillSizeY() const
PAD_ATTRIB GetAttribute() const
const wxString & GetNumber() const
VECTOR2I GetPosition() const override
int GetDrillSizeX() const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
int GetSolderMaskExpansion(PCB_LAYER_ID aLayer) const
const PADSTACK & Padstack() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
PAD_DRILL_SHAPE GetDrillShape() const
const std::shared_ptr< SHAPE_POLY_SET > & GetEffectivePolygon(PCB_LAYER_ID aLayer, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
std::optional< int > GetLocalSolderMaskMargin() const
VECTOR2I GetSolderPasteMargin(PCB_LAYER_ID aLayer) const
Usually < 0 (mask shape smaller than pad)because the margin can be dependent on the pad size,...
bool HasDrilledHole() const override
std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const override
Return a SHAPE_SEGMENT object representing the pad's hole.
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
A set of BOARD_ITEMs (i.e., without duplicates).
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
Object to handle a bitmap image that can be inserted in a PCB.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
int GetWidth() const override
void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, KIGFX::RENDER_SETTINGS *aRenderSettings=nullptr) const override
Convert the item shape to a polyset.
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.
STROKE_PARAMS GetStroke() const override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
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...
virtual VECTOR2I GetPosition() const override
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
PROPERTY_BASE & SetIsHiddenFromLibraryEditors(bool aIsHidden=true)
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
PROPERTY_BASE & ReplaceProperty(size_t aBase, const wxString &aName, PROPERTY_BASE *aNew, const wxString &aGroup=wxEmptyString)
Replace an existing property for a specific type.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
double Area(bool aAbsolute=true) const
Return the area of this chain.
const VECTOR2I NearestPoint(const VECTOR2I &aP, bool aAllowInternalShapePoints=true) const
Find a point on the line chain that is closest to point aP.
Represent a set of closed polygons.
void BooleanAdd(const SHAPE_POLY_SET &b)
Perform boolean polyset union.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
double Area()
Return the area of this poly set.
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
int TotalVertices() const
Return total number of vertices stored in the set.
int FullPointCount() const
Return the number of points in the shape poly set.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
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)
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the index-th vertex in a given hole outline within a given outline.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
An abstract shape on 2D plane.
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const
Check if the boundary of shape (this) lies closer to the point aP than aClearance,...
Handle a list of polygons defining a copper zone.
SHAPE_POLY_SET * Outline()
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
unsigned GetAssignedPriority() const
This file is part of the common library.
bool ConvertOutlineToPolygon(std::vector< PCB_SHAPE * > &aShapeList, SHAPE_POLY_SET &aPolygons, int aErrorMax, int aChainingEpsilon, bool aAllowDisjoint, OUTLINE_ERROR_HANDLER *aErrorHandler, bool aAllowUseArcsInPolygons)
Build a polygon set with holes from a PCB_SHAPE list.
const std::function< void(const wxString &msg, BOARD_ITEM *itemA, BOARD_ITEM *itemB, const VECTOR2I &pt)> OUTLINE_ERROR_HANDLER
void BuildConvexHull(std::vector< VECTOR2I > &aResult, const std::vector< VECTOR2I > &aPoly)
Calculate the convex hull of a list of points in counter-clockwise order.
@ CHAMFER_ACUTE_CORNERS
Acute angles are chamfered.
@ DRCE_DRILLED_HOLES_TOO_CLOSE
@ DRCE_DRILLED_HOLES_COLOCATED
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_180
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
#define COURTYARD_CONFLICT
temporary set when moving footprints having courtyard overlapping
#define MALFORMED_F_COURTYARD
#define MALFORMED_B_COURTYARD
#define STRUCT_DELETED
flag indication structures to be erased
#define MALFORMED_COURTYARDS
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FRAME_FOOTPRINT_CHOOSER
a few functions useful in geometry calculations.
const wxChar *const traceApi
Flag to enable debug output related to the IPC API and its plugin system.
Some functions to handle hotkeys in KiCad.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
@ LAYER_CONFLICTS_SHADOW
Shadow layer for items flagged conflicting.
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
@ LAYER_ANCHOR
Anchor of items having an anchor point (texts, footprints).
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
@ LEFT_RIGHT
Flip left to right (around the Y axis)
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
wxString GetRefDesPrefix(const wxString &aRefDes)
Get the (non-numeric) prefix from a refdes - e.g.
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
KICOMMON_API KIID_PATH UnpackSheetPath(const types::SheetPath &aInput)
KICOMMON_API std::optional< KICAD_T > TypeNameFromAny(const google::protobuf::Any &aMessage)
KICOMMON_API VECTOR3D UnpackVector3D(const types::Vector3D &aInput)
KICOMMON_API void PackSheetPath(types::SheetPath &aOutput, const KIID_PATH &aInput)
KICOMMON_API LIB_ID LibIdFromProto(const types::LibraryIdentifier &aId)
KICOMMON_API types::LibraryIdentifier LibIdToProto(const LIB_ID &aId)
KICOMMON_API void PackVector3D(types::Vector3D &aOutput, const VECTOR3D &aInput)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
@ FIDUCIAL_LOCAL
a fiducial (usually a smd) local to the parent footprint
@ FIDUCIAL_GLBL
a fiducial (usually a smd) for the full board
@ MECHANICAL
a pad used for mechanical support
@ PRESSFIT
a PTH with a hole diameter with tight tolerances for press fit pin
@ HEATSINK
a pad used as heat sink, usually in SMD footprints
@ NONE
no special fabrication property
@ TESTPOINT
a test point pad
@ CASTELLATED
a pad with a castellated through hole
@ BGA
Smd pad, used in BGA footprints.
BARCODE class definition.
Class to handle a set of BOARD_ITEMs.
#define NO_SETTER(owner, type)
@ PT_DEGREE
Angle expressed in degrees.
@ PT_SIZE
Size expressed in distance units (mm/inch)
Collection of utility functions for component reference designators (refdes)
std::vector< FAB_LAYER_COLOR > dummy
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
wxString GetDefaultVariantName()
int GetTrailingInt(const wxString &aStr)
Gets the trailing int, if any, from a string.
wxString UnescapeString(const wxString &aSource)
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
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_BARCODE_T
class PCB_BARCODE, a barcode (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_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ 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_CONNECTION
How pads are covered by copper in zone.
@ THERMAL
Use thermal relief for pads.
@ THT_THERMAL
Thermal relief only for THT pads.
@ NONE
Pads are not covered.
@ FULL
pads are covered by copper