KiCad PCB EDA Suite
edit_tool.cpp File Reference
#include <limits>
#include <class_board.h>
#include <class_module.h>
#include <class_edge_mod.h>
#include <collectors.h>
#include <pcb_edit_frame.h>
#include <ws_proxy_view_item.h>
#include <kiway.h>
#include <footprint_edit_frame.h>
#include <array_creator.h>
#include <pcbnew_settings.h>
#include <status_popup.h>
#include <tool/tool_manager.h>
#include <tools/pcb_actions.h>
#include <tools/selection_tool.h>
#include <tools/edit_tool.h>
#include <tools/pcbnew_picker_tool.h>
#include <tools/tool_event_utils.h>
#include <tools/grid_helper.h>
#include <tools/footprint_editor_tools.h>
#include <pad_naming.h>
#include <view/view_controls.h>
#include <connectivity/connectivity_data.h>
#include <confirm.h>
#include <bitmaps.h>
#include <cassert>
#include <functional>
#include "kicad_clipboard.h"
#include <router/router_tool.h>
#include <dialogs/dialog_move_exact.h>
#include <dialogs/dialog_track_via_properties.h>
#include <board_commit.h>
#include <zone_filler.h>

Go to the source code of this file.

Classes

class  SPECIAL_TOOLS_CONTEXT_MENU
 

Functions

void EditToolSelectionFilter (GENERAL_COLLECTOR &aCollector, int aFlags)
 
static wxPoint mirrorPointX (const wxPoint &aPoint, const wxPoint &aMirrorPoint)
 
static void mirrorPadX (D_PAD &aPad, const wxPoint &aMirrorPoint)
 Mirror a pad in the vertical axis passing through a point. More...
 

Function Documentation

◆ EditToolSelectionFilter()

void EditToolSelectionFilter ( GENERAL_COLLECTOR aCollector,
int  aFlags 
)

Definition at line 63 of file edit_tool.cpp.

64 {
65  // Iterate from the back so we don't have to worry about removals.
66  for( int i = aCollector.GetCount() - 1; i >= 0; --i )
67  {
68  BOARD_ITEM* item = aCollector[ i ];
69 
70  if( ( aFlags & EXCLUDE_LOCKED ) && item->IsLocked() )
71  {
72  aCollector.Remove( item );
73  }
74  else if( item->Type() == PCB_PAD_T )
75  {
76  MODULE* mod = static_cast<MODULE*>( item->GetParent() );
77 
78  // case 1: handle locking
79  if( ( aFlags & EXCLUDE_LOCKED ) && mod && mod->IsLocked() )
80  {
81  aCollector.Remove( item );
82  }
83  else if( ( aFlags & EXCLUDE_LOCKED_PADS ) && mod && mod->PadsLocked() )
84  {
85  // Pad locking is considerably "softer" than item locking
86  aCollector.Remove( item );
87 
88  if( !mod->IsLocked() && !aCollector.HasItem( mod ) )
89  aCollector.Append( mod );
90  }
91 
92  // case 2: selection contains both the module and its pads - remove the pads
93  if( !( aFlags & INCLUDE_PADS_AND_MODULES ) && mod && aCollector.HasItem( mod ) )
94  aCollector.Remove( item );
95  }
96  else if( ( aFlags & EXCLUDE_TRANSIENTS ) && item->Type() == PCB_MARKER_T )
97  {
98  aCollector.Remove( item );
99  }
100  }
101 }
#define INCLUDE_PADS_AND_MODULES
Definition: edit_tool.h:56
BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
Definition: collector.h:129
void Append(EDA_ITEM *item)
Function Append adds an item to the end of the list.
Definition: collector.h:119
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:100
bool HasItem(const EDA_ITEM *aItem) const
Function HasItem tests if aItem has already been collected.
Definition: collector.h:183
bool IsLocked() const override
Function IsLocked.
Definition: class_module.h:297
#define EXCLUDE_TRANSIENTS
Definition: edit_tool.h:55
virtual bool IsLocked() const
Function IsLocked.
class MARKER_PCB, a marker used to show something
Definition: typeinfo.h:99
bool PadsLocked() const
Definition: class_module.h:333
#define EXCLUDE_LOCKED
Function EditToolSelectionFilter.
Definition: edit_tool.h:53
#define EXCLUDE_LOCKED_PADS
Definition: edit_tool.h:54
BOARD_ITEM_CONTAINER * GetParent() const
KICAD_T Type() const
Function Type()
Definition: base_struct.h:197

