From 38b54b62e08fcacd4c27706b4bbdf23a50837b8c Mon Sep 17 00:00:00 2001 From: Bevan Weiss Date: Mon, 31 Oct 2022 22:01:09 +1100 Subject: [PATCH] Fixes ability for Export to PCB new to handle plain Gerber drill files (gbr). In addition to Excellon. Also fixes issue with layer mapping dialogue text colors not updating on selection. Signed-off-by: Bevan Weiss --- .../dialogs/dialog_layers_select_to_pcb.cpp | 10 +++++++++- gerbview/export_to_pcbnew.cpp | 20 ++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/gerbview/dialogs/dialog_layers_select_to_pcb.cpp b/gerbview/dialogs/dialog_layers_select_to_pcb.cpp index f7753e58ca..370f10c5a6 100644 --- a/gerbview/dialogs/dialog_layers_select_to_pcb.cpp +++ b/gerbview/dialogs/dialog_layers_select_to_pcb.cpp @@ -229,7 +229,7 @@ void LAYERS_MAP_DIALOG::initDialog() int currLayer = gerber2KicadMapping[ii]; // Default to "Do Not Export" for unselected or undefined layer - if( ( currLayer == UNSELECTED_LAYER ) || ( currLayer == UNDEFINED_LAYER ) ) + if( ( currLayer == UNSELECTED_LAYER ) ) { m_layersList[ii]->SetLabel( _( "Do not export" ) ); m_layersList[ii]->SetForegroundColour( *wxBLUE ); @@ -281,6 +281,10 @@ void LAYERS_MAP_DIALOG::OnResetClick( wxCommandEvent& event ) m_layersList[ii]->SetForegroundColour( *wxBLUE ); m_buttonTable[ii] = ii; } + // wxWidgets doesn't appear to invalidate / update the StaticText displays for color change + // so we do it manually + Refresh(); + Update(); } @@ -398,6 +402,10 @@ void LAYERS_MAP_DIALOG::OnSelectLayer( wxCommandEvent& event ) m_layersList[ii]->SetForegroundColour( wxColour( 255, 0, 128 ) ); } } + // wxWidgets doesn't appear to invalidate / update the StaticText displays for color change + // so we do it manually + Refresh(); + Update(); } diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index 2ef0cdfaa8..e3031a0bd0 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -81,13 +81,23 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( const int* aLayerLookUpTable, int aCopperLa // First collect all the holes. We'll use these to generate pads, vias, etc. for( unsigned layer = 0; layer < images->ImagesMaxCount(); ++layer ) { + int pcb_layer_number = aLayerLookUpTable[layer]; EXCELLON_IMAGE* excellon = dynamic_cast( images->GetGbrImage( layer ) ); - - if( excellon == nullptr ) // Layer not yet used or not a drill image + GERBER_FILE_IMAGE* gerb = dynamic_cast( images->GetGbrImage( layer ) ); + if( excellon ) + { + for( GERBER_DRAW_ITEM* gerb_item : excellon->GetItems() ) + collect_hole( gerb_item ); + } + else if( gerb and pcb_layer_number == UNDEFINED_LAYER ) // PCB_LAYER_ID doesn't have an entry for Hole Data, but the dialog returns UNDEFINED_LAYER for it + { + for( GERBER_DRAW_ITEM* gerb_item : gerb->GetItems() ) + collect_hole( gerb_item ); + } + else + { continue; - - for( GERBER_DRAW_ITEM* gerb_item : excellon->GetItems() ) - collect_hole( gerb_item ); + } } // Next: non copper layers: