KiCad PCB EDA Suite
PCB_POINT_EDITOR Class Reference

Tool that displays edit points allowing to modify items by dragging the points. More...

#include <pcb_point_editor.h>

Inheritance diagram for PCB_POINT_EDITOR:
PCB_TOOL_BASE TOOL_INTERACTIVE TOOL_BASE

Public Types

enum  RESET_REASON { RUN, MODEL_RELOAD, GAL_SWITCH }
 Determine the reason of reset for a tool. More...
 

Public Member Functions

 PCB_POINT_EDITOR ()
 
void Reset (RESET_REASON aReason) override
 Bring the tool to a known, initial state. More...
 
bool Init () override
 Init() is called once upon a registration of the tool. More...
 
int OnSelectionChange (const TOOL_EVENT &aEvent)
 Change selection event handler. More...
 
bool HasPoint ()
 Indicate the cursor is over an edit point. More...
 
void SetIsFootprintEditor (bool aEnabled)
 Function SetIsFootprintEditor() More...
 
bool IsFootprintEditor () const
 
virtual bool Is45Limited () const
 Should the tool use its 45° mode option? More...
 
void Activate ()
 Run the tool. More...
 
TOOL_MENUGetToolMenu ()
 
void SetContextMenu (ACTION_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger=CMENU_BUTTON)
 Assign a context menu and tells when it should be activated. More...
 
void RunMainStack (std::function< void()> aFunc)
 Call a function using the main stack. More...
 
