26#include <magic_enum.hpp>
28#include <unordered_set>
69#include <google/protobuf/any.pb.h>
70#include <api/board/board_types.pb.h>
169 std::map<EDA_ITEM*, EDA_ITEM*> ptrMap;
177 ptrMap[field] = existingField;
178 *existingField = *field;
184 ptrMap[field] = newField;
192 PAD* newPad =
static_cast<PAD*
>(
pad->Clone() );
193 ptrMap[
pad ] = newPad;
200 ZONE* newZone =
static_cast<ZONE*
>( zone->Clone() );
201 ptrMap[ zone ] = newZone;
215 ptrMap[ item ] = newItem;
223 ptrMap[
group ] = newGroup;
230 ptrMap[ point ] = newPoint;
243 if( ptrMap.count( member ) )
244 newGroup->
AddItem( ptrMap[ member ] );
256 *
this = std::move( aFootprint );
296 board->IncrementTimeStamp();
303 types::FootprintInstance footprint;
305 footprint.mutable_id()->set_value(
m_Uuid.AsStdString() );
306 footprint.mutable_position()->set_x_nm(
GetPosition().x );
307 footprint.mutable_position()->set_y_nm(
GetPosition().y );
310 footprint.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
311 : kiapi::common::types::LockedState::LS_UNLOCKED );
313 google::protobuf::Any buf;
315 buf.UnpackTo( footprint.mutable_reference_field() );
317 buf.UnpackTo( footprint.mutable_value_field() );
319 buf.UnpackTo( footprint.mutable_datasheet_field() );
321 buf.UnpackTo( footprint.mutable_description_field() );
323 types::FootprintAttributes* attrs = footprint.mutable_attributes();
329 attrs->set_do_not_populate(
IsDNP() );
333 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_THROUGH_HOLE );
335 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_SMD );
337 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_UNSPECIFIED );
339 types::Footprint* def = footprint.mutable_definition();
344 def->mutable_attributes()->set_keywords(
GetKeywords().ToStdString() );
348 types::FootprintDesignRuleOverrides* overrides = footprint.mutable_overrides();
362 overrides->set_zone_connection(
367 types::NetTieDefinition* netTie = def->add_net_ties();
368 wxStringTokenizer tokenizer(
group,
", \t\r\n", wxTOKEN_STRTOK );
370 while( tokenizer.HasMoreTokens() )
371 netTie->add_pad_number( tokenizer.GetNextToken().ToStdString() );
379 if( item->IsMandatory() )
382 google::protobuf::Any* itemMsg = def->add_items();
383 item->Serialize( *itemMsg );
386 for(
const PAD* item :
Pads() )
388 google::protobuf::Any* itemMsg = def->add_items();
389 item->Serialize( *itemMsg );
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 types::Footprint3DModel modelMsg;
408 modelMsg.set_filename(
model.m_Filename.ToUTF8() );
412 modelMsg.set_visible(
model.m_Show );
413 modelMsg.set_opacity(
model.m_Opacity );
414 itemMsg->PackFrom( modelMsg );
419 footprint.set_symbol_sheet_name(
m_sheetname.ToUTF8() );
420 footprint.set_symbol_sheet_filename(
m_sheetfile.ToUTF8() );
421 footprint.set_symbol_footprint_filters(
m_filters.ToUTF8() );
423 aContainer.PackFrom( footprint );
430 types::FootprintInstance footprint;
432 if( !aContainer.UnpackTo( &footprint ) )
439 SetLocked( footprint.locked() == kiapi::common::types::LockedState::LS_LOCKED );
441 google::protobuf::Any buf;
442 types::Field mandatoryField;
444 if( footprint.has_reference_field() )
446 mandatoryField = footprint.reference_field();
448 buf.PackFrom( mandatoryField );
452 if( footprint.has_value_field() )
454 mandatoryField = footprint.value_field();
456 buf.PackFrom( mandatoryField );
460 if( footprint.has_datasheet_field() )
462 mandatoryField = footprint.datasheet_field();
464 buf.PackFrom( mandatoryField );
468 if( footprint.has_description_field() )
470 mandatoryField = footprint.description_field();
472 buf.PackFrom( mandatoryField );
478 switch( footprint.attributes().mounting_style() )
480 case types::FootprintMountingStyle::FMS_THROUGH_HOLE:
484 case types::FootprintMountingStyle::FMS_SMD:
492 SetBoardOnly( footprint.attributes().not_in_schematic() );
496 SetDNP( footprint.attributes().do_not_populate() );
503 SetKeywords( footprint.definition().attributes().keywords() );
505 const types::FootprintDesignRuleOverrides& overrides = footprint.overrides();
507 if( overrides.has_copper_clearance() )
512 if( overrides.has_solder_mask() && overrides.solder_mask().has_solder_mask_margin() )
517 if( overrides.has_solder_paste() )
519 const types::SolderPasteOverrides& pasteSettings = overrides.solder_paste();
521 if( pasteSettings.has_solder_paste_margin() )
526 if( pasteSettings.has_solder_paste_margin_ratio() )
534 for(
const types::NetTieDefinition& netTieMsg : footprint.definition().net_ties() )
538 for(
const std::string&
pad : netTieMsg.pad_number() )
539 group.Append( wxString::Format( wxT(
"%s " ),
pad ) );
547 for(
int layerMsg : footprint.definition().private_layers() )
552 privateLayers.
set( layer );
558 m_sheetname = wxString::FromUTF8( footprint.symbol_sheet_name() );
559 m_sheetfile = wxString::FromUTF8( footprint.symbol_sheet_filename() );
560 m_filters = wxString::FromUTF8( footprint.symbol_footprint_filters() );
565 if( !field->IsMandatory() )
576 for(
const google::protobuf::Any& itemMsg : footprint.definition().items() )
584 if( itemMsg.type_url() ==
"type.googleapis.com/kiapi.board.types.Footprint3DModel" )
586 types::Footprint3DModel modelMsg;
588 if( !itemMsg.UnpackTo( &modelMsg ) )
593 model.m_Filename = wxString::FromUTF8( modelMsg.filename() );
594 model.m_Show = modelMsg.visible();
595 model.m_Opacity = modelMsg.opacity();
604 wxLogTrace(
traceApi, wxString::Format( wxS(
"Attempting to unpack unknown type %s "
605 "from footprint message, skipping" ),
606 itemMsg.type_url() ) );
614 if( item && item->Deserialize( itemMsg ) )
626 if( field->GetId() == aFieldType )
641 if( field->GetId() == aFieldType )
651 return GetField( aFieldName ) !=
nullptr;
659 if( field->GetName() == aFieldName )
675 if( !field->IsVisible() || field->GetText().IsEmpty() )
679 aVector.push_back( field );
682 std::sort( aVector.begin(), aVector.end(),
685 return lhs->GetOrdinal() < rhs->GetOrdinal();
695 ordinal = std::max( ordinal, field->GetOrdinal() + 1 );
702 bool aStyleShapes,
bool aStyleDimensions,
bool aStyleBarcodes )
707 field->StyleFromSettings(
board.GetDesignSettings(),
true );
712 switch( item->Type() )
717 item->StyleFromSettings(
board.GetDesignSettings(),
true );
722 if( aStyleShapes && !item->IsOnCopperLayer() )
723 item->StyleFromSettings(
board.GetDesignSettings(),
true );
732 if( aStyleDimensions )
733 item->StyleFromSettings(
board.GetDesignSettings(),
true );
739 item->StyleFromSettings(
board.GetDesignSettings(),
true );
752 std::vector< BOARD_ITEM* > item_list;
755 item_list.push_back( field );
758 item_list.push_back(
pad );
761 item_list.push_back( gr_item );
766 item_list.push_back(
group );
770 item_list.push_back( zone );
774 item_list.push_back( point );
776 bool changed =
false;
782 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
795 m_pos = aOther.m_pos;
826 for(
PCB_FIELD* field : aOther.m_fields )
829 aOther.m_fields.clear();
837 for(
PAD*
pad : aOther.Pads() )
840 aOther.Pads().clear();
848 for(
ZONE* item : aOther.Zones() )
856 item->SetNetCode( -1 );
859 aOther.Zones().clear();
867 for(
BOARD_ITEM* item : aOther.GraphicalItems() )
870 aOther.GraphicalItems().clear();
881 aOther.Groups().clear();
889 for(
PCB_POINT* point : aOther.Points() )
892 aOther.Points().clear();
905 aOther.m_fields.clear();
906 aOther.Pads().clear();
907 aOther.Zones().clear();
908 aOther.GraphicalItems().clear();
909 aOther.m_initial_comments =
nullptr;
942 std::map<EDA_ITEM*, EDA_ITEM*> ptrMap;
950 ptrMap[field] = newField;
960 ptrMap[
pad ] = newPad;
969 ZONE* newZone =
static_cast<ZONE*
>( zone->Clone() );
970 ptrMap[ zone ] = newZone;
986 ptrMap[ item ] = newItem;
999 newGroup->
AddItem( ptrMap[ member ] );
1010 ptrMap[ point ] = newItem;
1032 *
this = *
static_cast<const FOOTPRINT*
>( aOther );
1058 aVars->push_back( wxT(
"REFERENCE" ) );
1059 aVars->push_back( wxT(
"VALUE" ) );
1060 aVars->push_back( wxT(
"LAYER" ) );
1061 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
1062 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
1063 aVars->push_back( wxT(
"SHORT_NET_NAME(<pad_number>)" ) );
1064 aVars->push_back( wxT(
"NET_NAME(<pad_number>)" ) );
1065 aVars->push_back( wxT(
"NET_CLASS(<pad_number>)" ) );
1066 aVars->push_back( wxT(
"PIN_NAME(<pad_number>)" ) );
1075 if( token->IsSameAs( wxT(
"REFERENCE" ) ) )
1080 else if( token->IsSameAs( wxT(
"VALUE" ) ) )
1085 else if( token->IsSameAs( wxT(
"LAYER" ) ) )
1090 else if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
1092 *token =
m_fpid.GetUniStringLibNickname();
1095 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
1097 *token =
m_fpid.GetUniStringLibItemName();
1100 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) )
1101 || token->StartsWith( wxT(
"NET_NAME(" ) )
1102 || token->StartsWith( wxT(
"NET_CLASS(" ) )
1103 || token->StartsWith( wxT(
"PIN_NAME(" ) ) )
1105 wxString padNumber = token->AfterFirst(
'(' );
1106 padNumber = padNumber.BeforeLast(
')' );
1110 if(
pad->GetNumber() == padNumber )
1112 if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
1113 *token =
pad->GetShortNetname();
1114 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
1115 *token =
pad->GetNetname();
1116 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
1117 *token =
pad->GetNetClassName();
1119 *token =
pad->GetPinFunction();
1127 *token = field->GetText();
1149 switch( aBoardItem->
Type() )
1175 m_pads.push_back(
static_cast<PAD*
>( aBoardItem ) );
1177 m_pads.push_front(
static_cast<PAD*
>( aBoardItem ) );
1183 m_zones.push_back(
static_cast<ZONE*
>( aBoardItem ) );
1198 wxFAIL_MSG( wxT(
"FOOTPRINT::Add(): Markers go at the board level, even in the footprint editor" ) );
1202 wxFAIL_MSG( wxT(
"FOOTPRINT::Add(): Nested footprints not supported" ) );
1214 wxFAIL_MSG( wxString::Format( wxT(
"FOOTPRINT::Add(): BOARD_ITEM type (%d) not handled" ),
1215 aBoardItem->
Type() ) );
1229 switch( aBoardItem->
Type() )
1234 if( *it == aBoardItem )
1256 if( *it == aBoardItem )
1266 for(
auto it =
m_pads.begin(); it !=
m_pads.end(); ++it )
1268 if( *it ==
static_cast<PAD*
>( aBoardItem ) )
1280 if( *it ==
static_cast<ZONE*
>( aBoardItem ) )
1292 if( *it ==
static_cast<PCB_GROUP*
>( aBoardItem ) )
1304 if( *it ==
static_cast<PCB_POINT*
>( aBoardItem ) )
1316 msg.Printf( wxT(
"FOOTPRINT::Remove() needs work: BOARD_ITEM type (%d) not handled" ),
1317 aBoardItem->
Type() );
1345 switch(
pad->GetProperty() )
1363 switch(
pad->GetAttribute() )
1370 if(
pad->IsOnCopperLayer() )
1398 return _(
"Through hole" );
1400 return _(
"Other" );
1415 if(
dummy.IsFlipped() )
1419 bbox.
Merge(
pad->GetBoundingBox() );
1464 std::vector<PCB_TEXT*> texts;
1465 bool isFPEdit =
board &&
board->IsFootprintHolder();
1486 texts.push_back(
static_cast<PCB_TEXT*
>( item ) );
1504 bbox.
Merge( item->GetBoundingBox() );
1510 if( field->IsReference() || field->IsValue() )
1513 texts.push_back( field );
1517 bbox.
Merge(
pad->GetBoundingBox() );
1520 bbox.
Merge( zone->GetBoundingBox() );
1523 bbox.
Merge( point->GetBoundingBox() );
1528 if( aIncludeText || noDrawItems )
1545 bool valueLayerIsVisible =
true;
1546 bool refLayerIsVisible =
true;
1564 if( (
Value().IsVisible() && valueLayerIsVisible ) || noDrawItems )
1569 if( (
Reference().IsVisible() && refLayerIsVisible ) || noDrawItems )
1577 if( aIncludeText || noDrawItems )
1595 std::vector<PCB_TEXT*> texts;
1597 bool isFPEdit =
board &&
board->IsFootprintHolder();
1607 if( ( aLayers & item->GetLayerSet() ).none() )
1615 bbox.
Merge( item->GetBoundingBox() );
1620 if( ( aLayers &
pad->GetLayerSet() ).none() )
1623 bbox.
Merge(
pad->GetBoundingBox() );
1628 if( ( aLayers & zone->GetLayerSet() ).none() )
1631 bbox.
Merge( zone->GetBoundingBox() );
1639 if( ( aLayers & point->GetLayerSet() ).none() )
1642 bbox.
Merge( point->GetBoundingBox() );
1652 bool isFPEdit =
board &&
board->IsFootprintHolder();
1678 pad->Padstack().ForEachUniqueLayer(
1692 const SHAPE_POLY_SET& layerPoly = *zone->GetFilledPolysList( layer );
1708 const int halfsize =
pcbIUScale.mmToIU( 1.0 );
1719 std::vector<VECTOR2I> convex_hull;
1725 for(
const VECTOR2I& pt : convex_hull )
1738 bool isFPEdit =
board &&
board->IsFootprintHolder();
1748 if( item->IsOnLayer( aLayer ) )
1762 if(
pad->IsOnLayer( aLayer ) )
1768 if( zone->GetIsRuleArea() )
1771 if( zone->IsOnLayer( aLayer ) )
1773 const std::shared_ptr<SHAPE_POLY_SET>& layerPoly = zone->GetFilledPolysList( aLayer );
1775 for(
int ii = 0; ii < layerPoly->OutlineCount(); ii++ )
1776 rawPolys.
AddOutline( layerPoly->COutline( ii ) );
1780 std::vector<VECTOR2I> convex_hull;
1785 for(
const VECTOR2I& pt : convex_hull )
1806 aList.emplace_back(
_(
"Library" ),
GetFPID().GetLibNickname().wx_str() );
1808 aList.emplace_back(
_(
"Footprint Name" ),
GetFPID().GetLibItemName().wx_str() );
1810 aList.emplace_back(
_(
"Pads" ), wxString::Format( wxT(
"%zu" ), padCount ) );
1813 wxString::Format(
_(
"Keywords: %s" ),
GetKeywords() ) );
1822 case F_Cu: aList.emplace_back(
_(
"Board Side" ),
_(
"Front" ) );
break;
1823 case B_Cu: aList.emplace_back(
_(
"Board Side" ),
_(
"Back (Flipped)" ) );
break;
1827 auto addToken = []( wxString* aStr,
const wxString& aAttr )
1829 if( !aStr->IsEmpty() )
1830 *aStr += wxT(
", " );
1839 addToken( &status,
_(
"Locked" ) );
1842 addToken( &status,
_(
"autoplaced" ) );
1845 addToken( &attrs,
_(
"not in schematic" ) );
1848 addToken( &attrs,
_(
"exclude from pos files" ) );
1851 addToken( &attrs,
_(
"exclude from BOM" ) );
1854 addToken( &attrs,
_(
"DNP" ) );
1856 aList.emplace_back(
_(
"Status: " ) + status,
_(
"Attributes:" ) + wxS(
" " ) + attrs );
1858 aList.emplace_back(
_(
"Rotation" ), wxString::Format( wxT(
"%.4g" ),
1864 _(
"Component Class" ),
1868 msg.Printf(
_(
"Footprint: %s" ),
m_fpid.GetUniStringLibId() );
1869 msg2.Printf(
_(
"3D-Shape: %s" ),
m_3D_Drawings.empty() ?
_(
"<none>" )
1871 aList.emplace_back( msg, msg2 );
1875 aList.emplace_back( msg, msg2 );
1883 if(
board->IsFootprintHolder() )
1915 if(
pad->IsOnLayer( aLayer ) )
1921 if( zone->IsOnLayer( aLayer ) )
1927 if( field->IsOnLayer( aLayer ) )
1933 if( item->IsOnLayer( aLayer ) )
1945 if(
pad->IsOnLayer( aLayer ) &&
pad->HitTest( aPosition, aAccuracy ) )
1951 if( zone->IsOnLayer( aLayer ) && zone->HitTest( aPosition, aAccuracy ) )
1957 if( item->Type() !=
PCB_TEXT_T && item->IsOnLayer( aLayer )
1958 && item->HitTest( aPosition, aAccuracy ) )
1970 std::vector<BOARD_ITEM*> items;
1974 if(
pad->IsOnLayer( aLayer ) )
1975 items.push_back(
pad );
1980 if( zone->IsOnLayer( aLayer ) )
1981 items.push_back( zone );
1986 if( item->Type() !=
PCB_TEXT_T && item->IsOnLayer( aLayer ) )
1987 items.push_back( item );
1996 if( !aContained && item->HitTest( aRect, aContained, aAccuracy ) )
1998 else if( aContained && !item->HitTest( aRect, aContained, aAccuracy ) )
2005 return !items.empty() && aContained;
2024 BOX2I arect = aRect;
2044 if(
pad->HitTest( arect,
false, 0 ) )
2050 if( zone->HitTest( arect,
false, 0 ) )
2056 if( point->HitTest( arect,
false, 0 ) )
2067 if( item->Type() !=
PCB_TEXT_T && item->HitTest( arect,
false, 0 ) )
2081 using std::ranges::all_of;
2082 using std::ranges::any_of;
2089 [&](
const auto* aItem )
2091 return aItem && aItem->HitTest( aPoly, aContained );
2097 auto drawings =
m_drawings | std::views::filter( [](
const auto* aItem )
2108 return all_of( drawings, hitTest )
2109 && all_of(
m_pads, hitTest )
2110 && all_of(
m_zones, hitTest );
2115 return any_of( drawings, hitTest )
2116 || any_of(
m_pads, hitTest )
2117 || any_of(
m_zones, hitTest );
2124 bool can_select = aSearchAfterMe ? false :
true;
2128 if( !can_select &&
pad == aSearchAfterMe )
2134 if( can_select &&
pad->GetNumber() == aPadNumber )
2147 if( !(
pad->GetLayerSet() & aLayerMask ).any() )
2150 if(
pad->HitTest( aPosition ) )
2160 std::vector<const PAD*> retv;
2164 if( ( aIgnore && aIgnore ==
pad ) || (
pad->GetNumber() != aPadNumber ) )
2167 retv.push_back(
pad );
2195 std::set<wxString> usedNumbers;
2207 if(
pad->GetNumber().IsEmpty() )
2217 usedNumbers.insert(
pad->GetNumber() );
2232 if(
nullptr == a3DModel )
2260 const std::vector<KICAD_T>& aScanTypes )
2262#if 0 && defined(DEBUG)
2263 std::cout <<
GetClass().mb_str() <<
' ';
2266 bool drawingsScanned =
false;
2268 for(
KICAD_T scanType : aScanTypes )
2316 if( !drawingsScanned )
2324 drawingsScanned =
true;
2360 if( reference.IsEmpty() )
2361 reference =
_(
"<no reference designator>" );
2363 return wxString::Format(
_(
"Footprint %s" ), reference );
2400 aFunction( drawing );
2406 catch( std::bad_function_call& )
2408 wxFAIL_MSG( wxT(
"Error running FOOTPRINT::RunOnChildren" ) );
2415 std::vector<int> layers;
2417 layers.reserve( 6 );
2423 wxASSERT_MSG(
false, wxT(
"Illegal layer" ) );
2441 bool f_silk =
false, b_silk =
false, non_silk =
false;
2445 if( item->GetLayer() ==
F_SilkS )
2447 else if( item->GetLayer() ==
B_SilkS )
2453 if( ( f_silk || b_silk ) && !non_silk &&
m_pads.empty() )
2490 constexpr double MINIMAL_ZOOM_LEVEL_FOR_VISIBILITY = 1.5;
2493 return MINIMAL_ZOOM_LEVEL_FOR_VISIBILITY;
2506 int biggest_clearance =
board->GetMaxClearanceValue();
2507 area.
Inflate( biggest_clearance );
2518 if( aName.find_first_of( invalids ) != std::string::npos )
2532 static const wxChar invalidChars[] = wxT(
"%$<>\t\n\r\"\\/:");
2533 static const wxChar invalidCharsReadable[] = wxT(
"% $ < > 'tab' 'return' 'line feed' \\ \" / :");
2536 return invalidCharsReadable;
2538 return invalidChars;
2544 if( aMoveVector.
x == 0 && aMoveVector.
y == 0 )
2558 EDA_ANGLE newOrientation = orientation + aAngle;
2565 field->KeepUpright();
2570 static_cast<PCB_TEXT*
>( item )->KeepUpright();
2577 wxASSERT( aLayer ==
F_Cu || aLayer ==
B_Cu );
2654 field->EDA_TEXT::Offset(
delta );
2660 zone->Move(
delta );
2663 item->Move(
delta );
2666 point->Move(
delta );
2698 field->Move( moveVector );
2702 pad->Move( moveVector );
2706 item->Move( moveVector );
2710 zone->Move( moveVector );
2778 const BOARD_ITEM* aItem,
bool addToFootprint )
2782 switch( aItem->
Type() )
2786 PAD* new_pad =
new PAD( *
static_cast<const PAD*
>( aItem ) );
2789 if( addToFootprint )
2790 m_pads.push_back( new_pad );
2798 ZONE* new_zone =
new ZONE( *
static_cast<const ZONE*
>( aItem ) );
2801 if( addToFootprint )
2802 m_zones.push_back( new_zone );
2804 new_item = new_zone;
2813 if( addToFootprint )
2816 new_item = new_point;
2828 switch(
static_cast<const PCB_FIELD*
>( aItem )->GetId() )
2837 if( addToFootprint )
2840 new_item = new_text;
2849 if( addToFootprint )
2852 new_item = new_shape;
2861 if( addToFootprint )
2864 new_item = new_barcode;
2873 if( addToFootprint )
2876 new_item = new_image;
2885 if( addToFootprint )
2888 new_item = new_textbox;
2901 if( addToFootprint )
2904 new_item = dimension;
2912 if( addToFootprint )
2914 group->RunOnChildren(
2934 wxFAIL_MSG( wxT(
"Duplication not supported for items of class " ) + aItem->
GetClass() );
2944 std::set<wxString> usedNumbers;
2948 usedNumbers.insert(
pad->GetNumber() );
2955 while( usedNumbers.count( wxString::Format( wxT(
"%s%d" ), prefix, num ) ) )
2958 return wxString::Format( wxT(
"%s%d" ), prefix, num );
2966 if(
group.contains( aPadNumber ) )
2970 return std::nullopt;
3021 for(
int jj = 0; jj < aPolySet.
HoleCount( ii ); jj++ )
3025 return aPolySet.
Area();
3040 return markerShape.
Area();
3044 double combinedArea = 0.0;
3049 return combinedArea;
3100 double width =
static_cast<const PCB_TRACK*
>( aItem )->GetWidth();
3101 return width * width;
3105 static_cast<const PAD*
>( aItem )->Padstack().ForEachUniqueLayer(
3137 for(
int i = 0; i < aCollector.
GetCount(); ++i )
3141 switch( item->
Type() )
3173 double footprintRegionArea =
polygonArea( footprintRegion );
3174 double uncoveredRegionArea = footprintRegionArea -
polygonArea( coveredRegion );
3175 double coveredArea = footprintRegionArea - uncoveredRegionArea;
3178 if( footprintRegionArea == 0 )
3181 double ratio = coveredArea / footprintRegionArea;
3188 return std::min( ratio, 1.0 );
3194 std::shared_ptr<SHAPE_COMPOUND> shape = std::make_shared<SHAPE_COMPOUND>();
3215 shape->AddShape(
pad->GetEffectiveShape( aLayer, aFlash )->Clone() );
3220 shape->AddShape( item->GetEffectiveShape( aLayer, aFlash )->Clone() );
3222 shape->AddShape( item->GetEffectiveShape( aLayer, aFlash )->Clone() );
3262 std::vector<PCB_SHAPE*> list_front;
3263 std::vector<PCB_SHAPE*> list_back;
3264 std::map<int, int> front_width_histogram;
3265 std::map<int, int> back_width_histogram;
3272 list_back.push_back( shape );
3279 list_front.push_back( shape );
3284 if( !list_front.size() && !list_back.size() )
3288 int chainingEpsilon =
pcbIUScale.mmToIU( 0.02 );
3291 true, aErrorHandler ) )
3301 auto max = std::max_element( front_width_histogram.begin(), front_width_histogram.end(),
3302 [](
const std::pair<int, int>& a,
const std::pair<int, int>& b )
3304 return a.second < b.second;
3307 if( max != front_width_histogram.end() )
3330 auto max = std::max_element( back_width_histogram.begin(), back_width_histogram.end(),
3331 [](
const std::pair<int, int>& a,
const std::pair<int, int>& b )
3333 return a.second < b.second;
3336 if( max != back_width_histogram.end() )
3359 std::map<PCB_LAYER_ID, std::vector<PCB_SHAPE*>> layer_shapes;
3365 if( item->Type() != PCB_SHAPE_T )
3368 for( PCB_LAYER_ID layer : item->GetLayerSet() )
3370 if( !IsCopperLayer( layer ) )
3373 if( board && !board->GetEnabledLayers().Contains( layer ) )
3376 layer_shapes[layer].push_back( static_cast<PCB_SHAPE*>( item ) );
3380 for(
size_t ii = 0; ii < m_pads.size(); ++ii )
3383 bool has_nettie =
false;
3385 auto it = map.find(
pad->GetNumber() );
3387 if( it == map.end() || it->second < 0 )
3390 for(
size_t jj = ii + 1; jj < m_pads.size(); ++jj )
3392 PAD* other = m_pads[ jj ];
3394 auto it2 = map.find( other->
GetNumber() );
3396 if( it2 == map.end() || it2->second < 0 )
3399 if( it2->second == it->second )
3401 m_netTieCache[
pad].insert(
pad->GetNetCode() );
3403 m_netTieCache[other].insert( other->
GetNetCode() );
3404 m_netTieCache[other].insert(
pad->GetNetCode() );
3412 for(
auto& [ layer, shapes ] : layer_shapes )
3414 auto pad_shape =
pad->GetEffectiveShape( layer );
3416 for(
auto other_shape : shapes )
3418 auto shape = other_shape->GetEffectiveShape( layer );
3420 if( pad_shape->Collide( shape.get() ) )
3422 std::set<int>& nettie = m_netTieCache[
pad];
3423 m_netTieCache[other_shape].insert( nettie.begin(), nettie.end() );
3433 std::map<wxString, int> padNumberToGroupIdxMap;
3436 padNumberToGroupIdxMap[
pad->GetNumber() ] = -1;
3439 [&]( wxString aPad,
int aGroup )
3441 aPad.Trim(
true ).Trim(
false );
3443 if( !aPad.IsEmpty() )
3444 padNumberToGroupIdxMap[ aPad ] = aGroup;
3453 for( wxUniCharRef ch :
group )
3462 switch(
static_cast<unsigned char>( ch ) )
3469 processPad(
pad, ii );
3479 processPad(
pad, ii );
3482 return padNumberToGroupIdxMap;
3492 int groupIdx = padToNetTieGroupMap[ aPad->
GetNumber() ];
3493 std::vector<PAD*> otherPads;
3499 if( padToNetTieGroupMap[
pad->GetNumber() ] == groupIdx )
3500 otherPads.push_back(
pad );
3513 if( setAttr && likelyAttr && setAttr != likelyAttr )
3517 switch( likelyAttr )
3520 msg.Printf(
_(
"(expected 'Through hole'; actual '%s')" ),
GetTypeName() );
3523 msg.Printf(
_(
"(expected 'SMD'; actual '%s')" ),
GetTypeName() );
3528 (aErrorHandler)( msg );
3534 const std::function<
void(
const PAD*,
int,
3535 const wxString& )>& aErrorHandler )
3537 if( aErrorHandler ==
nullptr )
3542 pad->CheckPad( aUnitsProvider,
false,
3543 [&](
int errorCode,
const wxString& msg )
3545 aErrorHandler(
pad, errorCode, msg );
3553 const VECTOR2I& )>& aErrorHandler )
3555 std::unordered_map<PTR_PTR_CACHE_KEY, int> checkedPairs;
3570 if(
static_cast<void*
>( a ) >
static_cast<void*
>( b ) )
3573 if( checkedPairs.find( { a, b } ) == checkedPairs.end() )
3575 checkedPairs[ { a, b } ] = 1;
3587 std::shared_ptr<SHAPE_SEGMENT> holeA =
pad->GetEffectiveHoleShape();
3590 if( holeA->Collide( holeB->GetSeg(), 0 ) )
3607 SHAPE* padShape =
pad->GetEffectiveShape( l ).get();
3610 if( padShape->
Collide( otherShape, 0,
nullptr, &pos ) )
3623 const VECTOR2I& )>& aErrorHandler )
3632 std::vector<BOARD_ITEM*> copperItems;
3636 if( item->IsOnCopperLayer() )
3637 copperItems.push_back( item );
3639 item->RunOnChildren(
3643 copperItems.push_back( descendent );
3650 if( !zone->GetIsRuleArea() && zone->IsOnCopperLayer() )
3651 copperItems.push_back( zone );
3656 if( field->IsOnCopperLayer() )
3657 copperItems.push_back( field );
3667 std::map<int, std::vector<const PAD*>> outlineIdxToPadsMap;
3671 if( item->IsOnLayer( layer ) )
3681 for(
int ii = 0; ii < copperOutlines.
OutlineCount(); ++ii )
3683 if(
pad->GetEffectiveShape( layer )->Collide( &copperOutlines.
Outline( ii ), 0 ) )
3684 outlineIdxToPadsMap[ ii ].emplace_back(
pad );
3691 for(
const auto& [ outlineIdx, pads ] : outlineIdxToPadsMap )
3693 if( pads.size() > 1 )
3695 const PAD* firstPad = pads[0];
3696 int firstGroupIdx = padNumberToGroupIdxMap[ firstPad->
GetNumber() ];
3698 for(
size_t ii = 1; ii < pads.size(); ++ii )
3700 const PAD* thisPad = pads[ii];
3701 int thisGroupIdx = padNumberToGroupIdxMap[ thisPad->
GetNumber() ];
3703 if( thisGroupIdx < 0 || thisGroupIdx != firstGroupIdx )
3712 if( item->HitTest( pos, 1 ) )
3714 shortingItem = item;
3720 aErrorHandler( shortingItem, firstPad, thisPad, pos );
3722 aErrorHandler( firstPad, thisPad,
nullptr, pos );
3733 std::set<wxString> padNumbers;
3742 msg.Printf(
_(
"(net-tie pad group contains unknown pad number %s)" ), padNumber );
3743 aErrorHandler( msg );
3745 else if( !padNumbers.insert(
pad->GetNumber() ).second )
3747 msg.Printf(
_(
"(pad %s appears in more than one net-tie pad group)" ), padNumber );
3748 aErrorHandler( msg );
3756 const VECTOR2I& aPt )>& aErrorHandler )
3758 auto checkColliding =
3773 if( itemShape->Collide( otherShape.get(), 0, &
actual, &pos ) )
3774 aErrorHandler( item, other, pos );
3783 checkColliding( item, other );
3787 checkColliding( item,
pad );
3798 std::swap( *
this, *
image );
3807 image->RunOnChildren(
3835 return *
this == other;
3844 for(
size_t ii = 0; ii <
m_pads.size(); ++ii )
3853 for(
size_t ii = 0; ii <
m_drawings.size(); ++ii )
3862 for(
size_t ii = 0; ii <
m_zones.size(); ++ii )
3872 std::vector<PCB_FIELD*> fields, otherFields;
3877 if( fields.size() != otherFields.size() )
3880 for(
size_t ii = 0; ii < fields.size(); ++ii )
3884 if( !( *fields[ii] == *otherFields[ii] ) )
3900 double similarity = 1.0;
3909 similarity *=
pad->Similarity( *otherPad );
3921 if( aPtA.
x != aPtB.
x )
3922 return aPtA.
x < aPtB.
x;
3924 if( aPtA.
y != aPtB.
y )
3925 return aPtA.
y < aPtB.
y;
3927 return std::nullopt;
3933 if( itemA->
Type() != itemB->
Type() )
3934 return itemA->
Type() < itemB->
Type();
3939 switch( itemA->
Type() )
3978 for(
int ii = 0; ii < dwgA->
GetPolyShape().TotalVertices(); ++ii )
3980 if( std::optional<bool> cmp =
4037 return itemA < itemB;
4049 std::optional<bool> padCopperMatches;
4052 const PAD* checkPad = aFirst;
4065 padCopperMatches = aFirst->
GetSize( aLayer ).
x < aSecond->
GetSize( aLayer ).
x;
4067 padCopperMatches = aFirst->
GetSize( aLayer ).
y < aSecond->
GetSize( aLayer ).
y;
4069 padCopperMatches = aFirst->
GetShape( aLayer ) < aSecond->
GetShape( aLayer );
4072 if( padCopperMatches.has_value() )
4073 return *padCopperMatches;
4081 return aFirst < aSecond;
4086bool FOOTPRINT::cmp_padstack::operator()(
const PAD* aFirst,
const PAD* aSecond )
const
4126 if( firstShape->VertexCount() != secondShape->VertexCount() )
4127 return firstShape->VertexCount() < secondShape->VertexCount();
4129 for(
int ii = 0; ii < firstShape->VertexCount(); ++ii )
4131 if( std::optional<bool> cmp =
cmp_points_opt( firstShape->CVertex( ii ), secondShape->CVertex( ii ) ) )
4153 for(
int ii = 0; ii < aFirst->
Outline()->TotalVertices(); ++ii )
4155 if( std::optional<bool> cmp =
4165 return aFirst < aSecond;
4170 int aMaxError,
ERROR_LOC aErrorLoc )
const
4181 clearance.x +=
pad->GetSolderMaskExpansion( padLayer );
4182 clearance.y +=
pad->GetSolderMaskExpansion( padLayer );
4205 if( dummySize.
x <= 0 || dummySize.
y <= 0 )
4209 dummy.SetSize( padLayer, dummySize );
4210 dummy.TransformShapeToPolygon( aBuffer, padLayer, 0, aMaxError, aErrorLoc );
4214 pad->TransformShapeToPolygon( aBuffer, padLayer,
clearance.x, aMaxError, aErrorLoc );
4220 if( !
pad->FlashLayer( aLayer ) )
4225 pad->Padstack().ForEachUniqueLayer(
4228 processPad(
pad, l );
4233 processPad(
pad, aLayer );
4240 int aError,
ERROR_LOC aErrorLoc,
bool aIncludeText,
4241 bool aIncludeShapes,
bool aIncludePrivateItems )
const
4248 if( item->Type() ==
PCB_TEXT_T && aIncludeText )
4253 text->TransformTextToPolySet( aBuffer, aClearance, aError, aErrorLoc );
4264 textbox->PCB_SHAPE::TransformShapeToPolygon( aBuffer, aLayer, 0, aError, aErrorLoc );
4271 if( item->Type() ==
PCB_SHAPE_T && aIncludeShapes )
4292 if( field->GetLayer() == aLayer && field->IsVisible() )
4293 field->TransformTextToPolySet( aBuffer, aClearance, aError, aErrorLoc );
4303 std::set<KIFONT::OUTLINE_FONT*>
fonts;
4317 if( permission == PERMISSION::EDITABLE || permission == PERMISSION::INSTALLABLE )
4318 fonts.insert( outlineFont );
4324 processItem( item );
4327 processItem( field );
4372 return wxEmptyString;
4377 const std::unordered_set<wxString>& aComponentClassNames )
4426 LSET padLayers =
pad->GetLayerSet();
4427 padLayers |= boardCopper;
4428 pad->SetLayerSet( padLayers );
4440 if( zcMap.
Choices().GetCount() == 0 )
4452 if( layerEnum.
Choices().GetCount() == 0 )
4460 wxPGChoices fpLayers;
4471 auto isNotFootprintHolder =
4477 return !
board->IsFootprintHolder();
4484 layer->SetChoices( fpLayers );
4485 layer->SetAvailableFunc( isNotFootprintHolder );
4493 const wxString groupFields =
_HKI(
"Fields" );
4518 const wxString groupAttributes =
_HKI(
"Attributes" );
4532 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.
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
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...
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
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.
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