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_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)
 Function highlightNet() Looks 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

Function highlightNet() Looks 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 905 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(), TOOL_MANAGER::GetView(), i, GENERAL_COLLECTOR::PadsTracksOrZones, 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, and VECTOR2< T >::y.

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

907 {
908  auto render = aToolMgr->GetView()->GetPainter()->GetSettings();
909  auto frame = static_cast<PCB_EDIT_FRAME*>( aToolMgr->GetEditFrame() );
910 
911  BOARD* board = static_cast<BOARD*>( aToolMgr->GetModel() );
912 
913  int net = -1;
914  bool enableHighlight = false;
915 
916  if( aUseSelection )
917  {
918  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
919 
920  const SELECTION& selection = selectionTool->GetSelection();
921 
922  for( auto item : selection )
923  {
924  if( BOARD_CONNECTED_ITEM::ClassOf( item ) )
925  {
926  auto ci = static_cast<BOARD_CONNECTED_ITEM*>( item );
927 
928  int item_net = ci->GetNetCode();
929 
930  if( net < 0 )
931  {
932  net = item_net;
933  }
934  else if( net != item_net )
935  {
936  // more than one net selected: do nothing
937  return 0;
938  }
939  }
940  }
941 
942  enableHighlight = ( net >= 0 && net != render->GetHighlightNetCode() );
943  }
944 
945  // If we didn't get a net to highlight from the selection, use the cursor
946  if( net < 0 )
947  {
948  auto guide = frame->GetCollectorsGuide();
949  GENERAL_COLLECTOR collector;
950 
951  // Find a connected item for which we are going to highlight a net
953  wxPoint( aPosition.x, aPosition.y ), guide );
954 
955  for( int i = 0; i < collector.GetCount(); i++ )
956  {
957  if( collector[i]->Type() == PCB_PAD_T )
958  {
959  frame->SendMessageToEESCHEMA( static_cast<BOARD_CONNECTED_ITEM*>( collector[i] ) );
960  break;
961  }
962  }
963 
964  enableHighlight = ( collector.GetCount() > 0 );
965 
966  // Obtain net code for the clicked item
967  if( enableHighlight )
968  net = static_cast<BOARD_CONNECTED_ITEM*>( collector[0] )->GetNetCode();
969  }
970 
971  // Toggle highlight when the same net was picked
972  if( net > 0 && net == render->GetHighlightNetCode() )
973  enableHighlight = !render->IsHighlightEnabled();
974 
975  if( enableHighlight != render->IsHighlightEnabled() || net != render->GetHighlightNetCode() )
976  {
977  render->SetHighlight( enableHighlight, net );
978  aToolMgr->GetView()->UpdateAllLayersColor();
979  }
980 
981  // Store the highlighted netcode in the current board (for dialogs for instance)
982  if( enableHighlight && net >= 0 )
983  {
984  board->SetHighLightNet( net );
985 
986  NETINFO_ITEM* netinfo = board->FindNet( net );
987 
988  if( netinfo )
989  {
990  MSG_PANEL_ITEMS items;
991  netinfo->GetMsgPanelInfo( items );
992  frame->SetMsgPanel( items );
993  frame->SendCrossProbeNetName( netinfo->GetNetname() );
994  }
995  }
996  else
997  {
998  board->ResetHighLight();
999  frame->SetMsgPanel( board );
1000  frame->SendCrossProbeNetName( "" );
1001  }
1002 
1003  return true;
1004 }
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:106
static const KICAD_T PadsTracksOrZones[]
A scan list for PADs, TRACKs, VIAs, or ZONEs.
Definition: collectors.h:290
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:458
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:359
class D_PAD, a pad in a footprint
Definition: typeinfo.h:90
void GetMsgPanelInfo(std::vector< MSG_PANEL_ITEM > &aList) override
Function GetMsgPanelInfo returns the information about the NETINFO_ITEM in aList to display in the me...
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:196
static bool ClassOf(const EDA_ITEM *aItem)
int GetNetCode() const
Function GetNetCode.
void SetHighLightNet(int aNetCode)
Function SetHighLightNet.
Definition: class_board.h:375
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:169
Used when the right click button is pressed, or when the select tool is in effect.
Definition: collectors.h:232
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
const wxString & GetNetname() const
Function GetNetname.
Definition: netinfo.h:235
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:252
void UpdateAllLayersColor()
Function UpdateAllLayersColor() Applies the new coloring scheme to all layers.
Definition: view.cpp:743
static bool mergeZones ( BOARD_COMMIT aCommit,
std::vector< ZONE_CONTAINER * > &  aOriginZones,
std::vector< ZONE_CONTAINER * > &  aMergedZones 
)
static

