KiCad PCB EDA Suite
pcb_editor_control.cpp File Reference
#include <cstdint>
#include <thread>
#include <mutex>
#include "pcb_editor_control.h"
#include "pcb_actions.h"
#include <tool/tool_manager.h>
#include <wx/progdlg.h>
#include "edit_tool.h"
#include "selection_tool.h"
#include "drawing_tool.h"
#include "picker_tool.h"
#include <painter.h>
#include <project.h>
#include <pcbnew_id.h>
#include <pcb_edit_frame.h>
#include <class_board.h>
#include <class_zone.h>
#include <pcb_draw_panel_gal.h>
#include <class_module.h>
#include <class_pcb_target.h>
#include <connectivity/connectivity_data.h>
#include <collectors.h>
#include <zones_functions_for_undo_redo.h>
#include <board_commit.h>
#include <confirm.h>
#include <bitmaps.h>
#include <hotkeys.h>
#include <view/view_group.h>
#include <view/view_controls.h>
#include <origin_viewitem.h>
#include <profile.h>
#include <widgets/progress_reporter.h>
#include <tools/tool_event_utils.h>
#include <functional>

Go to the source code of this file.

Classes

class  ZONE_CONTEXT_MENU
 
class  LOCK_CONTEXT_MENU
 

Functions

static bool mergeZones (BOARD_COMMIT &aCommit, std::vector< ZONE_CONTAINER * > &aOriginZones, std::vector< ZONE_CONTAINER * > &aMergedZones)
 
static bool highlightNet (TOOL_MANAGER *aToolMgr, const VECTOR2D &aPosition, bool aUseSelection=false)
 Look for a BOARD_CONNECTED_ITEM in a given spot and if one is found - it enables highlight for its net. More...
 
static bool showLocalRatsnest (TOOL_MANAGER *aToolMgr, BOARD *aBoard, const VECTOR2D &aPosition)
 

Function Documentation

static bool highlightNet ( TOOL_MANAGER aToolMgr,
const VECTOR2D aPosition,
bool  aUseSelection = false 
)
static

Look for a BOARD_CONNECTED_ITEM in a given spot and if one is found - it enables highlight for its net.

Parameters
aToolMgris the TOOL_MANAGER currently in use.
aPositionis the point where an item is expected (world coordinates).
aUseSelectionis true if we should use the current selection to pick the netcode

Definition at line 920 of file pcb_editor_control.cpp.

References PCB_TOOL::board(), BOARD_CONNECTED_ITEM::ClassOf(), GENERAL_COLLECTOR::Collect(), BOARD::FindNet(), PCB_TOOL::frame(), PCB_BASE_FRAME::GetCollectorsGuide(), COLLECTOR::GetCount(), TOOL_MANAGER::GetEditFrame(), TOOL_MANAGER::GetModel(), NETINFO_ITEM::GetMsgPanelInfo(), BOARD_CONNECTED_ITEM::GetNetCode(), NETINFO_ITEM::GetNetname(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), TOOL_MANAGER::GetTool(), EDA_DRAW_FRAME::GetUserUnits(), TOOL_MANAGER::GetView(), i, GENERAL_COLLECTOR::PadsOrTracks, PCB_PAD_T, BOARD::ResetHighLight(), PCB_TOOL::selection(), PCB_EDIT_FRAME::SendCrossProbeNetName(), PCB_EDIT_FRAME::SendMessageToEESCHEMA(), BOARD::SetHighLightNet(), EDA_DRAW_FRAME::SetMsgPanel(), KIGFX::VIEW::UpdateAllLayersColor(), VECTOR2< T >::x, VECTOR2< T >::y, and GENERAL_COLLECTOR::Zones.

Referenced by PCB_EDITOR_CONTROL::HighlightNet(), and PCB_EDITOR_CONTROL::HighlightNetCursor().

