KiCad PCB EDA Suite
class_board.cpp File Reference

BOARD class functions. More...

#include <limits.h>
#include <algorithm>
#include <iterator>
#include <fctsys.h>
#include <common.h>
#include <kicad_string.h>
#include <pcb_base_frame.h>
#include <msgpanel.h>
#include <pcb_netlist.h>
#include <reporter.h>
#include <base_units.h>
#include <ratsnest_data.h>
#include <ratsnest_viewitem.h>
#include <worksheet_viewitem.h>
#include <pcbnew.h>
#include <collectors.h>
#include <class_board.h>
#include <class_module.h>
#include <class_track.h>
#include <class_zone.h>
#include <class_marker_pcb.h>
#include <class_drawsegment.h>
#include <class_pcb_text.h>
#include <class_pcb_target.h>
#include <class_dimension.h>
#include <connectivity/connectivity_data.h>
#include <stdio.h>

Go to the source code of this file.

Classes

class  DELETED_BOARD_ITEM
 A singleton item of this class is returned for a weak reference that no longer exists. More...
 

Functions

static void removeTrack (TRACKS *aList, TRACK *aOneToRemove)
 Function removeTrack removes aOneToRemove from aList, which is a non-owning std::vector. More...
 
static void otherEnd (const TRACK &aTrack, const wxPoint &aNotThisEnd, wxPoint *aOtherEnd)
 
static int find_vias_and_tracks_at (TRACKS &at_next, TRACKS &in_net, LSET &lset, const wxPoint &next)
 Function find_vias_and_tracks_at collects TRACKs and VIAs at aPos and returns the track_count which excludes vias. More...
 
static void checkConnectedTo (BOARD *aBoard, TRACKS *aList, const TRACKS &aTracksInNet, const wxPoint &aGoal, const wxPoint &aStart, TRACK *aFirstTrack)
 Function checkConnectedTo returns if aTracksInNet contains a copper pathway to aGoal when starting with aFirstTrack. More...
 
static bool sortNetsByNodes (const NETINFO_ITEM *a, const NETINFO_ITEM *b)
 
static bool sortNetsByNames (const NETINFO_ITEM *a, const NETINFO_ITEM *b)
 
bool sortPadsByXthenYCoord (D_PAD *const &ref, D_PAD *const &comp)
 Function SortPadsByXCoord is used by GetSortedPadListByXCoord to Sort a pad list by x coordinate value. More...
 
bool BuildBoardPolygonOutlines (BOARD *aBoard, SHAPE_POLY_SET &aOutlines, wxString *aErrorText, unsigned int aTolerance)
 

Variables

DELETED_BOARD_ITEM g_DeletedItem
 
static COLORS_DESIGN_SETTINGS dummyColorsSettings (FRAME_PCB)
 
static std::vector< int > padCountListByNet
 

Detailed Description

BOARD class functions.

Definition in file class_board.cpp.

Function Documentation

bool BuildBoardPolygonOutlines ( BOARD aBoard,
SHAPE_POLY_SET aOutlines,
wxString *  aErrorText,
unsigned int  aTolerance 
)

Definition at line 643 of file convert_drawsegment_list_to_polygon.cpp.

Referenced by BOARD::Duplicate(), and BOARD::GetBoardPolygonOutlines().

