75 frame()->SetDisplayOptions( opts );
78 frame()->GetInfoBar()->Dismiss();
100 auto explodeCondition =
106 auto recombineCondition =
126 auto& ctxMenu =
m_menu->GetMenu();
130 ctxMenu.AddSeparator( 1 );
140 getEditFrame<PCB_BASE_FRAME>()->AddStandardSubMenus( *
m_menu.get() );
150 const PAD* masterPad =
frame()->GetDesignSettings().m_Pad_Master.get();
164 commit.
Push(
_(
"Paste Pad Properties" ) );
185 const PAD& selPad =
static_cast<const PAD&
>( *item );
186 frame()->GetDesignSettings().m_Pad_Master->ImportSettingsFrom( selPad );
195 bool aSameFootprints,
bool aPadShapeFilter,
bool aPadOrientFilter,
196 bool aPadLayerFilter,
bool aPadTypeFilter )
204 if( !aSameFootprints && ( footprint != refFootprint ) )
207 if( footprint->GetFPID() != refFootprint->
GetFPID() )
210 for(
PAD*
pad : footprint->Pads() )
216 EDA_ANGLE padAngle =
pad->GetOrientation() - footprint->GetOrientation();
218 if( aPadOrientFilter && ( padAngle != srcPadAngle ) )
221 if( aPadLayerFilter && (
pad->GetLayerSet() != aSrcPad.
GetLayerSet() ) )
224 if( aPadTypeFilter && (
pad->GetAttribute() != aSrcPad.
GetAttribute() ) )
237 pad->ImportSettingsFrom( aSrcPad );
259 if( dialogRet == wxID_CANCEL )
262 const bool edit_Same_Modules = (dialogRet == 1);
272 commit.
Push(
_(
"Push Pad Settings" ) );
289static std::optional<SEQUENTIAL_PAD_ENUMERATION_PARAMS>
300 return s_lastUsedParams;
309 if( !
board()->GetFirstFootprint() ||
board()->GetFirstFootprint()->Pads().
empty() )
319 const std::optional<SEQUENTIAL_PAD_ENUMERATION_PARAMS> params =
326 int seqPadNum = params->m_start_number;
328 std::deque<int> storedPadNumbers;
329 std::map<wxString, std::pair<int, wxString>> oldNumbers;
333 frame()->PushTool( aEvent );
336 std::list<PAD*> selectedPads;
338 bool isFirstPoint =
true;
343 mag_settings.
tracks = MAGNETIC_OPTIONS::NO_EFFECT;
344 mag_settings.
pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
348 grid.SetSnap(
true );
349 grid.SetUseGrid(
false );
362 auto checkVisibility =
368 bool onActiveLayer = !isHighContrast;
369 bool isLODVisible =
false;
373 if( !onActiveLayer && activeLayers.count( layer ) )
374 onActiveLayer =
true;
379 if( onActiveLayer && isLODVisible )
396 const auto constructPadNumber =
399 return wxString::Format( wxT(
"%s%d" ), params->m_prefix.value_or(
"" ), aValue );
403 const auto setPopupTextForValue =
406 const wxString msg =
_(
"Click on pad %s\n"
407 "Press <esc> to cancel all; double-click to finish" );
408 statusPopup.
SetText( wxString::Format( msg, constructPadNumber( aValue ) ) );
411 setPopupTextForValue( seqPadNum );
423 if( evt->IsCancelInteractive() )
428 frame()->PopTool( aEvent );
431 else if( evt->IsActivate() )
433 commit.
Push(
_(
"Renumber Pads" ) );
435 frame()->PopTool( aEvent );
440 selectedPads.clear();
445 oldCursorPos = cursorPos;
446 isFirstPoint =
false;
452 int distance = ( cursorPos - oldCursorPos ).EuclideanNorm();
455 const VECTOR2I line_step( ( cursorPos - oldCursorPos ) / segments );
459 for(
int j = 0; j < segments; ++j )
461 VECTOR2I testpoint( cursorPos.
x - j * line_step.
x, cursorPos.
y - j * line_step.
y );
464 for(
int i = 0; i < collector.
GetCount(); ++i )
466 PAD*
pad =
static_cast<PAD*
>( collector[i] );
468 if( !
pad->IsAperturePad() && checkVisibility(
pad ) )
469 selectedPads.push_back(
pad );
473 selectedPads.unique();
475 for(
PAD*
pad : selectedPads )
478 if( !
pad->IsSelected() )
485 if( storedPadNumbers.size() > 0 )
487 newval = storedPadNumbers.front();
488 storedPadNumbers.pop_front();
493 seqPadNum += params->m_step;
496 const wxString newNumber = constructPadNumber( newval );
497 oldNumbers[newNumber] = { newval,
pad->GetNumber() };
498 pad->SetNumber( newNumber );
504 if( storedPadNumbers.size() > 0 )
505 newval = storedPadNumbers.front();
509 setPopupTextForValue( newval );
513 else if(
pad->IsSelected() && evt->IsClick(
BUT_LEFT ) )
515 auto it = oldNumbers.find(
pad->GetNumber() );
516 wxASSERT( it != oldNumbers.end() );
518 if( it != oldNumbers.end() )
520 storedPadNumbers.push_back( it->second.first );
521 pad->SetNumber( it->second.second );
523 oldNumbers.erase( it );
525 const int newval = storedPadNumbers.front();
526 setPopupTextForValue( newval );
529 pad->ClearSelected();
534 else if( evt->IsDblClick(
BUT_LEFT ) )
536 commit.
Push(
_(
"Renumber Pads" ) );
537 frame()->PopTool( aEvent );
555 for(
PAD* p :
board()->GetFirstFootprint()->Pads() )
576 static bool neednewPadNumber;
581 if( !
board()->GetFirstFootprint() )
587 m_padTool( aPadTool ),
591 neednewPadNumber =
true;
594 virtual ~PAD_PLACER()
598 std::unique_ptr<BOARD_ITEM> CreateItem()
override
601 PAD*
pad =
new PAD( m_board->GetFirstFootprint() );
602 PAD* master = m_frame->GetDesignSettings().m_Pad_Master.get();
604 pad->ImportSettingsFrom( *master );
609 if( ( m_board->GetFirstFootprint()->GetAttributes() &
FP_SMD )
612 if(
pad->GetProperty() != PAD_PROP::HEATSINK )
614 pad->SetAttribute( PAD_ATTRIB::SMD );
616 pad->SetSizeX( 1.5 *
pad->GetSizeY() );
620 else if( ( m_board->GetFirstFootprint()->GetAttributes() &
FP_THROUGH_HOLE )
623 pad->SetAttribute( PAD_ATTRIB::PTH );
629 pad->SetDrillShape( PAD_DRILL_SHAPE::CIRCLE );
630 int hole_size =
pad->GetSizeX() / 2;
631 pad->SetDrillSize(
VECTOR2I( hole_size, hole_size ) );
636 if(
pad->CanHaveNumber() )
638 wxString padNumber = m_padTool->GetLastPadNumber();
642 if( neednewPadNumber )
643 padNumber = m_board->GetFirstFootprint()->GetNextPadNumber( padNumber );
645 pad->SetNumber( padNumber );
646 m_padTool->SetLastPadNumber( padNumber );
650 neednewPadNumber =
false;
653 return std::unique_ptr<BOARD_ITEM>(
pad );
661 neednewPadNumber =
true;
666 aCommit.
Add( aItem );
675 m_gridHelper.SetSnap( !( m_modifiers &
MD_SHIFT ) );
676 m_gridHelper.SetUseGrid( !( m_modifiers &
MD_CTRL ) );
678 if( !m_gridHelper.GetSnap() )
683 VECTOR2I position = m_padTool->getViewControls()->GetMousePosition();
685 std::vector<BOARD_ITEM*> ignored_items( 1,
pad );
687 if( settings->
pads == MAGNETIC_OPTIONS::NO_EFFECT )
689 PADS& pads = m_board->GetFirstFootprint()->Pads();
690 ignored_items.insert( ignored_items.end(), pads.begin(), pads.end() );
695 DRAWINGS& graphics = m_board->GetFirstFootprint()->GraphicalItems();
696 ignored_items.insert( ignored_items.end(), graphics.begin(), graphics.end() );
709 PAD_PLACER placer(
this,
frame() );
743 commit.
Push(
_(
"Edit Pad" ) );
756 commit.
Push(
_(
"Edit Pad" ) );
759 frame()->SetActiveLayer( layer );
774 PAD* flaggedPad =
nullptr;
779 for(
PAD*
pad : fp->Pads() )
781 if(
pad->IsEntered() )
784 flaggedPadId =
pad->m_Uuid;
817 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
825 frame()->SetDisplayOptions( opts );
830 msg.Printf(
_(
"Pad Edit Mode. Press %s again to exit." ),
835 msg.Printf(
_(
"Pad Edit Mode. Press %s to exit." ),
855 frame()->SetDisplayOptions( opts );
863 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
870 frame()->GetInfoBar()->Dismiss();
903 aCommit.
Add( shape );
923 return aPad->
Recombine( aIsDryRun, maxError );
@ NORMAL
Use all material properties from model file.
constexpr EDA_IU_SCALE pcbIUScale
HIGH_CONTRAST_MODE
Determine how inactive layers should be displayed.
static TOOL_ACTION cancelInteractive
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
virtual void Revert() override
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)
Notify observers that aItem has been removed.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
static DELETED_BOARD_ITEM * GetInstance()
Dialog for enumerating pads.
static bool m_Pad_Shape_Filter
static bool m_Pad_Type_Filter
static bool m_Pad_Layer_Filter
static bool m_Pad_Orient_Filter
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)
void SetWidth(int aWidth)
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.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
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.
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
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.
bool IsVisible(const VIEW_ITEM *aItem) const
Return information if the item is visible (or not).
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
LSEQ UIOrder() const
Returns the copper, technical and user layers in the order shown in layer widget.
static LSET AllLayersMask()
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
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.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
PAD_ATTRIB GetAttribute() const
static LSET PTHMask()
layer set for a through hole pad
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.
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.
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
static LSET SMDMask()
layer set for a SMD pad on Front layer
int GetThermalSpokeWidth() 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 properties
Activation of the edit tool.
static TOOL_ACTION selectionClear
Clear the current selection.
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.
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.
int Size() const
Returns the number of selected parts.
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.
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...
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.
constexpr int mmToIU(double mm) const
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