922 {
923  auto render = aToolMgr->GetView()->GetPainter()->GetSettings();
924  auto frame = static_cast<PCB_EDIT_FRAME*>( aToolMgr->GetEditFrame() );
925 
926  BOARD* board = static_cast<BOARD*>( aToolMgr->GetModel() );
927 
928  int net = -1;
929  bool enableHighlight = false;
930 
931  if( aUseSelection )
932  {
933  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
934 
935  const SELECTION& selection = selectionTool->GetSelection();
936 
937  for( auto item : selection )
938  {
939  if( BOARD_CONNECTED_ITEM::ClassOf( item ) )
940  {
941  auto ci = static_cast<BOARD_CONNECTED_ITEM*>( item );
942 
943  int item_net = ci->GetNetCode();
944 
945  if( net < 0 )
946  {
947  net = item_net;
948  }
949  else if( net != item_net )
950  {
951  // more than one net selected: do nothing
952  return 0;
953  }
954  }
955  }
956 
957  enableHighlight = ( net >= 0 && net != render->GetHighlightNetCode() );
958  }
959 
960  // If we didn't get a net to highlight from the selection, use the cursor
961  if( net < 0 )
962  {
963  auto guide = frame->GetCollectorsGuide();
964  GENERAL_COLLECTOR collector;
965 
966  // Find a connected item for which we are going to highlight a net
967  collector.Collect( board, GENERAL_COLLECTOR::PadsOrTracks,
968  wxPoint( aPosition.x, aPosition.y ), guide );
969 
970  if( collector.GetCount() == 0 )
971  collector.Collect( board, GENERAL_COLLECTOR::Zones,
972  wxPoint( aPosition.x, aPosition.y ), guide );
973 
974  for( int i = 0; i < collector.GetCount(); i++ )
975  {
976  if( collector[i]->Type() == PCB_PAD_T )
977  {
978  frame->SendMessageToEESCHEMA( static_cast<BOARD_CONNECTED_ITEM*>( collector[i] ) );
979  break;
980  }
981  }
982 
983  enableHighlight = ( collector.GetCount() > 0 );
984 
985  // Obtain net code for the clicked item
986  if( enableHighlight )
987  net = static_cast<BOARD_CONNECTED_ITEM*>( collector[0] )->GetNetCode();
988  }
989 
990  // Toggle highlight when the same net was picked
991  if( net > 0 && net == render->GetHighlightNetCode() )
992  enableHighlight = !render->IsHighlightEnabled();
993 
994  if( enableHighlight != render->IsHighlightEnabled() || net != render->GetHighlightNetCode() )
995  {
996  render->SetHighlight( enableHighlight, net );
997  aToolMgr->GetView()->UpdateAllLayersColor();
998  }
999 
1000  // Store the highlighted netcode in the current board (for dialogs for instance)
1001  if( enableHighlight && net >= 0 )
1002  {
1003  board->SetHighLightNet( net );
1004 
1005  NETINFO_ITEM* netinfo = board->FindNet( net );
1006 
1007  if( netinfo )
1008  {
1009  MSG_PANEL_ITEMS items;
1010  netinfo->GetMsgPanelInfo( frame->GetUserUnits(), items );
1011  frame->SetMsgPanel( items );
1012  frame->SendCrossProbeNetName( netinfo->GetNetname() );
1013  }
1014  }
1015  else
1016  {
1017  board->ResetHighLight();
1018  frame->SetMsgPanel( board );
1019  frame->SendCrossProbeNetName( "" );
1020  }
1021 
1022  return true;
1023 }
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
void Collect(BOARD_ITEM *aItem, const KICAD_T aScanList[], const wxPoint &aRefPos, const COLLECTORS_GUIDE &aGuide)
Scan a BOARD_ITEM using this class&#39;s Inspector method, which does the collection. ...
Definition: collectors.cpp:482
Class SELECTION_TOOL.
wxWindow * GetEditFrame() const
Definition: tool_manager.h:267
void ResetHighLight()
Function ResetHighLight Reset all high light data to the init state.
Definition: class_board.h:363
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
static const KICAD_T PadsOrTracks[]
A scan list for PADs, TRACKs, or VIAs.
Definition: collectors.h:303
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
static const KICAD_T Zones[]
A scan list for zones outlines only.
Definition: collectors.h:282
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:199
static bool ClassOf(const EDA_ITEM *aItem)
int GetNetCode() const
Function GetNetCode.
void SetHighLightNet(int aNetCode)
Function SetHighLightNet.
Definition: class_board.h:379
virtual RENDER_SETTINGS * GetSettings()=0
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
Class NETINFO_ITEM handles the data for a net.
Definition: netinfo.h:69
EDA_ITEM * GetModel() const
Definition: tool_manager.h:262
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:171
Used when the right click button is pressed, or when the select tool is in effect.
Definition: collectors.h:245
size_t i
Definition: json11.cpp:597
Class PCB_EDIT_FRAME is the main frame for Pcbnew.
NETINFO_ITEM * FindNet(int aNetcode) const
Function FindNet searches for a net with the given netcode.
std::vector< MSG_PANEL_ITEM > MSG_PANEL_ITEMS
Definition: msgpanel.h:102
void GetMsgPanelInfo(EDA_UNITS_T aUnits, std::vector< MSG_PANEL_ITEM > &aList) override
Function GetMsgPanelInfo returns the information about the NETINFO_ITEM in aList to display in the me...
const wxString & GetNetname() const
Function GetNetname.
Definition: netinfo.h:239
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:252
void UpdateAllLayersColor()
Function UpdateAllLayersColor() Applies the new coloring scheme to all layers.
Definition: view.cpp:796
static bool mergeZones ( BOARD_COMMIT aCommit,
std::vector< ZONE_CONTAINER * > &  aOriginZones,
std::vector< ZONE_CONTAINER * > &  aMergedZones 
)
static