645 {
646  PCB_TYPE_COLLECTOR items;
647 
648  // Get all the DRAWSEGMENTS and module graphics into 'items',
649  // then keep only those on layer == Edge_Cuts.
650  static const KICAD_T scan_graphics[] = { PCB_LINE_T, PCB_MODULE_EDGE_T, EOT };
651  items.Collect( aBoard, scan_graphics );
652 
653  // Make a working copy of aSegList, because the list is modified during calculations
654  std::vector< DRAWSEGMENT* > segList;
655 
656  for( int ii = 0; ii < items.GetCount(); ii++ )
657  {
658  if( items[ii]->GetLayer() == Edge_Cuts )
659  segList.push_back( static_cast< DRAWSEGMENT* >( items[ii] ) );
660  }
661 
662  bool success = ConvertOutlineToPolygon( segList, aOutlines, aErrorText, aTolerance );
663 
664  if( !success || !aOutlines.OutlineCount() )
665  {
666  // Creates a valid polygon outline is not possible.
667  // So uses the board edge cuts bounding box to create a
668  // rectangular outline
669  // When no edge cuts items, build a contour
670  // from global bounding box
671 
672  EDA_RECT bbbox = aBoard->GetBoardEdgesBoundingBox();
673 
674  // If null area, uses the global bounding box.
675  if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) )
676  bbbox = aBoard->ComputeBoundingBox();
677 
678  // Ensure non null area. If happen, gives a minimal size.
679  if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) )
680  bbbox.Inflate( Millimeter2iu( 1.0 ) );
681 
682  aOutlines.RemoveAllContours();
683  aOutlines.NewOutline();
684 
685  wxPoint corner;
686  aOutlines.Append( bbbox.GetOrigin() );
687 
688  corner.x = bbbox.GetOrigin().x;
689  corner.y = bbbox.GetEnd().y;
690  aOutlines.Append( corner );
691 
692  aOutlines.Append( bbbox.GetEnd() );
693 
694  corner.x = bbbox.GetEnd().x;
695  corner.y = bbbox.GetOrigin().y;
696  aOutlines.Append( corner );
697  }
698 
699  return success;
700 }
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:106
bool ConvertOutlineToPolygon(std::vector< DRAWSEGMENT * > &aSegList, SHAPE_POLY_SET &aPolygons, wxString *aErrorText, unsigned int aTolerance)
Function ConvertOutlineToPolygon build a polygon (with holes) from a DRAWSEGMENT list, which is expected to be a outline, therefore a closed main outline with perhaps closed inner outlines.
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
EDA_RECT ComputeBoundingBox(bool aBoardEdgesOnly=false) const
Function ComputeBoundingBox calculates the bounding box containing all board items (or board edge seg...
int GetHeight() const
Definition: eda_rect.h:118
int OutlineCount() const
Returns the number of outlines in the set
class EDGE_MODULE, a footprint edge
Definition: typeinfo.h:94
search types array terminator (End Of Types)
Definition: typeinfo.h:82
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:78
const EDA_RECT GetBoardEdgesBoundingBox() const
Function GetBoardEdgesBoundingBox Returns the board bounding box calculated using exclusively the boa...
Definition: class_board.h:804
int NewOutline()
Creates a new empty polygon in the set and returns its index
void Collect(BOARD_ITEM *aBoard, const KICAD_T aScanList[])
Collect BOARD_ITEM objects using this class&#39;s Inspector method, which does the collection.
Definition: collectors.cpp:496
const wxPoint GetEnd() const
Definition: eda_rect.h:114
void RemoveAllContours()
Removes all outlines & holes (clears) the polygon set.
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
int GetWidth() const
Definition: eda_rect.h:117
static bool GetLayer(MODEL_VRML &aModel, LAYER_NUM layer, VRML_LAYER **vlayer)
Collect all BOARD_ITEM objects of a given set of KICAD_T type(s).
Definition: collectors.h:590
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
EDA_RECT & Inflate(wxCoord dx, wxCoord dy)
Function Inflate inflates the rectangle horizontally by dx and vertically by dy.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline) ...
static void checkConnectedTo ( BOARD aBoard,
TRACKS *  aList,
const TRACKS &  aTracksInNet,
const wxPoint aGoal,
const wxPoint aStart,
TRACK aFirstTrack 
)
static

Function checkConnectedTo returns if aTracksInNet contains a copper pathway to aGoal when starting with aFirstTrack.

aFirstTrack should have one end situated on aStart, and the traversal testing begins from the other end of aFirstTrack.

The function throws an exception instead of returning bool so that detailed information can be provided about a possible failure in the track layout.

Exceptions
IO_ERROR- if points are not connected, with text saying why.

Definition at line 320 of file class_board.cpp.

References find_vias_and_tracks_at(), BOARD_ITEM::FormatInternalUnits(), BOARD_ITEM::GetLayer(), BOARD::GetPadFast(), next(), otherEnd(), removeTrack(), numEval::StrPrintf(), and THROW_IO_ERROR.

Referenced by BOARD::TracksInNetBetweenPoints().

