KiCad PCB EDA Suite
PNS_KICAD_IFACE Class Reference

#include <pns_kicad_iface.h>

Inheritance diagram for PNS_KICAD_IFACE:
PNS::ROUTER_IFACE

Public Member Functions

 PNS_KICAD_IFACE ()
 
 ~PNS_KICAD_IFACE ()
 
void SetRouter (PNS::ROUTER *aRouter) override
 
void SetHostFrame (PCB_EDIT_FRAME *aFrame)
 
void SetBoard (BOARD *aBoard)
 
void SetView (KIGFX::VIEW *aView)
 
void SyncWorld (PNS::NODE *aWorld) override
 
void EraseView () override
 
void HideItem (PNS::ITEM *aItem) override
 
void DisplayItem (const PNS::ITEM *aItem, int aColor=0, int aClearance=0) override
 
void AddItem (PNS::ITEM *aItem) override
 
void RemoveItem (PNS::ITEM *aItem) override
 
void Commit () override
 
void UpdateNet (int aNetCode) override
 
PNS::RULE_RESOLVERGetRuleResolver () override
 
PNS::DEBUG_DECORATORGetDebugDecorator () override
 

Private Member Functions

std::unique_ptr< PNS::SOLIDsyncPad (D_PAD *aPad)
 
std::unique_ptr< PNS::SEGMENTsyncTrack (TRACK *aTrack)
 
std::unique_ptr< PNS::VIAsyncVia (VIA *aVia)
 

Private Attributes

PNS_PCBNEW_RULE_RESOLVERm_ruleResolver
 
PNS_PCBNEW_DEBUG_DECORATORm_debugDecorator
 
KIGFX::VIEWm_view
 
KIGFX::VIEW_GROUPm_previewItems
 
std::unordered_set< BOARD_CONNECTED_ITEM * > m_hiddenItems
 
PNS::NODEm_world
 
PNS::ROUTERm_router
 
BOARDm_board
 
PCB_EDIT_FRAMEm_frame
 
std::unique_ptr< BOARD_COMMITm_commit
 
DISPLAY_OPTIONSm_dispOptions
 

Detailed Description

Definition at line 41 of file pns_kicad_iface.h.

Constructor & Destructor Documentation

PNS_KICAD_IFACE::PNS_KICAD_IFACE ( )

Definition at line 469 of file pns_kicad_iface.cpp.

References m_board, m_debugDecorator, m_dispOptions, m_frame, m_previewItems, m_router, m_ruleResolver, m_view, and m_world.

470 {
471  m_ruleResolver = nullptr;
472  m_board = nullptr;
473  m_frame = nullptr;
474  m_view = nullptr;
475  m_previewItems = nullptr;
476  m_world = nullptr;
477  m_router = nullptr;
478  m_debugDecorator = nullptr;
479  m_dispOptions = nullptr;
480 }
PNS_PCBNEW_DEBUG_DECORATOR * m_debugDecorator
PNS::NODE * m_world
PCB_EDIT_FRAME * m_frame
PNS_PCBNEW_RULE_RESOLVER * m_ruleResolver
KIGFX::VIEW_GROUP * m_previewItems
PNS::ROUTER * m_router
KIGFX::VIEW * m_view
DISPLAY_OPTIONS * m_dispOptions
PNS_KICAD_IFACE::~PNS_KICAD_IFACE ( )

Definition at line 483 of file pns_kicad_iface.cpp.

References KIGFX::VIEW_GROUP::FreeItems(), m_debugDecorator, m_previewItems, and m_ruleResolver.

484 {
485  delete m_ruleResolver;
486  delete m_debugDecorator;
487 
488  if( m_previewItems )
489  {
491  delete m_previewItems;
492  }
493 }
PNS_PCBNEW_DEBUG_DECORATOR * m_debugDecorator
void FreeItems()
Function FreeItems() Frees all the items that were added to the group.
Definition: view_group.cpp:141
PNS_PCBNEW_RULE_RESOLVER * m_ruleResolver
KIGFX::VIEW_GROUP * m_previewItems

Member Function Documentation

void PNS_KICAD_IFACE::AddItem ( PNS::ITEM aItem)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 939 of file pns_kicad_iface.cpp.

References SEG::A, SEG::B, EDA_ITEM::ClearFlags(), PNS::VIA::Diameter(), PNS::VIA::Drill(), LAYER_RANGE::End(), PNS::ITEM::Kind(), PNS::ITEM::Layers(), m_board, m_commit, PNS::ITEM::Net(), PNS::VIA::Pos(), PNS::SEGMENT::Seg(), PNS::ITEM::SEGMENT_T, VIA::SetDrill(), TRACK::SetEnd(), BOARD_ITEM::SetLayer(), VIA::SetLayerPair(), BOARD_CONNECTED_ITEM::SetNetCode(), PNS::ITEM::SetParent(), VIA::SetPosition(), TRACK::SetStart(), VIA::SetViaType(), TRACK::SetWidth(), LAYER_RANGE::Start(), ToLAYER_ID(), VIA, PNS::ITEM::VIA_T, PNS::VIA::ViaType(), PNS::SEGMENT::Width(), VECTOR2< T >::x, and VECTOR2< T >::y.

