43#include <compoundfilereader.h>
48 const std::vector<ALTIUM_PROJECT_VARIANT>& aVariants )
50 std::map<wxString, FOOTPRINT*> fpByRef;
51 std::map<KIID, std::vector<FOOTPRINT*>> fpByUid;
55 fpByRef[fp->GetReference()] = fp;
61 if(
path.size() >= 2 )
62 fpByUid[
path.back()].push_back( fp );
69 if( !pv.description.empty() && pv.description != pv.name )
82 if( it != fpByUid.end() && it->second.size() == 1 )
83 target = it->second.front();
90 if( it != fpByRef.end() )
102 if( entry.
kind == 1 )
104 fpVariant->
SetDNP(
true );
108 else if( entry.
kind == 0 )
112 if( key.CmpNoCase( wxS(
"LibReference" ) ) == 0 )
114 else if( key.CmpNoCase( wxS(
"Description" ) ) == 0 )
116 else if( key.CmpNoCase( wxS(
"Footprint" ) ) == 0 )
125 const std::map<ALTIUM_PCB_DIR, std::string>& aMapping,
126 const std::map<std::string, UTF8>* aProperties,
PROJECT* aProject,
133 std::set<wxString> specialStrings;
137 ALTIUM_PCB pcb( aBoard, aProgressReporter, aLayerMappingHandler, aReporter );
138 pcb.
Parse( altiumPcbFile, aMapping, aProperties );
141 catch( CFB::CFBException& exception )
146 if( aProperties && aProperties->count(
"project_file" ) )
148 const wxString& projectFile = aProperties->at(
"project_file" );
152 if( !variants.empty() )
162 for(
const wxString&
name : specialStrings )
169 PCB_IO( wxS(
"Altium Designer" ) )
181 const std::vector<INPUT_LAYER_DESC>& aInputLayerDescriptionVector )
183 std::map<wxString, PCB_LAYER_ID> retval;
188 retval.insert( { layerDesc.Name, layerDesc.AutoMapLayer } );
221 const std::map<std::string, UTF8>* aProperties,
PROJECT* aProject )
230 const std::map<ALTIUM_PCB_DIR, std::string> mapping = {
265 if( aLibraryPath.IsEmpty() )
268 wxFileName fn( aLibraryPath );
270 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
271 return fn.GetModificationTime().GetValue().GetValue();
291 if( aLibraryPath.Lower().EndsWith( wxS(
".pcblib" ) ) )
293 libFiles.
m_Files.emplace_back( std::make_unique<ALTIUM_PCB_COMPOUND_FILE>( aLibraryPath ) );
295 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
297 std::unique_ptr<ALTIUM_PCB_COMPOUND_FILE> lib = std::make_unique<ALTIUM_PCB_COMPOUND_FILE>( aLibraryPath );
299 for(
const auto& [pcbLibName, pcbCfe] : lib->EnumDir(
L"PCBLib" ) )
301 std::unique_ptr<ALTIUM_PCB_COMPOUND_FILE> libFile = std::make_unique<ALTIUM_PCB_COMPOUND_FILE>();
303 if( lib->DecodeIntLibStream( *pcbCfe, libFile.get() ) )
304 libFiles.
m_Files.emplace_back( std::move( libFile ) );
310 catch( CFB::CFBException& exception )
318 const wxString& aLibraryPath,
bool aBestEfforts,
319 const std::map<std::string, UTF8>* aProperties )
328 for( std::unique_ptr<ALTIUM_PCB_COMPOUND_FILE>& altiumLibFile :
m_fplibFiles[aLibraryPath].m_Files )
333 const std::vector<std::string> streamName = {
"Library",
"Data" };
334 const CFB::COMPOUND_FILE_ENTRY* libraryData = altiumLibFile->FindStream( streamName );
336 if( libraryData ==
nullptr )
341 std::map<wxString, wxString> properties = parser.
ReadProperties();
343 uint32_t numberOfFootprints = parser.
Read<uint32_t>();
352 bool footprintListNotTruncated =
true;
354 if ( patternMap.size() < numberOfFootprints )
356 numberOfFootprints = patternMap.size();
357 footprintListNotTruncated =
false;
360 aFootprintNames.Alloc( numberOfFootprints );
362 for(
size_t i = 0; i < numberOfFootprints; i++ )
367 wxString fpPattern( charBuffer, wxConvISO8859_1 );
369 auto it = patternMap.find( fpPattern );
371 if( it != patternMap.end() )
372 aFootprintNames.Add( it->second );
386 catch( CFB::CFBException& exception )
394 const wxString& aFootprintName,
bool aKeepUUID,
395 const std::map<std::string, UTF8>* aProperties )
404 for( std::unique_ptr<ALTIUM_PCB_COMPOUND_FILE>& altiumLibFile :
m_fplibFiles[aLibraryPath].m_Files )
406 altiumLibFile->CacheLibModels();
407 auto [dirName, fpCfe] = altiumLibFile->FindLibFootprintDirName( aFootprintName );
409 if( dirName.IsEmpty() )
417 catch( CFB::CFBException& exception )
422 THROW_IO_ERRORF(
_(
"Footprint '%s' not found in '%s'." ), aFootprintName, aLibraryPath );
428 std::vector<FOOTPRINT*> footprints;
432 footprints.push_back(
static_cast<FOOTPRINT*
>( fp->Clone() ) );
std::string FormatPath(const std::vector< std::string > &aVectorPath)
Helper for debug logging (vector -> string)
@ EXTENDPRIMITIVEINFORMATION
std::vector< ALTIUM_PROJECT_VARIANT > ParseAltiumProjectVariants(const wxString &aPrjPcbPath)
Parse all [ProjectVariantN] sections from an Altium .PrjPcb project file.
std::map< wxString, wxString > ParseAltiumProjectParameters(const wxString &aPrjPcbPath)
Parse all [ParameterN] sections from an Altium .PrjPcb project file.
KIID AltiumUniqueIdToKiid(const wxString &aUniqueId)
Derive a stable KIID from an Altium component unique id.
void ApplyAltiumProjectParametersToProject(PROJECT *aProject, const std::map< wxString, wxString > &aParameters)
Register Altium project parameters as KiCad project text variables so that imported board text refere...
std::map< wxString, ValueType, DETAIL::CASE_INSENSITIVE_COMPARER > CASE_INSENSITIVE_MAP
size_t GetRemainingBytes() const
wxScopedCharBuffer ReadCharBuffer()
size_t ReadAndSetSubrecordLength()
std::map< wxString, wxString > ReadProperties(std::function< std::map< wxString, wxString >(const std::string &)> handleBinaryData=[](const std::string &) { return std::map< wxString, wxString >();})
const std::set< wxString > & GetSpecialStrings() const
Special strings in the parsed text that KiCad has no variable for.
std::unique_ptr< FOOTPRINT > ParseFootprint(ALTIUM_PCB_COMPOUND_FILE &altiumLibFile, const wxString &aFootprintName)
void Parse(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const std::map< ALTIUM_PCB_DIR, std::string > &aFileMapping, const std::map< std::string, UTF8 > *aProperties=nullptr)
Information pertinent to a Pcbnew printed circuit board.
void AddVariant(const wxString &aVariantName)
const FOOTPRINTS & Footprints() const
void SetVariantDescription(const wxString &aVariantName, const wxString &aDescription)
RAII class to set and restore the fontconfig reporter.
REPORTER * m_reporter
Reporter to log errors/warnings to, may be nullptr.
PROGRESS_REPORTER * m_progressReporter
Progress reporter to track the progress of the operation, may be nullptr.
virtual bool CanReadLibrary(const wxString &aFileName) const
Checks if this IO object can read the specified library file/directory.
virtual void RegisterCallback(LAYER_MAPPING_HANDLER aLayerMappingHandler)
Register a different handler to be called when mapping of input layers to KiCad layers occurs.
LAYER_MAPPING_HANDLER m_layer_mapping_handler
Callback to get layer mapping.
static LOAD_INFO_REPORTER & GetInstance()
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Return a list of footprint names contained within the library at aLibraryPath.
std::vector< FOOTPRINT * > GetImportedCachedLibraryFootprints() override
Return a container with the cached library footprints generated in the last call to Load.
~PCB_IO_ALTIUM_DESIGNER()
static bool checkFileHeader(const wxString &aFileName)
bool CanReadBoard(const wxString &aFileName) const override
std::unique_ptr< FOOTPRINT > FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, bool aKeepUUID=false, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a footprint having aFootprintName from the aLibraryPath containing a library format that this PC...
void loadAltiumLibrary(const wxString &aLibraryPath)
void loadBoard(const wxString &aFileName, BOARD &aBoard, bool aIsNewLoad, const std::map< std::string, UTF8 > *aProperties, PROJECT *aProject=nullptr) override
Parse aFileName into aBoard.
static std::map< wxString, PCB_LAYER_ID > DefaultLayerMappingCallback(const std::vector< INPUT_LAYER_DESC > &aInputLayerDescriptionVector)
Return the automapped layers.
std::map< wxString, ALTIUM_FILE_CACHE > m_fplibFiles
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
BOARD * m_board
The board BOARD being worked on, no ownership here.
virtual bool CanReadBoard(const wxString &aFileName) const
PCB_IO(const wxString &aName)
const std::map< std::string, UTF8 > * m_props
Properties passed via Save() or Load(), no ownership, may be NULL.
A progress reporter interface for use in multi-threaded environments.
Container for project specific data.
virtual std::map< wxString, wxString > & GetTextVars() const
A pure virtual class used to derive REPORTER objects from.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_IO_ERRORF(msg,...)
const std::vector< uint8_t > COMPOUND_FILE_HEADER
bool fileHasBinaryHeader(const wxString &aFilePath, const std::vector< uint8_t > &aHeader, size_t aOffset)
Check if a file starts with a defined binary header.
void ApplyAltiumProjectVariantsToBoard(BOARD *aBoard, const std::vector< ALTIUM_PROJECT_VARIANT > &aVariants)
Pcbnew PLUGIN for Altium *.PcbDoc format.
void LoadAltiumBoard(const wxString &aFileName, BOARD *aBoard, const std::map< ALTIUM_PCB_DIR, std::string > &aMapping, const std::map< std::string, UTF8 > *aProperties, PROJECT *aProject, PROGRESS_REPORTER *aProgressReporter, LAYER_MAPPING_HANDLER &aLayerMappingHandler, REPORTER *aReporter)
void LoadAltiumBoard(const wxString &aFileName, BOARD *aBoard, const std::map< ALTIUM_PCB_DIR, std::string > &aMapping, const std::map< std::string, UTF8 > *aProperties, PROJECT *aProject, PROGRESS_REPORTER *aProgressReporter, LAYER_MAPPING_HANDLER &aLayerMappingHandler, REPORTER *aReporter)
std::function< std::map< wxString, PCB_LAYER_ID >(const std::vector< INPUT_LAYER_DESC > &)> LAYER_MAPPING_HANDLER
Pointer to a function that takes a map of source and KiCad layers and returns a re-mapped version.
A project-level assembly variant parsed from an Altium .PrjPcb file.
A single component variation within an Altium project variant.
std::map< wxString, wxString > alternateFields
std::vector< std::unique_ptr< ALTIUM_PCB_COMPOUND_FILE > > m_Files