57#include <compoundfilereader.h>
67#include <wx/mstream.h>
68#include <wx/zstream.h>
69#include <wx/wfstream.h>
70#include <magic_enum.hpp>
76#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
77 0.94901960784313721, \
78 0.98431372549019602, 1.0 )
80#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
81 0.61960784313725492, \
82 0.78823529411764703, 1.0 )
94 int red = color & 0x0000FF;
95 int green = ( color & 0x00FF00 ) >> 8;
96 int blue = ( color & 0xFF0000 ) >> 16;
168 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
205 else if( elem.
AreaColor == aStrokeColor )
211 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
256 for(
auto& [
name, symbol] : lib )
308 std::vector<SCH_PIN*> pins;
311 pins =
static_cast<SCH_SYMBOL*
>( aSymbol )->GetPins(
nullptr );
313 pins =
static_cast<LIB_SYMBOL*
>( aSymbol )->GetGraphicalPins( 0, 0 );
316 bool names_visible =
false;
317 bool numbers_visible =
false;
321 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
322 names_visible =
true;
324 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
325 numbers_visible =
true;
336 if( !numbers_visible )
385 std::map<wxString, SCH_SHEET*> sheets;
386 wxFileName
project( aProperties->at(
"project_file" ) );
388 for(
auto& [ key, filestring] : *aProperties )
390 if( !key.starts_with(
"sch" ) )
393 wxFileName fn( filestring );
400 m_rootSheet->SearchHierarchy( fn.GetFullPath(), &existingScreen );
405 if( !existingScreen )
411 wxFileName screenFn( screen->GetFileName() );
412 wxFileName checkFn( fn.GetFullPath() );
414 if( screenFn.GetName().IsSameAs( checkFn.GetName(),
false ) )
416 existingScreen = screen;
428 wxFileName kicad_fn( fn );
429 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
431 sheet->SetScreen( screen );
438 sheet->SetFileName( kicad_fn.GetFullName() );
441 wxCHECK2( sheet && screen,
continue );
443 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
455 wxCHECK2( currentScreen,
continue );
459 currentScreen->
Append( sheetPtr );
462 sheets[kicad_fn.GetFullPath()] = sheetPtr;
476 for(
auto& [ filestring, sheet ] : sheets )
488 const std::map<std::string, UTF8>* aProperties )
490 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
492 wxFileName fileName( aFileName );
500 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
504 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
510 m_rootSheet->SetFileName( fileName.GetFullPath() );
515 if( aFileName.empty() )
538 if( !aFileName.empty() )
545 wxCHECK( rootScreen,
nullptr );
554 if( aFileName.empty() )
559 if( aFileName.empty() )
561 std::vector<SCH_SHEET*> topLevelSheets;
569 topLevelSheets.push_back( sheet );
575 rootScreen->
Remove( sheet );
577 if( !topLevelSheets.empty() )
589 std::vector<SCH_HIERLABEL*> hierLabels;
597 hierLabel->GetText() );
598 globalLabel->
SetShape( hierLabel->GetShape() );
602 screen->
Remove( hierLabel );
603 screen->
Append( globalLabel );
626 int minWireWidth = std::numeric_limits<int>::max();
627 int minBusWidth = std::numeric_limits<int>::max();
631 std::vector<SCH_MARKER*> markers;
638 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
641 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
645 std::shared_ptr<NET_SETTINGS>& netSettings =
m_schematic->Project().GetProjectFile().NetSettings();
647 if( minWireWidth < std::numeric_limits<int>::max() )
648 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
650 if( minBusWidth < std::numeric_limits<int>::max() )
651 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
674 std::vector<SCH_LINE*> busLines;
675 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
683 busLines.push_back( line );
685 busLineMap[ line->
GetEndPoint() ].push_back( line );
692 auto it = busLineMap.find( aStart );
694 if( it == busLineMap.end() )
700 if( aVisited.count( line ) )
703 aVisited.insert( line );
724 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>();
725 alias->SetName( harness.m_name );
728 alias->Members().push_back( port.
m_name );
733 BOX2I box( harness.m_location, harness.m_size );
763 int delta_x =
center.x - pos.
x;
764 int delta_y =
center.y - pos.
y;
771 screen->
Append( busLine );
778 screen->
Append( busLine );
788 std::set<SCH_LINE*> visited;
789 SCH_LABEL* label = walkBusLine( pos, visited );
796 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
797 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
814 bool isVertical =
true;
816 if( harness.m_ports.size() > 1 )
818 VECTOR2I first = harness.m_ports.front().m_location;
819 VECTOR2I last = harness.m_ports.back().m_location;
821 if( first.
y == last.
y )
827 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
828 VECTOR2I top = harness.m_ports.front().m_entryLocation;
893 wxFileName parentFileName( aFileName );
900 wxFileName relative = parentFileName;
903 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
921 catch(
const CFB::CFBException& exception )
925 catch(
const std::exception& exc )
927 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium schematic: %s" ), exc.what() ) );
936 wxCHECK( currentScreen, );
944 wxCHECK2( sheet,
continue );
948 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
950 if( !loadAltiumFileName.IsFileReadable() )
954 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
955 wxDIR_FILES | wxDIR_HIDDEN );
957 for(
const wxString& candidate : files )
959 wxFileName candidateFname( candidate );
961 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false ) )
963 loadAltiumFileName = candidateFname;
969 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
971 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
972 "this is probably an Altium signal harness "
973 "that got converted to a sheet." ),
980 m_rootSheet->SearchHierarchy( loadAltiumFileName.GetFullPath(), &loadedScreen );
986 wxFileName projectFileName = loadAltiumFileName;
987 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
989 sheet->
SetFileName( projectFileName.GetFullName() );
1009 if( baseRef.StartsWith( wxT(
"#" ) ) )
1016 wxString newRef = baseRef + wxT(
"_" ) + sheet->
GetName();
1028 if( sheet->
GetName().Trim().empty() )
1030 wxString sheetName = loadAltiumFileName.GetName();
1032 std::set<wxString> sheetNames;
1037 sheetNames.insert( otherSheet->
GetName() );
1040 for(
int ii = 1; ; ++ii )
1042 if( sheetNames.find( sheetName ) == sheetNames.end() )
1045 sheetName = loadAltiumFileName.GetName() + wxString::Format( wxT(
"_%d" ), ii );
1051 wxCHECK2( screen,
continue );
1058 wxFileName projectFileName = loadAltiumFileName;
1059 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1061 sheet->
SetFileName( projectFileName.GetFullName() );
1062 screen->
SetFileName( projectFileName.GetFullPath() );
1072 if( ref.StartsWith( wxT(
"#" ) ) )
1075 wxString newRef = ref + wxT(
"_" ) + sheet->
GetName();
1087 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
1089 if( file ==
nullptr )
1094 std::map<wxString, wxString> properties = reader.
ReadProperties();
1101 for(
int i = 0; i < weight; i++ )
1111 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
1120 wxString streamName = wxS(
"Additional" );
1122 const CFB::COMPOUND_FILE_ENTRY* file =
1123 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1125 if( file ==
nullptr )
1132 THROW_IO_ERROR(
"Additional section does not contain any data" );
1136 std::map<wxString, wxString> properties = reader.
ReadProperties();
1147 std::map<wxString, wxString> properties = reader.
ReadProperties();
1171 wxString streamName = wxS(
"FileHeader" );
1173 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1175 if( file ==
nullptr )
1186 std::map<wxString, wxString> properties = reader.
ReadProperties();
1190 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1203 std::map<wxString, wxString> properties = reader.
ReadProperties();
1215 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1225 symbol.second->SetLibSymbol( libSymbolIt->second );
1262 while( storageReader.
CanRead() )
1264 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1267 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1281 std::map<wxString, wxString> properties = reader.
ReadProperties();
1285 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1300 std::map<wxString, wxString> properties = reader.
ReadProperties();
1303 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1309 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1322 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1332 symbol.second->SetLibSymbol( libSymbolIt->second );
1372 const wxString& aSectionName )
1568 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1599 if( file.filename.IsSameAs( aFilename ) )
1602 if( file.filename.EndsWith( aFilename ) )
1603 nonExactMatch = &file;
1606 return nonExactMatch;
1613 wxCHECK( currentSheet, );
1615 wxString sheetName = currentSheet->
GetName();
1617 if( sheetName.IsEmpty() )
1618 sheetName = wxT(
"root" );
1626 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
1627 "replaced with symbol \"%s\"." ),
1639 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1664 field.SetVisible(
false );
1702 screen->
Append( symbol );
1711 wxCHECK( currentSheet, );
1713 wxString sheetName = currentSheet->
GetName();
1715 if( sheetName.IsEmpty() )
1716 sheetName = wxT(
"root" );
1721 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1723 if( baseName.IsEmpty() )
1724 baseName = wxS(
"Template" );
1732 std::vector<LIB_SYMBOL*>& aSymbol )
1747 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1756 schSymbol =
m_symbols.at( libSymbolIt->first );
1757 symbol = libSymbolIt->second;
1776 pin->SetVisible(
false );
1779 pin->SetNumberTextSize( 0 );
1782 pin->SetNameTextSize( 0 );
1818 pin->SetPosition( pinLocation );
1916 int vjustify, hjustify;
1919 switch( justification )
1942 switch( justification )
1965 switch( orientation )
1988 text->SetTextAngle( angle );
2007 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
2013 static const std::map<wxString, wxString> variableMap = {
2014 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
2015 {
"SHEETNUMBER",
"#" },
2016 {
"SHEETTOTAL",
"##" },
2017 {
"TITLE",
"TITLE" },
2018 {
"REVISION",
"REVISION" },
2019 {
"DATE",
"ISSUE_DATE" },
2020 {
"CURRENTDATE",
"CURRENT_DATE" },
2021 {
"COMPANYNAME",
"COMPANY" },
2022 {
"DOCUMENTNAME",
"FILENAME" },
2023 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
2024 {
"PROJECTNAME",
"PROJECTNAME" },
2032 size_t fontId =
static_cast<int>( elem.
fontId );
2049 screen->
Append( textItem );
2069 symbol = libSymbolIt->second;
2070 schsym =
m_symbols.at( libSymbolIt->first );
2085 size_t fontId = elem.
fontId;
2096 else if( fontId > 0 && fontId <= aFontSizes.size() )
2098 int size = aFontSizes[fontId - 1];
2106 std::vector<LIB_SYMBOL*>& aSymbol,
2107 std::vector<int>& aFontSizes )
2134 textBox->
SetStart( sheetTopRight );
2135 textBox->
SetEnd( sheetBottomLeft );
2165 size_t fontId =
static_cast<int>( aElem->
FontID );
2183 screen->
Append( textBox );
2188 std::vector<int>& aFontSizes )
2207 symbol = libSymbolIt->second;
2208 schsym =
m_symbols.at( libSymbolIt->first );
2256 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2258 int size = aFontSizes[aElem->
FontID - 1];
2265 std::vector<LIB_SYMBOL*>& aSymbol )
2269 if( elem.
points.size() < 2 )
2271 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2272 static_cast<int>( elem.
points.size() ) ),
2280 wxCHECK( currentScreen, );
2282 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2284 if( i + 2 == elem.
points.size() )
2295 currentScreen->
Append( line );
2300 std::vector<VECTOR2I> bezierPoints;
2301 std::vector<VECTOR2I> polyPoints;
2303 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2304 bezierPoints.push_back( elem.
points.at( j ) );
2307 converter.
GetPoly( polyPoints );
2309 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2318 currentScreen->
Append( line );
2336 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2342 symbol = libSymbolIt->second;
2343 schsym =
m_symbols.at( libSymbolIt->first );
2349 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2351 if( i + 2 == elem.
points.size() )
2359 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2371 else if( i + 3 == elem.
points.size() )
2382 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2402 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2411 case 0: bezier->
SetStart( pos );
break;
2414 case 3: bezier->
SetEnd( pos );
break;
2428 std::vector<LIB_SYMBOL*>& aSymbol )
2432 if( elem.
Points.size() < 2 )
2440 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2468 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2474 symbol = libSymbolIt->second;
2475 schsym =
m_symbols.at( libSymbolIt->first );
2504 std::vector<LIB_SYMBOL*>& aSymbol )
2538 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2544 symbol = libSymbolIt->second;
2545 schsym =
m_symbols.at( libSymbolIt->first );
2586 std::vector<LIB_SYMBOL*>& aSymbol )
2619 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
2625 symbol = libSymbolIt->second;
2626 schsym =
m_symbols.at( libSymbolIt->first );
2644 int radius = std::min( width / 2, height / 2 );
2680 std::vector<LIB_SYMBOL*>& aSymbol )
2688 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
2694 wxCHECK( currentScreen, );
2719 currentScreen->
Append( arc );
2740 symbol = libSymbolIt->second;
2741 schsym =
m_symbols.at( libSymbolIt->first );
2784 std::vector<LIB_SYMBOL*>& aSymbol )
2798 wxCHECK( currentScreen, );
2804 std::vector<BEZIER<int>> beziers;
2811 schbezier->
SetStart( bezier.Start );
2814 schbezier->
SetEnd( bezier.End );
2818 currentScreen->
Append( schbezier );
2834 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2840 symbol = libSymbolIt->second;
2841 schsym =
m_symbols.at( libSymbolIt->first );
2851 std::vector<BEZIER<int>> beziers;
2871 schbezier->
SetStart( bezier.Start );
2874 schbezier->
SetEnd( bezier.End );
2885 std::vector<LIB_SYMBOL*>& aSymbol )
2895 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
2931 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
2937 symbol = libSymbolIt->second;
2938 schsym =
m_symbols.at( libSymbolIt->first );
2968 std::vector<LIB_SYMBOL*>& aSymbol )
2993 std::vector<BEZIER<int>> beziers;
2994 std::vector<VECTOR2I> polyPoints;
3001 schbezier->
SetStart( bezier.Start );
3004 schbezier->
SetEnd( bezier.End );
3010 screen->
Append( schbezier );
3012 polyPoints.push_back( bezier.Start );
3022 for(
const VECTOR2I& point : polyPoints )
3025 schpoly->
AddPoint( polyPoints[0] );
3027 screen->
Append( schpoly );
3048 symbol = libSymbolIt->second;
3049 schsym =
m_symbols.at( libSymbolIt->first );
3055 std::vector<BEZIER<int>> beziers;
3056 std::vector<VECTOR2I> polyPoints;
3068 libbezier->
SetStart( bezier.Start );
3071 libbezier->
SetEnd( bezier.End );
3085 polyPoints.push_back( libbezier->
GetStart() );
3096 for(
const VECTOR2I& point : polyPoints )
3099 libline->
AddPoint( polyPoints[0] );
3109 std::vector<LIB_SYMBOL*>& aSymbol )
3129 circle->SetFilled(
false );
3151 symbol = libSymbolIt->second;
3152 schsym =
m_symbols.at( libSymbolIt->first );
3174 std::vector<LIB_SYMBOL*>& aSymbol )
3210 symbol = libSymbolIt->second;
3211 schsym =
m_symbols.at( libSymbolIt->first );
3248 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3261 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3268 wxString>& aProperties )
3277 HARNESS& harness = it->second;
3305 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3319 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3325 HARNESS& harness = harnessIt->second;
3362 harness.
m_ports.emplace_back( port );
3374 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3380 HARNESS& harness = harnessIt->second;
3386 std::vector<LIB_SYMBOL*>& aSymbol )
3401 rect->
SetEnd( sheetBottomLeft );
3421 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3427 symbol = libSymbolIt->second;
3428 schsym =
m_symbols.at( libSymbolIt->first );
3442 rect->
SetEnd( sheetBottomLeft );
3470 wxCHECK( currentScreen, );
3471 currentScreen->
Append( sheet );
3480 wxCHECK( rootScreen, );
3488 m_sheets.insert( { aIndex, sheet } );
3506 sheetIt->second->AddPin( sheetPin );
3508 wxString pinName = elem.
name;
3511 pinName += wxT(
"{" ) + elem.
harnessType + wxT(
"}" );
3518 VECTOR2I pos = sheetIt->second->GetPosition();
3519 VECTOR2I size = sheetIt->second->GetSize();
3756 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3781 wxString symName( elem.
text );
3782 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3784 if( !styleName.empty() )
3785 symName <<
'_' << styleName;
3794 libSymbol = powerSymbolIt->second;
3800 libSymbol->
SetName( symName );
3805 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
3815 pin->SetPosition( { 0, 0 } );
3816 pin->SetLength( 0 );
3818 pin->SetVisible(
false );
3875 screen->
Append( symbol );
3903 switch( aElem.
Style )
3933 bool connectionFound = startIsWireTerminal
3934 || startIsBusTerminal
3935 || endIsWireTerminal
3936 || endIsBusTerminal;
3938 if( !connectionFound )
3942 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
3945 BOX2I bbox( harness.m_location, harness.m_size );
3950 startIsBusTerminal =
true;
3951 connectionFound =
true;
3957 endIsBusTerminal =
true;
3958 connectionFound =
true;
3963 if( !connectionFound )
3971 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
3974 wxString labelName = aElem.
Name;
3977 labelName += wxT(
"{" ) + aElem.
HarnessType + wxT(
"}" );
4000 switch( aElem.
Style )
4007 if( ( startIsWireTerminal || startIsBusTerminal ) )
4018 if( ( startIsWireTerminal || startIsBusTerminal ) )
4032 if( ( startIsWireTerminal && endIsWireTerminal ) )
4040 else if( startIsBusTerminal && endIsBusTerminal )
4063 screen->
Append( noConnect );
4091 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4110 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4132 screen->
Append( junction );
4144 && component->second.currentpartid != elem.
ownerpartid )
4148 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
4160 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file %s not found in storage." ),
4166 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4169 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4170 wxZlibInputStream zlibInputStream( fileStream );
4171 wxFFileOutputStream outputStream( storagePath );
4172 outputStream.Write( zlibInputStream );
4173 outputStream.Close();
4177 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
4183 wxRemoveFile( storagePath );
4187 if( !wxFileExists( elem.
filename ) )
4205 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4206 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4209 bitmap->SetFlags(
IS_NEW );
4210 screen->
Append( bitmap.release() );
4216 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4268 wxCHECK( currentScreen, );
4274 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4280 wxString sheetName = elem.
text;
4281 std::set<wxString> sheetNames;
4286 sheetNames.insert( sheet->
GetName() );
4289 for(
int ii = 1; ; ++ii )
4291 if( sheetNames.find( sheetName ) == sheetNames.end() )
4294 sheetName = elem.
text + wxString::Format( wxT(
"_%d" ), ii );
4300 sheetNameField->
SetText( sheetName );
4314 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4340 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4354 bool emptyRef = elem.
text.IsEmpty();
4359 bool visible = !emptyRef;
4371 std::vector<LIB_SYMBOL*>& aSymbol,
4372 std::vector<int>& aFontSizes )
4379 bool emptyRef = elem.
text.IsEmpty();
4380 SCH_FIELD& refField = symbol->GetReferenceField();
4383 refField.
SetText( wxT(
"X" ) );
4389 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4391 int size = aFontSizes[elem.
fontId - 1];
4408 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4411 screen->
Append( busWireEntry );
4420 static const std::map<wxString, wxString> variableMap = {
4421 {
"COMMENT",
"VALUE" },
4422 {
"VALUE",
"ALTIUM_VALUE" },
4428 if( elem.
text ==
"*" )
4431 wxString paramName = elem.
name.Upper();
4433 if( paramName ==
"SHEETNUMBER" )
4437 else if( paramName ==
"TITLE" )
4441 else if( paramName ==
"REVISION" )
4445 else if( paramName ==
"DATE" )
4449 else if( paramName ==
"COMPANYNAME" )
4470 wxString upperName = elem.
name.Upper();
4472 if( upperName ==
"COMMENT" )
4478 wxString fieldName = elem.
name.Upper();
4480 if( fieldName.IsEmpty() )
4482 int disambiguate = 1;
4486 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4488 if( !symbol->
GetField( fieldName ) )
4492 else if( fieldName ==
"VALUE" )
4494 fieldName =
"ALTIUM_VALUE";
4511 std::vector<LIB_SYMBOL*>& aSymbol,
4512 std::vector<int>& aFontSizes )
4533 std::map<wxString, wxString> variableMap = {
4534 {
"COMMENT",
"VALUE" },
4540 wxString upperName = elem.
name.Upper();
4542 if( upperName ==
"COMMENT" )
4544 field = &libSymbol->GetValueField();
4548 wxString fieldNameStem = elem.
name;
4549 wxString fieldName = fieldNameStem;
4550 int disambiguate = 1;
4552 if( fieldName.IsEmpty() )
4554 fieldNameStem =
"ALTIUM_UNNAMED";
4555 fieldName =
"ALTIUM_UNNAMED_1";
4558 else if( upperName ==
"VALUE" )
4560 fieldNameStem =
"ALTIUM_VALUE";
4561 fieldName =
"ALTIUM_VALUE";
4565 while( libSymbol->GetField( fieldName ) )
4566 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4569 libSymbol->AddField( new_field );
4580 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4582 int size = aFontSizes[elem.
fontId - 1];
4596 const std::map<wxString, wxString>& aProperties )
4605 std::vector<LIB_SYMBOL*>& aSymbol )
4609 if( elem.
type != wxS(
"PCBLIB" ) )
4613 if( aSymbol.size() == 0 && !elem.
isCurrent )
4619 wxArrayString fpFilters;
4620 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4623 if( !aSymbol.empty() )
4629 symbol->SetFPFilters( fpFilters );
4640 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4646 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4650 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4651 implementationOwnerIt->second ),
4658 libSymbolIt->second->SetFPFilters( fpFilters );
4668 wxString>& aProperties )
4672 std::vector<LIB_SYMBOL*> symbols;
4681 symbol->
SetName( wxString::Format(
"%s (Altium Display %d)", elem.
libreference, i + 1 ) );
4689 symbols.push_back( symbol );
4700 std::vector<int> fontSizes;
4701 struct SYMBOL_PIN_FRAC
4710 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4712 for(
auto& [
name, entry] : syms )
4714 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4716 if( entry.m_pinsFrac )
4718 auto parse_binary_pin_frac =
4719 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4721 std::map<wxString, wxString>
result;
4727 SYMBOL_PIN_FRAC pinFrac;
4731 pinFrac.len_frac = binreader.
ReadInt32();
4732 pinFracs.insert( { pinFracData.first, pinFrac } );
4744 std::vector<LIB_SYMBOL*> symbols;
4751 std::map<wxString, wxString> properties = reader.
ReadProperties();
4756 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4761 auto handleBinaryPinLambda =
4762 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4764 std::map<wxString, wxString>
result;
4768 int32_t recordId = binreader.
ReadInt32();
4773 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4775 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4776 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4777 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4778 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4779 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4780 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4783 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4784 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4785 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4786 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4787 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4793 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4795 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4796 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4797 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4801 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4803 if( partSeqSplit.size() == 3 )
4805 result[
"PART"] = partSeqSplit[0];
4806 result[
"SEQ"] = partSeqSplit[2];
4814 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4816 if( properties.empty() )
4865 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
4879 for(
size_t ii = 0; ii < symbols.size(); ii++ )
4887 if( valField.
GetText().IsEmpty() )
4895 if( symbols.size() == 1 )
4898 cacheName = wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 );
4901 ret[cacheName] = symbol;
4911 wxFileName fn( aLibraryPath );
4913 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
4914 return fn.GetModificationTime().GetValue().GetValue();
4921 const std::map<std::string, UTF8>* aProperties )
4934 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
4936 wxFileName fileName( aLibraryPath );
4941 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
4945 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
4947 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
4951 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
4953 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
4955 for(
const auto& [schLibName, cfe] : schLibFiles )
4957 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
4959 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
4960 compoundFiles.emplace_back( std::move( decodedStream ) );
4966 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
4969 cacheMapRef.insert( parsed.begin(), parsed.end() );
4974 catch(
const CFB::CFBException& exception )
4978 catch(
const std::exception& exc )
4980 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium library: %s" ), exc.what() ) );
4986 std::vector<int>& aFontSizes )
4988 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
4990 if( file ==
nullptr )
4998 std::map<wxString, wxString> properties = reader.
ReadProperties();
5002 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
5003 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
5005 for(
auto& [key, value] : properties )
5007 wxString upperKey = key.Upper();
5010 if( upperKey.StartsWith(
"SIZE", &remaining ) )
5012 if( !remaining.empty() )
5014 int ind = wxAtoi( remaining );
5016 if(
static_cast<int>( aFontSizes.size() ) < ind )
5017 aFontSizes.resize( ind );
5020 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
5021 aFontSizes[ind - 1] = scaled;
5029 const std::map<std::string, UTF8>* aProperties,
5030 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
5034 bool powerSymbolsOnly = ( aProperties &&
5041 for(
auto& [libnameStr, libSymbol] : it->second )
5043 if( powerSymbolsOnly && !libSymbol->IsPower() )
5046 aInserter( libnameStr, libSymbol );
5053 const std::map<std::string, UTF8>* aProperties )
5058 aSymbolNameList.Add( aStr );
5064 const wxString& aLibraryPath,
5065 const std::map<std::string, UTF8>* aProperties )
5070 aSymbolList.emplace_back( aSymbol );
5076 const std::map<std::string, UTF8>* aProperties )
5084 auto it2 = it->second.find( aAliasName );
5086 if( it2 != it->second.end() )
const int ALTIUM_COMPONENT_NONE
wxString AltiumSchSpecialStringsToKiCadVariables(const wxString &aString, const std::map< wxString, wxString > &aOverrides)
wxString AltiumPinNamesToKiCad(wxString &aString)
LIB_ID AltiumToKiCadLibID(const wxString &aLibName, const wxString &aLibReference)
constexpr EDA_IU_SCALE schIUScale
constexpr double ARC_LOW_DEF_MM
void TransformEllipseToBeziers(const ELLIPSE< T > &aEllipse, std::vector< BEZIER< T > > &aBeziers)
Transforms an ellipse or elliptical arc into a set of quadratic Bezier curves that approximate it.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
std::map< wxString, ValueType, DETAIL::CASE_INSENSITIVE_COMPARER > CASE_INSENSITIVE_MAP
std::map< wxString, wxString > ReadProperties()
size_t GetRemainingBytes() const
std::map< wxString, wxString > ReadProperties(std::function< std::map< wxString, wxString >(const std::string &)> handleBinaryData=[](const std::string &) { return std::map< wxString, wxString >();})
std::string ReadShortPascalString()
std::map< wxString, ALTIUM_SYMBOL_DATA > GetLibSymbols(const CFB::COMPOUND_FILE_ENTRY *aStart) const
const CFB::COMPOUND_FILE_ENTRY * FindStream(const std::vector< std::string > &aStreamPath) const
std::pair< int, std::string * > ReadCompressedString()
static int ReadInt(const std::map< wxString, wxString > &aProps, const wxString &aKey, int aDefault)
static wxString ReadString(const std::map< wxString, wxString > &aProps, const wxString &aKey, const wxString &aDefault)
Bezier curves to polygon converter.
void GetPoly(std::vector< VECTOR2I > &aOutput, int aMaxError=10)
Convert a Bezier curve to a polygon.
Generic cubic Bezier representation.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr const Vec GetCenter() const
constexpr bool Contains(const Vec &aPoint) const
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
A base class for most all the KiCad significant classes used in schematics and boards.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void SetBezierC2(const VECTOR2I &aPt)
void SetCenter(const VECTOR2I &aCenter)
FILL_T GetFillMode() const
void SetLineStyle(const LINE_STYLE aStyle)
void SetFillColor(const COLOR4D &aColor)
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
COLOR4D GetFillColor() const
void SetEnd(const VECTOR2I &aEnd)
void SetBezierC1(const VECTOR2I &aPt)
void SetWidth(int aWidth)
void SetFillMode(FILL_T aFill)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
virtual void SetVisible(bool aVisible)
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
EE_TYPE Overlapping(const BOX2I &aRect) const
EE_TYPE OfType(KICAD_T aType) const
This class was created to handle importing ellipses from other file formats that support them nativel...
RAII class to set and restore the fontconfig reporter.
const wxString & GetName() const
Return a brief hard coded name for this IO interface.
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.
A color representation with 4 components: red, green, blue, alpha.
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
COLOR4D & FromCSSRGBA(int aRed, int aGreen, int aBlue, double aAlpha=1.0)
Initialize the color from a RGBA value with 0-255 red/green/blue and 0-1 alpha.
A logical library item identifier and consists of various portions much like a URI.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
static UTF8 FixIllegalChars(const UTF8 &aLibItemName, bool aLib)
Replace illegal LIB_ID item name characters with underscores '_'.
Define a library symbol object.
void FixupDrawItems()
This function finds the filled draw items that are covering up smaller draw items and replaces their ...
wxString GetName() const override
void SetUnitCount(int aCount, bool aDuplicateDrawItems)
Set the units per symbol count.
void SetDescription(const wxString &aDescription)
Gets the Description field text value */.
void SetKeyWords(const wxString &aKeyWords)
SCH_FIELD & GetValueField()
Return reference to the value field.
int GetUnitCount() const override
void SetLibId(const LIB_ID &aLibId)
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
virtual void SetName(const wxString &aName)
SCH_FIELD & GetReferenceField()
Return reference to the reference designator field.
static LOAD_INFO_REPORTER & GetInstance()
Describe the page size and margins of a paper page on which to eventually print or plot.
int GetHeightIU(double aIUScale) const
Gets the page height in IU.
bool SetType(PAGE_SIZE_TYPE aPageSize, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
static void SetCustomWidthMils(double aWidthInMils)
Set the width of Custom page in mils for any custom page constructed or made via SetType() after maki...
static void SetCustomHeightMils(double aHeightInMils)
Set the height of Custom page in mils for any custom page constructed or made via SetType() after mak...
virtual const wxString GetProjectPath() const
Return the full path of the project.
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
bool ReadImageFile(const wxString &aFullFilename)
Read and store an image file.
void SetImageScale(double aScale)
Set the image "zoom" value.
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
Holds all the data relating to one schematic.
PROJECT & Project() const
Return a reference to the project this schematic is part of.
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
void SetTopLevelSheets(const std::vector< SCH_SHEET * > &aSheets)
void SetSize(const VECTOR2I &aSize)
VECTOR2I GetPosition() const override
Class for a wire to bus entry.
VECTOR2I GetPosition() const override
virtual const wxString & GetText() const override
Return the string associated with the text object.
void SetPosition(const VECTOR2I &aPosition) override
void SetText(const wxString &aText) override
void SetNameShown(bool aShown=true)
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this label.
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
void ParseFileHeader(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void ParseSignalHarness(const std::map< wxString, wxString > &aProperties)
std::map< int, ASCH_TEMPLATE > m_altiumTemplates
std::map< int, ASCH_SYMBOL > m_altiumComponents
void ParsePort(const ASCH_PORT &aElem)
bool IsComponentPartVisible(const ASCH_OWNER_INTERFACE &aElem) const
void ParseNote(const std::map< wxString, wxString > &aProperties)
void ParseAltiumSch(const wxString &aFileName)
std::vector< ASCH_PORT > m_altiumPortsCurrentSheet
void ParseSheetName(const std::map< wxString, wxString > &aProperties)
void ParseBusEntry(const std::map< wxString, wxString > &aProperties)
SCH_SHEET * getCurrentSheet()
void ParseStorage(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
std::map< wxString, LIB_SYMBOL * > m_powerSymbols
void ParseBus(const std::map< wxString, wxString > &aProperties)
void ParseFileName(const std::map< wxString, wxString > &aProperties)
static bool isASCIIFile(const wxString &aFileName)
LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aAliasName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
std::map< int, SCH_SHEET * > m_sheets
void ParseLibHeader(const ALTIUM_COMPOUND_FILE &aAltiumSchFile, std::vector< int > &aFontSizes)
void ParseHarnessPort(const ASCH_PORT &aElem)
void ParseRoundRectangle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
int GetModifyHash() const override
Return the modification hash from the library cache.
void ParseLibDesignator(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
std::map< wxString, CASE_INSENSITIVE_MAP< LIB_SYMBOL * > > m_libCache
std::map< int, int > m_altiumImplementationList
void ParseTextFrame(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
void ParsePolygon(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void fixupSymbolPinNameNumbers(SYMBOL *aSymbol)
void ParseRecord(int index, std::map< wxString, wxString > &properties, const wxString &aSectionName)
std::vector< ASCH_PORT > m_altiumHarnessPortsCurrentSheet
void ParseDesignator(const std::map< wxString, wxString > &aProperties)
int m_harnessOwnerIndexOffset
void ParsePortHelper(const ASCH_PORT &aElem)
static bool checkFileHeader(const wxString &aFileName)
long long getLibraryTimestamp(const wxString &aLibraryPath) const
void ParseSheetEntry(const std::map< wxString, wxString > &aProperties)
static bool isBinaryFile(const wxString &aFileName)
void ParseHarnessType(const std::map< wxString, wxString > &aProperties)
void ParseJunction(const std::map< wxString, wxString > &aProperties)
void ParseLibParameter(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
void ParseASCIISchematic(const wxString &aFileName)
void ParsePolyline(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::unique_ptr< ASCH_SHEET > m_altiumSheet
void ParseComponent(int aIndex, const std::map< wxString, wxString > &aProperties)
std::unique_ptr< TITLE_BLOCK > m_currentTitleBlock
SCH_SHEET * LoadSchematicProject(SCHEMATIC *aSchematic, const std::map< std::string, UTF8 > *aProperties)
void ParseImage(const std::map< wxString, wxString > &aProperties)
void ParseArc(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseNetLabel(const std::map< wxString, wxString > &aProperties)
void ParseNoERC(const std::map< wxString, wxString > &aProperties)
SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load information from some input file format that this SCH_IO implementation knows about,...
std::unordered_map< wxString, SEVERITY > m_errorMessages
void ParseImplementationList(int aIndex, const std::map< wxString, wxString > &aProperties)
std::vector< LIB_SYMBOL * > ParseLibComponent(const std::map< wxString, wxString > &aProperties)
void ParseSheet(const std::map< wxString, wxString > &aProperties)
void ParseParameter(const std::map< wxString, wxString > &aProperties)
bool ShouldPutItemOnSheet(int aOwnerindex)
void AddLibTextBox(const ASCH_TEXT_FRAME *aElem, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
bool CanReadSchematicFile(const wxString &aFileName) const override
Checks if this SCH_IO can read the specified schematic file.
void ParsePieChart(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseEllipticalArc(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, HARNESS > m_altiumHarnesses
void ParseEllipse(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseWire(const std::map< wxString, wxString > &aProperties)
void ParseHarnessEntry(const std::map< wxString, wxString > &aProperties)
void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
void ParseImplementation(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseTemplate(int aIndex, const std::map< wxString, wxString > &aProperties)
void ParseAdditional(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void AddTextBox(const ASCH_TEXT_FRAME *aElem)
void ParsePowerPort(const std::map< wxString, wxString > &aProperties)
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
const ASCH_STORAGE_FILE * GetFileFromStorage(const wxString &aFilename) const
void ParseRectangle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void doEnumerateSymbolLib(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties, std::function< void(const wxString &, LIB_SYMBOL *)> aInserter)
std::vector< ASCH_STORAGE_FILE > m_altiumStorage
SCH_SHEET_PATH m_sheetPath
void ParseLabel(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
CASE_INSENSITIVE_MAP< LIB_SYMBOL * > ParseLibFile(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void ParseBezier(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseLine(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseCircle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, SCH_SYMBOL * > m_symbols
void ParseSheetSymbol(int aIndex, const std::map< wxString, wxString > &aProperties)
std::map< wxString, long long > m_timestamps
wxFileName getLibFileName()
SCH_SCREEN * getCurrentScreen()
void ParsePin(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, LIB_SYMBOL * > m_libSymbols
void ParseHarnessConnector(int aIndex, const std::map< wxString, wxString > &aProperties)
void ensureLoadedLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties)
virtual bool CanReadSchematicFile(const wxString &aFileName) const
Checks if this SCH_IO can read the specified schematic file.
SCH_IO(const wxString &aName)
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual void SetUnit(int aUnit)
void SetShape(LABEL_FLAG_SHAPE aShape)
void AutoplaceFields(SCH_SCREEN *aScreen, AUTOPLACE_ALGO aAlgo) override
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
Segment description base class to describe items which have 2 end points (track, wire,...
void SetStartPoint(const VECTOR2I &aPosition)
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
bool IsWire() const
Return true if the line is a wire.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetLineColor(const COLOR4D &aColor)
void SetLineWidth(const int aSize)
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
SEG GetSeg() const
Get the geometric aspect of the wire as a SEG.
bool IsBus() const
Return true if the line is a bus.
virtual void SetStroke(const STROKE_PARAMS &aStroke) override
COLOR4D GetLineColor() const
Return COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
void SetEndPoint(const VECTOR2I &aPosition)
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
std::vector< SCH_SHEET_INSTANCE > m_sheetInstances
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition.
void SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const KIID & GetUuid() const
bool IsTerminalPoint(const VECTOR2I &aPosition, int aLayer) const
Test if aPosition is a connection point on aLayer.
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
void SetPosition(const VECTOR2I &aPos) override
void SetFilled(bool aFilled) override
void SetStroke(const STROKE_PARAMS &aStroke) override
void AddPoint(const VECTOR2I &aPosition)
STROKE_PARAMS GetStroke() const override
VECTOR2I GetPosition() const override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
void SetPosition(const VECTOR2I &aPosition) override
void SetSide(SHEET_SIDE aEdge)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetBorderColor(KIGFX::COLOR4D aColor)
void SetFileName(const wxString &aFilename)
wxString GetFileName() const
Return the filename corresponding to this sheet.
void SetBackgroundColor(KIGFX::COLOR4D aColor)
void SetName(const wxString &aName)
SCH_SCREEN * GetScreen() const
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
void SetLibId(const LIB_ID &aName)
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
void SetPosition(const VECTOR2I &aPosition) override
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instances), if this entry does not already exist.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
void SetFootprintFieldText(const wxString &aFootprint)
VECTOR2I GetPosition() const override
void SetValueFieldText(const wxString &aValue, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString)
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
Simple container to manage line stroke parameters.
void SetLineStyle(LINE_STYLE aLineStyle)
void SetWidth(int aWidth)
void SetColor(const KIGFX::COLOR4D &aColor)
KIGFX::COLOR4D GetColor() const
static const char * PropPowerSymsOnly
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
const TRANSFORM & GetTransform() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
constexpr extended_type SquaredEuclideanNorm() const
Compute the squared euclidean norm of the vector, which is defined as (x ** 2 + y ** 2).
static REPORTER & GetInstance()
#define DEFAULT_PINNUM_SIZE
The default pin name size when creating pins(can be changed in preference menu)
#define DEFAULT_PINNAME_SIZE
The default selection highlight thickness (can be changed in preference menu)
#define DEFAULT_TEXT_SIZE
Ratio of the font height to the baseline of the text above the wire.
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
#define IS_NEW
New item, just created.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
static const std::string KiCadSchematicFileExtension
static const std::string KiCadSymbolLibFileExtension
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
bool fileStartsWithBinaryHeader(const wxString &aFilePath, const std::vector< uint8_t > &aHeader)
Check if a file starts with a defined binary header.
bool fileStartsWithPrefix(const wxString &aFilePath, const wxString &aPrefix, bool aIgnoreWhitespace)
Check if a file starts with a defined string.
const std::vector< uint8_t > COMPOUND_FILE_HEADER
const VECTOR2I & GetOtherEnd(const SEG &aSeg, const VECTOR2I &aPoint)
Get the end point of the segment that is not the given point.
bool signbit(T v)
Integral version of std::signbit that works all compilers.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ PT_INPUT
usual pin input: must be connected
@ PT_TRISTATE
tri state bus pin
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_OPENEMITTER
pin type open emitter
@ PT_OPENCOLLECTOR
pin type open collector
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
static COLOR4D GetColorFromInt(int color)
static void SetLibShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape, ALTIUM_SCH_RECORD aType, int aStrokeColor)
VECTOR2I HelperGeneratePowerPortGraphics(LIB_SYMBOL *aKsymbol, ASCH_POWER_PORT_STYLE aStyle, REPORTER *aReporter)
static void SetSchShapeLine(const ASCH_BORDER_INTERFACE &elem, SCH_SHAPE *shape)
static const VECTOR2I GetRelativePosition(const VECTOR2I &aPosition, const SCH_SYMBOL *aSymbol)
static void SetLibShapeLine(const ASCH_BORDER_INTERFACE &elem, SCH_SHAPE *shape, ALTIUM_SCH_RECORD aType)
static LINE_STYLE GetPlotDashType(const ASCH_POLYLINE_LINESTYLE linestyle)
static void SetSchShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape)
void SetTextPositioning(EDA_TEXT *text, ASCH_LABEL_JUSTIFICATION justification, ASCH_RECORD_ORIENTATION orientation)
Utility functions for working with shapes.
static std::vector< std::string > split(const std::string &aStr, const std::string &aDelim)
Split the input string into a vector of output strings.
LINE_STYLE
Dashed line types.
std::vector< VECTOR2I > points
std::vector< VECTOR2I > points
ASCH_LABEL_JUSTIFICATION justification
ASCH_RECORD_ORIENTATION orientation
ASCH_RECORD_ORIENTATION orientation
int m_primaryConnectionPosition
ASCH_SHEET_ENTRY_SIDE m_harnessConnectorSide
ASCH_SHEET_ENTRY_SIDE Side
ASCH_RECORD_ORIENTATION orientation
ASCH_LABEL_JUSTIFICATION justification
ASCH_POLYLINE_LINESTYLE LineStyle
ASCH_LABEL_JUSTIFICATION justification
ASCH_RECORD_ORIENTATION orientation
ASCH_RECORD_ORIENTATION orientation
ASCH_LABEL_JUSTIFICATION justification
ASCH_PIN_SYMBOL::PTYPE symbolOuterEdge
ASCH_PIN_ELECTRICAL electrical
ASCH_PIN_SYMBOL::PTYPE symbolInnerEdge
ASCH_RECORD_ORIENTATION orientation
std::vector< VECTOR2I > points
ASCH_POLYLINE_LINESTYLE LineStyle
std::vector< VECTOR2I > Points
ASCH_POWER_PORT_STYLE style
ASCH_RECORD_ORIENTATION orientation
ASCH_SHEET_ENTRY_SIDE side
ASCH_RECORD_ORIENTATION orientation
std::vector< VECTOR2I > points
wxString componentdescription
wxString sourcelibraryname
ASCH_TEXT_FRAME_ALIGNMENT Alignment
std::vector< VECTOR2I > points
int m_primaryConnectionPosition
ASCH_SHEET_ENTRY_SIDE m_harnessConnectorSide
std::vector< HARNESS_PORT > m_ports
A simple container for sheet instance information.
@ USER
The field ID hasn't been set yet; field is invalid.
@ INTERSHEET_REFS
Global label cross-reference page numbers.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
KIBIS top(path, &reporter)
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
wxString result
Test unit parsing edge cases and error handling.
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.