940 {
941  BOARD_CONNECTED_ITEM* newBI = NULL;
942 
943  switch( aItem->Kind() )
944  {
946  {
947  PNS::SEGMENT* seg = static_cast<PNS::SEGMENT*>( aItem );
948  TRACK* track = new TRACK( m_board );
949  const SEG& s = seg->Seg();
950  track->SetStart( wxPoint( s.A.x, s.A.y ) );
951  track->SetEnd( wxPoint( s.B.x, s.B.y ) );
952  track->SetWidth( seg->Width() );
953  track->SetLayer( ToLAYER_ID( seg->Layers().Start() ) );
954  track->SetNetCode( seg->Net() > 0 ? seg->Net() : 0 );
955  newBI = track;
956  break;
957  }
958 
959  case PNS::ITEM::VIA_T:
960  {
961  VIA* via_board = new VIA( m_board );
962  PNS::VIA* via = static_cast<PNS::VIA*>( aItem );
963  via_board->SetPosition( wxPoint( via->Pos().x, via->Pos().y ) );
964  via_board->SetWidth( via->Diameter() );
965  via_board->SetDrill( via->Drill() );
966  via_board->SetNetCode( via->Net() > 0 ? via->Net() : 0 );
967  via_board->SetViaType( via->ViaType() ); // MUST be before SetLayerPair()
968  via_board->SetLayerPair( ToLAYER_ID( via->Layers().Start() ),
969  ToLAYER_ID( via->Layers().End() ) );
970  newBI = via_board;
971  break;
972  }
973 
974  default:
975  break;
976  }
977 
978  if( newBI )
979  {
980  aItem->SetParent( newBI );
981  newBI->ClearFlags();
982 
983  m_commit->Add( newBI );
984  }
985 }
void SetViaType(VIATYPE_T aViaType)
Definition: class_track.h:440
const LAYER_RANGE & Layers() const
Function Layers()
Definition: pns_item.h:207
void SetPosition(const wxPoint &aPoint) override
Definition: class_track.h:412
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
void SetEnd(const wxPoint &aEnd)
Definition: class_track.h:117
int Drill() const
Definition: pns_via.h:120
int Diameter() const
Definition: pns_via.h:109
const VECTOR2I & Pos() const
Definition: pns_via.h:88
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
void SetWidth(int aWidth)
Definition: class_track.h:114
VIATYPE_T ViaType() const
Definition: pns_via.h:99
int End() const
Definition: pns_layerset.h:88
void SetParent(BOARD_CONNECTED_ITEM *aParent)
Function SetParent()
Definition: pns_item.h:147
std::unique_ptr< BOARD_COMMIT > m_commit
bool SetNetCode(int aNetCode, bool aNoAssert=false)
Function SetNetCode sets net using a net code.
void SetLayerPair(PCB_LAYER_ID aTopLayer, PCB_LAYER_ID aBottomLayer)
Function SetLayerPair For a via m_Layer contains the top layer, the other layer is in m_BottomLayer...
int Width() const
Definition: pns_segment.h:88
int Start() const
Definition: pns_layerset.h:83
PnsKind Kind() const
Function Kind()
Definition: pns_item.h:120
Definition: seg.h:37
VECTOR2I A
Definition: seg.h:47
void SetDrill(int aDrill)
Function SetDrill sets the drill value for vias.
Definition: class_track.h:447
int Net() const
Function Net()
Definition: pns_item.h:177
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:254
void SetStart(const wxPoint &aStart)
Definition: class_track.h:120
const SEG & Seg() const
Definition: pns_segment.h:93
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:767
VECTOR2I B
Definition: seg.h:48
void PNS_KICAD_IFACE::Commit ( )
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 988 of file pns_kicad_iface.cpp.

References EraseView(), m_commit, and m_frame.

989 {
990  EraseView();
991  m_commit->Push( wxT( "Added a track" ) );
992  m_commit.reset( new BOARD_COMMIT( m_frame ) );
993 }
std::unique_ptr< BOARD_COMMIT > m_commit
PCB_EDIT_FRAME * m_frame
void EraseView() override
void PNS_KICAD_IFACE::DisplayItem ( const PNS::ITEM aItem,
int  aColor = 0,
int  aClearance = 0 
)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 885 of file pns_kicad_iface.cpp.

References KIGFX::VIEW_GROUP::Add(), DO_NOT_SHOW_CLEARANCE, m_dispOptions, m_previewItems, DISPLAY_OPTIONS::m_ShowTrackClearanceMode, m_view, ROUTER_PREVIEW_ITEM::SetClearance(), ROUTER_PREVIEW_ITEM::SetColor(), SHOW_CLEARANCE_NEW_TRACKS, ROUTER_PREVIEW_ITEM::ShowTrackClearance(), ROUTER_PREVIEW_ITEM::ShowViaClearance(), and KIGFX::VIEW::Update().

