57#include <compoundfilereader.h>
67#include <wx/mstream.h>
68#include <wx/zstream.h>
69#include <wx/wfstream.h>
70#include <magic_enum.hpp>
84#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
85 0.94901960784313721, \
86 0.98431372549019602, 1.0 )
88#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
89 0.61960784313725492, \
90 0.78823529411764703, 1.0 )
102 int red = color & 0x0000FF;
103 int green = ( color & 0x00FF00 ) >> 8;
104 int blue = ( color & 0xFF0000 ) >> 16;
176 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
213 else if( elem.
AreaColor == aStrokeColor )
219 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
264 for(
auto& [
name, symbol] : lib )
316 std::vector<SCH_PIN*> pins = aSymbol->
GetPins();
318 bool names_visible =
false;
319 bool numbers_visible =
false;
323 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
324 names_visible =
true;
326 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
327 numbers_visible =
true;
338 if( !numbers_visible )
387 std::map<wxString, SCH_SHEET*> sheets;
388 wxFileName
project( aProperties->at(
"project_file" ) );
390 for(
auto& [ key, filestring] : *aProperties )
392 if( !key.starts_with(
"sch" ) )
398 wxFileName fn( filestring );
399 wxFileName kicad_fn( fn );
400 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
402 sheet->SetScreen( screen );
406 sheet->SetFileName( fn.GetFullPath() );
409 wxCHECK2( sheet && screen,
continue );
411 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
421 wxCHECK2( currentScreen,
continue );
425 currentScreen->
Append( sheetPtr );
426 sheets[fn.GetFullPath()] = sheetPtr;
440 for(
auto& [ filestring, sheet ] : sheets )
452 const std::map<std::string, UTF8>* aProperties )
454 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
456 wxFileName fileName( aFileName );
464 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
468 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
474 m_rootSheet->SetFileName( fileName.GetFullPath() );
478 if( aFileName.empty() )
497 if( !aFileName.empty() )
504 wxCHECK( rootScreen,
nullptr );
513 if( aFileName.empty() )
518 if( aFileName.empty() )
520 std::vector<SCH_SHEET*> topLevelSheets;
523 topLevelSheets.push_back(
static_cast<SCH_SHEET*
>( item ) );
525 if( !topLevelSheets.empty() )
546 int minWireWidth = std::numeric_limits<int>::max();
547 int minBusWidth = std::numeric_limits<int>::max();
551 std::vector<SCH_MARKER*> markers;
558 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
561 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
565 std::shared_ptr<NET_SETTINGS>& netSettings =
m_schematic->Project().GetProjectFile().NetSettings();
567 if( minWireWidth < std::numeric_limits<int>::max() )
568 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
570 if( minBusWidth < std::numeric_limits<int>::max() )
571 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
594 std::vector<SCH_LINE*> busLines;
595 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
603 busLines.push_back( line );
605 busLineMap[ line->
GetEndPoint() ].push_back( line );
612 auto it = busLineMap.find( aStart );
614 if( it == busLineMap.end() )
620 if( aVisited.count( line ) )
623 aVisited.insert( line );
644 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>();
645 alias->SetName( harness.m_name );
648 alias->Members().push_back( port.
m_name );
653 BOX2I box( harness.m_location, harness.m_size );
683 int delta_x =
center.x - pos.
x;
684 int delta_y =
center.y - pos.
y;
691 screen->
Append( busLine );
698 screen->
Append( busLine );
708 std::set<SCH_LINE*> visited;
709 SCH_LABEL* label = walkBusLine( pos, visited );
716 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
717 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
734 bool isVertical =
true;
736 if( harness.m_ports.size() > 1 )
738 VECTOR2I first = harness.m_ports.front().m_location;
739 VECTOR2I last = harness.m_ports.back().m_location;
741 if( first.
y == last.
y )
747 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
748 VECTOR2I top = harness.m_ports.front().m_entryLocation;
813 wxFileName parentFileName( aFileName );
820 wxFileName relative = parentFileName;
823 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
841 catch(
const CFB::CFBException& exception )
845 catch(
const std::exception& exc )
847 wxLogTrace(
traceAltiumSch, wxS(
"Unhandled exception in Altium schematic parser: %s." ),
858 wxCHECK( currentScreen, );
866 wxCHECK2( sheet,
continue );
870 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
872 if( !loadAltiumFileName.IsFileReadable() )
876 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
877 wxDIR_FILES | wxDIR_HIDDEN );
879 for(
const wxString& candidate : files )
881 wxFileName candidateFname( candidate );
883 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false ) )
885 loadAltiumFileName = candidateFname;
891 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
893 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
894 "this is probably an Altium signal harness "
895 "that got converted to a sheet." ),
902 m_rootSheet->SearchHierarchy( loadAltiumFileName.GetFullPath(), &loadedScreen );
908 wxFileName projectFileName = loadAltiumFileName;
909 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
911 sheet->
SetFileName( projectFileName.GetFullName() );
919 if( sheet->
GetName().Trim().empty() )
920 sheet->
SetName( loadAltiumFileName.GetName() );
922 wxCHECK2( screen,
continue );
929 wxFileName projectFileName = loadAltiumFileName;
930 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
932 sheet->
SetFileName( projectFileName.GetFullName() );
933 screen->
SetFileName( projectFileName.GetFullPath() );
943 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
945 if( file ==
nullptr )
950 std::map<wxString, wxString> properties = reader.
ReadProperties();
957 for(
int i = 0; i < weight; i++ )
967 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
976 wxString streamName = wxS(
"Additional" );
978 const CFB::COMPOUND_FILE_ENTRY* file =
979 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
981 if( file ==
nullptr )
992 std::map<wxString, wxString> properties = reader.
ReadProperties();
1003 std::map<wxString, wxString> properties = reader.
ReadProperties();
1027 wxString streamName = wxS(
"FileHeader" );
1029 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1031 if( file ==
nullptr )
1042 std::map<wxString, wxString> properties = reader.
ReadProperties();
1046 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1059 std::map<wxString, wxString> properties = reader.
ReadProperties();
1071 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1081 symbol.second->SetLibSymbol( libSymbolIt->second );
1118 while( storageReader.
CanRead() )
1120 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1123 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1137 std::map<wxString, wxString> properties = reader.
ReadProperties();
1141 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1156 std::map<wxString, wxString> properties = reader.
ReadProperties();
1159 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1165 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1178 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1188 symbol.second->SetLibSymbol( libSymbolIt->second );
1228 const wxString& aSectionName )
1424 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1455 if( file.filename.IsSameAs( aFilename ) )
1458 if( file.filename.EndsWith( aFilename ) )
1459 nonExactMatch = &file;
1462 return nonExactMatch;
1469 wxCHECK( currentSheet, );
1471 wxString sheetName = currentSheet->
GetName();
1473 if( sheetName.IsEmpty() )
1474 sheetName = wxT(
"root" );
1482 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
1483 "replaced with symbol \"%s\"." ),
1495 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1520 field.SetVisible(
false );
1545 screen->
Append( symbol );
1554 wxCHECK( currentSheet, );
1556 wxString sheetName = currentSheet->
GetName();
1558 if( sheetName.IsEmpty() )
1559 sheetName = wxT(
"root" );
1564 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1566 if( baseName.IsEmpty() )
1567 baseName = wxS(
"Template" );
1575 std::vector<LIB_SYMBOL*>& aSymbol )
1590 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1599 schSymbol =
m_symbols.at( libSymbolIt->first );
1600 symbol = libSymbolIt->second;
1619 pin->SetVisible(
false );
1622 pin->SetNumberTextSize( 0 );
1625 pin->SetNameTextSize( 0 );
1661 pin->SetPosition( pinLocation );
1759 int vjustify, hjustify;
1762 switch( justification )
1785 switch( justification )
1808 switch( orientation )
1831 text->SetTextAngle( angle );
1850 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
1856 static const std::map<wxString, wxString> variableMap = {
1857 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
1858 {
"SHEETNUMBER",
"#" },
1859 {
"SHEETTOTAL",
"##" },
1860 {
"TITLE",
"TITLE" },
1861 {
"REVISION",
"REVISION" },
1862 {
"DATE",
"ISSUE_DATE" },
1863 {
"CURRENTDATE",
"CURRENT_DATE" },
1864 {
"COMPANYNAME",
"COMPANY" },
1865 {
"DOCUMENTNAME",
"FILENAME" },
1866 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
1867 {
"PROJECTNAME",
"PROJECTNAME" },
1875 size_t fontId =
static_cast<int>( elem.
fontId );
1892 screen->
Append( textItem );
1912 symbol = libSymbolIt->second;
1913 schsym =
m_symbols.at( libSymbolIt->first );
1928 size_t fontId = elem.
fontId;
1939 else if( fontId > 0 && fontId <= aFontSizes.size() )
1941 int size = aFontSizes[fontId - 1];
1949 std::vector<LIB_SYMBOL*>& aSymbol,
1950 std::vector<int>& aFontSizes )
1977 textBox->
SetStart( sheetTopRight );
1978 textBox->
SetEnd( sheetBottomLeft );
2008 size_t fontId =
static_cast<int>( aElem->
FontID );
2026 screen->
Append( textBox );
2031 std::vector<int>& aFontSizes )
2050 symbol = libSymbolIt->second;
2051 schsym =
m_symbols.at( libSymbolIt->first );
2099 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2101 int size = aFontSizes[aElem->
FontID - 1];
2108 std::vector<LIB_SYMBOL*>& aSymbol )
2112 if( elem.
points.size() < 2 )
2114 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2115 static_cast<int>( elem.
points.size() ) ),
2123 wxCHECK( currentScreen, );
2125 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2127 if( i + 2 == elem.
points.size() )
2138 currentScreen->
Append( line );
2143 std::vector<VECTOR2I> bezierPoints;
2144 std::vector<VECTOR2I> polyPoints;
2146 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2147 bezierPoints.push_back( elem.
points.at( j ) );
2150 converter.
GetPoly( polyPoints );
2152 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2161 currentScreen->
Append( line );
2179 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2185 symbol = libSymbolIt->second;
2186 schsym =
m_symbols.at( libSymbolIt->first );
2192 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2194 if( i + 2 == elem.
points.size() )
2202 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2214 else if( i + 3 == elem.
points.size() )
2225 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2245 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2254 case 0: bezier->
SetStart( pos );
break;
2257 case 3: bezier->
SetEnd( pos );
break;
2271 std::vector<LIB_SYMBOL*>& aSymbol )
2275 if( elem.
Points.size() < 2 )
2283 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2311 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2317 symbol = libSymbolIt->second;
2318 schsym =
m_symbols.at( libSymbolIt->first );
2347 std::vector<LIB_SYMBOL*>& aSymbol )
2381 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2387 symbol = libSymbolIt->second;
2388 schsym =
m_symbols.at( libSymbolIt->first );
2429 std::vector<LIB_SYMBOL*>& aSymbol )
2462 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
2468 symbol = libSymbolIt->second;
2469 schsym =
m_symbols.at( libSymbolIt->first );
2487 int radius = std::min( width / 2, height / 2 );
2523 std::vector<LIB_SYMBOL*>& aSymbol )
2531 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
2537 wxCHECK( currentScreen, );
2562 currentScreen->
Append( arc );
2583 symbol = libSymbolIt->second;
2584 schsym =
m_symbols.at( libSymbolIt->first );
2627 std::vector<LIB_SYMBOL*>& aSymbol )
2641 wxCHECK( currentScreen, );
2647 std::vector<BEZIER<int>> beziers;
2654 schbezier->
SetStart( bezier.Start );
2657 schbezier->
SetEnd( bezier.End );
2661 currentScreen->
Append( schbezier );
2677 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2683 symbol = libSymbolIt->second;
2684 schsym =
m_symbols.at( libSymbolIt->first );
2694 std::vector<BEZIER<int>> beziers;
2714 schbezier->
SetStart( bezier.Start );
2717 schbezier->
SetEnd( bezier.End );
2728 std::vector<LIB_SYMBOL*>& aSymbol )
2738 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
2774 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
2780 symbol = libSymbolIt->second;
2781 schsym =
m_symbols.at( libSymbolIt->first );
2811 std::vector<LIB_SYMBOL*>& aSymbol )
2836 std::vector<BEZIER<int>> beziers;
2837 std::vector<VECTOR2I> polyPoints;
2844 schbezier->
SetStart( bezier.Start );
2847 schbezier->
SetEnd( bezier.End );
2853 screen->
Append( schbezier );
2855 polyPoints.push_back( bezier.Start );
2865 for(
const VECTOR2I& point : polyPoints )
2868 schpoly->
AddPoint( polyPoints[0] );
2870 screen->
Append( schpoly );
2891 symbol = libSymbolIt->second;
2892 schsym =
m_symbols.at( libSymbolIt->first );
2898 std::vector<BEZIER<int>> beziers;
2899 std::vector<VECTOR2I> polyPoints;
2911 libbezier->
SetStart( bezier.Start );
2914 libbezier->
SetEnd( bezier.End );
2928 polyPoints.push_back( libbezier->
GetStart() );
2939 for(
const VECTOR2I& point : polyPoints )
2942 libline->
AddPoint( polyPoints[0] );
2952 std::vector<LIB_SYMBOL*>& aSymbol )
2972 circle->SetFilled(
false );
2994 symbol = libSymbolIt->second;
2995 schsym =
m_symbols.at( libSymbolIt->first );
3017 std::vector<LIB_SYMBOL*>& aSymbol )
3053 symbol = libSymbolIt->second;
3054 schsym =
m_symbols.at( libSymbolIt->first );
3091 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3104 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3111 wxString>& aProperties )
3120 HARNESS& harness = it->second;
3148 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3162 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3168 HARNESS& harness = harnessIt->second;
3205 harness.
m_ports.emplace_back( port );
3217 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3223 HARNESS& harness = harnessIt->second;
3229 std::vector<LIB_SYMBOL*>& aSymbol )
3244 rect->
SetEnd( sheetBottomLeft );
3264 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3270 symbol = libSymbolIt->second;
3271 schsym =
m_symbols.at( libSymbolIt->first );
3285 rect->
SetEnd( sheetBottomLeft );
3313 wxCHECK( currentScreen, );
3314 currentScreen->
Append( sheet );
3323 wxCHECK( rootScreen, );
3331 m_sheets.insert( { aIndex, sheet } );
3349 sheetIt->second->AddPin( sheetPin );
3356 VECTOR2I pos = sheetIt->second->GetPosition();
3357 VECTOR2I size = sheetIt->second->GetSize();
3594 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3619 wxString symName( elem.
text );
3620 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3622 if( !styleName.empty() )
3623 symName <<
'_' << styleName;
3632 libSymbol = powerSymbolIt->second;
3638 libSymbol->
SetName( symName );
3643 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
3653 pin->SetPosition( { 0, 0 } );
3654 pin->SetLength( 0 );
3656 pin->SetVisible(
false );
3713 screen->
Append( symbol );
3741 switch( aElem.
Style )
3771 bool connectionFound = startIsWireTerminal
3772 || startIsBusTerminal
3773 || endIsWireTerminal
3774 || endIsBusTerminal;
3776 if( !connectionFound )
3780 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
3783 BOX2I bbox( harness.m_location, harness.m_size );
3788 startIsBusTerminal =
true;
3789 connectionFound =
true;
3795 endIsBusTerminal =
true;
3796 connectionFound =
true;
3801 if( !connectionFound )
3809 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
3833 switch( aElem.
Style )
3840 if( ( startIsWireTerminal || startIsBusTerminal ) )
3851 if( ( startIsWireTerminal || startIsBusTerminal ) )
3865 if( ( startIsWireTerminal && endIsWireTerminal ) )
3873 else if( startIsBusTerminal && endIsBusTerminal )
3896 screen->
Append( noConnect );
3924 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3943 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3965 screen->
Append( junction );
3977 && component->second.currentpartid != elem.
ownerpartid )
3981 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
3993 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file %s not found in storage." ),
3999 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4002 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4003 wxZlibInputStream zlibInputStream( fileStream );
4004 wxFFileOutputStream outputStream( storagePath );
4005 outputStream.Write( zlibInputStream );
4006 outputStream.Close();
4010 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
4016 wxRemoveFile( storagePath );
4020 if( !wxFileExists( elem.
filename ) )
4038 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4039 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4042 bitmap->SetFlags(
IS_NEW );
4043 screen->
Append( bitmap.release() );
4049 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4101 wxCHECK( currentScreen, );
4107 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4113 wxString sheetName = elem.
text;
4114 std::set<wxString> sheetNames;
4119 sheetNames.insert( sheet->
GetName() );
4122 for(
int ii = 1; ; ++ii )
4124 if( sheetNames.find( sheetName ) == sheetNames.end() )
4127 sheetName = elem.
text + wxString::Format( wxT(
"_%d" ), ii );
4133 sheetNameField->
SetText( sheetName );
4147 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4173 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4187 bool emptyRef = elem.
text.IsEmpty();
4192 bool visible = !emptyRef;
4204 std::vector<LIB_SYMBOL*>& aSymbol,
4205 std::vector<int>& aFontSizes )
4212 bool emptyRef = elem.
text.IsEmpty();
4213 SCH_FIELD& refField = symbol->GetReferenceField();
4216 refField.
SetText( wxT(
"X" ) );
4222 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4224 int size = aFontSizes[elem.
fontId - 1];
4241 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4244 screen->
Append( busWireEntry );
4253 static const std::map<wxString, wxString> variableMap = {
4254 {
"COMMENT",
"VALUE" },
4255 {
"VALUE",
"ALTIUM_VALUE" },
4261 if( elem.
text ==
"*" )
4264 wxString paramName = elem.
name.Upper();
4266 if( paramName ==
"SHEETNUMBER" )
4270 else if( paramName ==
"TITLE" )
4274 else if( paramName ==
"REVISION" )
4278 else if( paramName ==
"DATE" )
4282 else if( paramName ==
"COMPANYNAME" )
4303 wxString upperName = elem.
name.Upper();
4305 if( upperName ==
"COMMENT" )
4311 wxString fieldName = elem.
name.Upper();
4313 if( fieldName.IsEmpty() )
4315 int disambiguate = 1;
4319 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4321 if( !symbol->
GetField( fieldName ) )
4325 else if( fieldName ==
"VALUE" )
4327 fieldName =
"ALTIUM_VALUE";
4344 std::vector<LIB_SYMBOL*>& aSymbol,
4345 std::vector<int>& aFontSizes )
4366 std::map<wxString, wxString> variableMap = {
4367 {
"COMMENT",
"VALUE" },
4373 wxString upperName = elem.
name.Upper();
4375 if( upperName ==
"COMMENT" )
4377 field = &libSymbol->GetValueField();
4381 wxString fieldNameStem = elem.
name;
4382 wxString fieldName = fieldNameStem;
4383 int disambiguate = 1;
4385 if( fieldName.IsEmpty() )
4387 fieldNameStem =
"ALTIUM_UNNAMED";
4388 fieldName =
"ALTIUM_UNNAMED_1";
4391 else if( upperName ==
"VALUE" )
4393 fieldNameStem =
"ALTIUM_VALUE";
4394 fieldName =
"ALTIUM_VALUE";
4398 while( libSymbol->GetField( fieldName ) )
4399 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4402 libSymbol->AddField( new_field );
4413 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4415 int size = aFontSizes[elem.
fontId - 1];
4429 const std::map<wxString, wxString>& aProperties )
4438 std::vector<LIB_SYMBOL*>& aSymbol )
4442 if( elem.
type != wxS(
"PCBLIB" ) )
4446 if( aSymbol.size() == 0 && !elem.
isCurrent )
4452 wxArrayString fpFilters;
4453 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4456 if( !aSymbol.empty() )
4462 symbol->SetFPFilters( fpFilters );
4473 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4479 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4483 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4484 implementationOwnerIt->second ),
4491 libSymbolIt->second->SetFPFilters( fpFilters );
4501 wxString>& aProperties )
4505 std::vector<LIB_SYMBOL*> symbols;
4514 symbol->
SetName( wxString::Format(
"%s (Altium Display %d)", elem.
libreference, i + 1 ) );
4522 symbols.push_back( symbol );
4533 std::vector<int> fontSizes;
4534 struct SYMBOL_PIN_FRAC
4543 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4545 for(
auto& [
name, entry] : syms )
4547 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4549 if( entry.m_pinsFrac )
4551 auto parse_binary_pin_frac =
4552 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4554 std::map<wxString, wxString>
result;
4560 SYMBOL_PIN_FRAC pinFrac;
4564 pinFrac.len_frac = binreader.
ReadInt32();
4565 pinFracs.insert( { pinFracData.first, pinFrac } );
4577 std::vector<LIB_SYMBOL*> symbols;
4584 std::map<wxString, wxString> properties = reader.
ReadProperties();
4589 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4594 auto handleBinaryPinLambda =
4595 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4597 std::map<wxString, wxString>
result;
4601 int32_t recordId = binreader.
ReadInt32();
4606 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4608 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4609 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4610 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4611 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4612 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4613 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4616 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4617 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4618 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4619 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4620 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4626 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4628 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4629 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4630 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4634 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4636 if( partSeqSplit.size() == 3 )
4638 result[
"PART"] = partSeqSplit[0];
4639 result[
"SEQ"] = partSeqSplit[2];
4647 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4649 if( properties.empty() )
4698 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
4712 for(
size_t ii = 0; ii < symbols.size(); ii++ )
4720 if( valField.
GetText().IsEmpty() )
4723 if( symbols.size() == 1 )
4726 ret[wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 )] = symbol;
4736 wxFileName fn( aLibraryPath );
4738 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
4739 return fn.GetModificationTime().GetValue().GetValue();
4746 const std::map<std::string, UTF8>* aProperties )
4759 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
4761 wxFileName fileName( aLibraryPath );
4766 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
4770 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
4772 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
4776 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
4778 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
4780 for(
const auto& [schLibName, cfe] : schLibFiles )
4782 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
4784 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
4785 compoundFiles.emplace_back( std::move( decodedStream ) );
4791 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
4794 cacheMapRef.insert( parsed.begin(), parsed.end() );
4799 catch(
const CFB::CFBException& exception )
4803 catch(
const std::exception& exc )
4805 wxFAIL_MSG( wxString::Format( wxT(
"Unhandled exception in Altium schematic parsers: %s." ),
4813 std::vector<int>& aFontSizes )
4815 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
4817 if( file ==
nullptr )
4825 std::map<wxString, wxString> properties = reader.
ReadProperties();
4829 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
4830 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
4832 for(
auto& [key, value] : properties )
4834 wxString upperKey = key.Upper();
4837 if( upperKey.StartsWith(
"SIZE", &remaining ) )
4839 if( !remaining.empty() )
4841 int ind = wxAtoi( remaining );
4843 if(
static_cast<int>( aFontSizes.size() ) < ind )
4844 aFontSizes.resize( ind );
4847 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
4848 aFontSizes[ind - 1] = scaled;
4856 const std::map<std::string, UTF8>* aProperties,
4857 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
4861 bool powerSymbolsOnly = ( aProperties &&
4868 for(
auto& [libnameStr, libSymbol] : it->second )
4870 if( powerSymbolsOnly && !libSymbol->IsPower() )
4873 aInserter( libnameStr, libSymbol );
4880 const std::map<std::string, UTF8>* aProperties )
4885 aSymbolNameList.Add( aStr );
4891 const wxString& aLibraryPath,
4892 const std::map<std::string, UTF8>* aProperties )
4897 aSymbolList.emplace_back( aSymbol );
4903 const std::map<std::string, UTF8>* aProperties )
4911 auto it2 = it->second.find( aAliasName );
4913 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)
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)
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)
void SetPosition(const VECTOR2I &aPosition) override
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.
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.
virtual std::vector< SCH_PIN * > GetPins() const =0
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
static const wxChar traceAltiumSch[]
Flag to enable Altium schematic debugging output.
#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.