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 899 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.

900 {
901  BOARD_CONNECTED_ITEM* newBI = NULL;
902 
903  switch( aItem->Kind() )
904  {
906  {
907  PNS::SEGMENT* seg = static_cast<PNS::SEGMENT*>( aItem );
908  TRACK* track = new TRACK( m_board );
909  const SEG& s = seg->Seg();
910  track->SetStart( wxPoint( s.A.x, s.A.y ) );
911  track->SetEnd( wxPoint( s.B.x, s.B.y ) );
912  track->SetWidth( seg->Width() );
913  track->SetLayer( ToLAYER_ID( seg->Layers().Start() ) );
914  track->SetNetCode( seg->Net() > 0 ? seg->Net() : 0 );
915  newBI = track;
916  break;
917  }
918 
919  case PNS::ITEM::VIA_T:
920  {
921  VIA* via_board = new VIA( m_board );
922  PNS::VIA* via = static_cast<PNS::VIA*>( aItem );
923  via_board->SetPosition( wxPoint( via->Pos().x, via->Pos().y ) );
924  via_board->SetWidth( via->Diameter() );
925  via_board->SetDrill( via->Drill() );
926  via_board->SetNetCode( via->Net() > 0 ? via->Net() : 0 );
927  via_board->SetViaType( via->ViaType() ); // MUST be before SetLayerPair()
928  via_board->SetLayerPair( ToLAYER_ID( via->Layers().Start() ),
929  ToLAYER_ID( via->Layers().End() ) );
930  newBI = via_board;
931  break;
932  }
933 
934  default:
935  break;
936  }
937 
938  if( newBI )
939  {
940  aItem->SetParent( newBI );
941  newBI->ClearFlags();
942 
943  m_commit->Add( newBI );
944  }
945 }
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 948 of file pns_kicad_iface.cpp.

References EraseView(), m_commit, and m_frame.

949 {
950  EraseView();
951  m_commit->Push( wxT( "Added a track" ) );
952  m_commit.reset( new BOARD_COMMIT( m_frame ) );
953 }
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 845 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().

846 {
847  wxLogTrace( "PNS", "DisplayItem %p", aItem );
848 
849  ROUTER_PREVIEW_ITEM* pitem = new ROUTER_PREVIEW_ITEM( aItem, m_view );
850 
851  if( aColor >= 0 )
852  pitem->SetColor( KIGFX::COLOR4D( aColor ) );
853 
854  if( aClearance >= 0 )
855  {
856  pitem->SetClearance( aClearance );
857 
858  if( m_dispOptions )
859  {
860  auto clearanceDisp = m_dispOptions->m_ShowTrackClearanceMode;
861  pitem->ShowTrackClearance( clearanceDisp != DO_NOT_SHOW_CLEARANCE );
862  pitem->ShowViaClearance( clearanceDisp != DO_NOT_SHOW_CLEARANCE
863  && clearanceDisp != SHOW_CLEARANCE_NEW_TRACKS );
864  }
865  }
866 
867 
868  m_previewItems->Add( pitem );
870 }
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:1389
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 827 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().

828 {
829  for( auto item : m_hiddenItems )
830  m_view->SetVisible( item, true );
831 
832  m_hiddenItems.clear();
833 
834  if( m_previewItems )
835  {
838  }
839 
840  if( m_debugDecorator )
842 }
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:1389
KIGFX::VIEW * m_view
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1335
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 983 of file pns_kicad_iface.cpp.

References m_ruleResolver.

984 {
985  return m_ruleResolver;
986 }
PNS_PCBNEW_RULE_RESOLVER * m_ruleResolver
void PNS_KICAD_IFACE::HideItem ( PNS::ITEM aItem)
overridevirtual

Implements PNS::ROUTER_IFACE.

Definition at line 873 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().

874 {
875  BOARD_CONNECTED_ITEM* parent = aItem->Parent();
876 
877  if( parent )
878  {
879  if( m_view->IsVisible( parent ) )
880  m_hiddenItems.insert( parent );
881 
882  m_view->SetVisible( parent, false );
883  m_view->Update( parent, KIGFX::APPEARANCE );
884  }
885 }
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:1389
KIGFX::VIEW * m_view
void SetVisible(VIEW_ITEM *aItem, bool aIsVisible=true)
Sets the item visibility.
Definition: view.cpp:1335
bool IsVisible(const VIEW_ITEM *aItem) const
Returns information if the item is visible (or not).
Definition: view.cpp:1375
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 888 of file pns_kicad_iface.cpp.

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