886 {
887  wxLogTrace( "PNS", "DisplayItem %p", aItem );
888 
889  ROUTER_PREVIEW_ITEM* pitem = new ROUTER_PREVIEW_ITEM( aItem, m_view );
890 
891  if( aColor >= 0 )
892  pitem->SetColor( KIGFX::COLOR4D( aColor ) );
893 
894  if( aClearance >= 0 )
895  {
896  pitem->SetClearance( aClearance );
897 
898  if( m_dispOptions )
899  {
900  auto clearanceDisp = m_dispOptions->m_ShowTrackClearanceMode;
901  pitem->ShowTrackClearance( clearanceDisp != DO_NOT_SHOW_CLEARANCE );
902  pitem->ShowViaClearance( clearanceDisp != DO_NOT_SHOW_CLEARANCE
903  && clearanceDisp != SHOW_CLEARANCE_NEW_TRACKS );
904  }
905  }
906 
907 
908  m_previewItems->Add( pitem );
910 }
void SetClearance(int aClearance)
void ShowTrackClearance(bool aEnabled)
void ShowViaClearance(bool aEnabled)
KIGFX::VIEW_GROUP * m_previewItems
virtual void Add(VIEW_ITEM *aItem)
Function Add() Adds an item to the group.
Definition: view_group.cpp:55
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1377
void SetColor(const KIGFX::COLOR4D &aColor)
TRACE_CLEARANCE_DISPLAY_MODE_T m_ShowTrackClearanceMode
How trace clearances are displayed.
Definition: pcbstruct.h:74
KIGFX::VIEW * m_view
DISPLAY_OPTIONS * m_dispOptions
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
void PNS_KICAD_IFACE::EraseView ( )
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 867 of file pns_kicad_iface.cpp.

References PNS_PCBNEW_DEBUG_DECORATOR::Clear(), KIGFX::VIEW_GROUP::FreeItems(), m_debugDecorator, m_hiddenItems, m_previewItems, m_view, KIGFX::VIEW::SetVisible(), and KIGFX::VIEW::Update().

Referenced by Commit().

868 {
869  for( auto item : m_hiddenItems )
870  m_view->SetVisible( item, true );
871 
872  m_hiddenItems.clear();
873 
874  if( m_previewItems )
875  {
878  }
879 
880  if( m_debugDecorator )
882 }
PNS_PCBNEW_DEBUG_DECORATOR * m_debugDecorator
std::unordered_set< BOARD_CONNECTED_ITEM * > m_hiddenItems
void FreeItems()
Function FreeItems() Frees all the items that were added to the group.
Definition: view_group.cpp:141
KIGFX::VIEW_GROUP * m_previewItems
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1377
KIGFX::VIEW * m_view
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1323
PNS::DEBUG_DECORATOR * PNS_KICAD_IFACE::GetDebugDecorator ( )
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 463 of file pns_kicad_iface.cpp.

References m_debugDecorator.

464 {
465  return m_debugDecorator;
466 }
PNS_PCBNEW_DEBUG_DECORATOR * m_debugDecorator
PNS::RULE_RESOLVER * PNS_KICAD_IFACE::GetRuleResolver ( )
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 1023 of file pns_kicad_iface.cpp.

References m_ruleResolver.

1024 {
1025  return m_ruleResolver;
1026 }
PNS_PCBNEW_RULE_RESOLVER * m_ruleResolver
void PNS_KICAD_IFACE::HideItem ( PNS::ITEM aItem)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 913 of file pns_kicad_iface.cpp.

References KIGFX::APPEARANCE, KIGFX::VIEW::IsVisible(), m_hiddenItems, m_view, PNS::ITEM::Parent(), KIGFX::VIEW::SetVisible(), and KIGFX::VIEW::Update().

914 {
915  BOARD_CONNECTED_ITEM* parent = aItem->Parent();
916 
917  if( parent )
918  {
919  if( m_view->IsVisible( parent ) )
920  m_hiddenItems.insert( parent );
921 
922  m_view->SetVisible( parent, false );
923  m_view->Update( parent, KIGFX::APPEARANCE );
924  }
925 }
std::unordered_set< BOARD_CONNECTED_ITEM * > m_hiddenItems
No updates are required.
Definition: view_item.h:55
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
void Update(VIEW_ITEM *aItem, int aUpdateFlags)
For dynamic VIEWs, informs the associated VIEW that the graphical representation of this item has cha...
Definition: view.cpp:1377
KIGFX::VIEW * m_view
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1323
bool IsVisible(const VIEW_ITEM *aItem) const
Returns information if the item is visible (or not).
Definition: view.cpp:1363
BOARD_CONNECTED_ITEM * Parent() const
Function Parent()
Definition: pns_item.h:157
void PNS_KICAD_IFACE::RemoveItem ( PNS::ITEM aItem)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 928 of file pns_kicad_iface.cpp.

References m_commit, and PNS::ITEM::Parent().

929 {
930  BOARD_CONNECTED_ITEM* parent = aItem->Parent();
931 
932  if( parent )
933  {
934  m_commit->Remove( parent );
935  }
936 }
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
std::unique_ptr< BOARD_COMMIT > m_commit
BOARD_CONNECTED_ITEM * Parent() const
Function Parent()
Definition: pns_item.h:157
void PNS_KICAD_IFACE::SetBoard ( BOARD aBoard)

Definition at line 814 of file pns_kicad_iface.cpp.

