59#include <api/board/board_types.pb.h>
63#include <magic_enum.hpp>
151 *
this = *
static_cast<const PAD*
>( aOther );
156std::optional<std::pair<ELECTRICAL_PINTYPE, bool>>
parsePinType(
const wxString& aPinTypeString )
159 static std::map<wxString, ELECTRICAL_PINTYPE> map = {
174 bool hasNoConnect = aPinTypeString.EndsWith( wxT(
"+no_connect" ) );
176 if(
auto it = map.find( aPinTypeString.BeforeFirst(
'+' ) ); it != map.end() )
177 return std::make_pair( it->second, hasNoConnect );
186 using namespace kiapi::common::types;
189 pad.mutable_id()->set_value(
m_Uuid.AsStdString() );
191 pad.set_locked(
IsLocked() ? LockedState::LS_LOCKED
192 : LockedState::LS_UNLOCKED );
199 google::protobuf::Any padStackMsg;
201 padStackMsg.UnpackTo(
pad.mutable_pad_stack() );
211 pad.mutable_symbol_pin()->set_no_connect( pt->second );
214 aContainer.PackFrom(
pad );
220 kiapi::board::types::Pad
pad;
222 if( !aContainer.UnpackTo( &
pad ) )
228 SetLocked(
pad.locked() == kiapi::common::types::LockedState::LS_LOCKED );
234 google::protobuf::Any padStackWrapper;
235 padStackWrapper.PackFrom(
pad.pad_stack() );
240 if(
pad.has_copper_clearance_override() )
247 if(
pad.symbol_pin().type() != kiapi::common::types::EPT_UNKNOWN )
252 if(
pad.symbol_pin().no_connect() )
316 int thisNetTieGroup = padToNetTieGroupMap[
GetNumber() ];
317 int otherNetTieGroup = padToNetTieGroupMap[ aOther->
GetNumber() ];
319 return thisNetTieGroup >= 0 && thisNetTieGroup == otherNetTieGroup;
328 return m_pinType.Contains( wxT(
"no_connect" ) );
474 else if( aOnlyCheckIfPermitted )
484 return board->GetConnectivity()->IsConnectedOnLayer(
this, aLayer, nonZoneTypes );
573 int startOrdinal =
board->IsLayerEnabled( secondaryDrill.
start )
575 : secondaryDrill.
start / 2
577 int endOrdinal =
board->IsLayerEnabled( secondaryDrill.
end )
578 ?
board->IsLayerEnabled(
F_Cu ) ? ( secondaryDrill.
end ==
B_Cu ?
board->GetCopperLayerCount() - 1 : secondaryDrill.
end / 2 + 1 )
579 : secondaryDrill.
end / 2
581 int layerOrdinal =
board->IsLayerEnabled( aLayer )
582 ?
board->IsLayerEnabled(
F_Cu ) ? ( aLayer ==
F_Cu ? 0 : aLayer ==
B_Cu ?
board->GetCopperLayerCount() - 1 : aLayer / 2 + 1 )
586 if( layerOrdinal >= 0 && startOrdinal >= 0 && endOrdinal >= 0 )
588 if( startOrdinal > endOrdinal )
589 std::swap( startOrdinal, endOrdinal );
591 if( layerOrdinal >= startOrdinal && layerOrdinal <= endOrdinal )
602 int startOrdinal =
board->IsLayerEnabled( tertiaryDrill.
start )
604 : tertiaryDrill.
start / 2
606 int endOrdinal =
board->IsLayerEnabled( tertiaryDrill.
end )
607 ?
board->IsLayerEnabled(
F_Cu ) ? ( tertiaryDrill.
end ==
B_Cu ?
board->GetCopperLayerCount() - 1 : tertiaryDrill.
end / 2 + 1 )
608 : tertiaryDrill.
end / 2
610 int layerOrdinal =
board->IsLayerEnabled( aLayer )
611 ?
board->IsLayerEnabled(
F_Cu ) ? ( aLayer ==
F_Cu ? 0 : aLayer ==
B_Cu ?
board->GetCopperLayerCount() - 1 : aLayer / 2 + 1 )
615 if( layerOrdinal >= 0 && startOrdinal >= 0 && endOrdinal >= 0 )
617 if( startOrdinal > endOrdinal )
618 std::swap( startOrdinal, endOrdinal );
620 if( layerOrdinal >= startOrdinal && layerOrdinal <= endOrdinal )
651 int pmDepth = frontPM.
depth;
655 && frontPM.
angle > 0 )
657 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
658 pmDepth =
static_cast<int>( ( frontPM.
size / 2.0 ) / tan( halfAngleRad ) );
666 if( layerDist < pmDepth )
671 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
672 int diameterAtLayer = frontPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
673 return std::max( 0, diameterAtLayer );
690 int pmDepth = backPM.
depth;
694 && backPM.
angle > 0 )
696 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
697 pmDepth =
static_cast<int>( ( backPM.
size / 2.0 ) / tan( halfAngleRad ) );
705 if( layerDist < pmDepth )
710 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
711 int diameterAtLayer = backPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
712 return std::max( 0, diameterAtLayer );
869 m_padStack.SetRoundRectRadius( aRadius, aLayer );
875 m_padStack.SetRoundRectRadiusRatio( std::clamp( aRadiusScale, 0.0, 0.5 ), aLayer );
884 "Set front radius only meaningful for normal padstacks" );
886 m_padStack.SetRoundRectRadiusRatio( std::clamp( aRadiusScale, 0.0, 0.5 ),
F_Cu );
894 const int minSize = std::min( size.
x, size.
y );
895 const double newRatio = aRadius / double(
minSize );
904 const int minSize = std::min( size.
x, size.
y );
913 m_padStack.SetChamferRatio( aChamferScale, aLayer );
935 std::shared_ptr<SHAPE_COMPOUND> effective_compund = std::make_shared<SHAPE_COMPOUND>();
940 return effective_compund;
944 effective_compund->AddShape( std::make_shared<SHAPE_NULL>() );
945 return effective_compund;
952 std::shared_ptr<SHAPE_COMPOUND> effective_compound = std::make_shared<SHAPE_COMPOUND>();
963 holeSize = std::max( holeSize, frontPM.
size );
969 holeSize = std::max( holeSize, backPM.
size );
975 holeSize = std::max( holeSize, secDrill.
size.
x );
979 effective_compound->AddShape(
980 std::make_shared<SHAPE_CIRCLE>(
GetPosition(), holeSize / 2 ) );
987 return effective_compound;
993 std::shared_ptr<SHAPE_COMPOUND> effective_compund = std::make_shared<SHAPE_COMPOUND>();
1007 return effective_compund;
1011 effective_compund->AddShape( std::make_shared<SHAPE_NULL>() );
1012 return effective_compund;
1023 wxString::Format( wxT(
"Missing shape in PAD::GetEffectiveShape for layer %s." ),
1024 magic_enum::enum_name( aLayer ) ) );
1026 wxString::Format( wxT(
"Null shape in PAD::GetEffectiveShape for layer %s." ),
1027 magic_enum::enum_name( aLayer ) ) );
1078 half_width = half_size.
x;
1082 half_width = std::min( half_size.
x, half_size.
y );
1083 half_len =
VECTOR2I( half_size.
x - half_width, half_size.
y - half_width );
1101 auto add = [
this, aLayer](
SHAPE* aShape )
1113 switch( effectiveShape )
1120 if( size.
x == size.
y )
1127 int half_width = std::min( half_size.
x, half_size.
y );
1128 VECTOR2I half_len( half_size.
x - half_width, half_size.
y - half_width );
1130 add(
new SHAPE_SEGMENT( shapePos - half_len, shapePos + half_len, half_width * 2 ) );
1140 VECTOR2I half_size( size.
x / 2, size.
y / 2 );
1149 const int min_len =
pcbIUScale.mmToIU( 0.0001 );
1151 if( half_size.
x < min_len && half_size.
y < min_len )
1159 trap_delta =
m_padStack.TrapezoidDeltaSize( aLayer ) / 2;
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 );
1166 corners.
Append( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
1167 corners.
Append( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
1170 corners.
Move( shapePos );
1225 wxFAIL_MSG( wxT(
"PAD::buildEffectiveShapes: Unsupported pad shape: PAD_SHAPE::" )
1226 + wxString( std::string( magic_enum::enum_name( effectiveShape ) ) ) );
1232 for(
const std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
1234 if( !primitive->IsProxyItem() )
1236 for(
SHAPE* shape : primitive->MakeEffectiveShapes() )
1239 shape->Move( shapePos );
1266 std::shared_ptr<SHAPE_POLY_SET>& effectivePolygon =
m_effectivePolygons[ aLayer ][ aErrorLoc ];
1268 effectivePolygon = std::make_shared<SHAPE_POLY_SET>();
1272 if( doBoundingRadius )
1279 std::shared_ptr<SHAPE_POLY_SET>& effectivePolygon =
m_effectivePolygons[ aLayer ][ aErrorLoc ];
1281 for(
int cnt = 0; cnt < effectivePolygon->OutlineCount(); ++cnt )
1285 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
1326 switch( aAttribute )
1339 if( copperLayers.count() > 1 )
1341 layerMask &=
~LSET::AllCuMask();
1343 if( copperLayers.test(
B_Cu ) )
1346 layerMask.
set( copperLayers.
Seq().front() );
1375 if( !wasRoundable && isRoundable )
1431 auto mirrorBitFlags = [](
int& aBitfield,
int a,
int b )
1433 bool temp = aBitfield & a;
1490 for( std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
1494 primitive->SetParent(
this);
1495 primitive->Flip(
VECTOR2I( 0, 0 ), aFlipDirection );
1507 if( loc_offset.
x == 0 && loc_offset.
y == 0 )
1524 bool hasAnnularRing =
true;
1535 hasAnnularRing =
false;
1545 hasAnnularRing =
false;
1557 if( !hasAnnularRing )
1567 if(
m_padStack.Clearance().has_value() && aSource )
1568 *aSource =
_(
"pad" );
1580 return parentFootprint->GetClearanceOverrides( aSource );
1582 return std::optional<int>();
1627 std::optional<int> margin;
1641 margin =
m_padStack.SolderMaskMargin( aLayer );
1643 if( !margin.has_value() )
1646 margin = parentFootprint->GetLocalSolderMaskMargin();
1650 int marginValue = margin.value_or( 0 );
1655 if( marginValue < 0 )
1659 if( marginValue < minsize )
1660 marginValue = minsize;
1682 std::optional<int> margin;
1683 std::optional<double> mratio;
1702 margin =
m_padStack.SolderPasteMargin( aLayer );
1703 mratio =
m_padStack.SolderPasteMarginRatio( aLayer );
1705 if( !margin.has_value() )
1708 margin = parentFootprint->GetLocalSolderPasteMargin();
1711 if( !mratio.has_value() )
1714 mratio = parentFootprint->GetLocalSolderPasteMarginRatio();
1722 pad_margin.
x = margin.value_or( 0 ) +
KiROUND( padSize.
x * mratio.value_or( 0 ) );
1723 pad_margin.
y = margin.value_or( 0 ) +
KiROUND( padSize.
y * mratio.value_or( 0 ) );
1728 if( pad_margin.
x < -padSize.
x / 2 )
1729 pad_margin.
x = -padSize.
x / 2;
1731 if( pad_margin.
y < -padSize.
y / 2 )
1732 pad_margin.
y = -padSize.
y / 2;
1746 *aSource =
_(
"pad" );
1752 connection = parentFootprint->GetZoneConnectionOverrides( aSource );
1761 if(
m_padStack.ThermalSpokeWidth().has_value() && aSource )
1762 *aSource =
_(
"pad" );
1764 return m_padStack.ThermalSpokeWidth().value_or( 0 );
1770 if(
m_padStack.ThermalGap().has_value() && aSource )
1771 *aSource =
_(
"pad" );
1784 if( parentFootprint )
1785 aList.emplace_back(
_(
"Footprint" ), parentFootprint->
GetReference() );
1788 aList.emplace_back(
_(
"Pad" ),
m_number );
1794 aList.emplace_back(
_(
"Pin Type" ),
GetPinType() );
1800 aList.emplace_back(
_(
"Resolved Netclass" ),
1804 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
1816 double area = poly->Area();
1848 && padSize.
x == padSize.
y )
1862 if( !fp_orient.
IsZero() )
1867 aList.emplace_back(
_(
"Rotation" ), msg );
1871 aList.emplace_back(
_(
"Length in Package" ),
1877 if( drill.
x > 0 || drill.
y > 0 )
1881 aList.emplace_back(
_(
"Hole" ),
1882 wxString::Format( wxT(
"%s" ),
1887 aList.emplace_back(
_(
"Hole X / Y" ),
1888 wxString::Format( wxT(
"%s / %s" ),
1897 if( !source.IsEmpty() )
1899 aList.emplace_back( wxString::Format(
_(
"Min Clearance: %s" ),
1901 wxString::Format(
_(
"(from %s)" ),
1906 aList.emplace_back( wxT(
"UUID" ),
m_Uuid.AsString() );
1936 bool contains =
false;
1956 BOX2I arect = aRect;
1983 int count = poly->TotalVertices();
1985 for(
int ii = 0; ii < count; ii++ )
1987 VECTOR2I vertex = poly->CVertex( ii );
1988 VECTOR2I vertexNext = poly->CVertex( ( ii + 1 ) % count );
2039 if( ( diff =
static_cast<int>( aPadRef->
m_attribute ) -
static_cast<int>( aPadCmp->
m_attribute ) ) != 0 )
2066 default:
return wxT(
"???" );
2088 default:
return wxT(
"???" );
2101 default:
return wxT(
"???" );
2117 return wxString::Format(
_(
"NPTH pad of %s" ), parentFP->
GetReference() );
2119 return _(
"NPTH pad" );
2127 return wxString::Format(
_(
"Pad %s of %s on %s" ),
2134 return wxString::Format(
_(
"Pad on %s" ),
2142 return wxString::Format(
_(
"PTH pad %s of %s" ),
2148 return _(
"PTH pad" );
2158 return wxString::Format(
_(
"Pad %s %s of %s on %s" ),
2166 return wxString::Format(
_(
"Pad %s on %s" ),
2175 return wxString::Format(
_(
"PTH pad %s %s of %s" ),
2182 return wxString::Format(
_(
"PTH pad %s" ),
2198 PAD* cloned =
new PAD( *
this );
2205 primitive->SetParent( cloned );
2214 std::vector<int> layers;
2215 layers.reserve( 64 );
2235 cuLayers &=
board->GetEnabledLayers();
2237 if( cuLayers.count() > 1 )
2281 layers.push_back( each_layer );
2309 LSET visiblePhysical =
board->GetVisibleLayers();
2310 visiblePhysical &=
board->GetEnabledLayers();
2313 if( !visiblePhysical.any() )
2326 LSET visible =
board->GetVisibleLayers();
2327 visible &=
board->GetEnabledLayers();
2341 int64_t minSide = std::min( padSize.
x, padSize.
y );
2353 int solderMaskMargin = 0;
2361 solderPasteMargin.
x = std::max( solderPasteMargin.
x, layerMargin.
x );
2362 solderPasteMargin.
y = std::max( solderPasteMargin.
y, layerMargin.
y );
2371 if( cfg && cfg->m_Display.m_PadClearance &&
GetBoard() )
2376 int xMargin = std::max( solderMaskMargin, solderPasteMargin.
x ) +
clearance;
2377 int yMargin = std::max( solderMaskMargin, solderPasteMargin.
y ) +
clearance;
2460 std::swap( *
this, *
static_cast<PAD*
>( aImage ) );
2469 if( !drillsize.
x || !drillsize.
y )
2475 aError, aErrorLoc );
2482 int aMaxError,
ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
2484 wxASSERT_MSG( !ignoreLineWidth, wxT(
"IgnoreLineWidth has no meaning for pads." ) );
2486 wxT(
"UNDEFINED_LAYER is no longer allowed for PAD::TransformShapeToPolygon" ) );
2491 const int pad_min_seg_per_circle_count = 16;
2506 pad_min_seg_per_circle_count );
2510 int half_width = std::min( dx, dy );
2516 ( half_width + aClearance ) * 2, aMaxError, aErrorLoc,
2517 pad_min_seg_per_circle_count );
2531 ddx, ddy, aClearance, aMaxError, aErrorLoc );
2532 aBuffer.
Append( outline );
2546 aClearance, aMaxError, aErrorLoc );
2547 aBuffer.
Append( outline );
2561 aClearance += aMaxError;
2566 else if( aClearance < 0 )
2576 aBuffer.
Append( outline );
2581 wxFAIL_MSG( wxT(
"PAD::TransformShapeToPolygon no implementation for " )
2582 + wxString( std::string( magic_enum::enum_name( shape ) ) ) );
2626 [&](
PCB_SHAPE* aShape ) -> std::vector<PCB_SHAPE*>
2628 std::vector<PCB_SHAPE*> matching;
2638 matching.push_back( other );
2645 std::vector<PCB_SHAPE*> mergedShapes;
2672 int minExtent = std::min(
GetSize( layer ).x,
GetSize( layer ).y );
2691 mergedShapes.push_back( fpShape );
2699 group->RemoveItem( fpShape );
2717 for(
PCB_SHAPE* other : findMatching( fpShape ) )
2720 mergedShapes.push_back( other );
2730 return mergedShapes;
2735 const std::function<
void(
int aErrorCode,
const wxString& aMsg )>& aErrorHandler )
const
2740 doCheckPad( aLayer, aUnitsProvider, aForPadProperties, aErrorHandler );
2746 if( !padlayers_mask[
F_Cu] && !padlayers_mask[
B_Cu] )
2750 aErrorHandler(
DRCE_PADSTACK,
_(
"(plated through holes normally have a copper pad on "
2751 "at least one outer layer)" ) );
2758 aErrorHandler(
DRCE_PADSTACK,
_(
"('fiducial' pads are normally plated)" ) );
2762 aErrorHandler(
DRCE_PADSTACK,
_(
"('testpoint' pads are normally plated)" ) );
2765 aErrorHandler(
DRCE_PADSTACK,
_(
"('heatsink' pads are normally plated)" ) );
2768 aErrorHandler(
DRCE_PADSTACK,
_(
"('castellated' pads are normally PTH)" ) );
2771 aErrorHandler(
DRCE_PADSTACK,
_(
"('BGA' property is for SMD pads)" ) );
2774 aErrorHandler(
DRCE_PADSTACK,
_(
"('mechanical' pads are normally PTH)" ) );
2779 aErrorHandler(
DRCE_PADSTACK,
_(
"('press-fit' pads are normally PTH with round holes)" ) );
2786 if( drill_size.
x <= 0
2796 aErrorHandler(
DRCE_PADSTACK,
_(
"(connector pads normally have no solder paste; use a "
2797 "SMD pad instead)" ) );
2803 if( drill_size.
x > 0 || drill_size.
y > 0 )
2810 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper on both sides of the board)" ) );
2816 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and mask layers on different "
2817 "sides of the board)" ) );
2821 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and paste layers on different "
2822 "sides of the board)" ) );
2829 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and mask layers on different "
2830 "sides of the board)" ) );
2834 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has copper and paste layers on different "
2835 "sides of the board)" ) );
2838 else if( innerlayers_mask.count() != 0 )
2840 aErrorHandler(
DRCE_PADSTACK,
_(
"(SMD pad has no outer layers)" ) );
2850 const std::function<
void(
int aErrorCode,
const wxString& aMsg )>& aErrorHandler )
const
2866 const int min_drill_size = 4;
2870 msg.Printf(
_(
"(PTH pad hole size must be larger than %s)" ),
2893 aErrorHandler(
DRCE_PADSTACK,
_(
"(PTH pad hole leaves no copper)" ) );
2895 else if( aForPadProperties )
2903 aErrorHandler(
DRCE_PADSTACK,
_(
"(PTH pad hole not fully inside copper)" ) );
2910 aErrorHandler(
DRCE_PADSTACK,
_(
"(pad hole not inside pad shape)" ) );
2915 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative local clearance values have no effect)" ) );
2922 if( solderMaskMargin.has_value() && solderMaskMargin.value() < 0 )
2924 int absMargin = abs( solderMaskMargin.value() );
2928 for(
const std::shared_ptr<PCB_SHAPE>& shape :
GetPrimitives( aLayer ) )
2930 BOX2I shapeBBox = shape->GetBoundingBox();
2934 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder mask clearance is larger "
2935 "than some shape primitives; results may be "
2942 else if( absMargin > pad_size.
x || absMargin > pad_size.
y )
2944 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder mask clearance is larger than pad; "
2945 "no solder mask will be generated)" ) );
2958 paste_size.x = pad_size.
x + paste_margin +
KiROUND( pad_size.
x * mratio.value_or( 0 ) );
2959 paste_size.y = pad_size.
y + paste_margin +
KiROUND( pad_size.
y * mratio.value_or( 0 ) );
2961 if( paste_size.x <= 0 || paste_size.y <= 0 )
2963 aErrorHandler(
DRCE_PADSTACK,
_(
"(negative solder paste margin is larger than pad; "
2964 "no solder paste mask will be generated)" ) );
2972 aErrorHandler(
DRCE_PADSTACK,
_(
"(corner size will make pad circular)" ) );
3011 const PAD& other =
static_cast<const PAD&
>( aBoardItem );
3013 return *
this == other;
3040 const PAD& other =
static_cast<const PAD&
>( aOther );
3042 double similarity = 1.0;
3061 poly_no_hole.
Append( aPoly );
3068 for(
int ii = 0; ii < poly_no_hole.
OutlineCount(); ++ii )
3103 if( aPrimitivesList.size() )
3113 for(
const std::shared_ptr<PCB_SHAPE>& prim : aPrimitivesList )
3123 m_padStack.AddPrimitive( aPrimitive, aLayer );
3161 SHAPE_RECT rect( -padSize.
x / 2, -padSize.
y / 2, padSize.
x, padSize.
y );
3174 for(
const std::shared_ptr<PCB_SHAPE>& primitive :
m_padStack.Primitives( aLayer ) )
3176 if( !primitive->IsProxyItem() )
3231 if( pmMap.
Choices().GetCount() == 0 )
3244 if( bdMap.
Choices().GetCount() == 0 )
3256 if( zcMap.
Choices().GetCount() == 0 )
3288 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3294 auto padCanHaveHole =
3297 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3303 auto hasNormalPadstack =
3306 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3317 const wxString groupPad =
_HKI(
"Pad Properties" );
3318 const wxString groupPostMachining =
_HKI(
"Post-machining Properties" );
3319 const wxString groupBackdrill =
_HKI(
"Backdrill Properties" );
3345 wxPGChoices choices;
3362 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3375 const auto hasRoundRadius =
3378 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3418 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3426 groupPostMachining )
3429 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3439 groupPostMachining )
3442 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3447 auto mode =
pad->GetFrontPostMachining();
3457 groupPostMachining )
3460 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3465 auto mode =
pad->GetFrontPostMachining();
3474 groupPostMachining )
3477 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3482 auto mode =
pad->GetFrontPostMachining();
3491 groupPostMachining )
3494 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3504 groupPostMachining )
3507 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3512 auto mode =
pad->GetBackPostMachining();
3522 groupPostMachining )
3525 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3530 auto mode =
pad->GetBackPostMachining();
3539 groupPostMachining )
3542 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3547 auto mode =
pad->GetBackPostMachining();
3562 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3567 auto mode =
pad->GetBackdrillMode();
3579 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3584 auto mode =
pad->GetBackdrillMode();
3596 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3601 auto mode =
pad->GetBackdrillMode();
3613 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
3618 auto mode =
pad->GetBackdrillMode();
3644 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