54 m_wasHighContrast( false ),
96 auto explodeCondition =
102 auto recombineCondition =
126 ctxMenu.AddSeparator( 1 );
136 getEditFrame<PCB_BASE_FRAME>()->AddStandardSubMenus(
m_menu );
160 commit.
Push(
_(
"Paste Pad Properties" ) );
181 const PAD& selPad =
static_cast<const PAD&
>( *item );
191 bool aSameFootprints,
bool aPadShapeFilter,
bool aPadOrientFilter,
192 bool aPadLayerFilter,
bool aPadTypeFilter )
200 if( !aSameFootprints && ( footprint != refFootprint ) )
203 if( footprint->GetFPID() != refFootprint->
GetFPID() )
206 for(
PAD*
pad : footprint->Pads() )
208 if( aPadShapeFilter && (
pad->GetShape() != aSrcPad.
GetShape() ) )
211 EDA_ANGLE padAngle =
pad->GetOrientation() - footprint->GetOrientation();
213 if( aPadOrientFilter && ( padAngle != srcPadAngle ) )
216 if( aPadLayerFilter && (
pad->GetLayerSet() != aSrcPad.
GetLayerSet() ) )
219 if( aPadTypeFilter && (
pad->GetAttribute() != aSrcPad.
GetAttribute() ) )
232 pad->ImportSettingsFrom( aSrcPad );
252 int dialogRet = dlg.ShowModal();
254 if( dialogRet == wxID_CANCEL )
257 const bool edit_Same_Modules = (dialogRet == 1);
267 commit.
Push(
_(
"Push Pad Settings" ) );
284static std::optional<SEQUENTIAL_PAD_ENUMERATION_PARAMS>
292 if( settingsDlg.ShowModal() != wxID_OK )
295 return s_lastUsedParams;
304 if( !
board()->GetFirstFootprint() ||
board()->GetFirstFootprint()->Pads().
empty() )
315 const std::optional<SEQUENTIAL_PAD_ENUMERATION_PARAMS> params =
322 int seqPadNum = params->m_start_number;
324 std::deque<int> storedPadNumbers;
325 std::map<wxString, std::pair<int, wxString>> oldNumbers;
332 std::list<PAD*> selectedPads;
334 bool isFirstPoint =
true;
339 mag_settings.
tracks = MAGNETIC_OPTIONS::NO_EFFECT;
340 mag_settings.
pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
343 grid.SetSnap(
true );
344 grid.SetUseGrid(
false );
362 const auto constructPadNumber = [&](
int aValue )
364 return wxString::Format( wxT(
"%s%d" ), params->m_prefix.value_or(
"" ), aValue );
368 const auto setPopupTextForValue = [&](
int aValue )
371 _(
"Click on pad %s\nPress <esc> to cancel all; double-click to finish" );
372 statusPopup.
SetText( wxString::Format( msg, constructPadNumber( aValue ) ) );
375 setPopupTextForValue( seqPadNum );
387 if( evt->IsCancelInteractive() )
395 else if( evt->IsActivate() )
397 commit.
Push(
_(
"Renumber pads" ) );
404 selectedPads.clear();
409 oldCursorPos = cursorPos;
410 isFirstPoint =
false;
419 const VECTOR2I line_step( ( cursorPos - oldCursorPos ) / segments );
423 for(
int j = 0; j < segments; ++j )
425 VECTOR2I testpoint( cursorPos.
x - j * line_step.
x, cursorPos.
y - j * line_step.
y );
428 for(
int i = 0; i < collector.
GetCount(); ++i )
429 selectedPads.push_back(
static_cast<PAD*
>( collector[i] ) );
432 selectedPads.unique();
434 for(
PAD*
pad : selectedPads )
437 if( !
pad->IsSelected() )
444 if( storedPadNumbers.size() > 0 )
446 newval = storedPadNumbers.front();
447 storedPadNumbers.pop_front();
452 seqPadNum += params->m_step;
455 const wxString newNumber = constructPadNumber( newval );
456 oldNumbers[newNumber] = { newval,
pad->GetNumber() };
457 pad->SetNumber( newNumber );
463 if( storedPadNumbers.size() > 0 )
464 newval = storedPadNumbers.front();
468 setPopupTextForValue( newval );
472 else if(
pad->IsSelected() && evt->IsClick(
BUT_LEFT ) )
474 auto it = oldNumbers.find(
pad->GetNumber() );
475 wxASSERT( it != oldNumbers.end() );
477 if( it != oldNumbers.end() )
479 storedPadNumbers.push_back( it->second.first );
480 pad->SetNumber( it->second.second );
482 oldNumbers.erase( it );
484 const int newval = storedPadNumbers.front();
485 setPopupTextForValue( newval );
488 pad->ClearSelected();
493 else if( evt->IsDblClick(
BUT_LEFT ) )
495 commit.
Push(
_(
"Renumber pads" ) );
514 for(
PAD* p :
board()->GetFirstFootprint()->Pads() )
534 if( !
board()->GetFirstFootprint() )
541 m_padTool = aPadTool;
544 virtual ~PAD_PLACER()
548 std::unique_ptr<BOARD_ITEM> CreateItem()
override
550 PAD*
pad =
new PAD( m_board->GetFirstFootprint() );
551 PAD* master = m_frame->GetDesignSettings().m_Pad_Master.get();
553 pad->ImportSettingsFrom( *master );
557 if( ( m_board->GetFirstFootprint()->GetAttributes() &
FP_SMD )
560 pad->SetAttribute( PAD_ATTRIB::SMD );
561 pad->SetShape( PAD_SHAPE::ROUNDRECT );
562 pad->SetSizeX( 1.5 *
pad->GetSizeY() );
565 else if( ( m_board->GetFirstFootprint()->GetAttributes() &
FP_THROUGH_HOLE )
568 pad->SetAttribute( PAD_ATTRIB::PTH );
569 pad->SetShape( PAD_SHAPE::CIRCLE );
574 if(
pad->CanHaveNumber() )
576 wxString padNumber = m_padTool->GetLastPadNumber();
577 padNumber = m_board->GetFirstFootprint()->GetNextPadNumber( padNumber );
578 pad->SetNumber( padNumber );
579 m_padTool->SetLastPadNumber( padNumber );
582 return std::unique_ptr<BOARD_ITEM>(
pad );
592 aCommit.
Add( aItem );
602 PAD_PLACER placer(
this );
631 commit.
Push(
_(
"Recombine pad" ) );
662 PAD* flaggedPad =
nullptr;
667 for(
PAD*
pad : fp->Pads() )
669 if(
pad->IsEntered() )
672 flaggedPadId =
pad->m_Uuid;
706 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
714 msg.Printf(
_(
"Pad Edit Mode. Press %s again to exit." ),
719 msg.Printf(
_(
"Pad Edit Mode. Press %s to exit." ),
741 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
764 if( aPad->
GetShape() == PAD_SHAPE::CUSTOM )
768 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives() )
795 commit.
Push(
_(
"Edit pad shapes") );
843 [&](
PCB_SHAPE* aShape ) -> std::vector<PCB_SHAPE*>
845 std::vector<PCB_SHAPE*> matching;
855 && aShape->Compare( other ) == 0 )
857 matching.push_back( other );
865 std::vector<PCB_SHAPE*> mergedShapes;
876 if( !aIsDryRun &&
findNext( layer ) && aPad->
GetShape() != PAD_SHAPE::CUSTOM )
880 if( aPad->
GetShape() == PAD_SHAPE::CIRCLE || aPad->
GetShape() == PAD_SHAPE::RECTANGLE )
884 aPad->
SetShape( PAD_SHAPE::CUSTOM );
895 aPad->
SetShape( PAD_SHAPE::CUSTOM );
911 mergedShapes.push_back( fpShape );
923 aCommit.
Remove( fpShape );
928 for(
PCB_SHAPE* other : findMatching( fpShape ) )
931 mergedShapes.push_back( other );
constexpr EDA_IU_SCALE pcbIUScale
static TOOL_ACTION cancelInteractive
static TOOL_ACTION highContrastMode
virtual void Revert() override
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
std::unique_ptr< PAD > m_Pad_Master
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.
FOOTPRINTS & Footprints()
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
WX_INFOBAR * GetInfoBar()
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
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.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM_FLAGS GetFlags() const
void SetFilled(bool aFlag)
void SetPolyShape(const SHAPE_POLY_SET &aShape)
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 SetIgnoreMTextsMarkedNoShow(bool ignore)
void SetIgnoreModulesRefs(bool ignore)
void SetIgnoreModulesVals(bool ignore)
void SetIgnoreMTextsOnFront(bool ignore)
void SetIgnoreMTextsOnBack(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.
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.
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.
bool IsAperturePad() const
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
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 TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the pad shape to a closed polygon.
void DeletePrimitivesList()
Clear the basic shapes list.
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives() const
Accessor to the basic shape list for custom-shaped pads.
VECTOR2I ShapePos() const
void ImportSettingsFrom(const PAD &aMasterPad)
Import the pad settings from aMasterPad.
PAD_SHAPE GetShape() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
static LSET SMDMask()
layer set for a SMD pad on Front layer
void SetShape(PAD_SHAPE aShape)
Set the new shape of this pad.
int GetThermalSpokeWidth() const
void SetAnchorPadShape(PAD_SHAPE aShape)
Set the shape of the anchor pad for custom shaped pads.
void AddPrimitive(PCB_SHAPE *aPrimitive)
Add item to the custom shape primitives list.
void SetSize(const VECTOR2I &aSize)
const VECTOR2I & GetSize() const
PAD_SHAPE GetAnchorPadShape() 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
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
EDA_ITEM * GetItem(const KIID &aId) const override
Fetch an item by KIID.
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Returns the BOARD_DESIGN_SETTINGS for the open project.
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide()
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
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.
virtual 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 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.
virtual void Move(const VECTOR2I &aMoveVector) override
Move this object.
void SetStroke(const STROKE_PARAMS &aStroke) override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
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.
Represent a set of closed polygons.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void BooleanIntersection(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset intersection For aFastMode meaning, see function booleanOp.
Simple container to manage line stroke parameters.
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 Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
void ShowMessage(const wxString &aMessage, int aFlags=wxICON_INFORMATION) override
Show the info bar with the provided message and icon.
static PCB_SHAPE * findNext(PCB_SHAPE *aShape, const VECTOR2I &aPoint, const std::vector< PCB_SHAPE * > &aList, unsigned aLimit)
Searches for a PCB_SHAPE matching a given end point or start point in a list.
static bool empty(const wxTextEntryBase *aCtrl)
#define ENTERED
indicates a group has been entered
#define SKIP_STRUCT
flag indicating that the structure should be ignored
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)
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.
double EuclideanNorm(const VECTOR2I &vector)
@ PCB_PAD_T
class PAD, a pad in a footprint
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MM