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, 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 922 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().

924 {
925  auto render = aToolMgr->GetView()->GetPainter()->GetSettings();
926  auto frame = static_cast<PCB_EDIT_FRAME*>( aToolMgr->GetEditFrame() );
927 
928  BOARD* board = static_cast<BOARD*>( aToolMgr->GetModel() );
929 
930  int net = -1;
931  bool enableHighlight = false;
932 
933  if( aUseSelection )
934  {
935  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
936 
937  const SELECTION& selection = selectionTool->GetSelection();
938 
939  for( auto item : selection )
940  {
941  if( BOARD_CONNECTED_ITEM::ClassOf( item ) )
942  {
943  auto ci = static_cast<BOARD_CONNECTED_ITEM*>( item );
944 
945  int item_net = ci->GetNetCode();
946 
947  if( net < 0 )
948  {
949  net = item_net;
950  }
951  else if( net != item_net )
952  {
953  // more than one net selected: do nothing
954  return 0;
955  }
956  }
957  }
958 
959  enableHighlight = ( net >= 0 && net != render->GetHighlightNetCode() );
960  }
961 
962  // If we didn't get a net to highlight from the selection, use the cursor
963  if( net < 0 )
964  {
965  auto guide = frame->GetCollectorsGuide();
966  GENERAL_COLLECTOR collector;
967 
968  // Find a connected item for which we are going to highlight a net
970  wxPoint( aPosition.x, aPosition.y ), guide );
971 
972  for( int i = 0; i < collector.GetCount(); i++ )
973  {
974  if( collector[i]->Type() == PCB_PAD_T )
975  {
976  frame->SendMessageToEESCHEMA( static_cast<BOARD_CONNECTED_ITEM*>( collector[i] ) );
977  break;
978  }
979  }
980 
981  enableHighlight = ( collector.GetCount() > 0 );
982 
983  // Obtain net code for the clicked item
984  if( enableHighlight )
985  net = static_cast<BOARD_CONNECTED_ITEM*>( collector[0] )->GetNetCode();
986  }
987 
988  // Toggle highlight when the same net was picked
989  if( net > 0 && net == render->GetHighlightNetCode() )
990  enableHighlight = !render->IsHighlightEnabled();
991 
992  if( enableHighlight != render->IsHighlightEnabled() || net != render->GetHighlightNetCode() )
993  {
994  render->SetHighlight( enableHighlight, net );
995  aToolMgr->GetView()->UpdateAllLayersColor();
996  }
997 
998  // Store the highlighted netcode in the current board (for dialogs for instance)
999  if( enableHighlight && net >= 0 )
1000  {
1001  board->SetHighLightNet( net );
1002 
1003  NETINFO_ITEM* netinfo = board->FindNet( net );
1004 
1005  if( netinfo )
1006  {
1007  MSG_PANEL_ITEMS items;
1008  netinfo->GetMsgPanelInfo( items );
1009  frame->SetMsgPanel( items );
1010  frame->SendCrossProbeNetName( netinfo->GetNetname() );
1011  }
1012  }
1013  else
1014  {
1015  board->ResetHighLight();
1016  frame->SetMsgPanel( board );
1017  frame->SendCrossProbeNetName( "" );
1018  }
1019 
1020  return true;
1021 }
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:450
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:356
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:372
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
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,
const VECTOR2D aPosition 
)
static

Definition at line 1072 of file pcb_editor_control.cpp.

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

Referenced by PCB_EDITOR_CONTROL::ShowLocalRatsnest().

1073 {
1074  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
1075 
1076  aToolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
1078 
1079  const SELECTION& selection = selectionTool->GetSelection();
1080 
1081  if( selection.Empty() )
1082  return true;
1083 
1084  for( auto item : selection )
1085  {
1086  if( item->Type() == PCB_MODULE_T )
1087  {
1088  for( auto pad : static_cast<MODULE *> (item)->Pads() )
1089  {
1090  pad->SetLocalRatsnestVisible( true );
1091  }
1092  }
1093  }
1094 
1095  return true;
1096 }
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
static void FootprintFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
Function FootprintFilter()
Definition: edit_tool.cpp:1098
static TOOL_ACTION selectionCursor
Select a single item under the cursor position.
Definition: pcb_actions.h:50