References m_board.

Referenced by PNS::TOOL_BASE::Reset().

815 {
816  m_board = aBoard;
817  wxLogTrace( "PNS", "m_board = %p", m_board );
818 }
void PNS_KICAD_IFACE::SetHostFrame ( PCB_EDIT_FRAME aFrame)

Definition at line 1035 of file pns_kicad_iface.cpp.

References PCB_BASE_FRAME::GetDisplayOptions(), m_commit, m_dispOptions, and m_frame.

Referenced by PNS::TOOL_BASE::Reset().

1036 {
1037  m_frame = aFrame;
1038 
1039  m_commit.reset( new BOARD_COMMIT( m_frame ) );
1041 }
void * GetDisplayOptions() override
Function GetDisplayOptions returns the display options current in use Display options are relative to...
std::unique_ptr< BOARD_COMMIT > m_commit
PCB_EDIT_FRAME * m_frame
Class DISPLAY_OPTIONS handles display options like enable/disable some optional drawings.
Definition: pcbstruct.h:62
DISPLAY_OPTIONS * m_dispOptions
void PNS_KICAD_IFACE::SetRouter ( PNS::ROUTER aRouter)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 1029 of file pns_kicad_iface.cpp.

References m_router.

1030 {
1031  m_router = aRouter;
1032 }
PNS::ROUTER * m_router
void PNS_KICAD_IFACE::SetView ( KIGFX::VIEW aView)

Definition at line 996 of file pns_kicad_iface.cpp.

References KIGFX::VIEW::Add(), KIGFX::VIEW_GROUP::FreeItems(), LAYER_GP_OVERLAY, m_debugDecorator, m_previewItems, m_view, KIGFX::VIEW_GROUP::SetLayer(), and PNS_PCBNEW_DEBUG_DECORATOR::SetView().

Referenced by PNS::TOOL_BASE::Reset().

997 {
998  wxLogTrace( "PNS", "SetView %p", aView );
999 
1000  if( m_previewItems )
1001  {
1003  delete m_previewItems;
1004  }
1005 
1006  m_view = aView;
1010 
1011  delete m_debugDecorator;
1014 }
PNS_PCBNEW_DEBUG_DECORATOR * m_debugDecorator
void FreeItems()
Function FreeItems() Frees all the items that were added to the group.
Definition: view_group.cpp:141
general purpose overlay
KIGFX::VIEW_GROUP * m_previewItems
virtual void SetLayer(int aLayer)
Function SetLayer() Sets layer used to draw the group.
Definition: view_group.h:115
KIGFX::VIEW * m_view
void SetView(KIGFX::VIEW *aView)
void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Function Add() Adds a VIEW_ITEM to the view.
Definition: view.cpp:311
std::unique_ptr< PNS::SOLID > PNS_KICAD_IFACE::syncPad ( D_PAD aPad)
private

Definition at line 496 of file pns_kicad_iface.cpp.

References LSET::AllCuMask(), SHAPE_CONVEX::Append(), SHAPE_POLY_SET::Append(), D_PAD::BasicShapesAsPolygonToBoardPosition(), D_PAD::BuildPadPolygon(), D_PAD::BuildPadShapePolygon(), D_PAD::BuildSegmentFromOvalShape(), SHAPE_POLY_SET::COutline(), SHAPE_LINE_CHAIN::CPoint(), delta, D_PAD::GetAttribute(), D_PAD::GetCustomShapeAsPolygon(), D_PAD::GetLayerSet(), BOARD_CONNECTED_ITEM::GetNetCode(), D_PAD::GetOffset(), D_PAD::GetOrientation(), D_PAD::GetShape(), D_PAD::GetSize(), MAX_CU_LAYERS, min, SHAPE_POLY_SET::Outline(), SHAPE_POLY_SET::OutlineCount(), PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_SHAPE_CIRCLE, PAD_SHAPE_CUSTOM, PAD_SHAPE_OVAL, PAD_SHAPE_RECT, PAD_SHAPE_ROUNDRECT, PAD_SHAPE_TRAPEZOID, SHAPE_LINE_CHAIN::Point(), SHAPE_LINE_CHAIN::PointCount(), RotatePoint(), D_PAD::ShapePos(), wxPoint::x, VECTOR2< T >::x, wxPoint::y, and VECTOR2< T >::y.

Referenced by SyncWorld().

