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

◆ highlightNet()

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 930 of file pcb_editor_control.cpp.

932 {
933  auto render = aToolMgr->GetView()->GetPainter()->GetSettings();
934  auto frame = static_cast<PCB_EDIT_FRAME*>( aToolMgr->GetEditFrame() );
935 
936  BOARD* board = static_cast<BOARD*>( aToolMgr->GetModel() );
937 
938  int net = -1;
939  bool enableHighlight = false;
940 
941  if( aUseSelection )
942  {
943  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
944 
945  const SELECTION& selection = selectionTool->GetSelection();
946 
947  for( auto item : selection )
948  {
949  if( BOARD_CONNECTED_ITEM::ClassOf( item ) )
950  {
951  auto ci = static_cast<BOARD_CONNECTED_ITEM*>( item );
952 
953  int item_net = ci->GetNetCode();
954 
955  if( net < 0 )
956  {
957  net = item_net;
958  }
959  else if( net != item_net )
960  {
961  // more than one net selected: do nothing
962  return 0;
963  }
964  }
965  }
966 
967  enableHighlight = ( net >= 0 && net != render->GetHighlightNetCode() );
968  }
969 
970  // If we didn't get a net to highlight from the selection, use the cursor
971  if( net < 0 )
972  {
973  auto guide = frame->GetCollectorsGuide();
974  GENERAL_COLLECTOR collector;
975 
976  // Find a connected item for which we are going to highlight a net
977  collector.Collect( board, GENERAL_COLLECTOR::PadsOrTracks,
978  wxPoint( aPosition.x, aPosition.y ), guide );
979 
980  if( collector.GetCount() == 0 )
981  collector.Collect( board, GENERAL_COLLECTOR::Zones,
982  wxPoint( aPosition.x, aPosition.y ), guide );
983 
984  // Clear the previous highlight
985  frame->SendMessageToEESCHEMA( nullptr );
986 
987  for( int i = 0; i < collector.GetCount(); i++ )
988  {
989  if( ( collector[i]->GetLayerSet() & LSET::AllCuMask() ).none() )
990  collector.Remove( i );
991 
992  if( collector[i]->Type() == PCB_PAD_T )
993  {
994  frame->SendMessageToEESCHEMA( static_cast<BOARD_CONNECTED_ITEM*>( collector[i] ) );
995  break;
996  }
997  }
998 
999  enableHighlight = ( collector.GetCount() > 0 );
1000 
1001  // Obtain net code for the clicked item
1002  if( enableHighlight )
1003  net = static_cast<BOARD_CONNECTED_ITEM*>( collector[0] )->GetNetCode();
1004  }
1005 
1006  // Toggle highlight when the same net was picked
1007  if( net > 0 && net == render->GetHighlightNetCode() )
1008  enableHighlight = !render->IsHighlightEnabled();
1009 
1010  if( enableHighlight != render->IsHighlightEnabled() || net != render->GetHighlightNetCode() )
1011  {
1012  render->SetHighlight( enableHighlight, net );
1013  aToolMgr->GetView()->UpdateAllLayersColor();
1014  }
1015 
1016  // Store the highlighted netcode in the current board (for dialogs for instance)
1017  if( enableHighlight && net >= 0 )
1018  {
1019  board->SetHighLightNet( net );
1020 
1021  NETINFO_ITEM* netinfo = board->FindNet( net );
1022 
1023  if( netinfo )
1024  {
1025  MSG_PANEL_ITEMS items;
1026  netinfo->GetMsgPanelInfo( frame->GetUserUnits(), items );
1027  frame->SetMsgPanel( items );
1028  frame->SendCrossProbeNetName( netinfo->GetNetname() );
1029  }
1030  }
1031  else
1032  {
1033  board->ResetHighLight();
1034  frame->SetMsgPanel( board );
1035  frame->SendCrossProbeNetName( "" );
1036  }
1037 
1038  return true;
1039 }
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Function AllCuMask returns a mask holding the requested number of Cu PCB_LAYER_IDs.
Definition: lset.cpp:676
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:252
void Collect(BOARD_ITEM *aItem, const KICAD_T aScanList[], const wxPoint &aRefPos, const COLLECTORS_GUIDE &aGuide)
Scan a BOARD_ITEM using this class's Inspector method, which does the collection.
Definition: collectors.cpp:482
Class SELECTION_TOOL.
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
EDA_ITEM * GetModel() const
Definition: tool_manager.h:262
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
Definition: collector.h:143
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:199
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
static const KICAD_T Zones[]
A scan list for zones outlines only.
Definition: collectors.h:282
const wxString & GetNetname() const
Function GetNetname.
Definition: netinfo.h:239
wxWindow * GetEditFrame() const
Definition: tool_manager.h:267
static bool ClassOf(const EDA_ITEM *aItem)
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
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
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...
void UpdateAllLayersColor()
Function UpdateAllLayersColor() Applies the new coloring scheme to all layers.
Definition: view.cpp:797

