From 3d36d41ea7cab291b0bc34f051975c054d296880 Mon Sep 17 00:00:00 2001 From: Alex Shvartzkop Date: Sat, 5 Apr 2025 19:29:15 +0300 Subject: [PATCH] Altium PCB: support 3D models import with duplicate filenames. Fixes https://gitlab.com/kicad/code/kicad/-/issues/20507 --- pcbnew/pcb_io/altium/altium_pcb.cpp | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/pcbnew/pcb_io/altium/altium_pcb.cpp b/pcbnew/pcb_io/altium/altium_pcb.cpp index 2d2df83f54..ce5876990f 100644 --- a/pcbnew/pcb_io/altium/altium_pcb.cpp +++ b/pcbnew/pcb_io/altium/altium_pcb.cpp @@ -2036,6 +2036,39 @@ void ALTIUM_PCB::ParseModelsData( const ALTIUM_PCB_COMPOUND_FILE& aAltiumPcb std::move( stepContent ) ) ) ); } + // Append _ to duplicate filenames + std::map> nameIdMap; + + for( auto& [id, data] : m_EmbeddedModels ) + nameIdMap[data.m_modelname].push_back( id ); + + for( auto& [name, ids] : nameIdMap ) + { + for( size_t i = 1; i < ids.size(); i++ ) + { + const wxString& id = ids[i]; + + auto modelTuple = m_EmbeddedModels.find( id ); + + if( modelTuple == m_EmbeddedModels.end() ) + continue; + + wxString modelName = modelTuple->second.m_modelname; + + if( modelName.Contains( "." ) ) + { + wxString ext; + wxString baseName = modelName.BeforeLast( '.', &ext ); + + modelTuple->second.m_modelname = baseName + '_' + std::to_string( i ) + '.' + ext; + } + else + { + modelTuple->second.m_modelname = modelName + '_' + std::to_string( i ); + } + } + } + if( reader.GetRemainingBytes() != 0 ) THROW_IO_ERROR( wxT( "Models stream is not fully parsed" ) ); }