497 {
498  LAYER_RANGE layers( 0, MAX_CU_LAYERS - 1 );
499 
500  // ignore non-copper pads
501  if( ( aPad->GetLayerSet() & LSET::AllCuMask()).none() )
502  return NULL;
503 
504  switch( aPad->GetAttribute() )
505  {
506  case PAD_ATTRIB_STANDARD:
507  break;
508 
509  case PAD_ATTRIB_SMD:
511  case PAD_ATTRIB_CONN:
512  {
513  LSET lmsk = aPad->GetLayerSet();
514  bool is_copper = false;
515 
516  for( int i = 0; i < MAX_CU_LAYERS; i++ )
517  {
518  if( lmsk[i] )
519  {
520  is_copper = true;
521 
523  layers = LAYER_RANGE( i );
524 
525  break;
526  }
527  }
528 
529  if( !is_copper )
530  return NULL;
531  }
532  break;
533 
534  default:
535  wxLogTrace( "PNS", "unsupported pad type 0x%x", aPad->GetAttribute() );
536  return NULL;
537  }
538 
539  std::unique_ptr< PNS::SOLID > solid( new PNS::SOLID );
540 
541  solid->SetLayers( layers );
542  solid->SetNet( aPad->GetNetCode() );
543  solid->SetParent( aPad );
544 
545  wxPoint wx_c = aPad->ShapePos();
546  wxSize wx_sz = aPad->GetSize();
547  wxPoint offset = aPad->GetOffset();
548 
549  VECTOR2I c( wx_c.x, wx_c.y );
550  VECTOR2I sz( wx_sz.x, wx_sz.y );
551 
552  RotatePoint( &offset, aPad->GetOrientation() );
553 
554  solid->SetPos( VECTOR2I( c.x - offset.x, c.y - offset.y ) );
555  solid->SetOffset( VECTOR2I( offset.x, offset.y ) );
556 
557  double orient = aPad->GetOrientation() / 10.0;
558 
559  if( aPad->GetShape() == PAD_SHAPE_CIRCLE )
560  {
561  solid->SetShape( new SHAPE_CIRCLE( c, sz.x / 2 ) );
562  }
563  else
564  {
565  if( orient == 0.0 || orient == 90.0 || orient == 180.0 || orient == 270.0 )
566  {
567  if( orient == 90.0 || orient == 270.0 )
568  sz = VECTOR2I( sz.y, sz.x );
569 
570  switch( aPad->GetShape() )
571  {
572  case PAD_SHAPE_OVAL:
573  if( sz.x == sz.y )
574  solid->SetShape( new SHAPE_CIRCLE( c, sz.x / 2 ) );
575  else
576  {
577  VECTOR2I delta;
578 
579  if( sz.x > sz.y )
580  delta = VECTOR2I( ( sz.x - sz.y ) / 2, 0 );
581  else
582  delta = VECTOR2I( 0, ( sz.y - sz.x ) / 2 );
583 
584  SHAPE_SEGMENT* shape = new SHAPE_SEGMENT( c - delta, c + delta,
585  std::min( sz.x, sz.y ) );
586  solid->SetShape( shape );
587  }
588  break;
589 
590  case PAD_SHAPE_RECT:
591  solid->SetShape( new SHAPE_RECT( c - sz / 2, sz.x, sz.y ) );
592  break;
593 
594  case PAD_SHAPE_TRAPEZOID:
595  {
596  wxPoint coords[4];
597  aPad->BuildPadPolygon( coords, wxSize( 0, 0 ), aPad->GetOrientation() );
598  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
599 
600  for( int ii = 0; ii < 4; ii++ )
601  {
602  shape->Append( wx_c + coords[ii] );
603  }
604 
605  solid->SetShape( shape );
606  break;
607  }
608 
609  case PAD_SHAPE_ROUNDRECT:
610  {
611  SHAPE_POLY_SET outline;
612  const int segmentToCircleCount = 64;
613 
614  aPad->BuildPadShapePolygon( outline, wxSize( 0, 0 ), segmentToCircleCount, 1.0 );
615 
616  // TransformRoundRectToPolygon creates only one convex polygon
617  SHAPE_LINE_CHAIN& poly = outline.Outline( 0 );
618  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
619 
620  for( int ii = 0; ii < poly.PointCount(); ++ii )
621  {
622  shape->Append( wxPoint( poly.Point( ii ).x, poly.Point( ii ).y ) );
623  }
624 
625  solid->SetShape( shape );
626  }
627  break;
628 
629  case PAD_SHAPE_CUSTOM:
630  {
631  SHAPE_POLY_SET outline;
632  outline.Append( aPad->GetCustomShapeAsPolygon() );
633  aPad->BasicShapesAsPolygonToBoardPosition( &outline, wx_c, aPad->GetOrientation() );
634 
635  for( int jj = 0; jj < outline.OutlineCount(); ++jj )
636  {
637  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
638  const SHAPE_LINE_CHAIN& poly = outline.COutline( jj );
639 
640  for( int ii = 0; ii < poly.PointCount(); ii++ )
641  shape->Append( wxPoint( poly.CPoint( ii ).x, poly.CPoint( ii ).y ) );
642 
643  solid->SetShape( shape );
644  }
645 
646  break;
647  }
648 
649  default:
650  wxLogTrace( "PNS", "unsupported pad shape" );
651  return nullptr;
652  }
653  }
654  else
655  {
656  switch( aPad->GetShape() )
657  {
658  // PAD_SHAPE_CIRCLE already handled above
659 
660  case PAD_SHAPE_OVAL:
661  if( sz.x == sz.y )
662  solid->SetShape( new SHAPE_CIRCLE( c, sz.x / 2 ) );
663  else
664  {
665  wxPoint start;
666  wxPoint end;
667  wxPoint corner;
668 
669  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
670 
671  int w = aPad->BuildSegmentFromOvalShape( start, end, 0.0, wxSize( 0, 0 ) );
672 
673  if( start.y == 0 )
674  corner = wxPoint( start.x, -( w / 2 ) );
675  else
676  corner = wxPoint( w / 2, start.y );
677 
678  RotatePoint( &start, aPad->GetOrientation() );
679  RotatePoint( &corner, aPad->GetOrientation() );
680  shape->Append( wx_c + corner );
681 
682  for( int rot = 100; rot <= 1800; rot += 100 )
683  {
684  wxPoint p( corner );
685  RotatePoint( &p, start, rot );
686  shape->Append( wx_c + p );
687  }
688 
689  if( end.y == 0 )
690  corner = wxPoint( end.x, w / 2 );
691  else
692  corner = wxPoint( -( w / 2 ), end.y );
693 
694  RotatePoint( &end, aPad->GetOrientation() );
695  RotatePoint( &corner, aPad->GetOrientation() );
696  shape->Append( wx_c + corner );
697 
698  for( int rot = 100; rot <= 1800; rot += 100 )
699  {
700  wxPoint p( corner );
701  RotatePoint( &p, end, rot );
702  shape->Append( wx_c + p );
703  }
704 
705  solid->SetShape( shape );
706  }
707  break;
708 
709  case PAD_SHAPE_RECT:
710  case PAD_SHAPE_TRAPEZOID:
711  {
712  wxPoint coords[4];
713  aPad->BuildPadPolygon( coords, wxSize( 0, 0 ), aPad->GetOrientation() );
714 
715  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
716  for( int ii = 0; ii < 4; ii++ )
717  {
718  shape->Append( wx_c + coords[ii] );
719  }
720 
721  solid->SetShape( shape );
722  break;
723  }
724 
725  case PAD_SHAPE_ROUNDRECT:
726  {
727  SHAPE_POLY_SET outline;
728  const int segmentToCircleCount = 32;
729  aPad->BuildPadShapePolygon( outline, wxSize( 0, 0 ),
730  segmentToCircleCount, 1.0 );
731 
732  // TransformRoundRectToPolygon creates only one convex polygon
733  SHAPE_LINE_CHAIN& poly = outline.Outline( 0 );
734  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
735 
736  for( int ii = 0; ii < poly.PointCount(); ++ii )
737  {
738  shape->Append( wxPoint( poly.Point( ii ).x, poly.Point( ii ).y ) );
739  }
740 
741  solid->SetShape( shape );
742  break;
743  }
744 
745  case PAD_SHAPE_CUSTOM:
746  {
747  SHAPE_POLY_SET outline;
748  outline.Append( aPad->GetCustomShapeAsPolygon() );
749  aPad->BasicShapesAsPolygonToBoardPosition( &outline, wx_c, aPad->GetOrientation() );
750 
751  for( int jj = 0; jj < outline.OutlineCount(); ++jj )
752  {
753  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
754  const SHAPE_LINE_CHAIN& poly = outline.COutline( jj );
755 
756  for( int ii = 0; ii < poly.PointCount(); ii++ )
757  shape->Append( wxPoint( poly.CPoint( ii ).x, poly.CPoint( ii ).y ) );
758 
759  solid->SetShape( shape );
760  }
761 
762  break;
763  }
764 
765  default:
766  wxLogTrace( "PNS", "unsupported pad shape" );
767  return nullptr;
768  }
769  }
770  }
771  return solid;
772 }
void BasicShapesAsPolygonToBoardPosition(SHAPE_POLY_SET *aMergedPolygon, wxPoint aPosition, double aRotation) const
When created, the corners coordinates are relative to the pad position, orientation 0...
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:639
PAD_ATTR_T GetAttribute() const
Definition: class_pad.h:380
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:65
const SHAPE_POLY_SET & GetCustomShapeAsPolygon() const
Accessor to the custom shape as one polygon.
Definition: class_pad.h:323
void BuildPadPolygon(wxPoint aCoord[4], wxSize aInflateValue, double aRotation) const
Function BuildPadPolygon Has meaning only for polygonal pads (trapezoid and rectangular) Build the Co...
int PointCount() const
Function PointCount()
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:61
Class SHAPE_CONVEX.
Definition: shape_convex.h:42
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:317
int OutlineCount() const
Returns the number of outlines in the set
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:201
static const int delta[8][2]
Definition: solve.cpp:112
void Append(int aX, int aY)
Function Append()
Definition: shape_convex.h:151
Class LSET is a set of PCB_LAYER_IDs.
Class SHAPE_POLY_SET.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Returns the reference to aIndex-th outline in the set
LSET GetLayerSet() const override
Function GetLayerSet returns a "layer mask", which is a bitmap of all layers on which the TRACK segme...
Definition: class_pad.h:377
const wxSize & GetSize() const
Definition: class_pad.h:254
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Like smd, does not appear on the solder paste layer (default) note also has a special attribute in Ge...
Definition: pad_shapes.h:62
int GetNetCode() const
Function GetNetCode.
int BuildSegmentFromOvalShape(wxPoint &aSegStart, wxPoint &aSegEnd, double aRotation, const wxSize &aMargin) const
Function BuildSegmentFromOvalShape Has meaning only for OVAL (and ROUND) pads Build an equivalent seg...
Class SHAPE_LINE_CHAIN.
double GetOrientation() const
Function GetOrientation returns the rotation angle of the pad in tenths of degrees, but soon degrees.
Definition: class_pad.h:357
Usual pad.
Definition: pad_shapes.h:60
void BuildPadShapePolygon(SHAPE_POLY_SET &aCornerBuffer, wxSize aInflateValue, int aSegmentsPerCircle, double aCorrectionFactor) const
Function BuildPadShapePolygon Build the Corner list of the polygonal shape, depending on shape...
wxPoint ShapePos() const
Definition: class_pad.cpp:500
VECTOR2I & Point(int aIndex)
Function Point()
const VECTOR2I & CPoint(int aIndex) const
Function CPoint()
const wxPoint & GetOffset() const
Definition: class_pad.h:263
Class LAYER_RANGE.
Definition: pns_layerset.h:32
#define min(a, b)
Definition: auxiliary.h:85
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) ...
std::unique_ptr< PNS::SEGMENT > PNS_KICAD_IFACE::syncTrack ( TRACK aTrack)
private