template<class T >
void Go (int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
 Define which state (aStateFunc) to go when a certain event arrives (aConditions). More...
 
TOOL_EVENTWait (const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
 Suspend execution of the tool until an event specified in aEventList arrives. More...
 
TOOL_TYPE GetType () const
 Return the type of the tool. More...
 
TOOL_ID GetId () const
 Return the unique identifier of the tool. More...
 
const std::string & GetName () const
 Return the name of the tool. More...
 
TOOL_MANAGERGetManager () const
 Return the instance of TOOL_MANAGER that takes care of the tool. More...
 
bool IsToolActive () const
 

Protected Types

enum  INTERACTIVE_PLACEMENT_OPTIONS { IPO_ROTATE = 0x01, IPO_FLIP = 0x02, IPO_SINGLE_CLICK = 0x04, IPO_REPEAT = 0x08 }
 Options for placing items interactively. More...
 

Protected Member Functions

void doInteractiveItemPlacement (const std::string &aTool, INTERACTIVE_PLACER_BASE *aPlacer, const wxString &aCommitMessage, int aOptions=IPO_ROTATE|IPO_FLIP|IPO_REPEAT)
 Helper function for performing a common interactive idiom: wait for a left click, place an item there (perhaps with a dialog or other user interaction), then have it move with the mouse and respond to rotate/flip, etc. More...
 
KIGFX::PCB_VIEWview () const
 
KIGFX::VIEW_CONTROLScontrols () const
 
PCB_BASE_EDIT_FRAMEframe () const
 
BOARDboard () const
 
FOOTPRINTfootprint () const
 
const PCB_DISPLAY_OPTIONSdisplayOptions () const
 
PCB_DRAW_PANEL_GALcanvas () const
 
const PCB_SELECTIONselection () const
 
PCB_SELECTIONselection ()
 
void attachManager (TOOL_MANAGER *aManager)
 Set the TOOL_MANAGER the tool will belong to. More...
 
KIGFX::VIEWgetView () const
 Returns the instance of #VIEW object used in the application. More...
 
KIGFX::VIEW_CONTROLSgetViewControls () const
 Return the instance of VIEW_CONTROLS object used in the application. More...
 
template<typename T >
T * getEditFrame () const
 Return the application window object, casted to requested user type. More...
 
template<typename T >
T * getModel () const
 Return the model object if it matches the requested type. More...
 

Protected Attributes

bool m_isFootprintEditor
 
TOOL_MENU m_menu
 The functions below are not yet implemented - their interface may change. More...
 
TOOL_TYPE m_type
 Unique identifier for the tool, assigned by a TOOL_MANAGER instance. More...
 
TOOL_ID m_toolId
 Name of the tool. More...
 
std::string m_toolName
 
TOOL_MANAGERm_toolMgr
 

Private Member Functions

void setTransitions () override
 < Set up handlers for various events. More...
 
void buildForPolyOutline (std::shared_ptr< EDIT_POINTS > points, const SHAPE_POLY_SET *aOutline)
 
std::shared_ptr< EDIT_POINTSmakePoints (EDA_ITEM *aItem)
 Update item's points with edit points. More...
 
void updateItem () const
 Apply the last changes to the edited item. More...
 
void finishItem ()
 
bool validatePolygon (SHAPE_POLY_SET &aModified) const
 Validate a polygon and displays a popup warning if invalid. More...
 
void updatePoints ()
 Update which point is being edited. More...
 
void updateEditedPoint (const TOOL_EVENT &aEvent)
 Set the current point being edited. NULL means none. More...
 
void setEditedPoint (EDIT_POINT *aPoint)
 
int getEditedPointIndex () const
 Return true if aPoint is the currently modified point. More...
 
bool isModified (const EDIT_POINT &aPoint) const
 Set up an alternative constraint (typically enabled upon a modifier key being pressed). More...
 
void setAltConstraint (bool aEnabled)
 Return a point that should be used as a constrainer for 45 degrees mode. More...
 
EDIT_POINT get45DegConstrainer () const
 Condition to display "Create corner" context menu entry. More...
 
bool removeCornerCondition (const SELECTION &aSelection)
 
int addCorner (const TOOL_EVENT &aEvent)
 TOOL_ACTION handlers. More...
 
int removeCorner (const TOOL_EVENT &aEvent)
 
int modifiedSelection (const TOOL_EVENT &aEvent)
 
void editArcEndpointKeepTangent (PCB_SHAPE *aArc, const VECTOR2I &aCenter, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
 Move an end point of the arc, while keeping the tangent at the other endpoint. More...
 
void editArcEndpointKeepCenter (PCB_SHAPE *aArc, const VECTOR2I &aCenter, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
 Move an end point of the arc around the circumference. More...
 
void editArcMidKeepEndpoints (PCB_SHAPE *aArc, const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
 Move the mid point of the arc, while keeping the two endpoints. More...
 
void editArcMidKeepCenter (PCB_SHAPE *aArc, const VECTOR2I &aCenter, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
 Move the mid point of the arc, while keeping the angle. More...
 
int changeEditMethod (const TOOL_EVENT &aEvent)
 

Static Private Member Functions

static bool addCornerCondition (const SELECTION &aSelection)
 Determine if the tool can currently add a corner to the given item. More...
 
static bool canAddCorner (const EDA_ITEM &aItem)
 Condition to display "Remove corner" context menu entry. More...
 

Private Attributes

PCB_SELECTION_TOOLm_selectionTool
 
std::unique_ptr< STATUS_TEXT_POPUPm_statusPopup
 
std::shared_ptr< EDIT_POINTSm_editPoints
 
EDIT_POINTm_editedPoint
 
EDIT_POINTm_hoveredPoint
 
EDIT_POINT m_original
 Original position for the current drag point. More...
 
bool m_refill
 
bool m_altEditMethod
 
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_altConstraint
 
EDIT_POINT m_altConstrainer
 

Detailed Description

Tool that displays edit points allowing to modify items by dragging the points.

Definition at line 43 of file pcb_point_editor.h.

Member Enumeration Documentation

◆ INTERACTIVE_PLACEMENT_OPTIONS

Options for placing items interactively.

Enumerator
IPO_ROTATE 

Handle the rotate action in the loop by calling the item's rotate method.

IPO_FLIP 

Handle flip action in the loop by calling the item's flip method.

IPO_SINGLE_CLICK 

Create an item immediately on placement starting, otherwise show the pencil cursor until the item is created.

IPO_REPEAT 

Allow repeat placement of the item.

Definition at line 116 of file pcb_tool_base.h.

116  {
118  IPO_ROTATE = 0x01,
119 
121  IPO_FLIP = 0x02,
122 
125  IPO_SINGLE_CLICK = 0x04,
126 
128  IPO_REPEAT = 0x08
129  };
Handle flip action in the loop by calling the item's flip method.
Allow repeat placement of the item.
Create an item immediately on placement starting, otherwise show the pencil cursor until the item is ...
Handle the rotate action in the loop by calling the item's rotate method.

◆ RESET_REASON

enum TOOL_BASE::RESET_REASON
inherited

Determine the reason of reset for a tool.

Enumerator
RUN 

Tool is invoked after being inactive.

MODEL_RELOAD 

Model changes (required full reload)

GAL_SWITCH 

Rendering engine changes.

Definition at line 77 of file tool_base.h.

78  {
79  RUN,
80  MODEL_RELOAD,
81  GAL_SWITCH
82  };
Model changes (required full reload)
Definition: tool_base.h:80
Tool is invoked after being inactive.
Definition: tool_base.h:79
Rendering engine changes.
Definition: tool_base.h:81

Constructor & Destructor Documentation

◆ PCB_POINT_EDITOR()

PCB_POINT_EDITOR::PCB_POINT_EDITOR ( )

Definition at line 101 of file pcb_point_editor.cpp.

101  :
102  PCB_TOOL_BASE( "pcbnew.PointEditor" ),
103  m_selectionTool( nullptr ),
104  m_editedPoint( nullptr ),
105  m_hoveredPoint( nullptr ),
106  m_original( VECTOR2I( 0, 0 ) ),
107  m_refill( false ),
108  m_altEditMethod( false ),
109  m_altConstrainer( VECTOR2I( 0, 0 ) )
110 {
111 }
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
EDIT_POINT * m_editedPoint
EDIT_POINT m_altConstrainer
PCB_SELECTION_TOOL * m_selectionTool
PCB_TOOL_BASE(TOOL_ID aId, const std::string &aName)
Constructor.
Definition: pcb_tool_base.h:77
EDIT_POINT m_original
Original position for the current drag point.
EDIT_POINT * m_hoveredPoint

Member Function Documentation

◆ Activate()

void TOOL_INTERACTIVE::Activate ( )
inherited

Run the tool.

After activation, the tool starts receiving events until it is finished.

Definition at line 51 of file tool_interactive.cpp.

52 {
54 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
TOOL_ID m_toolId
Name of the tool.
Definition: tool_base.h:209
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.

References TOOL_MANAGER::InvokeTool(), TOOL_BASE::m_toolId, and TOOL_BASE::m_toolMgr.

Referenced by AUTOPLACE_TOOL::autoplace(), EDIT_TOOL::copyToClipboard(), SYMBOL_EDITOR_EDIT_TOOL::DeleteItemCursor(), PL_EDIT_TOOL::DeleteItemCursor(), SCH_EDIT_TOOL::DeleteItemCursor(), PCB_CONTROL::DeleteItemCursor(), SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::doMoveSelection(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::DrawArc(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawDimension(), DRAWING_TOOL::DrawLine(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::DrawRectangle(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), PL_DRAWING_TOOLS::DrawShape(), SCH_DRAWING_TOOLS::DrawSheet(), DRAWING_TOOL::DrawZone(), BOARD_EDITOR_CONTROL::DrillOrigin(), PAD_TOOL::EnumeratePads(), PCB_CONTROL::GridSetOrigin(), SCH_EDITOR_CONTROL::HighlightNetCursor(), ROUTER_TOOL::InlineBreakTrack(), ROUTER_TOOL::InlineDrag(), DRAWING_TOOL::InteractivePlaceWithPreview(), BOARD_INSPECTION_TOOL::LocalRatsnestTool(), PCB_PICKER_TOOL::Main(), PL_EDIT_TOOL::Main(), EE_POINT_EDITOR::Main(), SYMBOL_EDITOR_MOVE_TOOL::Main(), PL_POINT_EDITOR::Main(), SCH_MOVE_TOOL::Main(), PICKER_TOOL::Main(), ROUTER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::MainLoop(), GERBVIEW_INSPECTION_TOOL::MeasureTool(), PCB_VIEWER_TOOLS::MeasureTool(), LIB_TREE::onContextMenu(), OnSelectionChange(), GROUP_TOOL::PickNewMember(), SYMBOL_EDITOR_DRAWING_TOOLS::PlaceAnchor(), BOARD_EDITOR_CONTROL::PlaceFootprint(), SCH_DRAWING_TOOLS::PlaceImage(), DRAWING_TOOL::PlaceImportedGraphics(), PL_DRAWING_TOOLS::PlaceItem(), SCH_DRAWING_TOOLS::PlaceSymbol(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), EDIT_TOOL::Remove(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), DRAWING_TOOL::SetAnchor(), DRC_TOOL::ShowDRCDialog(), SCH_DRAWING_TOOLS::SingleClickPlace(), SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace(), SCH_DRAWING_TOOLS::TwoClickPlace(), and SCH_LINE_WIRE_BUS_TOOL::UnfoldBus().

◆ addCorner()

int PCB_POINT_EDITOR::addCorner ( const TOOL_EVENT aEvent)
private

TOOL_ACTION handlers.

Definition at line 1973 of file pcb_point_editor.cpp.

1974 {
1975  if( !m_editPoints )
1976  return 0;
1977 
1978  EDA_ITEM* item = m_editPoints->GetParent();
1979  PCB_BASE_EDIT_FRAME* frame = getEditFrame<PCB_BASE_EDIT_FRAME>();
1980  const VECTOR2I& cursorPos = getViewControls()->GetCursorPosition();
1981 
1982  // called without an active edited polygon
1983  if( !item || !canAddCorner( *item ) )
1984  return 0;
1985 
1986  PCB_SHAPE* graphicItem = dynamic_cast<PCB_SHAPE*>( item );
1987  BOARD_COMMIT commit( frame );
1988 
1989  if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T
1990  || ( graphicItem && graphicItem->GetShape() == SHAPE_T::POLY ) )
1991  {
1992  unsigned int nearestIdx = 0;
1993  unsigned int nextNearestIdx = 0;
1994  unsigned int nearestDist = INT_MAX;
1995  unsigned int firstPointInContour = 0;
1996  SHAPE_POLY_SET* zoneOutline;
1997 
1998  if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
1999  {
2000  ZONE* zone = static_cast<ZONE*>( item );
2001  zoneOutline = zone->Outline();
2002  zone->SetNeedRefill( true );
2003  }
2004  else
2005  zoneOutline = &( graphicItem->GetPolyShape() );
2006 
2007  commit.Modify( item );
2008 
2009  // Search the best outline segment to add a new corner
2010  // and therefore break this segment into two segments
2011 
2012  // Object to iterate through the corners of the outlines (main contour and its holes)
2013  SHAPE_POLY_SET::ITERATOR iterator = zoneOutline->Iterate( 0, zoneOutline->OutlineCount()-1,
2014  /* IterateHoles */ true );
2015  int curr_idx = 0;
2016 
2017  // Iterate through all the corners of the outlines and search the best segment
2018  for( ; iterator; iterator++, curr_idx++ )
2019  {
2020  int jj = curr_idx+1;
2021 
2022  if( iterator.IsEndContour() )
2023  { // We reach the last point of the current contour (main or hole)
2024  jj = firstPointInContour;
2025  firstPointInContour = curr_idx+1; // Prepare next contour analysis
2026  }
2027 
2028  SEG curr_segment( zoneOutline->CVertex( curr_idx ), zoneOutline->CVertex( jj ) );
2029 
2030  unsigned int distance = curr_segment.Distance( cursorPos );
2031 
2032  if( distance < nearestDist )
2033  {
2034  nearestDist = distance;
2035  nearestIdx = curr_idx;
2036  nextNearestIdx = jj;
2037  }
2038  }
2039 
2040  // Find the point on the closest segment
2041  auto& sideOrigin = zoneOutline->CVertex( nearestIdx );
2042  auto& sideEnd = zoneOutline->CVertex( nextNearestIdx );
2043  SEG nearestSide( sideOrigin, sideEnd );
2044  VECTOR2I nearestPoint = nearestSide.NearestPoint( cursorPos );
2045 
2046  // Do not add points that have the same coordinates as ones that already belong to polygon
2047  // instead, add a point in the middle of the side
2048  if( nearestPoint == sideOrigin || nearestPoint == sideEnd )
2049  nearestPoint = ( sideOrigin + sideEnd ) / 2;
2050 
2051  zoneOutline->InsertVertex( nextNearestIdx, nearestPoint );
2052 
2053  // We re-hatch the filled zones but not polygons
2054  if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
2055  static_cast<ZONE*>( item )->HatchBorder();
2056 
2057 
2058  commit.Push( _( "Add a zone corner" ) );
2059  }
2060  else if( graphicItem && graphicItem->GetShape() == SHAPE_T::SEGMENT )
2061  {
2062  commit.Modify( graphicItem );
2063 
2064  SEG seg( graphicItem->GetStart(), graphicItem->GetEnd() );
2065  VECTOR2I nearestPoint = seg.NearestPoint( cursorPos );
2066 
2067  // Move the end of the line to the break point..
2068  graphicItem->SetEnd( wxPoint( nearestPoint.x, nearestPoint.y ) );
2069 
2070  if( graphicItem->Type() == PCB_FP_SHAPE_T )
2071  static_cast<FP_SHAPE*>( graphicItem )->SetLocalCoord();
2072 
2073  // and add another one starting from the break point
2074  PCB_SHAPE* newSegment;
2075 
2076  if( item->Type() == PCB_FP_SHAPE_T )
2077  {
2078  FP_SHAPE* edge = static_cast<FP_SHAPE*>( graphicItem );
2079  assert( edge->GetParent()->Type() == PCB_FOOTPRINT_T );
2080  newSegment = new FP_SHAPE( *edge );
2081  }
2082  else
2083  {
2084  newSegment = new PCB_SHAPE( *graphicItem );
2085  }
2086 
2087  newSegment->ClearSelected();
2088  newSegment->SetStart( wxPoint( nearestPoint.x, nearestPoint.y ) );
2089  newSegment->SetEnd( wxPoint( seg.B.x, seg.B.y ) );
2090 
2091  if( newSegment->Type() == PCB_FP_SHAPE_T )
2092  static_cast<FP_SHAPE*>( newSegment )->SetLocalCoord();
2093 
2094  commit.Add( newSegment );
2095  commit.Push( _( "Split segment" ) );
2096  }
2097 
2098  updatePoints();
2099  return 0;
2100 }
int OutlineCount() const
Return the number of vertices in a given outline/hole.
void updatePoints()
Update which point is being edited.
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
void ClearSelected()
Definition: eda_item.h:131
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
SHAPE_POLY_SET * Outline()
Definition: zone.h:320
void InsertVertex(int aGlobalIndex, const VECTOR2I &aNewVertex)
Adds a vertex in the globally indexed position aGlobalIndex.
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
ITERATOR Iterate(int aFirst, int aLast, bool aIterateHoles=false)
Return an object to iterate through the points of the polygons between aFirst and aLast.
std::shared_ptr< EDIT_POINTS > m_editPoints
void SetStart(const wxPoint &aStart)
Definition: eda_shape.h:110
PCB_BASE_EDIT_FRAME * frame() const
static bool canAddCorner(const EDA_ITEM &aItem)
Condition to display "Remove corner" context menu entry.
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
Represent a set of closed polygons.
#define _(s)
Handle a list of polygons defining a copper zone.
Definition: zone.h:56
class ZONE, a copper pour area
Definition: typeinfo.h:105
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
Definition: seg.h:40
Common, abstract interface for edit frames.
Base class for iterating over all vertices in a given SHAPE_POLY_SET.
class ZONE, managed by a footprint
Definition: typeinfo.h:94
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:238
SHAPE_T GetShape() const
Definition: eda_shape.h:101
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:136
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References _, COMMIT::Add(), canAddCorner(), EDA_ITEM::ClearSelected(), SHAPE_POLY_SET::CVertex(), distance(), PCB_TOOL_BASE::frame(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), EDA_SHAPE::GetEnd(), BOARD_ITEM::GetParent(), EDA_SHAPE::GetPolyShape(), EDA_SHAPE::GetShape(), EDA_SHAPE::GetStart(), TOOL_BASE::getViewControls(), SHAPE_POLY_SET::InsertVertex(), SHAPE_POLY_SET::ITERATOR_TEMPLATE< T >::IsEndContour(), SHAPE_POLY_SET::Iterate(), m_editPoints, COMMIT::Modify(), SEG::NearestPoint(), ZONE::Outline(), SHAPE_POLY_SET::OutlineCount(), PCB_FOOTPRINT_T, PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_ZONE_T, POLY, BOARD_COMMIT::Push(), SEGMENT, EDA_SHAPE::SetEnd(), ZONE::SetNeedRefill(), EDA_SHAPE::SetStart(), EDA_ITEM::Type(), and updatePoints().

Referenced by setTransitions().

◆ addCornerCondition()

bool PCB_POINT_EDITOR::addCornerCondition ( const SELECTION aSelection)
staticprivate

Determine if the tool can currently add a corner to the given item.

Definition at line 1892 of file pcb_point_editor.cpp.

1893 {
1894  if( aSelection.Size() != 1 )
1895  return false;
1896 
1897  const EDA_ITEM* item = aSelection.Front();
1898 
1899  return ( item != nullptr ) && canAddCorner( *item );
1900 }
static bool canAddCorner(const EDA_ITEM &aItem)
Condition to display "Remove corner" context menu entry.
int Size() const
Returns the number of selected parts.
Definition: selection.h:104
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
EDA_ITEM * Front() const
Definition: selection.h:145

References canAddCorner(), SELECTION::Front(), and SELECTION::Size().

Referenced by Init().

◆ attachManager()

void TOOL_BASE::attachManager ( TOOL_MANAGER aManager)
protectedinherited

Set the TOOL_MANAGER the tool will belong to.

Called by TOOL_MANAGER::RegisterTool()

Definition at line 60 of file tool_base.cpp.

61 {
62  m_toolMgr = aManager;
63 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214

References TOOL_BASE::m_toolMgr.

Referenced by TOOL_MANAGER::RegisterTool().

◆ board()

BOARD* PCB_TOOL_BASE::board ( ) const
inlineprotectedinherited

Definition at line 165 of file pcb_tool_base.h.

165 { return getModel<BOARD>(); }

Referenced by PCB_CONTROL::AppendBoard(), AUTOPLACE_TOOL::autoplace(), BOARD_INSPECTION_TOOL::calculateSelectionRatsnest(), EDIT_TOOL::ChangeTrackWidth(), ZONE_FILLER_TOOL::CheckAllZones(), BOARD_INSPECTION_TOOL::ClearHighlight(), EDIT_TOOL::copyToClipboard(), FOOTPRINT_EDITOR_CONTROL::CreateFootprint(), MICROWAVE_TOOL::createInductorBetween(), ROUTER_TOOL::CustomTrackWidthDialog(), PCB_CONTROL::DeleteItemCursor(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), DRAWING_TOOL::drawSegment(), PAD_TOOL::EnumeratePads(), PAD_TOOL::explodePad(), BOARD_EDITOR_CONTROL::ExportNetlist(), ZONE_FILLER_TOOL::FillAllZones(), EDIT_TOOL::FilletTracks(), PCB_SELECTION_TOOL::filterSelection(), PCB_TOOL_BASE::footprint(), PCB_SELECTION_TOOL::GetBoard(), PCB_SELECTION_TOOL::getCollectorsGuide(), GROUP_TOOL::Group(), ROUTER_TOOL::handleLayerSwitch(), BOARD_INSPECTION_TOOL::highlightNet(), ROUTER_TOOL::InlineDrag(), DRAWING_TOOL::InteractivePlaceWithPreview(), PCB_CONTROL::LayerNext(), PCB_CONTROL::LayerPrev(), BOARD_INSPECTION_TOOL::LocalRatsnestTool(), EDIT_TOOL::MoveExact(), FOOTPRINT_EDITOR_CONTROL::NewFootprint(), PCB_CONTROL::Paste(), PCB_CONTROL::placeBoardItems(), BOARD_EDITOR_CONTROL::PlaceFootprint(), PAD_TOOL::PlacePad(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), PCB_SELECTION_TOOL::RebuildSelection(), PAD_TOOL::recombinePad(), BOARD_EDITOR_CONTROL::RepairBoard(), FOOTPRINT_EDITOR_CONTROL::RepairFootprint(), PNS::TOOL_BASE::Reset(), PCB_CONTROL::Reset(), PCB_SELECTION_TOOL::Selectable(), PCB_SELECTION_TOOL::selectAllItemsOnNet(), PCB_SELECTION_TOOL::selectAllItemsOnSheet(), PCB_SELECTION_TOOL::selectConnectedTracks(), PCB_SELECTION_TOOL::selectionContains(), PCB_SELECTION_TOOL::selectPoint(), PCB_CONTROL::TrackDisplayMode(), PCB_CONTROL::unfilledZoneCheck(), GROUP_TOOL::Ungroup(), ROUTER_TOOL::UpdateMessagePanel(), PCB_CONTROL::ViaDisplayMode(), PCB_CONTROL::ZoneDisplayMode(), ZONE_FILLER_TOOL::ZoneFill(), BOARD_EDITOR_CONTROL::ZoneMerge(), and ZONE_FILLER_TOOL::ZoneUnfillAll().

◆ buildForPolyOutline()

void PCB_POINT_EDITOR::buildForPolyOutline ( std::shared_ptr< EDIT_POINTS points,
const SHAPE_POLY_SET aOutline 
)
private

Definition at line 143 of file pcb_point_editor.cpp.

145 {
146  int cornersCount = aOutline->TotalVertices();
147 
148  for( auto iterator = aOutline->CIterateWithHoles(); iterator; iterator++ )
149  {
150  points->AddPoint( *iterator );
151 
152  if( iterator.IsEndContour() )
153  points->AddBreak();
154  }
155 
156  // Lines have to be added after creating edit points,
157  // as they use EDIT_POINT references
158  for( int i = 0; i < cornersCount - 1; ++i )
159  {
160  if( points->IsContourEnd( i ) )
161  points->AddLine( points->Point( i ), points->Point( points->GetContourStartIdx( i ) ) );
162  else
163  points->AddLine( points->Point( i ), points->Point( i + 1 ) );
164 
165  points->Line( i ).SetConstraint( new EC_PERPLINE( points->Line( i ) ) );
166  }
167 
168  // The last missing line, connecting the last and the first polygon point
169  points->AddLine( points->Point( cornersCount - 1 ),
170  points->Point( points->GetContourStartIdx( cornersCount - 1 ) ) );
171 
172  points->Line( points->LinesSize() - 1 )
173  .SetConstraint( new EC_PERPLINE( points->Line( points->LinesSize() - 1 ) ) );
174 }
int TotalVertices() const
Delete aIdx-th polygon from the set.
EDIT_CONSTRAINT for a EDIT_LINE, that constrains the line to move perpendicular to the line itself.
CONST_ITERATOR CIterateWithHoles(int aOutline) const

References SHAPE_POLY_SET::CIterateWithHoles(), and SHAPE_POLY_SET::TotalVertices().

Referenced by makePoints().

◆ canAddCorner()

bool PCB_POINT_EDITOR::canAddCorner ( const EDA_ITEM aItem)
staticprivate

Condition to display "Remove corner" context menu entry.

Definition at line 1874 of file pcb_point_editor.cpp.

1875 {
1876  const auto type = aItem.Type();
1877 
1878  // Works only for zones and line segments
1879  if( type == PCB_ZONE_T || type == PCB_FP_ZONE_T )
1880  return true;
1881 
1882  if( type == PCB_SHAPE_T || type == PCB_FP_SHAPE_T )
1883  {
1884  const PCB_SHAPE& shape = static_cast<const PCB_SHAPE&>( aItem );
1885  return shape.GetShape() == SHAPE_T::SEGMENT || shape.GetShape() == SHAPE_T::POLY;
1886  }
1887 
1888  return false;
1889 }
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
class ZONE, a copper pour area
Definition: typeinfo.h:105
class ZONE, managed by a footprint
Definition: typeinfo.h:94
SHAPE_T GetShape() const
Definition: eda_shape.h:101
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References EDA_SHAPE::GetShape(), PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_SHAPE_T, PCB_ZONE_T, POLY, SEGMENT, and EDA_ITEM::Type().

Referenced by addCorner(), and addCornerCondition().

◆ canvas()

◆ changeEditMethod()

int PCB_POINT_EDITOR::changeEditMethod ( const TOOL_EVENT aEvent)
private

Definition at line 2186 of file pcb_point_editor.cpp.

2187 {
2189  return 0;
2190 }

References m_altEditMethod.

Referenced by setTransitions().

◆ controls()

◆ displayOptions()

const PCB_DISPLAY_OPTIONS & PCB_TOOL_BASE::displayOptions ( ) const
protectedinherited

◆ doInteractiveItemPlacement()

void PCB_TOOL_BASE::doInteractiveItemPlacement ( const std::string &  aTool,
INTERACTIVE_PLACER_BASE aPlacer,
const wxString &  aCommitMessage,
int  aOptions = IPO_ROTATE | IPO_FLIP | IPO_REPEAT 
)
protectedinherited

Helper function for performing a common interactive idiom: wait for a left click, place an item there (perhaps with a dialog or other user interaction), then have it move with the mouse and respond to rotate/flip, etc.

More complex interactive processes are not supported here, you should implement a customised event loop for those.

Parameters
aItemCreatorthe callable that will attempt to create the item
aCommitMessagethe message used on a successful commit

Definition at line 37 of file pcb_tool_base.cpp.

40 {
41  using namespace std::placeholders;
42  std::unique_ptr<BOARD_ITEM> newItem;
43 
44  frame()->PushTool( aTool );
45 
46  BOARD_COMMIT commit( frame() );
47 
49 
50  Activate();
51  // Must be done after Activate() so that it gets set into the correct context
52  controls()->ShowCursor( true );
53  // do not capture or auto-pan until we start placing an item
54 
55  PCB_GRID_HELPER grid( m_toolMgr, frame()->GetMagneticItemsSettings() );
56 
57  // Add a VIEW_GROUP that serves as a preview for the new item
58  PCB_SELECTION preview;
59  view()->Add( &preview );
60 
61  aPlacer->m_board = board();
62  aPlacer->m_frame = frame();
63  aPlacer->m_modifiers = 0;
64 
65  auto makeNewItem =
66  [&]( VECTOR2I aPosition )
67  {
68  if( frame()->GetModel() )
69  newItem = aPlacer->CreateItem();
70 
71  if( newItem )
72  {
73  newItem->SetPosition( (wxPoint) aPosition );
74  preview.Add( newItem.get() );
75 
76  if( newItem->Type() == PCB_FOOTPRINT_T )
77  {
78  FOOTPRINT* fp = dyn_cast<FOOTPRINT*>( newItem.get() );
79 
80  // footprints have more drawable parts
81  fp->RunOnChildren( std::bind( &KIGFX::VIEW_GROUP::Add, &preview, _1 ) );
82  }
83  }
84  };
85 
86  if( aOptions & IPO_SINGLE_CLICK )
87  makeNewItem( controls()->GetCursorPosition() );
88 
89  auto setCursor =
90  [&]()
91  {
92  if( !newItem )
94  else
96  };
97 
98  // Set initial cursor
99  setCursor();
100 
101  // Main loop: keep receiving events
102  while( TOOL_EVENT* evt = Wait() )
103  {
104  setCursor();
105 
106  grid.SetSnap( false ); // Interactive placement tools need to set their own item snaps
107  grid.SetUseGrid( getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
108  VECTOR2I cursorPos = grid.BestSnapAnchor( controls()->GetMousePosition(), nullptr );
109 
110  aPlacer->m_modifiers = evt->Modifier();
111 
112  auto cleanup =
113  [&] ()
114  {
115  newItem = nullptr;
116  preview.Clear();
117  view()->Update( &preview );
118  controls()->SetAutoPan( false );
119  controls()->CaptureCursor( false );
120  controls()->ShowCursor( true );
121  };
122 
123  if( evt->IsCancelInteractive() )
124  {
125  if( aOptions & IPO_SINGLE_CLICK )
126  {
127  cleanup();
128  frame()->PopTool( aTool );
129  break;
130  }
131  else if( newItem )
132  {
133  cleanup();
134  }
135  else
136  {
137  frame()->PopTool( aTool );
138  break;
139  }
140  }
141  else if( evt->IsActivate() )
142  {
143  if( newItem )
144  cleanup();
145 
146  if( evt->IsPointEditor() )
147  {
148  // don't exit (the point editor runs in the background)
149  }
150  else if( evt->IsMoveTool() )
151  {
152  // leave ourselves on the stack so we come back after the move
153  break;
154  }
155  else
156  {
157  frame()->PopTool( aTool );
158  break;
159  }
160  }
161  else if( evt->IsClick( BUT_LEFT ) || evt->IsDblClick( BUT_LEFT ) )
162  {
163  if( !newItem )
164  {
165  // create the item if possible
166  makeNewItem( cursorPos );
167 
168  // no item created, so wait for another click
169  if( !newItem )
170  continue;
171 
172  controls()->CaptureCursor( true );
173  controls()->SetAutoPan( true );
174  }
175  else
176  {
177  auto oldFlags = newItem->GetFlags();
178  newItem->ClearFlags();
179 
180  if( !aPlacer->PlaceItem( newItem.get(), commit ) )
181  {
182  newItem->SetFlags( oldFlags );
183  continue;
184  }
185 
186  preview.Clear();
187  newItem.release();
188  commit.Push( aCommitMessage );
189 
190  controls()->CaptureCursor( false );
191  controls()->SetAutoPan( false );
192  controls()->ShowCursor( true );
193 
194  if( !( aOptions & IPO_REPEAT ) )
195  break;
196 
197  if( aOptions & IPO_SINGLE_CLICK )
198  makeNewItem( controls()->GetCursorPosition() );
199 
200  setCursor();
201  }
202  }
203  else if( evt->IsClick( BUT_RIGHT ) )
204  {
206  }
207  else if( evt->IsAction( &PCB_ACTIONS::trackViaSizeChanged ) )
208  {
210  }
211  else if( newItem && evt->Category() == TC_COMMAND )
212  {
213  /*
214  * Handle any events that can affect the item as we move it around
215  */
216  if( TOOL_EVT_UTILS::IsRotateToolEvt( *evt ) && ( aOptions & IPO_ROTATE ) )
217  {
218  const int rotationAngle = TOOL_EVT_UTILS::GetEventRotationAngle( *frame(), *evt );
219  newItem->Rotate( newItem->GetPosition(), rotationAngle );
220  view()->Update( &preview );
221  }
222  else if( evt->IsAction( &PCB_ACTIONS::flip ) && ( aOptions & IPO_FLIP ) )
223  {
224  newItem->Flip( newItem->GetPosition(), frame()->Settings().m_FlipLeftRight );
225  view()->Update( &preview );
226  }
227  else if( evt->IsAction( &PCB_ACTIONS::properties ) )
228  {
229  frame()->OnEditItemRequest( newItem.get() );
230 
231  // Notify other tools of the changes
233  }
234  else if( evt->IsAction( &ACTIONS::refreshPreview ) )
235  {
236  preview.Clear();
237  newItem.release();
238 
239  makeNewItem( (wxPoint) cursorPos );
240  aPlacer->SnapItem( newItem.get() );
241  view()->Update( &preview );
242  }
243  else
244  {
245  evt->SetPassEvent();
246  }
247  }
248  else if( newItem && evt->IsMotion() )
249  {
250  // track the cursor
251  newItem->SetPosition( (wxPoint) cursorPos );
252  aPlacer->SnapItem( newItem.get() );
253 
254  // Show a preview of the item
255  view()->Update( &preview );
256  }
257  else
258  {
259  evt->SetPassEvent();
260  }
261  }
262 
263  view()->Remove( &preview );
265  controls()->SetAutoPan( false );
266  controls()->CaptureCursor( false );
267 }
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:59
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
TOOL_MENU m_menu
The functions below are not yet implemented - their interface may change.
virtual void Clear() override
Remove all the stored items from the group.
Definition: selection.h:83
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Suspend execution of the tool until an event specified in aEventList arrives.
virtual bool PlaceItem(BOARD_ITEM *aItem, BOARD_COMMIT &aCommit)
Handle flip action in the loop by calling the item's flip method.
BOARD * board() const
virtual void Add(EDA_ITEM *aItem)
Definition: selection.cpp:32
virtual std::unique_ptr< BOARD_ITEM > CreateItem()=0
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
virtual void OnEditItemRequest(BOARD_ITEM *aItem)=0
Install the corresponding dialog editor for the given item.
virtual void PushTool(const std::string &actionName)
NB: the definition of "tool" is different at the user level.
static TOOL_ACTION properties
Activation of the edit tool.
Definition: pcb_actions.h:117
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:143
static TOOL_ACTION trackViaSizeChanged
Definition: pcb_actions.h:299
bool IsRotateToolEvt(const TOOL_EVENT &aEvt)
Function isRotateToolEvt()
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition: pcb_view.cpp:75
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:205
TOOL_MANAGER * GetManager() const
Return the instance of TOOL_MANAGER that takes care of the tool.
Definition: tool_base.h:143
PCB_BASE_EDIT_FRAME * frame() const
virtual void SnapItem(BOARD_ITEM *aItem)
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition: pcb_view.cpp:92
const PCB_SELECTION & selection() const
Allow repeat placement of the item.
bool ProcessEvent(const TOOL_EVENT &aEvent)
Propagate an event to tools that requested events of matching type(s).
virtual void PopTool(const std::string &actionName)
virtual void CaptureCursor(bool aEnabled)
Force the cursor to stay within the drawing panel area.
Generic, UI-independent tool event.
Definition: tool_event.h:152
KIGFX::PCB_VIEW * view() const
Create an item immediately on placement starting, otherwise show the pencil cursor until the item is ...
virtual void Add(VIEW_ITEM *aItem)
Add an item to the group.
Definition: view_group.cpp:57
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
class FOOTPRINT, a footprint
Definition: typeinfo.h:88
virtual BOARD_ITEM_CONTAINER * GetModel() const =0
static TOOL_ACTION flip
Flipping of selected objects.
Definition: pcb_actions.h:105
Handle the rotate action in the loop by calling the item's rotate method.
KIGFX::VIEW_CONTROLS * controls() const
PCBNEW_SETTINGS & Settings()
void Activate()
Run the tool.
void RunOnChildren(const std::function< void(BOARD_ITEM *)> &aFunction) const
Invoke a function on all BOARD_ITEMs that belong to the footprint (pads, drawings,...
Definition: footprint.cpp:1299
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition: pcb_view.cpp:58
PCB_BASE_EDIT_FRAME * m_frame
Definition: pcb_tool_base.h:64
int GetEventRotationAngle(const PCB_BASE_EDIT_FRAME &aFrame, const TOOL_EVENT &aEvt)
Function getEventRotationAngle()
void ShowContextMenu(SELECTION &aSelection)
Helper function to set and immediately show a CONDITIONAL_MENU in concert with the given SELECTION.
Definition: tool_menu.cpp:59
static TOOL_ACTION refreshPreview
Definition: actions.h:106

References TOOL_INTERACTIVE::Activate(), KIGFX::PCB_VIEW::Add(), KIGFX::VIEW_GROUP::Add(), SELECTION::Add(), ARROW, PCB_TOOL_BASE::board(), BUT_LEFT, BUT_RIGHT, KIGFX::VIEW_CONTROLS::CaptureCursor(), SELECTION::Clear(), PCB_TOOL_BASE::controls(), INTERACTIVE_PLACER_BASE::CreateItem(), PCB_ACTIONS::flip, PCB_TOOL_BASE::frame(), PCB_BASE_FRAME::GetCanvas(), TOOL_EVT_UTILS::GetEventRotationAngle(), TOOL_BASE::GetManager(), PCB_BASE_FRAME::GetModel(), TOOL_BASE::getView(), grid, PCB_TOOL_BASE::IPO_FLIP, PCB_TOOL_BASE::IPO_REPEAT, PCB_TOOL_BASE::IPO_ROTATE, PCB_TOOL_BASE::IPO_SINGLE_CLICK, TOOL_EVT_UTILS::IsRotateToolEvt(), INTERACTIVE_PLACER_BASE::m_board, PCBNEW_SETTINGS::m_FlipLeftRight, INTERACTIVE_PLACER_BASE::m_frame, TOOL_INTERACTIVE::m_menu, INTERACTIVE_PLACER_BASE::m_modifiers, TOOL_BASE::m_toolMgr, PCB_BASE_EDIT_FRAME::OnEditItemRequest(), PCB_FOOTPRINT_T, PENCIL, PLACE, INTERACTIVE_PLACER_BASE::PlaceItem(), TOOLS_HOLDER::PopTool(), TOOL_MANAGER::ProcessEvent(), PCB_ACTIONS::properties, BOARD_COMMIT::Push(), TOOLS_HOLDER::PushTool(), ACTIONS::refreshPreview, KIGFX::PCB_VIEW::Remove(), TOOL_MANAGER::RunAction(), FOOTPRINT::RunOnChildren(), EVENTS::SelectedItemsModified, PCB_TOOL_BASE::selection(), PCB_ACTIONS::selectionClear, KIGFX::VIEW_CONTROLS::SetAutoPan(), EDA_DRAW_PANEL_GAL::SetCurrentCursor(), PCB_BASE_FRAME::Settings(), TOOL_MENU::ShowContextMenu(), KIGFX::VIEW_CONTROLS::ShowCursor(), INTERACTIVE_PLACER_BASE::SnapItem(), TC_COMMAND, PCB_ACTIONS::trackViaSizeChanged, KIGFX::PCB_VIEW::Update(), PCB_TOOL_BASE::view(), and TOOL_INTERACTIVE::Wait().

Referenced by MICROWAVE_TOOL::addMicrowaveFootprint(), DRAWING_TOOL::DrawVia(), and PAD_TOOL::PlacePad().

◆ editArcEndpointKeepCenter()

void PCB_POINT_EDITOR::editArcEndpointKeepCenter ( PCB_SHAPE aArc,
const VECTOR2I aCenter,
const VECTOR2I aStart,
const VECTOR2I aMid,
const VECTOR2I aEnd,
const VECTOR2I aCursor 
) const
private

Move an end point of the arc around the circumference.

Definition at line 875 of file pcb_point_editor.cpp.

879 {
880  bool movingStart;
881 
882  VECTOR2I p1, p2;
883  VECTOR2I target;
884 
885  // p1 does not move, p2 does.
886 
887  if( aStart != aArc->GetStart() )
888  {
889  p1 = aEnd;
890  p2 = aStart;
891  movingStart = true;
892  }
893  else
894  {
895  p1 = aStart;
896  p2 = aEnd;
897  movingStart = false;
898  }
899 
900  target = p2 - aCenter;
901 
902  double sqRadius = ( p1 - aCenter ).SquaredEuclideanNorm();
903 
904  p1 = p1 - aCenter;
905  p2 = p2 - aCenter;
906 
907  // Circle : x^2 + y^2 = R ^ 2
908  // In this coordinate system, the angular position of the cursor is (r, theta)
909  // The line coming from the center of the circle is y = start.y / start.x * x
910  // The intersection fulfills : x^2 = R^2 / ( 1 + ( start.y / start.x ) ^ 2 )
911 
912  if( target.x == 0 )
913  {
914  p2.x = 0;
915  p2.y = ( target.y > 0 ) ? sqrt( sqRadius ) : -sqrt( sqRadius );
916  }
917  else
918  {
919  double tan = target.y / static_cast<double>( target.x );
920 
921  // The divider is always greater than 1 ( cannot be 0 )
922  double tmp = sqrt( sqRadius / ( 1.0 + tan * tan ) );
923 
924  // Move to the correct quadrant
925  tmp = target.x > 0 ? tmp : -tmp;
926  p2.y = target.y / static_cast<double>( target.x ) * tmp;
927  p2.x = tmp;
928  }
929 
930  p1 = p1 + aCenter;
931  p2 = p2 + aCenter;
932 
933  aArc->SetCenter( (wxPoint) aCenter );
934 
935  if( movingStart )
936  aArc->SetStart( (wxPoint) aStart );
937  else
938  aArc->SetEnd( (wxPoint) aEnd );
939 }
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
void SetStart(const wxPoint &aStart)
Definition: eda_shape.h:110
void SetCenter(const wxPoint &aCenter)
Definition: eda_shape.cpp:419

References EDA_SHAPE::GetStart(), EDA_SHAPE::SetCenter(), EDA_SHAPE::SetEnd(), EDA_SHAPE::SetStart(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by updateItem().

◆ editArcEndpointKeepTangent()

void PCB_POINT_EDITOR::editArcEndpointKeepTangent ( PCB_SHAPE aArc,
const VECTOR2I aCenter,
const VECTOR2I aStart,
const VECTOR2I aMid,
const VECTOR2I aEnd,
const VECTOR2I aCursor 
) const
private

Move an end point of the arc, while keeping the tangent at the other endpoint.

Definition at line 620 of file pcb_point_editor.cpp.

624 {
625  VECTOR2I start = aStart;
626  VECTOR2I end = aEnd;
627  VECTOR2I center = aCenter;
628  bool movingStart;
629  bool arcValid = true;
630 
631  VECTOR2I p1, p2, p3;
632  // p1 does not move, p2 does.
633 
634  if( aStart != aArc->GetStart() )
635  {
636  start = aCursor;
637  p1 = aEnd;
638  p2 = aStart;
639  p3 = aMid;
640  movingStart = true;
641  }
642  else if( aEnd != aArc->GetEnd() )
643  {
644  end = aCursor;
645  p1 = aStart;
646  p2 = aEnd;
647  p3 = aMid;
648  movingStart = false;
649  }
650  else
651  {
652  return;
653  }
654 
655  VECTOR2D v1, v2, v3, v4;
656 
657  // Move the coordinate system
658  v1 = p1 - aCenter;
659  v2 = p2 - aCenter;
660  v3 = p3 - aCenter;
661 
662  VECTOR2D u1, u2, u3;
663 
664  // A point cannot be both the center and on the arc.
665  if( ( v1.EuclideanNorm() == 0 ) || ( v2.EuclideanNorm() == 0 ) )
666  return;
667 
668  u1 = v1 / v1.EuclideanNorm();
669  u2 = v3 - ( u1.x * v3.x + u1.y * v3.y ) * u1;
670  u2 = u2 / u2.EuclideanNorm();
671 
672  // [ u1, u3 ] is a base centered on the circle with:
673  // u1 : unit vector toward the point that does not move
674  // u2 : unit vector toward the mid point.
675 
676  // Get vectors v1, and v2 in that coordinate system.
677 
678  double det = u1.x * u2.y - u2.x * u1.y;
679 
680  // u1 and u2 are unit vectors, and perpendicular.
681  // det should not be 0. In case it is, do not change the arc.
682  if( det == 0 )
683  return;
684 
685  double tmpx = v1.x * u2.y - v1.y * u2.x;
686  double tmpy = -v1.x * u1.y + v1.y * u1.x;
687  v1.x = tmpx;
688  v1.y = tmpy;
689  v1 = v1 / det;
690 
691  tmpx = v2.x * u2.y - v2.y * u2.x;
692  tmpy = -v2.x * u1.y + v2.y * u1.x;
693  v2.x = tmpx;
694  v2.y = tmpy;
695  v2 = v2 / det;
696 
697  double R = v1.EuclideanNorm();
698  bool transformCircle = false;
699 
700  /* p2
701  * X***
702  * ** <---- This is the arc
703  * y ^ **
704  * | R *
705  * | <-----------> *
706  * x------x------>--------x p1
707  * C' <----> C x
708  * delta
709  *
710  * p1 does not move, and the tangent at p1 remains the same.
711  * => The new center, C', will be on the C-p1 axis.
712  * p2 moves
713  *
714  * The radius of the new circle is delta + R
715  *
716  * || C' p2 || = || C' P1 ||
717  * is the same as :
718  * ( delta + p2.x ) ^ 2 + p2.y ^ 2 = ( R + delta ) ^ 2
719  *
720  * delta = ( R^2 - p2.x ^ 2 - p2.y ^2 ) / ( 2 * p2.x - 2 * R )
721  *
722  * We can use this equation for any point p2 with p2.x < R
723  */
724 
725  if( v2.x == R )
726  {
727  // Straight line, do nothing
728  }
729  else
730  {
731  if( v2.x > R )
732  {
733  // If we need to invert the curvature.
734  // We modify the input so we can use the same equation
735  transformCircle = true;
736  v2.x = 2 * R - v2.x;
737  }
738 
739  // We can keep the tangent constraint.
740  double delta = ( R * R - v2.x * v2.x - v2.y * v2.y ) / ( 2 * v2.x - 2 * R );
741 
742  // This is just to limit the radius, so nothing overflows later when drawing.
743  if( abs( v2.y / ( R - v2.x ) ) > ADVANCED_CFG::GetCfg().m_DrawArcCenterMaxAngle )
744  arcValid = false;
745 
746  // Never recorded a problem, but still checking.
747  if( !std::isfinite( delta ) )
748  arcValid = false;
749 
750  // v4 is the new center
751  v4 = ( !transformCircle ) ? VECTOR2D( -delta, 0 ) : VECTOR2D( 2 * R + delta, 0 );
752 
753  tmpx = v4.x * u1.x + v4.y * u2.x;
754  tmpy = v4.x * u1.y + v4.y * u2.y;
755  v4.x = tmpx;
756  v4.y = tmpy;
757 
758  center = v4 + aCenter;
759 
760  if( arcValid )
761  {
762  aArc->SetCenter( (wxPoint) center );
763 
764  if( movingStart )
765  aArc->SetStart( (wxPoint) start );
766  else
767  aArc->SetEnd( (wxPoint) end );
768  }
769  }
770 }
VECTOR2I v2(1, 0)
Test suite for KiCad math code.
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
double m_DrawArcCenterMaxAngle
When drawing an arc, the angle ( center - start ) - ( start - end ) can be limited to avoid extremely...
void SetStart(const wxPoint &aStart)
Definition: eda_shape.h:110
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
VECTOR2< double > VECTOR2D
Definition: vector2d.h:621
void SetCenter(const wxPoint &aCenter)
Definition: eda_shape.cpp:419
constexpr int delta
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
Definition: vector2d.h:293

References delta, VECTOR2< T >::EuclideanNorm(), ADVANCED_CFG::GetCfg(), EDA_SHAPE::GetEnd(), EDA_SHAPE::GetStart(), ADVANCED_CFG::m_DrawArcCenterMaxAngle, EDA_SHAPE::SetCenter(), EDA_SHAPE::SetEnd(), EDA_SHAPE::SetStart(), v2, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by updateItem().

◆ editArcMidKeepCenter()

void PCB_POINT_EDITOR::editArcMidKeepCenter ( PCB_SHAPE aArc,
const VECTOR2I aCenter,
const VECTOR2I aStart,
const VECTOR2I aMid,
const VECTOR2I aEnd,
const VECTOR2I aCursor 
) const
private

Move the mid point of the arc, while keeping the angle.

Change the edit method to an alternative method ( currently, arcs only )

Definition at line 942 of file pcb_point_editor.cpp.

945 {
946  // Now, update the edit point position
947  // Express the point in a circle-centered coordinate system.
948  VECTOR2I start = aStart - aCenter;
949  VECTOR2I end = aEnd - aCenter;
950 
951  double sqRadius = ( aCursor - aCenter ).SquaredEuclideanNorm();
952 
953  // Special case, because the tangent would lead to +/- infinity
954  if( start.x == 0 )
955  {
956  start.y = aCursor.y > 0 ? sqrt( sqRadius ) : -sqrt( sqRadius );
957  }
958  else
959  {
960  // Circle : x^2 + y^2 = R ^ 2
961  // In this coordinate system, the angular position of the cursor is (r, theta)
962  // The line coming from the center of the circle is y = start.y / start.x * x
963  // The intersection fulfills : x^2 = R^2 / ( 1 + ( start.y / start.x ) ^ 2 )
964 
965  double tan = aStart.y / static_cast<double>( start.x );
966  double tmp = sqrt( sqRadius / ( 1.0 + tan * tan ) );
967 
968  // Move to the correct quadrant
969  tmp = start.x > 0 ? tmp : -tmp;
970  start.y = start.y / static_cast<double>( start.x ) * tmp;
971  start.x = tmp;
972  }
973 
974  // Special case, because the tangent would lead to +/- infinity
975  if( end.x == 0 )
976  {
977  end.y = aMid.y > 0 ? sqrt( sqRadius ) : -sqrt( sqRadius );
978  }
979  else
980  {
981  // Circle : x^2 + y^2 = R ^ 2
982  // In this coordinate system, the angular position of the cursor is (r, theta)
983  // The line coming from the center of the circle is y = start.y / start.x * x
984  // The intersection fulfills : x^2 = R^2 / ( 1 + ( start.y / start.x ) ^ 2 )
985 
986  double tan = end.y / static_cast<double>( end.x );
987  double tmp = sqrt( sqRadius / ( 1.0 + tan * tan ) );
988 
989  // Move to the correct quadrant
990  tmp = end.x > 0 ? tmp : -tmp;
991  end.y = end.y / static_cast<double>( end.x ) * tmp;
992  end.x = tmp;
993  }
994 
995  start = start + aCenter;
996  end = end + aCenter;
997 
998  aArc->SetStart( (wxPoint) start );
999  aArc->SetEnd( (wxPoint) end );
1000 }
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
void SetStart(const wxPoint &aStart)
Definition: eda_shape.h:110

References EDA_SHAPE::SetEnd(), EDA_SHAPE::SetStart(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by updateItem().

◆ editArcMidKeepEndpoints()

void PCB_POINT_EDITOR::editArcMidKeepEndpoints ( PCB_SHAPE aArc,
const VECTOR2I aStart,
const VECTOR2I aEnd,
const VECTOR2I aCursor 
) const
private

Move the mid point of the arc, while keeping the two endpoints.

Definition at line 1003 of file pcb_point_editor.cpp.

1006 {
1007  // Let 'm' be the middle point of the chord between the start and end points
1008  VECTOR2I m = ( aStart + aEnd ) / 2;
1009 
1010  // Legal midpoints lie on a vector starting just off the chord midpoint and extending out
1011  // past the existing midpoint. We do not allow arc inflection while point editing.
1012  const int JUST_OFF = ( aStart - aEnd ).EuclideanNorm() / 100;
1013  VECTOR2I v = (VECTOR2I) aArc->GetArcMid() - m;
1014  SEG legal( m + v.Resize( JUST_OFF ), m + v.Resize( INT_MAX / 2 ) );
1015  VECTOR2I mid = legal.NearestPoint( aCursor );
1016 
1017  aArc->SetArcGeometry( (wxPoint) aStart, (wxPoint) mid, (wxPoint) aEnd );
1018 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:146
void SetArcGeometry(const wxPoint &aStart, const wxPoint &aMid, const wxPoint &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:504
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
Definition: seg.h:40
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
Definition: vector2d.h:404
wxPoint GetArcMid() const
Definition: eda_shape.cpp:437

References EuclideanNorm(), EDA_SHAPE::GetArcMid(), VECTOR2< T >::Resize(), and EDA_SHAPE::SetArcGeometry().

Referenced by updateItem().

◆ finishItem()

void PCB_POINT_EDITOR::finishItem ( )
private

Definition at line 1499 of file pcb_point_editor.cpp.

1500 {
1501  auto item = m_editPoints->GetParent();
1502 
1503  if( !item )
1504  return;
1505 
1506  // TODO Refill edited zones when KiCad supports auto re-fill
1507 }
std::shared_ptr< EDIT_POINTS > m_editPoints

References m_editPoints.

Referenced by OnSelectionChange().

◆ footprint()

◆ frame()

PCB_BASE_EDIT_FRAME* PCB_TOOL_BASE::frame ( ) const
inlineprotectedinherited

Definition at line 160 of file pcb_tool_base.h.

161  {
162  return getEditFrame<PCB_BASE_EDIT_FRAME>();
163  }

Referenced by addCorner(), AUTOPLACE_TOOL::autoplace(), PCB_TOOL_BASE::canvas(), ZONE_FILLER_TOOL::CheckAllZones(), PNS::TOOL_BASE::checkSnap(), PAD_TOOL::copyPadSettings(), EDIT_TOOL::copyToClipboard(), BOARD_INSPECTION_TOOL::CrossProbePcbToSch(), ROUTER_TOOL::CustomTrackWidthDialog(), FOOTPRINT_EDITOR_CONTROL::DeleteFootprint(), PCB_TOOL_BASE::displayOptions(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::doMoveSelection(), ROUTER_TOOL::DpDimensionsDialog(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), DRAWING_TOOL::DrawVia(), DRAWING_TOOL::DrawZone(), PAD_TOOL::EditPad(), PAD_TOOL::EnumeratePads(), PAD_TOOL::explodePad(), BOARD_EDITOR_CONTROL::ExportSpecctraDSN(), ZONE_FILLER_TOOL::FillAllZones(), EDIT_TOOL::FilletTracks(), PCB_SELECTION_TOOL::FilterCollectorForFreePads(), ROUTER_TOOL::finishInteractive(), EDIT_TOOL::Flip(), PCB_CONTROL::FlipPcbView(), GLOBAL_EDIT_TOOL::GlobalDeletions(), ROUTER_TOOL::handleLayerSwitch(), BOARD_INSPECTION_TOOL::HighlightItem(), FOOTPRINT_EDITOR_CONTROL::ImportFootprint(), BOARD_EDITOR_CONTROL::ImportSpecctraSession(), ROUTER_TOOL::Init(), SCRIPTING_TOOL::Init(), PCB_SELECTION_TOOL::Init(), EDIT_TOOL::Init(), ROUTER_TOOL::InlineBreakTrack(), ROUTER_TOOL::InlineDrag(), DRAWING_TOOL::InteractivePlaceWithPreview(), PCB_TOOL_BASE::Is45Limited(), PCB_PICKER_TOOL::Main(), PCB_SELECTION_TOOL::Main(), ROUTER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::meanderSettingsDialog(), EDIT_TOOL::MoveExact(), OnSelectionChange(), PCB_CONTROL::Paste(), PAD_TOOL::pastePadProperties(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), GROUP_TOOL::PickNewMember(), PCB_CONTROL::placeBoardItems(), BOARD_EDITOR_CONTROL::PlaceFootprint(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), ROUTER_TOOL::prepareInteractive(), PAD_TOOL::pushPadSettings(), PAD_TOOL::recombinePad(), POSITION_RELATIVE_TOOL::RelativeItemSelectionMove(), SCRIPTING_TOOL::reloadPlugins(), EDIT_TOOL::Remove(), removeCorner(), PCB_SELECTION_TOOL::RequestSelection(), PAD_TOOL::Reset(), PNS::TOOL_BASE::Reset(), EDIT_TOOL::Rotate(), ROUTER_TOOL::SelectCopperLayerPair(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), setEditedPoint(), ROUTER_TOOL::SettingsDialog(), GLOBAL_EDIT_TOOL::swapBoardItem(), GLOBAL_EDIT_TOOL::SwapLayers(), ROUTER_TOOL::switchLayerOnViaPlacement(), PCB_CONTROL::unfilledZoneCheck(), ROUTER_TOOL::UpdateMessagePanel(), EDIT_TOOL::updateModificationPoint(), BOARD_EDITOR_CONTROL::UpdateSchematicFromPCB(), ZONE_FILLER_TOOL::ZoneFill(), and ZONE_FILLER_TOOL::ZoneFillAll().

◆ get45DegConstrainer()

EDIT_POINT PCB_POINT_EDITOR::get45DegConstrainer ( ) const
private

Condition to display "Create corner" context menu entry.

Definition at line 1819 of file pcb_point_editor.cpp.

1820 {
1821  EDA_ITEM* item = m_editPoints->GetParent();
1822 
1823  switch( item->Type() )
1824  {
1825  case PCB_SHAPE_T:
1826  case PCB_FP_SHAPE_T:
1827  switch( static_cast<const PCB_SHAPE*>( item )->GetShape() )
1828  {
1829  case SHAPE_T::SEGMENT:
1830  return *( m_editPoints->Next( *m_editedPoint ) ); // select the other end of line
1831 
1832  case SHAPE_T::ARC:
1833  case SHAPE_T::CIRCLE:
1834  return m_editPoints->Point( CIRC_CENTER );
1835 
1836  default: // suppress warnings
1837  break;
1838  }
1839 
1840  break;
1841 
1842  case PCB_DIM_ALIGNED_T:
1843  {
1844  // Constraint for crossbar
1845  if( isModified( m_editPoints->Point( DIM_START ) ) )
1846  return m_editPoints->Point( DIM_END );
1847 
1848  else if( isModified( m_editPoints->Point( DIM_END ) ) )
1849  return m_editPoints->Point( DIM_START );
1850 
1851  else
1852  return EDIT_POINT( m_editedPoint->GetPosition() ); // no constraint
1853 
1854  break;
1855  }
1856 
1857  case PCB_DIM_CENTER_T:
1858  {
1859  if( isModified( m_editPoints->Point( DIM_END ) ) )
1860  return m_editPoints->Point( DIM_START );
1861 
1862  break;
1863  }
1864 
1865  default:
1866  break;
1867  }
1868 
1869  // In any other case we may align item to its original position
1870  return m_original;
1871 }
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:100
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:102
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
std::shared_ptr< EDIT_POINTS > m_editPoints
EDIT_POINT * m_editedPoint
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
Definition: edit_points.h:70
EDIT_POINT m_original
Original position for the current drag point.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
bool isModified(const EDIT_POINT &aPoint) const
Set up an alternative constraint (typically enabled upon a modifier key being pressed).
Represent a single point that can be used for modifying items.
Definition: edit_points.h:47
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References ARC, CIRC_CENTER, CIRCLE, DIM_END, DIM_START, EDIT_POINT::GetPosition(), isModified(), m_editedPoint, m_editPoints, m_original, PCB_DIM_ALIGNED_T, PCB_DIM_CENTER_T, PCB_FP_SHAPE_T, PCB_SHAPE_T, SEGMENT, and EDA_ITEM::Type().

Referenced by setAltConstraint().

◆ getEditedPointIndex()

int PCB_POINT_EDITOR::getEditedPointIndex ( ) const
inlineprivate

Return true if aPoint is the currently modified point.

Definition at line 97 of file pcb_point_editor.h.

References m_editedPoint, and m_editPoints.

Referenced by updateItem().

◆ getEditFrame()

template<typename T >
T* TOOL_BASE::getEditFrame ( ) const
inlineprotectedinherited

Return the application window object, casted to requested user type.

Definition at line 184 of file tool_base.h.

185  {
186 #if !defined( QA_TEST ) // Dynamic casts give the linker a seizure in the test framework
187  wxASSERT( dynamic_cast<T*>( getToolHolderInt() ) );
188 #endif
189  return static_cast<T*>( getToolHolderInt() );
190  }
TOOLS_HOLDER * getToolHolderInt() const
Definition: tool_base.cpp:48

References TOOL_BASE::getToolHolderInt().

Referenced by ZONE_CREATE_HELPER::createNewZone().

◆ GetId()

TOOL_ID TOOL_BASE::GetId ( ) const
inlineinherited

Return the unique identifier of the tool.

The identifier is set by an instance of TOOL_MANAGER.

Returns
Identifier of the tool.

Definition at line 120 of file tool_base.h.

121  {
122  return m_toolId;
123  }
TOOL_ID m_toolId
Name of the tool.
Definition: tool_base.h:209

References TOOL_BASE::m_toolId.

Referenced by TOOL_MANAGER::finishTool(), TOOL_MANAGER::InitTools(), TOOL_MANAGER::isActive(), TOOL_MANAGER::RegisterTool(), ACTION_MANAGER::RunHotKey(), TOOL_MANAGER::runTool(), TOOL_MANAGER::saveViewControls(), and TOOL_MANAGER::ShutdownTool().

◆ GetManager()

TOOL_MANAGER* TOOL_BASE::GetManager ( ) const
inlineinherited

Return the instance of TOOL_MANAGER that takes care of the tool.

Returns
Instance of the TOOL_MANAGER or NULL if there is no associated tool manager.

Definition at line 143 of file tool_base.h.

144  {
145  return m_toolMgr;
146  }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214

References TOOL_BASE::m_toolMgr.

Referenced by BOARD_COMMIT::BOARD_COMMIT(), ZONE_CREATE_HELPER::commitZone(), ZONE_CREATE_HELPER::createNewZone(), PCB_TOOL_BASE::doInteractiveItemPlacement(), ACTION_MENU::getToolManager(), LIB_TREE::onContextMenu(), ZONE_CREATE_HELPER::OnFirstPoint(), ACTION_MENU::OnMenuEvent(), and ZONE_CREATE_HELPER::performZoneCutout().

◆ getModel()

template<typename T >
T* TOOL_BASE::getModel ( ) const
inlineprotectedinherited

Return the model object if it matches the requested type.

Store the type of the tool.

Definition at line 196 of file tool_base.h.

References TOOL_BASE::getModelInt().

Referenced by ZONE_CREATE_HELPER::commitZone(), and ZONE_CREATE_HELPER::createZoneFromExisting().

◆ GetName()

const std::string& TOOL_BASE::GetName ( void  ) const
inlineinherited

Return the name of the tool.

Tool names are expected to obey the format: application.ToolName (eg. pcbnew.InteractiveSelection).

Returns
The name of the tool.

Definition at line 133 of file tool_base.h.

134  {
135  return m_toolName;
136  }
std::string m_toolName
Definition: tool_base.h:213

References TOOL_BASE::m_toolName.

Referenced by TOOL_MANAGER::dispatchInternal(), TOOL_MANAGER::InitTools(), TOOL_MANAGER::invokeTool(), TOOL_MANAGER::RegisterTool(), and TOOL_MANAGER::runTool().

◆ GetToolMenu()

◆ GetType()

TOOL_TYPE TOOL_BASE::GetType ( ) const
inlineinherited

Return the type of the tool.

Returns
The type of the tool.

Definition at line 108 of file tool_base.h.

109  {
110  return m_type;
111  }
TOOL_TYPE m_type
Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
Definition: tool_base.h:206

References TOOL_BASE::m_type.

Referenced by TOOL_MANAGER::finishTool(), TOOL_MANAGER::InvokeTool(), TOOL_MANAGER::ResetTools(), TOOL_MANAGER::runTool(), and TOOL_MANAGER::ShutdownTool().

◆ getView()

KIGFX::VIEW * TOOL_BASE::getView ( ) const
protectedinherited

Returns the instance of #VIEW object used in the application.

It allows tools to draw.

Returns
The instance of VIEW.

Definition at line 36 of file tool_base.cpp.

37 {
38  return m_toolMgr->GetView();
39 }
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:283
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214

References TOOL_MANAGER::GetView(), and TOOL_BASE::m_toolMgr.

Referenced by EE_POINT_EDITOR::addCornerCondition(), ALIGN_DISTRIBUTE_TOOL::AlignLeft(), ALIGN_DISTRIBUTE_TOOL::AlignRight(), COMMON_TOOLS::CenterContents(), SCH_EDIT_TOOL::ChangeTextType(), EE_INSPECTION_TOOL::CheckSymbol(), GERBVIEW_CONTROL::ClearAllLayers(), PL_SELECTION_TOOL::ClearSelection(), EE_SELECTION_TOOL::ClearSelection(), EE_SELECTION_TOOL::CollectHits(), SCH_LINE_WIRE_BUS_TOOL::computeBreakPoint(), COMMON_TOOLS::CursorControl(), PL_EDIT_TOOL::DeleteItemCursor(), SCH_EDIT_TOOL::DeleteItemCursor(), PCB_CONTROL::DeleteItemCursor(), GERBVIEW_SELECTION_TOOL::disambiguationMenu(), PL_EDIT_TOOL::DoDelete(), SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::doMoveSelection(), PL_SELECTION_TOOL::doSelectionMenu(), EE_SELECTION_TOOL::doSelectionMenu(), PCB_SELECTION_TOOL::doSelectionMenu(), COMMON_TOOLS::doZoomFit(), COMMON_TOOLS::doZoomInOut(), COMMON_TOOLS::doZoomToPreset(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), SCH_LINE_WIRE_BUS_TOOL::DrawSegments(), PL_DRAWING_TOOLS::DrawShape(), DRAWING_TOOL::DrawZone(), BOARD_EDITOR_CONTROL::DrillOrigin(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), PAD_TOOL::EnumeratePads(), SCH_EDITOR_CONTROL::FindSymbolAndItem(), EE_SELECTION_TOOL::GetNode(), ROUTER_TOOL::getStartLayer(), PCB_CONTROL::GridResetOrigin(), PCB_CONTROL::GridSetOrigin(), ROUTER_TOOL::handleCommonEvents(), PL_SELECTION_TOOL::highlight(), EE_SELECTION_TOOL::highlight(), PCB_SELECTION_TOOL::highlight(), GERBVIEW_CONTROL::HighlightControl(), PNS::TOOL_BASE::highlightNet(), BOARD_INSPECTION_TOOL::highlightNet(), PCB_SELECTION_TOOL::hitTestDistance(), SCH_EDIT_TOOL::Init(), EDIT_TOOL::Init(), ROUTER_TOOL::InlineDrag(), PCB_PICKER_TOOL::Main(), EE_POINT_EDITOR::Main(), PL_POINT_EDITOR::Main(), SCH_MOVE_TOOL::Main(), GERBVIEW_INSPECTION_TOOL::MeasureTool(), PCB_VIEWER_TOOLS::MeasureTool(), SCH_EDIT_TOOL::Mirror(), EDIT_TOOL::MoveExact(), PL_EDIT_TOOL::moveItem(), SCH_MOVE_TOOL::moveItem(), COMMON_TOOLS::OnGridChanged(), OnSelectionChange(), COMMON_TOOLS::PanControl(), SYMBOL_EDITOR_EDIT_TOOL::Paste(), PL_EDIT_TOOL::Paste(), SCH_EDITOR_CONTROL::Paste(), ROUTER_TOOL::performRouting(), PNS::TOOL_BASE::pickSingleItem(), BOARD_EDITOR_CONTROL::PlaceFootprint(), PL_DRAWING_TOOLS::PlaceItem(), BOARD_EDITOR_CONTROL::PlaceTarget(), ROUTER_TOOL::prepareInteractive(), SCH_EDIT_TOOL::Properties(), EDIT_TOOL::Properties(), EDIT_TOOL::Remove(), BOARD_EDITOR_CONTROL::Reset(), PNS::TOOL_BASE::Reset(), PCB_CONTROL::Reset(), GERBVIEW_SELECTION_TOOL::Reset(), DRAWING_TOOL::Reset(), EE_SELECTION_TOOL::Reset(), PCB_SELECTION_TOOL::Reset(), EE_TOOL_BASE< SCH_BASE_FRAME >::Reset(), SCH_EDIT_TOOL::Rotate(), GERBVIEW_SELECTION_TOOL::select(), GERBVIEW_SELECTION_TOOL::selectable(), PCB_SELECTION_TOOL::Selectable(), PCB_SELECTION_TOOL::SelectAll(), EE_SELECTION_TOOL::SelectAll(), PL_SELECTION_TOOL::selectionContains(), EE_SELECTION_TOOL::selectionContains(), PL_SELECTION_TOOL::selectMultiple(), EE_SELECTION_TOOL::selectMultiple(), PCB_SELECTION_TOOL::selectMultiple(), PL_SELECTION_TOOL::SelectPoint(), ZOOM_TOOL::selectRegion(), GERBVIEW_SELECTION_TOOL::selectVisually(), DRAWING_TOOL::SetAnchor(), SCH_DRAWING_TOOLS::SingleClickPlace(), SCH_EDITOR_CONTROL::ToggleHiddenFields(), SCH_EDITOR_CONTROL::ToggleHiddenPins(), SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace(), SCH_DRAWING_TOOLS::TwoClickPlace(), PL_SELECTION_TOOL::unhighlight(), EE_SELECTION_TOOL::unhighlight(), PCB_SELECTION_TOOL::unhighlight(), GERBVIEW_SELECTION_TOOL::unselect(), GERBVIEW_SELECTION_TOOL::unselectVisually(), EE_POINT_EDITOR::updateEditedPoint(), PL_POINT_EDITOR::updateEditedPoint(), updateEditedPoint(), SCH_EDITOR_CONTROL::UpdateFind(), PL_POINT_EDITOR::updateItem(), updateItem(), EE_TOOL_BASE< SCH_BASE_FRAME >::updateItem(), SCH_EDITOR_CONTROL::UpdateNetHighlighting(), EE_POINT_EDITOR::updatePoints(), PL_POINT_EDITOR::updatePoints(), updatePoints(), PCB_SELECTION_TOOL::updateSelection(), PNS::TOOL_BASE::updateStartItem(), PCB_VIEWER_TOOLS::view(), PCB_TOOL_BASE::view(), PCB_SELECTION_TOOL::zoomFitSelection(), EE_SELECTION_TOOL::~EE_SELECTION_TOOL(), GERBVIEW_SELECTION_TOOL::~GERBVIEW_SELECTION_TOOL(), and PCB_SELECTION_TOOL::~PCB_SELECTION_TOOL().

◆ getViewControls()

KIGFX::VIEW_CONTROLS * TOOL_BASE::getViewControls ( ) const
protectedinherited

Return the instance of VIEW_CONTROLS object used in the application.

It allows tools to read & modify user input and its settings (eg. show cursor, enable snapping to grid, etc.).

Returns
The instance of VIEW_CONTROLS.

Definition at line 42 of file tool_base.cpp.

43 {
44  return m_toolMgr->GetViewControls();
45 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
KIGFX::VIEW_CONTROLS * GetViewControls() const
Definition: tool_manager.h:285

References TOOL_MANAGER::GetViewControls(), and TOOL_BASE::m_toolMgr.

Referenced by EE_POINT_EDITOR::addCorner(), addCorner(), EE_POINT_EDITOR::addCornerCondition(), SCH_EDITOR_CONTROL::AssignNetclass(), SCH_EDIT_TOOL::BreakWire(), PCB_TOOL_BASE::controls(), EDIT_TOOL::copyToClipboard(), SCH_DRAWING_TOOLS::createSheetPin(), COMMON_TOOLS::CursorControl(), SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), EDIT_TOOL::doMoveSelection(), SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus(), COMMON_TOOLS::doZoomToPreset(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawLine(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::DrawRectangle(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), PL_DRAWING_TOOLS::DrawShape(), SCH_DRAWING_TOOLS::DrawSheet(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), PAD_TOOL::EnumeratePads(), SCH_LINE_WIRE_BUS_TOOL::finishSegments(), SCH_DRAWING_TOOLS::GetCanvasFreeAreaPixels(), BOARD_INSPECTION_TOOL::HighlightNet(), SCH_EDITOR_CONTROL::HighlightNet(), FOOTPRINT_EDITOR_CONTROL::ImportFootprint(), SCH_EDIT_TOOL::Init(), EDIT_TOOL::Init(), PCB_PICKER_TOOL::Main(), EE_POINT_EDITOR::Main(), PL_EDIT_TOOL::Main(), SYMBOL_EDITOR_MOVE_TOOL::Main(), PL_POINT_EDITOR::Main(), SCH_MOVE_TOOL::Main(), EE_SELECTION_TOOL::Main(), PICKER_TOOL::Main(), ROUTER_TOOL::MainLoop(), GERBVIEW_INSPECTION_TOOL::MeasureTool(), PCB_VIEWER_TOOLS::MeasureTool(), COMMON_TOOLS::OnGridChanged(), OnSelectionChange(), SYMBOL_EDITOR_EDIT_TOOL::Paste(), ROUTER_TOOL::performDragging(), LENGTH_TUNER_TOOL::performTuning(), SYMBOL_EDITOR_DRAWING_TOOLS::PlaceAnchor(), PCB_CONTROL::placeBoardItems(), BOARD_EDITOR_CONTROL::PlaceFootprint(), SCH_DRAWING_TOOLS::PlaceImage(), PL_DRAWING_TOOLS::PlaceItem(), SCH_DRAWING_TOOLS::PlaceSymbol(), BOARD_EDITOR_CONTROL::PlaceTarget(), SCH_EDIT_TOOL::Properties(), EDIT_TOOL::Properties(), EDIT_TOOL::Remove(), SCH_EDIT_TOOL::RepeatDrawItem(), PL_SELECTION_TOOL::RequestSelection(), EE_SELECTION_TOOL::RequestSelection(), Reset(), DRAWING_TOOL::Reset(), COMMON_TOOLS::ResetLocalCoords(), GERBVIEW_SELECTION_TOOL::selectCursor(), PCB_SELECTION_TOOL::selectCursor(), PL_SELECTION_TOOL::selectMultiple(), EE_SELECTION_TOOL::selectMultiple(), PCB_SELECTION_TOOL::selectMultiple(), EE_SELECTION_TOOL::SelectNode(), ZOOM_TOOL::selectRegion(), ALIGN_DISTRIBUTE_TOOL::selectTarget(), PCB_PICKER_TOOL::setControls(), PICKER_TOOL::setControls(), PL_POINT_EDITOR::setEditedPoint(), EE_POINT_EDITOR::setEditedPoint(), setEditedPoint(), SCH_DRAWING_TOOLS::SingleClickPlace(), SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace(), SCH_DRAWING_TOOLS::TwoClickPlace(), EE_POINT_EDITOR::updateEditedPoint(), PL_POINT_EDITOR::updateEditedPoint(), updateEditedPoint(), updateItem(), PL_EDIT_TOOL::updateModificationPoint(), and COMMON_TOOLS::ZoomCenter().

◆ Go()

template<class T >
void TOOL_INTERACTIVE::Go ( int(T::*)(const TOOL_EVENT &)  aStateFunc,
const TOOL_EVENT_LIST aConditions = TOOL_EVENTTC_ANYTA_ANY ) 
)
inherited

Define which state (aStateFunc) to go when a certain event arrives (aConditions).

No conditions means any event.

Definition at line 147 of file tool_interactive.h.

149 {
150  TOOL_STATE_FUNC sptr = std::bind( aStateFunc, static_cast<T*>( this ), std::placeholders::_1 );
151 
152  goInternal( sptr, aConditions );
153 }
std::function< int(const TOOL_EVENT &)> TOOL_STATE_FUNC
Definition: tool_base.h:58
void goInternal(TOOL_STATE_FUNC &aState, const TOOL_EVENT_LIST &aConditions)

References TOOL_INTERACTIVE::goInternal().

Referenced by AUTOPLACE_TOOL::setTransitions(), ZOOM_TOOL::setTransitions(), LENGTH_TUNER_TOOL::setTransitions(), BOARD_REANNOTATE_TOOL::setTransitions(), GERBVIEW_INSPECTION_TOOL::setTransitions(), PCB_PICKER_TOOL::setTransitions(), SCH_NAVIGATE_TOOL::setTransitions(), SYMBOL_EDITOR_PIN_TOOL::setTransitions(), SYMBOL_EDITOR_MOVE_TOOL::setTransitions(), PL_DRAWING_TOOLS::setTransitions(), EE_POINT_EDITOR::setTransitions(), PL_POINT_EDITOR::setTransitions(), ROUTER_TOOL::setTransitions(), SCRIPTING_TOOL::setTransitions(), COMMON_CONTROL::setTransitions(), KICAD_MANAGER_CONTROL::setTransitions(), CONVERT_TOOL::setTransitions(), SYMBOL_EDITOR_DRAWING_TOOLS::setTransitions(), ZONE_FILLER_TOOL::setTransitions(), PCB_VIEWER_TOOLS::setTransitions(), MICROWAVE_TOOL::setTransitions(), EE_INSPECTION_TOOL::setTransitions(), setTransitions(), GERBVIEW_CONTROL::setTransitions(), CVPCB_FOOTPRINT_VIEWER_SELECTION_TOOL::setTransitions(), PAD_TOOL::setTransitions(), GLOBAL_EDIT_TOOL::setTransitions(), GROUP_TOOL::setTransitions(), PL_EDITOR_CONTROL::setTransitions(), SYMBOL_EDITOR_EDIT_TOOL::setTransitions(), SYMBOL_EDITOR_CONTROL::setTransitions(), PL_EDIT_TOOL::setTransitions(), POSITION_RELATIVE_TOOL::setTransitions(), GERBVIEW_SELECTION_TOOL::setTransitions(), SCH_DRAWING_TOOLS::setTransitions(), SCH_MOVE_TOOL::setTransitions(), SCH_EDIT_TOOL::setTransitions(), FOOTPRINT_EDITOR_CONTROL::setTransitions(), ALIGN_DISTRIBUTE_TOOL::setTransitions(), COMMON_TOOLS::setTransitions(), DRC_TOOL::setTransitions(), EDA_3D_CONTROLLER::setTransitions(), PCB_CONTROL::setTransitions(), CVPCB_ASSOCIATION_TOOL::setTransitions(), SCH_LINE_WIRE_BUS_TOOL::setTransitions(), CVPCB_CONTROL::setTransitions(), BOARD_INSPECTION_TOOL::setTransitions(), BOARD_EDITOR_CONTROL::setTransitions(), PICKER_TOOL::setTransitions(), EDIT_TOOL::setTransitions(), PCB_SELECTION_TOOL::setTransitions(), PL_SELECTION_TOOL::setTransitions(), DRAWING_TOOL::setTransitions(), SCH_EDITOR_CONTROL::setTransitions(), and EE_SELECTION_TOOL::setTransitions().

◆ HasPoint()

bool PCB_POINT_EDITOR::HasPoint ( )
inline

Indicate the cursor is over an edit point.

Used to coordinate cursor shapes with other tools.

Definition at line 64 of file pcb_point_editor.h.

64 { return m_editedPoint != nullptr; }
EDIT_POINT * m_editedPoint

References m_editedPoint.

Referenced by PCB_SELECTION_TOOL::Main().

◆ Init()

bool PCB_POINT_EDITOR::Init ( )
overridevirtual

Init() is called once upon a registration of the tool.

Returns
True if the initialization went fine, false - otherwise.

Reimplemented from PCB_TOOL_BASE.

Definition at line 127 of file pcb_point_editor.cpp.

128 {
129  // Find the selection tool, so they can cooperate
131 
132  wxASSERT_MSG( m_selectionTool, wxT( "pcbnew.InteractiveSelection tool is not available" ) );
133 
134  auto& menu = m_selectionTool->GetToolMenu().GetMenu();
137  std::bind( &PCB_POINT_EDITOR::removeCornerCondition, this, _1 ) );
138 
139  return true;
140 }
bool removeCornerCondition(const SELECTION &aSelection)
CONDITIONAL_MENU & GetMenu()
Definition: tool_menu.cpp:46
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
TOOL_MENU & GetToolMenu()
PCB_SELECTION_TOOL * m_selectionTool
static TOOL_ACTION pointEditorAddCorner
Break outline (insert additional points to an edge)
Definition: pcb_actions.h:207
static TOOL_ACTION pointEditorRemoveCorner
Removes a corner.
Definition: pcb_actions.h:210
The selection tool: currently supports:
static bool addCornerCondition(const SELECTION &aSelection)
Determine if the tool can currently add a corner to the given item.
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition, int aOrder=ANY_ORDER)
Add a menu entry to run a TOOL_ACTION on selected items.

References addCornerCondition(), CONDITIONAL_MENU::AddItem(), TOOL_MENU::GetMenu(), TOOL_MANAGER::GetTool(), TOOL_INTERACTIVE::GetToolMenu(), m_selectionTool, TOOL_BASE::m_toolMgr, PCB_ACTIONS::pointEditorAddCorner, PCB_ACTIONS::pointEditorRemoveCorner, and removeCornerCondition().

◆ Is45Limited()

bool PCB_TOOL_BASE::Is45Limited ( ) const
virtualinherited

Should the tool use its 45° mode option?

Returns
True if set to use 45°

Definition at line 323 of file pcb_tool_base.cpp.

324 {
325  if( frame()->IsType( FRAME_PCB_EDITOR ) )
327  else
329 }
PCB_BASE_EDIT_FRAME * frame() const
PCBNEW_SETTINGS & Settings()

References PCB_TOOL_BASE::frame(), FRAME_PCB_EDITOR, PCBNEW_SETTINGS::m_FpeditUse45DegreeLimit, PCBNEW_SETTINGS::m_PcbUse45DegreeLimit, and PCB_BASE_FRAME::Settings().

Referenced by DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), and DRAWING_TOOL::DrawZone().

◆ IsFootprintEditor()

◆ isModified()

bool PCB_POINT_EDITOR::isModified ( const EDIT_POINT aPoint) const
inlineprivate

Set up an alternative constraint (typically enabled upon a modifier key being pressed).

Definition at line 109 of file pcb_point_editor.h.

References m_editedPoint.

Referenced by get45DegConstrainer(), and updateItem().

◆ IsToolActive()

bool TOOL_BASE::IsToolActive ( ) const
inherited

Definition at line 31 of file tool_base.cpp.

32 {
33  return m_toolMgr->IsToolActive( m_toolId );
34 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
TOOL_ID m_toolId
Name of the tool.
Definition: tool_base.h:209
bool IsToolActive(TOOL_ID aId) const
Return true if a tool with given id is active (executing)

References TOOL_MANAGER::IsToolActive(), TOOL_BASE::m_toolId, and TOOL_BASE::m_toolMgr.

Referenced by EDIT_TOOL::Drag(), ROUTER_TOOL::handleLayerSwitch(), EDIT_TOOL::isRouterActive(), PCB_SELECTION_TOOL::Main(), BOARD_EDITOR_CONTROL::TrackWidthDec(), and BOARD_EDITOR_CONTROL::TrackWidthInc().

◆ makePoints()

std::shared_ptr< EDIT_POINTS > PCB_POINT_EDITOR::makePoints ( EDA_ITEM aItem)
private

Update item's points with edit points.

Definition at line 177 of file pcb_point_editor.cpp.

178 {
179  std::shared_ptr<EDIT_POINTS> points = std::make_shared<EDIT_POINTS>( aItem );
180 
181  if( !aItem )
182  return points;
183 
184  // Generate list of edit points basing on the item type
185  switch( aItem->Type() )
186  {
187  case PCB_SHAPE_T:
188  case PCB_FP_SHAPE_T:
189  {
190  const PCB_SHAPE* shape = static_cast<const PCB_SHAPE*>( aItem );
191 
192  switch( shape->GetShape() )
193  {
194  case SHAPE_T::SEGMENT:
195  points->AddPoint( shape->GetStart() );
196  points->AddPoint( shape->GetEnd() );
197  break;
198 
199  case SHAPE_T::RECT:
200  points->AddPoint( shape->GetStart() );
201  points->AddPoint( wxPoint( shape->GetEnd().x, shape->GetStart().y ) );
202  points->AddPoint( shape->GetEnd() );
203  points->AddPoint( wxPoint( shape->GetStart().x, shape->GetEnd().y ) );
204 
205  points->AddLine( points->Point( RECT_TOP_LEFT ), points->Point( RECT_TOP_RIGHT ) );
206  points->Line( RECT_TOP ).SetConstraint( new EC_PERPLINE( points->Line( RECT_TOP ) ) );
207  points->AddLine( points->Point( RECT_TOP_RIGHT ), points->Point( RECT_BOT_RIGHT ) );
208  points->Line( RECT_RIGHT ).SetConstraint( new EC_PERPLINE( points->Line( RECT_RIGHT ) ) );
209  points->AddLine( points->Point( RECT_BOT_RIGHT ), points->Point( RECT_BOT_LEFT ) );
210  points->Line( RECT_BOT ).SetConstraint( new EC_PERPLINE( points->Line( RECT_BOT ) ) );
211  points->AddLine( points->Point( RECT_BOT_LEFT ), points->Point( RECT_TOP_LEFT ) );
212  points->Line( RECT_LEFT ).SetConstraint( new EC_PERPLINE( points->Line( RECT_LEFT ) ) );
213 
214  break;
215 
216  case SHAPE_T::ARC:
217  points->AddPoint( shape->GetCenter() );
218  points->AddPoint( shape->GetStart() );
219  points->AddPoint( shape->GetArcMid() );
220  points->AddPoint( shape->GetEnd() );
221 
222  points->Point( ARC_MID ).SetGridConstraint( IGNORE_GRID );
223  points->Point( ARC_START ).SetGridConstraint( SNAP_TO_GRID );
224  points->Point( ARC_CENTER ).SetGridConstraint( SNAP_BY_GRID );
225  points->Point( ARC_END ).SetGridConstraint( SNAP_TO_GRID );
226  break;
227 
228  case SHAPE_T::CIRCLE:
229  points->AddPoint( shape->GetCenter() );
230  points->AddPoint( shape->GetEnd() );
231  break;
232 
233  case SHAPE_T::POLY:
234  buildForPolyOutline( points, &shape->GetPolyShape() );
235  break;
236 
237  case SHAPE_T::BEZIER:
238  points->AddPoint( shape->GetStart() );
239  points->AddPoint( shape->GetBezierC1() );
240  points->AddPoint( shape->GetBezierC2() );
241  points->AddPoint( shape->GetEnd() );
242  break;
243 
244  default: // suppress warnings
245  break;
246  }
247 
248  break;
249  }
250 
251  case PCB_PAD_T:
252  {
253  const PAD* pad = static_cast<const PAD*>( aItem );
254  wxPoint shapePos = pad->ShapePos();
255  wxPoint halfSize( pad->GetSize().x / 2, pad->GetSize().y / 2 );
256 
257  if( !m_isFootprintEditor || pad->IsLocked() )
258  break;
259 
260  switch( pad->GetShape() )
261  {
262  case PAD_SHAPE::CIRCLE:
263  points->AddPoint( wxPoint( shapePos.x + halfSize.x, shapePos.y ) );
264  break;
265 
266  case PAD_SHAPE::OVAL:
268  case PAD_SHAPE::RECT:
271  {
272  if( (int) pad->GetOrientation() % 900 != 0 )
273  break;
274 
275  if( pad->GetOrientation() == 900 || pad->GetOrientation() == 2700 )
276  std::swap( halfSize.x, halfSize.y );
277 
278  points->AddPoint( shapePos - halfSize );
279  points->AddPoint( wxPoint( shapePos.x + halfSize.x, shapePos.y - halfSize.y ) );
280  points->AddPoint( shapePos + halfSize );
281  points->AddPoint( wxPoint( shapePos.x - halfSize.x, shapePos.y + halfSize.y ) );
282  }
283  break;
284 
285  default: // suppress warnings
286  break;
287  }
288  }
289  break;
290 
291  case PCB_FP_ZONE_T:
292  case PCB_ZONE_T:
293  {
294  const ZONE* zone = static_cast<const ZONE*>( aItem );
295  buildForPolyOutline( points, zone->Outline() );
296  }
297  break;
298 
299  case PCB_DIM_ALIGNED_T:
301  {
302  const PCB_DIM_ALIGNED* dimension = static_cast<const PCB_DIM_ALIGNED*>( aItem );
303 
304  points->AddPoint( dimension->GetStart() );
305  points->AddPoint( dimension->GetEnd() );
306  points->AddPoint( dimension->Text().GetPosition() );
307  points->AddPoint( dimension->GetCrossbarStart() );
308  points->AddPoint( dimension->GetCrossbarEnd() );
309 
310  if( aItem->Type() == PCB_DIM_ALIGNED_T )
311  {
312  // Dimension height setting - edit points should move only along the feature lines
313  points->Point( DIM_CROSSBARSTART )
314  .SetConstraint( new EC_LINE( points->Point( DIM_CROSSBARSTART ),
315  points->Point( DIM_START ) ) );
316  points->Point( DIM_CROSSBAREND )
317  .SetConstraint( new EC_LINE( points->Point( DIM_CROSSBAREND ),
318  points->Point( DIM_END ) ) );
319  }
320 
321  break;
322  }
323 
324  case PCB_DIM_CENTER_T:
325  {
326  const PCB_DIM_CENTER* dimension = static_cast<const PCB_DIM_CENTER*>( aItem );
327 
328  points->AddPoint( dimension->GetStart() );
329  points->AddPoint( dimension->GetEnd() );
330 
331  points->Point( DIM_END ).SetConstraint( new EC_45DEGREE( points->Point( DIM_END ),
332  points->Point( DIM_START ) ) );
333 
334  break;
335  }
336 
337  case PCB_DIM_LEADER_T:
338  {
339  const PCB_DIM_LEADER* dimension = static_cast<const PCB_DIM_LEADER*>( aItem );
340 
341  points->AddPoint( dimension->GetStart() );
342  points->AddPoint( dimension->GetEnd() );
343  points->AddPoint( dimension->Text().GetPosition() );
344 
345  points->Point( DIM_TEXT ).SetConstraint( new EC_45DEGREE( points->Point( DIM_TEXT ),
346  points->Point( DIM_END ) ) );
347 
348  break;
349  }
350 
351  default:
352  points.reset();
353  break;
354  }
355 
356  return points;
357 }
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:100
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:101
const wxPoint & GetCrossbarStart() const
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
PCB_TEXT & Text()
void buildForPolyOutline(std::shared_ptr< EDIT_POINTS > points, const SHAPE_POLY_SET *aOutline)
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:102
SHAPE_POLY_SET * Outline()
Definition: zone.h:320
EDIT_CONSTRAINT for a EDIT_LINE, that constrains the line to move perpendicular to the line itself.
const wxPoint & GetCrossbarEnd() const
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
class PAD, a pad in a footprint
Definition: typeinfo.h:89
EDIT_CONSTRAINT that imposes a constraint that a point has to lie on a line (determined by 2 points).
EDIT_CONSTRAINT that imposes a constraint that two points have to be located at angle of 45 degree mu...
For better understanding of the points that make a dimension:
const wxPoint & GetBezierC1() const
Definition: eda_shape.h:154
virtual const wxPoint & GetStart() const
The dimension's origin is the first feature point for the dimension.
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
virtual wxPoint GetPosition() const override
Definition: pcb_text.h:76
wxPoint GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Definition: pcb_shape.h:79
Mark the center of a circle or arc with a cross shape.
const wxPoint & GetBezierC2() const
Definition: eda_shape.h:157
Handle a list of polygons defining a copper zone.
Definition: zone.h:56
class ZONE, a copper pour area
Definition: typeinfo.h:105
bool m_isFootprintEditor
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
class ZONE, managed by a footprint
Definition: typeinfo.h:94
wxPoint GetArcMid() const
Definition: eda_shape.cpp:437
A leader is a dimension-like object pointing to a specific point.
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:103
virtual const wxPoint & GetEnd() const
SHAPE_T GetShape() const
Definition: eda_shape.h:101
Definition: pad.h:57
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References ARC, ARC_CENTER, ARC_END, ARC_START, BEZIER, buildForPolyOutline(), CHAMFERED_RECT, CIRCLE, DIM_CROSSBAREND, DIM_CROSSBARSTART, DIM_END, DIM_START, DIM_TEXT, EDA_SHAPE::GetArcMid(), EDA_SHAPE::GetBezierC1(), EDA_SHAPE::GetBezierC2(), PCB_SHAPE::GetCenter(), PCB_DIM_ALIGNED::GetCrossbarEnd(), PCB_DIM_ALIGNED::GetCrossbarStart(), PCB_DIMENSION_BASE::GetEnd(), EDA_SHAPE::GetEnd(), EDA_SHAPE::GetPolyShape(), PCB_TEXT::GetPosition(), EDA_SHAPE::GetShape(), EDA_SHAPE::GetStart(), PCB_DIMENSION_BASE::GetStart(), IGNORE_GRID, PCB_TOOL_BASE::m_isFootprintEditor, ZONE::Outline(), OVAL, pad, PCB_DIM_ALIGNED_T, PCB_DIM_CENTER_T, PCB_DIM_LEADER_T, PCB_DIM_ORTHOGONAL_T, PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_PAD_T, PCB_SHAPE_T, PCB_ZONE_T, POLY, RECT, RECT_BOT, RECT_BOT_LEFT, RECT_BOT_RIGHT, RECT_LEFT, RECT_RIGHT, RECT_TOP, RECT_TOP_LEFT, RECT_TOP_RIGHT, ROUNDRECT, SEGMENT, SNAP_BY_GRID, SNAP_TO_GRID, PCB_DIMENSION_BASE::Text(), TRAPEZOID, and EDA_ITEM::Type().

Referenced by OnSelectionChange(), and updatePoints().

◆ modifiedSelection()

int PCB_POINT_EDITOR::modifiedSelection ( const TOOL_EVENT aEvent)
private

Definition at line 2179 of file pcb_point_editor.cpp.

2180 {
2181  updatePoints();
2182  return 0;
2183 }
void updatePoints()
Update which point is being edited.

References updatePoints().

Referenced by setTransitions().

◆ OnSelectionChange()

int PCB_POINT_EDITOR::OnSelectionChange ( const TOOL_EVENT aEvent)

Change selection event handler.

Definition at line 401 of file pcb_point_editor.cpp.

402 {
404  return 0;
405 
406  PCB_BASE_EDIT_FRAME* editFrame = getEditFrame<PCB_BASE_EDIT_FRAME>();
408 
409  if( selection.Size() != 1 || selection.Front()->GetEditFlags() )
410  return 0;
411 
412  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( selection.Front() );
413 
414  if( !item || item->IsLocked() )
415  return 0;
416 
417  Activate();
418  // Must be done after Activate() so that it gets set into the correct context
419  getViewControls()->ShowCursor( true );
420 
422  m_editPoints = makePoints( item );
423 
424  if( !m_editPoints )
425  return 0;
426 
427  getView()->Add( m_editPoints.get() );
428  setEditedPoint( nullptr );
429  updateEditedPoint( aEvent );
430  m_refill = false;
431  bool inDrag = false;
432  bool lock45 = false;
433 
434  BOARD_COMMIT commit( editFrame );
435  LSET snapLayers = item->GetLayerSet();
436 
437  if( BaseType( item->Type() ) == PCB_DIMENSION_T )
438  snapLayers = LSET::AllLayersMask();
439 
440  // Main loop: keep receiving events
441  while( TOOL_EVENT* evt = Wait() )
442  {
443  grid.SetSnap( !evt->Modifier( MD_SHIFT ) );
444  grid.SetUseGrid( getView()->GetGAL()->GetGridSnapping() && !evt->DisableGridSnapping() );
445 
446  if( !m_editPoints || evt->IsSelectionEvent() ||
447  evt->Matches( EVENTS::InhibitSelectionEditing ) )
448  {
449  break;
450  }
451 
452  EDIT_POINT* prevHover = m_hoveredPoint;
453 
454  if( !inDrag )
455  updateEditedPoint( *evt );
456 
457  if( prevHover != m_hoveredPoint )
458  getView()->Update( m_editPoints.get() );
459 
460  if( evt->IsDrag( BUT_LEFT ) && m_editedPoint )
461  {
462  if( !inDrag )
463  {
464  frame()->UndoRedoBlock( true );
465 
466  commit.StageItems( selection, CHT_MODIFY );
467 
469  m_original = *m_editedPoint; // Save the original position
470  getViewControls()->SetAutoPan( true );
471  inDrag = true;
472 
474  grid.SetAuxAxes( true, m_original.GetPosition() );
475 
476  setAltConstraint( true );
478 
479  for( size_t ii = 0; ii < m_editPoints->PointsSize(); ++ii )
480  {
481  EDIT_POINT& point = m_editPoints->Point( ii );
482 
483  if( &point != m_editedPoint )
484  point.SetActive( false );
485  }
486  }
487 
488  VECTOR2I pos = evt->Position();
489 
490  //TODO: unify the constraints to solve simultaneously instead of sequentially
491  switch( m_editedPoint->GetGridConstraint() )
492  {
493  case IGNORE_GRID:
494  m_editedPoint->SetPosition( pos );
495  break;
496 
497  case SNAP_TO_GRID:
498  m_editedPoint->SetPosition( grid.BestSnapAnchor( pos, snapLayers, { item } ) );
499  break;
500 
501  case SNAP_BY_GRID:
502  {
503  if( grid.GetUseGrid() )
504  {
505  VECTOR2I gridPt = grid.BestSnapAnchor( pos, {}, { item } );
506 
508  VECTOR2I delta = pos - last;
509  VECTOR2I deltaGrid = gridPt - grid.BestSnapAnchor( last, {}, { item } );
510 
511  if( abs( delta.x ) > grid.GetGrid().x / 2 )
512  pos.x = last.x + deltaGrid.x;
513  else
514  pos.x = last.x;
515 
516  if( abs( delta.y ) > grid.GetGrid().y / 2 )
517  pos.y = last.y + deltaGrid.y;
518  else
519  pos.y = last.y;
520  }
521 
522  m_editedPoint->SetPosition( pos );
523  break;
524  }
525  }
526 
527  // The alternative constraint limits to 45 degrees
528  if( lock45 )
529  m_altConstraint->Apply();
530  else
532 
534  {
536  snapLayers, { item } ) );
537  }
538 
539  updateItem();
541  updatePoints();
542  }
543  else if( m_editedPoint && evt->Action() == TA_MOUSE_DOWN && evt->Buttons() == BUT_LEFT )
544  {
546 
547  for( size_t ii = 0; ii < m_editPoints->PointsSize(); ++ii )
548  {
549  EDIT_POINT& point = m_editPoints->Point( ii );
550 
551  if( &point != m_editedPoint )
552  point.SetActive( false );
553  }
554 
555  getView()->Update( m_editPoints.get() );
556  }
557  else if( inDrag && evt->IsMouseUp( BUT_LEFT ) )
558  {
559  if( m_editedPoint )
560  {
561  m_editedPoint->SetActive( false );
562  getView()->Update( m_editPoints.get() );
563  }
564 
565  getViewControls()->SetAutoPan( false );
566  setAltConstraint( false );
567 
568  commit.Push( _( "Drag a corner" ) );
569  inDrag = false;
570  frame()->UndoRedoBlock( false );
571 
572  m_refill = true;
573  }
574  else if( evt->IsAction( &PCB_ACTIONS::toggle45 ) )
575  {
576  lock45 = !lock45;
577  evt->SetPassEvent( false );
578  }
579  else if( evt->IsCancelInteractive() || evt->IsActivate() )
580  {
581  if( inDrag ) // Restore the last change
582  {
583  commit.Revert();
584  inDrag = false;
585  frame()->UndoRedoBlock( false );
586  }
587 
588  // Only cancel point editor when activating a new tool
589  // Otherwise, allow the points to persist when moving up the
590  // tool stack
591  if( evt->IsActivate() && !evt->IsMoveTool() )
592  break;
593  }
594  else if( evt->Action() == TA_UNDO_REDO_POST )
595  {
596  break;
597  }
598 
599  else
600  {
601  evt->SetPassEvent();
602  }
603  }
604 
605  if( m_editPoints )
606  {
607  getView()->Remove( m_editPoints.get() );
608 
609  finishItem();
610  m_editPoints.reset();
611  }
612 
613  m_editedPoint = nullptr;
614 
615  frame()->UpdateMsgPanel();
616 
617  return 0;
618 }
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
TOOL_EVENT * Wait(const TOOL_EVENT_LIST &aEventList=TOOL_EVENT(TC_ANY, TA_ANY))
Suspend execution of the tool until an event specified in aEventList arrives.
void updatePoints()
Update which point is being edited.
void updateEditedPoint(const TOOL_EVENT &aEvent)
Set the current point being edited. NULL means none.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:49
void setEditedPoint(EDIT_POINT *aPoint)
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
Definition: typeinfo.h:231
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:350
void UndoRedoBlock(bool aBlock=true)
Enable/disable undo and redo operations.
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
virtual bool IsLocked() const
Definition: board_item.cpp:64
std::shared_ptr< EDIT_POINTS > m_editPoints
GRID_CONSTRAINT_TYPE GetGridConstraint() const
Definition: edit_points.h:177
EDIT_POINT * m_editedPoint
std::shared_ptr< EDIT_POINTS > makePoints(EDA_ITEM *aItem)
Update item's points with edit points.
PCB_BASE_EDIT_FRAME * frame() const
PCB_SELECTION & GetSelection()
Return the set of currently selected items.
void SetActive(bool aActive=true)
Definition: edit_points.h:172
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:516
const PCB_SELECTION & selection() const
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
Definition: edit_points.h:70
PCB_SELECTION_TOOL * m_selectionTool
void setAltConstraint(bool aEnabled)
Return a point that should be used as a constrainer for 45 degrees mode.
Generic, UI-independent tool event.
Definition: tool_event.h:152
#define _(s)
virtual void ForceCursorPosition(bool aEnabled, const VECTOR2D &aPosition=VECTOR2D(0, 0))
Place the cursor immediately at a given point.
static LSET AllLayersMask()
Definition: lset.cpp:796
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_altConstraint
bool Matches(const TOOL_EVENT &aEvent) const
Test whether two events match in terms of category & action or command.
Definition: tool_event.h:362
EDA_ITEM_FLAGS GetEditFlags() const
Definition: eda_item.h:157
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition: typeinfo.h:99
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
EDIT_POINT m_original
Original position for the current drag point.
Common, abstract interface for edit frames.
int Size() const
Returns the number of selected parts.
Definition: selection.h:104
static const TOOL_EVENT InhibitSelectionEditing
Definition: actions.h:211
void Activate()
Run the tool.
constexpr int delta
EDIT_POINT * m_hoveredPoint
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:320
Represent a single point that can be used for modifying items.
Definition: edit_points.h:47
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42
void updateItem() const
Apply the last changes to the edited item.
static TOOL_ACTION toggle45
Definition: pcb_actions.h:420
virtual void ApplyConstraint()
Correct coordinates of an EDIT_POINT by applying previously set constraint.
Definition: edit_points.h:165
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
Definition: board_item.h:148
EDA_ITEM * Front() const
Definition: selection.h:145
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...
Definition: view.cpp:1570
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112
virtual void UpdateMsgPanel()
Redraw the message panel.
virtual void SetPosition(const VECTOR2I &aPosition)
Set new coordinates for an EDIT_POINT.
Definition: edit_points.h:106

References _, TOOL_INTERACTIVE::Activate(), KIGFX::VIEW::Add(), LSET::AllLayersMask(), EDIT_POINT::ApplyConstraint(), BaseType(), BUT_LEFT, CHT_MODIFY, delta, finishItem(), KIGFX::VIEW_CONTROLS::ForceCursorPosition(), PCB_TOOL_BASE::frame(), SELECTION::Front(), EDA_ITEM::GetEditFlags(), EDIT_POINT::GetGridConstraint(), BOARD_ITEM::GetLayerSet(), PCB_BASE_FRAME::GetMagneticItemsSettings(), EDIT_POINT::GetPosition(), PCB_SELECTION_TOOL::GetSelection(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), grid, IGNORE_GRID, EVENTS::InhibitSelectionEditing, BOARD_ITEM::IsLocked(), m_altConstraint, m_editedPoint, m_editPoints, m_hoveredPoint, m_original, m_refill, m_selectionTool, TOOL_BASE::m_toolMgr, makePoints(), TOOL_EVENT::Matches(), MD_SHIFT, PCB_DIMENSION_T, BOARD_COMMIT::Push(), KIGFX::VIEW::Remove(), BOARD_COMMIT::Revert(), PCB_TOOL_BASE::selection(), EDIT_POINT::SetActive(), setAltConstraint(), KIGFX::VIEW_CONTROLS::SetAutoPan(), setEditedPoint(), EDIT_POINT::SetPosition(), KIGFX::VIEW_CONTROLS::ShowCursor(), SELECTION::Size(), SNAP_BY_GRID, SNAP_TO_GRID, COMMIT::StageItems(), TA_MOUSE_DOWN, TA_UNDO_REDO_POST, PCB_ACTIONS::toggle45, EDA_ITEM::Type(), PCB_BASE_EDIT_FRAME::UndoRedoBlock(), KIGFX::VIEW::Update(), updateEditedPoint(), updateItem(), EDA_DRAW_FRAME::UpdateMsgPanel(), updatePoints(), TOOL_INTERACTIVE::Wait(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by setTransitions().

◆ removeCorner()

int PCB_POINT_EDITOR::removeCorner ( const TOOL_EVENT aEvent)
private

Definition at line 2103 of file pcb_point_editor.cpp.

2104 {
2105  if( !m_editPoints || !m_editedPoint )
2106  return 0;
2107 
2108  EDA_ITEM* item = m_editPoints->GetParent();
2109 
2110  if( !item )
2111  return 0;
2112 
2113  SHAPE_POLY_SET* polygon = nullptr;
2114 
2115  if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
2116  {
2117  ZONE* zone = static_cast<ZONE*>( item );
2118  polygon = zone->Outline();
2119  zone->SetNeedRefill( true );
2120  }
2121  else if( item->Type() == PCB_FP_SHAPE_T || item->Type() == PCB_SHAPE_T )
2122  {
2123  PCB_SHAPE* shape = static_cast<PCB_SHAPE*>( item );
2124 
2125  if( shape->GetShape() == SHAPE_T::POLY )
2126  polygon = &shape->GetPolyShape();
2127  }
2128 
2129  if( !polygon )
2130  return 0;
2131 
2132  PCB_BASE_FRAME* frame = getEditFrame<PCB_BASE_FRAME>();
2133  BOARD_COMMIT commit( frame );
2134  auto vertex = findVertex( *polygon, *m_editedPoint );
2135 
2136  if( vertex.first )
2137  {
2138  const auto& vertexIdx = vertex.second;
2139  auto& outline = polygon->Polygon( vertexIdx.m_polygon )[vertexIdx.m_contour];
2140 
2141  if( outline.PointCount() > 3 )
2142  {
2143  // the usual case: remove just the corner when there are >3 vertices
2144  commit.Modify( item );
2145  polygon->RemoveVertex( vertexIdx );
2146  validatePolygon( *polygon );
2147  }
2148  else
2149  {
2150  // either remove a hole or the polygon when there are <= 3 corners
2151  if( vertexIdx.m_contour > 0 )
2152  {
2153  // remove hole
2154  commit.Modify( item );
2155  polygon->RemoveContour( vertexIdx.m_contour );
2156  }
2157  else
2158  {
2160  commit.Remove( item );
2161  }
2162  }
2163 
2164  setEditedPoint( nullptr );
2165 
2166  commit.Push( _( "Remove a zone/polygon corner" ) );
2167 
2168  // Refresh zone hatching
2169  if( item->Type() == PCB_ZONE_T || item->Type() == PCB_FP_ZONE_T )
2170  static_cast<ZONE*>( item )->HatchBorder();
2171 
2172  updatePoints();
2173  }
2174 
2175  return 0;
2176 }
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:59
void updatePoints()
Update which point is being edited.
void setEditedPoint(EDIT_POINT *aPoint)
SHAPE_POLY_SET * Outline()
Definition: zone.h:320
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:143
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
static std::pair< bool, SHAPE_POLY_SET::VERTEX_INDEX > findVertex(SHAPE_POLY_SET &aPolySet, const EDIT_POINT &aPoint)
std::shared_ptr< EDIT_POINTS > m_editPoints
EDIT_POINT * m_editedPoint
PCB_BASE_EDIT_FRAME * frame() const
Represent a set of closed polygons.
#define _(s)
Handle a list of polygons defining a copper zone.
Definition: zone.h:56
class ZONE, a copper pour area
Definition: typeinfo.h:105
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
void RemoveVertex(int aGlobalIndex)
Delete the aGlobalIndex-th vertex.
class ZONE, managed by a footprint
Definition: typeinfo.h:94
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:238
SHAPE_T GetShape() const
Definition: eda_shape.h:101
POLYGON & Polygon(int aIndex)
bool validatePolygon(SHAPE_POLY_SET &aModified) const
Validate a polygon and displays a popup warning if invalid.
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112
void RemoveContour(int aContourIdx, int aPolygonIdx=-1)
Delete the aContourIdx-th contour of the aPolygonIdx-th polygon in the set.

References _, findVertex(), PCB_TOOL_BASE::frame(), EDA_SHAPE::GetPolyShape(), EDA_SHAPE::GetShape(), m_editedPoint, m_editPoints, TOOL_BASE::m_toolMgr, COMMIT::Modify(), ZONE::Outline(), PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_SHAPE_T, PCB_ZONE_T, POLY, SHAPE_POLY_SET::Polygon(), BOARD_COMMIT::Push(), COMMIT::Remove(), SHAPE_POLY_SET::RemoveContour(), SHAPE_POLY_SET::RemoveVertex(), TOOL_MANAGER::RunAction(), PCB_ACTIONS::selectionClear, setEditedPoint(), ZONE::SetNeedRefill(), EDA_ITEM::Type(), updatePoints(), and validatePolygon().

Referenced by setTransitions().

◆ removeCornerCondition()

bool PCB_POINT_EDITOR::removeCornerCondition ( const SELECTION aSelection)
private

Definition at line 1919 of file pcb_point_editor.cpp.

1920 {
1921  if( !m_editPoints || !m_editedPoint )
1922  return false;
1923 
1924  EDA_ITEM* item = m_editPoints->GetParent();
1925  SHAPE_POLY_SET* polyset = nullptr;
1926 
1927  if( !item )
1928  return false;
1929 
1930  switch( item->Type() )
1931  {
1932  case PCB_ZONE_T:
1933  case PCB_FP_ZONE_T:
1934  polyset = static_cast<ZONE*>( item )->Outline();
1935  break;
1936 
1937  case PCB_SHAPE_T:
1938  case PCB_FP_SHAPE_T:
1939  if( static_cast<PCB_SHAPE*>( item )->GetShape() == SHAPE_T::POLY )
1940  polyset = &static_cast<PCB_SHAPE*>( item )->GetPolyShape();
1941  else
1942  return false;
1943 
1944  break;
1945 
1946  default:
1947  return false;
1948  }
1949 
1950  auto vertex = findVertex( *polyset, *m_editedPoint );
1951 
1952  if( !vertex.first )
1953  return false;
1954 
1955  const auto& vertexIdx = vertex.second;
1956 
1957  // Check if there are enough vertices so one can be removed without
1958  // degenerating the polygon.
1959  // The first condition allows one to remove all corners from holes (when
1960  // there are only 2 vertices left, a hole is removed).
1961  if( vertexIdx.m_contour == 0 &&
1962  polyset->Polygon( vertexIdx.m_polygon )[vertexIdx.m_contour].PointCount() <= 3 )
1963  return false;
1964 
1965  // Remove corner does not work with lines
1966  if( dynamic_cast<EDIT_LINE*>( m_editedPoint ) )
1967  return false;
1968 
1969  return m_editedPoint != nullptr;
1970 }
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
static std::pair< bool, SHAPE_POLY_SET::VERTEX_INDEX > findVertex(SHAPE_POLY_SET &aPolySet, const EDIT_POINT &aPoint)
std::shared_ptr< EDIT_POINTS > m_editPoints
EDIT_POINT * m_editedPoint
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
class ZONE, a copper pour area
Definition: typeinfo.h:105
class ZONE, managed by a footprint
Definition: typeinfo.h:94
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
POLYGON & Polygon(int aIndex)
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References findVertex(), m_editedPoint, m_editPoints, SHAPE_POLY_SET::Outline(), PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_SHAPE_T, PCB_ZONE_T, POLY, SHAPE_POLY_SET::Polygon(), and EDA_ITEM::Type().

Referenced by Init().

◆ Reset()

void PCB_POINT_EDITOR::Reset ( RESET_REASON  aReason)
overridevirtual

Bring the tool to a known, initial state.

If the tool claimed anything from the model or the view, it must release it when its reset.

Parameters
aReasoncontains information about the reason of tool reset.

Reimplemented from PCB_TOOL_BASE.

Definition at line 114 of file pcb_point_editor.cpp.

115 {
116  m_refill = false;
117  m_editPoints.reset();
118  m_altConstraint.reset();
119  getViewControls()->SetAutoPan( false );
120 
121  m_statusPopup = std::make_unique<STATUS_TEXT_POPUP>( getEditFrame<PCB_BASE_EDIT_FRAME>() );
122  m_statusPopup->SetTextColor( wxColour( 255, 0, 0 ) );
123  m_statusPopup->SetText( _( "Self-intersecting polygons are not allowed." ) );
124 }
std::unique_ptr< STATUS_TEXT_POPUP > m_statusPopup
std::shared_ptr< EDIT_POINTS > m_editPoints
#define _(s)
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_altConstraint
virtual void SetAutoPan(bool aEnabled)
Turn on/off auto panning (this feature is used when there is a tool active (eg.
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42

References _, TOOL_BASE::getViewControls(), m_altConstraint, m_editPoints, m_refill, m_statusPopup, and KIGFX::VIEW_CONTROLS::SetAutoPan().

◆ RunMainStack()

void TOOL_INTERACTIVE::RunMainStack ( std::function< void()>  aFunc)
inherited

Call a function using the main stack.

Parameters
aFuncis the function to be calls.

Definition at line 87 of file tool_interactive.cpp.

88 {
89  m_toolMgr->RunMainStack( this, std::move( aFunc ) );
90 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
void RunMainStack(TOOL_BASE *aTool, std::function< void()> aFunc)

References TOOL_BASE::m_toolMgr, and TOOL_MANAGER::RunMainStack().

Referenced by DRAWING_TOOL::PlaceText().

◆ selection() [1/2]

const PCB_SELECTION & PCB_TOOL_BASE::selection ( ) const
protectedinherited

Definition at line 307 of file pcb_tool_base.cpp.

308 {
310 
311  return selTool->GetSelection();
312 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
PCB_SELECTION & GetSelection()
Return the set of currently selected items.
The selection tool: currently supports:

References PCB_SELECTION_TOOL::GetSelection(), TOOL_MANAGER::GetTool(), and TOOL_BASE::m_toolMgr.

Referenced by AUTOPLACE_TOOL::autoplaceSelected(), BOARD_INSPECTION_TOOL::calculateSelectionRatsnest(), ROUTER_TOOL::CanInlineDrag(), EDIT_TOOL::ChangeTrackWidth(), PAD_TOOL::copyPadSettings(), EDIT_TOOL::copyToClipboard(), EDIT_TOOL::CreateArray(), DRC_TOOL::CrossProbe(), BOARD_INSPECTION_TOOL::CrossProbePcbToSch(), BOARD_INSPECTION_TOOL::doHideNet(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::doMoveSelection(), EDIT_TOOL::Drag(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), DRAWING_TOOL::DrawZone(), EDIT_TOOL::Duplicate(), BOARD_EDITOR_CONTROL::EditFpInFpEditor(), PAD_TOOL::EditPad(), GROUP_TOOL::EnterGroup(), PAD_TOOL::EnumeratePads(), GLOBAL_EDIT_TOOL::ExchangeFootprints(), EDIT_TOOL::FilletTracks(), PCB_SELECTION_TOOL::filterSelection(), EDIT_TOOL::Flip(), DRAWING_TOOL::getSourceZoneForAction(), GROUP_TOOL::Group(), BOARD_INSPECTION_TOOL::highlightNet(), ROUTER_TOOL::InlineBreakTrack(), ROUTER_TOOL::InlineDrag(), BOARD_INSPECTION_TOOL::InspectClearance(), BOARD_INSPECTION_TOOL::InspectConstraints(), DRAWING_TOOL::InteractivePlaceWithPreview(), BOARD_INSPECTION_TOOL::LocalRatsnestTool(), ROUTER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::MainLoop(), EDIT_TOOL::Mirror(), BOARD_EDITOR_CONTROL::modifyLockSelected(), EDIT_TOOL::MoveExact(), OnSelectionChange(), PAD_TOOL::pastePadProperties(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), PCB_CONTROL::placeBoardItems(), BOARD_EDITOR_CONTROL::PlaceFootprint(), DRAWING_TOOL::PlaceImportedGraphics(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), POSITION_RELATIVE_TOOL::PositionRelative(), EDIT_TOOL::Properties(), PAD_TOOL::pushPadSettings(), BOARD_REANNOTATE_TOOL::ReannotateDuplicatesInSelection(), GROUP_TOOL::RemoveFromGroup(), GLOBAL_EDIT_TOOL::RemoveUnusedPads(), EDIT_TOOL::Rotate(), PCB_SELECTION_TOOL::selectNet(), DRAWING_TOOL::SetAnchor(), BOARD_EDITOR_CONTROL::TrackWidthDec(), BOARD_EDITOR_CONTROL::TrackWidthInc(), GROUP_TOOL::Ungroup(), PCB_CONTROL::UpdateMessagePanel(), BOARD_INSPECTION_TOOL::UpdateSelectionRatsnest(), BOARD_EDITOR_CONTROL::ViaSizeDec(), BOARD_EDITOR_CONTROL::ViaSizeInc(), BOARD_EDITOR_CONTROL::ZoneDuplicate(), ZONE_FILLER_TOOL::ZoneFill(), BOARD_EDITOR_CONTROL::ZoneMerge(), and ZONE_FILLER_TOOL::ZoneUnfill().

◆ selection() [2/2]

PCB_SELECTION & PCB_TOOL_BASE::selection ( )
protectedinherited

Definition at line 315 of file pcb_tool_base.cpp.

316 {
318 
319  return selTool->GetSelection();
320 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
PCB_SELECTION & GetSelection()
Return the set of currently selected items.
The selection tool: currently supports:

References PCB_SELECTION_TOOL::GetSelection(), TOOL_MANAGER::GetTool(), and TOOL_BASE::m_toolMgr.

◆ setAltConstraint()

void PCB_POINT_EDITOR::setAltConstraint ( bool  aEnabled)
private

Return a point that should be used as a constrainer for 45 degrees mode.

Definition at line 1775 of file pcb_point_editor.cpp.

1776 {
1777  if( aEnabled )
1778  {
1779  EDA_ITEM* parent = m_editPoints->GetParent();
1780  EDIT_LINE* line = dynamic_cast<EDIT_LINE*>( m_editedPoint );
1781  bool isPoly;
1782 
1783  switch( parent->Type() )
1784  {
1785  case PCB_ZONE_T:
1786  case PCB_FP_ZONE_T:
1787  isPoly = true;
1788  break;
1789 
1790  case PCB_SHAPE_T:
1791  case PCB_FP_SHAPE_T:
1792  isPoly = static_cast<PCB_SHAPE*>( parent )->GetShape() == SHAPE_T::POLY;
1793  break;
1794 
1795  default:
1796  isPoly = false;
1797  break;
1798  }
1799 
1800  if( line && isPoly )
1801  {
1802  EC_CONVERGING* altConstraint = new EC_CONVERGING( *line, *m_editPoints );
1803  m_altConstraint.reset( (EDIT_CONSTRAINT<EDIT_POINT>*) altConstraint );
1804  }
1805  else
1806  {
1807  // Find a proper constraining point for 45 degrees mode
1810  }
1811  }
1812  else
1813  {
1814  m_altConstraint.reset();
1815  }
1816 }
EDIT_CONSTRAINT for 3 segments: dragged and two adjacent ones, enforcing to keep their slopes and all...
EDIT_POINT get45DegConstrainer() const
Condition to display "Create corner" context menu entry.
Represent a line connecting two EDIT_POINTs.
Definition: edit_points.h:215
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
std::shared_ptr< EDIT_POINTS > m_editPoints
EDIT_CONSTRAINT that imposes a constraint that two points have to be located at angle of 45 degree mu...
EDIT_POINT * m_editedPoint
EDIT_POINT m_altConstrainer
class ZONE, a copper pour area
Definition: typeinfo.h:105
std::shared_ptr< EDIT_CONSTRAINT< EDIT_POINT > > m_altConstraint
class ZONE, managed by a footprint
Definition: typeinfo.h:94
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References get45DegConstrainer(), m_altConstrainer, m_altConstraint, m_editedPoint, m_editPoints, PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_SHAPE_T, PCB_ZONE_T, POLY, and EDA_ITEM::Type().

Referenced by OnSelectionChange().

◆ SetContextMenu()

void TOOL_INTERACTIVE::SetContextMenu ( ACTION_MENU aMenu,
CONTEXT_MENU_TRIGGER  aTrigger = CMENU_BUTTON 
)
inherited

Assign a context menu and tells when it should be activated.

Parameters
aMenuis the menu to be assigned.
aTriggerdetermines conditions upon which the context menu is activated.

Definition at line 76 of file tool_interactive.cpp.

77 {
78  if( aMenu )
79  aMenu->SetTool( this );
80  else
81  aTrigger = CMENU_OFF;
82 
83  m_toolMgr->ScheduleContextMenu( this, aMenu, aTrigger );
84 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
void SetTool(TOOL_INTERACTIVE *aTool)
Set a tool that is the creator of the menu.
void ScheduleContextMenu(TOOL_BASE *aTool, ACTION_MENU *aMenu, CONTEXT_MENU_TRIGGER aTrigger)
Set behavior of the tool's context popup menu.

References CMENU_OFF, TOOL_BASE::m_toolMgr, TOOL_MANAGER::ScheduleContextMenu(), and ACTION_MENU::SetTool().

Referenced by GERBVIEW_SELECTION_TOOL::disambiguationMenu(), PL_SELECTION_TOOL::doSelectionMenu(), EE_SELECTION_TOOL::doSelectionMenu(), PCB_SELECTION_TOOL::doSelectionMenu(), TOOL_MENU::ShowContextMenu(), and SCH_LINE_WIRE_BUS_TOOL::UnfoldBus().

◆ setEditedPoint()

void PCB_POINT_EDITOR::setEditedPoint ( EDIT_POINT aPoint)
private

Definition at line 1753 of file pcb_point_editor.cpp.

1754 {
1756 
1757  if( aPoint )
1758  {
1760  controls->ForceCursorPosition( true, aPoint->GetPosition() );
1761  controls->ShowCursor( true );
1762  }
1763  else
1764  {
1765  if( frame()->ToolStackIsEmpty() )
1766  controls->ShowCursor( false );
1767 
1768  controls->ForceCursorPosition( false );
1769  }
1770 
1771  m_editedPoint = aPoint;
1772 }
virtual void ShowCursor(bool aEnabled)
Enable or disables display of cursor.
void SetCurrentCursor(KICURSOR aCursor)
Set the current cursor shape for this panel.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EDIT_POINT * m_editedPoint
PCB_BASE_EDIT_FRAME * frame() const
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
Definition: edit_points.h:70
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.
KIGFX::VIEW_CONTROLS * controls() const
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42

References ARROW, PCB_TOOL_BASE::controls(), KIGFX::VIEW_CONTROLS::ForceCursorPosition(), PCB_TOOL_BASE::frame(), PCB_BASE_FRAME::GetCanvas(), EDIT_POINT::GetPosition(), TOOL_BASE::getViewControls(), m_editedPoint, EDA_DRAW_PANEL_GAL::SetCurrentCursor(), and KIGFX::VIEW_CONTROLS::ShowCursor().

Referenced by OnSelectionChange(), removeCorner(), and updateEditedPoint().

◆ SetIsFootprintEditor()

void PCB_TOOL_BASE::SetIsFootprintEditor ( bool  aEnabled)
inlineinherited

Function SetIsFootprintEditor()

Toggles edit footprint mode. When enabled, one may select parts of footprints individually (graphics, pads, etc.), so they can be modified.

Parameters
aEnableddecides if the mode should be enabled.

Definition at line 103 of file pcb_tool_base.h.

103 { m_isFootprintEditor = aEnabled; }
bool m_isFootprintEditor

References PCB_TOOL_BASE::m_isFootprintEditor.

◆ setTransitions()

void PCB_POINT_EDITOR::setTransitions ( )
overrideprivatevirtual

< Set up handlers for various events.

Reimplemented from PCB_TOOL_BASE.

Definition at line 2193 of file pcb_point_editor.cpp.

2194 {
2204 }
int removeCorner(const TOOL_EVENT &aEvent)
static const TOOL_EVENT SelectedEvent
Definition: actions.h:200
static TOOL_ACTION activatePointEditor
Definition: actions.h:168
static const TOOL_EVENT UnselectedEvent
Definition: actions.h:201
int addCorner(const TOOL_EVENT &aEvent)
TOOL_ACTION handlers.
static TOOL_ACTION changeEditMethod
Definition: actions.h:169
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Define which state (aStateFunc) to go when a certain event arrives (aConditions).
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
Definition: actions.h:205
int modifiedSelection(const TOOL_EVENT &aEvent)
int OnSelectionChange(const TOOL_EVENT &aEvent)
Change selection event handler.
static TOOL_ACTION pointEditorAddCorner
Break outline (insert additional points to an edge)
Definition: pcb_actions.h:207
static TOOL_ACTION pointEditorRemoveCorner
Removes a corner.
Definition: pcb_actions.h:210
int changeEditMethod(const TOOL_EVENT &aEvent)
static const TOOL_EVENT UninhibitSelectionEditing
Used to inform tool that it should display the disambiguation menu.
Definition: actions.h:212
static const TOOL_EVENT InhibitSelectionEditing
Definition: actions.h:211

References ACTIONS::activatePointEditor, addCorner(), changeEditMethod(), ACTIONS::changeEditMethod, TOOL_INTERACTIVE::Go(), EVENTS::InhibitSelectionEditing, modifiedSelection(), OnSelectionChange(), PCB_ACTIONS::pointEditorAddCorner, PCB_ACTIONS::pointEditorRemoveCorner, removeCorner(), EVENTS::SelectedEvent, EVENTS::SelectedItemsModified, EVENTS::UninhibitSelectionEditing, and EVENTS::UnselectedEvent.

◆ updateEditedPoint()

void PCB_POINT_EDITOR::updateEditedPoint ( const TOOL_EVENT aEvent)
private

Set the current point being edited. NULL means none.

Definition at line 360 of file pcb_point_editor.cpp.

361 {
362  EDIT_POINT* point;
363  EDIT_POINT* hovered = nullptr;
364 
365  if( aEvent.IsMotion() )
366  {
367  point = m_editPoints->FindPoint( aEvent.Position(), getView() );
368  hovered = point;
369  }
370  else if( aEvent.IsDrag( BUT_LEFT ) )
371  {
372  point = m_editPoints->FindPoint( aEvent.DragOrigin(), getView() );
373  }
374  else
375  {
376  point = m_editPoints->FindPoint( getViewControls()->GetCursorPosition(), getView() );
377  }
378 
379  if( hovered )
380  {
381  if( m_hoveredPoint != hovered )
382  {
383  if( m_hoveredPoint )
384  m_hoveredPoint->SetHover( false );
385 
386  m_hoveredPoint = hovered;
388  }
389  }
390  else if( m_hoveredPoint )
391  {
392  m_hoveredPoint->SetHover( false );
393  m_hoveredPoint = nullptr;
394  }
395 
396  if( m_editedPoint != point )
397  setEditedPoint( point );
398 }
void setEditedPoint(EDIT_POINT *aPoint)
bool IsMotion() const
Definition: tool_event.h:300
std::shared_ptr< EDIT_POINTS > m_editPoints
EDIT_POINT * m_editedPoint
bool IsDrag(int aButtonMask=BUT_ANY) const
Definition: tool_event.h:285
const VECTOR2D DragOrigin() const
Returns information about mouse buttons state.
Definition: tool_event.h:269
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
void SetHover(bool aHover=true)
Definition: edit_points.h:175
EDIT_POINT * m_hoveredPoint
Represent a single point that can be used for modifying items.
Definition: edit_points.h:47
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42
const VECTOR2D Position() const
Returns the point where dragging has started.
Definition: tool_event.h:263

References BUT_LEFT, TOOL_EVENT::DragOrigin(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), TOOL_EVENT::IsDrag(), TOOL_EVENT::IsMotion(), m_editedPoint, m_editPoints, m_hoveredPoint, TOOL_EVENT::Position(), setEditedPoint(), and EDIT_POINT::SetHover().

Referenced by OnSelectionChange().

◆ updateItem()

void PCB_POINT_EDITOR::updateItem ( ) const
private

Apply the last changes to the edited item.

Definition at line 1021 of file pcb_point_editor.cpp.

1022 {
1023  EDA_ITEM* item = m_editPoints->GetParent();
1024 
1025  if( !item )
1026  return;
1027 
1028  switch( item->Type() )
1029  {
1030  case PCB_SHAPE_T:
1031  case PCB_FP_SHAPE_T:
1032  {
1033  PCB_SHAPE* shape = static_cast<PCB_SHAPE*>( item );
1034 
1035  switch( shape->GetShape() )
1036  {
1037  case SHAPE_T::SEGMENT:
1038  if( isModified( m_editPoints->Point( SEG_START ) ) )
1039  shape->SetStart( (wxPoint) m_editPoints->Point( SEG_START ).GetPosition() );
1040  else if( isModified( m_editPoints->Point( SEG_END ) ) )
1041  shape->SetEnd( (wxPoint) m_editPoints->Point( SEG_END ).GetPosition() );
1042 
1043  break;
1044 
1045  case SHAPE_T::RECT:
1046  {
1047  if( isModified( m_editPoints->Point( RECT_TOP_LEFT ) ) )
1048  {
1049  shape->SetStart( (wxPoint) m_editPoints->Point( RECT_TOP_LEFT ).GetPosition() );
1050  }
1051  else if( isModified( m_editPoints->Point( RECT_TOP_RIGHT ) ) )
1052  {
1053  shape->SetStartY( m_editPoints->Point( RECT_TOP_RIGHT ).GetPosition().y );
1054  shape->SetEndX( m_editPoints->Point( RECT_TOP_RIGHT ).GetPosition().x );
1055  }
1056  else if( isModified( m_editPoints->Point( RECT_BOT_RIGHT ) ) )
1057  {
1058  shape->SetEnd( (wxPoint) m_editPoints->Point( RECT_BOT_RIGHT ).GetPosition() );
1059  }
1060  else if( isModified( m_editPoints->Point( RECT_BOT_LEFT ) ) )
1061  {
1062  shape->SetStartX( m_editPoints->Point( RECT_BOT_LEFT ).GetPosition().x );
1063  shape->SetEndY( m_editPoints->Point( RECT_BOT_LEFT ).GetPosition().y );
1064  }
1065  else if( isModified( m_editPoints->Line( RECT_TOP ) ) )
1066  {
1067  shape->SetStartY( m_editPoints->Point( RECT_TOP_LEFT ).GetPosition().y );
1068  }
1069  else if( isModified( m_editPoints->Line( RECT_LEFT ) ) )
1070  {
1071  shape->SetStartX( m_editPoints->Point( RECT_BOT_LEFT ).GetPosition().x );
1072  }
1073  else if( isModified( m_editPoints->Line( RECT_BOT ) ) )
1074  {
1075  shape->SetEndY( m_editPoints->Point( RECT_BOT_RIGHT ).GetPosition().y );
1076  }
1077  else if( isModified( m_editPoints->Line( RECT_RIGHT ) ) )
1078  {
1079  shape->SetEndX( m_editPoints->Point( RECT_TOP_RIGHT ).GetPosition().x );
1080  }
1081 
1082  for( unsigned i = 0; i < m_editPoints->LinesSize(); ++i )
1083  {
1084  if( !isModified( m_editPoints->Line( i ) ) )
1085  m_editPoints->Line( i ).SetConstraint(
1086  new EC_PERPLINE( m_editPoints->Line( i ) ) );
1087  }
1088  }
1089  break;
1090 
1091  case SHAPE_T::ARC:
1092  {
1093  VECTOR2I center = m_editPoints->Point( ARC_CENTER ).GetPosition();
1094  VECTOR2I mid = m_editPoints->Point( ARC_MID ).GetPosition();
1095  VECTOR2I start = m_editPoints->Point( ARC_START ).GetPosition();
1096  VECTOR2I end = m_editPoints->Point( ARC_END ).GetPosition();
1097 
1098  if( isModified( m_editPoints->Point( ARC_CENTER ) ) )
1099  {
1100  wxPoint moveVector = wxPoint( center.x, center.y ) - shape->GetCenter();
1101  shape->Move( moveVector );
1102  }
1103  else if( isModified( m_editPoints->Point( ARC_MID ) ) )
1104  {
1105  const VECTOR2I& cursorPos = getViewControls()->GetCursorPosition( false );
1106 
1107  if( m_altEditMethod )
1108  editArcMidKeepCenter( shape, center, start, mid, end, cursorPos );
1109  else
1110  editArcMidKeepEndpoints( shape, start, end, cursorPos );
1111  }
1112  else if( isModified( m_editPoints->Point( ARC_START ) )
1113  || isModified( m_editPoints->Point( ARC_END ) ) )
1114  {
1115  const VECTOR2I& cursorPos = getViewControls()->GetCursorPosition();
1116 
1117  if( m_altEditMethod )
1118  editArcEndpointKeepCenter( shape, center, start, mid, end, cursorPos );
1119  else
1120  editArcEndpointKeepTangent( shape, center, start, mid, end, cursorPos );
1121  }
1122  }
1123  break;
1124 
1125  case SHAPE_T::CIRCLE:
1126  {
1127  const VECTOR2I& center = m_editPoints->Point( CIRC_CENTER ).GetPosition();
1128  const VECTOR2I& end = m_editPoints->Point( CIRC_END ).GetPosition();
1129 
1130  if( isModified( m_editPoints->Point( CIRC_CENTER ) ) )
1131  {
1132  wxPoint moveVector = wxPoint( center.x, center.y ) - shape->GetCenter();
1133  shape->Move( moveVector );
1134  }
1135  else
1136  {
1137  shape->SetEnd( wxPoint( end.x, end.y ) );
1138  }
1139  }
1140  break;
1141 
1142  case SHAPE_T::POLY:
1143  {
1144  SHAPE_POLY_SET& outline = shape->GetPolyShape();
1145 
1146  for( int i = 0; i < outline.TotalVertices(); ++i )
1147  outline.SetVertex( i, m_editPoints->Point( i ).GetPosition() );
1148 
1149  for( unsigned i = 0; i < m_editPoints->LinesSize(); ++i )
1150  {
1151  if( !isModified( m_editPoints->Line( i ) ) )
1152  m_editPoints->Line( i ).SetConstraint(
1153  new EC_PERPLINE( m_editPoints->Line( i ) ) );
1154  }
1155 
1156  validatePolygon( outline );
1157  }
1158  break;
1159 
1160  case SHAPE_T::BEZIER:
1161  if( isModified( m_editPoints->Point( BEZIER_CURVE_START ) ) )
1162  shape->SetStart( (wxPoint) m_editPoints->Point( BEZIER_CURVE_START ).
1163  GetPosition() );
1164  else if( isModified( m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ) ) )
1165  shape->SetBezierC1( (wxPoint) m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ).
1166  GetPosition() );
1167  else if( isModified( m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ) ) )
1168  shape->SetBezierC2( (wxPoint) m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ).
1169  GetPosition() );
1170  else if( isModified( m_editPoints->Point( BEZIER_CURVE_END ) ) )
1171  shape->SetEnd( (wxPoint) m_editPoints->Point( BEZIER_CURVE_END ).GetPosition() );
1172 
1173  shape->RebuildBezierToSegmentsPointsList( shape->GetWidth() );
1174  break;
1175 
1176  default: // suppress warnings
1177  break;
1178  }
1179 
1180  // Update relative coordinates for footprint shapes
1181  if( FP_SHAPE* fpShape = dyn_cast<FP_SHAPE*>( item ) )
1182  fpShape->SetLocalCoord();
1183 
1184  break;
1185  }
1186 
1187  case PCB_PAD_T:
1188  {
1189  PAD* pad = static_cast<PAD*>( item );
1190 
1191  switch( pad->GetShape() )
1192  {
1193  case PAD_SHAPE::CIRCLE:
1194  {
1195  wxPoint end = (wxPoint) m_editPoints->Point( 0 ).GetPosition();
1196  int diameter = (int) EuclideanNorm( end - pad->GetPosition() ) * 2;
1197 
1198  pad->SetSize( wxSize( diameter, diameter ) );
1199  }
1200  break;
1201 
1202  case PAD_SHAPE::OVAL:
1203  case PAD_SHAPE::TRAPEZOID:
1204  case PAD_SHAPE::RECT:
1205  case PAD_SHAPE::ROUNDRECT:
1207  {
1208  VECTOR2I topLeft = m_editPoints->Point( RECT_TOP_LEFT ).GetPosition();
1209  VECTOR2I topRight = m_editPoints->Point( RECT_TOP_RIGHT ).GetPosition();
1210  VECTOR2I botLeft = m_editPoints->Point( RECT_BOT_LEFT ).GetPosition();
1211  VECTOR2I botRight = m_editPoints->Point( RECT_BOT_RIGHT ).GetPosition();
1212  VECTOR2I holeCenter = pad->GetPosition();
1213  VECTOR2I holeSize = pad->GetDrillSize();
1214 
1215  pinEditedCorner( getEditedPointIndex(), Mils2iu( 1 ), Mils2iu( 1 ), topLeft, topRight,
1216  botLeft, botRight, holeCenter, holeSize );
1217 
1218  if( ( pad->GetOffset().x || pad->GetOffset().y )
1219  || ( pad->GetDrillSize().x && pad->GetDrillSize().y ) )
1220  {
1221  // Keep hole pinned at the current location; adjust the pad around the hole
1222 
1223  wxPoint center = pad->GetPosition();
1224  int dist[4];
1225 
1226  if( isModified( m_editPoints->Point( RECT_TOP_LEFT ) )
1227  || isModified( m_editPoints->Point( RECT_BOT_RIGHT ) ) )
1228  {
1229  dist[0] = center.x - topLeft.x;
1230  dist[1] = center.y - topLeft.y;
1231  dist[2] = botRight.x - center.x;
1232  dist[3] = botRight.y - center.y;
1233  }
1234  else
1235  {
1236  dist[0] = center.x - botLeft.x;
1237  dist[1] = center.y - topRight.y;
1238  dist[2] = topRight.x - center.x;
1239  dist[3] = botLeft.y - center.y;
1240  }
1241 
1242  wxSize padSize( dist[0] + dist[2], dist[1] + dist[3] );
1243  wxPoint deltaOffset( padSize.x / 2 - dist[2], padSize.y / 2 - dist[3] );
1244 
1245  if( pad->GetOrientation() == 900 || pad->GetOrientation() == 2700 )
1246  std::swap( padSize.x, padSize.y );
1247 
1248  RotatePoint( &deltaOffset, -pad->GetOrientation() );
1249 
1250  pad->SetSize( padSize );
1251  pad->SetOffset( -deltaOffset );
1252  }
1253  else
1254  {
1255  // Keep pad position at the center of the pad shape
1256 
1257  int left, top, right, bottom;
1258 
1259  if( isModified( m_editPoints->Point( RECT_TOP_LEFT ) )
1260  || isModified( m_editPoints->Point( RECT_BOT_RIGHT ) ) )
1261  {
1262  left = topLeft.x;
1263  top = topLeft.y;
1264  right = botRight.x;
1265  bottom = botRight.y;
1266  }
1267  else
1268  {
1269  left = botLeft.x;
1270  top = topRight.y;
1271  right = topRight.x;
1272  bottom = botLeft.y;
1273  }
1274 
1275  wxSize padSize( abs( right - left ), abs( bottom - top ) );
1276 
1277  if( pad->GetOrientation() == 900 || pad->GetOrientation() == 2700 )
1278  std::swap( padSize.x, padSize.y );
1279 
1280  pad->SetSize( padSize );
1281  pad->SetPosition( wxPoint( ( left + right ) / 2, ( top + bottom ) / 2 ) );
1282  pad->SetLocalCoord();
1283  }
1284  }
1285  break;
1286 
1287  default: // suppress warnings
1288  break;
1289  }
1290 
1291  break;
1292  }
1293 
1294  case PCB_FP_ZONE_T:
1295  case PCB_ZONE_T:
1296  {
1297  ZONE* zone = static_cast<ZONE*>( item );
1298  zone->UnFill();
1299  SHAPE_POLY_SET& outline = *zone->Outline();
1300 
1301  for( int i = 0; i < outline.TotalVertices(); ++i )
1302  {
1303  if( outline.CVertex( i ) != m_editPoints->Point( i ).GetPosition() )
1304  zone->SetNeedRefill( true );
1305 
1306  outline.SetVertex( i, m_editPoints->Point( i ).GetPosition() );
1307  }
1308 
1309  for( unsigned i = 0; i < m_editPoints->LinesSize(); ++i )
1310  {
1311  if( !isModified( m_editPoints->Line( i ) ) )
1312  m_editPoints->Line( i ).SetConstraint( new EC_PERPLINE( m_editPoints->Line( i ) ) );
1313  }
1314 
1315  validatePolygon( outline );
1316  zone->HatchBorder();
1317 
1318  // TODO Refill zone when KiCad supports auto re-fill
1319  break;
1320  }
1321 
1322  case PCB_DIM_ALIGNED_T:
1323  {
1324  PCB_DIM_ALIGNED* dimension = static_cast<PCB_DIM_ALIGNED*>( item );
1325 
1326  // Check which point is currently modified and updated dimension's points respectively
1327  if( isModified( m_editPoints->Point( DIM_CROSSBARSTART ) ) )
1328  {
1329  VECTOR2D featureLine( m_editedPoint->GetPosition() - dimension->GetStart() );
1330  VECTOR2D crossBar( dimension->GetEnd() - dimension->GetStart() );
1331 
1332  if( featureLine.Cross( crossBar ) > 0 )
1333  dimension->SetHeight( -featureLine.EuclideanNorm() );
1334  else
1335  dimension->SetHeight( featureLine.EuclideanNorm() );
1336 
1337  dimension->Update();
1338  }
1339  else if( isModified( m_editPoints->Point( DIM_CROSSBAREND ) ) )
1340  {
1341  VECTOR2D featureLine( m_editedPoint->GetPosition() - dimension->GetEnd() );
1342  VECTOR2D crossBar( dimension->GetEnd() - dimension->GetStart() );
1343 
1344  if( featureLine.Cross( crossBar ) > 0 )
1345  dimension->SetHeight( -featureLine.EuclideanNorm() );
1346  else
1347  dimension->SetHeight( featureLine.EuclideanNorm() );
1348 
1349  dimension->Update();
1350  }
1351  else if( isModified( m_editPoints->Point( DIM_START ) ) )
1352  {
1353  dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
1354  dimension->Update();
1355 
1356  m_editPoints->Point( DIM_CROSSBARSTART ).
1357  SetConstraint( new EC_LINE( m_editPoints->Point( DIM_CROSSBARSTART ),
1358  m_editPoints->Point( DIM_START ) ) );
1359  m_editPoints->Point( DIM_CROSSBAREND ).
1360  SetConstraint( new EC_LINE( m_editPoints->Point( DIM_CROSSBAREND ),
1361  m_editPoints->Point( DIM_END ) ) );
1362  }
1363  else if( isModified( m_editPoints->Point( DIM_END ) ) )
1364  {
1365  dimension->SetEnd( (wxPoint) m_editedPoint->GetPosition() );
1366  dimension->Update();
1367 
1368  m_editPoints->Point( DIM_CROSSBARSTART ).
1369  SetConstraint( new EC_LINE( m_editPoints->Point( DIM_CROSSBARSTART ),
1370  m_editPoints->Point( DIM_START ) ) );
1371  m_editPoints->Point( DIM_CROSSBAREND ).
1372  SetConstraint( new EC_LINE( m_editPoints->Point( DIM_CROSSBAREND ),
1373  m_editPoints->Point( DIM_END ) ) );
1374  }
1375  else if( isModified( m_editPoints->Point(DIM_TEXT ) ) )
1376  {
1377  // Force manual mode if we weren't already in it
1379  dimension->Text().SetPosition( wxPoint( m_editedPoint->GetPosition() ) );
1380  dimension->Update();
1381  }
1382 
1383  break;
1384  }
1385 
1386  case PCB_DIM_ORTHOGONAL_T:
1387  {
1388  PCB_DIM_ORTHOGONAL* dimension = static_cast<PCB_DIM_ORTHOGONAL*>( item );
1389 
1390  if( isModified( m_editPoints->Point( DIM_CROSSBARSTART ) ) ||
1391  isModified( m_editPoints->Point( DIM_CROSSBAREND ) ) )
1392  {
1393  BOX2I bounds( dimension->GetStart(), dimension->GetEnd() - dimension->GetStart() );
1394 
1395  const VECTOR2I& cursorPos = m_editedPoint->GetPosition();
1396 
1397  // Find vector from nearest dimension point to edit position
1398  VECTOR2I directionA( cursorPos - dimension->GetStart() );
1399  VECTOR2I directionB( cursorPos - dimension->GetEnd() );
1400  VECTOR2I direction = ( directionA < directionB ) ? directionA : directionB;
1401 
1402  bool vert;
1403  VECTOR2D featureLine( cursorPos - dimension->GetStart() );
1404 
1405  // Only change the orientation when we move outside the bounds
1406  if( !bounds.Contains( cursorPos ) )
1407  {
1408  // If the dimension is horizontal or vertical, set correct orientation
1409  // otherwise, test if we're left/right of the bounding box or above/below it
1410  if( bounds.GetWidth() == 0 )
1411  vert = true;
1412  else if( bounds.GetHeight() == 0 )
1413  vert = false;
1414  else if( cursorPos.x > bounds.GetLeft() && cursorPos.x < bounds.GetRight() )
1415  vert = false;
1416  else if( cursorPos.y > bounds.GetTop() && cursorPos.y < bounds.GetBottom() )
1417  vert = true;
1418  else
1419  vert = std::abs( direction.y ) < std::abs( direction.x );
1420 
1423  }
1424  else
1425  {
1426  vert = dimension->GetOrientation() == PCB_DIM_ORTHOGONAL::DIR::VERTICAL;
1427  }
1428 
1429  dimension->SetHeight( vert ? featureLine.x : featureLine.y );
1430  }
1431  else if( isModified( m_editPoints->Point( DIM_START ) ) )
1432  {
1433  dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
1434  }
1435  else if( isModified( m_editPoints->Point( DIM_END ) ) )
1436  {
1437  dimension->SetEnd( (wxPoint) m_editedPoint->GetPosition() );
1438  }
1439  else if( isModified( m_editPoints->Point(DIM_TEXT ) ) )
1440  {
1441  // Force manual mode if we weren't already in it
1443  dimension->Text().SetPosition( wxPoint( m_editedPoint->GetPosition() ) );
1444  }
1445 
1446  dimension->Update();
1447 
1448  break;
1449  }
1450 
1451  case PCB_DIM_CENTER_T:
1452  {
1453  PCB_DIM_CENTER* dimension = static_cast<PCB_DIM_CENTER*>( item );
1454 
1455  if( isModified( m_editPoints->Point( DIM_START ) ) )
1456  dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
1457  else if( isModified( m_editPoints->Point( DIM_END ) ) )
1458  dimension->SetEnd( (wxPoint) m_editedPoint->GetPosition() );
1459 
1460  dimension->Update();
1461 
1462  break;
1463  }
1464 
1465  case PCB_DIM_LEADER_T:
1466  {
1467  PCB_DIM_LEADER* dimension = static_cast<PCB_DIM_LEADER*>( item );
1468 
1469  if( isModified( m_editPoints->Point( DIM_START ) ) )
1470  {
1471  dimension->SetStart( (wxPoint) m_editedPoint->GetPosition() );
1472  }
1473  else if( isModified( m_editPoints->Point( DIM_END ) ) )
1474  {
1475  wxPoint newPoint( m_editedPoint->GetPosition() );
1476  wxPoint delta = newPoint - dimension->GetEnd();
1477 
1478  dimension->SetEnd( newPoint );
1479  dimension->Text().SetPosition( dimension->Text().GetPosition() + delta );
1480  }
1481  else if( isModified( m_editPoints->Point( DIM_TEXT ) ) )
1482  {
1483  dimension->Text().SetPosition( (wxPoint) m_editedPoint->GetPosition() );
1484  }
1485 
1486  dimension->Update();
1487 
1488  break;
1489  }
1490 
1491  default:
1492  break;
1493  }
1494 
1495  getView()->Update( item );
1496 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:146
int TotalVertices() const
Delete aIdx-th polygon from the set.
void editArcEndpointKeepTangent(PCB_SHAPE *aArc, const VECTOR2I &aCenter, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
Move an end point of the arc, while keeping the tangent at the other endpoint.
void editArcMidKeepEndpoints(PCB_SHAPE *aArc, const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
Move the mid point of the arc, while keeping the two endpoints.
int GetWidth() const
Definition: eda_shape.h:98
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:100
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:101
void SetHeight(int aHeight)
Set the distance from the feature points to the crossbar line.
void SetEnd(const wxPoint &aEnd)
Definition: eda_shape.h:135
virtual void SetPosition(const wxPoint &aPos) override
Definition: pcb_text.h:81
PCB_TEXT & Text()
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:102
void SetStartY(int y)
Definition: eda_shape.h:116
SHAPE_POLY_SET * Outline()
Definition: zone.h:320
EDIT_CONSTRAINT for a EDIT_LINE, that constrains the line to move perpendicular to the line itself.
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
class PAD, a pad in a footprint
Definition: typeinfo.h:89
void SetEndY(int y)
Definition: eda_shape.h:141
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:229
std::shared_ptr< EDIT_POINTS > m_editPoints
An orthogonal dimension is like an aligned dimension, but the extension lines are locked to the X or ...
EDIT_CONSTRAINT that imposes a constraint that a point has to lie on a line (determined by 2 points).
void SetBezierC1(const wxPoint &aPt)
Definition: eda_shape.h:153
EDIT_POINT * m_editedPoint
For better understanding of the points that make a dimension:
void SetStart(const wxPoint &aStart)
Definition: eda_shape.h:110
int getEditedPointIndex() const
Return true if aPoint is the currently modified point.
void SetVertex(const VERTEX_INDEX &aIndex, const VECTOR2I &aPos)
Accessor function to set the position of a specific point.
virtual void Move(const wxPoint &aMoveVector) override
Move this object.
Definition: pcb_shape.cpp:97
virtual const wxPoint & GetStart() const
The dimension's origin is the first feature point for the dimension.
void editArcEndpointKeepCenter(PCB_SHAPE *aArc, const VECTOR2I &aCenter, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
Move an end point of the arc around the circumference.
DIR GetOrientation() const
virtual VECTOR2I GetPosition() const
Return coordinates of an EDIT_POINT.
Definition: edit_points.h:70
virtual wxPoint GetPosition() const override
Definition: pcb_text.h:76
void HatchBorder()
Compute the hatch lines depending on the hatch parameters and stores it in the zone's attribute m_bor...
Definition: zone.cpp:906
Represent a set of closed polygons.
virtual void SetEnd(const wxPoint &aPoint)
wxPoint GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Definition: pcb_shape.h:79
static void pinEditedCorner(int aEditedPointIndex, int aMinWidth, int aMinHeight, VECTOR2I &aTopLeft, VECTOR2I &aTopRight, VECTOR2I &aBotLeft, VECTOR2I &aBotRight, VECTOR2I &aHole, VECTOR2I &aHoleSize)
Update the coordinates of 4 corners of a rectangle, according to pad constraints and the moved corner...
Mark the center of a circle or arc with a cross shape.
Handle a list of polygons defining a copper zone.
Definition: zone.h:56
class ZONE, a copper pour area
Definition: typeinfo.h:105
void SetOrientation(DIR aOrientation)
Set the orientation of the dimension line (so, perpendicular to the feature lines).
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:227
void SetEndX(int x)
Definition: eda_shape.h:147
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:366
void editArcMidKeepCenter(PCB_SHAPE *aArc, const VECTOR2I &aCenter, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCursor) const
Move the mid point of the arc, while keeping the angle.
class ZONE, managed by a footprint
Definition: typeinfo.h:94
virtual void SetStart(const wxPoint &aPoint)
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
void SetBezierC2(const wxPoint &aPt)
Definition: eda_shape.h:156
bool isModified(const EDIT_POINT &aPoint) const
Set up an alternative constraint (typically enabled upon a modifier key being pressed).
A leader is a dimension-like object pointing to a specific point.
constexpr int delta
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:103
virtual const wxPoint & GetEnd() const
void SetNeedRefill(bool aNeedRefill)
Definition: zone.h:238
SHAPE_T GetShape() const
Definition: eda_shape.h:101
KIGFX::VIEW_CONTROLS * getViewControls() const
Return the instance of VIEW_CONTROLS object used in the application.
Definition: tool_base.cpp:42
Definition: pad.h:57
Text placement is manually set by the user.
bool UnFill()
Removes the zone filling.
Definition: zone.cpp:192
bool validatePolygon(SHAPE_POLY_SET &aModified) const
Validate a polygon and displays a popup warning if invalid.
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
void SetTextPositionMode(DIM_TEXT_POSITION aMode)
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...
Definition: view.cpp:1570
void SetStartX(int x)
Definition: eda_shape.h:122
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112
void Update()
Update the dimension's cached text and geometry.

References ARC, ARC_CENTER, ARC_END, ARC_START, BEZIER, BEZIER_CURVE_CONTROL_POINT1, BEZIER_CURVE_CONTROL_POINT2, BEZIER_CURVE_END, BEZIER_CURVE_START, CHAMFERED_RECT, CIRC_CENTER, CIRC_END, CIRCLE, SHAPE_POLY_SET::CVertex(), delta, DIM_CROSSBAREND, DIM_CROSSBARSTART, DIM_END, DIM_START, DIM_TEXT, editArcEndpointKeepCenter(), editArcEndpointKeepTangent(), editArcMidKeepCenter(), editArcMidKeepEndpoints(), EuclideanNorm(), PCB_SHAPE::GetCenter(), KIGFX::VIEW_CONTROLS::GetCursorPosition(), getEditedPointIndex(), PCB_DIMENSION_BASE::GetEnd(), PCB_DIM_ORTHOGONAL::GetOrientation(), EDA_SHAPE::GetPolyShape(), EDIT_POINT::GetPosition(), PCB_TEXT::GetPosition(), EDA_SHAPE::GetShape(), PCB_DIMENSION_BASE::GetStart(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), EDA_SHAPE::GetWidth(), ZONE::HatchBorder(), PCB_DIM_ORTHOGONAL::HORIZONTAL, isModified(), left, m_altEditMethod, m_editedPoint, m_editPoints, MANUAL, PCB_SHAPE::Move(), ZONE::Outline(), OVAL, pad, PCB_DIM_ALIGNED_T, PCB_DIM_CENTER_T, PCB_DIM_LEADER_T, PCB_DIM_ORTHOGONAL_T, PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_PAD_T, PCB_SHAPE_T, PCB_ZONE_T, pinEditedCorner(), POLY, EDA_SHAPE::RebuildBezierToSegmentsPointsList(), RECT, RECT_BOT, RECT_BOT_LEFT, RECT_BOT_RIGHT, RECT_LEFT, RECT_RIGHT, RECT_TOP, RECT_TOP_LEFT, RECT_TOP_RIGHT, right, RotatePoint(), ROUNDRECT, SEG_END, SEG_START, SEGMENT, EDA_SHAPE::SetBezierC1(), EDA_SHAPE::SetBezierC2(), PCB_DIMENSION_BASE::SetEnd(), EDA_SHAPE::SetEnd(), EDA_SHAPE::SetEndX(), EDA_SHAPE::SetEndY(), PCB_DIM_ALIGNED::SetHeight(), ZONE::SetNeedRefill(), PCB_DIM_ORTHOGONAL::SetOrientation(), PCB_TEXT::SetPosition(), EDA_SHAPE::SetStart(), PCB_DIMENSION_BASE::SetStart(), EDA_SHAPE::SetStartX(), EDA_SHAPE::SetStartY(), PCB_DIMENSION_BASE::SetTextPositionMode(), SHAPE_POLY_SET::SetVertex(), PCB_DIMENSION_BASE::Text(), SHAPE_POLY_SET::TotalVertices(), TRAPEZOID, EDA_ITEM::Type(), ZONE::UnFill(), PCB_DIMENSION_BASE::Update(), KIGFX::VIEW::Update(), validatePolygon(), PCB_DIM_ORTHOGONAL::VERTICAL, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by OnSelectionChange().

◆ updatePoints()

void PCB_POINT_EDITOR::updatePoints ( )
private

Update which point is being edited.

Definition at line 1532 of file pcb_point_editor.cpp.

1533 {
1534  if( !m_editPoints )
1535  return;
1536 
1537  EDA_ITEM* item = m_editPoints->GetParent();
1538 
1539  if( !item )
1540  return;
1541 
1542  switch( item->Type() )
1543  {
1544  case PCB_SHAPE_T:
1545  case PCB_FP_SHAPE_T:
1546  {
1547  const PCB_SHAPE* shape = static_cast<const PCB_SHAPE*>( item );
1548 
1549  switch( shape->GetShape() )
1550  {
1551  case SHAPE_T::SEGMENT:
1552  m_editPoints->Point( SEG_START ).SetPosition( shape->GetStart() );
1553  m_editPoints->Point( SEG_END ).SetPosition( shape->GetEnd() );
1554  break;
1555 
1556  case SHAPE_T::RECT:
1557  m_editPoints->Point( RECT_TOP_LEFT ).SetPosition( shape->GetStart() );
1558  m_editPoints->Point( RECT_TOP_RIGHT ).SetPosition( shape->GetEnd().x,
1559  shape->GetStart().y );
1560  m_editPoints->Point( RECT_BOT_RIGHT ).SetPosition( shape->GetEnd() );
1561  m_editPoints->Point( RECT_BOT_LEFT ).SetPosition( shape->GetStart().x,
1562  shape->GetEnd().y );
1563  break;
1564 
1565  case SHAPE_T::ARC:
1566  m_editPoints->Point( ARC_CENTER ).SetPosition( shape->GetCenter() );
1567  m_editPoints->Point( ARC_START ).SetPosition( shape->GetStart() );
1568  m_editPoints->Point( ARC_MID ).SetPosition( shape->GetArcMid() );
1569  m_editPoints->Point( ARC_END ).SetPosition( shape->GetEnd() );
1570  break;
1571 
1572  case SHAPE_T::CIRCLE:
1573  m_editPoints->Point( CIRC_CENTER ).SetPosition( shape->GetCenter() );
1574  m_editPoints->Point( CIRC_END ).SetPosition( shape->GetEnd() );
1575  break;
1576 
1577  case SHAPE_T::POLY:
1578  {
1579  std::vector<wxPoint> points;
1580  shape->DupPolyPointsList( points );
1581 
1582  if( m_editPoints->PointsSize() != (unsigned) points.size() )
1583  {
1584  getView()->Remove( m_editPoints.get() );
1585  m_editedPoint = nullptr;
1586 
1587  m_editPoints = makePoints( item );
1588 
1589  if( m_editPoints )
1590  getView()->Add( m_editPoints.get() );
1591  }
1592  else
1593  {
1594  for( unsigned i = 0; i < points.size(); i++ )
1595  m_editPoints->Point( i ).SetPosition( points[i] );
1596  }
1597 
1598  break;
1599  }
1600 
1601  case SHAPE_T::BEZIER:
1602  m_editPoints->Point( BEZIER_CURVE_START ).SetPosition( shape->GetStart() );
1603  m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT1 ).SetPosition( shape->GetBezierC1() );
1604  m_editPoints->Point( BEZIER_CURVE_CONTROL_POINT2 ).SetPosition( shape->GetBezierC2() );
1605  m_editPoints->Point( BEZIER_CURVE_END ).SetPosition( shape->GetEnd() );
1606  break;
1607 
1608  default: // suppress warnings
1609  break;
1610  }
1611 
1612  break;
1613  }
1614 
1615  case PCB_PAD_T:
1616  {
1617  const PAD* pad = static_cast<const PAD*>( item );
1618  bool locked = pad->GetParent() && pad->IsLocked();
1619  wxPoint shapePos = pad->ShapePos();
1620  wxPoint halfSize( pad->GetSize().x / 2, pad->GetSize().y / 2 );
1621 
1622  switch( pad->GetShape() )
1623  {
1624  case PAD_SHAPE::CIRCLE:
1625  {
1626  int target = locked ? 0 : 1;
1627 
1628  // Careful; pad shape is mutable...
1629  if( int( m_editPoints->PointsSize() ) != target )
1630  {
1631  getView()->Remove( m_editPoints.get() );
1632  m_editedPoint = nullptr;
1633 
1634  m_editPoints = makePoints( item );
1635 
1636  if( m_editPoints )
1637  getView()->Add( m_editPoints.get() );
1638  }
1639  else if( target == 1 )
1640  {
1641  shapePos.x += halfSize.x;
1642  m_editPoints->Point( 0 ).SetPosition( shapePos );
1643  }
1644  }
1645  break;
1646 
1647  case PAD_SHAPE::OVAL:
1648  case PAD_SHAPE::TRAPEZOID:
1649  case PAD_SHAPE::RECT:
1650  case PAD_SHAPE::ROUNDRECT:
1652  {
1653  // Careful; pad shape and orientation are mutable...
1654  int target = locked || (int) pad->GetOrientation() % 900 > 0 ? 0 : 4;
1655 
1656  if( int( m_editPoints->PointsSize() ) != target )
1657  {
1658  getView()->Remove( m_editPoints.get() );
1659  m_editedPoint = nullptr;
1660 
1661  m_editPoints = makePoints( item );
1662 
1663  if( m_editPoints )
1664  getView()->Add( m_editPoints.get() );
1665  }
1666  else if( target == 4 )
1667  {
1668  if( pad->GetOrientation() == 900 || pad->GetOrientation() == 2700 )
1669  std::swap( halfSize.x, halfSize.y );
1670 
1671  m_editPoints->Point( RECT_TOP_LEFT ).SetPosition( shapePos - halfSize );
1672  m_editPoints->Point( RECT_TOP_RIGHT ).SetPosition( wxPoint( shapePos.x + halfSize.x,
1673  shapePos.y - halfSize.y ) );
1674  m_editPoints->Point( RECT_BOT_RIGHT ).SetPosition( shapePos + halfSize );
1675  m_editPoints->Point( RECT_BOT_LEFT ).SetPosition( wxPoint( shapePos.x - halfSize.x,
1676  shapePos.y + halfSize.y ) );
1677  }
1678 
1679  break;
1680  }
1681 
1682  default: // suppress warnings
1683  break;
1684  }
1685  }
1686  break;
1687 
1688  case PCB_FP_ZONE_T:
1689  case PCB_ZONE_T:
1690  {
1691  ZONE* zone = static_cast<ZONE*>( item );
1692  const SHAPE_POLY_SET* outline = zone->Outline();
1693 
1694  if( m_editPoints->PointsSize() != (unsigned) outline->TotalVertices() )
1695  {
1696  getView()->Remove( m_editPoints.get() );
1697  m_editedPoint = nullptr;
1698 
1699  m_editPoints = makePoints( item );
1700 
1701  if( m_editPoints )
1702  getView()->Add( m_editPoints.get() );
1703  }
1704  else
1705  {
1706  for( int i = 0; i < outline->TotalVertices(); ++i )
1707  m_editPoints->Point( i ).SetPosition( outline->CVertex( i ) );
1708  }
1709 
1710  break;
1711  }
1712 
1713  case PCB_DIM_ALIGNED_T:
1714  case PCB_DIM_ORTHOGONAL_T:
1715  {
1716  const PCB_DIM_ALIGNED* dimension = static_cast<const PCB_DIM_ALIGNED*>( item );
1717 
1718  m_editPoints->Point( DIM_START ).SetPosition( dimension->GetStart() );
1719  m_editPoints->Point( DIM_END ).SetPosition( dimension->GetEnd() );
1720  m_editPoints->Point( DIM_TEXT ).SetPosition( dimension->Text().GetPosition() );
1721  m_editPoints->Point( DIM_CROSSBARSTART ).SetPosition( dimension->GetCrossbarStart() );
1722  m_editPoints->Point( DIM_CROSSBAREND ).SetPosition( dimension->GetCrossbarEnd() );
1723  break;
1724  }
1725 
1726  case PCB_DIM_CENTER_T:
1727  {
1728  const PCB_DIM_CENTER* dimension = static_cast<const PCB_DIM_CENTER*>( item );
1729 
1730  m_editPoints->Point( DIM_START ).SetPosition( dimension->GetStart() );
1731  m_editPoints->Point( DIM_END ).SetPosition( dimension->GetEnd() );
1732  break;
1733  }
1734 
1735  case PCB_DIM_LEADER_T:
1736  {
1737  const PCB_DIM_LEADER* dimension = static_cast<const PCB_DIM_LEADER*>( item );
1738 
1739  m_editPoints->Point( DIM_START ).SetPosition( dimension->GetStart() );
1740  m_editPoints->Point( DIM_END ).SetPosition( dimension->GetEnd() );
1741  m_editPoints->Point( DIM_TEXT ).SetPosition( dimension->Text().GetPosition() );
1742  break;
1743  }
1744 
1745  default:
1746  break;
1747  }
1748 
1749  getView()->Update( m_editPoints.get() );
1750 }
int TotalVertices() const
Delete aIdx-th polygon from the set.
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:100
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:101
const wxPoint & GetCrossbarStart() const
const wxPoint & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:106
PCB_TEXT & Text()
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:102
SHAPE_POLY_SET * Outline()
Definition: zone.h:320
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
Definition: view.cpp:350
const wxPoint & GetCrossbarEnd() const
void DupPolyPointsList(std::vector< wxPoint > &aBuffer) const
Duplicate the list of corners in a std::vector<wxPoint>
Definition: eda_shape.cpp:1193
class FP_SHAPE, a footprint edge
Definition: typeinfo.h:93
class PAD, a pad in a footprint
Definition: typeinfo.h:89
std::shared_ptr< EDIT_POINTS > m_editPoints
EDIT_POINT * m_editedPoint
For better understanding of the points that make a dimension:
std::shared_ptr< EDIT_POINTS > makePoints(EDA_ITEM *aItem)
Update item's points with edit points.
const wxPoint & GetBezierC1() const
Definition: eda_shape.h:154
virtual const wxPoint & GetStart() const
The dimension's origin is the first feature point for the dimension.
const wxPoint & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:131
virtual wxPoint GetPosition() const override
Definition: pcb_text.h:76
Represent a set of closed polygons.
wxPoint GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Definition: pcb_shape.h:79
Mark the center of a circle or arc with a cross shape.
const wxPoint & GetBezierC2() const
Definition: eda_shape.h:157
Handle a list of polygons defining a copper zone.
Definition: zone.h:56
class ZONE, a copper pour area
Definition: typeinfo.h:105
KIGFX::VIEW * getView() const
Returns the instance of #VIEW object used in the application.
Definition: tool_base.cpp:36
class ZONE, managed by a footprint
Definition: typeinfo.h:94
wxPoint GetArcMid() const
Definition: eda_shape.cpp:437
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:99
A leader is a dimension-like object pointing to a specific point.
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:103
virtual const wxPoint & GetEnd() const
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
Definition: view.cpp:320
SHAPE_T GetShape() const
Definition: eda_shape.h:101
Definition: pad.h:57
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:90
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...
Definition: view.cpp:1570
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:112

References KIGFX::VIEW::Add(), ARC, ARC_CENTER, ARC_END, ARC_START, BEZIER, BEZIER_CURVE_CONTROL_POINT1, BEZIER_CURVE_CONTROL_POINT2, BEZIER_CURVE_END, BEZIER_CURVE_START, CHAMFERED_RECT, CIRC_CENTER, CIRC_END, CIRCLE, SHAPE_POLY_SET::CVertex(), DIM_CROSSBAREND, DIM_CROSSBARSTART, DIM_END, DIM_START, DIM_TEXT, EDA_SHAPE::DupPolyPointsList(), EDA_SHAPE::GetArcMid(), EDA_SHAPE::GetBezierC1(), EDA_SHAPE::GetBezierC2(), PCB_SHAPE::GetCenter(), PCB_DIM_ALIGNED::GetCrossbarEnd(), PCB_DIM_ALIGNED::GetCrossbarStart(), PCB_DIMENSION_BASE::GetEnd(), EDA_SHAPE::GetEnd(), PCB_TEXT::GetPosition(), EDA_SHAPE::GetShape(), EDA_SHAPE::GetStart(), PCB_DIMENSION_BASE::GetStart(), TOOL_BASE::getView(), locked, m_editedPoint, m_editPoints, makePoints(), ZONE::Outline(), OVAL, pad, PCB_DIM_ALIGNED_T, PCB_DIM_CENTER_T, PCB_DIM_LEADER_T, PCB_DIM_ORTHOGONAL_T, PCB_FP_SHAPE_T, PCB_FP_ZONE_T, PCB_PAD_T, PCB_SHAPE_T, PCB_ZONE_T, POLY, RECT, RECT_BOT_LEFT, RECT_BOT_RIGHT, RECT_TOP_LEFT, RECT_TOP_RIGHT, KIGFX::VIEW::Remove(), ROUNDRECT, SEG_END, SEG_START, SEGMENT, PCB_DIMENSION_BASE::Text(), SHAPE_POLY_SET::TotalVertices(), TRAPEZOID, EDA_ITEM::Type(), and KIGFX::VIEW::Update().

Referenced by addCorner(), modifiedSelection(), OnSelectionChange(), and removeCorner().

◆ validatePolygon()

bool PCB_POINT_EDITOR::validatePolygon ( SHAPE_POLY_SET aModified) const
private

Validate a polygon and displays a popup warning if invalid.

Parameters
aModifiedis the polygon to be checked.
Returns
True if polygon is valid.Update edit points with item's points.

Definition at line 1510 of file pcb_point_editor.cpp.

1511 {
1512  bool valid = !aPoly.IsSelfIntersecting();
1513 
1514  if( m_statusPopup )
1515  {
1516  if( valid )
1517  {
1518  m_statusPopup->Hide();
1519  }
1520  else
1521  {
1522  wxPoint p = wxGetMousePosition() + wxPoint( 20, 20 );
1523  m_statusPopup->Move( p );
1524  m_statusPopup->PopupFor( 1500 );
1525  }
1526  }
1527 
1528  return valid;
1529 }
std::unique_ptr< STATUS_TEXT_POPUP > m_statusPopup

References SHAPE_POLY_SET::IsSelfIntersecting(), and m_statusPopup.

Referenced by removeCorner(), and updateItem().

◆ view()

◆ Wait()

TOOL_EVENT * TOOL_INTERACTIVE::Wait ( const TOOL_EVENT_LIST aEventList = TOOL_EVENTTC_ANYTA_ANY ))
inherited

Suspend execution of the tool until an event specified in aEventList arrives.

No parameters means waiting for any event.

Definition at line 57 of file tool_interactive.cpp.

58 {
59  return m_toolMgr->ScheduleWait( this, aEventList );
60 }
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:214
TOOL_EVENT * ScheduleWait(TOOL_BASE *aTool, const TOOL_EVENT_LIST &aConditions)
Pause execution of a given tool until one or more events matching aConditions arrives.

References TOOL_BASE::m_toolMgr, and TOOL_MANAGER::ScheduleWait().

Referenced by GERBVIEW_SELECTION_TOOL::disambiguationMenu(), SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::doMoveSelection(), PL_SELECTION_TOOL::doSelectionMenu(), EE_SELECTION_TOOL::doSelectionMenu(), PCB_SELECTION_TOOL::doSelectionMenu(), EDIT_TOOL::DragArcTrack(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), PL_DRAWING_TOOLS::DrawShape(), SCH_DRAWING_TOOLS::DrawSheet(), DRAWING_TOOL::DrawZone(), PAD_TOOL::EnumeratePads(), ROUTER_TOOL::InlineDrag(), DRAWING_TOOL::InteractivePlaceWithPreview(), ZOOM_TOOL::Main(), PCB_PICKER_TOOL::Main(), EE_POINT_EDITOR::Main(), PL_EDIT_TOOL::Main(), CVPCB_FOOTPRINT_VIEWER_SELECTION_TOOL::Main(), CVPCB_CONTROL::Main(), PL_POINT_EDITOR::Main(), SYMBOL_EDITOR_MOVE_TOOL::Main(), PL_SELECTION_TOOL::Main(), EDA_3D_CONTROLLER::Main(), SCH_MOVE_TOOL::Main(), GERBVIEW_SELECTION_TOOL::Main(), EE_SELECTION_TOOL::Main(), PCB_SELECTION_TOOL::Main(), PICKER_TOOL::Main(), ROUTER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::MainLoop(), GERBVIEW_INSPECTION_TOOL::MeasureTool(), PCB_VIEWER_TOOLS::MeasureTool(), OnSelectionChange(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), GROUP_TOOL::PickNewMember(), EDIT_TOOL::pickReferencePoint(), SYMBOL_EDITOR_DRAWING_TOOLS::PlaceAnchor(), BOARD_EDITOR_CONTROL::PlaceFootprint(), SCH_DRAWING_TOOLS::PlaceImage(), DRAWING_TOOL::PlaceImportedGraphics(), PL_DRAWING_TOOLS::PlaceItem(), SCH_DRAWING_TOOLS::PlaceSymbol(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), PL_SELECTION_TOOL::selectMultiple(), EE_SELECTION_TOOL::selectMultiple(), PCB_SELECTION_TOOL::selectMultiple(), GERBVIEW_SELECTION_TOOL::selectPoint(), PCB_SELECTION_TOOL::selectPoint(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), ZOOM_TOOL::selectRegion(), DRAWING_TOOL::SetAnchor(), SCH_DRAWING_TOOLS::SingleClickPlace(), SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace(), SCH_DRAWING_TOOLS::TwoClickPlace(), and SCH_LINE_WIRE_BUS_TOOL::UnfoldBus().

Member Data Documentation

◆ m_altConstrainer

EDIT_POINT PCB_POINT_EDITOR::m_altConstrainer
private

Definition at line 178 of file pcb_point_editor.h.

Referenced by setAltConstraint().

◆ m_altConstraint

std::shared_ptr<EDIT_CONSTRAINT<EDIT_POINT> > PCB_POINT_EDITOR::m_altConstraint
private

Definition at line 177 of file pcb_point_editor.h.

Referenced by OnSelectionChange(), Reset(), and setAltConstraint().

◆ m_altEditMethod

bool PCB_POINT_EDITOR::m_altEditMethod
private

Definition at line 174 of file pcb_point_editor.h.

Referenced by changeEditMethod(), and updateItem().

◆ m_editedPoint

◆ m_editPoints

◆ m_hoveredPoint

EDIT_POINT* PCB_POINT_EDITOR::m_hoveredPoint
private

Definition at line 169 of file pcb_point_editor.h.

Referenced by OnSelectionChange(), and updateEditedPoint().

◆ m_isFootprintEditor

◆ m_menu

TOOL_MENU TOOL_INTERACTIVE::m_menu
protectedinherited

The functions below are not yet implemented - their interface may change.

Definition at line 125 of file tool_interactive.h.

Referenced by SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), PCB_TOOL_BASE::doInteractiveItemPlacement(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawDimension(), MICROWAVE_TOOL::drawMicrowaveInductor(), DRAWING_TOOL::drawSegment(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), PL_DRAWING_TOOLS::DrawShape(), SCH_DRAWING_TOOLS::DrawSheet(), DRAWING_TOOL::DrawZone(), PAD_TOOL::EnumeratePads(), TOOL_INTERACTIVE::GetToolMenu(), ROUTER_TOOL::Init(), LENGTH_TUNER_TOOL::Init(), CVPCB_FOOTPRINT_VIEWER_SELECTION_TOOL::Init(), PL_EDIT_TOOL::Init(), SCH_EDIT_TOOL::Init(), PAD_TOOL::Init(), PL_DRAWING_TOOLS::Init(), SYMBOL_EDITOR_DRAWING_TOOLS::Init(), SYMBOL_EDITOR_CONTROL::Init(), PCB_VIEWER_TOOLS::Init(), FOOTPRINT_EDITOR_CONTROL::Init(), PL_SELECTION_TOOL::Init(), SCH_DRAWING_TOOLS::Init(), BOARD_EDITOR_CONTROL::Init(), GERBVIEW_SELECTION_TOOL::Init(), EDA_3D_CONTROLLER::Init(), DRAWING_TOOL::Init(), EE_SELECTION_TOOL::Init(), EE_TOOL_BASE< SCH_BASE_FRAME >::Init(), PCB_SELECTION_TOOL::Init(), SCH_LINE_WIRE_BUS_TOOL::Init(), PCB_TOOL_BASE::Init(), PICKER_TOOL::Init(), DRAWING_TOOL::InteractivePlaceWithPreview(), PCB_PICKER_TOOL::Main(), CVPCB_FOOTPRINT_VIEWER_SELECTION_TOOL::Main(), PL_EDIT_TOOL::Main(), SYMBOL_EDITOR_MOVE_TOOL::Main(), EDA_3D_CONTROLLER::Main(), PL_SELECTION_TOOL::Main(), SCH_MOVE_TOOL::Main(), GERBVIEW_SELECTION_TOOL::Main(), EE_SELECTION_TOOL::Main(), PCB_SELECTION_TOOL::Main(), PICKER_TOOL::Main(), ROUTER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::MainLoop(), GERBVIEW_INSPECTION_TOOL::MeasureTool(), PCB_VIEWER_TOOLS::MeasureTool(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), SYMBOL_EDITOR_DRAWING_TOOLS::PlaceAnchor(), BOARD_EDITOR_CONTROL::PlaceFootprint(), SCH_DRAWING_TOOLS::PlaceImage(), DRAWING_TOOL::PlaceImportedGraphics(), PL_DRAWING_TOOLS::PlaceItem(), SCH_DRAWING_TOOLS::PlaceSymbol(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), DRAWING_TOOL::SetAnchor(), SCH_DRAWING_TOOLS::SingleClickPlace(), SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace(), and SCH_DRAWING_TOOLS::TwoClickPlace().

◆ m_original

EDIT_POINT PCB_POINT_EDITOR::m_original
private

Original position for the current drag point.

Definition at line 171 of file pcb_point_editor.h.

Referenced by get45DegConstrainer(), and OnSelectionChange().

◆ m_refill

bool PCB_POINT_EDITOR::m_refill
private

Definition at line 173 of file pcb_point_editor.h.

Referenced by OnSelectionChange(), and Reset().

◆ m_selectionTool

PCB_SELECTION_TOOL* PCB_POINT_EDITOR::m_selectionTool
private

Definition at line 164 of file pcb_point_editor.h.

Referenced by Init(), and OnSelectionChange().

◆ m_statusPopup

std::unique_ptr<STATUS_TEXT_POPUP> PCB_POINT_EDITOR::m_statusPopup
private

Definition at line 165 of file pcb_point_editor.h.

Referenced by Reset(), and validatePolygon().

◆ m_toolId

TOOL_ID TOOL_BASE::m_toolId
protectedinherited

Name of the tool.

Names are expected to obey the format application.ToolName (eg. pcbnew.InteractiveSelection).

Definition at line 209 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), TOOL_BASE::GetId(), and TOOL_BASE::IsToolActive().

◆ m_toolMgr

TOOL_MANAGER* TOOL_BASE::m_toolMgr
protectedinherited

Definition at line 214 of file tool_base.h.

Referenced by TOOL_INTERACTIVE::Activate(), PL_SELECTION_TOOL::AddItemsToSel(), EE_SELECTION_TOOL::AddItemsToSel(), PL_SELECTION_TOOL::AddItemToSel(), PCB_SELECTION_TOOL::AddItemToSel(), EE_SELECTION_TOOL::AddItemToSel(), SCH_MOVE_TOOL::AlignElements(), SCH_EDITOR_CONTROL::AssignNetclass(), CVPCB_ASSOCIATION_TOOL::Associate(), TOOL_BASE::attachManager(), SCH_EDIT_TOOL::AutoplaceFields(), SCH_EDIT_TOOL::BreakWire(), BOARD_INSPECTION_TOOL::calculateSelectionRatsnest(), ROUTER_TOOL::CanInlineDrag(), SCH_EDIT_TOOL::ChangeTextType(), EDIT_TOOL::ChangeTrackWidth(), SCH_EDIT_TOOL::CleanupSheetPins(), GERBVIEW_CONTROL::ClearAllLayers(), BOARD_INSPECTION_TOOL::ClearHighlight(), SCH_EDITOR_CONTROL::ClearHighlight(), PL_SELECTION_TOOL::ClearSelection(), PCB_SELECTION_TOOL::ClearSelection(), GERBVIEW_SELECTION_TOOL::clearSelection(), EE_SELECTION_TOOL::ClearSelection(), SCH_EDIT_TOOL::ConvertDeMorgan(), PL_EDIT_TOOL::Copy(), SYMBOL_EDITOR_EDIT_TOOL::Copy(), PAD_TOOL::copyPadSettings(), EDIT_TOOL::copyToClipboard(), EDIT_TOOL::CreateArray(), MICROWAVE_TOOL::createInductorBetween(), DRC_TOOL::CrossProbe(), BOARD_INSPECTION_TOOL::CrossProbePcbToSch(), COMMON_TOOLS::CursorControl(), SCH_EDITOR_CONTROL::Cut(), SYMBOL_EDITOR_EDIT_TOOL::DeleteItemCursor(), PL_EDIT_TOOL::DeleteItemCursor(), SCH_EDIT_TOOL::DeleteItemCursor(), PCB_CONTROL::DeleteItemCursor(), SCH_EDITOR_CONTROL::doCopy(), SCH_EDITOR_CONTROL::doCrossProbeSchToPcb(), SYMBOL_EDITOR_EDIT_TOOL::DoDelete(), SCH_EDIT_TOOL::DoDelete(), SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), BOARD_INSPECTION_TOOL::doHideNet(), PCB_TOOL_BASE::doInteractiveItemPlacement(), EDIT_TOOL::doMoveSelection(), SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus(), COMMON_TOOLS::doZoomInOut(), COMMON_TOOLS::doZoomToPreset(), EDIT_TOOL::Drag(), DRAWING_TOOL::DrawArc(), DRAWING_TOOL::drawArc(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawDimension(), DRAWING_TOOL::DrawRectangle(), DRAWING_TOOL::drawSegment(), SCH_LINE_WIRE_BUS_TOOL::DrawSegments(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), PL_DRAWING_TOOLS::DrawShape(), SCH_DRAWING_TOOLS::DrawSheet(), DRAWING_TOOL::DrawZone(), BOARD_EDITOR_CONTROL::DrillOrigin(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), EDIT_TOOL::Duplicate(), SCH_EDIT_TOOL::EditField(), SCH_EDIT_TOOL::editFieldText(), BOARD_EDITOR_CONTROL::EditFpInFpEditor(), PAD_TOOL::EditPad(), SYMBOL_EDITOR_EDIT_TOOL::editShapeProperties(), SYMBOL_EDITOR_EDIT_TOOL::editSymbolProperties(), SCH_EDITOR_CONTROL::EditWithSymbolEditor(), GROUP_TOOL::EnterGroup(), SCH_NAVIGATE_TOOL::EnterSheet(), SCH_EDITOR_CONTROL::EnterSheet(), PAD_TOOL::EnumeratePads(), EE_INSPECTION_TOOL::ExcludeMarker(), PCB_SELECTION_TOOL::expandConnection(), PAD_TOOL::explodePad(), PCB_SELECTION_TOOL::filterSelection(), PCB_SELECTION_TOOL::FindItem(), SCH_EDITOR_CONTROL::FindSymbolAndItem(), SCH_LINE_WIRE_BUS_TOOL::finishSegments(), EDIT_TOOL::Flip(), EDIT_TOOL::GetAndPlace(), TOOL_BASE::GetManager(), TOOL_BASE::getModelInt(), DRAWING_TOOL::getSourceZoneForAction(), TOOL_BASE::getToolHolderInt(), TOOL_BASE::getView(), TOOL_BASE::getViewControls(), TOOL_INTERACTIVE::goInternal(), COMMON_TOOLS::GridNext(), COMMON_TOOLS::GridPreset(), COMMON_TOOLS::GridPrev(), PCB_CONTROL::GridSetOrigin(), GROUP_TOOL::Group(), GERBVIEW_CONTROL::HighlightControl(), BOARD_INSPECTION_TOOL::HighlightItem(), BOARD_INSPECTION_TOOL::HighlightNet(), SCH_EDITOR_CONTROL::HighlightNet(), BOARD_INSPECTION_TOOL::highlightNet(), SCH_EDITOR_CONTROL::HighlightNetCursor(), PL_EDIT_TOOL::ImportDrawingSheetContent(), FOOTPRINT_EDITOR_CONTROL::ImportFootprint(), BOARD_REANNOTATE_TOOL::Init(), SYMBOL_EDITOR_EDIT_TOOL::Init(), PL_EDIT_TOOL::Init(), SCH_EDIT_TOOL::Init(), GROUP_TOOL::Init(), PAD_TOOL::Init(), CONVERT_TOOL::Init(), PL_DRAWING_TOOLS::Init(), GLOBAL_EDIT_TOOL::Init(), SYMBOL_EDITOR_CONTROL::Init(), PL_POINT_EDITOR::Init(), BOARD_INSPECTION_TOOL::Init(), ALIGN_DISTRIBUTE_TOOL::Init(), Init(), BOARD_EDITOR_CONTROL::Init(), POSITION_RELATIVE_TOOL::Init(), EE_TOOL_BASE< SCH_BASE_FRAME >::Init(), EDIT_TOOL::Init(), ROUTER_TOOL::InlineBreakTrack(), ROUTER_TOOL::InlineDrag(), BOARD_INSPECTION_TOOL::InspectClearance(), BOARD_INSPECTION_TOOL::InspectConstraints(), DRAWING_TOOL::InteractivePlaceWithPreview(), EDIT_TOOL::invokeInlineRouter(), EDIT_TOOL::isRouterActive(), TOOL_BASE::IsToolActive(), GROUP_TOOL::LeaveGroup(), SCH_NAVIGATE_TOOL::LeaveSheet(), SCH_EDITOR_CONTROL::LeaveSheet(), COMMON_CONTROL::ListHotKeys(), BOARD_INSPECTION_TOOL::LocalRatsnestTool(), PCB_PICKER_TOOL::Main(), PL_EDIT_TOOL::Main(), CVPCB_FOOTPRINT_VIEWER_SELECTION_TOOL::Main(), SYMBOL_EDITOR_MOVE_TOOL::Main(), CVPCB_CONTROL::Main(), PL_SELECTION_TOOL::Main(), EDA_3D_CONTROLLER::Main(), SCH_MOVE_TOOL::Main(), GERBVIEW_SELECTION_TOOL::Main(), EE_SELECTION_TOOL::Main(), PCB_SELECTION_TOOL::Main(), ROUTER_TOOL::MainLoop(), LENGTH_TUNER_TOOL::MainLoop(), PCB_VIEWER_TOOLS::MeasureTool(), SYMBOL_EDITOR_EDIT_TOOL::Mirror(), SCH_EDIT_TOOL::Mirror(), EDIT_TOOL::Mirror(), BOARD_EDITOR_CONTROL::modifyLockSelected(), EDIT_TOOL::MoveExact(), SYMBOL_EDITOR_CONTROL::OnDeMorgan(), PL_SELECTION_TOOL::onDisambiguationExpire(), EE_SELECTION_TOOL::onDisambiguationExpire(), PCB_SELECTION_TOOL::onDisambiguationExpire(), COMMON_TOOLS::OnGridChanged(), OnSelectionChange(), SYMBOL_EDITOR_EDIT_TOOL::Paste(), PL_EDIT_TOOL::Paste(), SCH_EDITOR_CONTROL::Paste(), PAD_TOOL::pastePadProperties(), ROUTER_TOOL::performDragging(), ROUTER_TOOL::performRouting(), GROUP_TOOL::PickNewMember(), EDIT_TOOL::pickReferencePoint(), SYMBOL_EDITOR_EDIT_TOOL::PinTable(), PCB_CONTROL::placeBoardItems(), BOARD_EDITOR_CONTROL::PlaceFootprint(), SCH_DRAWING_TOOLS::PlaceImage(), DRAWING_TOOL::PlaceImportedGraphics(), PL_DRAWING_TOOLS::PlaceItem(), SCH_DRAWING_TOOLS::PlaceSymbol(), BOARD_EDITOR_CONTROL::PlaceTarget(), DRAWING_TOOL::PlaceText(), PCB_CONTROL::Print(), GERBVIEW_CONTROL::Print(), SYMBOL_EDITOR_EDIT_TOOL::Properties(), SCH_EDIT_TOOL::Properties(), EDIT_TOOL::Properties(), PAD_TOOL::pushPadSettings(), EE_SELECTION_TOOL::RebuildSelection(), SYMBOL_EDITOR_EDIT_TOOL::Redo(), SCH_EDITOR_CONTROL::Redo(), POSITION_RELATIVE_TOOL::RelativeItemSelectionMove(), EDIT_TOOL::Remove(), removeCorner(), GROUP_TOOL::RemoveFromGroup(), PL_SELECTION_TOOL::RemoveItemFromSel(), EE_SELECTION_TOOL::RemoveItemFromSel(), PCB_SELECTION_TOOL::RemoveItemFromSel(), PL_SELECTION_TOOL::RemoveItemsFromSel(), EE_SELECTION_TOOL::RemoveItemsFromSel(), SCH_EDIT_TOOL::RepeatDrawItem(), SYMBOL_EDITOR_DRAWING_TOOLS::RepeatDrawItem(), EE_SELECTION_TOOL::RequestSelection(), PCB_SELECTION_TOOL::RequestSelection(), PAD_TOOL::Reset(), COMMON_TOOLS::Reset(), PNS::TOOL_BASE::Reset(), EDA_3D_CONTROLLER::Reset(), COMMON_TOOLS::ResetLocalCoords(), TOOL_INTERACTIVE::resetTransitions(), SYMBOL_EDITOR_EDIT_TOOL::Rotate(), SCH_EDIT_TOOL::Rotate(), EDIT_TOOL::Rotate(), TOOL_INTERACTIVE::RunMainStack(), DRC_TOOL::RunTests(), EE_SELECTION_TOOL::Selectable(), EE_SELECTION_TOOL::SelectConnection(), PCB_TOOL_BASE::selection(), COMMON_TOOLS::SelectionTool(), GERBVIEW_SELECTION_TOOL::SelectItem(), GERBVIEW_SELECTION_TOOL::SelectItems(), PCB_SELECTION_TOOL::SelectItems(), PL_SELECTION_TOOL::selectMultiple(), EE_SELECTION_TOOL::selectMultiple(), PCB_SELECTION_TOOL::selectMultiple(), PCB_SELECTION_TOOL::selectNet(), PL_SELECTION_TOOL::SelectPoint(), GERBVIEW_SELECTION_TOOL::selectPoint(), EE_SELECTION_TOOL::selectPoint(), PCB_SELECTION_TOOL::selectPoint(), POSITION_RELATIVE_TOOL::SelectPositionRelativeItem(), PCB_SELECTION_TOOL::selectSameSheet(), PCB_SELECTION_TOOL::selectSheetContents(), DRAWING_TOOL::SetAnchor(), TOOL_INTERACTIVE::SetContextMenu(), EDA_3D_CONTROLLER::SetMaterial(), DRC_TOOL::ShowDRCDialog(), SCH_DRAWING_TOOLS::SingleClickPlace(), EDA_3D_CONTROLLER::ToggleVisibility(), BOARD_EDITOR_CONTROL::TrackWidthDec(), BOARD_EDITOR_CONTROL::TrackWidthInc(), SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace(), SCH_DRAWING_TOOLS::TwoClickPlace(), SYMBOL_EDITOR_EDIT_TOOL::Undo(), SCH_EDITOR_CONTROL::Undo(), GROUP_TOOL::Ungroup(), GERBVIEW_SELECTION_TOOL::UnselectItem(), GERBVIEW_SELECTION_TOOL::UnselectItems(), PCB_SELECTION_TOOL::UnselectItems(), PNS::TOOL_BASE::updateEndItem(), EE_INSPECTION_TOOL::UpdateMessagePanel(), GERBVIEW_CONTROL::UpdateMessagePanel(), PL_EDITOR_CONTROL::UpdateMessagePanel(), PCB_CONTROL::UpdateMessagePanel(), EDIT_TOOL::updateModificationPoint(), EE_POINT_EDITOR::updateParentItem(), BOARD_INSPECTION_TOOL::UpdateSelectionRatsnest(), PNS::TOOL_BASE::updateStartItem(), BOARD_EDITOR_CONTROL::ViaSizeDec(), BOARD_EDITOR_CONTROL::ViaSizeInc(), TOOL_INTERACTIVE::Wait(), BOARD_EDITOR_CONTROL::ZoneDuplicate(), and BOARD_EDITOR_CONTROL::ZoneMerge().

◆ m_toolName

std::string TOOL_BASE::m_toolName
protectedinherited

Definition at line 213 of file tool_base.h.

Referenced by TOOL_BASE::GetName().

◆ m_type

TOOL_TYPE TOOL_BASE::m_type
protectedinherited

Unique identifier for the tool, assigned by a TOOL_MANAGER instance.

Definition at line 206 of file tool_base.h.

Referenced by TOOL_BASE::GetType(), and BOARD_COMMIT::Push().


The documentation for this class was generated from the following files: