98 auto explodeCondition =
104 auto recombineCondition =
128 ctxMenu.AddSeparator( 1 );
138 getEditFrame<PCB_BASE_FRAME>()->AddStandardSubMenus(
m_menu );
162 commit.
Push(
_(
"Paste Pad Properties" ) );
183 const PAD& selPad =
static_cast<const PAD&
>( *item );
193 bool aSameFootprints,
bool aPadShapeFilter,
bool aPadOrientFilter,
194 bool aPadLayerFilter,
bool aPadTypeFilter )
202 if( !aSameFootprints && ( footprint != refFootprint ) )
205 if( footprint->GetFPID() != refFootprint->
GetFPID() )
208 for(
PAD*
pad : footprint->Pads() )
210 if( aPadShapeFilter && (
pad->GetShape() != aSrcPad.
GetShape() ) )
213 EDA_ANGLE padAngle =
pad->GetOrientation() - footprint->GetOrientation();
215 if( aPadOrientFilter && ( padAngle != srcPadAngle ) )
218 if( aPadLayerFilter && (
pad->GetLayerSet() != aSrcPad.
GetLayerSet() ) )
221 if( aPadTypeFilter && (
pad->GetAttribute() != aSrcPad.
GetAttribute() ) )
234 pad->ImportSettingsFrom( aSrcPad );
254 int dialogRet = dlg.ShowModal();
256 if( dialogRet == wxID_CANCEL )
259 const bool edit_Same_Modules = (dialogRet == 1);
269 commit.
Push(
_(
"Push Pad Settings" ) );
286static std::optional<SEQUENTIAL_PAD_ENUMERATION_PARAMS>
294 if( settingsDlg.ShowModal() != wxID_OK )
297 return s_lastUsedParams;
306 if( !
board()->GetFirstFootprint() ||
board()->GetFirstFootprint()->Pads().
empty() )
317 const std::optional<SEQUENTIAL_PAD_ENUMERATION_PARAMS> params =
324 int seqPadNum = params->m_start_number;
326 std::deque<int> storedPadNumbers;
327 std::map<wxString, std::pair<int, wxString>> oldNumbers;
334 std::list<PAD*> selectedPads;
336 bool isFirstPoint =
true;
341 mag_settings.
tracks = MAGNETIC_OPTIONS::NO_EFFECT;
342 mag_settings.
pads = MAGNETIC_OPTIONS::CAPTURE_ALWAYS;
345 grid.SetSnap(
true );
346 grid.SetUseGrid(
false );
364 const auto constructPadNumber =
367 return wxString::Format( wxT(
"%s%d" ), params->m_prefix.value_or(
"" ), aValue );
371 const auto setPopupTextForValue =
374 const wxString msg =
_(
"Click on pad %s\n"
375 "Press <esc> to cancel all; double-click to finish" );
376 statusPopup.
SetText( wxString::Format( msg, constructPadNumber( aValue ) ) );
379 setPopupTextForValue( seqPadNum );
391 if( evt->IsCancelInteractive() )
399 else if( evt->IsActivate() )
401 commit.
Push(
_(
"Renumber Pads" ) );
408 selectedPads.clear();
413 oldCursorPos = cursorPos;
414 isFirstPoint =
false;
423 const VECTOR2I line_step( ( cursorPos - oldCursorPos ) / segments );
427 for(
int j = 0; j < segments; ++j )
429 VECTOR2I testpoint( cursorPos.
x - j * line_step.
x, cursorPos.
y - j * line_step.
y );
432 for(
int i = 0; i < collector.
GetCount(); ++i )
434 PAD*
pad =
static_cast<PAD*
>( collector[i] );
436 if( !
pad->IsAperturePad() )
437 selectedPads.push_back(
pad );
441 selectedPads.unique();
443 for(
PAD*
pad : selectedPads )
446 if( !
pad->IsSelected() )
453 if( storedPadNumbers.size() > 0 )
455 newval = storedPadNumbers.front();
456 storedPadNumbers.pop_front();
461 seqPadNum += params->m_step;
464 const wxString newNumber = constructPadNumber( newval );
465 oldNumbers[newNumber] = { newval,
pad->GetNumber() };
466 pad->SetNumber( newNumber );
472 if( storedPadNumbers.size() > 0 )
473 newval = storedPadNumbers.front();
477 setPopupTextForValue( newval );
481 else if(
pad->IsSelected() && evt->IsClick(
BUT_LEFT ) )
483 auto it = oldNumbers.find(
pad->GetNumber() );
484 wxASSERT( it != oldNumbers.end() );
486 if( it != oldNumbers.end() )
488 storedPadNumbers.push_back( it->second.first );
489 pad->SetNumber( it->second.second );
491 oldNumbers.erase( it );
493 const int newval = storedPadNumbers.front();
494 setPopupTextForValue( newval );
497 pad->ClearSelected();
502 else if( evt->IsDblClick(
BUT_LEFT ) )
504 commit.
Push(
_(
"Renumber Pads" ) );
523 for(
PAD* p :
board()->GetFirstFootprint()->Pads() )
544 static bool neednewPadNumber;
549 if( !
board()->GetFirstFootprint() )
556 neednewPadNumber =
true;
557 m_padTool = aPadTool;
560 virtual ~PAD_PLACER()
564 std::unique_ptr<BOARD_ITEM> CreateItem()
override
566 PAD*
pad =
new PAD( m_board->GetFirstFootprint() );
567 PAD* master = m_frame->GetDesignSettings().m_Pad_Master.get();
569 pad->ImportSettingsFrom( *master );
574 if( ( m_board->GetFirstFootprint()->GetAttributes() &
FP_SMD )
577 if(
pad->GetProperty() != PAD_PROP::HEATSINK )
579 pad->SetAttribute( PAD_ATTRIB::SMD );
580 pad->SetShape( PAD_SHAPE::ROUNDRECT );
581 pad->SetSizeX( 1.5 *
pad->GetSizeY() );
585 else if( ( m_board->GetFirstFootprint()->GetAttributes() &
FP_THROUGH_HOLE )
588 pad->SetAttribute( PAD_ATTRIB::PTH );
589 pad->SetShape( PAD_SHAPE::CIRCLE );
595 int hole_size =
pad->GetSizeX() / 2;
596 pad->SetDrillSize(
VECTOR2I( hole_size, hole_size ) );
601 if(
pad->CanHaveNumber() )
603 wxString padNumber = m_padTool->GetLastPadNumber();
607 if( neednewPadNumber )
608 padNumber = m_board->GetFirstFootprint()->GetNextPadNumber( padNumber );
610 pad->SetNumber( padNumber );
611 m_padTool->SetLastPadNumber( padNumber );
615 neednewPadNumber =
false;
618 return std::unique_ptr<BOARD_ITEM>(
pad );
626 neednewPadNumber =
true;
631 aCommit.
Add( aItem );
641 PAD_PLACER placer(
this );
675 commit.
Push(
_(
"Edit Pad" ) );
688 commit.
Push(
_(
"Edit Pad" ) );
706 PAD* flaggedPad =
nullptr;
711 for(
PAD*
pad : fp->Pads() )
713 if(
pad->IsEntered() )
716 flaggedPadId =
pad->m_Uuid;
749 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
762 msg.Printf(
_(
"Pad Edit Mode. Press %s again to exit." ),
767 msg.Printf(
_(
"Pad Edit Mode. Press %s to exit." ),
795 return dynamic_cast<PAD*
>( aItem ) !=
nullptr;
815 if( aPad->
GetShape() == PAD_SHAPE::CUSTOM )
817 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives() )
834 aCommit.
Add( shape );
888 [&](
PCB_SHAPE* aShape ) -> std::vector<PCB_SHAPE*>
890 std::vector<PCB_SHAPE*> matching;
900 && aShape->Compare( other ) == 0 )
902 matching.push_back( other );
910 std::vector<PCB_SHAPE*> mergedShapes;
921 if( !aIsDryRun &&
findNext( layer ) && aPad->
GetShape() != PAD_SHAPE::CUSTOM )
923 if( aPad->
GetShape() == PAD_SHAPE::CIRCLE || aPad->
GetShape() == PAD_SHAPE::RECTANGLE )
927 aPad->
SetShape( PAD_SHAPE::CUSTOM );
938 aPad->
SetShape( PAD_SHAPE::CUSTOM );
954 mergedShapes.push_back( fpShape );
969 for(
PCB_SHAPE* other : findMatching( fpShape ) )
972 mergedShapes.push_back( other );
@ 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
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 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 TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE, bool ignoreLineWidth=false) const override
Convert the pad shape to a closed polygon.
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.
void SetDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions, bool aRefresh=true)
Updates the current display options from the given options struct.
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.
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.
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)
Search 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) 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.
double EuclideanNorm(const VECTOR2I &vector)
@ PCB_PAD_T
class PAD, a pad in a footprint
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MM