889 {
890  BOARD_CONNECTED_ITEM* parent = aItem->Parent();
891 
892  if( parent )
893  {
894  m_commit->Remove( parent );
895  }
896 }
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 774 of file pns_kicad_iface.cpp.

References m_board.

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

775 {
776  m_board = aBoard;
777  wxLogTrace( "PNS", "m_board = %p", m_board );
778 }
void PNS_KICAD_IFACE::SetHostFrame ( PCB_EDIT_FRAME aFrame)

Definition at line 995 of file pns_kicad_iface.cpp.

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

996 {
997  m_frame = aFrame;
998 
999  m_commit.reset( new BOARD_COMMIT( m_frame ) );
1001 }
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 989 of file pns_kicad_iface.cpp.

References m_router.

990 {
991  m_router = aRouter;
992 }
PNS::ROUTER * m_router
void PNS_KICAD_IFACE::SetView ( KIGFX::VIEW aView)

Definition at line 956 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().

957 {
958  wxLogTrace( "PNS", "SetView %p", aView );
959 
960  if( m_previewItems )
961  {
963  delete m_previewItems;
964  }
965 
966  m_view = aView;
970 
971  delete m_debugDecorator;
974 }
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(), D_PAD::BuildPadPolygon(), D_PAD::BuildPadShapePolygon(), D_PAD::BuildSegmentFromOvalShape(), delta, D_PAD::GetAttribute(), 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(), PAD_ATTRIB_CONN, PAD_ATTRIB_HOLE_NOT_PLATED, PAD_ATTRIB_SMD, PAD_ATTRIB_STANDARD, PAD_SHAPE_CIRCLE, 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  default:
630  wxLogTrace( "PNS", "unsupported pad shape" );
631  return nullptr;
632  }
633  }
634  else
635  {
636  switch( aPad->GetShape() )
637  {
638  // PAD_SHAPE_CIRCLE already handled above
639 
640  case PAD_SHAPE_OVAL:
641  if( sz.x == sz.y )
642  solid->SetShape( new SHAPE_CIRCLE( c, sz.x / 2 ) );
643  else
644  {
645  wxPoint start;
646  wxPoint end;
647  wxPoint corner;
648 
649  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
650 
651  int w = aPad->BuildSegmentFromOvalShape( start, end, 0.0, wxSize( 0, 0 ) );
652 
653  if( start.y == 0 )
654  corner = wxPoint( start.x, -( w / 2 ) );
655  else
656  corner = wxPoint( w / 2, start.y );
657 
658  RotatePoint( &start, aPad->GetOrientation() );
659  RotatePoint( &corner, aPad->GetOrientation() );
660  shape->Append( wx_c + corner );
661 
662  for( int rot = 100; rot <= 1800; rot += 100 )
663  {
664  wxPoint p( corner );
665  RotatePoint( &p, start, rot );
666  shape->Append( wx_c + p );
667  }
668 
669  if( end.y == 0 )
670  corner = wxPoint( end.x, w / 2 );
671  else
672  corner = wxPoint( -( w / 2 ), end.y );
673 
674  RotatePoint( &end, aPad->GetOrientation() );
675  RotatePoint( &corner, aPad->GetOrientation() );
676  shape->Append( wx_c + corner );
677 
678  for( int rot = 100; rot <= 1800; rot += 100 )
679  {
680  wxPoint p( corner );
681  RotatePoint( &p, end, rot );
682  shape->Append( wx_c + p );
683  }
684 
685  solid->SetShape( shape );
686  }
687  break;
688 
689  case PAD_SHAPE_RECT:
690  case PAD_SHAPE_TRAPEZOID:
691  {
692  wxPoint coords[4];
693  aPad->BuildPadPolygon( coords, wxSize( 0, 0 ), aPad->GetOrientation() );
694 
695  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
696  for( int ii = 0; ii < 4; ii++ )
697  {
698  shape->Append( wx_c + coords[ii] );
699  }
700 
701  solid->SetShape( shape );
702  break;
703  }
704 
705  case PAD_SHAPE_ROUNDRECT:
706  {
707  SHAPE_POLY_SET outline;
708  const int segmentToCircleCount = 32;
709  aPad->BuildPadShapePolygon( outline, wxSize( 0, 0 ),
710  segmentToCircleCount, 1.0 );
711 
712  // TransformRoundRectToPolygon creates only one convex polygon
713  SHAPE_LINE_CHAIN& poly = outline.Outline( 0 );
714  SHAPE_CONVEX* shape = new SHAPE_CONVEX();
715 
716  for( int ii = 0; ii < poly.PointCount(); ++ii )
717  {
718  shape->Append( wxPoint( poly.Point( ii ).x, poly.Point( ii ).y ) );
719  }
720 
721  solid->SetShape( shape );
722  break;
723  }
724 
725  default:
726  wxLogTrace( "PNS", "unsupported pad shape" );
727  return nullptr;
728  }
729  }
730  }
731  return solid;
732 }
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:238
like PAD_STANDARD, but not plated mechanical use only, no connection allowed
Definition: pad_shapes.h:63
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:59
Class SHAPE_CONVEX.
Definition: shape_convex.h:42
void RotatePoint(int *pX, int *pY, double angle)
Definition: trigo.cpp:317
VECTOR2< int > VECTOR2I
Definition: vector2d.h:590
PAD_SHAPE_T GetShape() const
Function GetShape.
Definition: class_pad.h:166
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:235
const wxSize & GetSize() const
Definition: class_pad.h:182
Like smd, does not appear on the solder paste layer (default) note also has a special attribute in Ge...
Definition: pad_shapes.h:60
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:214
Usual pad.
Definition: pad_shapes.h:58
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:418
VECTOR2I & Point(int aIndex)
Function Point()
const wxPoint & GetOffset() const
Definition: class_pad.h:191
Class LAYER_RANGE.
Definition: pns_layerset.h:32
#define min(a, b)
Definition: auxiliary.h:85
std::unique_ptr< PNS::SEGMENT > PNS_KICAD_IFACE::syncTrack ( TRACK aTrack)
private