References LSET::AllCuMask(), BOARD_CONNECTED_ITEM::ClassOf(), GENERAL_COLLECTOR::Collect(), COLLECTOR::GetCount(), TOOL_MANAGER::GetEditFrame(), TOOL_MANAGER::GetModel(), NETINFO_ITEM::GetMsgPanelInfo(), NETINFO_ITEM::GetNetname(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), TOOL_MANAGER::GetTool(), TOOL_MANAGER::GetView(), i, GENERAL_COLLECTOR::PadsOrTracks, PCB_PAD_T, COLLECTOR::Remove(), KIGFX::VIEW::UpdateAllLayersColor(), VECTOR2< T >::x, VECTOR2< T >::y, and GENERAL_COLLECTOR::Zones.

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

◆ mergeZones()

static bool mergeZones ( BOARD_COMMIT aCommit,
std::vector< ZONE_CONTAINER * > &  aOriginZones,
std::vector< ZONE_CONTAINER * > &  aMergedZones 
)
static

Definition at line 689 of file pcb_editor_control.cpp.

691 {
692  for( unsigned int i = 1; i < aOriginZones.size(); i++ )
693  {
694  aOriginZones[0]->Outline()->BooleanAdd( *aOriginZones[i]->Outline(),
696  }
697 
698  aOriginZones[0]->Outline()->Simplify( SHAPE_POLY_SET::PM_FAST );
699 
700  // We should have one polygon with hole
701  // We can have 2 polygons with hole, if the 2 initial polygons have only one common corner
702  // and therefore cannot be merged (they are dectected as intersecting)
703  // but we should never have more than 2 polys
704  if( aOriginZones[0]->Outline()->OutlineCount() > 1 )
705  {
706  wxLogMessage( "BOARD::CombineAreas error: more than 2 polys after merging" );
707  return false;
708  }
709 
710  for( unsigned int i = 1; i < aOriginZones.size(); i++ )
711  {
712  aCommit.Remove( aOriginZones[i] );
713  }
714 
715  aCommit.Modify( aOriginZones[0] );
716  aMergedZones.push_back( aOriginZones[0] );
717 
718  aOriginZones[0]->SetLocalFlags( 1 );
719  aOriginZones[0]->Hatch();
720  aOriginZones[0]->CacheTriangulation();
721 
722  return true;
723 }
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

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

Referenced by PCB_EDITOR_CONTROL::ZoneMerge().

◆ showLocalRatsnest()

static bool showLocalRatsnest ( TOOL_MANAGER aToolMgr,
BOARD aBoard,
const VECTOR2D aPosition 
)
static

Definition at line 1105 of file pcb_editor_control.cpp.

1106 {
1107  auto selectionTool = aToolMgr->GetTool<SELECTION_TOOL>();
1108 
1109  aToolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
1111  SELECTION& selection = selectionTool->GetSelection();
1112 
1113  if( selection.Empty() )
1114  {
1116  selection = selectionTool->GetSelection();
1117  }
1118 
1119  if( selection.Empty() )
1120  {
1121  // Clear the previous local ratsnest if we click off all items
1122  for( auto mod : aBoard->Modules() )
1123  {
1124  for( auto pad : mod->Pads() )
1125  pad->SetLocalRatsnestVisible( aBoard->IsElementVisible( LAYER_RATSNEST ) );
1126  }
1127  }
1128  else
1129  {
1130  for( auto item : selection )
1131  {
1132  if( auto pad = dyn_cast<D_PAD*>(item) )
1133  {
1134  pad->SetLocalRatsnestVisible( !pad->GetLocalRatsnestVisible() );
1135  }
1136  else if( auto mod = dyn_cast<MODULE*>(item) )
1137  {
1138  bool enable = !( *( mod->Pads().begin() ) )->GetLocalRatsnestVisible();
1139 
1140  for( auto modpad : mod->Pads() )
1141  {
1142  modpad->SetLocalRatsnestVisible( enable );
1143  }
1144  }
1145  }
1146  }
1147 
1149 
1150  return true;
1151 }
static TOOL_ACTION selectionClear
Clears the current selection.
Definition: pcb_actions.h:53
KIGFX::VIEW * GetView() const
Definition: tool_manager.h:252
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 'dirty' flag.
Definition: view.h:596
Items that may change while the view stays the same (noncached)
Definition: definitions.h:50
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:116
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Function IsElementVisible tests whether a given element category is visible.
static void PadFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
Function PadFilter()
Definition: edit_tool.cpp:1241
static void FootprintFilter(const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
Function FootprintFilter()
Definition: edit_tool.cpp:1253
#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

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_ACTIONS::selectionClear, PCB_ACTIONS::selectionCursor, and KIGFX::TARGET_OVERLAY.

Referenced by PCB_EDITOR_CONTROL::ShowLocalRatsnest().