diff --git a/pcbnew/altium2kicadpcb_plugin/altium_pcb.cpp b/pcbnew/altium2kicadpcb_plugin/altium_pcb.cpp index 7c7c09388d..5573349eb0 100644 --- a/pcbnew/altium2kicadpcb_plugin/altium_pcb.cpp +++ b/pcbnew/altium2kicadpcb_plugin/altium_pcb.cpp @@ -1131,9 +1131,36 @@ void ALTIUM_PCB::ParseModelsData( const CFB::CompoundFileReader& aReader, { ALTIUM_PARSER reader( aReader, aEntry ); - wxString altiumModelsPath = wxPathOnly( m_board->GetFileName() ); - wxSetEnv( PROJECT_VAR_NAME, - altiumModelsPath ); // TODO: set KIPRJMOD always after import (not only when loading project)? + if( reader.GetRemainingBytes() == 0 ) + { + return; // fast path: no 3d-models present which need to be imported -> no directory needs to be created + } + + wxString projectPath = wxPathOnly( m_board->GetFileName() ); + // TODO: set KIPRJMOD always after import (not only when loading project)? + wxSetEnv( PROJECT_VAR_NAME, projectPath ); + + // TODO: make this path configurable? + const wxString altiumModelDir = "ALTIUM_EMBEDDED_MODELS"; + + wxFileName altiumModelsPath = wxFileName::DirName( projectPath ); + wxString kicadModelPrefix = "${KIPRJMOD}/" + altiumModelDir + "/"; + if( !altiumModelsPath.AppendDir( altiumModelDir ) ) + { + THROW_IO_ERROR( "Cannot construct directory path for step models" ); + } + + // Create dir if it does not exist + if( !altiumModelsPath.DirExists() ) + { + if( !altiumModelsPath.Mkdir() ) + { + wxLogError( wxString::Format( + _( "Cannot create directory \"%s\" -> no 3D-models will be imported." ), + GetChars( altiumModelsPath.GetFullPath() ) ) ); + return; + } + } int idx = 0; while( reader.GetRemainingBytes() >= 4 /* TODO: use Header section of file */ ) @@ -1150,7 +1177,14 @@ void ALTIUM_PCB::ParseModelsData( const CFB::CompoundFileReader& aReader, // read file into buffer aReader.ReadFile( stepEntry, 0, stepContent.get(), stepSize ); - wxFileName storagePath( altiumModelsPath, elem.name ); + wxFileName storagePath( altiumModelsPath.GetPath(), elem.name ); + if( !storagePath.IsDirWritable() ) + { + wxLogError( + wxString::Format( _( "You do not have write permissions to save file \"%s\"." ), + GetChars( storagePath.GetFullPath() ) ) ); + continue; + } wxMemoryInputStream stepStream( stepContent.get(), stepSize ); wxZlibInputStream zlibInputStream( stepStream ); @@ -1159,7 +1193,7 @@ void ALTIUM_PCB::ParseModelsData( const CFB::CompoundFileReader& aReader, outputStream.Write( zlibInputStream ); outputStream.Close(); - m_models.insert( { elem.id, "${KIPRJMOD}/" + elem.name } ); // KIPRJMOD + m_models.insert( { elem.id, kicadModelPrefix + elem.name } ); } if( reader.GetRemainingBytes() != 0 )