38#include <magic_enum.hpp> 
  118    for( 
auto& preset : magic_enum::enum_values<IPC4761_PRESET>() )
 
  125        wxString 
name = 
_( 
"Unknown choice" );
 
  128            name = name_it->second;
 
 
  150    bool hasLocked = 
false;
 
  151    bool hasUnlocked = 
false;
 
  157    int selection_first_layer = -1;
 
  158    int selection_last_layer = -1;
 
  161    int track_selection_layer = -1;
 
  163    auto getAnnularRingSelection =
 
  166                switch( 
via->Padstack().UnconnectedLayerMode() )
 
  189        switch( item->Type() )
 
  203                    track_selection_layer = t->
GetLayer();
 
  230                    if( track_selection_layer != t->
GetLayer() )
 
  264                    selection_first_layer = v->
TopLayer();
 
  303                    if( selection_first_layer != v->
TopLayer() )
 
  415        int viaSelection = wxNOT_FOUND;
 
  418        for( 
unsigned ii = 1; ii < 
m_frame->GetDesignSettings().m_ViasDimensionsList.size(); ii++ )
 
  426            if( viaSelection == wxNOT_FOUND
 
  430                viaSelection = ii - 1;
 
  465        int widthSelection = wxNOT_FOUND;
 
  468        for( 
unsigned ii = 1; ii < 
m_frame->GetDesignSettings().m_TrackWidthList.size(); ii++ )
 
  470            int      width = 
m_frame->GetDesignSettings().m_TrackWidthList[ii];
 
  471            wxString msg = 
m_frame->StringFromValue( width );
 
  474            if( widthSelection == wxNOT_FOUND && 
m_trackWidth.GetValue() == width )
 
  475                widthSelection = ii - 1;
 
  481        wxCommandEvent event;
 
  489    if( hasLocked && hasUnlocked )
 
 
  519        for( 
unsigned ii = 1; ii < 
m_frame->GetDesignSettings().m_ViasDimensionsList.size(); ii++ )
 
  539        for( 
unsigned ii = 1; ii < 
m_frame->GetDesignSettings().m_TrackWidthList.size(); ii++ )
 
  541            int      width = 
m_frame->GetDesignSettings().m_TrackWidthList[ii];
 
  542            wxString msg = 
m_frame->StringFromValue( width );
 
 
  558    if( shortingNets.size() == 1 )
 
  560        msg.Printf( 
_( 
"Applying these changes will short net %s with %s." ),
 
  562                    m_frame->GetBoard()->FindNet( *shortingNets.begin() )->GetNetname() );
 
  566        msg.Printf( 
_( 
"Applying these changes will short net %s with other nets." ),
 
  570    KIDIALOG dlg( 
this, msg, 
_( 
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
 
 
  582    if( changingPads.size() == 1 )
 
  584        PAD* 
pad = *changingPads.begin();
 
  585        msg.Printf( 
_( 
"Changing the net will also update %s pad %s to %s." ),
 
  586                    pad->GetParentFootprint()->GetReference(),
 
  590    else if( changingPads.size() == 2 )
 
  592        PAD* pad1 = *changingPads.begin();
 
  593        PAD* pad2 = *( ++changingPads.begin() );
 
  594        msg.Printf( 
_( 
"Changing the net will also update %s pad %s and %s pad %s to %s." ),
 
  603        msg.Printf( 
_( 
"Changing the net will also update %lu connected pads to %s." ),
 
  604                    static_cast<unsigned long>( changingPads.size() ),
 
  608    KIDIALOG dlg( 
this, msg, 
_( 
"Confirmation" ), wxOK | wxCANCEL | wxICON_WARNING );
 
 
  618    std::shared_ptr<CONNECTIVITY_DATA> connectivity = 
m_frame->GetBoard()->GetConnectivity();
 
  619    std::vector<PCB_TRACK*>            selected_tracks;
 
  620    std::set<PCB_TRACK*>               connected_tracks;
 
  625            selected_tracks.push_back( track );
 
  628    for( 
PCB_TRACK* selected_track : selected_tracks )
 
  633                connected_tracks.insert( track );
 
  643        std::optional<int> viaDiameter;
 
  648        std::optional<int> viaDrill;
 
  653        std::optional<PCB_LAYER_ID> startLayer;
 
  658        std::optional<PCB_LAYER_ID> endLayer;
 
  663        if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
 
  682        if( viaDiameter.has_value() )
 
  684            int diameter = viaDiameter.value();
 
  701    bool         changeLock = 
m_lockedCbox->Get3StateValue() != wxCHK_UNDETERMINED;
 
  702    bool         setLock = 
m_lockedCbox->Get3StateValue() == wxCHK_CHECKED;
 
  704    for( 
PCB_TRACK* track : selected_tracks )
 
  708        switch( track->Type() )
 
  741                        track->SetLocalSolderMaskMargin( {} );
 
  747                    track->SetLocked( setLock );
 
  757                if( !
m_viaX.IsIndeterminate() )
 
  760                if( !
m_viaY.IsIndeterminate() )
 
  763                if( 
m_viaNotFree->Get3StateValue() != wxCHK_UNDETERMINED )
 
  784                    via->SetTopLayer( startLayer );
 
  790                    via->SetBottomLayer( endLayer );
 
  793                via->SanitizeLayers();
 
  798                    via->Padstack().SetUnconnectedLayerMode(
 
  802                    via->Padstack().SetUnconnectedLayerMode(
 
  806                    via->Padstack().SetUnconnectedLayerMode(
 
  810                    via->Padstack().SetUnconnectedLayerMode(
 
  848                    via->SetLocked( setLock );
 
  860    std::set<int>  shortingNets;
 
  862    std::set<PAD*> changingPads;
 
  879    for( 
PCB_TRACK* track : connected_tracks )
 
  883            if( other->GetNetCode() == track->GetNetCode() || other->GetNetCode() == newNetCode )
 
  887                shortingNets.insert( other->GetNetCode() );
 
  892            for( 
PAD* 
pad : footprint->Pads() )
 
  894                if( 
pad->GetNetCode() == newNetCode )
 
  899                    if( 
pad->GetNetCode() == track->GetNetCode() )
 
  900                        changingPads.insert( 
pad );
 
  902                        shortingNets.insert( 
pad->GetNetCode() );
 
  918            for( 
PCB_TRACK* track : selected_tracks )
 
  919                track->SetNetCode( newNetCode );
 
  921            for( 
PAD* 
pad : changingPads )
 
  924                pad->SetNetCode( newNetCode );
 
  929    commit.
Push( 
_( 
"Edit Track/Via Properties" ) );
 
 
  974    wxCHECK_MSG( 
m_viaStack, , 
"Expected valid via stack in onPadstackModeChanged" );
 
 
  990    wxCHECK_MSG( 
m_viaStack, , 
"Expected valid via stack in onEditLayerChanged" );
 
 
 1039    wxCHECK_MSG( 
m_viaStack, , 
"Expected valid via stack in afterPadstackModeChanged" );
 
 1059        std::vector choices = {
 
 1061            _( 
"Inner Layers" ),
 
 
 1111        return m_frame->GetBoard()->GetCopperLayerCount() - 1;
 
 1116    if( startLayer < 0 || endLayer < 0 )
 
 1117        return m_frame->GetBoard()->GetCopperLayerCount() - 1;
 
 
 1168    event.Enable( !
m_frame->GetBoard()->LegacyTeardrops() );
 
 
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
 
PCB_LAYER_BOX_SELECTOR * m_ViaStartLayer
 
wxCheckBox * m_lockedCbox
 
wxCheckBox * m_curvedEdges
 
wxStaticText * m_trackMaskMarginUnit
 
wxStaticText * m_TrackStartYUnit
 
wxStaticText * m_TrackEndXLabel
 
wxTextCtrl * m_TrackStartXCtrl
 
wxStaticText * m_predefinedTrackWidthsUnits
 
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
 
wxStaticBoxSizer * m_sbTrackSizer
 
wxChoice * m_annularRingsCtrl
 
wxStaticBoxSizer * m_sbViaSizer
 
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_stLenPercentLabel
 
wxChoice * m_cbPadstackMode
 
wxCheckBox * m_viaNotFree
 
wxStaticText * m_TrackWidthUnit
 
wxTextCtrl * m_tcWidthPercent
 
wxChoice * m_ViaTypeChoice
 
wxStaticText * m_stHDRatio
 
wxTextCtrl * m_ViaDiameterCtrl
 
wxChoice * m_predefinedViaSizesCtrl
 
wxStaticText * m_ViaXLabel
 
wxTextCtrl * m_trackMaskMarginCtrl
 
wxTextCtrl * m_ViaDrillCtrl
 
wxStaticText * m_TrackEndYUnit
 
wxStaticText * m_stMaxWidthUnits
 
wxStaticText * m_netSelectorLabel
 
wxStaticBitmap * m_bitmapTeardrop
 
wxTextCtrl * m_TrackEndYCtrl
 
wxStaticText * m_techLayersLabel
 
wxTextCtrl * m_tcTdMaxLen
 
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
 
void onWidthEdit(wxCommandEvent &aEvent) override
 
const PCB_SELECTION & m_items
 
bool TransferDataFromWindow() override
 
void onUnitsChanged(wxCommandEvent &aEvent)
 
UNIT_BINDER m_viaDiameter
 
void onNetSelector(wxCommandEvent &aEvent)
 
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 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 onEditLayerChanged(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)
 
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)
 
~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.
 
@ 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)
 
@ REMOVE_EXCEPT_START_AND_END
 
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
 
static std::optional< VIA_PARAMETER_ERROR > ValidateViaParameters(std::optional< int > aDiameter, std::optional< int > aDrill, std::optional< PCB_LAYER_ID > aStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aEndLayer=std::nullopt)
 
const PADSTACK & Padstack() const
 
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)
 
#define GEOMETRY_MIN_SIZE
 
bool collide(T aObject, U aAnotherObject, int aLayer, int aMinDistance)
Used by SHAPE_INDEX to implement Query().
 
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