Definition at line 679 of file pcb_editor_control.cpp.

References i, COMMIT::Modify(), SHAPE_POLY_SET::PM_FAST, and COMMIT::Remove().

Referenced by PCB_EDITOR_CONTROL::ZoneMerge().

681 {
682  for( unsigned int i = 1; i < aOriginZones.size(); i++ )
683  {
684  aOriginZones[0]->Outline()->BooleanAdd( *aOriginZones[i]->Outline(),
686  }
687 
688  aOriginZones[0]->Outline()->Simplify( SHAPE_POLY_SET::PM_FAST );
689 
690  // We should have one polygon with hole
691  // We can have 2 polygons with hole, if the 2 initial polygons have only one common corner
692  // and therefore cannot be merged (they are dectected as intersecting)
693  // but we should never have more than 2 polys
694  if( aOriginZones[0]->Outline()->OutlineCount() > 1 )
695  {
696  wxLogMessage( "BOARD::CombineAreas error: more than 2 polys after merging" );
697  return false;
698  }
699 
700  for( unsigned int i = 1; i < aOriginZones.size(); i++ )
701  {
702  aCommit.Remove( aOriginZones[i] );
703  }
704 
705  aCommit.Modify( aOriginZones[0] );
706  aMergedZones.push_back( aOriginZones[0] );
707 
708  aOriginZones[0]->SetLocalFlags( 1 );
709  aOriginZones[0]->Hatch();
710  aOriginZones[0]->CacheTriangulation();
711 
712  return true;
713 }
COMMIT & Modify(EDA_ITEM *aItem)
Modifies a given item in the model.
Definition: commit.h:103
COMMIT & Remove(EDA_ITEM *aItem)
Removes a new item from the model
Definition: commit.h:90
size_t i
Definition: json11.cpp:597
static bool showLocalRatsnest ( TOOL_MANAGER aToolMgr,
BOARD aBoard,
const VECTOR2D aPosition 
)
static

Definition at line 1089 of file pcb_editor_control.cpp.

References SELECTION::Empty(), EDIT_TOOL::FootprintFilter(), TOOL_MANAGER::GetTool(), TOOL_MANAGER::GetView(), BOARD::IsElementVisible(), LAYER_RATSNEST, KIGFX::VIEW::MarkTargetDirty(), mod, BOARD::Modules(), EDIT_TOOL::PadFilter(), TOOL_MANAGER::RunAction(), PCB_TOOL::selection(), PCB_ACTIONS::selectionClear, PCB_ACTIONS::selectionCursor, and KIGFX::TARGET_OVERLAY.

Referenced by PCB_EDITOR_CONTROL::ShowLocalRatsnest().

1090 {
1091  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
1092 
1093  aToolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
1095  SELECTION& selection = selectionTool->GetSelection();
1096 
1097  if( selection.Empty() )
1098  {
1100  selection = selectionTool->GetSelection();
1101  }
1102 
1103  if( selection.Empty() )
1104  {
1105  // Clear the previous local ratsnest if we click off all items
1106  for( auto mod : aBoard->Modules() )
1107  {
1108  for( auto pad : mod->Pads() )
1109  pad->SetLocalRatsnestVisible( aBoard->IsElementVisible( LAYER_RATSNEST ) );
1110  }
1111  }
1112  else
1113  {
1114  for( auto item : selection )
1115  {
1116  if( auto pad = dyn_cast<D_PAD*>(item) )
1117  {
1118  pad->SetLocalRatsnestVisible( !pad->GetLocalRatsnestVisible() );
1119  }
1120  else if( auto mod = dyn_cast<MODULE*>(item) )
1121  {
1122  bool enable = !( *( mod->Pads().begin() ) )->GetLocalRatsnestVisible();
1123 
1124  for( auto modpad : mod->Pads() )
1125  {
1126  modpad->SetLocalRatsnestVisible( enable );
1127  }
1128  }
1129  }
1130  }
1131 
1133 
1134  return true;
1135 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:116
Class SELECTION_TOOL.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:125
DLIST_ITERATOR_WRAPPER< MODULE > Modules()
Definition: class_board.h:255
void MarkTargetDirty(int aTarget)
Function MarkTargetDirty() Sets or clears target &#39;dirty&#39; flag.
Definition: view.h:596
Items that may change while the view stays the same (noncached)
Definition: definitions.h:43
static void PadFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
Function PadFilter()
Definition: edit_tool.cpp:1218
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Function IsElementVisible tests whether a given element category is visible.
static void FootprintFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
Function FootprintFilter()
Definition: edit_tool.cpp:1230
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:252
#define mod(a, n)
Definition: greymap.cpp:24
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
Definition: pcb_actions.h:50