322 {
323  TRACKS in_net = aTracksInNet; // copy source list so the copy can be modified
324  wxPoint next;
325 
326  otherEnd( *aFirstTrack, aStart, &next );
327 
328  aList->push_back( aFirstTrack );
329  removeTrack( &in_net, aFirstTrack );
330 
331  LSET lset( aFirstTrack->GetLayer() );
332 
333  while( in_net.size() )
334  {
335  if( next == aGoal )
336  return; // success
337 
338  // Want an exact match on the position of next, i.e. pad at next,
339  // not a forgiving HitTest() with tolerance type of match, otherwise the overall
340  // algorithm will not work. GetPadFast() is an exact match as I write this.
341  if( aBoard->GetPadFast( next, lset ) )
342  {
343  std::string m = StrPrintf(
344  "intervening pad at:(xy %s) between start:(xy %s) and goal:(xy %s)",
345  BOARD_ITEM::FormatInternalUnits( next ).c_str(),
346  BOARD_ITEM::FormatInternalUnits( aStart ).c_str(),
347  BOARD_ITEM::FormatInternalUnits( aGoal ).c_str()
348  );
349  THROW_IO_ERROR( m );
350  }
351 
352  int track_count = find_vias_and_tracks_at( *aList, in_net, lset, next );
353 
354  if( track_count != 1 )
355  {
356  std::string m = StrPrintf(
357  "found %d tracks intersecting at (xy %s), exactly 2 would be acceptable.",
358  track_count + aList->size() == 1 ? 1 : 0,
359  BOARD_ITEM::FormatInternalUnits( next ).c_str()
360  );
361  THROW_IO_ERROR( m );
362  }
363 
364  // reduce lset down to the layer that the last track at 'next' is on.
365  lset = aList->back()->GetLayerSet();
366 
367  otherEnd( *aList->back(), next, &next );
368  }
369 
370  std::string m = StrPrintf(
371  "not enough tracks connecting start:(xy %s) and goal:(xy %s).",
372  BOARD_ITEM::FormatInternalUnits( aStart ).c_str(),
373  BOARD_ITEM::FormatInternalUnits( aGoal ).c_str()
374  );
375  THROW_IO_ERROR( m );
376 }
CITER next(CITER it)
Definition: ptree.cpp:130
int StrPrintf(std::string *aResult, const char *aFormat,...)
Function StrPrintf is like sprintf() but the output is appended to a std::string instead of to a char...
Definition: richio.cpp:74
static void removeTrack(TRACKS *aList, TRACK *aOneToRemove)
Function removeTrack removes aOneToRemove from aList, which is a non-owning std::vector.
D_PAD * GetPadFast(const wxPoint &aPosition, LSET aLayerMask)
Function GetPadFast return pad found at aPosition on aLayerMask using the fast search method...
static void otherEnd(const TRACK &aTrack, const wxPoint &aNotThisEnd, wxPoint *aOtherEnd)
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
static int find_vias_and_tracks_at(TRACKS &at_next, TRACKS &in_net, LSET &lset, const wxPoint &next)
Function find_vias_and_tracks_at collects TRACKs and VIAs at aPos and returns the track_count which e...
static std::string FormatInternalUnits(int aValue)
Function FormatInternalUnits converts aValue from board internal units to a string appropriate for wr...
Class LSET is a set of PCB_LAYER_IDs.
#define THROW_IO_ERROR(msg)
static int find_vias_and_tracks_at ( TRACKS &  at_next,
TRACKS &  in_net,
LSET lset,
const wxPoint next 
)
static

Function find_vias_and_tracks_at collects TRACKs and VIAs at aPos and returns the track_count which excludes vias.

Definition at line 268 of file class_board.cpp.

References TRACK::GetEnd(), BOARD_ITEM::GetLayerSet(), TRACK::GetStart(), next(), PCB_VIA_T, and EDA_ITEM::Type().

Referenced by checkConnectedTo().

269 {
270  // first find all vias (in this net) at 'next' location, and expand LSET with each
271  for( TRACKS::iterator it = in_net.begin(); it != in_net.end(); )
272  {
273  TRACK* t = *it;
274 
275  if( t->Type() == PCB_VIA_T && (t->GetLayerSet() & lset).any() &&
276  ( t->GetStart() == next || t->GetEnd() == next ) )
277  {
278  lset |= t->GetLayerSet();
279  at_next.push_back( t );
280  it = in_net.erase( it );
281  }
282  else
283  ++it;
284  }
285 
286  int track_count = 0;
287 
288  // with expanded lset, find all tracks with an end on any of the layers in lset
289  for( TRACKS::iterator it = in_net.begin(); it != in_net.end(); /* iterates in the loop body */ )
290  {
291  TRACK* t = *it;
292 
293  if( ( t->GetLayerSet() & lset ).any() && ( t->GetStart() == next || t->GetEnd() == next ) )
294  {
295  at_next.push_back( t );
296  it = in_net.erase( it );
297  ++track_count;
298  }
299  else
300  {
301  ++it;
302  }
303  }
304 
305  return track_count;
306 }
CITER next(CITER it)
Definition: ptree.cpp:130
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
const wxPoint & GetEnd() const
Definition: class_track.h:119
const wxPoint & GetStart() const
Definition: class_track.h:122
virtual LSET GetLayerSet() const
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
static void otherEnd ( const TRACK aTrack,
const wxPoint aNotThisEnd,
wxPoint aOtherEnd 
)
static

