56#include <api/board/board_types.pb.h>
60#include <magic_enum.hpp>
144 kiapi::board::types::Pad
pad;
148 pad.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
149 : kiapi::common::types::LockedState::LS_UNLOCKED );
150 pad.mutable_net()->mutable_code()->set_value(
GetNetCode() );
153 kiapi::board::types::PadStack* padstack =
pad.mutable_pad_stack();
154 padstack->set_type( kiapi::board::types::PadStackType::PST_THROUGH );
155 padstack->set_start_layer(
156 ToProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>(
m_layer ) );
157 padstack->set_end_layer(
158 ToProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>(
FlipLayer(
m_layer ) ) );
160 { GetDrillSizeX(), GetDrillSizeY() } );
163 kiapi::board::types::PadStackLayer* stackLayer = padstack->add_layers();
166 { GetSizeX(), GetSizeY() } );
167 stackLayer->set_shape(
168 ToProtoEnum<PAD_SHAPE, kiapi::board::types::PadStackShape>(
GetShape() ) );
170 kiapi::board::types::UnconnectedLayerRemoval ulr;
175 ulr = kiapi::board::types::UnconnectedLayerRemoval::ULR_REMOVE_EXCEPT_START_AND_END;
177 ulr = kiapi::board::types::UnconnectedLayerRemoval::ULR_REMOVE;
181 ulr = kiapi::board::types::UnconnectedLayerRemoval::ULR_KEEP;
184 padstack->set_unconnected_layer_removal( ulr );
186 kiapi::board::types::DesignRuleOverrides* overrides =
pad.mutable_overrides();
200 overrides->set_zone_connection(
204 kiapi::board::types::ThermalSpokeSettings* thermals =
pad.mutable_thermal_spokes();
210 aContainer.PackFrom(
pad );
216 kiapi::board::types::Pad
pad;
218 if( !aContainer.UnpackTo( &
pad ) )
224 SetLocked(
pad.locked() == kiapi::common::types::LockedState::LS_LOCKED );
226 const kiapi::board::types::PadStack& padstack =
pad.pad_stack();
228 SetLayer( FromProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>(
229 padstack.start_layer() ) );
235 if( padstack.layers_size() == 1 )
237 const kiapi::board::types::PadStackLayer& layer = padstack.layers( 0 );
240 SetShape( FromProtoEnum<PAD_SHAPE>( layer.shape() ) );
243 switch( padstack.unconnected_layer_removal() )
245 case kiapi::board::types::UnconnectedLayerRemoval::ULR_REMOVE:
250 case kiapi::board::types::UnconnectedLayerRemoval::ULR_REMOVE_EXCEPT_START_AND_END:
256 case kiapi::board::types::UnconnectedLayerRemoval::ULR_KEEP:
262 const kiapi::board::types::DesignRuleOverrides& overrides =
pad.overrides();
264 if( overrides.has_clearance() )
269 if( overrides.has_solder_mask_margin() )
274 if( overrides.has_solder_paste_margin() )
279 if( overrides.has_solder_paste_margin_ratio() )
286 const kiapi::board::types::ThermalSpokeSettings& thermals =
pad.thermal_spokes();
326 int thisNetTieGroup = padToNetTieGroupMap[
GetNumber() ];
327 int otherNetTieGroup = padToNetTieGroupMap[ aOther->
GetNumber() ];
329 return thisNetTieGroup >= 0 && thisNetTieGroup == otherNetTieGroup;
338 return m_pinType.Contains( wxT(
"no_connect" ) );
472 else if( aOnlyCheckIfPermitted )
475 return board->GetConnectivity()->IsConnectedOnLayer(
this, aLayer, types );
530 return std::make_shared<SHAPE_NULL>();
537 if( flashPTHPads == FLASHING::NEVER_FLASHED )
539 else if( flashPTHPads == FLASHING::ALWAYS_FLASHED )
549 return std::make_shared<SHAPE_NULL>();
593 auto add = [
this](
SHAPE* aShape )
601 if(
GetShape() == PAD_SHAPE::CUSTOM )
604 switch( effectiveShape )
606 case PAD_SHAPE::CIRCLE:
610 case PAD_SHAPE::OVAL:
618 int half_width = std::min( half_size.
x, half_size.
y );
619 VECTOR2I half_len( half_size.
x - half_width, half_size.
y - half_width );
621 add(
new SHAPE_SEGMENT( shapePos - half_len, shapePos + half_len, half_width * 2 ) );
626 case PAD_SHAPE::RECTANGLE:
627 case PAD_SHAPE::TRAPEZOID:
628 case PAD_SHAPE::ROUNDRECT:
642 if( half_size.
x < min_len && half_size.
y < min_len )
648 else if( effectiveShape == PAD_SHAPE::TRAPEZOID )
655 corners.
Append( -half_size.
x - trap_delta.
y, half_size.
y + trap_delta.
x );
656 corners.
Append( half_size.
x + trap_delta.
y, half_size.
y - trap_delta.
x );
657 corners.
Append( half_size.
x - trap_delta.
y, -half_size.
y + trap_delta.
x );
658 corners.
Append( -half_size.
x + trap_delta.
y, -half_size.
y - trap_delta.
x );
661 corners.
Move( shapePos );
701 case PAD_SHAPE::CHAMFERED_RECT:
714 wxFAIL_MSG( wxT(
"PAD::buildEffectiveShapes: Unsupported pad shape: PAD_SHAPE::" )
715 + wxString( std::string( magic_enum::enum_name( effectiveShape ) ) ) );
719 if(
GetShape() == PAD_SHAPE::CUSTOM )
723 if( !primitive->IsProxyItem() )
725 for(
SHAPE* shape : primitive->MakeEffectiveShapes() )
728 shape->Move( shapePos );
739 int half_width = std::min( half_size.
x, half_size.
y );
740 VECTOR2I half_len( half_size.
x - half_width, half_size.
y - half_width );
768 effectivePolygon = std::make_shared<SHAPE_POLY_SET>();
779 for(
int cnt = 0; cnt < effectivePolygon->OutlineCount(); ++cnt )
783 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
813 case PAD_ATTRIB::PTH:
817 case PAD_ATTRIB::SMD:
818 case PAD_ATTRIB::CONN:
833 case PAD_ATTRIB::NPTH:
896 auto mirrorBitFlags = [](
int& aBitfield,
int a,
int b )
898 bool temp = aBitfield & a;
938 primitive->Flip(
VECTOR2I( 0, 0 ), aFlipLeftRight );
968 case PAD_SHAPE::CIRCLE:
974 case PAD_SHAPE::OVAL:
994 *aSource =
_(
"pad" );
1006 return parentFootprint->GetClearanceOverrides( aSource );
1008 return std::optional<int>();
1048 if( !margin.has_value() )
1051 margin = parentFootprint->GetLocalSolderMaskMargin();
1054 if( !margin.has_value() )
1057 margin = brd->GetDesignSettings().m_SolderMaskExpansion;
1060 int marginValue = margin.value_or( 0 );
1063 if( marginValue < 0 )
1067 if( marginValue < minsize )
1068 marginValue = minsize;
1086 if( !margin.has_value() )
1089 margin = parentFootprint->GetLocalSolderPasteMargin();
1092 if( !margin.has_value() )
1095 margin = board->GetDesignSettings().m_SolderPasteMargin;
1098 if( !mratio.has_value() )
1101 mratio = parentFootprint->GetLocalSolderPasteMarginRatio();
1104 if( !mratio.has_value() )
1107 mratio = board->GetDesignSettings().m_SolderPasteMarginRatio;
1111 pad_margin.
x = margin.value_or( 0 ) +
KiROUND(
m_size.
x * mratio.value_or( 0 ) );
1112 pad_margin.
y = margin.value_or( 0 ) +
KiROUND(
m_size.
y * mratio.value_or( 0 ) );
1132 if( connection != ZONE_CONNECTION::INHERITED )
1135 *aSource =
_(
"pad" );
1138 if( connection == ZONE_CONNECTION::INHERITED )
1141 connection = parentFootprint->GetZoneConnectionOverrides( aSource );
1151 *aSource =
_(
"pad" );
1160 *aSource =
_(
"pad" );
1173 if( parentFootprint )
1174 aList.emplace_back(
_(
"Footprint" ), parentFootprint->
GetReference() );
1177 aList.emplace_back(
_(
"Pad" ),
m_number );
1183 aList.emplace_back(
_(
"Pin Type" ),
GetPinType() );
1189 aList.emplace_back(
_(
"Resolved Netclass" ),
1193 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
1204 double area = poly->Area();
1218 case PAD_PROP::NONE:
break;
1219 case PAD_PROP::BGA: props +=
_(
"BGA" );
break;
1220 case PAD_PROP::FIDUCIAL_GLBL: props +=
_(
"Fiducial global" );
break;
1221 case PAD_PROP::FIDUCIAL_LOCAL: props +=
_(
"Fiducial local" );
break;
1222 case PAD_PROP::TESTPOINT: props +=
_(
"Test point" );
break;
1223 case PAD_PROP::HEATSINK: props +=
_(
"Heat sink" );
break;
1224 case PAD_PROP::CASTELLATED: props +=
_(
"Castellated" );
break;
1244 if( !fp_orient.
IsZero() )
1249 aList.emplace_back(
_(
"Rotation" ), msg );
1253 aList.emplace_back(
_(
"Length in Package" ),
1261 aList.emplace_back(
_(
"Hole" ),
1262 wxString::Format( wxT(
"%s" ),
1267 aList.emplace_back(
_(
"Hole X / Y" ),
1268 wxString::Format( wxT(
"%s / %s" ),
1277 if( !source.IsEmpty() )
1279 aList.emplace_back( wxString::Format(
_(
"Min Clearance: %s" ),
1281 wxString::Format(
_(
"(from %s)" ),
1305 BOX2I arect = aRect;
1324 int count = poly->TotalVertices();
1326 for(
int ii = 0; ii < count; ii++ )
1328 VECTOR2I vertex = poly->CVertex( ii );
1329 VECTOR2I vertexNext = poly->CVertex( ( ii + 1 ) % count );
1349 if( ( diff =
static_cast<int>( aPadRef->
GetShape() ) -
1350 static_cast<int>( aPadCmp->
GetShape() ) ) != 0 )
1353 if( ( diff =
static_cast<int>( aPadRef->
m_attribute ) -
1403#if __cplusplus >= 201103L
1414 std::string s1 = aPadRef->
m_layerMask.to_string();
1415 std::string s2 = aPadCmp->
m_layerMask.to_string();
1416 return s1.compare( s2 );
1436 case PAD_SHAPE::CIRCLE:
return _(
"Circle" );
1437 case PAD_SHAPE::OVAL:
return _(
"Oval" );
1438 case PAD_SHAPE::RECTANGLE:
return _(
"Rect" );
1439 case PAD_SHAPE::TRAPEZOID:
return _(
"Trap" );
1440 case PAD_SHAPE::ROUNDRECT:
return _(
"Roundrect" );
1441 case PAD_SHAPE::CHAMFERED_RECT:
return _(
"Chamferedrect" );
1442 case PAD_SHAPE::CUSTOM:
return _(
"CustomShape" );
1443 default:
return wxT(
"???" );
1452 case PAD_ATTRIB::PTH:
return _(
"PTH" );
1453 case PAD_ATTRIB::SMD:
return _(
"SMD" );
1454 case PAD_ATTRIB::CONN:
return _(
"Conn" );
1455 case PAD_ATTRIB::NPTH:
return _(
"NPTH" );
1456 default:
return wxT(
"???" );
1467 return wxString::Format(
_(
"Pad %s of %s on %s" ),
1478 return wxString::Format(
_(
"PTH pad %s of %s" ),
1487 return wxString::Format(
_(
"Pad %s %s of %s on %s" ),
1499 return wxString::Format(
_(
"PTH pad %s %s of %s" ),
1510 return BITMAPS::pad;
1516 return new PAD( *
this );
1566 for (
int internal =
In1_Cu; internal <
In30_Cu; ++internal )
1569 aLayers[aCount++] = internal;
1581 aLayers[aCount++] = each_layer;
1588 constexpr double HIDE = std::numeric_limits<double>::max();
1666 if( cfg && cfg->m_Display.m_PadClearance &&
GetBoard() )
1671 int xMargin = std::max( solderMaskMargin, solderPasteMargin.
x ) + clearance;
1672 int yMargin = std::max( solderMaskMargin, solderPasteMargin.
y ) + clearance;
1725 case PAD_SHAPE::TRAPEZOID:
1729 case PAD_SHAPE::CIRCLE:
1740 case PAD_ATTRIB::SMD:
1741 case PAD_ATTRIB::CONN:
1777 std::swap( *
this, *
static_cast<PAD*
>( aImage ) );
1786 if( !drillsize.
x || !drillsize.
y )
1792 slot->GetWidth() + aClearance * 2, aError, aErrorLoc );
1799 int aMaxError,
ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
1801 wxASSERT_MSG( !ignoreLineWidth, wxT(
"IgnoreLineWidth has no meaning for pads." ) );
1806 const int pad_min_seg_per_circle_count = 16;
1815 case PAD_SHAPE::CIRCLE:
1816 case PAD_SHAPE::OVAL:
1818 if( dx == dy || (
GetShape() == PAD_SHAPE::CIRCLE ) )
1821 pad_min_seg_per_circle_count );
1825 int half_width = std::min( dx, dy );
1831 ( half_width + aClearance ) * 2, aMaxError, aErrorLoc,
1832 pad_min_seg_per_circle_count );
1837 case PAD_SHAPE::TRAPEZOID:
1838 case PAD_SHAPE::RECTANGLE:
1845 aMaxError, aErrorLoc );
1846 aBuffer.
Append( outline );
1850 case PAD_SHAPE::CHAMFERED_RECT:
1851 case PAD_SHAPE::ROUNDRECT:
1853 bool doChamfer =
GetShape() == PAD_SHAPE::CHAMFERED_RECT;
1860 aClearance, aMaxError, aErrorLoc );
1861 aBuffer.
Append( outline );
1865 case PAD_SHAPE::CUSTOM:
1875 aClearance += aMaxError;
1877 outline.
Inflate( aClearance, CORNER_STRATEGY::ROUND_ALL_CORNERS, aMaxError );
1880 else if( aClearance < 0 )
1886 outline.
Inflate( aClearance, CORNER_STRATEGY::ALLOW_ACUTE_CORNERS, aMaxError );
1890 aBuffer.
Append( outline );
1895 wxFAIL_MSG( wxT(
"PAD::TransformShapeToPolygon no implementation for " )
1896 + wxString( std::string( magic_enum::enum_name(
GetShape() ) ) ) );
1910 const PAD& other =
static_cast<const PAD&
>( aOther );
2002 const PAD& other =
static_cast<const PAD&
>( aOther );
2004 double similarity = 1.0;
2087 .Map( PAD_ATTRIB::PTH,
_HKI(
"Through-hole" ) )
2088 .Map( PAD_ATTRIB::SMD,
_HKI(
"SMD" ) )
2089 .Map( PAD_ATTRIB::CONN,
_HKI(
"Edge connector" ) )
2090 .Map( PAD_ATTRIB::NPTH,
_HKI(
"NPTH, mechanical" ) );
2093 .Map( PAD_SHAPE::CIRCLE,
_HKI(
"Circle" ) )
2094 .Map( PAD_SHAPE::RECTANGLE,
_HKI(
"Rectangle" ) )
2095 .Map( PAD_SHAPE::OVAL,
_HKI(
"Oval" ) )
2096 .Map( PAD_SHAPE::TRAPEZOID,
_HKI(
"Trapezoid" ) )
2097 .Map( PAD_SHAPE::ROUNDRECT,
_HKI(
"Rounded rectangle" ) )
2098 .Map( PAD_SHAPE::CHAMFERED_RECT,
_HKI(
"Chamfered rectangle" ) )
2099 .Map( PAD_SHAPE::CUSTOM,
_HKI(
"Custom" ) );
2102 .Map( PAD_PROP::NONE,
_HKI(
"None" ) )
2103 .Map( PAD_PROP::BGA,
_HKI(
"BGA pad" ) )
2104 .Map( PAD_PROP::FIDUCIAL_GLBL,
_HKI(
"Fiducial, global to board" ) )
2105 .Map( PAD_PROP::FIDUCIAL_LOCAL,
_HKI(
"Fiducial, local to footprint" ) )
2106 .Map( PAD_PROP::TESTPOINT,
_HKI(
"Test point pad" ) )
2107 .Map( PAD_PROP::HEATSINK,
_HKI(
"Heatsink pad" ) )
2108 .Map( PAD_PROP::CASTELLATED,
_HKI(
"Castellated pad" ) );
2112 if( zcMap.
Choices().GetCount() == 0 )
2114 zcMap.
Undefined( ZONE_CONNECTION::INHERITED );
2115 zcMap.
Map( ZONE_CONNECTION::INHERITED,
_HKI(
"Inherited" ) )
2116 .
Map( ZONE_CONNECTION::NONE,
_HKI(
"None" ) )
2117 .
Map( ZONE_CONNECTION::THERMAL,
_HKI(
"Thermal reliefs" ) )
2118 .
Map( ZONE_CONNECTION::FULL,
_HKI(
"Solid" ) )
2119 .
Map( ZONE_CONNECTION::THT_THERMAL,
_HKI(
"Thermal reliefs for PTH" ) );
2130 PROPERTY_DISPLAY::PT_DEGREE ) );
2135 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
2136 return pad->GetAttribute() != PAD_ATTRIB::NPTH;
2141 auto padCanHaveHole =
2144 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
2146 return pad->GetAttribute() == PAD_ATTRIB::PTH
2147 ||
pad->GetAttribute() == PAD_ATTRIB::NPTH;
2154 _HKI(
"Net" ), isCopperPad );
2156 _HKI(
"Net Class" ), isCopperPad );
2158 const wxString groupPad =
_HKI(
"Pad Properties" );
2170 padNumber->SetAvailableFunc( isCopperPad );
2182 PROPERTY_DISPLAY::PT_SIZE ), groupPad );
2185 PROPERTY_DISPLAY::PT_SIZE ), groupPad )
2190 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
2191 return pad->GetShape() != PAD_SHAPE::CIRCLE;
2198 roundRadiusRatio->SetAvailableFunc(
2201 if(
PAD*
pad =
dynamic_cast<PAD*
>( aItem ) )
2202 return pad->GetShape() == PAD_SHAPE::ROUNDRECT;
2206 propMgr.
AddProperty( roundRadiusRatio, groupPad );
2210 PROPERTY_DISPLAY::PT_SIZE ), groupPad )
2216 PROPERTY_DISPLAY::PT_SIZE ), groupPad )
2225 PROPERTY_DISPLAY::PT_SIZE );
2226 padToDie->SetAvailableFunc( isCopperPad );
2229 const wxString groupOverrides =
_HKI(
"Overrides" );
2232 _HKI(
"Clearance Override" ),
2234 PROPERTY_DISPLAY::PT_SIZE ), groupOverrides );
2237 _HKI(
"Soldermask Margin Override" ),
2239 PROPERTY_DISPLAY::PT_SIZE ), groupOverrides );
2242 _HKI(
"Solderpaste Margin Override" ),
2244 PROPERTY_DISPLAY::PT_SIZE ), groupOverrides );
2247 _HKI(
"Solderpaste Margin Ratio Override" ),
2249 PROPERTY_DISPLAY::PT_RATIO ),
2253 _HKI(
"Zone Connection Style" ),
2260 PROPERTY_DISPLAY::PT_SIZE ), groupOverrides )
2261 .
SetValidator( PROPERTY_VALIDATORS::RangeIntValidator<minZoneWidth, INT_MAX> );
2265 PROPERTY_DISPLAY::PT_DEGREE ), groupOverrides );
2269 PROPERTY_DISPLAY::PT_SIZE ), groupOverrides )
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
BITMAPS
A list of all bitmap identifiers.
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
TEARDROP_PARAMETERS m_teardropParams
Not all BOARD_CONNECTED_ITEMs support teardrops, but we want those that do to share a single section ...
wxString GetShortNetname() const
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...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void SetLocked(bool aLocked)
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 bool IsLocked() const
BOARD_ITEM_CONTAINER * GetParent() const
virtual wxString layerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
Information pertinent to a Pcbnew printed circuit board.
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
int GetMaxClearanceValue() const
Returns the maximum clearance value for any object on the board.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
const Vec & GetOrigin() const
const SizeVec & GetSize() const
bool Intersects(const BOX2< Vec > &aRect) const
bool Contains(const Vec &aPoint) const
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
MINOPTMAX< int > & Value()
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
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.
EDA_ITEM * m_parent
Linked list: Link (parent struct)
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
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.
wxString AsString() const
std::string AsStdString() const
LSET is a set of PCB_LAYER_IDs.
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
static LSET FrontBoardTechMask()
Return a mask holding technical layers used in a board fabrication (no CU layer) on front side.
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static LSET PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
static LSET BackBoardTechMask()
Return a mask holding technical layers used in a board fabrication (no CU layer) on Back side.
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
PAD_DRILL_SHAPE_T m_drillShape
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 SetLayerSet(LSET aLayers) override
virtual void swapData(BOARD_ITEM *aImage) override
PAD_PROP GetProperty() const
bool GetRemoveUnconnected() const
PAD_DRILL_SHAPE_T GetDrillShape() const
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
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.
CUST_PAD_SHAPE_IN_ZONE m_customShapeClearanceArea
bool FlashLayer(int aLayer, bool aOnlyCheckIfPermitted=false) const
Check to see whether the pad should be flashed on the specific layer.
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.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
int GetSolderMaskExpansion() const
int GetDrillSizeY() const
std::optional< double > GetLocalSolderPasteMarginRatio() const
const wxString & GetPinType() const
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.
void SetRemoveUnconnected(bool aSet)
Set the unconnected removal property.
const wxString & GetPinFunction() const
void BuildEffectiveShapes(PCB_LAYER_ID aLayer) const
Rebuild the effective shape cache (and bounding box and radius) for the pad and clears the dirty bit.
std::mutex m_shapesBuildingLock
void SetThermalGap(int aGap)
std::shared_ptr< SHAPE_POLY_SET > m_effectivePolygon[2]
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.
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
double m_roundedCornerScale
const wxString & GetNumber() const
void FlipPrimitives(bool aFlipLeftRight)
Flip (mirror) the primitives left to right or top to bottom, around the anchor position in custom pad...
void MergePrimitivesAsPolygon(SHAPE_POLY_SET *aMergedPolygon, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Merge all basic shapes to a SHAPE_POLY_SET.
int GetRoundRectCornerRadius() const
std::vector< std::shared_ptr< PCB_SHAPE > > m_editPrimitives
void SetLocalSolderPasteMarginRatio(std::optional< double > aRatio)
PAD & operator=(const PAD &aOther)
std::shared_ptr< SHAPE_SEGMENT > m_effectiveHoleShape
std::optional< int > m_solderMaskMargin
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
bool IsLocked() const override
void SetDrillShape(PAD_DRILL_SHAPE_T aShape)
VECTOR2I GetPosition() const override
void SetProperty(PAD_PROP aProperty)
void SetThermalSpokeAngleDegrees(double aAngle)
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives() const
Accessor to the basic shape list for custom-shaped pads.
EDA_ANGLE GetThermalSpokeAngle() const
bool operator==(const BOARD_ITEM &aOther) const override
void SetOffset(const VECTOR2I &aOffset)
PCB_LAYER_ID GetPrincipalLayer() const
void SetChamferRectRatio(double aChamferScale)
Has meaning only for chamfered rectangular pads.
const VECTOR2I & GetOffset() const
static LSET UnplatedHoleMask()
layer set for a mechanical unplated through hole pad
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
double GetOrientationDegrees() const
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetRoundRectCornerRadius(double aRadius)
Has meaning only for rounded rectangle pads.
bool IsNoConnectPad() const
int GetDrillSizeX() const
void SetKeepTopBottom(bool aSet)
Set whether we keep the top and bottom connections even if they are not connected.
VECTOR2I ShapePos() 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").
std::optional< int > m_solderPasteMargin
int GetLocalThermalGapOverride(wxString *aSource=nullptr) const
wxString ShowPadAttr() const
wxString ShowPadShape() const
int m_effectiveBoundingRadius
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
bool GetKeepTopBottom() const
const std::shared_ptr< SHAPE_POLY_SET > & GetEffectivePolygon(ERROR_LOC aErrorLoc=ERROR_INSIDE) const
void SetLocalZoneConnection(ZONE_CONNECTION aType)
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() 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.
ZONE_CONNECTION m_zoneConnection
void SetDelta(const VECTOR2I &aSize)
bool IsOnCopperLayer() const override
void SetDrillSizeX(const int aX)
void SetPosition(const VECTOR2I &aPos) override
const VECTOR2I & GetDelta() 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_SHAPE GetShape() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
EDA_ANGLE GetFPRelativeOrientation()
void Flip(const VECTOR2I &VECTOR2I, bool aFlipLeftRight) override
Flip this object, i.e.
VECTOR2I GetSolderPasteMargin() const
Usually < 0 (mask shape smaller than pad)because the margin can be dependent on the pad size,...
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.
std::mutex m_polyBuildingLock
static LSET SMDMask()
layer set for a SMD pad on Front layer
std::optional< int > GetLocalSolderPasteMargin() const
std::optional< int > GetLocalSolderMaskMargin() const
void SetLocalSolderPasteMargin(std::optional< int > aMargin)
void SetShape(PAD_SHAPE aShape)
Set the new shape of this pad.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
int GetThermalSpokeWidth() const
void SetPinFunction(const wxString &aName)
Set the pad function (pin name in schematic)
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)
std::optional< int > m_clearance
int GetBoundingRadius() const
Return the radius of a minimum sized circle which fully encloses this pad.
void SetCustomShapeInZoneOpt(CUST_PAD_SHAPE_IN_ZONE aOption)
Set the option for the custom pad shape to use as clearance area in copper zones.
void SetRoundRectRadiusRatio(double aRadiusScale)
Has meaning only for rounded rectangle pads.
void SetAnchorPadShape(PAD_SHAPE aShape)
Set the shape of the anchor pad for custom shaped pads.
std::array< ZONE_LAYER_OVERRIDE, MAX_CU_LAYERS > m_zoneLayerOverrides
void SetOrientation(const EDA_ANGLE &aAngle)
Set the rotation angle of the pad.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
int GetChamferPositions() const
virtual void ViewGetLayers(int aLayers[], int &aCount) const override
Return the all the layers within the VIEW the object is painted on.
void ReplacePrimitives(const std::vector< std::shared_ptr< PCB_SHAPE > > &aPrimitivesList)
Clear the current custom shape primitives list and import a new list.
std::optional< double > m_solderPasteMarginRatio
bool m_removeUnconnectedLayer
< If true, the pad copper is removed for layers that are not connected.
void SetLocalClearance(std::optional< int > aClearance)
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING flashPTHPads=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
int GetSubRatsnest() const
void SetSizeX(const int aX)
bool m_keepTopBottomLayer
ZONE_CONNECTION GetLocalZoneConnection() const
void SetThermalSpokeWidth(int aWidth)
Set the width of the thermal spokes connecting the pad to a zone.
void SetSize(const VECTOR2I &aSize)
void SetDrillSizeY(const int aY)
double GetThermalSpokeAngleDegrees() const
double GetRoundRectRadiusRatio() const
int GetThermalGap() 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
bool SharesNetTieGroup(const PAD *aOther) const
const VECTOR2I & GetSize() const
EDA_ANGLE m_thermalSpokeAngle
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
void SetSubRatsnest(int aSubRatsnest)
std::shared_ptr< SHAPE_COMPOUND > m_effectiveShape
void SetChamferPositions(int aPositions)
Has meaning only for chamfered rectangular pads.
int GetLocalSpokeWidthOverride(wxString *aSource=nullptr) const
PAD_SHAPE GetAnchorPadShape() 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.
double GetChamferRectRatio() const
void SetPadToDieLength(int aLength)
void SetSizeY(const int aY)
int GetPadToDieLength() const
BOX2I m_effectiveBoundingBox
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.
static VALIDATOR_RESULT PositiveIntValidator(const wxAny &&aValue, EDA_ITEM *aItem)
static SEG::ecoord Square(int a)
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 Fracture(POLYGON_MODE aFastMode)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
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 Move(const VECTOR2I &aVector) override
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Represent a simple polygon consisting of a zero-thickness closed chain of connected line segments.
An abstract shape on 2D plane.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
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
@ HOLE_CLEARANCE_CONSTRAINT
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_45
#define FOOTPRINT_EDIT_FRAME_NAME
#define PCB_EDIT_FRAME_NAME
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
Some functions to handle hotkeys in KiCad.
@ 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...
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
@ LAYER_FOOTPRINTS_FR
show footprints on front
@ LAYER_NON_PLATEDHOLES
handle color for not plated holes (holes, not pads)
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored)
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
@ LAYER_FOOTPRINTS_BK
show footprints on back
@ LAYER_PADS_SMD_BK
smd pads, back layer
@ LAYER_PADS_TH
multilayer pads, usually with holes
@ LAYER_PADS_SMD_FR
smd pads, front layer
bool IsNetnameLayer(int aLayer)
Test whether a layer is a netname layer.
bool IsHoleLayer(int aLayer)
PCB_LAYER_ID
A quick note on layer IDs:
LSET FlipLayerMask(LSET aMask, int aCopperLayersCount)
Calculate the mask layer when flipping a footprint.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
This file contains miscellaneous commonly used macros and functions.
void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Message panel definition file.
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
T clamp(T min, T value, T max)
void PackLayerSet(google::protobuf::RepeatedField< int > &aOutput, const LSET &aLayerSet)
LSET UnpackLayerSet(const google::protobuf::RepeatedField< int > &aProtoLayerSet)
void PackVector2(kiapi::common::types::Vector2 &aOutput, const VECTOR2I aInput)
VECTOR2I UnpackVector2(const types::Vector2 &aInput)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
static struct PAD_DESC _PAD_DESC
@ CUST_PAD_SHAPE_IN_ZONE_OUTLINE
PAD_ATTRIB
The set of pad shapes, used with PAD::{Set,Get}Attribute().
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 ...
#define NO_SETTER(owner, type)
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
wxString UnescapeString(const wxString &aSource)
constexpr int mmToIU(double mm) const
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)
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
VECTOR2< double > VECTOR2D
ZONE_CONNECTION
How pads are covered by copper in zone.
#define ZONE_THICKNESS_MIN_VALUE_MM