69 frame()->SetDisplayOptions( opts );
72 frame()->GetInfoBar()->Dismiss();
94 auto explodeCondition =
100 auto recombineCondition =
121 auto& ctxMenu =
m_menu->GetMenu();
125 ctxMenu.AddSeparator( 1 );
145 const PAD* masterPad =
frame()->GetDesignSettings().m_Pad_Master.get();
159 commit.
Push(
_(
"Paste Pad Properties" ) );
180 const PAD& selPad =
static_cast<const PAD&
>( *item );
190 bool aSameFootprints,
bool aPadShapeFilter,
bool aPadOrientFilter,
191 bool aPadLayerFilter,
bool aPadTypeFilter )
199 if( !aSameFootprints && ( footprint != refFootprint ) )
202 if( footprint->GetFPID() != refFootprint->
GetFPID() )
205 for(
PAD*
pad : footprint->Pads() )
207 if( aPadShapeFilter )
209 bool shapesMatch =
true;
212 pad->Padstack().ForEachUniqueLayer(
215 if(
pad->GetShape( aLayer ) != aSrcPad.
GetShape( aLayer ) )
222 if( aSrcPad.
GetShape( aLayer ) !=
pad->GetShape( aLayer ) )
230 EDA_ANGLE padAngle =
pad->GetOrientation() - footprint->GetOrientation();
232 if( aPadOrientFilter && ( padAngle != srcPadAngle ) )
235 if( aPadLayerFilter && (
pad->GetLayerSet() != aSrcPad.
GetLayerSet() ) )
238 if( aPadTypeFilter && (
pad->GetAttribute() != aSrcPad.
GetAttribute() ) )
251 pad->ImportSettingsFrom( aSrcPad );
273 if( dialogRet == wxID_CANCEL )
276 const bool edit_Same_Modules = (dialogRet == 1);
283 commit.
Push(
_(
"Push Pad Settings" ) );
310 return s_lastUsedParams;
319 if( !
board()->GetFirstFootprint() ||
board()->GetFirstFootprint()->Pads().
empty() )
335 int seqPadNum = params->m_start_number;
337 std::deque<int> storedPadNumbers;
338 std::map<wxString, std::pair<int, wxString>> oldNumbers;
345 std::list<PAD*> selectedPads;
347 bool isFirstPoint =
true;
357 grid.SetSnap(
true );
358 grid.SetUseGrid(
false );
371 view->SyncLayerVisibilityCache();
373 auto checkVisibility =
376 if( !
view->IsVisible( item ) )
381 if( ( isHighContrast && activeLayers.count( layer ) ) ||
view->IsLayerVisible( layer ) )
383 if( item->ViewGetLOD( layer,
view ) <
view->GetScale() )
391 for(
PAD*
pad :
board()->GetFirstFootprint()->Pads() )
393 if( checkVisibility(
pad ) )
394 pads.push_back(
pad );
407 const auto constructPadNumber =
410 return wxString::Format( wxT(
"%s%d" ), params->m_prefix.value_or(
"" ), aValue );
414 const auto setPopupTextForValue =
417 const wxString msg =
_(
"Click on pad %s\n"
418 "Press <esc> to cancel all; double-click to finish" );
419 statusPopup.
SetText( wxString::Format( msg, constructPadNumber( aValue ) ) );
422 setPopupTextForValue( seqPadNum );
435 if( evt->IsCancelInteractive() )
441 else if( evt->IsActivate() )
443 commit.
Push(
_(
"Renumber Pads" ) );
448 selectedPads.clear();
453 oldMousePos = mousePos;
454 isFirstPoint =
false;
460 int distance = ( mousePos - oldMousePos ).EuclideanNorm();
463 const VECTOR2I line_step( ( mousePos - oldMousePos ) / segments );
467 for(
int j = 0; j < segments; ++j )
469 VECTOR2I testpoint( mousePos.
x - j * line_step.
x, mousePos.
y - j * line_step.
y );
472 for(
int i = 0; i < collector.
GetCount(); ++i )
474 PAD*
pad =
static_cast<PAD*
>( collector[i] );
476 if(
pad->CanHaveNumber() && checkVisibility(
pad ) )
477 selectedPads.push_back(
pad );
481 selectedPads.unique();
483 for(
PAD*
pad : selectedPads )
486 if( !
pad->IsSelected() )
493 if( storedPadNumbers.size() > 0 )
495 newval = storedPadNumbers.front();
496 storedPadNumbers.pop_front();
501 seqPadNum += params->m_step;
504 const wxString newNumber = constructPadNumber( newval );
505 oldNumbers[newNumber] = { newval,
pad->GetNumber() };
506 pad->SetNumber( newNumber );
512 if( storedPadNumbers.size() > 0 )
513 newval = storedPadNumbers.front();
517 setPopupTextForValue( newval );
521 else if(
pad->IsSelected() && evt->IsClick(
BUT_LEFT ) )
523 auto it = oldNumbers.find(
pad->GetNumber() );
524 wxASSERT( it != oldNumbers.end() );
526 if( it != oldNumbers.end() )
528 storedPadNumbers.push_back( it->second.first );
529 pad->SetNumber( it->second.second );
531 oldNumbers.erase( it );
533 const int newval = storedPadNumbers.front();
534 setPopupTextForValue( newval );
537 pad->ClearSelected();
542 else if( evt->IsDblClick(
BUT_LEFT ) )
544 commit.
Push(
_(
"Renumber Pads" ) );
558 oldMousePos = mousePos;
562 for(
PAD* p :
board()->GetFirstFootprint()->Pads() )
581 static bool neednewPadNumber;
586 if( !
board()->GetFirstFootprint() )
592 m_padTool( aPadTool ),
596 neednewPadNumber =
true;
599 virtual ~PAD_PLACER() =
default;
601 std::unique_ptr<BOARD_ITEM> CreateItem()
override
603 PAD*
pad =
new PAD( m_board->GetFirstFootprint() );
604 PAD* master = m_frame->GetDesignSettings().m_Pad_Master.get();
606 pad->ImportSettingsFrom( *master );
608 if(
pad->CanHaveNumber() )
610 wxString padNumber = m_padTool->GetLastPadNumber();
614 if( neednewPadNumber )
615 padNumber = m_board->GetFirstFootprint()->GetNextPadNumber( padNumber );
617 pad->SetNumber( padNumber );
618 m_padTool->SetLastPadNumber( padNumber );
622 neednewPadNumber =
false;
625 return std::unique_ptr<BOARD_ITEM>(
pad );
633 neednewPadNumber =
true;
637 m_frame->GetDesignSettings().m_Pad_Master->ImportSettingsFrom( *
pad );
638 aCommit.
Add( aItem );
647 m_gridHelper.SetSnap( !( m_modifiers &
MD_SHIFT ) );
648 m_gridHelper.SetUseGrid( !( m_modifiers &
MD_CTRL ) );
650 if( !m_gridHelper.GetSnap() )
655 VECTOR2I position = m_padTool->getViewControls()->GetMousePosition();
657 std::vector<BOARD_ITEM*> ignored_items( 1,
pad );
661 PADS& pads = m_board->GetFirstFootprint()->Pads();
662 ignored_items.insert( ignored_items.end(), pads.begin(), pads.end() );
667 DRAWINGS& graphics = m_board->GetFirstFootprint()->GraphicalItems();
668 ignored_items.insert( ignored_items.end(), graphics.begin(), graphics.end() );
682 PAD_PLACER placer(
this,
frame() );
714 commit.
Push(
_(
"Edit Pad" ) );
726 commit.
Push(
_(
"Edit Pad" ) );
729 frame()->SetActiveLayer(
pad->GetPrincipalLayer() );
744 PAD* flaggedPad =
nullptr;
749 for(
PAD*
pad : fp->Pads() )
751 if(
pad->IsEntered() )
754 flaggedPadId =
pad->m_Uuid;
787 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
795 frame()->SetDisplayOptions( opts );
800 msg.Printf(
_(
"Pad Edit Mode. Press %s again to exit." ),
805 msg.Printf(
_(
"Pad Edit Mode. Press %s to exit." ),
825 frame()->SetDisplayOptions( opts );
833 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
840 frame()->GetInfoBar()->Dismiss();
846 auto explodePrimitives =
851 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives( padstackStorageLayer ) )
858 shape->
SetLayer( targetBoardLayer );
868 aCommit.
Add( shape );
885 explodePrimitives( layer, layer );
901 return aPad->
Recombine( aIsDryRun, maxError );
constexpr EDA_IU_SCALE pcbIUScale
HIGH_CONTRAST_MODE
Determine how inactive layers should be displayed.
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
@ DIMMED
Inactive layers are dimmed (old high-contrast mode)
static TOOL_ACTION cancelInteractive
static TOOL_ACTION selectionClear
Clear the current selection.
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 for any item which can be embedded within the BOARD container class, and therefore insta...
FOOTPRINT * GetParentFootprint() const
Information pertinent to a Pcbnew printed circuit board.
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
const FOOTPRINTS & Footprints() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
void Empty()
Clear the list.
int GetCount() const
Return the number of objects in the list.
COMMIT & Remove(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Remove a new item from the model.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
static DELETED_BOARD_ITEM * GetInstance()
Dialog for enumerating pads.
bool GetPadShapeFilter() const
bool GetPadLayerFilter() const
bool GetPadTypeFilter() const
bool GetPadOrientFilter() const
void ForceRefresh()
Force a redraw.
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
void SetStatusPopup(wxWindow *aPopup)
A base class for most all the KiCad significant classes used in schematics and boards.
virtual void SetPosition(const VECTOR2I &aPos)
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT UndoRedoPostEvent
A general implementation of a COLLECTORS_GUIDE.
void SetIgnoreFPTextOnFront(bool ignore)
void SetIgnoreFPTextOnBack(bool ignore)
void SetIgnoreFPReferences(bool ignore)
void SetIgnoreFPValues(bool ignore)
Used when the right click button is pressed, or when the select tool is in effect.
void Collect(BOARD_ITEM *aItem, const std::vector< KICAD_T > &aScanList, const VECTOR2I &aRefPos, const COLLECTORS_GUIDE &aGuide)
Scan a BOARD_ITEM using this class's Inspector method, which does the collection.
Contains methods for drawing PCB-specific items.
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
PCB specific render settings.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const std::set< int > GetHighContrastLayers() const
Returns the set of currently high-contrast layers.
bool GetHighContrast() const
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
virtual VECTOR2D GetMousePosition(bool aWorldCoordinates=true) const =0
Return the current mouse pointer position.
An abstract base class for deriving all objects that can be added to a VIEW.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
static const LSET & AllLayersMask()
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
@ NORMAL
Shape is the same on all layers.
static constexpr PCB_LAYER_ID ALL_LAYERS
! The layer identifier to use for the single defintion on normal padstacks
bool IsAperturePad() const
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives(PCB_LAYER_ID aLayer) const
Accessor to the basic shape list for custom-shaped pads.
PAD_ATTRIB GetAttribute() const
void SetShape(PCB_LAYER_ID aLayer, PAD_SHAPE aShape)
Set the new shape of this pad.
std::vector< PCB_SHAPE * > Recombine(bool aIsDryRun, int aMaxError)
Recombines the pad with other graphical shapes in the footprint.
PCB_LAYER_ID GetPrincipalLayer() const
void DeletePrimitivesList(PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
Clear the basic shapes list.
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
void ImportSettingsFrom(const PAD &aMasterPad)
Import the pad settings from aMasterPad.
const PADSTACK & Padstack() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
std::optional< int > GetLocalThermalSpokeWidthOverride() const
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
PAD_SHAPE GetAnchorPadShape(PCB_LAYER_ID aLayer) const
static TOOL_ACTION recombinePad
static TOOL_ACTION enumeratePads
Tool for quick pad enumeration.
static TOOL_ACTION pushPadSettings
Copy the current pad's settings to other pads in the footprint or on the board.
static TOOL_ACTION mirrorH
Mirroring of selected items.
static TOOL_ACTION copyPadSettings
Copy the selected pad's settings to the board design settings.
static TOOL_ACTION placePad
Activation of the drawing tool (placing a PAD)
static TOOL_ACTION padTable
static TOOL_ACTION properties
Activation of the edit tool.
static TOOL_ACTION explodePad
static TOOL_ACTION applyPadSettings
Copy the default pad settings to the selected pad.
static TOOL_ACTION mirrorV
static TOOL_ACTION flip
Flipping of selected objects.
static TOOL_ACTION rotateCw
Rotation of selected objects.
static TOOL_ACTION rotateCcw
Common, abstract interface for edit frames.
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetWidth(int aWidth) override
bool IsProxyItem() const override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void Move(const VECTOR2I &aMoveVector) override
Move this object.
static SELECTION_CONDITION HasType(KICAD_T aType)
Create a functor that tests if among the selected items there is at least one of a given type.
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 bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
static SELECTION_CONDITION OnlyTypes(std::vector< KICAD_T > aTypes)
Create a functor that tests if the selected items are only of given types.
A modified version of the wxInfoBar class that allows us to:
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
static bool empty(const wxTextEntryBase *aCtrl)
#define ENTERED
indicates a group has been entered
wxString KeyNameFromKeyCode(int aKeycode, bool *aIsFound)
Return the key name from the key code.
NORMAL
Follows standard pretty-printing rules.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
@ REPAINT
Item needs to be redrawn.
@ ALL
All except INITIAL_ADD.
@ CONN
Like smd, does not appear on the solder paste layer (default) Note: also has a special attribute in G...
std::deque< BOARD_ITEM * > DRAWINGS
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
std::function< bool(const SELECTION &)> SELECTION_CONDITION
Functor type that checks a specific condition for selected items.
Parameters for sequential pad numbering.
@ PCB_PAD_T
class PAD, a pad in a footprint
VECTOR2< int32_t > VECTOR2I
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MM