Definition at line 775 of file pns_kicad_iface.cpp.

References TRACK::GetEnd(), BOARD_ITEM::GetLayer(), BOARD_CONNECTED_ITEM::GetNetCode(), TRACK::GetStart(), TRACK::GetWidth(), TRACK::IsLocked(), and PNS::MK_LOCKED.

Referenced by SyncWorld().

776 {
777  std::unique_ptr< PNS::SEGMENT > segment(
778  new PNS::SEGMENT( SEG( aTrack->GetStart(), aTrack->GetEnd() ), aTrack->GetNetCode() )
779  );
780 
781  segment->SetWidth( aTrack->GetWidth() );
782  segment->SetLayers( LAYER_RANGE( aTrack->GetLayer() ) );
783  segment->SetParent( aTrack );
784 
785  if( aTrack->IsLocked() )
786  segment->Mark( PNS::MK_LOCKED );
787 
788  return segment;
789 }
bool IsLocked() const override
Function IsLocked.
Definition: class_track.h:136
const wxPoint & GetEnd() const
Definition: class_track.h:118
const wxPoint & GetStart() const
Definition: class_track.h:121
int GetNetCode() const
Function GetNetCode.
Definition: seg.h:37
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
int GetWidth() const
Definition: class_track.h:115
Class LAYER_RANGE.
Definition: pns_layerset.h:32
std::unique_ptr< PNS::VIA > PNS_KICAD_IFACE::syncVia ( VIA aVia)
private