Definition at line 250 of file class_board.cpp.

References TRACK::GetEnd(), and TRACK::GetStart().

Referenced by checkConnectedTo().

251 {
252  if( aTrack.GetStart() == aNotThisEnd )
253  {
254  *aOtherEnd = aTrack.GetEnd();
255  }
256  else
257  {
258  wxASSERT( aTrack.GetEnd() == aNotThisEnd );
259  *aOtherEnd = aTrack.GetStart();
260  }
261 }
const wxPoint & GetEnd() const
Definition: class_track.h:119
const wxPoint & GetStart() const
Definition: class_track.h:122
static void removeTrack ( TRACKS *  aList,
TRACK aOneToRemove 
)
static

Function removeTrack removes aOneToRemove from aList, which is a non-owning std::vector.

Definition at line 244 of file class_board.cpp.

Referenced by checkConnectedTo().

245 {
246  aList->erase( std::remove( aList->begin(), aList->end(), aOneToRemove ), aList->end() );
247 }
static bool sortNetsByNames ( const NETINFO_ITEM a,
const NETINFO_ITEM b 
)
static

Definition at line 1491 of file class_board.cpp.

References NETINFO_ITEM::GetNetname().

Referenced by BOARD::SortedNetnamesList().

1492 {
1493  return a->GetNetname() < b->GetNetname();
1494 }
const wxString & GetNetname() const
Function GetNetname.
Definition: netinfo.h:235
static bool sortNetsByNodes ( const NETINFO_ITEM a,
const NETINFO_ITEM b 
)
static

Definition at line 1479 of file class_board.cpp.

References NETINFO_ITEM::GetNet(), NETINFO_ITEM::GetNetname(), and padCountListByNet.

Referenced by BOARD::SortedNetnamesList().

1480 {
1481  int countA = padCountListByNet[a->GetNet()];
1482  int countB = padCountListByNet[b->GetNet()];
1483 
1484  if( countA == countB )
1485  return a->GetNetname() < b->GetNetname();
1486  else
1487  return countB < countA;
1488 }
int GetNet() const
Function GetNet.
Definition: netinfo.h:227
const wxString & GetNetname() const
Function GetNetname.
Definition: netinfo.h:235
static std::vector< int > padCountListByNet
bool sortPadsByXthenYCoord ( D_PAD *const &  ref,
D_PAD *const &  comp 
)

Function SortPadsByXCoord is used by GetSortedPadListByXCoord to Sort a pad list by x coordinate value.

This function is used to build ordered pads lists

Definition at line 1817 of file class_board.cpp.

References D_PAD::GetPosition(), wxPoint::x, and wxPoint::y.

Referenced by DRAG_LIST::BuildDragListe(), BOARD::GetSortedPadListByXthenYCoord(), and DRAG_SEGM_PICKER::SetTrackEndsCoordinates().

1818 {
1819  if( ref->GetPosition().x == comp->GetPosition().x )
1820  return ref->GetPosition().y < comp->GetPosition().y;
1821  return ref->GetPosition().x < comp->GetPosition().x;
1822 }
const wxPoint GetPosition() const override
Definition: class_pad.h:220

Variable Documentation

COLORS_DESIGN_SETTINGS dummyColorsSettings(FRAME_PCB)
static

Referenced by BOARD::BOARD().

DELETED_BOARD_ITEM g_DeletedItem

Definition at line 95 of file class_board.cpp.

Referenced by BOARD::GetItem().

std::vector<int> padCountListByNet
static

Definition at line 1475 of file class_board.cpp.

Referenced by BOARD::SortedNetnamesList(), and sortNetsByNodes().