38#include <magic_enum.hpp>
137 for(
auto& preset : magic_enum::enum_values<IPC4761_PRESET>() )
144 wxString
name =
_(
"Unknown choice" );
147 name = name_it->second;
169 bool hasLocked =
false;
170 bool hasUnlocked =
false;
176 int selection_first_layer = -1;
177 int selection_last_layer = -1;
180 int track_selection_layer = -1;
184 bool backdrill_start_layer_set =
false;
185 bool backdrill_end_layer_set =
false;
186 bool backdrill_start_layer_mixed =
false;
187 bool backdrill_end_layer_mixed =
false;
189 std::optional<PAD_DRILL_POST_MACHINING_MODE> primary_post_machining_value;
190 bool primary_post_machining_set =
false;
191 bool primary_post_machining_mixed =
false;
193 std::optional<PAD_DRILL_POST_MACHINING_MODE> secondary_post_machining_value;
194 bool secondary_post_machining_set =
false;
195 bool secondary_post_machining_mixed =
false;
199 auto getAnnularRingSelection =
202 switch(
via->Padstack().UnconnectedLayerMode() )
225 switch( item->Type() )
239 track_selection_layer = t->
GetLayer();
266 if( track_selection_layer != t->
GetLayer() )
303 primary_post_machining_set =
true;
306 secondary_post_machining_set =
true;
308 backdrill_start_layer = secondaryDrill.
start;
309 backdrill_start_layer_set =
true;
311 backdrill_end_layer = secondaryDrill.
end;
312 backdrill_end_layer_set =
true;
314 selection_first_layer = v->
TopLayer();
353 if( selection_first_layer != v->
TopLayer() )
394 primary_post_machining_mixed =
true;
397 secondary_post_machining_mixed =
true;
399 if( backdrill_start_layer_set && backdrill_start_layer != secondaryDrill.
start )
400 backdrill_start_layer_mixed =
true;
402 if( backdrill_end_layer_set && backdrill_end_layer != secondaryDrill.
end )
403 backdrill_end_layer_mixed =
true;
453 if( backdrill_start_layer_mixed )
464 if( !backdrill_start_layer_set )
472 if( backdrill_end_layer_mixed )
483 if( !backdrill_end_layer_set )
492 if( backdrill_start_layer_mixed || backdrill_end_layer_mixed )
507 if( primary_post_machining_mixed )
511 else if( primary_post_machining_set && primary_post_machining_value.has_value() )
513 switch( primary_post_machining_value.value() )
525 if( secondary_post_machining_mixed )
529 else if( secondary_post_machining_set && secondary_post_machining_value.has_value() )
531 switch( secondary_post_machining_value.value() )
569 int viaSelection = wxNOT_FOUND;
572 for(
unsigned ii = 1; ii <
m_frame->GetDesignSettings().m_ViasDimensionsList.size(); ii++ )
580 if( viaSelection == wxNOT_FOUND
584 viaSelection = ii - 1;
619 int widthSelection = wxNOT_FOUND;
622 for(
unsigned ii = 1; ii <
m_frame->GetDesignSettings().m_TrackWidthList.size(); ii++ )
624 int width =
m_frame->GetDesignSettings().m_TrackWidthList[ii];
625 wxString msg =
m_frame->StringFromValue( width );
628 if( widthSelection == wxNOT_FOUND &&
m_trackWidth.GetValue() == width )
629 widthSelection = ii - 1;
635 wxCommandEvent event;
643 if( hasLocked && hasUnlocked )
657 wxCommandEvent dummyEvent;
678 for(
unsigned ii = 1; ii <
m_frame->GetDesignSettings().m_ViasDimensionsList.size(); ii++ )
698 for(
unsigned ii = 1; ii <
m_frame->GetDesignSettings().m_TrackWidthList.size(); ii++ )
700 int width =
m_frame->GetDesignSettings().m_TrackWidthList[ii];
701 wxString msg =
m_frame->StringFromValue( width );
717 if( shortingNets.size() == 1 )
719 msg.Printf(
_(
"Applying these changes will short net %s with %s." ),
721 m_frame->GetBoard()->FindNet( *shortingNets.begin() )->GetNetname() );
725 msg.Printf(
_(
"Applying these changes will short net %s with other nets." ),
729 KIDIALOG dlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
741 if( changingPads.size() == 1 )
743 PAD*
pad = *changingPads.begin();
744 msg.Printf(
_(
"Changing the net will also update %s pad %s to %s." ),
745 pad->GetParentFootprint()->GetReference(),
749 else if( changingPads.size() == 2 )
751 PAD* pad1 = *changingPads.begin();
752 PAD* pad2 = *( ++changingPads.begin() );
753 msg.Printf(
_(
"Changing the net will also update %s pad %s and %s pad %s to %s." ),
762 msg.Printf(
_(
"Changing the net will also update %lu connected pads to %s." ),
763 static_cast<unsigned long>( changingPads.size() ),
767 KIDIALOG dlg(
this, msg,
_(
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
777 std::shared_ptr<CONNECTIVITY_DATA> connectivity =
m_frame->GetBoard()->GetConnectivity();
778 std::vector<PCB_TRACK*> selected_tracks;
779 std::set<PCB_TRACK*> connected_tracks;
784 selected_tracks.push_back( track );
787 for(
PCB_TRACK* selected_track : selected_tracks )
792 connected_tracks.insert( track );
802 std::optional<int> viaDiameter;
807 std::optional<int> viaDrill;
812 std::optional<PCB_LAYER_ID> startLayer;
817 std::optional<PCB_LAYER_ID> endLayer;
822 std::optional<int> secondaryDrill;
825 if( viaDrill.has_value() )
827 secondaryDrill = viaDrill.value() * 1.1;
831 secondaryDrill =
m_viaDrill.GetIntValue() * 1.1;
834 std::optional<PCB_LAYER_ID> secondaryStartLayer;
835 std::optional<PCB_LAYER_ID> secondaryEndLayer;
839 if( backdrillChoice == 1 )
841 secondaryStartLayer =
B_Cu;
845 else if( backdrillChoice == 2 )
847 secondaryStartLayer =
F_Cu;
854 std::optional<PADSTACK::POST_MACHINING_PROPS> frontPostMachining;
855 std::optional<PADSTACK::POST_MACHINING_PROPS> backPostMachining;
877 frontPostMachining = props;
900 backPostMachining = props;
904 std::optional<int> tertiaryDrill;
905 std::optional<PCB_LAYER_ID> tertiaryStartLayer;
906 std::optional<PCB_LAYER_ID> tertiaryEndLayer;
908 int copperLayerCount =
m_frame->GetBoard() ?
m_frame->GetBoard()->GetCopperLayerCount() : 0;
910 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
912 secondaryDrill, secondaryStartLayer,
913 secondaryEndLayer, tertiaryDrill, tertiaryStartLayer,
914 tertiaryEndLayer, copperLayerCount ) )
946 bool changeLock =
m_lockedCbox->Get3StateValue() != wxCHK_UNDETERMINED;
947 bool setLock =
m_lockedCbox->Get3StateValue() == wxCHK_CHECKED;
949 for(
PCB_TRACK* track : selected_tracks )
953 switch( track->Type() )
986 track->SetLocalSolderMaskMargin( {} );
992 track->SetLocked( setLock );
1003 if( !
m_viaX.IsIndeterminate() )
1006 if( !
m_viaY.IsIndeterminate() )
1009 if(
m_viaNotFree->Get3StateValue() != wxCHK_UNDETERMINED )
1017 if( currentSize.
x != newDiameter || currentSize.
y != newDiameter )
1020 updatePadstack =
true;
1026 if( backdrillChoice != wxNOT_FOUND )
1032 int drillSize =
via->GetDrillValue();
1036 secondaryDrill.
size =
VECTOR2I( drillSize * 1.1, drillSize * 1.1 );
1038 if( backdrillChoice == 0 )
1042 secondaryDrill.
size = { 0, 0 };
1045 else if( backdrillChoice == 1 )
1053 else if( backdrillChoice == 2 )
1062 if(
via->Padstack().SecondaryDrill() != secondaryDrill )
1064 m_viaStack->SecondaryDrill() = secondaryDrill;
1065 updatePadstack =
true;
1083 props.
size =
via->Padstack().FrontPostMachining().size;
1094 props.
angle =
via->Padstack().FrontPostMachining().angle;
1095 props.
depth =
via->Padstack().FrontPostMachining().depth;
1098 if(
via->Padstack().FrontPostMachining() != props )
1101 updatePadstack =
true;
1118 props.
size =
via->Padstack().BackPostMachining().size;
1129 props.
angle =
via->Padstack().BackPostMachining().angle;
1130 props.
depth =
via->Padstack().BackPostMachining().depth;
1133 if(
via->Padstack().BackPostMachining() != props )
1136 updatePadstack =
true;
1154 if(
via->Padstack().Drill().start != startLayer )
1157 updatePadstack =
true;
1160 via->SetTopLayer( startLayer );
1165 if(
via->Padstack().Drill().end != endLayer )
1168 updatePadstack =
true;
1171 via->SetBottomLayer( endLayer );
1174 if( updatePadstack )
1177 via->SanitizeLayers();
1229 via->SetLocked( setLock );
1241 std::set<int> shortingNets;
1243 std::set<PAD*> changingPads;
1260 for(
PCB_TRACK* track : connected_tracks )
1264 if( other->GetNetCode() == track->GetNetCode() || other->GetNetCode() == newNetCode )
1268 shortingNets.insert( other->GetNetCode() );
1273 for(
PAD*
pad : footprint->Pads() )
1275 if(
pad->GetNetCode() == newNetCode )
1280 if(
pad->GetNetCode() == track->GetNetCode() )
1281 changingPads.insert(
pad );
1283 shortingNets.insert(
pad->GetNetCode() );
1299 for(
PCB_TRACK* track : selected_tracks )
1300 track->SetNetCode( newNetCode );
1302 for(
PAD*
pad : changingPads )
1305 pad->SetNetCode( newNetCode );
1310 commit.
Push(
_(
"Edit Track/Via Properties" ) );
1355 wxCHECK_MSG(
m_viaStack, ,
"Expected valid via stack in onPadstackModeChanged" );
1373 wxCHECK_MSG(
m_viaStack, ,
"Expected valid via stack in onEditLayerChanged" );
1422 wxCHECK_MSG(
m_viaStack, ,
"Expected valid via stack in afterPadstackModeChanged" );
1442 std::vector choices = {
1444 _(
"Inner Layers" ),
1494 return m_frame->GetBoard()->GetCopperLayerCount() - 1;
1499 if( startLayer < 0 || endLayer < 0 )
1500 return m_frame->GetBoard()->GetCopperLayerCount() - 1;
1551 event.Enable( !
m_frame->GetBoard()->LegacyTeardrops() );
1560 bool enableTop = ( selection == 2 || selection == 3 );
1561 bool enableBottom = ( selection == 1 || selection == 3 );
1576 bool enable = ( selection != 0 );
1582 if( selection == 1 )
1592 else if( selection == 2 )
1605 bool enable = ( selection != 0 );
1611 if( selection == 1 )
1621 else if( selection == 2 )
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
TEARDROP_PARAMETERS & GetTeardropParams()
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
bool IsLocked() const override
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Information pertinent to a Pcbnew printed circuit board.
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
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...
wxStaticText * m_annularRingsLabel
wxChoice * m_protectionFeatures
wxBoxSizer * m_legacyTeardropsWarning
wxStaticText * m_stMaxWidthLabel
wxStaticText * m_TrackEndYLabel
wxStaticText * m_ViaYLabel
wxStaticText * m_topPostMachineSize1Units
wxStaticText * m_bottomPostMachineSize2Label
PCB_LAYER_BOX_SELECTOR * m_ViaStartLayer
PCB_LAYER_BOX_SELECTOR * m_backDrillFrontLayer
wxCheckBox * m_lockedCbox
wxCheckBox * m_curvedEdges
wxStaticText * m_trackMaskMarginUnit
wxStaticText * m_TrackStartYUnit
wxStaticText * m_TrackEndXLabel
wxTextCtrl * m_TrackStartXCtrl
wxStaticText * m_topPostMachineSize1Label
wxStaticText * m_predefinedTrackWidthsUnits
wxTextCtrl * m_topPostMachineSize2
wxStaticText * m_TrackWidthLabel
DIALOG_TRACK_VIA_PROPERTIES_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Track & Via Properties"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxSYSTEM_MENU)
wxStaticText * m_stMaxLenUnits
PCB_LAYER_BOX_SELECTOR * m_ViaEndLayer
wxChoice * m_predefinedTrackWidthsCtrl
wxStaticText * m_trackMaskMarginLabel
wxStaticText * m_topPostMachineSize2Label
wxStaticBoxSizer * m_sbTrackSizer
PCB_LAYER_BOX_SELECTOR * m_ViaStartLayer11
wxChoice * m_annularRingsCtrl
wxStaticBoxSizer * m_sbViaSizer
wxChoice * m_backDrillChoice
wxStaticText * m_ViaDrillUnit
wxStaticText * m_TrackStartXLabel
wxStaticText * m_stWidthPercentLabel
wxCheckBox * m_trackHasSolderMask
PCB_LAYER_BOX_SELECTOR * m_TrackLayerCtrl
wxStaticText * m_TrackStartYLabel
wxStaticText * m_stMaxLen
wxStaticText * m_ViaDiameterUnit
wxTextCtrl * m_TrackEndXCtrl
wxCheckBox * m_cbTeardrops
wxTextCtrl * m_tcLenPercent
wxStaticText * m_minTrackWidthHint
wxStaticText * m_ViaDrillLabel
wxStaticText * m_ViaYUnit
wxStaticText * m_topPostMachineSize2Units
wxStaticText * m_stLenPercentLabel
wxChoice * m_cbPadstackMode
wxCheckBox * m_viaNotFree
wxStaticText * m_TrackWidthUnit
wxStaticText * m_bottomPostMachineSize1Units
wxTextCtrl * m_tcWidthPercent
wxTextCtrl * m_topPostMachineSize1
wxChoice * m_bottomPostMachine
wxChoice * m_ViaTypeChoice
wxStaticText * m_stHDRatio
wxTextCtrl * m_ViaDiameterCtrl
wxChoice * m_predefinedViaSizesCtrl
wxStaticText * m_ViaXLabel
wxTextCtrl * m_trackMaskMarginCtrl
wxStaticText * m_bottomPostMachineSize1Label
wxChoice * m_topPostMachine
wxTextCtrl * m_ViaDrillCtrl
wxStaticText * m_TrackEndYUnit
wxStaticText * m_stMaxWidthUnits
wxStaticText * m_backDrillFrontLayerLabel
wxTextCtrl * m_bottomPostMachineSize2
wxStaticText * m_netSelectorLabel
wxStaticBitmap * m_bitmapTeardrop
wxTextCtrl * m_TrackEndYCtrl
wxStaticText * m_techLayersLabel
wxStaticText * m_backDrillBackLayer
wxTextCtrl * m_bottomPostMachineSize1
wxTextCtrl * m_tcTdMaxLen
wxStaticText * m_bottomPostMachineSize2Units
wxTextCtrl * m_TrackStartYCtrl
wxStaticText * m_ViaDiameterLabel
wxStaticText * m_stHDRatioUnits
wxStaticBitmap * m_legacyTeardropsIcon
wxTextCtrl * m_TrackWidthCtrl
wxStaticText * m_predefinedViaSizesUnits
wxCheckBox * m_cbTeardropsUseNextTrack
wxTextCtrl * m_tcMaxWidth
NET_SELECTOR * m_netSelector
bool m_backdrillEndIndeterminate
void onWidthEdit(wxCommandEvent &aEvent) override
const PCB_SELECTION & m_items
bool TransferDataFromWindow() override
UNIT_BINDER m_topPostMachineSize2Binder
void onUnitsChanged(wxCommandEvent &aEvent)
UNIT_BINDER m_viaDiameter
void onNetSelector(wxCommandEvent &aEvent)
bool m_backdrillStartIndeterminate
UNIT_BINDER m_trackMaskMargin
void afterPadstackModeChanged()
Get data from the PCB board and display it to dialog.
void onWidthSelect(wxCommandEvent &aEvent) override
UNIT_BINDER m_teardropWidthPercent
bool confirmShortingNets(int aNet, const std::set< int > &shortingNets)
UNIT_BINDER m_teardropLenPercent
UNIT_BINDER m_teardropMaxWidth
void onTeardropsUpdateUi(wxUpdateUIEvent &event) override
void onPadstackModeChanged(wxCommandEvent &aEvent) override
void onBackdrillChange(wxCommandEvent &aEvent) override
void onViaEdit(wxCommandEvent &aEvent) override
std::map< int, PCB_LAYER_ID > m_editLayerCtrlMap
PCB_LAYER_ID m_editLayer
The currently-shown copper layer of the edited via(s)
UNIT_BINDER m_trackStartY
void onViaSelect(wxCommandEvent &aEvent) override
bool TransferDataToWindow() override
void onBottomPostMachineChange(wxCommandEvent &aEvent) override
UNIT_BINDER m_bottomPostMachineSize2Binder
void onEditLayerChanged(wxCommandEvent &aEvent) override
void onTopPostMachineChange(wxCommandEvent &aEvent) override
PCB_BASE_EDIT_FRAME * m_frame
void onViaNotFreeClicked(wxCommandEvent &aEvent) override
DIALOG_TRACK_VIA_PROPERTIES(PCB_BASE_EDIT_FRAME *aParent, const PCB_SELECTION &aItems)
UNIT_BINDER m_topPostMachineSize1Binder
std::unique_ptr< PADSTACK > m_viaStack
Temporary padstack of the edited via(s)
UNIT_BINDER m_teardropMaxLen
UNIT_BINDER m_trackStartX
UNIT_BINDER m_teardropHDPercent
bool confirmPadChange(const std::set< PAD * > &connectedPads)
UNIT_BINDER m_bottomPostMachineSize1Binder
~DIALOG_TRACK_VIA_PROPERTIES()
void onTrackEdit(wxCommandEvent &aEvent) override
A base class for most all the KiCad significant classes used in schematics and boards.
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
bool SetOKCancelLabels(const ButtonLabel &ok, const ButtonLabel &cancel) override
LSET is a set of PCB_LAYER_IDs.
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
POST_MACHINING_PROPS & FrontPostMachining()
@ NORMAL
Shape is the same on all layers.
@ CUSTOM
Shapes can be defined on arbitrary layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
DRILL_PROPS & SecondaryDrill()
POST_MACHINING_PROPS & BackPostMachining()
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
static constexpr PCB_LAYER_ID INNER_LAYERS
! The layer identifier to use for "inner layers" on top/inner/bottom padstacks
const wxString & GetNumber() const
Common, abstract interface for edit frames.
bool HasSolderMask() const
std::optional< int > GetLocalSolderMaskMargin() const
virtual int GetWidth() const
bool GetIsFree() const
Check if the via is a free via (as opposed to one created on a track by the router).
PCB_LAYER_ID BottomLayer() const
VECTOR2I GetPosition() const override
const PADSTACK & Padstack() const
static std::optional< VIA_PARAMETER_ERROR > ValidateViaParameters(std::optional< int > aDiameter, std::optional< int > aPrimaryDrill, std::optional< PCB_LAYER_ID > aPrimaryStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aPrimaryEndLayer=std::nullopt, std::optional< int > aSecondaryDrill=std::nullopt, std::optional< PCB_LAYER_ID > aSecondaryStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aSecondaryEndLayer=std::nullopt, std::optional< int > aTertiaryDrill=std::nullopt, std::optional< PCB_LAYER_ID > aTertiaryStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aTertiaryEndLayer=std::nullopt, int aCopperLayerCount=0)
int GetWidth() const override
PCB_LAYER_ID TopLayer() const
int GetDrillValue() const
Calculate the drill value for vias (m_drill if > 0, or default drill value for the board).
VIATYPE GetViaType() const
virtual bool Collide(const VECTOR2I &aP, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const
Check if the boundary of shape (this) lies closer to the point aP than aClearance,...
TEARDROP_PARAMETARS is a helper class to handle parameters needed to build teardrops for a board thes...
double m_BestWidthRatio
The height of a teardrop as ratio between height and size of pad/via.
int m_TdMaxLen
max allowed length for teardrops in IU. <= 0 to disable
bool m_AllowUseTwoTracks
True to create teardrops using 2 track segments if the first in too small.
int m_TdMaxWidth
max allowed height for teardrops in IU. <= 0 to disable
double m_BestLengthRatio
The length of a teardrop as ratio between length and size of pad/via.
double m_WidthtoSizeFilterRatio
The ratio (H/D) between the via/pad size and the track width max value to create a teardrop 1....
bool m_Enabled
Flag to enable teardrops.
bool m_CurvedEdges
True if the teardrop should be curved.
IPC4761_PRESET getViaConfiguration(const PCB_VIA *aVia)
const std::map< IPC4761_PRESET, wxString > m_IPC4761Names
void setViaConfiguration(PCB_VIA *aVia, const IPC4761_PRESET &aPreset)
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
PCB_LAYER_ID
A quick note on layer IDs:
PCB_LAYER_ID ToLAYER_ID(int aLayer)
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
KICOMMON_API wxString GetLabel(EDA_UNITS aUnits, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Get the units string for a given units type.
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
@ REMOVE_EXCEPT_START_AND_END
#define GEOMETRY_MIN_SIZE
bool collide(T aObject, U aAnotherObject, int aLayer, int aMinDistance)
Used by SHAPE_INDEX to implement Query().
! The properties of a padstack drill. Drill position is always the pad position (origin).
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
std::optional< PAD_DRILL_POST_MACHINING_MODE > mode
Container to handle a stock of specific vias each with unique diameter and drill sizes in the BOARD c...
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ 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)
#define INDETERMINATE_ACTION
#define INDETERMINATE_STATE
Used for holding indeterminate values, such as with multiple selections holding different values or c...
VECTOR2< int32_t > VECTOR2I