Definition at line 667 of file pcb_editor_control.cpp.

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

Referenced by PCB_EDITOR_CONTROL::ZoneMerge().

669 {
670  for( unsigned int i = 1; i < aOriginZones.size(); i++ )
671  {
672  aOriginZones[0]->Outline()->BooleanAdd( *aOriginZones[i]->Outline(),
674  }
675 
676  aOriginZones[0]->Outline()->Simplify( SHAPE_POLY_SET::PM_FAST );
677 
678  // We should have one polygon with hole
679  // We can have 2 polygons with hole, if the 2 initial polygons have only one common corner
680  // and therefore cannot be merged (they are dectected as intersecting)
681  // but we should never have more than 2 polys
682  if( aOriginZones[0]->Outline()->OutlineCount() > 1 )
683  {
684  wxLogMessage( wxT( "BOARD::CombineAreas error: more than 2 polys after merging" ) );
685  return false;
686  }
687 
688  for( unsigned int i = 1; i < aOriginZones.size(); i++ )
689  {
690  aCommit.Remove( aOriginZones[i] );
691  }
692 
693  aCommit.Modify( aOriginZones[0] );
694  aMergedZones.push_back( aOriginZones[0] );
695 
696  aOriginZones[0]->SetLocalFlags( 1 );
697  aOriginZones[0]->Hatch();
698  aOriginZones[0]->CacheTriangulation();
699 
700  return true;
701 }
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 1055 of file pcb_editor_control.cpp.

References SELECTION::Empty(), EDIT_TOOL::FootprintFilter(), TOOL_MANAGER::GetTool(), mod, BOARD::Modules(), PCB_MODULE_T, TOOL_MANAGER::RunAction(), PCB_TOOL::selection(), PCB_ACTIONS::selectionClear, and PCB_ACTIONS::selectionCursor.

Referenced by PCB_EDITOR_CONTROL::ShowLocalRatsnest().

1056 {
1057  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
1058  auto modules = aBoard->Modules();
1059 
1060  aToolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
1062 
1063  const SELECTION& selection = selectionTool->GetSelection();
1064 
1065  if( selection.Empty() )
1066  {
1067  // Clear the previous local ratsnest if we click off all items
1068  for( auto mod : modules )
1069  {
1070  for( auto pad : mod->Pads() )
1071  {
1072  pad->SetLocalRatsnestVisible( false );
1073  }
1074  }
1075 
1076  return true;
1077  }
1078 
1079  for( auto item : selection )
1080  {
1081  if( item->Type() == PCB_MODULE_T )
1082  {
1083  for( auto pad : static_cast<MODULE *> (item)->Pads() )
1084  {
1085  pad->SetLocalRatsnestVisible( !pad->GetLocalRatsnestVisible() );
1086  }
1087  }
1088  }
1089 
1090  return true;
1091 }
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:109
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
class MODULE, a footprint
Definition: typeinfo.h:89
DLIST_ITERATOR_WRAPPER< MODULE > Modules()
Definition: class_board.h:253
static void FootprintFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
Function FootprintFilter()
Definition: edit_tool.cpp:1133
#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