Definition at line 792 of file pns_kicad_iface.cpp.

References VIA::GetDrillValue(), BOARD_CONNECTED_ITEM::GetNetCode(), VIA::GetPosition(), VIA::GetViaType(), TRACK::GetWidth(), TRACK::IsLocked(), VIA::LayerPair(), and PNS::MK_LOCKED.

Referenced by SyncWorld().

793 {
794  PCB_LAYER_ID top, bottom;
795  aVia->LayerPair( &top, &bottom );
796  std::unique_ptr<PNS::VIA> via( new PNS::VIA(
797  aVia->GetPosition(),
798  LAYER_RANGE( top, bottom ),
799  aVia->GetWidth(),
800  aVia->GetDrillValue(),
801  aVia->GetNetCode(),
802  aVia->GetViaType() )
803  );
804 
805  via->SetParent( aVia );
806 
807  if( aVia->IsLocked() )
808  via->Mark( PNS::MK_LOCKED );
809 
810  return via;
811 }
bool IsLocked() const override
Function IsLocked.
Definition: class_track.h:136
PCB_LAYER_ID
A quick note on layer IDs:
VIATYPE_T GetViaType() const
Definition: class_track.h:439
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Function LayerPair Return the 2 layers used by the via (the via actually uses all layers between thes...
int GetNetCode() const
Function GetNetCode.
int GetDrillValue() const
Function GetDrillValue "calculates" the drill value for vias (m-Drill if > 0, or default drill value ...
int GetWidth() const
Definition: class_track.h:115
const wxPoint & GetPosition() const override
Definition: class_track.h:411
Class LAYER_RANGE.
Definition: pns_layerset.h:32
void PNS_KICAD_IFACE::SyncWorld ( PNS::NODE aWorld)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 821 of file pns_kicad_iface.cpp.

References PNS::NODE::Add(), BOARD_DESIGN_SETTINGS::GetBiggestClearanceValue(), BOARD::GetDesignSettings(), m_board, BOARD::m_Modules, m_router, m_ruleResolver, BOARD::m_Track, TRACK::Next(), MODULE::Next(), D_PAD::Next(), PCB_TRACE_T, PCB_VIA_T, PNS::NODE::SetMaxClearance(), PNS::NODE::SetRuleResolver(), syncPad(), syncTrack(), and syncVia().

822 {
823  if( !m_board )
824  {
825  wxLogTrace( "PNS", "No board attached, aborting sync." );
826  return;
827  }
828 
829  for( MODULE* module = m_board->m_Modules; module; module = module->Next() )
830  {
831  for( D_PAD* pad = module->PadsList(); pad; pad = pad->Next() )
832  {
833  std::unique_ptr< PNS::SOLID > solid = syncPad( pad );
834 
835  if( solid )
836  aWorld->Add( std::move( solid ) );
837  }
838  }
839 
840  for( TRACK* t = m_board->m_Track; t; t = t->Next() )
841  {
842  KICAD_T type = t->Type();
843 
844  if( type == PCB_TRACE_T ) {
845  std::unique_ptr< PNS::SEGMENT > segment = syncTrack( t );
846  if( segment ) {
847  aWorld->Add( std::move( segment ) );
848  }
849  } else if( type == PCB_VIA_T ) {
850  std::unique_ptr< PNS::VIA > via = syncVia( static_cast<VIA*>( t ) );
851  if( via ) {
852  aWorld->Add( std::move( via ) );
853  }
854  }
855  }
856 
857  int worstClearance = m_board->GetDesignSettings().GetBiggestClearanceValue();
858 
859  delete m_ruleResolver;
861 
862  aWorld->SetRuleResolver( m_ruleResolver );
863  aWorld->SetMaxClearance( 4 * worstClearance );
864 }
int GetBiggestClearanceValue()
Function GetBiggestClearanceValue.
std::unique_ptr< PNS::SOLID > syncPad(D_PAD *aPad)
MODULE * Next() const
Definition: class_module.h:100
std::unique_ptr< PNS::SEGMENT > syncTrack(TRACK *aTrack)
void SetRuleResolver(RULE_RESOLVER *aFunc)
Assigns a clerance resolution function object
Definition: pns_node.h:163
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:90
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:107
void SetMaxClearance(int aClearance)
Sets the worst-case clerance between any pair of items
Definition: pns_node.h:157
D_PAD * Next() const
Definition: class_pad.h:145
PNS_PCBNEW_RULE_RESOLVER * m_ruleResolver
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:532
PNS::ROUTER * m_router
TRACK * Next() const
Definition: class_track.h:98
DLIST< MODULE > m_Modules
Definition: class_board.h:245
std::unique_ptr< PNS::VIA > syncVia(VIA *aVia)
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:108
DLIST< TRACK > m_Track
Definition: class_board.h:246
void Add(std::unique_ptr< SEGMENT > aSegment, bool aAllowRedundant=false)
Function Add()
Definition: pns_node.cpp:596
void PNS_KICAD_IFACE::UpdateNet ( int  aNetCode)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 1017 of file pns_kicad_iface.cpp.

1018 {
1019  wxLogTrace( "PNS", "Update-net %d", aNetCode );
1020 }

Member Data Documentation

BOARD* PNS_KICAD_IFACE::m_board
private

Definition at line 78 of file pns_kicad_iface.h.

Referenced by AddItem(), PNS_KICAD_IFACE(), SetBoard(), and SyncWorld().

std::unique_ptr<BOARD_COMMIT> PNS_KICAD_IFACE::m_commit
private

Definition at line 80 of file pns_kicad_iface.h.

Referenced by AddItem(), Commit(), RemoveItem(), and SetHostFrame().

PNS_PCBNEW_DEBUG_DECORATOR* PNS_KICAD_IFACE::m_debugDecorator
private
DISPLAY_OPTIONS* PNS_KICAD_IFACE::m_dispOptions
private

Definition at line 81 of file pns_kicad_iface.h.

Referenced by DisplayItem(), PNS_KICAD_IFACE(), and SetHostFrame().

PCB_EDIT_FRAME* PNS_KICAD_IFACE::m_frame
private

Definition at line 79 of file pns_kicad_iface.h.

Referenced by Commit(), PNS_KICAD_IFACE(), and SetHostFrame().

std::unordered_set<BOARD_CONNECTED_ITEM*> PNS_KICAD_IFACE::m_hiddenItems
private

Definition at line 74 of file pns_kicad_iface.h.

Referenced by EraseView(), and HideItem().

KIGFX::VIEW_GROUP* PNS_KICAD_IFACE::m_previewItems
private

Definition at line 73 of file pns_kicad_iface.h.

Referenced by DisplayItem(), EraseView(), PNS_KICAD_IFACE(), SetView(), and ~PNS_KICAD_IFACE().

PNS::ROUTER* PNS_KICAD_IFACE::m_router
private

Definition at line 77 of file pns_kicad_iface.h.

Referenced by PNS_KICAD_IFACE(), SetRouter(), and SyncWorld().

PNS_PCBNEW_RULE_RESOLVER* PNS_KICAD_IFACE::m_ruleResolver
private

Definition at line 65 of file pns_kicad_iface.h.

Referenced by GetRuleResolver(), PNS_KICAD_IFACE(), SyncWorld(), and ~PNS_KICAD_IFACE().

KIGFX::VIEW* PNS_KICAD_IFACE::m_view
private

Definition at line 72 of file pns_kicad_iface.h.

Referenced by DisplayItem(), EraseView(), HideItem(), PNS_KICAD_IFACE(), and SetView().

PNS::NODE* PNS_KICAD_IFACE::m_world
private

Definition at line 76 of file pns_kicad_iface.h.

Referenced by PNS_KICAD_IFACE().


The documentation for this class was generated from the following files: