KiCad PCB EDA Suite
lset.cpp File Reference
#include <stdarg.h>
#include <assert.h>
#include <layers_id_colors_and_visibility.h>
#include <class_board.h>

Go to the source code of this file.

Functions

PCB_LAYER_ID FlipLayer (PCB_LAYER_ID aLayerId, int aCopperLayersCount)
 Function FlippedLayerNumber. More...
 
LSET FlipLayerMask (LSET aMask, int aCopperLayersCount)
 Calculate the mask layer when flipping a footprint BACK and FRONT copper layers, mask, paste, solder layers are swapped internal layers are flipped only if the copper layers count is known. More...
 
PCB_LAYER_ID ToLAYER_ID (int aLayer)
 

Function Documentation

PCB_LAYER_ID FlipLayer ( PCB_LAYER_ID  aLayerId,
int  aCopperLayersCount = 0 
)

Function FlippedLayerNumber.

Returns
the layer number after flipping an item some (not all) layers: external copper, and paired layers( Mask, Paste, solder ... ) are swapped between front and back sides internal layers are flipped only if the copper layers count is known
Parameters
aLayerId= the PCB_LAYER_ID to flip
aCopperLayersCount= the number of copper layers. if 0 (in fact if < 4 ) internal layers will be not flipped because the layer count is not known

Definition at line 475 of file lset.cpp.

References B_Adhes, B_CrtYd, B_Cu, B_Fab, B_Mask, B_Paste, B_SilkS, F_Adhes, F_CrtYd, F_Cu, F_Fab, F_Mask, F_Paste, F_SilkS, In1_Cu, and IsCopperLayer().

Referenced by PCAD2KICAD::PCB_MODULE::AddToBoard(), PCAD2KICAD::PCB_PAD::Flip(), PCAD2KICAD::PCB_LINE::Flip(), PCAD2KICAD::PCB_ARC::Flip(), PCAD2KICAD::PCB_POLYGON::Flip(), TEXTE_PCB::Flip(), PCB_TARGET::Flip(), EDGE_MODULE::Flip(), TEXTE_MODULE::Flip(), TRACK::Flip(), DIMENSION::Flip(), MODULE::Flip(), DRAWSEGMENT::Flip(), ZONE_CONTAINER::Flip(), VIA::Flip(), and IsBackLayer().

476 {
477  switch( aLayerId )
478  {
479  case B_Cu: return F_Cu;
480  case F_Cu: return B_Cu;
481 
482  case B_SilkS: return F_SilkS;
483  case F_SilkS: return B_SilkS;
484 
485  case B_Adhes: return F_Adhes;
486  case F_Adhes: return B_Adhes;
487 
488  case B_Mask: return F_Mask;
489  case F_Mask: return B_Mask;
490 
491  case B_Paste: return F_Paste;
492  case F_Paste: return B_Paste;
493 
494  case B_CrtYd: return F_CrtYd;
495  case F_CrtYd: return B_CrtYd;
496 
497  case B_Fab: return F_Fab;
498  case F_Fab: return B_Fab;
499 
500  default: // change internal layer if aCopperLayersCount is >= 4
501  if( IsCopperLayer( aLayerId ) && aCopperLayersCount >= 4 )
502  {
503  // internal copper layers count is aCopperLayersCount-2
504  PCB_LAYER_ID fliplayer = PCB_LAYER_ID(aCopperLayersCount - 2 - ( aLayerId - In1_Cu ) );
505  // Ensure fliplayer has a value which does not crash pcbnew:
506  if( fliplayer < F_Cu )
507  fliplayer = F_Cu;
508 
509  if( fliplayer > B_Cu )
510  fliplayer = B_Cu;
511 
512  return fliplayer;
513  }
514 
515  // No change for the other layers
516  return aLayerId;
517  }
518 }
PCB_LAYER_ID
A quick note on layer IDs:
bool IsCopperLayer(LAYER_NUM aLayerId)
Function IsCopperLayer tests whether a layer is a copper layer.
LSET FlipLayerMask ( LSET  aMask,
int  aCopperLayersCount = 0 
)

Calculate the mask layer when flipping a footprint BACK and FRONT copper layers, mask, paste, solder layers are swapped internal layers are flipped only if the copper layers count is known.

Parameters
aMask= the LSET to flip
aCopperLayersCount= the number of copper layers. if 0 (in fact if < 4 ) internal layers will be not flipped because the layer count is not known

Definition at line 521 of file lset.cpp.

References B_Adhes, B_CrtYd, B_Cu, B_Fab, B_Mask, B_Paste, B_SilkS, F_Adhes, F_CrtYd, F_Cu, F_Fab, F_Mask, F_Paste, F_SilkS, In1_Cu, and LSET::InternalCuMask().

Referenced by D_PAD::Flip(), ZONE_CONTAINER::Flip(), DIALOG_PAD_PROPERTIES::initValues(), IsBackLayer(), and DIALOG_PAD_PROPERTIES::TransferDataFromWindow().

522 {
523  // layers on physical outside of a board:
524  const static LSET and_mask( 16, // !! update count
525  B_Cu, F_Cu,
526  B_SilkS, F_SilkS,
527  B_Adhes, F_Adhes,
528  B_Mask, F_Mask,
529  B_Paste, F_Paste,
530  B_Adhes, F_Adhes,
531  B_CrtYd, F_CrtYd,
532  B_Fab, F_Fab
533  );
534 
535  LSET newMask = aMask & ~and_mask;
536 
537  if( aMask[B_Cu] )
538  newMask.set( F_Cu );
539 
540  if( aMask[F_Cu] )
541  newMask.set( B_Cu );
542 
543  if( aMask[B_SilkS] )
544  newMask.set( F_SilkS );
545 
546  if( aMask[F_SilkS] )
547  newMask.set( B_SilkS );
548 
549  if( aMask[B_Adhes] )
550  newMask.set( F_Adhes );
551 
552  if( aMask[F_Adhes] )
553  newMask.set( B_Adhes );
554 
555  if( aMask[B_Mask] )
556  newMask.set( F_Mask );
557 
558  if( aMask[F_Mask] )
559  newMask.set( B_Mask );
560 
561  if( aMask[B_Paste] )
562  newMask.set( F_Paste );
563 
564  if( aMask[F_Paste] )
565  newMask.set( B_Paste );
566 
567  if( aMask[B_Adhes] )
568  newMask.set( F_Adhes );
569 
570  if( aMask[F_Adhes] )
571  newMask.set( B_Adhes );
572 
573  if( aMask[B_CrtYd] )
574  newMask.set( F_CrtYd );
575 
576  if( aMask[F_CrtYd] )
577  newMask.set( B_CrtYd );
578 
579  if( aMask[B_Fab] )
580  newMask.set( F_Fab );
581 
582  if( aMask[F_Fab] )
583  newMask.set( B_Fab );
584 
585  if( aCopperLayersCount >= 4 ) // Internal layers exist
586  {
587  LSET internalMask = aMask & LSET::InternalCuMask();
588 
589  if( internalMask != LSET::InternalCuMask() )
590  {
591  // the mask does not include all internal layers. Therefore
592  // the flipped mask for internal copper layers must be built
593  int innerLayerCnt = aCopperLayersCount -2;
594 
595  // the flipped mask is the innerLayerCnt bits rewritten in reverse order
596  // ( bits innerLayerCnt to 1 rewritten in bits 1 to innerLayerCnt )
597  for( int ii = 0; ii < innerLayerCnt; ii++ )
598  {
599  if( internalMask[innerLayerCnt - ii] )
600  {
601  newMask.set( ii + In1_Cu );
602  }
603  else
604  {
605  newMask.reset( ii + In1_Cu );
606  }
607  }
608  }
609  }
610 
611  return newMask;
612 }
Class LSET is a set of PCB_LAYER_IDs.
static LSET InternalCuMask()
Function InternalCuMask() returns a complete set of internal copper layers, which is all Cu layers ex...
Definition: lset.cpp:636
PCB_LAYER_ID ToLAYER_ID ( int  aLayer)

Definition at line 813 of file lset.cpp.

References GAL_LAYER_ID_END.

Referenced by DIALOG_GLOBAL_DELETION::AcceptPcbDelete(), PNS_KICAD_IFACE::AddItem(), GRID_CELL_LAYER_SELECTOR::BeginEdit(), BOARD::BOARD(), DSN::SPECCTRA_DB::buildLayerMaps(), CINFO3D_VISU::createLayers(), PCB_BASE_FRAME::CreateNewModule(), GRID_CELL_LAYER_RENDERER::Draw(), DRAWING_TOOL::DrawVia(), GENDRILL_WRITER_BASE::GenDrillReportFile(), GetGerberFileFunctionAttribute(), BOARD::GetLayerID(), PCB_LAYER_SELECTOR::GetLayerName(), PCB_LAYER_BOX_SELECTOR::GetLayerName(), GRID_CELL_LAYER_SELECTOR::GetValue(), IsDCodeLayer(), PCB_LAYER_BOX_SELECTOR::IsLayerEnabled(), PCBNEW_CONTROL::LayerNext(), PCBNEW_CONTROL::LayerPrev(), PCAD2KICAD::PCB::MapLayer(), PCB_EDIT_FRAME::OnHotKey(), PCB_LAYER_WIDGET::OnLayerSelect(), DIALOG_KEEPOUT_AREA_PROPERTIES::OnLayerSelection(), DIALOG_NON_COPPER_ZONES_EDITOR::OnLayerSelection(), DIALOG_COPPER_ZONE::OnLayerSelection(), PCB_LAYER_WIDGET::onPopupSelection(), PLOT_CONTROLLER::OpenPlotfile(), PCB_EDIT_FRAME::Other_Layer_Route(), ROUTER_TOOL::performRouting(), LENGTH_TUNER_TOOL::performTuning(), PLOT_CONTROLLER::PlotLayer(), ROUTER_TOOL::prepareInteractive(), PCB_EDIT_FRAME::Process_Special_Functions(), DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::processItem(), DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem(), PCB_BASE_FRAME::SelectLayer(), DIALOG_GLOBAL_DELETION::SetCurrentLayer(), TEXT_MOD_GRID_TABLE::SetValueAsLong(), ROUTER_TOOL::switchLayerOnViaPlacement(), PCB_LAYER_WIDGET::SyncLayerAlphaIndicators(), PCB_LAYER_WIDGET::SyncLayerVisibilities(), DIALOG_TEXT_PROPERTIES::TransferDataFromWindow(), and DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow().

814 {
815  wxASSERT( aLayer < GAL_LAYER_ID_END );
816  return PCB_LAYER_ID( aLayer );
817 }
Add new GAL layers here.
PCB_LAYER_ID
A quick note on layer IDs: