From 14ccadd2a9bcb109706b75a28fa6c9ac3b7b039e Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Mon, 8 Jul 2024 13:14:18 -0700 Subject: [PATCH] Handled unconnected nets These nets may have only a single element in them (no connections), so be sure to leave the node even without Features Fixes https://gitlab.com/kicad/code/kicad/-/issues/18293 --- pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp | 41 ++++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp b/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp index 99c4a52d19..0c36813152 100644 --- a/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp +++ b/pcbnew/pcb_io/ipc2581/pcb_io_ipc2581.cpp @@ -2414,17 +2414,12 @@ void PCB_IO_IPC2581::generateLayerFeatures( wxXmlNode* aStepNode ) wxXmlNode* layerNode = appendNode( aStepNode, "LayerFeature" ); addAttribute( layerNode, "layerRef", m_layer_name_map[layer] ); - for( const NETINFO_ITEM* net : nets ) + auto process_net = [&] ( int net ) { - if( m_progressReporter ) - { - m_progressReporter->Report( wxString::Format( _( "Exporting Layer %s, Net %s" ), - m_board->GetLayerName( layer ), - net->GetNetname() ) ); - m_progressReporter->AdvanceProgress(); - } + std::vector& vec = elements[layer][net]; - std::vector& vec = elements[layer][net->GetNetCode()]; + if( vec.empty() ) + return; std::stable_sort( vec.begin(), vec.end(), []( BOARD_ITEM* a, BOARD_ITEM* b ) @@ -2435,10 +2430,20 @@ void PCB_IO_IPC2581::generateLayerFeatures( wxXmlNode* aStepNode ) return a->GetParentFootprint() < b->GetParentFootprint(); } ); - if( vec.empty() ) - continue; - generateLayerSetNet( layerNode, layer, vec ); + }; + + for( const NETINFO_ITEM* net : nets ) + { + if( m_progressReporter ) + { + m_progressReporter->Report( wxString::Format( _( "Exporting Layer %s, Net %s" ), + m_board->GetLayerName( layer ), + net->GetNetname() ) ); + m_progressReporter->AdvanceProgress(); + } + + process_net( net->GetNetCode() ); } if( layerNode->GetChildren() == nullptr ) @@ -2803,10 +2808,18 @@ void PCB_IO_IPC2581::generateLayerSetNet( wxXmlNode* aLayerNode, PCB_LAYER_ID aL if( specialNode->GetChildren() == nullptr ) { featureSetNode->RemoveChild( specialNode ); - layerSetNode->RemoveChild( featureSetNode ); - aLayerNode->RemoveChild( layerSetNode ); delete specialNode; + } + + if( featureSetNode->GetChildren() == nullptr ) + { + layerSetNode->RemoveChild( featureSetNode ); delete featureSetNode; + } + + if( layerSetNode->GetChildren() == nullptr ) + { + aLayerNode->RemoveChild( layerSetNode ); delete layerSetNode; } }