KiCad PCB EDA Suite
Loading...
Searching...
No Matches
footprint.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#ifndef FOOTPRINT_H
26#define FOOTPRINT_H
27
28#include <deque>
29#include <mutex>
30#include <unordered_set>
31
32#include <template_fieldnames.h>
33
35#include <board_item.h>
36#include <embedded_files.h>
37#include <layer_ids.h> // ALL_LAYERS definition.
38#include <lset.h>
39#include <lib_id.h>
40#include <lib_tree_item.h>
41#include <list>
42
43#include <zones.h>
45#include <pcb_item_containers.h>
46#include <pcb_field.h>
47#include <functional>
48#include <math/vector3.h>
50#include <gal/color4d.h>
51
52class LINE_READER;
53class EDA_3D_CANVAS;
54class PAD;
55class BOARD;
56class COMPONENT_CLASS;
58class MSG_PANEL_ITEM;
59class SHAPE;
60class REPORTER;
62class PCB_POINT;
63
64namespace KIGFX {
65class VIEW;
66}
67
68namespace KIFONT {
69class OUTLINE_FONT;
70}
71
77
84{
86 FP_SMD = 0x0002,
89 FP_BOARD_ONLY = 0x0010, // Footprint has no corresponding symbol
90 FP_JUST_ADDED = 0x0020, // Footprint just added by netlist update
91 FP_DNP = 0x0040
92};
93
101
103{
104public:
105 EXTRUDED_3D_BODY() = default;
106
107 int m_height = 0;
108 int m_standoff = 0;
112 bool m_show = true;
113
114 VECTOR3D m_scale{ 1.0, 1.0, 1.0 };
115 VECTOR3D m_rotation{ 0.0, 0.0, 0.0 };
116 VECTOR3D m_offset{ 0.0, 0.0, 0.0 };
117
119 {
120 switch( aMaterial )
121 {
122 default:
123 case EXTRUSION_MATERIAL::PLASTIC: return KIGFX::COLOR4D( 0.2, 0.2, 0.2, 1.0 );
124 case EXTRUSION_MATERIAL::MATTE: return KIGFX::COLOR4D( 0.4, 0.4, 0.4, 1.0 );
125 case EXTRUSION_MATERIAL::METAL: return KIGFX::COLOR4D( 0.7, 0.7, 0.7, 1.0 );
126 case EXTRUSION_MATERIAL::COPPER: return KIGFX::COLOR4D( 0.72, 0.45, 0.2, 1.0 );
127 }
128 }
129
130 bool operator==( const EXTRUDED_3D_BODY& aOther ) const
131 {
132 return m_height == aOther.m_height && m_standoff == aOther.m_standoff && m_layer == aOther.m_layer
133 && m_color == aOther.m_color && m_material == aOther.m_material && m_scale == aOther.m_scale
134 && m_rotation == aOther.m_rotation && m_offset == aOther.m_offset && m_show == aOther.m_show;
135 }
136
137 static uint32_t PackColorKey( const KIGFX::COLOR4D& aColor )
138 {
139 return ( (uint8_t) ( aColor.r * 255 ) << 24 ) | ( (uint8_t) ( aColor.g * 255 ) << 16 )
140 | ( (uint8_t) ( aColor.b * 255 ) << 8 ) | (uint8_t) ( aColor.a * 255 );
141 }
142};
143
157
159{
160public:
162 // Initialize with sensible values
163 m_Scale { 1, 1, 1 },
164 m_Rotation { 0, 0, 0 },
165 m_Offset { 0, 0, 0 },
166 m_Opacity( 1.0 ),
167 m_Show( true )
168 {
169 }
170
174 double m_Opacity;
175 wxString m_Filename;
176 bool m_Show;
177
178 bool operator==( const FP_3DMODEL& aOther ) const
179 {
180 return m_Scale == aOther.m_Scale
181 && m_Rotation == aOther.m_Rotation
182 && m_Offset == aOther.m_Offset
183 && m_Opacity == aOther.m_Opacity
184 && m_Filename == aOther.m_Filename
185 && m_Show == aOther.m_Show;
186 }
187};
188
189
191{
192 SHAPE_POLY_SET front; // Note that a footprint can have both front and back courtyards populated.
196};
197
198
208
209
217{
218public:
219 FOOTPRINT_VARIANT( const wxString& aName = wxEmptyString ) :
220 m_name( aName ),
221 m_dnp( false ),
222 m_excludedFromBOM( false ),
224 {
225 }
226
227 wxString GetName() const { return m_name; }
228 void SetName( const wxString& aName ) { m_name = aName; }
229
230 bool GetDNP() const { return m_dnp; }
231 void SetDNP( bool aDNP ) { m_dnp = aDNP; }
232
233 bool GetExcludedFromBOM() const { return m_excludedFromBOM; }
234 void SetExcludedFromBOM( bool aExclude ) { m_excludedFromBOM = aExclude; }
235
237 void SetExcludedFromPosFiles( bool aExclude ) { m_excludedFromPosFiles = aExclude; }
238
244 wxString GetFieldValue( const wxString& aFieldName ) const
245 {
246 auto it = m_fields.find( aFieldName );
247
248 if( it != m_fields.end() )
249 return it->second;
250
251 return wxString();
252 }
253
259 void SetFieldValue( const wxString& aFieldName, const wxString& aValue )
260 {
261 m_fields[aFieldName] = aValue;
262 }
263
264 bool HasFieldValue( const wxString& aFieldName ) const
265 {
266 return m_fields.find( aFieldName ) != m_fields.end();
267 }
268
269 const std::map<wxString, wxString>& GetFields() const { return m_fields; }
270
271 bool operator==( const FOOTPRINT_VARIANT& aOther ) const
272 {
273 return m_name == aOther.m_name
274 && m_dnp == aOther.m_dnp
277 && m_fields == aOther.m_fields;
278 }
279
280private:
281 wxString m_name;
282 bool m_dnp;
285 std::map<wxString, wxString> m_fields;
286};
287
288
290{
291public:
292 FOOTPRINT( BOARD* parent );
293
294 FOOTPRINT( const FOOTPRINT& aFootprint );
295
296 // Move constructor and operator needed due to std containers inside the footprint
297 FOOTPRINT( FOOTPRINT&& aFootprint );
298
299 ~FOOTPRINT();
300
301 FOOTPRINT& operator=( const FOOTPRINT& aOther );
302 FOOTPRINT& operator=( FOOTPRINT&& aOther );
303
304 void CopyFrom( const BOARD_ITEM* aOther ) override;
305
306 void Serialize( google::protobuf::Any &aContainer ) const override;
307 bool Deserialize( const google::protobuf::Any &aContainer ) override;
308
309 static inline bool ClassOf( const EDA_ITEM* aItem )
310 {
311 return aItem && aItem->Type() == PCB_FOOTPRINT_T;
312 }
313
316
318 void SetPrivateLayers( const LSET& aLayers ) { m_privateLayers = aLayers; }
319
321 void Add( BOARD_ITEM* aItem, ADD_MODE aMode = ADD_MODE::INSERT,
322 bool aSkipConnectivity = false ) override;
323
325 void Remove( BOARD_ITEM* aItem, REMOVE_MODE aMode = REMOVE_MODE::NORMAL ) override;
326
334 void ClearAllNets();
335
343 bool FixUuids();
344
355
363
364 bool TextOnly() const;
365
366 // Virtual function
367 const BOX2I GetBoundingBox() const override;
368 const BOX2I GetBoundingBox( bool aIncludeText ) const;
369
373 const BOX2I GetLayerBoundingBox( const LSET& aLayers ) const;
374
375 VECTOR2I GetCenter() const override { return GetBoundingBox( false ).GetCenter(); }
376
377 std::deque<PAD*>& Pads() { return m_pads; }
378 const std::deque<PAD*>& Pads() const { return m_pads; }
379
381 const DRAWINGS& GraphicalItems() const { return m_drawings; }
382
383 ZONES& Zones() { return m_zones; }
384 const ZONES& Zones() const { return m_zones; }
385
386 GROUPS& Groups() { return m_groups; }
387 const GROUPS& Groups() const { return m_groups; }
388
390 const PCB_POINTS& Points() const { return m_points; }
391
392 bool HasThroughHolePads() const;
393
394 std::vector<FP_3DMODEL>& Models() { return m_3D_Drawings; }
395 const std::vector<FP_3DMODEL>& Models() const { return m_3D_Drawings; }
396
397 bool HasExtrudedBody() const { return m_extrudedBody != nullptr; }
398 const EXTRUDED_3D_BODY* GetExtrudedBody() const { return m_extrudedBody.get(); }
401 void SetExtrudedBody( std::unique_ptr<EXTRUDED_3D_BODY> aBody );
403
404 void SetPosition( const VECTOR2I& aPos ) override;
405 VECTOR2I GetPosition() const override { return m_pos; }
406
407 void SetOrientation( const EDA_ANGLE& aNewAngle );
409
414 void SetLayerAndFlip( PCB_LAYER_ID aLayer );
415
416 // to make property magic work
417 PCB_LAYER_ID GetLayer() const override { return BOARD_ITEM::GetLayer(); }
418
419 // For property system:
420 void SetOrientationDegrees( double aOrientation )
421 {
422 SetOrientation( EDA_ANGLE( aOrientation, DEGREES_T ) );
423 }
425 {
426 return m_orient.AsDegrees();
427 }
428
429 const LIB_ID& GetFPID() const { return m_fpid; }
430 void SetFPID( const LIB_ID& aFPID )
431 {
432 m_fpid = aFPID;
433 }
434
435 wxString GetFPIDAsString() const { return m_fpid.Format(); }
436 void SetFPIDAsString( const wxString& aFPID ) { m_fpid.Parse( aFPID ); }
437
438 // LIB_TREE_ITEM interface
439 LIB_ID GetLIB_ID() const override { return m_fpid; }
440 wxString GetName() const override { return m_fpid.GetLibItemName(); }
441 wxString GetLibNickname() const override { return m_fpid.GetLibNickname(); }
442 wxString GetDesc() override { return GetLibDescription(); }
443 int GetPinCount() override { return static_cast<int>( GetUniquePadCount( DO_NOT_INCLUDE_NPTH ) ); }
444 std::vector<SEARCH_TERM>& GetSearchTerms() override;
445
446 wxString GetLibDescription() const { return m_libDescription; }
447 void SetLibDescription( const wxString& aDesc ) { m_libDescription = aDesc; }
448
449 wxString GetKeywords() const { return m_keywords; }
450 void SetKeywords( const wxString& aKeywords ) { m_keywords = aKeywords; }
451
452 const KIID_PATH& GetPath() const { return m_path; }
453 void SetPath( const KIID_PATH& aPath ) { m_path = aPath; }
454
455 wxString GetSheetname() const { return m_sheetname; }
456 void SetSheetname( const wxString& aSheetname ) { m_sheetname = aSheetname; }
457
458 wxString GetSheetfile() const { return m_sheetfile; }
459 void SetSheetfile( const wxString& aSheetfile ) { m_sheetfile = aSheetfile; }
460
461 wxString GetFilters() const { return m_filters; }
462 void SetFilters( const wxString& aFilters ) { m_filters = aFilters; }
463
464 std::optional<int> GetLocalClearance() const { return m_clearance; }
465 void SetLocalClearance( std::optional<int> aClearance ) { m_clearance = aClearance; }
466
467 std::optional<int> GetLocalSolderMaskMargin() const { return m_solderMaskMargin; }
468 void SetLocalSolderMaskMargin( std::optional<int> aMargin ) { m_solderMaskMargin = aMargin; }
469
470 std::optional<int> GetLocalSolderPasteMargin() const { return m_solderPasteMargin; }
471 void SetLocalSolderPasteMargin( std::optional<int> aMargin ) { m_solderPasteMargin = aMargin; }
472
473 std::optional<double> GetLocalSolderPasteMarginRatio() const { return m_solderPasteMarginRatio; }
474 void SetLocalSolderPasteMarginRatio( std::optional<double> aRatio ) { m_solderPasteMarginRatio = aRatio; }
475
478
485 void SetStackupMode( FOOTPRINT_STACKUP aMode );
487
492 void SetStackupLayers( LSET aLayers );
493 const LSET& GetStackupLayers() const { return m_stackupLayers; }
494
495 int GetAttributes() const { return m_attributes; }
496 void SetAttributes( int aAttributes ) { m_attributes = aAttributes; }
497
499 void SetAllowMissingCourtyard( bool aAllow ) { m_allowMissingCourtyard = aAllow; }
500
502 void SetAllowSolderMaskBridges( bool aAllow ) { m_allowSolderMaskBridges = aAllow; }
503
504 void SetFlag( int aFlag ) { m_arflag = aFlag; }
505 void IncrementFlag() { m_arflag += 1; }
506 int GetFlag() const { return m_arflag; }
507
508 bool IsNetTie() const
509 {
510 for( const wxString& group : m_netTiePadGroups )
511 {
512 if( !group.IsEmpty() )
513 return true;
514 }
515
516 return false;
517 }
518
519 std::optional<int> GetLocalClearance( wxString* aSource ) const
520 {
521 if( m_clearance.has_value() && aSource )
522 *aSource = wxString::Format( _( "footprint %s" ), GetReference() );
523
524 return m_clearance;
525 }
526
533 std::optional<int> GetClearanceOverrides( wxString* aSource ) const
534 {
535 return GetLocalClearance( aSource );
536 }
537
539 {
541 *aSource = wxString::Format( _( "footprint %s" ), GetReference() );
542
543 return m_zoneConnection;
544 }
545
550 const std::vector<wxString>& GetNetTiePadGroups() const { return m_netTiePadGroups; }
551
553 {
554 m_netTiePadGroups.clear();
555 }
556
557 void AddNetTiePadGroup( const wxString& aGroup )
558 {
559 m_netTiePadGroups.emplace_back( aGroup );
560 }
561
566 std::map<wxString, int> MapPadNumbersToNetTieGroups() const;
567
571 std::vector<PAD*> GetNetTiePads( PAD* aPad ) const;
572
578 int GetLikelyAttribute() const;
579
580 void Move( const VECTOR2I& aMoveVector ) override;
581
582 void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override;
583
584 void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection ) override;
585
597 void MoveAnchorPosition( const VECTOR2I& aMoveVector );
598
602 bool IsFlipped() const { return GetLayer() == B_Cu; }
603
608 PCB_LAYER_ID GetSide() const;
609
613 bool IsOnLayer( PCB_LAYER_ID aLayer ) const override;
614
615// m_footprintStatus bits:
616#define FP_is_LOCKED 0x01
617#define FP_is_PLACED 0x02
618#define FP_to_PLACE 0x04
619#define FP_PADS_are_LOCKED 0x08
620
621
622 bool IsLocked() const override
623 {
624 return ( m_fpStatus & FP_is_LOCKED ) != 0;
625 }
626
632 void SetLocked( bool isLocked ) override
633 {
634 if( isLocked )
636 else
638 }
639
643 bool IsConflicting() const;
644
645 bool IsPlaced() const { return m_fpStatus & FP_is_PLACED; }
646 void SetIsPlaced( bool isPlaced )
647 {
648 if( isPlaced )
650 else
652 }
653
654 bool NeedsPlaced() const { return m_fpStatus & FP_to_PLACE; }
655 void SetNeedsPlaced( bool needsPlaced )
656 {
657 if( needsPlaced )
659 else
661 }
662
664
675 void CheckFootprintAttributes( const std::function<void( const wxString& )>& aErrorHandler );
676
683 void CheckPads( UNITS_PROVIDER* aUnitsProvider,
684 const std::function<void( const PAD*, int, const wxString& )>& aErrorHandler );
685
691 void CheckShortingPads( const std::function<void( const PAD*, const PAD*, int aErrorCode,
692 const VECTOR2I& )>& aErrorHandler );
693
700 void CheckNetTies( const std::function<void( const BOARD_ITEM* aItem,
701 const BOARD_ITEM* bItem,
702 const BOARD_ITEM* cItem,
703 const VECTOR2I& )>& aErrorHandler );
704
711 void CheckNetTiePadGroups( const std::function<void( const wxString& )>& aErrorHandler );
712
713 void CheckClippedSilk( const std::function<void( BOARD_ITEM* aItemA,
714 BOARD_ITEM* aItemB,
715 const VECTOR2I& aPt )>& aErrorHandler );
719 void BuildNetTieCache();
720
724 const std::set<int>& GetNetTieCache( const BOARD_ITEM* aItem ) const
725 {
726 static const std::set<int> emptySet;
727
728 auto it = m_netTieCache.find( aItem );
729
730 if( it == m_netTieCache.end() )
731 return emptySet;
732
733 return it->second;
734 }
735
748 void TransformPadsToPolySet( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance,
749 int aMaxError, ERROR_LOC aErrorLoc ) const;
750
765 void TransformFPShapesToPolySet( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance,
766 int aError, ERROR_LOC aErrorLoc,
767 bool aIncludeText = true,
768 bool aIncludeShapes = true,
769 bool aIncludePrivateItems = false ) const;
770
774 void TransformFPTextToPolySet( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance,
775 int aError, ERROR_LOC aErrorLoc ) const
776 {
777 TransformFPShapesToPolySet( aBuffer, aLayer, aClearance, aError, aErrorLoc, true, false );
778 }
779
783 void GetContextualTextVars( wxArrayString* aVars ) const;
784
790 bool ResolveTextVar( wxString* token, int aDepth = 0 ) const;
791
793 void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
794
795 bool HitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const override;
796
797 bool Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const override;
798
808 bool HitTestAccurate( const VECTOR2I& aPosition, int aAccuracy = 0 ) const;
809
810 bool HitTest( const BOX2I& aRect, bool aContained, int aAccuracy = 0 ) const override;
811
812 bool HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const override;
813
822 bool HitTestOnLayer( const VECTOR2I& aPosition, PCB_LAYER_ID aLayer, int aAccuracy = 0 ) const;
823
824 bool HitTestOnLayer( const BOX2I& aRect, bool aContained, PCB_LAYER_ID aLayer, int aAccuracy = 0 ) const;
825
829 const wxString& GetReference() const { return Reference().GetText(); }
830
835 void SetReference( const wxString& aReference ) { Reference().SetText( aReference ); }
836
837 // Property system doesn't like const references
838 wxString GetReferenceAsString() const
839 {
840 return GetReference();
841 }
842
846 void IncrementReference( int aDelta );
847
851 const wxString& GetValue() const { return Value().GetText(); }
852
856 void SetValue( const wxString& aValue ) { Value().SetText( aValue ); }
857
858 // Property system doesn't like const references
859 wxString GetValueAsString() const
860 {
861 return GetValue();
862 }
863
867
869 const PCB_FIELD& Value() const { return *GetField( FIELD_T::VALUE ); }
870 const PCB_FIELD& Reference() const { return *GetField( FIELD_T::REFERENCE ); }
871
872 //-----<Fields>-----------------------------------------------------------
873
878 PCB_FIELD* GetField( FIELD_T aFieldType );
879 const PCB_FIELD* GetField( FIELD_T aFieldNdx ) const;
880
888 PCB_FIELD* GetField( const wxString& aFieldName ) const;
889
890 bool HasField( const wxString& aFieldName ) const;
891
898 void GetFields( std::vector<PCB_FIELD*>& aVector, bool aVisibleOnly ) const;
899
903 const std::deque<PCB_FIELD*>& GetFields() const { return m_fields; }
904 std::deque<PCB_FIELD*>& GetFields() { return m_fields; }
905
909 int GetNextFieldOrdinal() const;
910
918 void ApplyDefaultSettings( const BOARD& board, bool aStyleFields, bool aStyleText,
919 bool aStyleShapes, bool aStyleDimensions, bool aStyleBarcodes );
920
922 {
923 wxString m_unitName; // e.g. A
924 std::vector<wxString> m_pins; // pin numbers in this unit
925 };
926
927 void SetUnitInfo( const std::vector<FP_UNIT_INFO>& aUnits ) { m_unitInfo = aUnits; }
928 const std::vector<FP_UNIT_INFO>& GetUnitInfo() const { return m_unitInfo; }
929
930 bool IsBoardOnly() const { return m_attributes & FP_BOARD_ONLY; }
931 void SetBoardOnly( bool aIsBoardOnly = true )
932 {
933 if( aIsBoardOnly )
935 else
937 }
938
940 void SetExcludedFromPosFiles( bool aExclude = true )
941 {
942 if( aExclude )
944 else
946 }
947
949 void SetExcludedFromBOM( bool aExclude = true )
950 {
951 if( aExclude )
953 else
955 }
956
957 bool IsDNP() const { return m_attributes & FP_DNP; }
958 void SetDNP( bool aDNP = true )
959 {
960 if( aDNP )
962 else
964 }
965
966 // =====================================================================
967 // Variant Support
968 // =====================================================================
969
975 const FOOTPRINT_VARIANT* GetVariant( const wxString& aVariantName ) const;
976
982 FOOTPRINT_VARIANT* GetVariant( const wxString& aVariantName );
983
988 void SetVariant( const FOOTPRINT_VARIANT& aVariant );
989
995 FOOTPRINT_VARIANT* AddVariant( const wxString& aVariantName );
996
1001 void DeleteVariant( const wxString& aVariantName );
1002
1008 void RenameVariant( const wxString& aOldName, const wxString& aNewName );
1009
1015 bool HasVariant( const wxString& aVariantName ) const;
1016
1022
1031 bool GetDNPForVariant( const wxString& aVariantName ) const;
1032
1041 bool GetExcludedFromBOMForVariant( const wxString& aVariantName ) const;
1042
1051 bool GetExcludedFromPosFilesForVariant( const wxString& aVariantName ) const;
1052
1062 wxString GetFieldValueForVariant( const wxString& aVariantName, const wxString& aFieldName ) const;
1063
1064 void SetFileFormatVersionAtLoad( int aVersion ) { m_fileFormatVersionAtLoad = aVersion; }
1066
1076 PAD* FindPadByNumber( const wxString& aPadNumber, PAD* aSearchAfterMe = nullptr ) const;
1077
1085 PAD* GetPad( const VECTOR2I& aPosition, const LSET& aLayerMask = LSET::AllLayersMask() );
1086
1087 std::vector<const PAD*> GetPads( const wxString& aPadNumber, const PAD* aIgnore = nullptr ) const;
1088
1096 unsigned GetPadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH_T(INCLUDE_NPTH) ) const;
1097
1108 unsigned GetUniquePadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH_T(INCLUDE_NPTH) ) const;
1109
1113 std::set<wxString>
1115
1123 wxString GetNextPadNumber( const wxString& aLastPadName ) const;
1124
1127
1132 std::vector<std::set<wxString>>& JumperPadGroups() { return m_jumperPadGroups; }
1133 const std::vector<std::set<wxString>>& JumperPadGroups() const { return m_jumperPadGroups; }
1134
1136 std::optional<const std::set<wxString>> GetJumperPadGroup( const wxString& aPadNumber ) const;
1137
1141 void AutoPositionFields();
1142
1147 wxString GetTypeName() const;
1148
1149 double GetArea( int aPadding = 0 ) const;
1150
1151 KIID GetLink() const { return m_link; }
1152 void SetLink( const KIID& aLink ) { m_link = aLink; }
1153
1154 BOARD_ITEM* Duplicate( bool addToParentGroup, BOARD_COMMIT* aCommit = nullptr ) const override;
1155
1161 BOARD_ITEM* DuplicateItem( bool addToParentGroup, BOARD_COMMIT* aCommit, const BOARD_ITEM* aItem,
1162 bool addToFootprint = false );
1163
1169 void Add3DModel( FP_3DMODEL* a3DModel );
1170
1171 INSPECT_RESULT Visit( INSPECTOR inspector, void* testData,
1172 const std::vector<KICAD_T>& aScanTypes ) override;
1173
1174 wxString GetClass() const override
1175 {
1176 return wxT( "FOOTPRINT" );
1177 }
1178
1179 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
1180
1181 wxString DisambiguateItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
1182
1183 BITMAPS GetMenuImage() const override;
1184
1185 EDA_ITEM* Clone() const override;
1186
1188 void RunOnChildren( const std::function<void( BOARD_ITEM* )>& aFunction, RECURSE_MODE aMode ) const override;
1189
1190 virtual std::vector<int> ViewGetLayers() const override;
1191
1192 double ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const override;
1193
1194 virtual const BOX2I ViewBBox() const override;
1195
1203 static bool IsLibNameValid( const wxString& aName );
1204
1214 static const wxChar* StringLibNameInvalidChars( bool aUserReadable );
1215
1219 bool FootprintNeedsUpdate( const FOOTPRINT* aLibFP, int aCompareFlags = 0,
1220 REPORTER* aReporter = nullptr );
1221
1236 void SetInitialComments( wxArrayString* aInitialComments )
1237 {
1238 delete m_initial_comments;
1239 m_initial_comments = aInitialComments;
1240 }
1241
1248 double CoverageRatio( const GENERAL_COLLECTOR& aCollector ) const;
1249
1250 static double GetCoverageArea( const BOARD_ITEM* aItem, const GENERAL_COLLECTOR& aCollector );
1251
1253 const wxArrayString* GetInitialComments() const { return m_initial_comments; }
1254
1260 const SHAPE_POLY_SET& GetCourtyard( PCB_LAYER_ID aLayer ) const;
1261
1267 const SHAPE_POLY_SET& GetCachedCourtyard( PCB_LAYER_ID aLayer ) const;
1268
1275 void BuildCourtyardCaches( OUTLINE_ERROR_HANDLER* aErrorHandler = nullptr );
1276
1277 // @copydoc BOARD_ITEM::GetEffectiveShape
1278 std::shared_ptr<SHAPE> GetEffectiveShape( PCB_LAYER_ID aLayer = UNDEFINED_LAYER,
1279 FLASHING aFlash = FLASHING::DEFAULT ) const override;
1280
1282 {
1283 return static_cast<EMBEDDED_FILES*>( this );
1284 }
1285
1287 {
1288 return static_cast<const EMBEDDED_FILES*>( this );
1289 }
1290
1294 std::set<KIFONT::OUTLINE_FONT*> GetFonts() const override;
1295
1296 void EmbedFonts() override;
1297
1298 double Similarity( const BOARD_ITEM& aOther ) const override;
1299
1301 void SetStaticComponentClass( const COMPONENT_CLASS* aClass ) const;
1302
1305
1307 const COMPONENT_CLASS* GetComponentClass() const;
1308
1310 wxString GetComponentClassAsString() const;
1311
1313 void RecomputeComponentClass() const;
1314
1316 void InvalidateComponentClassCache() const;
1317
1324 void SetTransientComponentClassNames( const std::unordered_set<wxString>& classNames )
1325 {
1326 m_transientComponentClassNames = classNames;
1327 }
1328
1330 const std::unordered_set<wxString>& GetTransientComponentClassNames()
1331 {
1333 }
1334
1337
1339 void ResolveComponentClassNames( BOARD* aBoard,
1340 const std::unordered_set<wxString>& aComponentClassNames );
1341
1343 void FixUpPadsForBoard( BOARD* aBoard );
1344
1345 bool operator==( const BOARD_ITEM& aOther ) const override;
1346 bool operator==( const FOOTPRINT& aOther ) const;
1347
1348#if defined(DEBUG)
1349 virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
1350#endif
1351
1353 {
1354 bool operator()( const BOARD_ITEM* itemA, const BOARD_ITEM* itemB ) const;
1355 };
1356
1358 {
1359 bool operator()( const PAD* aFirst, const PAD* aSecond ) const;
1360 };
1361 // TODO(JE) padstacks -- this code isn't used anywhere though
1362#if 0
1363 struct cmp_padstack
1364 {
1365 bool operator()( const PAD* aFirst, const PAD* aSecond ) const;
1366 };
1367#endif
1369 {
1370 bool operator()( const ZONE* aFirst, const ZONE* aSecond ) const;
1371 };
1372
1373protected:
1374 virtual void swapData( BOARD_ITEM* aImage ) override;
1375
1377
1378private:
1379 std::deque<PCB_FIELD*> m_fields; // Fields, mapped by name, owned by pointer
1380 std::deque<BOARD_ITEM*> m_drawings; // Drawings in the footprint, owned by pointer
1381 std::deque<PAD*> m_pads; // Pads, owned by pointer
1382 std::vector<ZONE*> m_zones; // Rule area zones, owned by pointer
1383 std::deque<PCB_GROUP*> m_groups; // Groups, owned by pointer
1384 std::deque<PCB_POINT*> m_points; // Points, owned by pointer
1385
1386 EDA_ANGLE m_orient; // Orientation
1387 VECTOR2I m_pos; // Position of footprint on the board in internal units.
1388 LIB_ID m_fpid; // The #LIB_ID of the FOOTPRINT.
1389 int m_attributes; // Flag bits (see FOOTPRINT_ATTR_T)
1390 int m_fpStatus; // For autoplace: flags (LOCKED, FIELDS_AUTOPLACED)
1392
1395
1396 // Bounding box caching strategy:
1397 // While we attempt to notice the low-hanging fruit operations and update the bounding boxes
1398 // accordingly, we rely mostly on a "if anything changed then the caches are stale" approach.
1399 // We implement this by having PCB_BASE_FRAME's OnModify() method increment an operation
1400 // counter, and storing that as a timestamp for the various caches.
1401 // This means caches will get regenerated often -- but still far less often than if we had no
1402 // caches at all. The principal opitmization would be to change to dirty flag and make sure
1403 // that any edit that could affect the bounding boxes (including edits to the footprint
1404 // children) marked the bounding boxes dirty. It would definitely be faster -- but also more
1405 // fragile.
1406 mutable std::mutex m_geometry_cache_mutex;
1407 mutable std::unique_ptr<FOOTPRINT_GEOMETRY_CACHE_DATA> m_geometry_cache;
1408
1409 // A list of pad groups, each of which is allowed to short nets within their group.
1410 // A pad group is a comma-separated list of pad numbers.
1411 std::vector<wxString> m_netTiePadGroups;
1412
1413 // A list of 1:N footprint item to allowed net numbers
1414 std::map<const BOARD_ITEM*, std::set<int>> m_netTieCache;
1415
1418 std::vector<std::set<wxString>> m_jumperPadGroups;
1419
1423
1426
1427 // Optional overrides
1429 std::optional<int> m_clearance;
1430 std::optional<int> m_solderMaskMargin; // Solder mask margin
1431 std::optional<int> m_solderPasteMargin; // Solder paste margin absolute value
1432 std::optional<double> m_solderPasteMarginRatio; // Solder mask margin ratio of pad size
1433 // The final margin is the sum of these 2 values
1434
1435 LSET m_stackupLayers; // Layers in the stackup
1436 FOOTPRINT_STACKUP m_stackupMode; // Stackup mode for this footprint
1437 LSET m_privateLayers; // Layers visible only in the footprint editor
1438
1439 wxString m_libDescription; // File name and path for documentation file.
1440 wxString m_keywords; // Search keywords to find footprint in library.
1441 KIID_PATH m_path; // Path to associated symbol ([sheetUUID, .., symbolUUID]).
1442 wxString m_sheetname; // Name of the sheet containing the symbol for this footprint
1443 wxString m_sheetfile; // File of the sheet containing the symbol for this footprint
1444 wxString m_filters; // Footprint filters from symbol
1446 int m_arflag; // Use to trace ratsnest and auto routing.
1447 KIID m_link; // Temporary logical link used during editing
1448
1449 std::vector<FP_3DMODEL> m_3D_Drawings; // 3D models.
1450
1451 std::unique_ptr<EXTRUDED_3D_BODY> m_extrudedBody; // nullptr = disabled
1452
1453 wxArrayString* m_initial_comments; // s-expression comments in the footprint,
1454 // lazily allocated only if needed for speed
1455
1456 mutable std::unique_ptr<FOOTPRINT_COURTYARD_CACHE_DATA> m_courtyard_cache;
1457 mutable std::mutex m_courtyard_cache_mutex;
1458
1459 std::unordered_set<wxString> m_transientComponentClassNames;
1460 std::unique_ptr<COMPONENT_CLASS_CACHE_PROXY> m_componentClassCacheProxy;
1461
1462 // Optional unit mapping information for multi-unit symbols
1463 std::vector<FP_UNIT_INFO> m_unitInfo;
1464
1465 std::vector<SEARCH_TERM> m_searchTerms;
1466};
1467
1468#endif // FOOTPRINT_H
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
std::map< wxString, ValueType, DETAIL::CASE_INSENSITIVE_COMPARER > CASE_INSENSITIVE_MAP
BOARD_ITEM_CONTAINER(BOARD_ITEM *aParent, KICAD_T aType)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:86
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition board_item.h:268
friend class BOARD
Definition board_item.h:494
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:323
constexpr const Vec GetCenter() const
Definition box2.h:230
A lightweight representation of a component class.
Implement a canvas based on a wxGLCanvas.
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:100
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:112
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:41
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:114
virtual void SetText(const wxString &aText)
Definition eda_text.cpp:269
EMBEDDED_FILES()=default
bool operator==(const EXTRUDED_3D_BODY &aOther) const
Definition footprint.h:130
KIGFX::COLOR4D m_color
Definition footprint.h:110
VECTOR3D m_offset
Definition footprint.h:116
EXTRUDED_3D_BODY()=default
PCB_LAYER_ID m_layer
Definition footprint.h:109
static KIGFX::COLOR4D GetDefaultColor(EXTRUSION_MATERIAL aMaterial)
Definition footprint.h:118
VECTOR3D m_rotation
Definition footprint.h:115
static uint32_t PackColorKey(const KIGFX::COLOR4D &aColor)
Definition footprint.h:137
VECTOR3D m_scale
Definition footprint.h:114
EXTRUSION_MATERIAL m_material
Definition footprint.h:111
Variant information for a footprint.
Definition footprint.h:217
wxString GetName() const
Definition footprint.h:227
FOOTPRINT_VARIANT(const wxString &aName=wxEmptyString)
Definition footprint.h:219
bool HasFieldValue(const wxString &aFieldName) const
Definition footprint.h:264
bool m_excludedFromPosFiles
Definition footprint.h:284
void SetExcludedFromPosFiles(bool aExclude)
Definition footprint.h:237
wxString GetFieldValue(const wxString &aFieldName) const
Get a field value override for this variant.
Definition footprint.h:244
void SetName(const wxString &aName)
Definition footprint.h:228
const std::map< wxString, wxString > & GetFields() const
Definition footprint.h:269
bool GetExcludedFromBOM() const
Definition footprint.h:233
bool operator==(const FOOTPRINT_VARIANT &aOther) const
Definition footprint.h:271
void SetDNP(bool aDNP)
Definition footprint.h:231
bool GetExcludedFromPosFiles() const
Definition footprint.h:236
bool GetDNP() const
Definition footprint.h:230
std::map< wxString, wxString > m_fields
Field value overrides for this variant.
Definition footprint.h:285
void SetFieldValue(const wxString &aFieldName, const wxString &aValue)
Set a field value override for this variant.
Definition footprint.h:259
void SetExcludedFromBOM(bool aExclude)
Definition footprint.h:234
bool FixUuids()
Old footprints do not always have a valid UUID (some can be set to null uuid) However null UUIDs,...
bool GetDuplicatePadNumbersAreJumpers() const
Definition footprint.h:1125
const CASE_INSENSITIVE_MAP< FOOTPRINT_VARIANT > & GetVariants() const
Get all variants.
Definition footprint.h:1021
std::optional< int > GetClearanceOverrides(wxString *aSource) const
Return any local clearance overrides set in the "classic" (ie: pre-rule) system.
Definition footprint.h:533
void EmbedFonts() override
bool AllowSolderMaskBridges() const
Definition footprint.h:501
void SetPosition(const VECTOR2I &aPos) override
void SetFPID(const LIB_ID &aFPID)
Definition footprint.h:430
LIB_ID m_fpid
Definition footprint.h:1388
wxString GetLibDescription() const
Definition footprint.h:446
ZONE_CONNECTION GetLocalZoneConnection() const
Definition footprint.h:477
void SetLink(const KIID &aLink)
Definition footprint.h:1152
KIID_PATH m_path
Definition footprint.h:1441
std::deque< BOARD_ITEM * > m_drawings
Definition footprint.h:1380
void SetStackupLayers(LSET aLayers)
If the footprint has a non-default stackup, set the layers that should be used for the stackup.
bool IsBoardOnly() const
Definition footprint.h:930
void InvalidateComponentClassCache() const
Forces deferred (on next access) recalculation of the component class for this footprint.
const std::deque< PAD * > & Pads() const
Definition footprint.h:378
bool IsDNP() const
Definition footprint.h:957
void SetLocked(bool isLocked) override
Set the #MODULE_is_LOCKED bit in the m_ModuleStatus.
Definition footprint.h:632
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Definition footprint.h:375
std::vector< PAD * > GetNetTiePads(PAD *aPad) const
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the component.
EDA_ANGLE GetOrientation() const
Definition footprint.h:408
ZONES & Zones()
Definition footprint.h:383
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
std::deque< PCB_POINT * > m_points
Definition footprint.h:1384
void CheckClippedSilk(const std::function< void(BOARD_ITEM *aItemA, BOARD_ITEM *aItemB, const VECTOR2I &aPt)> &aErrorHandler)
std::unique_ptr< EXTRUDED_3D_BODY > m_extrudedBody
Definition footprint.h:1451
void Remove(BOARD_ITEM *aItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
void SetIsPlaced(bool isPlaced)
Definition footprint.h:646
ZONE_CONNECTION m_zoneConnection
Definition footprint.h:1428
int GetNextFieldOrdinal() const
Return the next ordinal for a user field for this footprint.
PCB_POINTS & Points()
Definition footprint.h:389
static double GetCoverageArea(const BOARD_ITEM *aItem, const GENERAL_COLLECTOR &aCollector)
bool IsExcludedFromBOM() const
Definition footprint.h:948
void SetOrientation(const EDA_ANGLE &aNewAngle)
void SetFlag(int aFlag)
Definition footprint.h:504
std::optional< double > m_solderPasteMarginRatio
Definition footprint.h:1432
void SetDNP(bool aDNP=true)
Definition footprint.h:958
void SetAllowSolderMaskBridges(bool aAllow)
Definition footprint.h:502
void RecomputeComponentClass() const
Forces immediate recalculation of the component class for this footprint.
std::vector< ZONE * > m_zones
Definition footprint.h:1382
static bool IsLibNameValid(const wxString &aName)
Test for validity of a name of a footprint to be used in a footprint library ( no spaces,...
void SetStackupMode(FOOTPRINT_STACKUP aMode)
Set the stackup mode for this footprint.
unsigned GetPadCount(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the number of pads.
void SetLocalSolderPasteMarginRatio(std::optional< double > aRatio)
Definition footprint.h:474
std::vector< SEARCH_TERM > & GetSearchTerms() override
void IncrementFlag()
Definition footprint.h:505
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
std::optional< int > m_clearance
Definition footprint.h:1429
bool m_duplicatePadNumbersAreJumpers
Flag that this footprint should automatically treat sets of two or more pads with the same number as ...
Definition footprint.h:1422
void CheckNetTies(const std::function< void(const BOARD_ITEM *aItem, const BOARD_ITEM *bItem, const BOARD_ITEM *cItem, const VECTOR2I &)> &aErrorHandler)
Check for un-allowed shorting of pads in net-tie footprints.
void CheckPads(UNITS_PROVIDER *aUnitsProvider, const std::function< void(const PAD *, int, const wxString &)> &aErrorHandler)
Run non-board-specific DRC checks on footprint's pads.
void SetExcludedFromBOM(bool aExclude=true)
Definition footprint.h:949
wxString GetSheetname() const
Definition footprint.h:455
int m_fpStatus
Definition footprint.h:1390
void SetPath(const KIID_PATH &aPath)
Definition footprint.h:453
std::set< wxString > GetUniquePadNumbers(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the names of the unique, non-blank pads.
void SetFilters(const wxString &aFilters)
Definition footprint.h:462
void SetKeywords(const wxString &aKeywords)
Definition footprint.h:450
void SetStaticComponentClass(const COMPONENT_CLASS *aClass) const
Sets the component class object pointer for this footprint.
const DRAWINGS & GraphicalItems() const
Definition footprint.h:381
wxString DisambiguateItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
void SetInitialComments(wxArrayString *aInitialComments)
Take ownership of caller's heap allocated aInitialComments block.
Definition footprint.h:1236
int m_attributes
Definition footprint.h:1389
PCB_LAYER_ID GetSide() const
Use instead of IsFlipped() when you also need to account for unsided footprints (those purely on user...
wxString GetLibNickname() const override
Definition footprint.h:441
const BOX2I GetLayerBoundingBox(const LSET &aLayers) const
Return the bounding box of the footprint on a given set of layers.
std::vector< FP_3DMODEL > m_3D_Drawings
Definition footprint.h:1449
double CoverageRatio(const GENERAL_COLLECTOR &aCollector) const
Calculate the ratio of total area of the footprint pads and graphical items to the area of the footpr...
void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction, RECURSE_MODE aMode) const override
Invoke a function on all children.
bool FootprintNeedsUpdate(const FOOTPRINT *aLibFP, int aCompareFlags=0, REPORTER *aReporter=nullptr)
Return true if a board footprint differs from the library version.
bool m_allowMissingCourtyard
Definition footprint.h:1424
const std::vector< FP_UNIT_INFO > & GetUnitInfo() const
Definition footprint.h:928
const EXTRUDED_3D_BODY * GetExtrudedBody() const
Definition footprint.h:398
std::unordered_set< wxString > m_transientComponentClassNames
Definition footprint.h:1459
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
void SetAttributes(int aAttributes)
Definition footprint.h:496
void SetSheetfile(const wxString &aSheetfile)
Definition footprint.h:459
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
std::optional< int > GetLocalSolderPasteMargin() const
Definition footprint.h:470
std::unique_ptr< COMPONENT_CLASS_CACHE_PROXY > m_componentClassCacheProxy
Definition footprint.h:1460
wxArrayString * m_initial_comments
Definition footprint.h:1453
EDA_ITEM * Clone() const override
Invoke a function on all children.
BOX2I GetFpPadsLocalBbox() const
Return the bounding box containing pads when the footprint is on the front side, orientation 0,...
LIB_ID GetLIB_ID() const override
Definition footprint.h:439
std::deque< PCB_FIELD * > m_fields
Definition footprint.h:1379
std::mutex m_geometry_cache_mutex
Definition footprint.h:1406
PCB_FIELD & Value()
read/write accessors:
Definition footprint.h:865
const EMBEDDED_FILES * GetEmbeddedFiles() const
Definition footprint.h:1286
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
std::optional< int > m_solderPasteMargin
Definition footprint.h:1431
const std::vector< std::set< wxString > > & JumperPadGroups() const
Definition footprint.h:1133
void SetFileFormatVersionAtLoad(int aVersion)
Definition footprint.h:1064
std::mutex m_courtyard_cache_mutex
Definition footprint.h:1457
void SetExcludedFromPosFiles(bool aExclude=true)
Definition footprint.h:940
void SetOrientationDegrees(double aOrientation)
Definition footprint.h:420
bool HasExtrudedBody() const
Definition footprint.h:397
std::optional< const std::set< wxString > > GetJumperPadGroup(const wxString &aPadNumber) const
Retrieves the jumper group containing the specified pad number, if one exists.
std::map< wxString, int > MapPadNumbersToNetTieGroups() const
std::optional< int > GetLocalClearance() const
Definition footprint.h:464
double Similarity(const BOARD_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void TransformFPTextToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc) const
This function is the same as TransformFPShapesToPolySet but only generates text.
Definition footprint.h:774
const FOOTPRINT_VARIANT * GetVariant(const wxString &aVariantName) const
Get a variant by name.
void MoveAnchorPosition(const VECTOR2I &aMoveVector)
Move the reference point of the footprint.
std::vector< std::set< wxString > > & JumperPadGroups()
Each jumper pad group is a set of pad numbers that should be treated as internally connected.
Definition footprint.h:1132
void SetDuplicatePadNumbersAreJumpers(bool aEnabled)
Definition footprint.h:1126
bool m_allowSolderMaskBridges
Definition footprint.h:1425
FOOTPRINT & operator=(const FOOTPRINT &aOther)
bool HasField(const wxString &aFieldName) const
PCB_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this footprint.
void TransformPadsToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Generate pads shapes on layer aLayer as polygons and adds these polygons to aBuffer.
void ClearExtrudedBody()
Definition footprint.h:402
double GetOrientationDegrees() const
Definition footprint.h:424
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
std::deque< PAD * > & Pads()
Definition footprint.h:377
void ResolveComponentClassNames(BOARD *aBoard, const std::unordered_set< wxString > &aComponentClassNames)
Resolves a set of component class names to this footprint's actual component class.
EXTRUDED_3D_BODY & EnsureExtrudedBody()
wxString GetDesc() override
Definition footprint.h:442
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
int GetAttributes() const
Definition footprint.h:495
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
std::optional< int > GetLocalClearance(wxString *aSource) const
Definition footprint.h:519
const COMPONENT_CLASS * GetComponentClass() const
Returns the component class for this footprint.
void SetLocalZoneConnection(ZONE_CONNECTION aType)
Definition footprint.h:476
BOARD_ITEM * DuplicateItem(bool addToParentGroup, BOARD_COMMIT *aCommit, const BOARD_ITEM *aItem, bool addToFootprint=false)
Duplicate a given item within the footprint, optionally adding it to the board.
FOOTPRINT(BOARD *parent)
Definition footprint.cpp:84
void ClearNetTiePadGroups()
Definition footprint.h:552
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition footprint.h:417
LSET GetPrivateLayers() const
Definition footprint.h:317
void SetExtrudedBody(std::unique_ptr< EXTRUDED_3D_BODY > aBody)
wxString GetFPIDAsString() const
Definition footprint.h:435
CASE_INSENSITIVE_MAP< FOOTPRINT_VARIANT > m_variants
Variant data for this footprint, keyed by variant name.
Definition footprint.h:1394
wxString GetValueAsString() const
Definition footprint.h:859
bool AllowMissingCourtyard() const
Definition footprint.h:498
void DeleteVariant(const wxString &aVariantName)
Delete a variant by name.
const ZONES & Zones() const
Definition footprint.h:384
wxString GetComponentClassAsString() const
Used for display in the properties panel.
bool IsFlipped() const
Definition footprint.h:602
wxString GetSheetfile() const
Definition footprint.h:458
int GetPinCount() override
The pin count for symbols or the unique pad count for footprints.
Definition footprint.h:443
SHAPE_POLY_SET GetBoundingHull() const
Return a bounding polygon for the shapes and pads in the footprint.
void TransformFPShapesToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool aIncludeText=true, bool aIncludeShapes=true, bool aIncludePrivateItems=false) const
Generate shapes of graphic items (outlines) on layer aLayer as polygons and adds these polygons to aB...
wxString GetTypeName() const
Get the type of footprint.
bool NeedsPlaced() const
Definition footprint.h:654
const std::vector< wxString > & GetNetTiePadGroups() const
Definition footprint.h:550
const LIB_ID & GetFPID() const
Definition footprint.h:429
const std::unordered_set< wxString > & GetTransientComponentClassNames()
Gets the transient component class names.
Definition footprint.h:1330
void SetReference(const wxString &aReference)
Definition footprint.h:835
bool IsLocked() const override
Definition footprint.h:622
std::vector< FP_UNIT_INFO > m_unitInfo
Definition footprint.h:1463
const GROUPS & Groups() const
Definition footprint.h:387
bool IsExcludedFromPosFiles() const
Definition footprint.h:939
void SetLayerAndFlip(PCB_LAYER_ID aLayer)
Used as Layer property setter – performs a flip if necessary to set the footprint layer.
wxString GetFieldValueForVariant(const wxString &aVariantName, const wxString &aFieldName) const
Get a field value for a specific variant.
unsigned GetUniquePadCount(INCLUDE_NPTH_T aIncludeNPTH=INCLUDE_NPTH_T(INCLUDE_NPTH)) const
Return the number of unique non-blank pads.
void AddNetTiePadGroup(const wxString &aGroup)
Definition footprint.h:557
bool LegacyPadsLocked() const
Definition footprint.h:663
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
LSET m_privateLayers
Definition footprint.h:1437
const std::set< int > & GetNetTieCache(const BOARD_ITEM *aItem) const
Get the set of net codes that are allowed to connect to a footprint item.
Definition footprint.h:724
const LSET & GetStackupLayers() const
Definition footprint.h:493
const std::deque< PCB_FIELD * > & GetFields() const
Return a reference to the deque holding the footprint's fields.
Definition footprint.h:903
int GetLikelyAttribute() const
Returns the most likely attribute based on pads Either FP_THROUGH_HOLE/FP_SMD/OTHER(0)
std::deque< PCB_GROUP * > m_groups
Definition footprint.h:1383
void Move(const VECTOR2I &aMoveVector) override
Move this object.
static bool ClassOf(const EDA_ITEM *aItem)
Definition footprint.h:309
wxString m_libDescription
Definition footprint.h:1439
bool HitTestOnLayer(const VECTOR2I &aPosition, PCB_LAYER_ID aLayer, int aAccuracy=0) const
Test if the point hits one or more of the footprint elements on a given layer.
VECTOR2I m_pos
Definition footprint.h:1387
void ApplyDefaultSettings(const BOARD &board, bool aStyleFields, bool aStyleText, bool aStyleShapes, bool aStyleDimensions, bool aStyleBarcodes)
Apply default board settings to the footprint field text properties.
void ClearTransientComponentClassNames()
Remove the transient component class names.
Definition footprint.h:1336
ZONE_CONNECTION GetZoneConnectionOverrides(wxString *aSource) const
Definition footprint.h:538
std::vector< wxString > m_netTiePadGroups
Definition footprint.h:1411
void InvalidateGeometryCaches()
Resets the caches for this footprint, for example if it was modified via the API.
virtual std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
std::set< KIFONT::OUTLINE_FONT * > GetFonts() const override
Get a list of outline fonts referenced in the footprint.
void Add3DModel(FP_3DMODEL *a3DModel)
Add a3DModel definition to the end of the 3D model list.
void SetValue(const wxString &aValue)
Definition footprint.h:856
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.
FOOTPRINT_STACKUP m_stackupMode
Definition footprint.h:1436
PCB_FIELD & Reference()
Definition footprint.h:866
std::vector< std::set< wxString > > m_jumperPadGroups
A list of jumper pad groups, each of which is a set of pad numbers that should be jumpered together (...
Definition footprint.h:1418
const PCB_FIELD & Value() const
The const versions to keep the compiler happy.
Definition footprint.h:869
wxString GetReferenceAsString() const
Definition footprint.h:838
wxString m_sheetfile
Definition footprint.h:1443
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars for this footprint.
std::optional< int > m_solderMaskMargin
Definition footprint.h:1430
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
void SetUnitInfo(const std::vector< FP_UNIT_INFO > &aUnits)
Definition footprint.h:927
std::vector< const PAD * > GetPads(const wxString &aPadNumber, const PAD *aIgnore=nullptr) const
void AutoPositionFields()
Position Reference and Value fields at the top and bottom of footprint's bounding box.
void addMandatoryFields()
wxString m_keywords
Definition footprint.h:1440
const PCB_FIELD & Reference() const
Definition footprint.h:870
void SetTransientComponentClassNames(const std::unordered_set< wxString > &classNames)
Sets the transient component class names.
Definition footprint.h:1324
void ClearAllNets()
Clear (i.e.
std::deque< PAD * > m_pads
Definition footprint.h:1381
bool HasThroughHolePads() const
const PCB_POINTS & Points() const
Definition footprint.h:390
void BuildCourtyardCaches(OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr)
Build complex polygons of the courtyard areas from graphic items on the courtyard layers.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
EDA_ANGLE m_orient
Definition footprint.h:1386
bool HitTestAccurate(const VECTOR2I &aPosition, int aAccuracy=0) const
Test if a point is inside the bounding polygon of the footprint.
bool IsNetTie() const
Definition footprint.h:508
bool GetDNPForVariant(const wxString &aVariantName) const
Get the DNP status for a specific variant.
wxString GetClass() const override
Return the class name.
Definition footprint.h:1174
void SetVariant(const FOOTPRINT_VARIANT &aVariant)
Add or update a variant.
std::unique_ptr< FOOTPRINT_COURTYARD_CACHE_DATA > m_courtyard_cache
Definition footprint.h:1456
void IncrementReference(int aDelta)
Bump the current reference by aDelta.
int GetFileFormatVersionAtLoad() const
Definition footprint.h:1065
std::optional< double > GetLocalSolderPasteMarginRatio() const
Definition footprint.h:473
EXTRUDED_3D_BODY * GetExtrudedBody()
Definition footprint.h:399
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
KIID m_link
Definition footprint.h:1447
GROUPS & Groups()
Definition footprint.h:386
wxString GetFilters() const
Definition footprint.h:461
void SetSheetname(const wxString &aSheetname)
Definition footprint.h:456
const wxArrayString * GetInitialComments() const
Return the initial comments block or NULL if none, without transfer of ownership.
Definition footprint.h:1253
KIID GetLink() const
Definition footprint.h:1151
void SetAllowMissingCourtyard(bool aAllow)
Definition footprint.h:499
void BuildNetTieCache()
Cache the pads that are allowed to connect to each other in the footprint.
bool IsConflicting() const
std::vector< FP_3DMODEL > & Models()
Definition footprint.h:394
BOARD_ITEM * Duplicate(bool addToParentGroup, BOARD_COMMIT *aCommit=nullptr) const override
Create a copy of this BOARD_ITEM.
const SHAPE_POLY_SET & GetCachedCourtyard(PCB_LAYER_ID aLayer) const
Return the cached courtyard area.
std::deque< PCB_FIELD * > & GetFields()
Definition footprint.h:904
wxString GetName() const override
Definition footprint.h:440
static const wxChar * StringLibNameInvalidChars(bool aUserReadable)
Test for validity of the name in a library of the footprint ( no spaces, dir separators ....
void SetLibDescription(const wxString &aDesc)
Definition footprint.h:447
bool TextOnly() const
const wxString & GetValue() const
Definition footprint.h:851
const COMPONENT_CLASS * GetStaticComponentClass() const
Returns the component class for this footprint.
void FixUpPadsForBoard(BOARD *aBoard)
Used post-loading of a footprint to adjust the layers on pads to match board inner layers.
bool GetExcludedFromPosFilesForVariant(const wxString &aVariantName) const
Get the exclude-from-position-files status for a specific variant.
void CheckShortingPads(const std::function< void(const PAD *, const PAD *, int aErrorCode, const VECTOR2I &)> &aErrorHandler)
Check for overlapping, different-numbered, non-net-tie pads.
FOOTPRINT_VARIANT * AddVariant(const wxString &aVariantName)
Add a new variant with the given name.
double GetArea(int aPadding=0) const
void SetNeedsPlaced(bool needsPlaced)
Definition footprint.h:655
wxString m_filters
Definition footprint.h:1444
const wxString & GetReference() const
Definition footprint.h:829
std::unique_ptr< FOOTPRINT_GEOMETRY_CACHE_DATA > m_geometry_cache
Definition footprint.h:1407
bool GetExcludedFromBOMForVariant(const wxString &aVariantName) const
Get the exclude-from-BOM status for a specific variant.
void CopyFrom(const BOARD_ITEM *aOther) override
void CheckNetTiePadGroups(const std::function< void(const wxString &)> &aErrorHandler)
Sanity check net-tie pad groups.
void SetFPIDAsString(const wxString &aFPID)
Definition footprint.h:436
void RenameVariant(const wxString &aOldName, const wxString &aNewName)
Rename a variant.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
void SetBoardOnly(bool aIsBoardOnly=true)
Definition footprint.h:931
const std::vector< FP_3DMODEL > & Models() const
Definition footprint.h:395
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
Definition footprint.h:468
timestamp_t m_lastEditTime
Definition footprint.h:1445
PAD * GetPad(const VECTOR2I &aPosition, const LSET &aLayerMask=LSET::AllLayersMask())
Get a pad at aPosition on aLayerMask in the footprint.
const SHAPE_POLY_SET & GetCourtyard(PCB_LAYER_ID aLayer) const
Used in DRC to test the courtyard area (a complex polygon).
int GetFlag() const
Definition footprint.h:506
std::map< const BOARD_ITEM *, std::set< int > > m_netTieCache
Definition footprint.h:1414
wxString m_sheetname
Definition footprint.h:1442
LSET m_stackupLayers
Definition footprint.h:1435
int m_fileFormatVersionAtLoad
Definition footprint.h:1391
void SetLocalClearance(std::optional< int > aClearance)
Definition footprint.h:465
void SetPrivateLayers(const LSET &aLayers)
Adds an item to the container.
Definition footprint.h:318
const KIID_PATH & GetPath() const
Definition footprint.h:452
std::optional< int > GetLocalSolderMaskMargin() const
Definition footprint.h:467
void SetLocalSolderPasteMargin(std::optional< int > aMargin)
Definition footprint.h:471
wxString GetKeywords() const
Definition footprint.h:449
bool operator==(const BOARD_ITEM &aOther) const override
EMBEDDED_FILES * GetEmbeddedFiles() override
Definition footprint.h:1281
void CheckFootprintAttributes(const std::function< void(const wxString &)> &aErrorHandler)
Test if footprint attributes for type (SMD/Through hole/Other) match the expected type based on the p...
FOOTPRINT_STACKUP GetStackupMode() const
Definition footprint.h:486
virtual void swapData(BOARD_ITEM *aImage) override
wxString GetNextPadNumber(const wxString &aLastPadName) const
Return the next available pad number in the footprint.
bool IsPlaced() const
Definition footprint.h:645
bool HasVariant(const wxString &aVariantName) const
Check if a variant exists.
VECTOR2I GetPosition() const override
Definition footprint.h:405
DRAWINGS & GraphicalItems()
Definition footprint.h:380
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
PAD * FindPadByNumber(const wxString &aPadNumber, PAD *aSearchAfterMe=nullptr) const
Return a PAD with a matching number.
std::vector< SEARCH_TERM > m_searchTerms
Definition footprint.h:1465
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
bool operator==(const FP_3DMODEL &aOther) const
Definition footprint.h:178
VECTOR3D m_Offset
3D model offset (mm)
Definition footprint.h:173
double m_Opacity
Definition footprint.h:174
VECTOR3D m_Rotation
3D model rotation (degrees)
Definition footprint.h:172
VECTOR3D m_Scale
3D model scaling factor (dimensionless)
Definition footprint.h:171
wxString m_Filename
The 3D shape filename in 3D library.
Definition footprint.h:175
bool m_Show
Include model in rendering.
Definition footprint.h:176
Used when the right click button is pressed, or when the select tool is in effect.
Definition collectors.h:207
Class OUTLINE_FONT implements outline font drawing.
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
double r
Red component.
Definition color4d.h:393
double g
Green component.
Definition color4d.h:394
double a
Alpha component.
Definition color4d.h:396
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:402
double b
Blue component.
Definition color4d.h:395
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:67
Definition kiid.h:48
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
A mix-in to provide polymorphism between items stored in libraries (symbols, aliases and footprints).
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition richio.h:66
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
static const LSET & AllLayersMask()
Definition lset.cpp:641
EDA_MSG_PANEL items for displaying messages.
Definition msgpanel.h:54
Definition pad.h:55
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
Definition pcb_point.h:43
A pure virtual class used to derive REPORTER objects from.
Definition reporter.h:75
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
An abstract shape on 2D plane.
Definition shape.h:126
Handle a list of polygons defining a copper zone.
Definition zone.h:74
const std::function< void(const wxString &msg, BOARD_ITEM *itemA, BOARD_ITEM *itemB, const VECTOR2I &pt)> OUTLINE_ERROR_HANDLER
#define _(s)
@ DEGREES_T
Definition eda_angle.h:31
RECURSE_MODE
Definition eda_item.h:52
INSPECT_RESULT
Definition eda_item.h:46
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
Definition eda_item.h:93
EXTRUSION_MATERIAL
Definition footprint.h:95
INCLUDE_NPTH_T
Definition footprint.h:73
@ INCLUDE_NPTH
Definition footprint.h:75
@ DO_NOT_INCLUDE_NPTH
Definition footprint.h:74
FOOTPRINT_ATTR_T
The set of attributes allowed within a FOOTPRINT, using FOOTPRINT::SetAttributes() and FOOTPRINT::Get...
Definition footprint.h:84
@ FP_SMD
Definition footprint.h:86
@ FP_DNP
Definition footprint.h:91
@ FP_EXCLUDE_FROM_POS_FILES
Definition footprint.h:87
@ FP_BOARD_ONLY
Definition footprint.h:89
@ FP_EXCLUDE_FROM_BOM
Definition footprint.h:88
@ FP_JUST_ADDED
Definition footprint.h:90
@ FP_THROUGH_HOLE
Definition footprint.h:85
#define FP_is_PLACED
In autoplace: footprint automatically placed.
Definition footprint.h:617
#define FP_is_LOCKED
footprint LOCKED: no autoplace allowed
Definition footprint.h:616
#define FP_PADS_are_LOCKED
Definition footprint.h:619
FOOTPRINT_STACKUP
Definition footprint.h:145
@ EXPAND_INNER_LAYERS
The 'normal' stackup handling, where there is a single inner layer (In1) and rule areas using it expa...
Definition footprint.h:150
@ CUSTOM_LAYERS
Stackup handling where the footprint can have any number of copper layers, and objects on those layer...
Definition footprint.h:155
#define FP_to_PLACE
In autoplace: footprint waiting for autoplace.
Definition footprint.h:618
uint32_t timestamp_t
timestamp_t is our type to represent unique IDs for all kinds of elements; historically simply the ti...
Definition kiid.h:45
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition layer_ids.h:184
@ DEFAULT
Flashing follows connectivity.
Definition layer_ids.h:185
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ B_Cu
Definition layer_ids.h:65
@ UNDEFINED_LAYER
Definition layer_ids.h:61
FLIP_DIRECTION
Definition mirror.h:27
The Cairo implementation of the graphics abstraction layer.
Definition eda_group.h:33
std::vector< ZONE * > ZONES
std::deque< PCB_GROUP * > GROUPS
std::deque< BOARD_ITEM * > DRAWINGS
std::deque< PCB_POINT * > PCB_POINTS
std::vector< wxString > m_pins
Definition footprint.h:924
bool operator()(const BOARD_ITEM *itemA, const BOARD_ITEM *itemB) const
bool operator()(const PAD *aFirst, const PAD *aSecond) const
bool operator()(const ZONE *aFirst, const ZONE *aSecond) const
A storage class for 128-bit hash value.
Definition hash_128.h:36
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:83
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687
VECTOR3< double > VECTOR3D
Definition vector3.h:230
ZONE_CONNECTION
How pads are covered by copper in zone.
Definition zones.h:47