27#include <wx/statline.h>
28#include <wx/checkbox.h>
30#include <wx/radiobut.h>
62 bool aShowCopyLineWidthOption,
bool aShowCenterlineOption,
63 bool aShowBoundingHullOption ) :
64 DIALOG_SHIM( aParent, wxID_ANY,
_(
"Conversion Settings" ), wxDefaultPosition,
65 wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ),
71 aShowCopyLineWidthOption,
72 aShowCenterlineOption,
73 aShowBoundingHullOption ) );
75 wxBoxSizer* mainSizer =
new wxBoxSizer( wxVERTICAL );
76 wxBoxSizer* topSizer =
new wxBoxSizer( wxVERTICAL );
77 SetSizer( mainSizer );
79 m_rbMimicLineWidth =
new wxRadioButton(
this, wxID_ANY,
_(
"Copy line width of first object" ) );
81 if( aShowCopyLineWidthOption )
86 m_rbCenterline =
new wxRadioButton(
this, wxID_ANY,
_(
"Use centerlines" ) );
88 if( aShowCenterlineOption )
90 topSizer->AddSpacer( 6 );
98 m_rbBoundingHull =
new wxRadioButton(
this, wxID_ANY,
_(
"Create bounding hull" ) );
100 m_gapLabel =
new wxStaticText(
this, wxID_ANY,
_(
"Gap:" ) );
101 m_gapCtrl =
new wxTextCtrl(
this, wxID_ANY );
102 m_gapUnits =
new wxStaticText(
this, wxID_ANY,
_(
"mm" ) );
105 m_widthLabel =
new wxStaticText(
this, wxID_ANY,
_(
"Line width:" ) );
107 m_widthUnits =
new wxStaticText(
this, wxID_ANY,
_(
"mm" ) );
110 if( aShowBoundingHullOption )
112 topSizer->AddSpacer( 6 );
115 wxBoxSizer* hullParamsSizer =
new wxBoxSizer( wxHORIZONTAL );
116 hullParamsSizer->Add(
m_gapLabel, 0, wxALIGN_CENTRE_VERTICAL, 5 );
117 hullParamsSizer->Add(
m_gapCtrl, 1, wxALIGN_CENTRE_VERTICAL|wxLEFT|wxRIGHT, 3 );
118 hullParamsSizer->Add(
m_gapUnits, 0, wxALIGN_CENTRE_VERTICAL, 5 );
119 hullParamsSizer->AddSpacer( 18 );
120 hullParamsSizer->Add(
m_widthLabel, 0, wxALIGN_CENTRE_VERTICAL, 5 );
121 hullParamsSizer->Add(
m_widthCtrl, 1, wxALIGN_CENTRE_VERTICAL|wxLEFT|wxRIGHT, 3 );
122 hullParamsSizer->Add(
m_widthUnits, 0, wxALIGN_CENTRE_VERTICAL, 5 );
124 topSizer->AddSpacer( 2 );
125 topSizer->Add( hullParamsSizer, 0, wxLEFT, 26 );
127 topSizer->AddSpacer( 15 );
136 m_cbDeleteOriginals =
new wxCheckBox(
this, wxID_ANY,
_(
"Delete source objects after conversion" ) );
139 mainSizer->Add( topSizer, 1, wxALL|wxEXPAND, 10 );
141 wxBoxSizer* buttonsSizer =
new wxBoxSizer( wxHORIZONTAL );
142 buttonsSizer->AddStretchSpacer();
144 wxStdDialogButtonSizer* sdbSizer =
new wxStdDialogButtonSizer();
145 wxButton* sdbSizerOK =
new wxButton(
this, wxID_OK );
146 sdbSizer->AddButton( sdbSizerOK );
147 wxButton* sdbSizerCancel =
new wxButton(
this, wxID_CANCEL );
148 sdbSizer->AddButton( sdbSizerCancel );
151 buttonsSizer->Add( sdbSizer, 1, 0, 5 );
152 mainSizer->Add( buttonsSizer, 0, wxALL|wxEXPAND, 5 );
236 m_selectionTool( nullptr ),
257 m_frame = getEditFrame<PCB_BASE_FRAME>();
265 static const std::vector<KICAD_T> segmentTypes = {
PCB_TRACE_T,
279 static const std::vector<KICAD_T> polyTypes = {
PCB_ZONE_T,
292 auto canCreatePoly = shapes || anyPolys || anyTracks;
297 canCreatePoly = shapes || anyPolys || anyTracks || anyPads;
299 auto canCreateLines = anyPolys;
300 auto canCreateTracks = anyPolys || graphicToTrack;
301 auto canCreate = canCreatePoly
347 std::vector<SHAPE_POLY_SET> polys;
365 item->ClearTempFlags();
394 for(
int jj = 0; jj < polySet.
HoleCount( ii ); ++jj )
395 polys.back().AddHole( polySet.
Hole( ii, jj ) );
405 if( !getPolys( preflightSettings ) )
416 bool showCopyLineWidth =
true;
424 showCopyLineWidth =
false;
444 if( resolvedSettings.
m_Gap > 0 )
448 if( !getPolys( resolvedSettings ) )
453 msg =
_(
"Resulting polygon would be empty" );
455 msg =
_(
"Objects must form a closed shape" );
474 if( !item->IsBOARD_ITEM() )
488 topLeftItem = candidate;
497 COLOR4D::UNSPECIFIED ) );
502 commit.
Add( graphic );
538 if( ret == wxID_CANCEL )
562 for(
EDA_ITEM* item : selectionCopy )
572 commit.
Push(
_(
"Convert to Polygon" ) );
574 commit.
Push(
_(
"Create Polygon" ) );
579 commit.
Push(
_(
"Convert to Zone" ) );
581 commit.
Push(
_(
"Create Zone" ) );
598 int chainingEpsilon = 100;
604 std::map<VECTOR2I, std::vector<std::pair<int, EDA_ITEM*>>> connections;
605 std::deque<EDA_ITEM*> toCheck;
610 return ( aLeft - aRight ).SquaredEuclideanNorm() <=
SEG::Square( aLimit );
613 auto findInsertionPoint =
616 if( connections.count( aPoint ) )
619 for(
const auto& candidatePair : connections )
621 if( closeEnough( aPoint, candidatePair.first, chainingEpsilon ) )
622 return candidatePair.first;
632 toCheck.push_back( item );
633 connections[findInsertionPoint( seg->A )].emplace_back( std::make_pair( 0, item ) );
634 connections[findInsertionPoint( seg->B )].emplace_back( std::make_pair( 1, item ) );
638 while( !toCheck.empty() )
640 std::vector<BOARD_ITEM*> insertedItems;
642 EDA_ITEM* candidate = toCheck.front();
655 &&
static_cast<PCB_SHAPE*
>( aItem )->GetShape() == SHAPE_T::ARC ) )
676 insertedItems.push_back(
static_cast<BOARD_ITEM*
>( aItem ) );
678 else if( aItem->
IsType( { PCB_SHAPE_LOCATE_BEZIER_T } ) )
682 if( aAnchor == graphic->
GetStart() )
708 insertedItems.push_back(
static_cast<BOARD_ITEM*
>( aItem ) );
712 VECTOR2I& point = ( aAnchor == nextSeg->A ) ? nextSeg->B : nextSeg->A;
717 outline.
Insert( 0, point );
719 insertedItems.push_back(
static_cast<BOARD_ITEM*
>( aItem ) );
733 insert( aItem, aAnchor, aDirection );
738 VECTOR2I nextAnchor = ( aAnchor == anchors->A ) ? anchors->B : anchors->A;
740 for( std::pair<int, EDA_ITEM*> pair : connections[nextAnchor] )
742 if( pair.second == aItem )
745 process( pair.second, nextAnchor, aDirection );
759 insert( candidate, anchors->A,
true );
762 process( candidate, anchors->B,
true );
767 for( std::pair<int, EDA_ITEM*> possibleLeft : connections[anchors->A] )
769 if( possibleLeft.second != candidate )
771 left = possibleLeft.second;
780 || !closeEnough( outline.
GetPoint( 0 ), outline.
GetPoint( -1 ), chainingEpsilon ) )
782 for(
EDA_ITEM* item : insertedItems )
801 insertedItems.clear();
819 switch( item->Type() )
868 switch( item->Type() )
930 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
932 BOARD_ITEM* item = aCollector[i];
934 switch( item->Type() )
937 switch( static_cast<PCB_SHAPE*>( item )->GetShape() )
939 case SHAPE_T::SEGMENT:
942 case SHAPE_T::RECTANGLE:
946 aCollector.Remove( item );
955 aCollector.Remove( item );
960 if( selection.Empty() )
968 switch( aItem->Type() )
971 set = *
static_cast<ZONE*
>( aItem )->Outline();
998 wxFAIL_MSG( wxT(
"Unhandled graphic shape type in PolyToLines - getPolySet" ) );
1004 wxFAIL_MSG( wxT(
"Unhandled type in PolyToLines - getPolySet" ) );
1014 std::vector<SEG> segs;
1017 wxASSERT( aPoly.VertexCount() >= 2 );
1019 for(
int i = 1; i < aPoly.VertexCount(); i++ )
1020 segs.emplace_back(
SEG( aPoly.CVertex( i - 1 ), aPoly.CVertex( i ) ) );
1022 segs.emplace_back(
SEG( aPoly.CVertex( aPoly.VertexCount() - 1 ),
1023 aPoly.CVertex( 0 ) ) );
1038 auto handleGraphicSeg =
1054 commit.Add( track );
1089 if( dlg.ShowModal() != wxID_OK )
1095 if( handleGraphicSeg( item ) )
1100 std::vector<SEG> segs = getSegList( polySet );
1106 for(
SEG& seg : segs )
1115 if( itemWidth && *itemWidth > 0 )
1118 commit.Add( graphic );
1128 for(
SEG& seg : segs )
1138 commit.Add( graphic );
1144 for(
SEG& seg : segs )
1151 commit.Add( track );
1157 if( m_userSettings.m_DeleteOriginals )
1160 m_selectionTool->ClearSelection();
1162 for(
EDA_ITEM* item : selectionCopy )
1166 commit.Push(
_(
"Create Lines" ) );
1177 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1179 BOARD_ITEM* item = aCollector[i];
1181 if( !( item->Type() == PCB_SHAPE_T ||
1182 item->Type() == PCB_TRACE_T ) )
1184 aCollector.Remove( item );
1189 if( !selection.Front()->IsBOARD_ITEM() )
1196 const double offsetRatio = 0.1;
1198 if( std::optional<SEG> seg = getStartEndPoints( source ) )
1203 VECTOR2I normal = ( seg->B - seg->A ).Perpendicular().Resize( offsetRatio * seg->Length() );
1204 mid = seg->Center() +
normal;
1248 commit.Push(
_(
"Create Arc" ) );
1256 switch( aItem->
Type() )
1264 case SHAPE_T::SEGMENT:
1267 case SHAPE_T::BEZIER:
1269 return std::nullopt;
1275 return std::nullopt;
1292 return std::nullopt;
1304 for(
int i = aCollector.
GetCount() - 1; i >= 0; --i )
1306 BOARD_ITEM* item = aCollector[i];
1310 if( !item->IsType( { PCB_PAD_T, PCB_SHAPE_T } ) )
1312 aCollector.
Remove( item );
1325 std::vector<BOARD_ITEM*> items_to_select_on_success;
1330 auto item_modification_handler = [&](
BOARD_ITEM& aItem )
1334 bool any_items_created =
false;
1335 auto item_creation_handler = [&]( std::unique_ptr<BOARD_ITEM> aItem )
1337 any_items_created =
true;
1338 items_to_select_on_success.push_back( aItem.get() );
1339 commit.Add( aItem.release() );
1342 auto item_removal_handler = [&](
BOARD_ITEM& aItem )
1346 if( !aItem.GetParentFootprint() )
1348 commit.Remove( &aItem );
1354 item_creation_handler, item_modification_handler, item_removal_handler );
1381 IsFootprintEditor() ? outset_params_fp_edit : outset_params_pcb_edit;
1385 if( dlg.ShowModal() == wxID_CANCEL )
1396 outset_routine.ProcessItem( *board_item );
1400 m_selectionTool->ClearSelection();
1403 for(
BOARD_ITEM* item : items_to_select_on_success )
1404 m_selectionTool->AddItemToSel( item,
true );
1406 if( any_items_created )
1412 commit.Push( outset_routine.GetCommitDescription() );
1414 if(
const std::optional<wxString> msg = outset_routine.GetStatusMessage() )
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
BASE_SET & reset(size_t pos)
BASE_SET & set(size_t pos)
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
Container for design settings for a BOARD object.
int GetLayerClass(PCB_LAYER_ID aLayer) const
int m_LineThickness[LAYER_CLASS_COUNT]
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
ZONE_SETTINGS & GetDefaultZoneSettings()
Abstract interface for BOARD_ITEMs capable of storing other items inside.
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 STROKE_PARAMS GetStroke() const
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
virtual bool HasLineStroke() const
Check if this item has line stoke properties.
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
int GetCount() const
Return the number of objects in the list.
void Remove(int aIndex)
Remove the item at aIndex (first position is 0).
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been removed.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
CONVERT_SETTINGS * m_settings
bool TransferDataToWindow() override
wxRadioButton * m_rbBoundingHull
wxStaticText * m_gapLabel
wxRadioButton * m_rbMimicLineWidth
wxRadioButton * m_rbCenterline
void onRadioButton(wxCommandEvent &aEvent)
wxStaticText * m_gapUnits
bool TransferDataFromWindow() override
wxCheckBox * m_cbDeleteOriginals
CONVERT_SETTINGS_DIALOG(EDA_DRAW_FRAME *aParent, CONVERT_SETTINGS *aSettings, bool aShowCopyLineWidthOption, bool aShowCenterlineOption, bool aShowBoundingHullOption)
wxStaticText * m_widthLabel
~CONVERT_SETTINGS_DIALOG()
wxStaticText * m_widthUnits
DIALOG_OUTSET_ITEMS, derived from DIALOG_OUTSET_ITEMS_BASE, created by wxFormBuilder.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
void ShowInfoBarMsg(const wxString &aMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an info icon on the left of...
bool IsType(FRAME_T aType) const
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
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
EDA_ITEM_FLAGS GetFlags() const
void SetCenter(const VECTOR2I &aCenter)
FILL_T GetFillMode() const
SHAPE_POLY_SET & GetPolyShape()
void SetFilled(bool aFlag)
void SetPolyShape(const SHAPE_POLY_SET &aShape)
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetShape(SHAPE_T aShape)
const std::vector< VECTOR2I > & GetBezierPoints() const
void SetEnd(const VECTOR2I &aEnd)
void SetWidth(int aWidth)
void SetFillMode(FILL_T aFill)
VECTOR2I GetArcMid() const
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Used when the right click button is pressed, or when the select tool is in effect.
A handler that is based on a set of callbacks provided by the user of the ITEM_MODIFICATION_ROUTINE.
bool IsBOARD_ITEM() const
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
static TOOL_ACTION convertToKeepout
static TOOL_ACTION convertToTracks
static TOOL_ACTION convertToLines
static TOOL_ACTION convertToZone
static TOOL_ACTION convertToPoly
static TOOL_ACTION outsetItems
Create outset items from selection.
static TOOL_ACTION convertToArc
static TOOL_ACTION createArray
Tool for creating an array of objects.
void SetMid(const VECTOR2I &aMid)
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.
Common, abstract interface for edit frames.
PCB_LAYER_ID SelectOneLayer(PCB_LAYER_ID aDefaultLayer, LSET aNotAllowedLayersMask=LSET(), wxPoint aDlgPosition=wxDefaultPosition)
Show the dialog box for a layer selection.
virtual PCB_LAYER_ID GetActiveLayer() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Returns the BOARD_DESIGN_SETTINGS for the open project.
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
static SELECTION_CONDITION SameLayer()
Creates a functor that tests if selection contains items that belong exclusively to the same layer.
int GetWidth() const override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
STROKE_PARAMS GetStroke() const override
void SetStroke(const STROKE_PARAMS &aStroke) override
void SetEnd(const VECTOR2I &aEnd)
void SetStart(const VECTOR2I &aStart)
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the track shape to a closed polygon.
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
static SEG::ecoord Square(int a)
Class that groups generic conditions for selected items.
static SELECTION_CONDITION MoreThan(int aNumber)
Create a functor that tests if the number of selected items is greater than the value given as parame...
static SELECTION_CONDITION Count(int aNumber)
Create a functor that tests if the number of selected items is equal to the value given as parameter.
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
const std::deque< EDA_ITEM * > GetItems() const
virtual void Remove(EDA_ITEM *aItem)
bool Empty() const
Checks if there is anything selected.
SHAPE_ARC Reversed() const
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
virtual const VECTOR2I GetPoint(int aIndex) const override
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
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 Insert(size_t aVertex, const VECTOR2I &aP)
Represent a set of closed polygons.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
void Simplify(POLYGON_MODE aFastMode)
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFastMo...
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Simple container to manage line stroke parameters.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
void Show(bool aShow, bool aResize=false)
Show/hide the label, widget and units label.
ZONE_SETTINGS handles zones parameters.
void SetIsRuleArea(bool aEnable)
void ExportSetting(ZONE &aTarget, bool aFullExport=true) const
Function ExportSetting copy settings to a given zone.
Handle a list of polygons defining a copper zone.
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
SHAPE_POLY_SET * Outline()
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
int InvokeCopperZonesEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Function InvokeCopperZonesEditor invokes up a modal dialog window for copper zone editing.
int InvokeNonCopperZonesEditor(PCB_BASE_FRAME *aParent, ZONE_SETTINGS *aSettings, CONVERT_SETTINGS *aConvertSettings)
Function InvokeNonCopperZonesEditor invokes up a modal dialog window for non-copper zone editing.
int InvokeRuleAreaEditor(PCB_BASE_FRAME *aCaller, ZONE_SETTINGS *aZoneSettings, BOARD *aBoard, CONVERT_SETTINGS *aConvertSettings)
Function InvokeRuleAreaEditor invokes up a modal dialog window for copper zone editing.
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
@ ARC
use RECTANGLE instead of RECT to avoid collision in a Windows header
bool IsNonCopperLayer(int aLayerId)
Test whether a layer is a non copper layer.
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
static PGM_BASE * process
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
CONVERT_STRATEGY m_Strategy
constexpr int mmToIU(double mm) const
const VECTOR2I CalcArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_SHAPE_LOCATE_CIRCLE_T
@ PCB_SHAPE_LOCATE_SEGMENT_T
@ PCB_SHAPE_LOCATE_RECT_T
@ PCB_SHAPE_LOCATE_BEZIER_T
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_SHAPE_LOCATE_POLY_T
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
VECTOR2< int32_t > VECTOR2I