Definition at line 735 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().

736 {
737  std::unique_ptr< PNS::SEGMENT > segment(
738  new PNS::SEGMENT( SEG( aTrack->GetStart(), aTrack->GetEnd() ), aTrack->GetNetCode() )
739  );
740 
741  segment->SetWidth( aTrack->GetWidth() );
742  segment->SetLayers( LAYER_RANGE( aTrack->GetLayer() ) );
743  segment->SetParent( aTrack );
744 
745  if( aTrack->IsLocked() )
746  segment->Mark( PNS::MK_LOCKED );
747 
748  return segment;
749 }
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 752 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().

753 {
754  PCB_LAYER_ID top, bottom;
755  aVia->LayerPair( &top, &bottom );
756  std::unique_ptr<PNS::VIA> via( new PNS::VIA(
757  aVia->GetPosition(),
758  LAYER_RANGE( top, bottom ),
759  aVia->GetWidth(),
760  aVia->GetDrillValue(),
761  aVia->GetNetCode(),
762  aVia->GetViaType() )
763  );
764 
765  via->SetParent( aVia );
766 
767  if( aVia->IsLocked() )
768  via->Mark( PNS::MK_LOCKED );
769 
770  return via;
771 }
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 781 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().

782 {
783  if( !m_board )
784  {
785  wxLogTrace( "PNS", "No board attached, aborting sync." );
786  return;
787  }
788 
789  for( MODULE* module = m_board->m_Modules; module; module = module->Next() )
790  {
791  for( D_PAD* pad = module->PadsList(); pad; pad = pad->Next() )
792  {
793  std::unique_ptr< PNS::SOLID > solid = syncPad( pad );
794 
795  if( solid )
796  aWorld->Add( std::move( solid ) );
797  }
798  }
799 
800  for( TRACK* t = m_board->m_Track; t; t = t->Next() )
801  {
802  KICAD_T type = t->Type();
803 
804  if( type == PCB_TRACE_T ) {
805  std::unique_ptr< PNS::SEGMENT > segment = syncTrack( t );
806  if( segment ) {
807  aWorld->Add( std::move( segment ) );
808  }
809  } else if( type == PCB_VIA_T ) {
810  std::unique_ptr< PNS::VIA > via = syncVia( static_cast<VIA*>( t ) );
811  if( via ) {
812  aWorld->Add( std::move( via ) );
813  }
814  }
815  }
816 
817  int worstClearance = m_board->GetDesignSettings().GetBiggestClearanceValue();
818 
819  delete m_ruleResolver;
821 
822  aWorld->SetRuleResolver( m_ruleResolver );
823  aWorld->SetMaxClearance( 4 * worstClearance );
824 }
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:106
PNS_PCBNEW_RULE_RESOLVER * m_ruleResolver
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Function GetDesignSettings.
Definition: class_board.h:533
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 977 of file pns_kicad_iface.cpp.

978 {
979  wxLogTrace( "PNS", "Update-net %d", aNetCode );
980 }

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: