From 5ee89b41ace4df414b79cdfd59750dac7b653c28 Mon Sep 17 00:00:00 2001 From: Roberto Fernandez Bautista Date: Wed, 3 Jan 2024 20:57:27 +0100 Subject: [PATCH] CADSTAR PCB: Handle multi-layer figures & fix multi-layer mapping Fixes https://gitlab.com/kicad/code/kicad/-/issues/16515 --- .../cadstar/cadstar_pcb_archive_loader.cpp | 48 ++++++++++++------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/pcbnew/plugins/cadstar/cadstar_pcb_archive_loader.cpp b/pcbnew/plugins/cadstar/cadstar_pcb_archive_loader.cpp index f84c027379..45da79aedd 100644 --- a/pcbnew/plugins/cadstar/cadstar_pcb_archive_loader.cpp +++ b/pcbnew/plugins/cadstar/cadstar_pcb_archive_loader.cpp @@ -787,13 +787,17 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadLibraryFigures( const SYMDEF_PCB& aComponen { FIGURE& fig = figPair.second; - drawCadstarShape( fig.Shape, getKiCadLayer( fig.LayerID ), - getLineThickness( fig.LineCodeID ), - wxString::Format( wxT( "Component %s:%s -> Figure %s" ), - aComponent.ReferenceName, - aComponent.Alternate, - fig.ID ), - aFootprint ); + for( const PCB_LAYER_ID& layer : getKiCadLayerSet( fig.LayerID ).Seq() ) + { + drawCadstarShape( fig.Shape, + layer, + getLineThickness( fig.LineCodeID ), + wxString::Format( wxT( "Component %s:%s -> Figure %s" ), + aComponent.ReferenceName, + aComponent.Alternate, + fig.ID ), + aFootprint ); + } } } @@ -1380,10 +1384,15 @@ void CADSTAR_PCB_ARCHIVE_LOADER::loadFigures() for( std::pair figPair : Layout.Figures ) { FIGURE& fig = figPair.second; - drawCadstarShape( fig.Shape, getKiCadLayer( fig.LayerID ), - getLineThickness( fig.LineCodeID ), - wxString::Format( wxT( "FIGURE %s" ), fig.ID ), - m_board, fig.GroupID ); + + for( const PCB_LAYER_ID& layer : getKiCadLayerSet( fig.LayerID ).Seq() ) + { + drawCadstarShape( fig.Shape, + layer, + getLineThickness( fig.LineCodeID ), + wxString::Format( wxT( "FIGURE %s" ), fig.ID ), + m_board, fig.GroupID ); + } //TODO process "swaprule" (doesn't seem to apply to Layout Figures?) //TODO process re-use block when KiCad Supports it @@ -4166,16 +4175,23 @@ LSET CADSTAR_PCB_ARCHIVE_LOADER::getKiCadLayerSet( const LAYER_ID& aCadstarLayer switch( layerType ) { case LAYER_TYPE::ALLDOC: - return LSET( 4, PCB_LAYER_ID::Dwgs_User, PCB_LAYER_ID::Cmts_User, PCB_LAYER_ID::Eco1_User, - PCB_LAYER_ID::Eco2_User ); + return LSET( 4, PCB_LAYER_ID::Dwgs_User, + PCB_LAYER_ID::Cmts_User, + PCB_LAYER_ID::Eco1_User, + PCB_LAYER_ID::Eco2_User ) + | LSET::UserDefinedLayers(); case LAYER_TYPE::ALLELEC: return LSET::AllCuMask( m_numCopperLayers ); case LAYER_TYPE::ALLLAYER: - return LSET::AllLayersMask() - ^ ( LSET::AllCuMask( m_numCopperLayers ) ^ LSET::AllCuMask( MAX_CU_LAYERS ) ) - ^ ( LSET( PCB_LAYER_ID::Rescue ) ); + return LSET::AllCuMask( m_numCopperLayers ) + | LSET( 4, PCB_LAYER_ID::Dwgs_User, + PCB_LAYER_ID::Cmts_User, + PCB_LAYER_ID::Eco1_User, + PCB_LAYER_ID::Eco2_User ) + | LSET::UserDefinedLayers() + | LSET::AllBoardTechMask(); default: return LSET( getKiCadLayer( aCadstarLayerID ) );