References COLLECTOR::Append(), EXCLUDE_LOCKED, EXCLUDE_LOCKED_PADS, EXCLUDE_TRANSIENTS, COLLECTOR::GetCount(), BOARD_ITEM::GetParent(), COLLECTOR::HasItem(), INCLUDE_PADS_AND_MODULES, BOARD_ITEM::IsLocked(), MODULE::IsLocked(), MODULE::PadsLocked(), PCB_MARKER_T, PCB_PAD_T, COLLECTOR::Remove(), and EDA_ITEM::Type().

Referenced by EDIT_TOOL::ChangeTrackWidth(), EDIT_TOOL::copyToClipboard(), EDIT_TOOL::CreateArray(), ALIGN_DISTRIBUTE_TOOL::DistributeHorizontally(), ALIGN_DISTRIBUTE_TOOL::DistributeVertically(), EDIT_TOOL::Duplicate(), EDIT_TOOL::Flip(), ALIGN_DISTRIBUTE_TOOL::GetSelections(), EDIT_TOOL::Mirror(), EDIT_TOOL::Move(), EDIT_TOOL::MoveExact(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Properties(), EDIT_TOOL::Remove(), EDIT_TOOL::Rotate(), and POSITION_RELATIVE_TOOL::SelectPositionRelativeItem().

◆ mirrorPadX()

static void mirrorPadX ( D_PAD aPad,
const wxPoint aMirrorPoint 
)
static

Mirror a pad in the vertical axis passing through a point.

Definition at line 715 of file edit_tool.cpp.

716 {
717  wxPoint tmpPt = mirrorPointX( aPad.GetPosition(), aMirrorPoint );
718 
719  if( aPad.GetShape() == PAD_SHAPE_CUSTOM )
720  aPad.MirrorXPrimitives( tmpPt.x );
721 
722  aPad.SetPosition( tmpPt );
723 
724  aPad.SetX0( aPad.GetPosition().x );
725 
726  tmpPt = aPad.GetOffset();
727  tmpPt.x = -tmpPt.x;
728  aPad.SetOffset( tmpPt );
729 
730  auto tmpz = aPad.GetDelta();
731  tmpz.x = -tmpz.x;
732  aPad.SetDelta( tmpz );
733 
734  aPad.SetOrientation( -aPad.GetOrientation() );
735 }
void SetPosition(const wxPoint &aPos) override
Definition: class_pad.h:225
const wxPoint & GetOffset() const
Definition: class_pad.h:294
const wxSize & GetDelta() const
Definition: class_pad.h:288
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees,...
Definition: class_pad.h:411
static wxPoint mirrorPointX(const wxPoint &aPoint, const wxPoint &aMirrorPoint)
Definition: edit_tool.cpp:700
void SetOrientation(double aAngle)
Function SetOrientation sets the rotation angle of the pad.
Definition: class_pad.cpp:469
void SetX0(int x)
Definition: class_pad.h:282
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:222
const wxPoint GetPosition() const override
Definition: class_pad.h:226
void SetOffset(const wxPoint &aOffset)
Definition: class_pad.h:293
void MirrorXPrimitives(int aX)
Mirror the primitives about a coordinate.
Definition: class_pad.cpp:537
void SetDelta(const wxSize &aSize)
Definition: class_pad.h:287

References D_PAD::GetDelta(), D_PAD::GetOffset(), D_PAD::GetOrientation(), D_PAD::GetPosition(), D_PAD::GetShape(), mirrorPointX(), D_PAD::MirrorXPrimitives(), PAD_SHAPE_CUSTOM, D_PAD::SetDelta(), D_PAD::SetOffset(), D_PAD::SetOrientation(), D_PAD::SetPosition(), D_PAD::SetX0(), and wxPoint::x.

Referenced by EDIT_TOOL::Mirror().

◆ mirrorPointX()

static wxPoint mirrorPointX ( const wxPoint aPoint,
const wxPoint aMirrorPoint 
)
static

Mirror a point about the vertical axis passing through another point

Definition at line 700 of file edit_tool.cpp.

701 {
702  wxPoint mirrored = aPoint;
703 
704  mirrored.x -= aMirrorPoint.x;
705  mirrored.x = -mirrored.x;
706  mirrored.x += aMirrorPoint.x;
707 
708  return mirrored;
709 }

References wxPoint::x.

Referenced by mirrorPadX().