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 ] );
261 *
this = std::move( aFootprint );
301 board->IncrementTimeStamp();
308 types::FootprintInstance footprint;
310 footprint.mutable_id()->set_value(
m_Uuid.AsStdString() );
311 footprint.mutable_position()->set_x_nm(
GetPosition().x );
312 footprint.mutable_position()->set_y_nm(
GetPosition().y );
315 footprint.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
316 : kiapi::common::types::LockedState::LS_UNLOCKED );
318 google::protobuf::Any buf;
320 buf.UnpackTo( footprint.mutable_reference_field() );
322 buf.UnpackTo( footprint.mutable_value_field() );
324 buf.UnpackTo( footprint.mutable_datasheet_field() );
326 buf.UnpackTo( footprint.mutable_description_field() );
328 types::FootprintAttributes* attrs = footprint.mutable_attributes();
334 attrs->set_do_not_populate(
IsDNP() );
338 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_THROUGH_HOLE );
340 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_SMD );
342 attrs->set_mounting_style( types::FootprintMountingStyle::FMS_UNSPECIFIED );
344 types::Footprint* def = footprint.mutable_definition();
349 def->mutable_attributes()->set_keywords(
GetKeywords().ToStdString() );
353 types::FootprintDesignRuleOverrides* overrides = footprint.mutable_overrides();
367 overrides->set_zone_connection(
372 types::NetTieDefinition* netTie = def->add_net_ties();
373 wxStringTokenizer tokenizer(
group,
", \t\r\n", wxTOKEN_STRTOK );
375 while( tokenizer.HasMoreTokens() )
376 netTie->add_pad_number( tokenizer.GetNextToken().ToStdString() );
384 if( item->IsMandatory() )
387 google::protobuf::Any* itemMsg = def->add_items();
388 item->Serialize( *itemMsg );
391 for(
const PAD* item :
Pads() )
393 google::protobuf::Any* itemMsg = def->add_items();
394 item->Serialize( *itemMsg );
399 google::protobuf::Any* itemMsg = def->add_items();
400 item->Serialize( *itemMsg );
405 google::protobuf::Any* itemMsg = def->add_items();
406 item->Serialize( *itemMsg );
411 google::protobuf::Any* itemMsg = def->add_items();
412 types::Footprint3DModel modelMsg;
413 modelMsg.set_filename(
model.m_Filename.ToUTF8() );
417 modelMsg.set_visible(
model.m_Show );
418 modelMsg.set_opacity(
model.m_Opacity );
419 itemMsg->PackFrom( modelMsg );
424 footprint.set_symbol_sheet_name(
m_sheetname.ToUTF8() );
425 footprint.set_symbol_sheet_filename(
m_sheetfile.ToUTF8() );
426 footprint.set_symbol_footprint_filters(
m_filters.ToUTF8() );
428 aContainer.PackFrom( footprint );
435 types::FootprintInstance footprint;
437 if( !aContainer.UnpackTo( &footprint ) )
444 SetLocked( footprint.locked() == kiapi::common::types::LockedState::LS_LOCKED );
446 google::protobuf::Any buf;
447 types::Field mandatoryField;
449 if( footprint.has_reference_field() )
451 mandatoryField = footprint.reference_field();
453 buf.PackFrom( mandatoryField );
457 if( footprint.has_value_field() )
459 mandatoryField = footprint.value_field();
461 buf.PackFrom( mandatoryField );
465 if( footprint.has_datasheet_field() )
467 mandatoryField = footprint.datasheet_field();
469 buf.PackFrom( mandatoryField );
473 if( footprint.has_description_field() )
475 mandatoryField = footprint.description_field();
477 buf.PackFrom( mandatoryField );
483 switch( footprint.attributes().mounting_style() )
485 case types::FootprintMountingStyle::FMS_THROUGH_HOLE:
489 case types::FootprintMountingStyle::FMS_SMD:
497 SetBoardOnly( footprint.attributes().not_in_schematic() );
501 SetDNP( footprint.attributes().do_not_populate() );
508 SetKeywords( footprint.definition().attributes().keywords() );
510 const types::FootprintDesignRuleOverrides& overrides = footprint.overrides();
512 if( overrides.has_copper_clearance() )
517 if( overrides.has_solder_mask() && overrides.solder_mask().has_solder_mask_margin() )
522 if( overrides.has_solder_paste() )
524 const types::SolderPasteOverrides& pasteSettings = overrides.solder_paste();
526 if( pasteSettings.has_solder_paste_margin() )
531 if( pasteSettings.has_solder_paste_margin_ratio() )
539 for(
const types::NetTieDefinition& netTieMsg : footprint.definition().net_ties() )
543 for(
const std::string&
pad : netTieMsg.pad_number() )
544 group.Append( wxString::Format( wxT(
"%s " ),
pad ) );
552 for(
int layerMsg : footprint.definition().private_layers() )
557 privateLayers.
set( layer );
563 m_sheetname = wxString::FromUTF8( footprint.symbol_sheet_name() );
564 m_sheetfile = wxString::FromUTF8( footprint.symbol_sheet_filename() );
565 m_filters = wxString::FromUTF8( footprint.symbol_footprint_filters() );
570 if( !field->IsMandatory() )
581 for(
const google::protobuf::Any& itemMsg : footprint.definition().items() )
589 if( itemMsg.type_url() ==
"type.googleapis.com/kiapi.board.types.Footprint3DModel" )
591 types::Footprint3DModel modelMsg;
593 if( !itemMsg.UnpackTo( &modelMsg ) )
598 model.m_Filename = wxString::FromUTF8( modelMsg.filename() );
599 model.m_Show = modelMsg.visible();
600 model.m_Opacity = modelMsg.opacity();
609 wxLogTrace(
traceApi, wxString::Format( wxS(
"Attempting to unpack unknown type %s "
610 "from footprint message, skipping" ),
611 itemMsg.type_url() ) );
619 if( item && item->Deserialize( itemMsg ) )
631 if( field->GetId() == aFieldType )
646 if( field->GetId() == aFieldType )
656 return GetField( aFieldName ) !=
nullptr;
664 if( field->GetName() == aFieldName )
680 if( !field->IsVisible() || field->GetText().IsEmpty() )
684 aVector.push_back( field );
687 std::sort( aVector.begin(), aVector.end(),
690 return lhs->GetOrdinal() < rhs->GetOrdinal();
700 ordinal = std::max( ordinal, field->GetOrdinal() + 1 );
707 bool aStyleShapes,
bool aStyleDimensions,
bool aStyleBarcodes )
712 field->StyleFromSettings(
board.GetDesignSettings(),
true );
717 switch( item->Type() )
722 item->StyleFromSettings(
board.GetDesignSettings(),
true );
727 if( aStyleShapes && !item->IsOnCopperLayer() )
728 item->StyleFromSettings(
board.GetDesignSettings(),
true );
737 if( aStyleDimensions )
738 item->StyleFromSettings(
board.GetDesignSettings(),
true );
744 item->StyleFromSettings(
board.GetDesignSettings(),
true );
757 std::vector< BOARD_ITEM* > item_list;
760 item_list.push_back( field );
763 item_list.push_back(
pad );
766 item_list.push_back( gr_item );
771 item_list.push_back(
group );
775 item_list.push_back( zone );
779 item_list.push_back( point );
781 bool changed =
false;
787 const_cast<KIID&
>( item->m_Uuid ) =
KIID();
800 m_pos = aOther.m_pos;
832 for(
PCB_FIELD* field : aOther.m_fields )
835 aOther.m_fields.clear();
843 for(
PAD*
pad : aOther.Pads() )
846 aOther.Pads().clear();
854 for(
ZONE* item : aOther.Zones() )
862 item->SetNetCode( -1 );
865 aOther.Zones().clear();
873 for(
BOARD_ITEM* item : aOther.GraphicalItems() )
876 aOther.GraphicalItems().clear();
887 aOther.Groups().clear();
895 for(
PCB_POINT* point : aOther.Points() )
898 aOther.Points().clear();
911 aOther.m_componentClassCacheProxy->GetStaticComponentClass() );
914 aOther.m_fields.clear();
915 aOther.Pads().clear();
916 aOther.Zones().clear();
917 aOther.GraphicalItems().clear();
918 aOther.m_initial_comments =
nullptr;
954 std::map<EDA_ITEM*, EDA_ITEM*> ptrMap;
965 ptrMap[field] = newField;
978 ptrMap[
pad ] = newPad;
990 ZONE* newZone =
static_cast<ZONE*
>( zone->Clone() );
991 ptrMap[ zone ] = newZone;
1010 ptrMap[ item ] = newItem;
1026 newGroup->
AddItem( ptrMap[ member ] );
1040 ptrMap[ point ] = newItem;
1065 *
this = *
static_cast<const FOOTPRINT*
>( aOther );
1091 aVars->push_back( wxT(
"REFERENCE" ) );
1092 aVars->push_back( wxT(
"VALUE" ) );
1093 aVars->push_back( wxT(
"LAYER" ) );
1094 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
1095 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
1096 aVars->push_back( wxT(
"SHORT_NET_NAME(<pad_number>)" ) );
1097 aVars->push_back( wxT(
"NET_NAME(<pad_number>)" ) );
1098 aVars->push_back( wxT(
"NET_CLASS(<pad_number>)" ) );
1099 aVars->push_back( wxT(
"PIN_NAME(<pad_number>)" ) );
1108 if( token->IsSameAs( wxT(
"REFERENCE" ) ) )
1113 else if( token->IsSameAs( wxT(
"VALUE" ) ) )
1118 else if( token->IsSameAs( wxT(
"LAYER" ) ) )
1123 else if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
1125 *token =
m_fpid.GetUniStringLibNickname();
1128 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
1130 *token =
m_fpid.GetUniStringLibItemName();
1133 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) )
1134 || token->StartsWith( wxT(
"NET_NAME(" ) )
1135 || token->StartsWith( wxT(
"NET_CLASS(" ) )
1136 || token->StartsWith( wxT(
"PIN_NAME(" ) ) )
1138 wxString padNumber = token->AfterFirst(
'(' );
1139 padNumber = padNumber.BeforeLast(
')' );
1143 if(
pad->GetNumber() == padNumber )
1145 if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
1146 *token =
pad->GetShortNetname();
1147 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
1148 *token =
pad->GetNetname();
1149 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
1150 *token =
pad->GetNetClassName();
1152 *token =
pad->GetPinFunction();
1160 *token = field->GetShownText(
false, aDepth + 1 );
1179 return it !=
m_variants.end() ? &it->second :
nullptr;
1187 return it !=
m_variants.end() ? &it->second :
nullptr;
1193 if( aVariant.
GetName().IsEmpty()
1205 it->second = std::move( updated );
1215 if( aVariantName.IsEmpty()
1218 wxASSERT_MSG(
false, wxT(
"Variant name cannot be empty or default." ) );
1232 auto inserted =
m_variants.emplace( aVariantName, std::move( variant ) );
1233 return &inserted.first->second;
1245 if( aNewName.IsEmpty()
1256 auto existingIt =
m_variants.find( aNewName );
1258 if( existingIt !=
m_variants.end() && existingIt != it )
1261 if( it->first == aNewName )
1267 m_variants.emplace( aNewName, std::move( variant ) );
1280 if( aVariantName.IsEmpty()
1287 return variant->
GetDNP();
1297 if( aVariantName.IsEmpty()
1314 if( aVariantName.IsEmpty()
1329 const wxString& aFieldName )
const
1332 if( !aVariantName.IsEmpty()
1343 return field->GetText();
1360 switch( aBoardItem->
Type() )
1386 m_pads.push_back(
static_cast<PAD*
>( aBoardItem ) );
1388 m_pads.push_front(
static_cast<PAD*
>( aBoardItem ) );
1394 m_zones.push_back(
static_cast<ZONE*
>( aBoardItem ) );
1409 wxFAIL_MSG( wxT(
"FOOTPRINT::Add(): Markers go at the board level, even in the footprint editor" ) );
1413 wxFAIL_MSG( wxT(
"FOOTPRINT::Add(): Nested footprints not supported" ) );
1425 wxFAIL_MSG( wxString::Format( wxT(
"FOOTPRINT::Add(): BOARD_ITEM type (%d) not handled" ),
1426 aBoardItem->
Type() ) );
1440 switch( aBoardItem->
Type() )
1445 if( *it == aBoardItem )
1467 if( *it == aBoardItem )
1477 for(
auto it =
m_pads.begin(); it !=
m_pads.end(); ++it )
1479 if( *it ==
static_cast<PAD*
>( aBoardItem ) )
1491 if( *it ==
static_cast<ZONE*
>( aBoardItem ) )
1503 if( *it ==
static_cast<PCB_GROUP*
>( aBoardItem ) )
1515 if( *it ==
static_cast<PCB_POINT*
>( aBoardItem ) )
1527 msg.Printf( wxT(
"FOOTPRINT::Remove() needs work: BOARD_ITEM type (%d) not handled" ),
1528 aBoardItem->
Type() );
1556 switch(
pad->GetProperty() )
1574 switch(
pad->GetAttribute() )
1581 if(
pad->IsOnCopperLayer() )
1609 return _(
"Through hole" );
1611 return _(
"Other" );
1626 if(
dummy.IsFlipped() )
1630 bbox.
Merge(
pad->GetBoundingBox() );
1675 std::vector<PCB_TEXT*> texts;
1676 bool isFPEdit =
board &&
board->IsFootprintHolder();
1697 texts.push_back(
static_cast<PCB_TEXT*
>( item ) );
1715 bbox.
Merge( item->GetBoundingBox() );
1721 if( field->IsReference() || field->IsValue() )
1724 texts.push_back( field );
1728 bbox.
Merge(
pad->GetBoundingBox() );
1731 bbox.
Merge( zone->GetBoundingBox() );
1734 bbox.
Merge( point->GetBoundingBox() );
1739 if( aIncludeText || noDrawItems )
1756 bool valueLayerIsVisible =
true;
1757 bool refLayerIsVisible =
true;
1775 if( (
Value().IsVisible() && valueLayerIsVisible ) || noDrawItems )
1780 if( (
Reference().IsVisible() && refLayerIsVisible ) || noDrawItems )
1788 if( aIncludeText || noDrawItems )
1806 std::vector<PCB_TEXT*> texts;
1808 bool isFPEdit =
board &&
board->IsFootprintHolder();
1818 if( ( aLayers & item->GetLayerSet() ).none() )
1826 bbox.
Merge( item->GetBoundingBox() );
1831 if( ( aLayers &
pad->GetLayerSet() ).none() )
1834 bbox.
Merge(
pad->GetBoundingBox() );
1839 if( ( aLayers & zone->GetLayerSet() ).none() )
1842 bbox.
Merge( zone->GetBoundingBox() );
1850 if( ( aLayers & point->GetLayerSet() ).none() )
1853 bbox.
Merge( point->GetBoundingBox() );
1863 bool isFPEdit =
board &&
board->IsFootprintHolder();
1889 pad->Padstack().ForEachUniqueLayer(
1903 const SHAPE_POLY_SET& layerPoly = *zone->GetFilledPolysList( layer );
1919 const int halfsize =
pcbIUScale.mmToIU( 1.0 );
1930 std::vector<VECTOR2I> convex_hull;
1936 for(
const VECTOR2I& pt : convex_hull )
1949 bool isFPEdit =
board &&
board->IsFootprintHolder();
1959 if( item->IsOnLayer( aLayer ) )
1973 if(
pad->IsOnLayer( aLayer ) )
1979 if( zone->GetIsRuleArea() )
1982 if( zone->IsOnLayer( aLayer ) )
1984 const std::shared_ptr<SHAPE_POLY_SET>& layerPoly = zone->GetFilledPolysList( aLayer );
1986 for(
int ii = 0; ii < layerPoly->OutlineCount(); ii++ )
1987 rawPolys.
AddOutline( layerPoly->COutline( ii ) );
1991 std::vector<VECTOR2I> convex_hull;
1996 for(
const VECTOR2I& pt : convex_hull )
2017 aList.emplace_back(
_(
"Library" ),
GetFPID().GetLibNickname().wx_str() );
2019 aList.emplace_back(
_(
"Footprint Name" ),
GetFPID().GetLibItemName().wx_str() );
2021 aList.emplace_back(
_(
"Pads" ), wxString::Format( wxT(
"%zu" ), padCount ) );
2024 wxString::Format(
_(
"Keywords: %s" ),
GetKeywords() ) );
2033 case F_Cu: aList.emplace_back(
_(
"Board Side" ),
_(
"Front" ) );
break;
2034 case B_Cu: aList.emplace_back(
_(
"Board Side" ),
_(
"Back (Flipped)" ) );
break;
2038 auto addToken = []( wxString* aStr,
const wxString& aAttr )
2040 if( !aStr->IsEmpty() )
2041 *aStr += wxT(
", " );
2050 addToken( &status,
_(
"Locked" ) );
2053 addToken( &status,
_(
"autoplaced" ) );
2056 addToken( &attrs,
_(
"not in schematic" ) );
2059 addToken( &attrs,
_(
"exclude from pos files" ) );
2062 addToken( &attrs,
_(
"exclude from BOM" ) );
2065 addToken( &attrs,
_(
"DNP" ) );
2067 aList.emplace_back(
_(
"Status: " ) + status,
_(
"Attributes:" ) + wxS(
" " ) + attrs );
2069 aList.emplace_back(
_(
"Rotation" ), wxString::Format( wxT(
"%.4g" ),
2075 _(
"Component Class" ),
2079 msg.Printf(
_(
"Footprint: %s" ),
m_fpid.GetUniStringLibId() );
2080 msg2.Printf(
_(
"3D-Shape: %s" ),
m_3D_Drawings.empty() ?
_(
"<none>" )
2082 aList.emplace_back( msg, msg2 );
2086 aList.emplace_back( msg, msg2 );
2094 if(
board->IsFootprintHolder() )
2126 if(
pad->IsOnLayer( aLayer ) )
2132 if( zone->IsOnLayer( aLayer ) )
2138 if( field->IsOnLayer( aLayer ) )
2144 if( item->IsOnLayer( aLayer ) )
2156 if(
pad->IsOnLayer( aLayer ) &&
pad->HitTest( aPosition, aAccuracy ) )
2162 if( zone->IsOnLayer( aLayer ) && zone->HitTest( aPosition, aAccuracy ) )
2168 if( item->Type() !=
PCB_TEXT_T && item->IsOnLayer( aLayer )
2169 && item->HitTest( aPosition, aAccuracy ) )
2181 std::vector<BOARD_ITEM*> items;
2185 if(
pad->IsOnLayer( aLayer ) )
2186 items.push_back(
pad );
2191 if( zone->IsOnLayer( aLayer ) )
2192 items.push_back( zone );
2197 if( item->Type() !=
PCB_TEXT_T && item->IsOnLayer( aLayer ) )
2198 items.push_back( item );
2207 if( !aContained && item->HitTest( aRect, aContained, aAccuracy ) )
2209 else if( aContained && !item->HitTest( aRect, aContained, aAccuracy ) )
2216 return !items.empty() && aContained;
2235 BOX2I arect = aRect;
2255 if(
pad->HitTest( arect,
false, 0 ) )
2261 if( zone->HitTest( arect,
false, 0 ) )
2267 if( point->HitTest( arect,
false, 0 ) )
2278 if( item->Type() !=
PCB_TEXT_T && item->HitTest( arect,
false, 0 ) )
2292 using std::ranges::all_of;
2293 using std::ranges::any_of;
2300 [&](
const auto* aItem )
2302 return aItem && aItem->HitTest( aPoly, aContained );
2308 auto drawings =
m_drawings | std::views::filter( [](
const auto* aItem )
2319 return all_of( drawings, hitTest )
2320 && all_of(
m_pads, hitTest )
2321 && all_of(
m_zones, hitTest );
2326 return any_of( drawings, hitTest )
2327 || any_of(
m_pads, hitTest )
2328 || any_of(
m_zones, hitTest );
2335 bool can_select = aSearchAfterMe ? false :
true;
2339 if( !can_select &&
pad == aSearchAfterMe )
2345 if( can_select &&
pad->GetNumber() == aPadNumber )
2358 if( !(
pad->GetLayerSet() & aLayerMask ).any() )
2361 if(
pad->HitTest( aPosition ) )
2371 std::vector<const PAD*> retv;
2375 if( ( aIgnore && aIgnore ==
pad ) || (
pad->GetNumber() != aPadNumber ) )
2378 retv.push_back(
pad );
2406 std::set<wxString> usedNumbers;
2418 if(
pad->GetNumber().IsEmpty() )
2428 usedNumbers.insert(
pad->GetNumber() );
2443 if(
nullptr == a3DModel )
2471 const std::vector<KICAD_T>& aScanTypes )
2473#if 0 && defined(DEBUG)
2474 std::cout <<
GetClass().mb_str() <<
' ';
2477 bool drawingsScanned =
false;
2479 for(
KICAD_T scanType : aScanTypes )
2527 if( !drawingsScanned )
2535 drawingsScanned =
true;
2571 if( reference.IsEmpty() )
2572 reference =
_(
"<no reference designator>" );
2574 return wxString::Format(
_(
"Footprint %s" ), reference );
2611 aFunction( drawing );
2617 catch( std::bad_function_call& )
2619 wxFAIL_MSG( wxT(
"Error running FOOTPRINT::RunOnChildren" ) );
2626 std::vector<int> layers;
2628 layers.reserve( 6 );
2634 wxASSERT_MSG(
false, wxT(
"Illegal layer" ) );
2652 bool f_silk =
false, b_silk =
false, non_silk =
false;
2656 if( item->GetLayer() ==
F_SilkS )
2658 else if( item->GetLayer() ==
B_SilkS )
2664 if( ( f_silk || b_silk ) && !non_silk &&
m_pads.empty() )
2701 constexpr double MINIMAL_ZOOM_LEVEL_FOR_VISIBILITY = 1.5;
2704 return MINIMAL_ZOOM_LEVEL_FOR_VISIBILITY;
2717 int biggest_clearance =
board->GetMaxClearanceValue();
2718 area.
Inflate( biggest_clearance );
2729 if( aName.find_first_of( invalids ) != std::string::npos )
2743 static const wxChar invalidChars[] = wxT(
"%$<>\t\n\r\"\\/:");
2744 static const wxChar invalidCharsReadable[] = wxT(
"% $ < > 'tab' 'return' 'line feed' \\ \" / :");
2747 return invalidCharsReadable;
2749 return invalidChars;
2755 if( aMoveVector.
x == 0 && aMoveVector.
y == 0 )
2769 EDA_ANGLE newOrientation = orientation + aAngle;
2776 field->KeepUpright();
2781 static_cast<PCB_TEXT*
>( item )->KeepUpright();
2788 wxASSERT( aLayer ==
F_Cu || aLayer ==
B_Cu );
2865 field->EDA_TEXT::Offset(
delta );
2871 zone->Move(
delta );
2874 item->Move(
delta );
2877 point->Move(
delta );
2909 field->Move( moveVector );
2913 pad->Move( moveVector );
2917 item->Move( moveVector );
2921 zone->Move( moveVector );
2989 const BOARD_ITEM* aItem,
bool addToFootprint )
2993 switch( aItem->
Type() )
2997 PAD* new_pad =
new PAD( *
static_cast<const PAD*
>( aItem ) );
3000 if( addToFootprint )
3001 m_pads.push_back( new_pad );
3009 ZONE* new_zone =
new ZONE( *
static_cast<const ZONE*
>( aItem ) );
3012 if( addToFootprint )
3013 m_zones.push_back( new_zone );
3015 new_item = new_zone;
3024 if( addToFootprint )
3027 new_item = new_point;
3039 switch(
static_cast<const PCB_FIELD*
>( aItem )->GetId() )
3048 if( addToFootprint )
3051 new_item = new_text;
3060 if( addToFootprint )
3063 new_item = new_shape;
3072 if( addToFootprint )
3075 new_item = new_barcode;
3084 if( addToFootprint )
3087 new_item = new_image;
3096 if( addToFootprint )
3099 new_item = new_textbox;
3112 if( addToFootprint )
3115 new_item = dimension;
3123 if( addToFootprint )
3125 group->RunOnChildren(
3145 wxFAIL_MSG( wxT(
"Duplication not supported for items of class " ) + aItem->
GetClass() );
3155 std::set<wxString> usedNumbers;
3159 usedNumbers.insert(
pad->GetNumber() );
3166 while( usedNumbers.count( wxString::Format( wxT(
"%s%d" ), prefix, num ) ) )
3169 return wxString::Format( wxT(
"%s%d" ), prefix, num );
3177 if(
group.contains( aPadNumber ) )
3181 return std::nullopt;
3232 for(
int jj = 0; jj < aPolySet.
HoleCount( ii ); jj++ )
3236 return aPolySet.
Area();
3251 return markerShape.
Area();
3255 double combinedArea = 0.0;
3260 return combinedArea;
3311 double width =
static_cast<const PCB_TRACK*
>( aItem )->GetWidth();
3312 return width * width;
3316 static_cast<const PAD*
>( aItem )->Padstack().ForEachUniqueLayer(
3348 for(
int i = 0; i < aCollector.
GetCount(); ++i )
3352 switch( item->
Type() )
3384 double footprintRegionArea =
polygonArea( footprintRegion );
3385 double uncoveredRegionArea = footprintRegionArea -
polygonArea( coveredRegion );
3386 double coveredArea = footprintRegionArea - uncoveredRegionArea;
3389 if( footprintRegionArea == 0 )
3392 double ratio = coveredArea / footprintRegionArea;
3399 return std::min( ratio, 1.0 );
3405 std::shared_ptr<SHAPE_COMPOUND> shape = std::make_shared<SHAPE_COMPOUND>();
3426 shape->AddShape(
pad->GetEffectiveShape( aLayer, aFlash )->Clone() );
3431 shape->AddShape( item->GetEffectiveShape( aLayer, aFlash )->Clone() );
3433 shape->AddShape( item->GetEffectiveShape( aLayer, aFlash )->Clone() );
3473 std::vector<PCB_SHAPE*> list_front;
3474 std::vector<PCB_SHAPE*> list_back;
3475 std::map<int, int> front_width_histogram;
3476 std::map<int, int> back_width_histogram;
3483 list_back.push_back( shape );
3490 list_front.push_back( shape );
3495 if( !list_front.size() && !list_back.size() )
3499 int chainingEpsilon =
pcbIUScale.mmToIU( 0.02 );
3502 true, aErrorHandler ) )
3512 auto max = std::max_element( front_width_histogram.begin(), front_width_histogram.end(),
3513 [](
const std::pair<int, int>& a,
const std::pair<int, int>& b )
3515 return a.second < b.second;
3518 if( max != front_width_histogram.end() )
3541 auto max = std::max_element( back_width_histogram.begin(), back_width_histogram.end(),
3542 [](
const std::pair<int, int>& a,
const std::pair<int, int>& b )
3544 return a.second < b.second;
3547 if( max != back_width_histogram.end() )
3570 std::map<PCB_LAYER_ID, std::vector<PCB_SHAPE*>> layer_shapes;
3576 if( item->Type() != PCB_SHAPE_T )
3579 for( PCB_LAYER_ID layer : item->GetLayerSet() )
3581 if( !IsCopperLayer( layer ) )
3584 if( board && !board->GetEnabledLayers().Contains( layer ) )
3587 layer_shapes[layer].push_back( static_cast<PCB_SHAPE*>( item ) );
3591 for(
size_t ii = 0; ii < m_pads.size(); ++ii )
3594 bool has_nettie =
false;
3596 auto it = map.find(
pad->GetNumber() );
3598 if( it == map.end() || it->second < 0 )
3601 for(
size_t jj = ii + 1; jj < m_pads.size(); ++jj )
3603 PAD* other = m_pads[ jj ];
3605 auto it2 = map.find( other->
GetNumber() );
3607 if( it2 == map.end() || it2->second < 0 )
3610 if( it2->second == it->second )
3612 m_netTieCache[
pad].insert(
pad->GetNetCode() );
3614 m_netTieCache[other].insert( other->
GetNetCode() );
3615 m_netTieCache[other].insert(
pad->GetNetCode() );
3623 for(
auto& [ layer, shapes ] : layer_shapes )
3625 auto pad_shape =
pad->GetEffectiveShape( layer );
3627 for(
auto other_shape : shapes )
3629 auto shape = other_shape->GetEffectiveShape( layer );
3631 if( pad_shape->Collide( shape.get() ) )
3633 std::set<int>& nettie = m_netTieCache[
pad];
3634 m_netTieCache[other_shape].insert( nettie.begin(), nettie.end() );
3644 std::map<wxString, int> padNumberToGroupIdxMap;
3647 padNumberToGroupIdxMap[
pad->GetNumber() ] = -1;
3650 [&]( wxString aPad,
int aGroup )
3652 aPad.Trim(
true ).Trim(
false );
3654 if( !aPad.IsEmpty() )
3655 padNumberToGroupIdxMap[ aPad ] = aGroup;
3664 for( wxUniCharRef ch :
group )
3673 switch(
static_cast<unsigned char>( ch ) )
3680 processPad(
pad, ii );
3690 processPad(
pad, ii );
3693 return padNumberToGroupIdxMap;
3703 int groupIdx = padToNetTieGroupMap[ aPad->
GetNumber() ];
3704 std::vector<PAD*> otherPads;
3710 if( padToNetTieGroupMap[
pad->GetNumber() ] == groupIdx )
3711 otherPads.push_back(
pad );
3724 if( setAttr && likelyAttr && setAttr != likelyAttr )
3728 switch( likelyAttr )
3731 msg.Printf(
_(
"(expected 'Through hole'; actual '%s')" ),
GetTypeName() );
3734 msg.Printf(
_(
"(expected 'SMD'; actual '%s')" ),
GetTypeName() );
3739 (aErrorHandler)( msg );
3745 const std::function<
void(
const PAD*,
int,
3746 const wxString& )>& aErrorHandler )
3748 if( aErrorHandler ==
nullptr )
3753 pad->CheckPad( aUnitsProvider,
false,
3754 [&](
int errorCode,
const wxString& msg )
3756 aErrorHandler(
pad, errorCode, msg );
3764 const VECTOR2I& )>& aErrorHandler )
3766 std::unordered_map<PTR_PTR_CACHE_KEY, int> checkedPairs;
3781 if(
static_cast<void*
>( a ) >
static_cast<void*
>( b ) )
3784 if( checkedPairs.find( { a, b } ) == checkedPairs.end() )
3786 checkedPairs[ { a, b } ] = 1;
3798 std::shared_ptr<SHAPE_SEGMENT> holeA =
pad->GetEffectiveHoleShape();
3801 if( holeA->Collide( holeB->GetSeg(), 0 ) )
3818 SHAPE* padShape =
pad->GetEffectiveShape( l ).get();
3821 if( padShape->
Collide( otherShape, 0,
nullptr, &pos ) )
3834 const VECTOR2I& )>& aErrorHandler )
3843 std::vector<BOARD_ITEM*> copperItems;
3847 if( item->IsOnCopperLayer() )
3848 copperItems.push_back( item );
3850 item->RunOnChildren(
3854 copperItems.push_back( descendent );
3861 if( !zone->GetIsRuleArea() && zone->IsOnCopperLayer() )
3862 copperItems.push_back( zone );
3867 if( field->IsOnCopperLayer() )
3868 copperItems.push_back( field );
3878 std::map<int, std::vector<const PAD*>> outlineIdxToPadsMap;
3882 if( item->IsOnLayer( layer ) )
3892 for(
int ii = 0; ii < copperOutlines.
OutlineCount(); ++ii )
3894 if(
pad->GetEffectiveShape( layer )->Collide( &copperOutlines.
Outline( ii ), 0 ) )
3895 outlineIdxToPadsMap[ ii ].emplace_back(
pad );
3902 for(
const auto& [ outlineIdx, pads ] : outlineIdxToPadsMap )
3904 if( pads.size() > 1 )
3906 const PAD* firstPad = pads[0];
3907 int firstGroupIdx = padNumberToGroupIdxMap[ firstPad->
GetNumber() ];
3909 for(
size_t ii = 1; ii < pads.size(); ++ii )
3911 const PAD* thisPad = pads[ii];
3912 int thisGroupIdx = padNumberToGroupIdxMap[ thisPad->
GetNumber() ];
3914 if( thisGroupIdx < 0 || thisGroupIdx != firstGroupIdx )
3923 if( item->HitTest( pos, 1 ) )
3925 shortingItem = item;
3931 aErrorHandler( shortingItem, firstPad, thisPad, pos );
3933 aErrorHandler( firstPad, thisPad,
nullptr, pos );
3944 std::set<wxString> padNumbers;
3953 msg.Printf(
_(
"(net-tie pad group contains unknown pad number %s)" ), padNumber );
3954 aErrorHandler( msg );
3956 else if( !padNumbers.insert(
pad->GetNumber() ).second )
3958 msg.Printf(
_(
"(pad %s appears in more than one net-tie pad group)" ), padNumber );
3959 aErrorHandler( msg );
3967 const VECTOR2I& aPt )>& aErrorHandler )
3969 auto checkColliding =
3984 if( itemShape->Collide( otherShape.get(), 0, &
actual, &pos ) )
3985 aErrorHandler( item, other, pos );
3994 checkColliding( item, other );
3998 checkColliding( item,
pad );
4009 std::swap( *
this, *
image );
4018 image->RunOnChildren(
4046 return *
this == other;
4055 for(
size_t ii = 0; ii <
m_pads.size(); ++ii )
4064 for(
size_t ii = 0; ii <
m_drawings.size(); ++ii )
4073 for(
size_t ii = 0; ii <
m_zones.size(); ++ii )
4083 std::vector<PCB_FIELD*> fields, otherFields;
4088 if( fields.size() != otherFields.size() )
4091 for(
size_t ii = 0; ii < fields.size(); ++ii )
4095 if( !( *fields[ii] == *otherFields[ii] ) )
4111 double similarity = 1.0;
4120 similarity *=
pad->Similarity( *otherPad );
4132 if( aPtA.
x != aPtB.
x )
4133 return aPtA.
x < aPtB.
x;
4135 if( aPtA.
y != aPtB.
y )
4136 return aPtA.
y < aPtB.
y;
4138 return std::nullopt;
4144 if( itemA->
Type() != itemB->
Type() )
4145 return itemA->
Type() < itemB->
Type();
4150 switch( itemA->
Type() )
4189 for(
int ii = 0; ii < dwgA->
GetPolyShape().TotalVertices(); ++ii )
4191 if( std::optional<bool> cmp =
4248 return itemA < itemB;
4260 std::optional<bool> padCopperMatches;
4263 const PAD* checkPad = aFirst;
4276 padCopperMatches = aFirst->
GetSize( aLayer ).
x < aSecond->
GetSize( aLayer ).
x;
4278 padCopperMatches = aFirst->
GetSize( aLayer ).
y < aSecond->
GetSize( aLayer ).
y;
4280 padCopperMatches = aFirst->
GetShape( aLayer ) < aSecond->
GetShape( aLayer );
4283 if( padCopperMatches.has_value() )
4284 return *padCopperMatches;
4292 return aFirst < aSecond;
4297bool FOOTPRINT::cmp_padstack::operator()(
const PAD* aFirst,
const PAD* aSecond )
const
4337 if( firstShape->VertexCount() != secondShape->VertexCount() )
4338 return firstShape->VertexCount() < secondShape->VertexCount();
4340 for(
int ii = 0; ii < firstShape->VertexCount(); ++ii )
4342 if( std::optional<bool> cmp =
cmp_points_opt( firstShape->CVertex( ii ), secondShape->CVertex( ii ) ) )
4364 for(
int ii = 0; ii < aFirst->
Outline()->TotalVertices(); ++ii )
4366 if( std::optional<bool> cmp =
4376 return aFirst < aSecond;
4381 int aMaxError,
ERROR_LOC aErrorLoc )
const
4392 clearance.x +=
pad->GetSolderMaskExpansion( padLayer );
4393 clearance.y +=
pad->GetSolderMaskExpansion( padLayer );
4416 if( dummySize.
x <= 0 || dummySize.
y <= 0 )
4420 dummy.SetSize( padLayer, dummySize );
4421 dummy.TransformShapeToPolygon( aBuffer, padLayer, 0, aMaxError, aErrorLoc );
4425 pad->TransformShapeToPolygon( aBuffer, padLayer,
clearance.x, aMaxError, aErrorLoc );
4431 if( !
pad->FlashLayer( aLayer ) )
4436 pad->Padstack().ForEachUniqueLayer(
4439 processPad(
pad, l );
4444 processPad(
pad, aLayer );
4451 int aError,
ERROR_LOC aErrorLoc,
bool aIncludeText,
4452 bool aIncludeShapes,
bool aIncludePrivateItems )
const
4459 if( item->Type() ==
PCB_TEXT_T && aIncludeText )
4464 text->TransformTextToPolySet( aBuffer, aClearance, aError, aErrorLoc );
4475 textbox->PCB_SHAPE::TransformShapeToPolygon( aBuffer, aLayer, 0, aError, aErrorLoc );
4482 if( item->Type() ==
PCB_SHAPE_T && aIncludeShapes )
4503 if( ( aLayer ==
UNDEFINED_LAYER || field->GetLayer() == aLayer ) && field->IsVisible() )
4504 field->TransformTextToPolySet( aBuffer, aClearance, aError, aErrorLoc );
4514 std::set<KIFONT::OUTLINE_FONT*>
fonts;
4528 if( permission == PERMISSION::EDITABLE || permission == PERMISSION::INSTALLABLE )
4529 fonts.insert( outlineFont );
4535 processItem( item );
4538 processItem( field );
4583 return wxEmptyString;
4588 const std::unordered_set<wxString>& aComponentClassNames )
4637 LSET padLayers =
pad->GetLayerSet();
4638 padLayers |= boardCopper;
4639 pad->SetLayerSet( padLayers );
4651 if( zcMap.
Choices().GetCount() == 0 )
4663 if( layerEnum.
Choices().GetCount() == 0 )
4671 wxPGChoices fpLayers;
4682 auto isNotFootprintHolder =
4688 return !
board->IsFootprintHolder();
4695 layer->SetChoices( fpLayers );
4696 layer->SetAvailableFunc( isNotFootprintHolder );
4704 const wxString groupFields =
_HKI(
"Fields" );
4729 const wxString groupAttributes =
_HKI(
"Attributes" );
4743 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