59#include <api/board/board_types.pb.h>
63#include <magic_enum.hpp>
149 *
this = *
static_cast<const PAD*
>( aOther );
154std::optional<std::pair<ELECTRICAL_PINTYPE, bool>>
parsePinType(
const wxString& aPinTypeString )
157 static std::map<wxString, ELECTRICAL_PINTYPE> map = {
172 bool hasNoConnect = aPinTypeString.EndsWith( wxT(
"+no_connect" ) );
174 if(
auto it = map.find( aPinTypeString.BeforeFirst(
'+' ) ); it != map.end() )
175 return std::make_pair( it->second, hasNoConnect );
184 using namespace kiapi::common::types;
187 pad.mutable_id()->set_value(
m_Uuid.AsStdString() );
189 pad.set_locked(
IsLocked() ? LockedState::LS_LOCKED
190 : LockedState::LS_UNLOCKED );
197 google::protobuf::Any padStackMsg;
199 padStackMsg.UnpackTo(
pad.mutable_pad_stack() );
209 pad.mutable_symbol_pin()->set_no_connect( pt->second );
212 aContainer.PackFrom(
pad );
218 kiapi::board::types::Pad
pad;
220 if( !aContainer.UnpackTo( &
pad ) )
226 SetLocked(
pad.locked() == kiapi::common::types::LockedState::LS_LOCKED );
232 google::protobuf::Any padStackWrapper;
233 padStackWrapper.PackFrom(
pad.pad_stack() );
238 if(
pad.has_copper_clearance_override() )
245 if(
pad.symbol_pin().type() != kiapi::common::types::EPT_UNKNOWN )
250 if(
pad.symbol_pin().no_connect() )
314 int thisNetTieGroup = padToNetTieGroupMap[
GetNumber() ];
315 int otherNetTieGroup = padToNetTieGroupMap[ aOther->
GetNumber() ];
317 return thisNetTieGroup >= 0 && thisNetTieGroup == otherNetTieGroup;
326 return m_pinType.Contains( wxT(
"no_connect" ) );
472 else if( aOnlyCheckIfPermitted )
482 return board->GetConnectivity()->IsConnectedOnLayer(
this, aLayer, nonZoneTypes );
571 int startOrdinal =
board->IsLayerEnabled( secondaryDrill.
start )
573 : secondaryDrill.
start / 2
575 int endOrdinal =
board->IsLayerEnabled( secondaryDrill.
end )
576 ?
board->IsLayerEnabled(
F_Cu ) ? ( secondaryDrill.
end ==
B_Cu ?
board->GetCopperLayerCount() - 1 : secondaryDrill.
end / 2 + 1 )
577 : secondaryDrill.
end / 2
579 int layerOrdinal =
board->IsLayerEnabled( aLayer )
580 ?
board->IsLayerEnabled(
F_Cu ) ? ( aLayer ==
F_Cu ? 0 : aLayer ==
B_Cu ?
board->GetCopperLayerCount() - 1 : aLayer / 2 + 1 )
584 if( layerOrdinal >= 0 && startOrdinal >= 0 && endOrdinal >= 0 )
586 if( startOrdinal > endOrdinal )
587 std::swap( startOrdinal, endOrdinal );
589 if( layerOrdinal >= startOrdinal && layerOrdinal <= endOrdinal )
600 int startOrdinal =
board->IsLayerEnabled( tertiaryDrill.
start )
602 : tertiaryDrill.
start / 2
604 int endOrdinal =
board->IsLayerEnabled( tertiaryDrill.
end )
605 ?
board->IsLayerEnabled(
F_Cu ) ? ( tertiaryDrill.
end ==
B_Cu ?
board->GetCopperLayerCount() - 1 : tertiaryDrill.
end / 2 + 1 )
606 : tertiaryDrill.
end / 2
608 int layerOrdinal =
board->IsLayerEnabled( aLayer )
609 ?
board->IsLayerEnabled(
F_Cu ) ? ( aLayer ==
F_Cu ? 0 : aLayer ==
B_Cu ?
board->GetCopperLayerCount() - 1 : aLayer / 2 + 1 )
613 if( layerOrdinal >= 0 && startOrdinal >= 0 && endOrdinal >= 0 )
615 if( startOrdinal > endOrdinal )
616 std::swap( startOrdinal, endOrdinal );
618 if( layerOrdinal >= startOrdinal && layerOrdinal <= endOrdinal )
649 int pmDepth = frontPM.
depth;
653 && frontPM.
angle > 0 )
655 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
656 pmDepth =
static_cast<int>( ( frontPM.
size / 2.0 ) / tan( halfAngleRad ) );
664 if( layerDist < pmDepth )
669 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
670 int diameterAtLayer = frontPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
671 return std::max( 0, diameterAtLayer );
688 int pmDepth = backPM.
depth;
692 && backPM.
angle > 0 )
694 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
695 pmDepth =
static_cast<int>( ( backPM.
size / 2.0 ) / tan( halfAngleRad ) );
703 if( layerDist < pmDepth )
708 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
709 int diameterAtLayer = backPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
710 return std::max( 0, diameterAtLayer );
867 m_padStack.SetRoundRectRadius( aRadius, aLayer );
873 m_padStack.SetRoundRectRadiusRatio( std::clamp( aRadiusScale, 0.0, 0.5 ), aLayer );
882 "Set front radius only meaningful for normal padstacks" );
884 m_padStack.SetRoundRectRadiusRatio( std::clamp( aRadiusScale, 0.0, 0.5 ),
F_Cu );
892 const int minSize = std::min( size.
x, size.
y );
893 const double newRatio = aRadius / double(
minSize );
902 const int minSize = std::min( size.
x, size.
y );
911 m_padStack.SetChamferRatio( aChamferScale, aLayer );
933 std::shared_ptr<SHAPE_COMPOUND> effective_compund = std::make_shared<SHAPE_COMPOUND>();
938 return effective_compund;
942 effective_compund->AddShape( std::make_shared<SHAPE_NULL>() );
943 return effective_compund;
950 std::shared_ptr<SHAPE_COMPOUND> effective_compound = std::make_shared<SHAPE_COMPOUND>();
961 holeSize = std::max( holeSize, frontPM.
size );
967 holeSize = std::max( holeSize, backPM.
size );
973 holeSize = std::max( holeSize, secDrill.
size.
x );
977 effective_compound->AddShape(
978 std::make_shared<SHAPE_CIRCLE>(
GetPosition(), holeSize / 2 ) );
985 return effective_compound;
991 std::shared_ptr<SHAPE_COMPOUND> effective_compund = std::make_shared<SHAPE_COMPOUND>();
1005 return effective_compund;
1009 effective_compund->AddShape( std::make_shared<SHAPE_NULL>() );
1010 return effective_compund;
1021 wxString::Format( wxT(
"Missing shape in PAD::GetEffectiveShape for layer %s." ),
1022 magic_enum::enum_name( aLayer ) ) );
1024 wxString::Format( wxT(
"Null shape in PAD::GetEffectiveShape for layer %s." ),
1025 magic_enum::enum_name( aLayer ) ) );
1076 half_width = half_size.
x;
1080 half_width = std::min( half_size.
x, half_size.
y );
1081 half_len =
VECTOR2I( half_size.
x - half_width, half_size.
y - half_width );
1099 auto add = [
this, aLayer](
SHAPE* aShape )
1111 switch( effectiveShape )
1118 if( size.
x == size.
y )
1125 int half_width = std::min( half_size.
x, half_size.
y );
1126 VECTOR2I half_len( half_size.
x - half_width, half_size.
y - half_width );
1128 add(
new SHAPE_SEGMENT( shapePos - half_len, shapePos + half_len, half_width * 2 ) );
1138 VECTOR2I half_size( size.
x / 2, size.
y / 2 );
1147 const int min_len =
pcbIUScale.mmToIU( 0.0001 );
1149 if( half_size.
x < min_len && half_size.
y < min_len )
1157 trap_delta =
m_padStack.TrapezoidDeltaSize( aLayer ) / 2;
1162 corners.
Append( -half_size.
x - trap_delta.
y, half_size.
y + trap_delta.
x );
1163 corners.
Append( half_size.
x + trap_delta.
y, half_size.
y - trap_delta.
x );
1164 corners.
Append( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
1165 corners.
Append( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
1168 corners.
Move( shapePos );
1223 wxFAIL_MSG( wxT(
"PAD::buildEffectiveShapes: Unsupported pad shape: PAD_SHAPE::" )
1224 + wxString( std::string( magic_enum::enum_name( effectiveShape ) ) ) );
1230 for(
const std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
1232 if( !primitive->IsProxyItem() )
1234 for(
SHAPE* shape : primitive->MakeEffectiveShapes() )
1237 shape->Move( shapePos );
1264 std::shared_ptr<SHAPE_POLY_SET>& effectivePolygon =
m_effectivePolygons[ aLayer ][ aErrorLoc ];
1266 effectivePolygon = std::make_shared<SHAPE_POLY_SET>();
1270 if( doBoundingRadius )
1277 std::shared_ptr<SHAPE_POLY_SET>& effectivePolygon =
m_effectivePolygons[ aLayer ][ aErrorLoc ];
1279 for(
int cnt = 0; cnt < effectivePolygon->OutlineCount(); ++cnt )
1283 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
1324 switch( aAttribute )
1337 if( copperLayers.count() > 1 )
1339 layerMask &=
~LSET::AllCuMask();
1341 if( copperLayers.test(
B_Cu ) )
1344 layerMask.
set( copperLayers.
Seq().front() );
1373 if( !wasRoundable && isRoundable )
1429 auto mirrorBitFlags = [](
int& aBitfield,
int a,
int b )
1431 bool temp = aBitfield & a;
1488 for( std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
1492 primitive->SetParent(
this);
1493 primitive->Flip(
VECTOR2I( 0, 0 ), aFlipDirection );
1505 if( loc_offset.
x == 0 && loc_offset.
y == 0 )
1522 bool hasAnnularRing =
true;
1533 hasAnnularRing =
false;
1543 hasAnnularRing =
false;
1555 if( !hasAnnularRing )
1565 if(
m_padStack.Clearance().has_value() && aSource )
1566 *aSource =
_(
"pad" );
1578 return parentFootprint->GetClearanceOverrides( aSource );
1580 return std::optional<int>();
1625 std::optional<int> margin;
1639 margin =
m_padStack.SolderMaskMargin( aLayer );
1641 if( !margin.has_value() )
1644 margin = parentFootprint->GetLocalSolderMaskMargin();
1648 int marginValue = margin.value_or( 0 );
1653 if( marginValue < 0 )
1657 if( marginValue < minsize )
1658 marginValue = minsize;
1680 std::optional<int> margin;
1681 std::optional<double> mratio;
1700 margin =
m_padStack.SolderPasteMargin( aLayer );
1701 mratio =
m_padStack.SolderPasteMarginRatio( aLayer );
1703 if( !margin.has_value() )
1706 margin = parentFootprint->GetLocalSolderPasteMargin();
1709 if( !mratio.has_value() )
1712 mratio = parentFootprint->GetLocalSolderPasteMarginRatio();
1720 pad_margin.
x = margin.value_or( 0 ) +
KiROUND( padSize.
x * mratio.value_or( 0 ) );
1721 pad_margin.
y = margin.value_or( 0 ) +
KiROUND( padSize.
y * mratio.value_or( 0 ) );
1726 if( pad_margin.
x < -padSize.
x / 2 )
1727 pad_margin.
x = -padSize.
x / 2;
1729 if( pad_margin.
y < -padSize.
y / 2 )
1730 pad_margin.
y = -padSize.
y / 2;
1744 *aSource =
_(
"pad" );
1750 connection = parentFootprint->GetZoneConnectionOverrides( aSource );
1759 if(
m_padStack.ThermalSpokeWidth().has_value() && aSource )
1760 *aSource =
_(
"pad" );
1762 return m_padStack.ThermalSpokeWidth().value_or( 0 );
1768 if(
m_padStack.ThermalGap().has_value() && aSource )
1769 *aSource =
_(
"pad" );
1782 if( parentFootprint )
1783 aList.emplace_back(
_(
"Footprint" ), parentFootprint->
GetReference() );
1786 aList.emplace_back(
_(
"Pad" ),
m_number );
1792 aList.emplace_back(
_(
"Pin Type" ),
GetPinType() );
1798 aList.emplace_back(
_(
"Resolved Netclass" ),
1802 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
1814 double area = poly->Area();
1846 && padSize.
x == padSize.
y )
1860 if( !fp_orient.
IsZero() )
1865 aList.emplace_back(
_(
"Rotation" ), msg );
1869 aList.emplace_back(
_(
"Length in Package" ),
1875 if( drill.
x > 0 || drill.
y > 0 )
1879 aList.emplace_back(
_(
"Hole" ),
1880 wxString::Format( wxT(
"%s" ),
1885 aList.emplace_back(
_(
"Hole X / Y" ),
1886 wxString::Format( wxT(
"%s / %s" ),
1895 if( !source.IsEmpty() )
1897 aList.emplace_back( wxString::Format(
_(
"Min Clearance: %s" ),
1899 wxString::Format(
_(
"(from %s)" ),
1904 aList.emplace_back( wxT(
"UUID" ),
m_Uuid.AsString() );
1934 bool contains =
false;
1954 BOX2I arect = aRect;
1981 int count = poly->TotalVertices();
1983 for(
int ii = 0; ii < count; ii++ )
1985 VECTOR2I vertex = poly->CVertex( ii );
1986 VECTOR2I vertexNext = poly->CVertex( ( ii + 1 ) % count );
2037 if( ( diff =
static_cast<int>( aPadRef->
m_attribute ) -
static_cast<int>( aPadCmp->
m_attribute ) ) != 0 )
2064 default:
return wxT(
"???" );
2086 default:
return wxT(
"???" );
2099 default:
return wxT(
"???" );
2115 return wxString::Format(
_(
"NPTH pad of %s" ), parentFP->
GetReference() );
2117 return _(
"NPTH pad" );
2125 return wxString::Format(
_(
"Pad %s of %s on %s" ),
2132 return wxString::Format(
_(
"Pad on %s" ),
2140 return wxString::Format(
_(
"PTH pad %s of %s" ),
2146 return _(
"PTH pad" );
2156 return wxString::Format(
_(
"Pad %s %s of %s on %s" ),
2164 return wxString::Format(
_(
"Pad %s on %s" ),
2173 return wxString::Format(
_(
"PTH pad %s %s of %s" ),
2180 return wxString::Format(
_(
"PTH pad %s" ),
2196 PAD* cloned =
new PAD( *
this );
2203 primitive->SetParent( cloned );
2212 std::vector<int> layers;
2213 layers.reserve( 64 );
2233 cuLayers &=
board->GetEnabledLayers();
2235 if( cuLayers.count() > 1 )
2279 layers.push_back( each_layer );
2307 LSET visiblePhysical =
board->GetVisibleLayers();
2308 visiblePhysical &=
board->GetEnabledLayers();
2311 if( !visiblePhysical.any() )
2324 LSET visible =
board->GetVisibleLayers();
2325 visible &=
board->GetEnabledLayers();
2339 int64_t minSide = std::min( padSize.
x, padSize.
y );
2351 int solderMaskMargin = 0;
2359 solderPasteMargin.
x = std::max( solderPasteMargin.
x, layerMargin.
x );
2360 solderPasteMargin.
y = std::max( solderPasteMargin.
y, layerMargin.
y );
2369 if( cfg && cfg->m_Display.m_PadClearance &&
GetBoard() )
2374 int xMargin = std::max( solderMaskMargin, solderPasteMargin.
x ) +
clearance;
2375 int yMargin = std::max( solderMaskMargin, solderPasteMargin.
y ) +
clearance;
2458 std::swap( *
this, *
static_cast<PAD*
>( aImage ) );
2467 if( !drillsize.
x || !drillsize.
y )
2473 aError, aErrorLoc );
2480 int aMaxError,
ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
2482 wxASSERT_MSG( !ignoreLineWidth, wxT(
"IgnoreLineWidth has no meaning for pads." ) );
2484 wxT(
"UNDEFINED_LAYER is no longer allowed for PAD::TransformShapeToPolygon" ) );
2489 const int pad_min_seg_per_circle_count = 16;
2504 pad_min_seg_per_circle_count );
2508 int half_width = std::min( dx, dy );
2514 ( half_width + aClearance ) * 2, aMaxError, aErrorLoc,
2515 pad_min_seg_per_circle_count );
2529 ddx, ddy, aClearance, aMaxError, aErrorLoc );
2530 aBuffer.
Append( outline );
2544 aClearance, aMaxError, aErrorLoc );
2545 aBuffer.
Append( outline );
2559 aClearance += aMaxError;
2564 else if( aClearance < 0 )
2574 aBuffer.
Append( outline );
2579 wxFAIL_MSG( wxT(
"PAD::TransformShapeToPolygon no implementation for " )
2580 + wxString( std::string( magic_enum::enum_name( shape ) ) ) );
2624 [&](
PCB_SHAPE* aShape ) -> std::vector<PCB_SHAPE*>
2626 std::vector<PCB_SHAPE*> matching;
2636 matching.push_back( other );
2643 std::vector<PCB_SHAPE*> mergedShapes;
2670 int minExtent = std::min(
GetSize( layer ).x,
GetSize( layer ).y );
2689 mergedShapes.push_back( fpShape );
2697 group->RemoveItem( fpShape );
2715 for(
PCB_SHAPE* other : findMatching( fpShape ) )
2718 mergedShapes.push_back( other );
2728 return mergedShapes;
2733 const std::function<
void(
int aErrorCode,
const wxString& aMsg )>& aErrorHandler )
const
2738 doCheckPad( aLayer, aUnitsProvider, aForPadProperties, aErrorHandler );
2744 if( !padlayers_mask[
F_Cu] && !padlayers_mask[
B_Cu] )
2748 aErrorHandler(
DRCE_PADSTACK,
_(
"(plated through holes normally have a copper pad on "
2749 "at least one outer layer)" ) );
2756 aErrorHandler(
DRCE_PADSTACK,
_(
"('fiducial' pads are normally plated)" ) );
2760 aErrorHandler(
DRCE_PADSTACK,
_(
"('testpoint' pads are normally plated)" ) );
2763 aErrorHandler(
DRCE_PADSTACK,
_(
"('heatsink' pads are normally plated)" ) );
2766 aErrorHandler(
DRCE_PADSTACK,
_(
"('castellated' pads are normally PTH)" ) );
2769 aErrorHandler(
DRCE_PADSTACK,
_(
"('BGA' property is for SMD pads)" ) );
2772 aErrorHandler(
DRCE_PADSTACK,
_(
"('mechanical' pads are normally PTH)" ) );
2777 aErrorHandler(
DRCE_PADSTACK,
_(
"('press-fit' pads are normally PTH with round holes)" ) );
2784 if( drill_size.
x <= 0
2794 aErrorHandler(
DRCE_PADSTACK,
_(
"(connector pads normally have no solder paste; use a "
2795 "SMD pad instead)" ) );
2801 if( drill_size.
x > 0 || drill_size.
y > 0 )
2808 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper on both sides of the board)" ) );
2814 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and mask layers on different "
2815 "sides of the board)" ) );
2819 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and paste layers on different "
2820 "sides of the board)" ) );
2827 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and mask layers on different "
2828 "sides of the board)" ) );
2832 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and paste layers on different "
2833 "sides of the board)" ) );
2836 else if( innerlayers_mask.count() != 0 )
2838 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has no outer layers)" ) );
2848 const std::function<
void(
int aErrorCode,
const wxString& aMsg )>& aErrorHandler )
const
2864 const int min_drill_size = 4;
2868 msg.Printf(
_(
"(PTH pad hole size must be larger than %s)" ),
2891 aErrorHandler(
DRCE_PADSTACK,
_(
"(PTH pad hole leaves no copper)" ) );
2893 else if( aForPadProperties )
2901 aErrorHandler(
DRCE_PADSTACK,
_(
"(PTH pad hole not fully inside copper)" ) );
2908 aErrorHandler(
DRCE_PADSTACK,
_(
"(pad hole not inside pad shape)" ) );
2913 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative local clearance values have no effect)" ) );
2920 if( solderMaskMargin.has_value() && solderMaskMargin.value() < 0 )
2922 int absMargin = abs( solderMaskMargin.value() );
2926 for(
const std::shared_ptr<PCB_SHAPE>& shape :
GetPrimitives( aLayer ) )
2928 BOX2I shapeBBox = shape->GetBoundingBox();
2932 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder mask clearance is larger "
2933 "than some shape primitives; results may be "
2940 else if( absMargin > pad_size.
x || absMargin > pad_size.
y )
2942 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder mask clearance is larger than pad; "
2943 "no solder mask will be generated)" ) );
2956 paste_size.x = pad_size.
x + paste_margin +
KiROUND( pad_size.
x * mratio.value_or( 0 ) );
2957 paste_size.y = pad_size.
y + paste_margin +
KiROUND( pad_size.
y * mratio.value_or( 0 ) );
2959 if( paste_size.x <= 0 || paste_size.y <= 0 )
2961 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder paste margin is larger than pad; "
2962 "no solder paste mask will be generated)" ) );
2970 aErrorHandler(
DRCE_PADSTACK,
_(
"(corner size will make pad circular)" ) );
3009 const PAD& other =
static_cast<const PAD&
>( aBoardItem );
3011 return *
this == other;
3038 const PAD& other =
static_cast<const PAD&
>( aOther );
3040 double similarity = 1.0;
3059 poly_no_hole.
Append( aPoly );
3066 for(
int ii = 0; ii < poly_no_hole.
OutlineCount(); ++ii )
3101 if( aPrimitivesList.size() )
3111 for(
const std::shared_ptr<PCB_SHAPE>& prim : aPrimitivesList )
3121 m_padStack.AddPrimitive( aPrimitive, aLayer );
3159 SHAPE_RECT rect( -padSize.
x / 2, -padSize.
y / 2, padSize.
x, padSize.
y );
3172 for(
const std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
3174 if( !primitive->IsProxyItem() )
3229 if( pmMap.
Choices().GetCount() == 0 )
3242 if( bdMap.
Choices().GetCount() == 0 )
3254 if( zcMap.
Choices().GetCount() == 0 )
3286 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3292 auto padCanHaveHole =
3295 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3301 auto hasNormalPadstack =
3304 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3315 const wxString groupPad =
_HKI(
"Pad Properties" );
3316 const wxString groupPostMachining =
_HKI(
"Post-machining Properties" );
3317 const wxString groupBackdrill =
_HKI(
"Backdrill Properties" );
3343 wxPGChoices choices;
3360 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3373 const auto hasRoundRadius =
3376 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3416 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3424 groupPostMachining )
3427 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3437 groupPostMachining )
3440 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3445 auto mode =
pad->GetFrontPostMachining();
3455 groupPostMachining )
3458 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3463 auto mode =
pad->GetFrontPostMachining();
3472 groupPostMachining )
3475 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3480 auto mode =
pad->GetFrontPostMachining();
3489 groupPostMachining )
3492 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3502 groupPostMachining )
3505 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3510 auto mode =
pad->GetBackPostMachining();
3520 groupPostMachining )
3523 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3528 auto mode =
pad->GetBackPostMachining();
3537 groupPostMachining )
3540 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3545 auto mode =
pad->GetBackPostMachining();
3560 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3565 auto mode =
pad->GetBackdrillMode();
3577 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3582 auto mode =
pad->GetBackdrillMode();
3594 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3599 auto mode =
pad->GetBackdrillMode();
3611 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3616 auto mode =
pad->GetBackdrillMode();
3642 const wxString groupOverrides =
_HKI(
"Overrides" );
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
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
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
BITMAPS
A list of all bitmap identifiers.
ZONE_LAYER_OVERRIDE
Conditionally flashed vias and pads that interact with zones of different priority can be very squirr...
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
BASE_SET & set(size_t pos)
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
wxString GetNetnameMsg() const
virtual NETCLASS * GetEffectiveNetClass() const
Return the NETCLASS for this item.
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
wxString GetNetname() const
BOARD_CONNECTED_ITEM(BOARD_ITEM *aParent, KICAD_T idtype)
void PackNet(kiapi::board::types::Net *aProto) const
TEARDROP_PARAMETERS m_teardropParams
Not all BOARD_CONNECTED_ITEMs support teardrops, but we want those that do to share a single section ...
const wxString & GetShortNetname() const
void UnpackNet(const kiapi::board::types::Net &aProto)
Assigns a net to this item from an API message.
Container for design settings for a BOARD object.
std::shared_ptr< DRC_ENGINE > m_DRCEngine
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.
void SetLocked(bool aLocked) override
bool IsLocked() const override
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
virtual wxString LayerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
BOARD_ITEM_CONTAINER * GetParent() const
virtual int BoardCopperLayerCount() const
Return the total number of copper layers for the board that this item resides on.
Manage layers needed to make a physical board.
int GetLayerDistance(PCB_LAYER_ID aFirstLayer, PCB_LAYER_ID aSecondLayer) const
Calculate the distance (height) between the two given copper layers.
Information pertinent to a Pcbnew printed circuit board.
int GetMaxClearanceValue() const
Returns the maximum clearance value for any object on the board.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr size_type GetWidth() const
constexpr size_type GetHeight() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const Vec & GetOrigin() const
constexpr const SizeVec & GetSize() const
constexpr bool Intersects(const BOX2< Vec > &aRect) const
MINOPTMAX< int > & Value()
DRC_CONSTRAINT EvalRules(DRC_CONSTRAINT_T aConstraintType, const BOARD_ITEM *a, const BOARD_ITEM *b, PCB_LAYER_ID aLayer, REPORTER *aReporter=nullptr)
The base class for create windows for drawing purpose.
A set of EDA_ITEMs (i.e., without duplicates).
virtual VECTOR2I GetPosition() const
EDA_ITEM & operator=(const EDA_ITEM &aItem)
Assign the members of aItem to another object.
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * m_parent
Owner.
EDA_ITEM_FLAGS GetFlags() const
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
void SetPolyShape(const SHAPE_POLY_SET &aShape)
virtual void SetFilled(bool aFlag)
void SetShape(SHAPE_T aShape)
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
void SetFillMode(FILL_T aFill)
ENUM_MAP & Map(T aValue, const wxString &aName)
static ENUM_MAP< T > & Instance()
ENUM_MAP & Undefined(T aValue)
Class that other classes need to inherit from, in order to be inspectable.
Contains methods for drawing PCB-specific items.
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
PCB specific render settings.
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
bool GetHighContrast() const
static double lodScaleForThreshold(const KIGFX::VIEW *aView, int aWhatIu, int aThresholdIu)
Get the scale at which aWhatIu would be drawn at the same size as aThresholdIu on screen.
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.
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
LSET is a set of PCB_LAYER_IDs.
static const LSET & FrontBoardTechMask()
Return a mask holding technical layers used in a board fabrication (no CU layer) on front side.
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
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 LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static const LSET & PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
static const LSET & BackBoardTechMask()
Return a mask holding technical layers used in a board fabrication (no CU layer) on Back side.
static const LSET & InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
double Similarity(const PADSTACK &aOther) const
Return a measure of how likely the other object is to represent the same object.
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::...
PCB_LAYER_ID EffectiveLayerFor(PCB_LAYER_ID aLayer) const
Determines which geometry layer should be used for the given input layer.
POST_MACHINING_PROPS & FrontPostMachining()
static int Compare(const PADSTACK *aPadstackRef, const PADSTACK *aPadstackCmp)
Compare two padstacks and return 0 if they are equal.
@ NORMAL
Shape is the same on all layers.
DRILL_PROPS & SecondaryDrill()
POST_MACHINING_PROPS & BackPostMachining()
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
std::vector< std::shared_ptr< PCB_SHAPE > > & Primitives(PCB_LAYER_ID aLayer)
void SetFrontPostMachiningSize(int aSize)
int GetBackPostMachiningSize() const
void SetAnchorPadShape(PCB_LAYER_ID aLayer, PAD_SHAPE aShape)
Set the shape of the anchor pad for custom shaped pads.
bool IsAperturePad() const
void SetAttribute(PAD_ATTRIB aAttribute)
int GetOwnClearance(PCB_LAYER_ID aLayer, wxString *aSource=nullptr) const override
Return the pad's "own" clearance in internal units.
void CheckPad(UNITS_PROVIDER *aUnitsProvider, bool aForPadProperties, const std::function< void(int aErrorCode, const wxString &aMsg)> &aErrorHandler) const
virtual void swapData(BOARD_ITEM *aImage) override
PAD_PROP GetProperty() const
void SetFrontPostMachiningAngle(int aAngle)
void SetPrimaryDrillFilledFlag(bool aFilled)
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
double GetFrontRoundRectRadiusRatio() const
void doCheckPad(PCB_LAYER_ID aLayer, UNITS_PROVIDER *aUnitsProvider, bool aForPadProperties, const std::function< void(int aErrorCode, const wxString &aMsg)> &aErrorHandler) const
static wxString ShowPadShape(PAD_SHAPE aShape)
std::optional< int > GetClearanceOverrides(wxString *aSource) const override
Return any clearance overrides set in the "classic" (ie: pre-rule) system.
void SetPinType(const wxString &aType)
Set the pad electrical type.
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives(PCB_LAYER_ID aLayer) const
Accessor to the basic shape list for custom-shaped pads.
const ZONE_LAYER_OVERRIDE & GetZoneLayerOverride(PCB_LAYER_ID aLayer) const
void MergePrimitivesAsPolygon(PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aMergedPolygon, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Merge all basic shapes to a SHAPE_POLY_SET.
int GetRoundRectCornerRadius(PCB_LAYER_ID aLayer) const
bool FlashLayer(int aLayer, bool aOnlyCheckIfPermitted=false) const
Check to see whether the pad should be flashed on the specific layer.
void SetLocalThermalGapOverride(const std::optional< int > &aOverride)
void SetPrimaryDrillSize(const VECTOR2I &aSize)
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.
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
void SetTertiaryDrillStartLayer(PCB_LAYER_ID aLayer)
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
int GetDrillSizeY() const
void AddPrimitivePoly(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPoly, int aThickness, bool aFilled)
Has meaning only for custom shape pads.
std::optional< double > GetLocalSolderPasteMarginRatio() const
void SetFrontPostMachiningDepth(int aDepth)
void SetFrontShape(PAD_SHAPE aShape)
void SetTopBackdrillLayer(PCB_LAYER_ID aLayer)
const wxString & GetPinType() const
void SetZoneLayerOverride(PCB_LAYER_ID aLayer, ZONE_LAYER_OVERRIDE aOverride)
void SetSecondaryDrillSize(const VECTOR2I &aSize)
void SetPrimaryDrillFilled(const std::optional< bool > &aFilled)
const VECTOR2I & GetDrillSize() const
PAD_ATTRIB GetAttribute() const
static LSET PTHMask()
layer set for a through hole pad
static int Compare(const PAD *aPadRef, const PAD *aPadCmp)
Compare two pads and return 0 if they are equal.
const wxString & GetPinFunction() const
std::mutex m_shapesBuildingLock
bool CanHaveNumber() const
Indicates whether or not the pad can have a number.
void SetThermalSpokeAngle(const EDA_ANGLE &aAngle)
The orientation of the thermal spokes.
std::optional< int > GetBottomBackdrillSize() const
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
const wxString & GetNumber() const
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
void SetSecondaryDrillSizeX(int aX)
void SetFrontRoundRectRadiusRatio(double aRadiusScale)
void SetPrimaryDrillSizeX(int aX)
void BuildEffectiveShapes() const
Rebuild the effective shape cache (and bounding box and radius) for the pad and clears the dirty bit.
void SetPrimaryDrillEndLayer(PCB_LAYER_ID aLayer)
PAD_SHAPE GetFrontShape() const
void SetFrontPostMachiningMode(PAD_DRILL_POST_MACHINING_MODE aMode)
void CopyFrom(const BOARD_ITEM *aOther) override
void SetLocalSolderPasteMarginRatio(std::optional< double > aRatio)
PAD & operator=(const PAD &aOther)
void SetLocalThermalSpokeWidthOverride(std::optional< int > aWidth)
Set the width of the thermal spokes connecting the pad to a zone.
void SetShape(PCB_LAYER_ID aLayer, PAD_SHAPE aShape)
Set the new shape of this pad.
void SetSecondaryDrillStartLayer(PCB_LAYER_ID aLayer)
std::shared_ptr< SHAPE_SEGMENT > m_effectiveHoleShape
bool IsLocked() const override
wxString ShowLegacyPadShape(PCB_LAYER_ID aLayer) const
An older version still used by place file writer and SWIG interface.
VECTOR2I GetPosition() const override
void SetProperty(PAD_PROP aProperty)
void SetThermalSpokeAngleDegrees(double aAngle)
void SetPrimaryDrillSizeY(int aY)
EDA_ANGLE GetThermalSpokeAngle() const
std::map< PCB_LAYER_ID, ZONE_LAYER_OVERRIDE > m_zoneLayerOverrides
void Flip(const VECTOR2I &VECTOR2I, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
void SetBackPostMachiningSize(int aSize)
std::vector< PCB_SHAPE * > Recombine(bool aIsDryRun, int aMaxError)
Recombines the pad with other graphical shapes in the footprint.
PCB_LAYER_ID GetPrincipalLayer() const
void ClearTertiaryDrillSize()
PAD_DRILL_SHAPE GetTertiaryDrillShape() const
static LSET UnplatedHoleMask()
layer set for a mechanical unplated through hole pad
void SetBottomBackdrillLayer(PCB_LAYER_ID aLayer)
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
void SetTertiaryDrillShape(PAD_DRILL_SHAPE aShape)
double GetOrientationDegrees() const
void SetBackdrillMode(BACKDRILL_MODE aMode)
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
int GetBackPostMachiningAngle() const
void SetPadToDieDelay(int aDelay)
void FlipPrimitives(FLIP_DIRECTION aFlipDirection)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
LAYER_SHAPE_MAP m_effectiveShapes
bool IsNoConnectPad() const
int GetDrillSizeX() const
double GetRoundRectRadiusRatio(PCB_LAYER_ID aLayer) const
int GetFrontPostMachiningSize() const
void SetTertiaryDrillSizeX(int aX)
void DeletePrimitivesList(PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
Clear the basic shapes list.
void SetUnconnectedLayerMode(UNCONNECTED_LAYER_MODE aMode)
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE, bool ignoreLineWidth=false) const override
Convert the pad shape to a closed polygon.
void SetNumber(const wxString &aNumber)
Set the pad number (note that it can be alphanumeric, such as the array reference "AA12").
BACKDRILL_MODE GetBackdrillMode() const
void SetTertiaryDrillSize(const VECTOR2I &aSize)
void SetFrontRoundRectRadiusSize(int aRadius)
wxString ShowPadAttr() const
void SetSecondaryDrillEndLayer(PCB_LAYER_ID aLayer)
void AddPrimitive(PCB_LAYER_ID aLayer, PCB_SHAPE *aPrimitive)
Add item to the custom shape primitives list.
int GetFrontPostMachiningDepth() const
void SetDrillShape(PAD_DRILL_SHAPE aShape)
int m_effectiveBoundingRadius
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
void SetBackPostMachiningMode(PAD_DRILL_POST_MACHINING_MODE aMode)
void SetCustomShapeInZoneOpt(CUSTOM_SHAPE_ZONE_MODE aOption)
Set the option for the custom pad shape to use as clearance area in copper zones.
void SetLocalZoneConnection(ZONE_CONNECTION aType)
void SetChamferRectRatio(PCB_LAYER_ID aLayer, double aChamferScale)
Has meaning only for chamfered rectangular pads.
void SetPrimaryDrillCappedFlag(bool aCapped)
int GetSolderMaskExpansion(PCB_LAYER_ID aLayer) const
int GetPadToDieDelay() const
std::optional< int > GetLocalClearance() const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
void ImportSettingsFrom(const PAD &aMasterPad)
Import the pad settings from aMasterPad.
double Similarity(const BOARD_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
bool IsOnCopperLayer() const override
void SetTertiaryDrillEndLayer(PCB_LAYER_ID aLayer)
void SetPadstack(const PADSTACK &aPadstack)
void SetPosition(const VECTOR2I &aPos) override
const SHAPE_COMPOUND & buildEffectiveShape(PCB_LAYER_ID aLayer) const
void SetPrimaryDrillShape(PAD_DRILL_SHAPE aShape)
const PADSTACK & Padstack() const
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
double m_lastGalZoomLevel
PAD_DRILL_SHAPE GetSecondaryDrillShape() const
void BuildEffectivePolygon(ERROR_LOC aErrorLoc=ERROR_INSIDE) const
static LSET ConnSMDMask()
layer set for a SMD pad on Front layer used for edge board connectors
void SetDrillSize(const VECTOR2I &aSize)
PAD_DRILL_POST_MACHINING_MODE GetBackPostMachiningMode() const
int GetFrontPostMachiningAngle() const
PAD_DRILL_POST_MACHINING_MODE GetFrontPostMachiningMode() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
void SetSize(PCB_LAYER_ID aLayer, const VECTOR2I &aSize)
PAD_DRILL_SHAPE GetDrillShape() const
void SetSecondaryDrillShape(PAD_DRILL_SHAPE aShape)
void ReplacePrimitives(PCB_LAYER_ID aLayer, const std::vector< std::shared_ptr< PCB_SHAPE > > &aPrimitivesList)
Clear the current custom shape primitives list and import a new list.
int GetChamferPositions(PCB_LAYER_ID aLayer) const
static LSET ApertureMask()
layer set for an aperture pad
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
UNCONNECTED_LAYER_MODE GetUnconnectedLayerMode() const
std::mutex m_polyBuildingLock
void SetRoundRectCornerRadius(PCB_LAYER_ID aLayer, double aRadius)
Has meaning only for rounded rectangle pads.
void SetDrillSizeY(int aY)
static LSET SMDMask()
layer set for a SMD pad on Front layer
std::optional< int > GetLocalSolderPasteMargin() const
int GetFrontRoundRectRadiusSize() const
const std::shared_ptr< SHAPE_POLY_SET > & GetEffectivePolygon(PCB_LAYER_ID aLayer, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
int GetBackPostMachiningDepth() const
std::optional< int > GetLocalSolderMaskMargin() const
void SetDrillSizeX(int aX)
void SetLocalSolderPasteMargin(std::optional< int > aMargin)
std::optional< int > GetLocalThermalGapOverride() const
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void SetPinFunction(const wxString &aName)
Set the pad function (pin name in schematic)
EDA_ANGLE GetFPRelativeOrientation() const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void SetFPRelativeOrientation(const EDA_ANGLE &aAngle)
int GetPostMachiningKnockout(PCB_LAYER_ID aLayer) const
Get the knockout diameter for a layer affected by post-machining.
int GetBoundingRadius() const
Return the radius of a minimum sized circle which fully encloses this pad.
std::optional< int > GetTopBackdrillSize() const
void ClearZoneLayerOverrides()
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
std::mutex m_zoneLayerOverridesMutex
std::optional< int > GetLocalThermalSpokeWidthOverride() const
PAD_DRILL_SHAPE GetPrimaryDrillShape() const
bool IsBackdrilledOrPostMachined(PCB_LAYER_ID aLayer) const
Check if a layer is affected by backdrilling or post-machining operations.
VECTOR2I GetSolderPasteMargin(PCB_LAYER_ID aLayer) const
Usually < 0 (mask shape smaller than pad)because the margin can be dependent on the pad size,...
void SetTopBackdrillSize(std::optional< int > aSize)
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
void AppendPrimitives(PCB_LAYER_ID aLayer, const std::vector< std::shared_ptr< PCB_SHAPE > > &aPrimitivesList)
Import a custom shape primitive list (composed of basic shapes) and add items to the current list.
void SetPrimaryDrillStartLayer(PCB_LAYER_ID aLayer)
void SetBackPostMachiningDepth(int aDepth)
bool HasDrilledHole() const override
void SetPrimaryDrillCapped(const std::optional< bool > &aCapped)
LAYER_POLYGON_MAP m_effectivePolygons
PCB_LAYER_ID GetBottomBackdrillLayer() const
void SetLocalClearance(std::optional< int > aClearance)
int GetSubRatsnest() const
void SetSizeX(const int aX)
ZONE_CONNECTION GetLocalZoneConnection() const
void SetTertiaryDrillSizeY(int aY)
double GetThermalSpokeAngleDegrees() const
CUSTOM_SHAPE_ZONE_MODE GetCustomShapeInZoneOpt() const
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
void SetSecondaryDrillSizeY(int aY)
PCB_LAYER_ID GetTopBackdrillLayer() const
std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const override
Return a SHAPE_SEGMENT object representing the pad's hole.
void SetOrientationDegrees(double aOrientation)
ZONE_CONNECTION GetZoneConnectionOverrides(wxString *aSource=nullptr) const
int GetLocalThermalGapOverride(wxString *aSource) const
void SetLayerSet(const LSET &aLayers) override
bool SharesNetTieGroup(const PAD *aOther) const
PAD_SHAPE GetAnchorPadShape(PCB_LAYER_ID aLayer) const
void SetBottomBackdrillSize(std::optional< int > aSize)
void SetRoundRectRadiusRatio(PCB_LAYER_ID aLayer, double aRadiusScale)
Has meaning only for rounded rectangle pads.
void ClearSecondaryDrillSize()
void SetSubRatsnest(int aSubRatsnest)
int GetLocalSpokeWidthOverride(wxString *aSource=nullptr) const
bool TransformHoleToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Build the corner list of the polygonal drill shape in the board coordinate system.
void SetPadToDieLength(int aLength)
bool operator==(const PAD &aOther) const
void SetSizeY(const int aY)
int GetPadToDieLength() const
void SetBackPostMachiningAngle(int aAngle)
BOX2I m_effectiveBoundingBox
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
virtual std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
bool IsProxyItem() const override
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.
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void SetStroke(const STROKE_PARAMS &aStroke) override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
PROPERTY_BASE & SetChoicesFunc(std::function< wxPGChoices(INSPECTABLE *)> aFunc)
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
PROPERTY_BASE & SetWriteableFunc(std::function< bool(INSPECTABLE *)> aFunc)
PROPERTY_BASE & SetValidator(PROPERTY_VALIDATOR_FN &&aValidator)
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.
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
static VALIDATOR_RESULT PositiveIntValidator(const wxAny &&aValue, EDA_ITEM *aItem)
static VALIDATOR_RESULT RangeIntValidator(const wxAny &&aValue, EDA_ITEM *aItem)
static SEG::ecoord Square(int a)
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
void AddShape(SHAPE *aShape)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void Move(const VECTOR2I &aVector) override
int PointCount() const
Return the number of points (vertices) in this line chain.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
bool HasHoles() const
Return true if the polygon set has any holes.
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.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
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,...
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
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)
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
int OutlineCount() const
Return the number of outlines in the set.
void Move(const VECTOR2I &aVector) override
bool Contains(const VECTOR2I &aP, int aSubpolyIndex=-1, int aAccuracy=0, bool aUseBBoxCaches=false) const
Return true if a given subpolygon contains the point aP.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
const SHAPE_LINE_CHAIN Outline() const
bool Collide(const SHAPE *aShape, int aClearance, VECTOR2I *aMTV) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
An abstract shape on 2D plane.
Simple container to manage line stroke parameters.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString StringFromValue(double aValue, bool aAddUnitLabel=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
Converts aValue in internal units into a united string.
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aPosition, const VECTOR2I &aSize, const EDA_ANGLE &aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aInflate, int aError, ERROR_LOC aErrorLoc)
Convert a rectangle with rounded corners and/or chamfered corners to a polygon.
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.
void TransformTrapezoidToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aPosition, const VECTOR2I &aSize, const EDA_ANGLE &aRotation, int aDeltaX, int aDeltaY, int aInflate, int aError, ERROR_LOC aErrorLoc)
Convert a rectangle or trapezoid to a polygon.
@ RECT_CHAMFER_BOTTOM_RIGHT
@ RECT_CHAMFER_BOTTOM_LEFT
static PCB_SHAPE * findNext(PCB_SHAPE *aShape, const VECTOR2I &aPoint, const KDTree &kdTree, const PCB_SHAPE_ENDPOINTS_ADAPTOR &adaptor, double aChainingEpsilon)
@ ROUND_ALL_CORNERS
All angles are rounded.
@ ALLOW_ACUTE_CORNERS
just inflate the polygon. Acute angles create spikes
const int minSize
Push and Shove router track width and via size dialog.
@ DRCE_PAD_TH_WITH_NO_HOLE
@ HOLE_CLEARANCE_CONSTRAINT
@ SOLDER_PASTE_ABS_MARGIN_CONSTRAINT
@ SOLDER_MASK_EXPANSION_CONSTRAINT
@ SOLDER_PASTE_REL_MARGIN_CONSTRAINT
static constexpr EDA_ANGLE ANGLE_0
#define FOOTPRINT_EDIT_FRAME_NAME
#define PCB_EDIT_FRAME_NAME
#define IGNORE_PARENT_GROUP
#define ENTERED
indicates a group has been entered
#define SKIP_STRUCT
flag indicating that the structure should be ignored
@ FILLED_SHAPE
Fill with object color.
a few functions useful in geometry calculations.
Some functions to handle hotkeys in KiCad.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
@ LAYER_PAD_FR_NETNAMES
Additional netnames layers (not associated with a PCB layer).
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
@ NEVER_FLASHED
Never flashed for connectivity.
@ ALWAYS_FLASHED
Always flashed for connectivity.
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
@ LAYER_PAD_COPPER_START
Virtual layers for pad copper on a given copper layer.
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
@ LAYER_NON_PLATEDHOLES
Draw usual through hole vias.
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
@ LAYER_CLEARANCE_START
Virtual layers for pad/via/track clearance outlines for a given copper layer.
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
bool IsNetnameLayer(int aLayer)
Test whether a layer is a netname layer.
bool IsHoleLayer(int aLayer)
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
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)
Message panel definition file.
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
bool ShapeHitTest(const SHAPE_LINE_CHAIN &aHitter, const SHAPE &aHittee, bool aHitteeContained)
Perform a shape-to-shape hit test.
bool PadHasMeaningfulRoundingRadius(const PAD &aPad, PCB_LAYER_ID aLayer)
Returns true if the pad's rounding ratio is valid (i.e.
double GetDefaultIpcRoundingRatio(const PAD &aPad, PCB_LAYER_ID aLayer)
Get a sensible default for a rounded rectangle pad's rounding ratio.
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
std::optional< std::pair< ELECTRICAL_PINTYPE, bool > > parsePinType(const wxString &aPinTypeString)
static struct PAD_DESC _PAD_DESC
PAD_DRILL_SHAPE
The set of pad drill shapes, used with PAD::{Set,Get}DrillShape()
PAD_ATTRIB
The set of pad shapes, used with PAD::{Set,Get}Attribute().
@ 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.
@ CONN
Like smd, does not appear on the solder paste layer (default) Note: also has a special attribute in G...
PAD_SHAPE
The set of pad shapes, used with PAD::{Set,Get}Shape()
PAD_PROP
The set of pad properties used in Gerber files (Draw files, and P&P files) to define some properties ...
@ 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.
@ REMOVE_EXCEPT_START_AND_END
Class to handle a set of BOARD_ITEMs.
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
@ PT_INPUT
usual pin input: must be connected
@ PT_NC
not connected (must be left open)
@ PT_TRISTATE
tri state bus pin
@ PT_NIC
not internally connected (may be connected to anything)
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_OPENEMITTER
pin type open emitter
@ PT_POWER_OUT
output of a regulator: intended to be connected to power input pins
@ PT_OPENCOLLECTOR
pin type open collector
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
wxString GetCanonicalElectricalTypeName(ELECTRICAL_PINTYPE aType)
#define ELECTRICAL_PINTYPES_TOTAL
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
@ PT_DEGREE
Angle expressed in degrees.
@ PT_DECIDEGREE
Angle expressed in decidegrees.
@ PT_SIZE
Size expressed in distance units (mm/inch)
@ PT_TIME
Time expressed in ps.
wxString UnescapeString(const wxString &aSource)
! The properties of a padstack drill. Drill position is always the pad position (origin).
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
std::optional< PAD_DRILL_POST_MACHINING_MODE > mode
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.
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ 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_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
VECTOR2< int32_t > VECTOR2I
VECTOR2< int64_t > VECTOR2L
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
#define ZONE_THICKNESS_MIN_VALUE_MM