62#include <api/board/board_types.pb.h>
66#include <magic_enum.hpp>
152 *
this = *
static_cast<const PAD*
>( aOther );
157std::optional<std::pair<ELECTRICAL_PINTYPE, bool>>
parsePinType(
const wxString& aPinTypeString )
160 static std::map<wxString, ELECTRICAL_PINTYPE> map = {
175 bool hasNoConnect = aPinTypeString.EndsWith( wxT(
"+no_connect" ) );
177 if(
auto it = map.find( aPinTypeString.BeforeFirst(
'+' ) ); it != map.end() )
178 return std::make_pair( it->second, hasNoConnect );
187 using namespace kiapi::common::types;
190 pad.mutable_id()->set_value(
m_Uuid.AsStdString() );
192 pad.set_locked(
IsLocked() ? LockedState::LS_LOCKED
193 : LockedState::LS_UNLOCKED );
200 google::protobuf::Any padStackMsg;
202 padStackMsg.UnpackTo(
pad.mutable_pad_stack() );
212 pad.mutable_symbol_pin()->set_no_connect( pt->second );
215 aContainer.PackFrom(
pad );
221 kiapi::board::types::Pad
pad;
223 if( !aContainer.UnpackTo( &
pad ) )
229 SetLocked(
pad.locked() == kiapi::common::types::LockedState::LS_LOCKED );
235 google::protobuf::Any padStackWrapper;
236 padStackWrapper.PackFrom(
pad.pad_stack() );
241 if(
pad.has_copper_clearance_override() )
248 if(
pad.symbol_pin().type() != kiapi::common::types::EPT_UNKNOWN )
253 if(
pad.symbol_pin().no_connect() )
263 std::unique_lock<std::mutex> cacheLock(
m_dataMutex );
272 std::unique_lock<std::mutex> cacheLock(
m_dataMutex );
282 std::unique_lock<std::mutex> cacheLock(
m_dataMutex );
306 bool hasCopper =
false;
347 int thisNetTieGroup = padToNetTieGroupMap[
GetNumber() ];
348 int otherNetTieGroup = padToNetTieGroupMap[ aOther->
GetNumber() ];
350 return thisNetTieGroup >= 0 && thisNetTieGroup == otherNetTieGroup;
359 return m_pinType.Contains( wxT(
"no_connect" ) );
504 else if( aOnlyCheckIfPermitted )
514 return board->GetConnectivity()->IsConnectedOnLayer(
this, aLayer, nonZoneTypes );
603 int startOrdinal =
board->IsLayerEnabled( secondaryDrill.
start )
605 : secondaryDrill.
start / 2
607 int endOrdinal =
board->IsLayerEnabled( secondaryDrill.
end )
608 ?
board->IsLayerEnabled(
F_Cu ) ? ( secondaryDrill.
end ==
B_Cu ?
board->GetCopperLayerCount() - 1 : secondaryDrill.
end / 2 + 1 )
609 : secondaryDrill.
end / 2
611 int layerOrdinal =
board->IsLayerEnabled( aLayer )
612 ?
board->IsLayerEnabled(
F_Cu ) ? ( aLayer ==
F_Cu ? 0 : aLayer ==
B_Cu ?
board->GetCopperLayerCount() - 1 : aLayer / 2 + 1 )
616 if( layerOrdinal >= 0 && startOrdinal >= 0 && endOrdinal >= 0 )
618 if( startOrdinal > endOrdinal )
619 std::swap( startOrdinal, endOrdinal );
621 if( layerOrdinal >= startOrdinal && layerOrdinal <= endOrdinal )
632 int startOrdinal =
board->IsLayerEnabled( tertiaryDrill.
start )
634 : tertiaryDrill.
start / 2
636 int endOrdinal =
board->IsLayerEnabled( tertiaryDrill.
end )
637 ?
board->IsLayerEnabled(
F_Cu ) ? ( tertiaryDrill.
end ==
B_Cu ?
board->GetCopperLayerCount() - 1 : tertiaryDrill.
end / 2 + 1 )
638 : tertiaryDrill.
end / 2
640 int layerOrdinal =
board->IsLayerEnabled( aLayer )
641 ?
board->IsLayerEnabled(
F_Cu ) ? ( aLayer ==
F_Cu ? 0 : aLayer ==
B_Cu ?
board->GetCopperLayerCount() - 1 : aLayer / 2 + 1 )
645 if( layerOrdinal >= 0 && startOrdinal >= 0 && endOrdinal >= 0 )
647 if( startOrdinal > endOrdinal )
648 std::swap( startOrdinal, endOrdinal );
650 if( layerOrdinal >= startOrdinal && layerOrdinal <= endOrdinal )
681 int pmDepth = frontPM.
depth;
685 && frontPM.
angle > 0 )
687 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
688 pmDepth =
static_cast<int>( ( frontPM.
size / 2.0 ) / tan( halfAngleRad ) );
696 if( layerDist < pmDepth )
701 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
702 int diameterAtLayer = frontPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
703 return std::max( 0, diameterAtLayer );
720 int pmDepth = backPM.
depth;
724 && backPM.
angle > 0 )
726 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
727 pmDepth =
static_cast<int>( ( backPM.
size / 2.0 ) / tan( halfAngleRad ) );
735 if( layerDist < pmDepth )
740 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
741 int diameterAtLayer = backPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
742 return std::max( 0, diameterAtLayer );
899 m_padStack.SetRoundRectRadius( aRadius, aLayer );
905 m_padStack.SetRoundRectRadiusRatio( std::clamp( aRadiusScale, 0.0, 0.5 ), aLayer );
914 "Set front radius only meaningful for normal padstacks" );
916 m_padStack.SetRoundRectRadiusRatio( std::clamp( aRadiusScale, 0.0, 0.5 ),
F_Cu );
924 const int minSize = std::min( size.
x, size.
y );
925 const double newRatio = aRadius / double(
minSize );
934 const int minSize = std::min( size.
x, size.
y );
943 m_padStack.SetChamferRatio( aChamferScale, aLayer );
965 std::shared_ptr<SHAPE_COMPOUND> effective_compund = std::make_shared<SHAPE_COMPOUND>();
970 return effective_compund;
974 effective_compund->AddShape( std::make_shared<SHAPE_NULL>() );
975 return effective_compund;
982 std::shared_ptr<SHAPE_COMPOUND> effective_compound = std::make_shared<SHAPE_COMPOUND>();
993 holeSize = std::max( holeSize, frontPM.
size );
999 holeSize = std::max( holeSize, backPM.
size );
1005 holeSize = std::max( holeSize, secDrill.
size.
x );
1009 effective_compound->AddShape(
1010 std::make_shared<SHAPE_CIRCLE>(
GetPosition(), holeSize / 2 ) );
1017 return effective_compound;
1023 std::shared_ptr<SHAPE_COMPOUND> effective_compund = std::make_shared<SHAPE_COMPOUND>();
1037 return effective_compund;
1041 effective_compund->AddShape( std::make_shared<SHAPE_NULL>() );
1042 return effective_compund;
1053 wxString::Format( wxT(
"Missing shape in PAD::GetEffectiveShape for layer %s." ),
1054 magic_enum::enum_name( aLayer ) ) );
1056 wxString::Format( wxT(
"Null shape in PAD::GetEffectiveShape for layer %s." ),
1057 magic_enum::enum_name( aLayer ) ) );
1083 std::lock_guard<std::mutex> RAII_lock(
m_dataMutex );
1108 half_width = half_size.
x;
1112 half_width = std::min( half_size.
x, half_size.
y );
1113 half_len =
VECTOR2I( half_size.
x - half_width, half_size.
y - half_width );
1131 auto add = [
this, aLayer](
SHAPE* aShape )
1143 switch( effectiveShape )
1150 if( size.
x == size.
y )
1157 int half_width = std::min( half_size.
x, half_size.
y );
1158 VECTOR2I half_len( half_size.
x - half_width, half_size.
y - half_width );
1160 add(
new SHAPE_SEGMENT( shapePos - half_len, shapePos + half_len, half_width * 2 ) );
1170 VECTOR2I half_size( size.
x / 2, size.
y / 2 );
1179 const int min_len =
pcbIUScale.mmToIU( 0.0001 );
1181 if( half_size.
x < min_len && half_size.
y < min_len )
1189 trap_delta =
m_padStack.TrapezoidDeltaSize( aLayer ) / 2;
1194 corners.
Append( -half_size.
x - trap_delta.
y, half_size.
y + trap_delta.
x );
1195 corners.
Append( half_size.
x + trap_delta.
y, half_size.
y - trap_delta.
x );
1196 corners.
Append( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
1197 corners.
Append( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
1200 corners.
Move( shapePos );
1255 wxFAIL_MSG( wxT(
"PAD::buildEffectiveShapes: Unsupported pad shape: PAD_SHAPE::" )
1256 + wxString( std::string( magic_enum::enum_name( effectiveShape ) ) ) );
1262 for(
const std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
1264 if( !primitive->IsProxyItem() )
1266 for(
SHAPE* shape : primitive->MakeEffectiveShapes() )
1269 shape->Move( shapePos );
1282 std::lock_guard<std::mutex> RAII_lock(
m_dataMutex );
1296 std::shared_ptr<SHAPE_POLY_SET>& effectivePolygon =
m_effectivePolygons[ aLayer ][ aErrorLoc ];
1298 effectivePolygon = std::make_shared<SHAPE_POLY_SET>();
1302 if( doBoundingRadius )
1309 std::shared_ptr<SHAPE_POLY_SET>& effectivePolygon =
m_effectivePolygons[ aLayer ][ aErrorLoc ];
1311 for(
int cnt = 0; cnt < effectivePolygon->OutlineCount(); ++cnt )
1315 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
1356 switch( aAttribute )
1369 if( copperLayers.count() > 1 )
1371 layerMask &=
~LSET::AllCuMask();
1373 if( copperLayers.test(
B_Cu ) )
1376 layerMask.
set( copperLayers.
Seq().front() );
1411 if( !wasRoundable && isRoundable )
1467 auto mirrorBitFlags = [](
int& aBitfield,
int a,
int b )
1469 bool temp = aBitfield & a;
1523 for( std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
1527 primitive->SetParent(
this);
1528 primitive->Flip(
VECTOR2I( 0, 0 ), aFlipDirection );
1540 if( loc_offset.
x == 0 && loc_offset.
y == 0 )
1557 bool hasAnnularRing =
true;
1568 hasAnnularRing =
false;
1578 hasAnnularRing =
false;
1590 if( !hasAnnularRing )
1600 if(
m_padStack.Clearance().has_value() && aSource )
1601 *aSource =
_(
"pad" );
1613 return parentFootprint->GetClearanceOverrides( aSource );
1615 return std::optional<int>();
1654 std::optional<int> margin;
1668 margin =
m_padStack.SolderMaskMargin( aLayer );
1670 if( !margin.has_value() )
1673 margin = parentFootprint->GetLocalSolderMaskMargin();
1677 int marginValue = margin.value_or( 0 );
1682 if( marginValue < 0 )
1686 if( marginValue < minsize )
1687 marginValue = minsize;
1709 std::optional<int> margin;
1710 std::optional<double> mratio;
1729 margin =
m_padStack.SolderPasteMargin( aLayer );
1730 mratio =
m_padStack.SolderPasteMarginRatio( aLayer );
1732 if( !margin.has_value() )
1735 margin = parentFootprint->GetLocalSolderPasteMargin();
1738 if( !mratio.has_value() )
1741 mratio = parentFootprint->GetLocalSolderPasteMarginRatio();
1749 pad_margin.
x = margin.value_or( 0 ) +
KiROUND( padSize.
x * mratio.value_or( 0 ) );
1750 pad_margin.
y = margin.value_or( 0 ) +
KiROUND( padSize.
y * mratio.value_or( 0 ) );
1755 if( pad_margin.
x < -padSize.
x / 2 )
1756 pad_margin.
x = -padSize.
x / 2;
1758 if( pad_margin.
y < -padSize.
y / 2 )
1759 pad_margin.
y = -padSize.
y / 2;
1773 *aSource =
_(
"pad" );
1779 connection = parentFootprint->GetZoneConnectionOverrides( aSource );
1788 if(
m_padStack.ThermalSpokeWidth().has_value() && aSource )
1789 *aSource =
_(
"pad" );
1791 return m_padStack.ThermalSpokeWidth().value_or( 0 );
1797 if(
m_padStack.ThermalGap().has_value() && aSource )
1798 *aSource =
_(
"pad" );
1811 if( parentFootprint )
1812 aList.emplace_back(
_(
"Footprint" ), parentFootprint->
GetReference() );
1815 aList.emplace_back(
_(
"Pad" ),
m_number );
1821 aList.emplace_back(
_(
"Pin Type" ),
GetPinType() );
1827 aList.emplace_back(
_(
"Resolved Netclass" ),
1831 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
1843 double area = poly->Area();
1875 && padSize.
x == padSize.
y )
1889 if( !fp_orient.
IsZero() )
1894 aList.emplace_back(
_(
"Rotation" ), msg );
1898 aList.emplace_back(
_(
"Length in Package" ),
1904 if( drill.
x > 0 || drill.
y > 0 )
1908 aList.emplace_back(
_(
"Hole" ),
1909 wxString::Format( wxT(
"%s" ),
1914 aList.emplace_back(
_(
"Hole X / Y" ),
1915 wxString::Format( wxT(
"%s / %s" ),
1924 if( !source.IsEmpty() )
1926 aList.emplace_back( wxString::Format(
_(
"Min Clearance: %s" ),
1928 wxString::Format(
_(
"(from %s)" ),
1933 aList.emplace_back( wxT(
"UUID" ),
m_Uuid.AsString() );
1963 bool contains =
false;
1983 BOX2I arect = aRect;
2010 int count = poly->TotalVertices();
2012 for(
int ii = 0; ii < count; ii++ )
2014 VECTOR2I vertex = poly->CVertex( ii );
2015 VECTOR2I vertexNext = poly->CVertex( ( ii + 1 ) % count );
2066 if( ( diff =
static_cast<int>( aPadRef->
m_attribute ) -
static_cast<int>( aPadCmp->
m_attribute ) ) != 0 )
2093 default:
return wxT(
"???" );
2115 default:
return wxT(
"???" );
2128 default:
return wxT(
"???" );
2144 return wxString::Format(
_(
"NPTH pad of %s" ), parentFP->
GetReference() );
2146 return _(
"NPTH pad" );
2154 return wxString::Format(
_(
"Pad %s of %s on %s" ),
2161 return wxString::Format(
_(
"Pad on %s" ),
2169 return wxString::Format(
_(
"PTH pad %s of %s" ),
2175 return _(
"PTH pad" );
2185 return wxString::Format(
_(
"Pad %s %s of %s on %s" ),
2193 return wxString::Format(
_(
"Pad %s on %s" ),
2202 return wxString::Format(
_(
"PTH pad %s %s of %s" ),
2209 return wxString::Format(
_(
"PTH pad %s" ),
2225 PAD* cloned =
new PAD( *
this );
2232 primitive->SetParent( cloned );
2241 std::vector<int> layers;
2242 layers.reserve( 64 );
2262 cuLayers &=
board->GetEnabledLayers();
2264 if( cuLayers.count() > 1 )
2308 layers.push_back( each_layer );
2336 LSET visiblePhysical =
board->GetVisibleLayers();
2337 visiblePhysical &=
board->GetEnabledLayers();
2340 if( !visiblePhysical.any() )
2353 LSET visible =
board->GetVisibleLayers();
2354 visible &=
board->GetEnabledLayers();
2368 int64_t minSide = std::min( padSize.
x, padSize.
y );
2380 int solderMaskMargin = 0;
2388 solderPasteMargin.
x = std::max( solderPasteMargin.
x, layerMargin.
x );
2389 solderPasteMargin.
y = std::max( solderPasteMargin.
y, layerMargin.
y );
2398 if( cfg && cfg->m_Display.m_PadClearance &&
GetBoard() )
2403 int xMargin = std::max( solderMaskMargin, solderPasteMargin.
x ) +
clearance;
2404 int yMargin = std::max( solderMaskMargin, solderPasteMargin.
y ) +
clearance;
2487 std::swap( *
this, *
static_cast<PAD*
>( aImage ) );
2496 if( !drillsize.
x || !drillsize.
y )
2502 aError, aErrorLoc );
2509 int aMaxError,
ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
2512 wxT(
"UNDEFINED_LAYER is no longer allowed for PAD::TransformShapeToPolygon" ) );
2517 const int pad_min_seg_per_circle_count = 16;
2532 pad_min_seg_per_circle_count );
2536 int half_width = std::min( dx, dy );
2542 ( half_width + aClearance ) * 2, aMaxError, aErrorLoc,
2543 pad_min_seg_per_circle_count );
2557 ddx, ddy, aClearance, aMaxError, aErrorLoc );
2558 aBuffer.
Append( outline );
2572 aClearance, aMaxError, aErrorLoc );
2573 aBuffer.
Append( outline );
2587 aClearance += aMaxError;
2592 else if( aClearance < 0 )
2602 aBuffer.
Append( outline );
2607 wxFAIL_MSG( wxT(
"PAD::TransformShapeToPolygon no implementation for " )
2608 + wxString( std::string( magic_enum::enum_name( shape ) ) ) );
2652 [&](
PCB_SHAPE* aShape ) -> std::vector<PCB_SHAPE*>
2654 std::vector<PCB_SHAPE*> matching;
2664 matching.push_back( other );
2671 std::vector<PCB_SHAPE*> mergedShapes;
2698 int minExtent = std::min(
GetSize( layer ).x,
GetSize( layer ).y );
2717 mergedShapes.push_back( fpShape );
2725 group->RemoveItem( fpShape );
2743 for(
PCB_SHAPE* other : findMatching( fpShape ) )
2746 mergedShapes.push_back( other );
2756 return mergedShapes;
2761 const std::function<
void(
int aErrorCode,
const wxString& aMsg )>& aErrorHandler )
const
2766 doCheckPad( aLayer, aUnitsProvider, aForPadProperties, aErrorHandler );
2772 if( !padlayers_mask[
F_Cu] && !padlayers_mask[
B_Cu] )
2776 aErrorHandler(
DRCE_PADSTACK,
_(
"(plated through holes normally have a copper pad on "
2777 "at least one outer layer)" ) );
2784 aErrorHandler(
DRCE_PADSTACK,
_(
"('fiducial' pads are normally plated)" ) );
2788 aErrorHandler(
DRCE_PADSTACK,
_(
"('testpoint' pads are normally plated)" ) );
2791 aErrorHandler(
DRCE_PADSTACK,
_(
"('heatsink' pads are normally plated)" ) );
2794 aErrorHandler(
DRCE_PADSTACK,
_(
"('castellated' pads are normally PTH)" ) );
2797 aErrorHandler(
DRCE_PADSTACK,
_(
"('BGA' property is for SMD pads)" ) );
2800 aErrorHandler(
DRCE_PADSTACK,
_(
"('mechanical' pads are normally PTH)" ) );
2805 aErrorHandler(
DRCE_PADSTACK,
_(
"('press-fit' pads are normally PTH with round holes)" ) );
2812 if( drill_size.
x <= 0
2822 aErrorHandler(
DRCE_PADSTACK,
_(
"(connector pads normally have no solder paste; use a "
2823 "SMD pad instead)" ) );
2829 if( drill_size.
x > 0 || drill_size.
y > 0 )
2836 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper on both sides of the board)" ) );
2842 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and mask layers on different "
2843 "sides of the board)" ) );
2847 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and paste layers on different "
2848 "sides of the board)" ) );
2855 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and mask layers on different "
2856 "sides of the board)" ) );
2860 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and paste layers on different "
2861 "sides of the board)" ) );
2864 else if( innerlayers_mask.count() != 0 )
2866 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has no outer layers)" ) );
2876 const std::function<
void(
int aErrorCode,
const wxString& aMsg )>& aErrorHandler )
const
2892 const int min_drill_size = 4;
2896 msg.Printf(
_(
"(PTH pad hole size must be larger than %s)" ),
2919 aErrorHandler(
DRCE_PADSTACK,
_(
"(PTH pad hole leaves no copper)" ) );
2921 else if( aForPadProperties )
2929 aErrorHandler(
DRCE_PADSTACK,
_(
"(PTH pad hole not fully inside copper)" ) );
2936 aErrorHandler(
DRCE_PADSTACK,
_(
"(pad hole not inside pad shape)" ) );
2941 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative local clearance values have no effect)" ) );
2948 if( solderMaskMargin.has_value() && solderMaskMargin.value() < 0 )
2950 int absMargin = abs( solderMaskMargin.value() );
2954 for(
const std::shared_ptr<PCB_SHAPE>& shape :
GetPrimitives( aLayer ) )
2956 BOX2I shapeBBox = shape->GetBoundingBox();
2960 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder mask clearance is larger "
2961 "than some shape primitives; results may be "
2968 else if( absMargin > pad_size.
x || absMargin > pad_size.
y )
2970 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder mask clearance is larger than pad; "
2971 "no solder mask will be generated)" ) );
2984 paste_size.x = pad_size.
x + paste_margin +
KiROUND( pad_size.
x * mratio.value_or( 0 ) );
2985 paste_size.y = pad_size.
y + paste_margin +
KiROUND( pad_size.
y * mratio.value_or( 0 ) );
2987 if( paste_size.x <= 0 || paste_size.y <= 0 )
2989 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder paste margin is larger than pad; "
2990 "no solder paste mask will be generated)" ) );
2998 aErrorHandler(
DRCE_PADSTACK,
_(
"(corner size will make pad circular)" ) );
3037 const PAD& other =
static_cast<const PAD&
>( aBoardItem );
3039 return *
this == other;
3066 const PAD& other =
static_cast<const PAD&
>( aOther );
3068 double similarity = 1.0;
3087 poly_no_hole.
Append( aPoly );
3094 for(
int ii = 0; ii < poly_no_hole.
OutlineCount(); ++ii )
3129 if( aPrimitivesList.size() )
3139 for(
const std::shared_ptr<PCB_SHAPE>& prim : aPrimitivesList )
3149 m_padStack.AddPrimitive( aPrimitive, aLayer );
3187 SHAPE_RECT rect( -padSize.
x / 2, -padSize.
y / 2, padSize.
x, padSize.
y );
3200 for(
const std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
3202 if( !primitive->IsProxyItem() )
3257 if( pmMap.
Choices().GetCount() == 0 )
3270 if( bdMap.
Choices().GetCount() == 0 )
3282 if( zcMap.
Choices().GetCount() == 0 )
3314 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3320 auto padCanHaveHole =
3323 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3329 auto hasNormalPadstack =
3332 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3343 const wxString groupPad =
_HKI(
"Pad Properties" );
3344 const wxString groupPostMachining =
_HKI(
"Post-machining Properties" );
3345 const wxString groupBackdrill =
_HKI(
"Backdrill Properties" );
3371 wxPGChoices choices;
3388 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3401 const auto hasRoundRadius =
3404 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3444 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3452 groupPostMachining )
3455 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3465 groupPostMachining )
3468 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3473 auto mode =
pad->GetFrontPostMachining();
3483 groupPostMachining )
3486 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3491 auto mode =
pad->GetFrontPostMachining();
3500 groupPostMachining )
3503 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3508 auto mode =
pad->GetFrontPostMachining();
3517 groupPostMachining )
3520 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3530 groupPostMachining )
3533 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3538 auto mode =
pad->GetBackPostMachining();
3548 groupPostMachining )
3551 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3556 auto mode =
pad->GetBackPostMachining();
3565 groupPostMachining )
3568 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3573 auto mode =
pad->GetBackPostMachining();
3588 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3593 auto mode =
pad->GetBackdrillMode();
3605 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3610 auto mode =
pad->GetBackdrillMode();
3622 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3627 auto mode =
pad->GetBackdrillMode();
3639 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3644 auto mode =
pad->GetBackdrillMode();
3670 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 ...
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
const wxString & GetShortNetname() const
virtual int GetOwnClearance(PCB_LAYER_ID aLayer, wxString *aSource=nullptr) const
Return an item's "own" clearance in internal units.
void UnpackNet(const kiapi::board::types::Net &aProto)
Assigns a net to this item from an API message.
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 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
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
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
bool IsNPTHWithNoCopper() 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
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::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)
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
void Fracture(bool aSimplify=true)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
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
@ 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 ROUTER_TRANSIENT
transient items that should NOT be cached
#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