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++ );
452 if( sheet->GetName().Trim().empty() )
454 wxString baseName = wxFileName( fn ).GetName();
455 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
457 wxString sheetName = baseName;
458 std::set<wxString> existingNames;
460 for(
auto& [
path, existing] : sheets )
461 existingNames.insert( existing->GetName() );
463 for(
int ii = 1; existingNames.count( sheetName ); ++ii )
464 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
466 sheet->SetName( sheetName );
474 wxCHECK2( currentScreen,
continue );
478 currentScreen->
Append( sheetPtr );
481 sheets[kicad_fn.GetFullPath()] = sheetPtr;
495 for(
auto& [ filestring, sheet ] : sheets )
507 const std::map<std::string, UTF8>* aProperties )
509 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
511 wxFileName fileName( aFileName );
519 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
523 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
529 m_rootSheet->SetFileName( fileName.GetFullPath() );
534 if( aFileName.empty() )
557 if( !aFileName.empty() )
564 wxCHECK( rootScreen,
nullptr );
573 if( aFileName.empty() )
578 if( aFileName.empty() )
580 std::vector<SCH_SHEET*> topLevelSheets;
588 topLevelSheets.push_back( sheet );
594 rootScreen->
Remove( sheet );
596 if( !topLevelSheets.empty() )
608 std::vector<SCH_HIERLABEL*> hierLabels;
616 hierLabel->GetText() );
617 globalLabel->
SetShape( hierLabel->GetShape() );
621 screen->
Remove( hierLabel );
622 screen->
Append( globalLabel );
645 int minWireWidth = std::numeric_limits<int>::max();
646 int minBusWidth = std::numeric_limits<int>::max();
650 std::vector<SCH_MARKER*> markers;
657 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
660 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
664 std::shared_ptr<NET_SETTINGS>& netSettings =
m_schematic->Project().GetProjectFile().NetSettings();
666 if( minWireWidth < std::numeric_limits<int>::max() )
667 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
669 if( minBusWidth < std::numeric_limits<int>::max() )
670 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
693 std::vector<SCH_LINE*> busLines;
694 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
702 busLines.push_back( line );
704 busLineMap[ line->
GetEndPoint() ].push_back( line );
711 auto it = busLineMap.find( aStart );
713 if( it == busLineMap.end() )
719 if( aVisited.count( line ) )
722 aVisited.insert( line );
743 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>();
744 alias->SetName( harness.m_name );
747 alias->AddMember( port.
m_name );
752 BOX2I box( harness.m_location, harness.m_size );
782 int delta_x =
center.x - pos.
x;
783 int delta_y =
center.y - pos.
y;
790 screen->
Append( busLine );
797 screen->
Append( busLine );
807 std::set<SCH_LINE*> visited;
808 SCH_LABEL* label = walkBusLine( pos, visited );
815 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
816 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
833 bool isVertical =
true;
835 if( harness.m_ports.size() > 1 )
837 VECTOR2I first = harness.m_ports.front().m_location;
838 VECTOR2I last = harness.m_ports.back().m_location;
840 if( first.
y == last.
y )
846 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
847 VECTOR2I top = harness.m_ports.front().m_entryLocation;
912 wxFileName parentFileName( aFileName );
919 wxFileName relative = parentFileName;
922 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
940 catch(
const CFB::CFBException& exception )
944 catch(
const std::exception& exc )
946 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium schematic: %s" ), exc.what() ) );
955 wxCHECK( currentScreen, );
963 wxCHECK2( sheet,
continue );
967 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
969 if( !loadAltiumFileName.IsFileReadable() )
973 if( !loadAltiumFileName.HasExt() )
975 wxFileName withExt( loadAltiumFileName );
976 withExt.SetExt( wxT(
"SchDoc" ) );
978 if( withExt.IsFileReadable() )
979 loadAltiumFileName = withExt;
983 if( !loadAltiumFileName.IsFileReadable() )
988 bool extensionless = !sheetFn.HasExt();
991 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
992 wxDIR_FILES | wxDIR_HIDDEN );
994 for(
const wxString& candidate : files )
996 wxFileName candidateFname( candidate );
998 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false )
1000 && !sheetFn.GetName().empty()
1001 && candidateFname.GetName().IsSameAs( sheetFn.GetName(),
false )
1002 && candidateFname.GetExt().IsSameAs( wxT(
"SchDoc" ),
false ) ) )
1004 loadAltiumFileName = candidateFname;
1010 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
1012 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
1013 "this is probably an Altium signal harness "
1014 "that got converted to a sheet." ),
1021 m_rootSheet->SearchHierarchy( loadAltiumFileName.GetFullPath(), &loadedScreen );
1027 wxFileName projectFileName = loadAltiumFileName;
1028 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1030 sheet->
SetFileName( projectFileName.GetFullName() );
1050 if( baseRef.StartsWith( wxT(
"#" ) ) )
1057 wxString newRef = baseRef + wxT(
"_" ) + sheet->
GetName();
1069 if( sheet->
GetName().Trim().empty() )
1071 wxString baseName = loadAltiumFileName.GetName();
1072 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
1074 wxString sheetName = baseName;
1075 std::set<wxString> sheetNames;
1080 sheetNames.insert( otherSheet->
GetName() );
1083 for(
int ii = 1; ; ++ii )
1085 if( sheetNames.find( sheetName ) == sheetNames.end() )
1088 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
1094 wxCHECK2( screen,
continue );
1101 wxFileName projectFileName = loadAltiumFileName;
1102 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1104 sheet->
SetFileName( projectFileName.GetFullName() );
1105 screen->
SetFileName( projectFileName.GetFullPath() );
1115 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
1117 if( file ==
nullptr )
1122 std::map<wxString, wxString> properties = reader.
ReadProperties();
1129 for(
int i = 0; i < weight; i++ )
1139 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
1148 wxString streamName = wxS(
"Additional" );
1150 const CFB::COMPOUND_FILE_ENTRY* file =
1151 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1153 if( file ==
nullptr )
1160 THROW_IO_ERROR(
"Additional section does not contain any data" );
1164 std::map<wxString, wxString> properties = reader.
ReadProperties();
1175 std::map<wxString, wxString> properties = reader.
ReadProperties();
1199 wxString streamName = wxS(
"FileHeader" );
1201 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1203 if( file ==
nullptr )
1214 std::map<wxString, wxString> properties = reader.
ReadProperties();
1218 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1231 std::map<wxString, wxString> properties = reader.
ReadProperties();
1243 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1253 symbol.second->SetLibSymbol( libSymbolIt->second );
1290 while( storageReader.
CanRead() )
1292 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1295 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1309 std::map<wxString, wxString> properties = reader.
ReadProperties();
1313 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1328 std::map<wxString, wxString> properties = reader.
ReadProperties();
1331 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1337 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1350 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1360 symbol.second->SetLibSymbol( libSymbolIt->second );
1400 const wxString& aSectionName )
1596 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1627 if( file.filename.IsSameAs( aFilename ) )
1630 if( file.filename.EndsWith( aFilename ) )
1631 nonExactMatch = &file;
1634 return nonExactMatch;
1641 wxCHECK( currentSheet, );
1643 wxString sheetName = currentSheet->
GetName();
1645 if( sheetName.IsEmpty() )
1646 sheetName = wxT(
"root" );
1654 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
1655 "replaced with symbol \"%s\"." ),
1667 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1692 field.SetVisible(
false );
1730 screen->
Append( symbol );
1739 wxCHECK( currentSheet, );
1741 wxString sheetName = currentSheet->
GetName();
1743 if( sheetName.IsEmpty() )
1744 sheetName = wxT(
"root" );
1749 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1751 if( baseName.IsEmpty() )
1752 baseName = wxS(
"Template" );
1760 std::vector<LIB_SYMBOL*>& aSymbol )
1775 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1784 schSymbol =
m_symbols.at( libSymbolIt->first );
1785 symbol = libSymbolIt->second;
1804 pin->SetVisible(
false );
1807 pin->SetNumberTextSize( 0 );
1810 pin->SetNameTextSize( 0 );
1853 VECTOR2I dir = bodyEnd - pinLocation;
1861 pin->SetPosition( pinLocation );
1959 int vjustify, hjustify;
1962 switch( justification )
1985 switch( justification )
2008 switch( orientation )
2031 text->SetTextAngle( angle );
2101 int nRenderRotations = ( aSymbol.
orientation + 1 ) % 4;
2115 for(
int i = 0; i < nRenderRotations; i++ )
2135 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
2141 static const std::map<wxString, wxString> variableMap = {
2142 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
2143 {
"SHEETNUMBER",
"#" },
2144 {
"SHEETTOTAL",
"##" },
2145 {
"TITLE",
"TITLE" },
2146 {
"REVISION",
"REVISION" },
2147 {
"DATE",
"ISSUE_DATE" },
2148 {
"CURRENTDATE",
"CURRENT_DATE" },
2149 {
"COMPANYNAME",
"COMPANY" },
2150 {
"DOCUMENTNAME",
"FILENAME" },
2151 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
2152 {
"PROJECTNAME",
"PROJECTNAME" },
2160 size_t fontId =
static_cast<int>( elem.
fontId );
2177 screen->
Append( textItem );
2197 symbol = libSymbolIt->second;
2198 schsym =
m_symbols.at( libSymbolIt->first );
2221 size_t fontId = elem.
fontId;
2232 else if( fontId > 0 && fontId <= aFontSizes.size() )
2234 int size = aFontSizes[fontId - 1];
2242 std::vector<LIB_SYMBOL*>& aSymbol,
2243 std::vector<int>& aFontSizes )
2270 textBox->
SetStart( sheetTopRight );
2271 textBox->
SetEnd( sheetBottomLeft );
2301 size_t fontId =
static_cast<int>( aElem->
FontID );
2319 screen->
Append( textBox );
2324 std::vector<int>& aFontSizes )
2343 symbol = libSymbolIt->second;
2344 schsym =
m_symbols.at( libSymbolIt->first );
2392 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2394 int size = aFontSizes[aElem->
FontID - 1];
2401 std::vector<LIB_SYMBOL*>& aSymbol )
2405 if( elem.
points.size() < 2 )
2407 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2408 static_cast<int>( elem.
points.size() ) ),
2416 wxCHECK( currentScreen, );
2418 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2420 if( i + 2 == elem.
points.size() )
2431 currentScreen->
Append( line );
2436 std::vector<VECTOR2I> bezierPoints;
2437 std::vector<VECTOR2I> polyPoints;
2439 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2440 bezierPoints.push_back( elem.
points.at( j ) );
2443 converter.
GetPoly( polyPoints );
2445 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2454 currentScreen->
Append( line );
2472 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2478 symbol = libSymbolIt->second;
2479 schsym =
m_symbols.at( libSymbolIt->first );
2485 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2487 if( i + 2 == elem.
points.size() )
2495 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2507 else if( i + 3 == elem.
points.size() )
2518 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2538 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2547 case 0: bezier->
SetStart( pos );
break;
2550 case 3: bezier->
SetEnd( pos );
break;
2564 std::vector<LIB_SYMBOL*>& aSymbol )
2568 if( elem.
Points.size() < 2 )
2576 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2604 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2610 symbol = libSymbolIt->second;
2611 schsym =
m_symbols.at( libSymbolIt->first );
2640 std::vector<LIB_SYMBOL*>& aSymbol )
2674 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2680 symbol = libSymbolIt->second;
2681 schsym =
m_symbols.at( libSymbolIt->first );
2722 std::vector<LIB_SYMBOL*>& aSymbol )
2755 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
2761 symbol = libSymbolIt->second;
2762 schsym =
m_symbols.at( libSymbolIt->first );
2780 int radius = std::min( width / 2, height / 2 );
2816 std::vector<LIB_SYMBOL*>& aSymbol )
2824 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
2830 wxCHECK( currentScreen, );
2855 currentScreen->
Append( arc );
2876 symbol = libSymbolIt->second;
2877 schsym =
m_symbols.at( libSymbolIt->first );
2926 std::vector<LIB_SYMBOL*>& aSymbol )
2940 wxCHECK( currentScreen, );
2946 std::vector<BEZIER<int>> beziers;
2953 schbezier->
SetStart( bezier.Start );
2956 schbezier->
SetEnd( bezier.End );
2960 currentScreen->
Append( schbezier );
2976 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2982 symbol = libSymbolIt->second;
2983 schsym =
m_symbols.at( libSymbolIt->first );
2993 std::vector<BEZIER<int>> beziers;
3013 schbezier->
SetStart( bezier.Start );
3016 schbezier->
SetEnd( bezier.End );
3027 std::vector<LIB_SYMBOL*>& aSymbol )
3037 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3073 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
3079 symbol = libSymbolIt->second;
3080 schsym =
m_symbols.at( libSymbolIt->first );
3110 std::vector<LIB_SYMBOL*>& aSymbol )
3135 std::vector<BEZIER<int>> beziers;
3136 std::vector<VECTOR2I> polyPoints;
3143 schbezier->
SetStart( bezier.Start );
3146 schbezier->
SetEnd( bezier.End );
3152 screen->
Append( schbezier );
3154 polyPoints.push_back( bezier.Start );
3164 for(
const VECTOR2I& point : polyPoints )
3167 schpoly->
AddPoint( polyPoints[0] );
3169 screen->
Append( schpoly );
3190 symbol = libSymbolIt->second;
3191 schsym =
m_symbols.at( libSymbolIt->first );
3197 std::vector<BEZIER<int>> beziers;
3198 std::vector<VECTOR2I> polyPoints;
3210 libbezier->
SetStart( bezier.Start );
3213 libbezier->
SetEnd( bezier.End );
3227 polyPoints.push_back( libbezier->
GetStart() );
3238 for(
const VECTOR2I& point : polyPoints )
3241 libline->
AddPoint( polyPoints[0] );
3251 std::vector<LIB_SYMBOL*>& aSymbol )
3271 circle->SetFilled(
false );
3293 symbol = libSymbolIt->second;
3294 schsym =
m_symbols.at( libSymbolIt->first );
3316 std::vector<LIB_SYMBOL*>& aSymbol )
3352 symbol = libSymbolIt->second;
3353 schsym =
m_symbols.at( libSymbolIt->first );
3390 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3403 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3410 wxString>& aProperties )
3419 HARNESS& harness = it->second;
3447 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3461 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3467 HARNESS& harness = harnessIt->second;
3504 harness.
m_ports.emplace_back( port );
3516 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3522 HARNESS& harness = harnessIt->second;
3528 std::vector<LIB_SYMBOL*>& aSymbol )
3543 rect->
SetEnd( sheetBottomLeft );
3563 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3569 symbol = libSymbolIt->second;
3570 schsym =
m_symbols.at( libSymbolIt->first );
3584 rect->
SetEnd( sheetBottomLeft );
3612 wxCHECK( currentScreen, );
3613 currentScreen->
Append( sheet );
3622 wxCHECK( rootScreen, );
3630 m_sheets.insert( { aIndex, sheet } );
3648 sheetIt->second->AddPin( sheetPin );
3650 wxString pinName = elem.
name;
3653 pinName += wxT(
"{" ) + elem.
harnessType + wxT(
"}" );
3660 VECTOR2I pos = sheetIt->second->GetPosition();
3661 VECTOR2I size = sheetIt->second->GetSize();
3898 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3923 wxString symName( elem.
text );
3924 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3926 if( !styleName.empty() )
3927 symName <<
'_' << styleName;
3936 libSymbol = powerSymbolIt->second;
3942 libSymbol->
SetName( symName );
3947 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
3957 pin->SetPosition( { 0, 0 } );
3958 pin->SetLength( 0 );
3960 pin->SetVisible(
false );
4017 screen->
Append( symbol );
4045 switch( aElem.
Style )
4075 bool connectionFound = startIsWireTerminal
4076 || startIsBusTerminal
4077 || endIsWireTerminal
4078 || endIsBusTerminal;
4080 if( !connectionFound )
4084 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
4087 BOX2I bbox( harness.m_location, harness.m_size );
4092 startIsBusTerminal =
true;
4093 connectionFound =
true;
4099 endIsBusTerminal =
true;
4100 connectionFound =
true;
4105 if( !connectionFound )
4113 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
4116 wxString labelName = aElem.
Name;
4119 labelName += wxT(
"{" ) + aElem.
HarnessType + wxT(
"}" );
4142 switch( aElem.
Style )
4149 if( ( startIsWireTerminal || startIsBusTerminal ) )
4160 if( ( startIsWireTerminal || startIsBusTerminal ) )
4174 if( ( startIsWireTerminal && endIsWireTerminal ) )
4182 else if( startIsBusTerminal && endIsBusTerminal )
4205 screen->
Append( noConnect );
4233 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4252 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4274 screen->
Append( junction );
4286 && component->second.currentpartid != elem.
ownerpartid )
4290 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
4302 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file %s not found in storage." ),
4308 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4311 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4312 wxZlibInputStream zlibInputStream( fileStream );
4313 wxFFileOutputStream outputStream( storagePath );
4314 outputStream.Write( zlibInputStream );
4315 outputStream.Close();
4319 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
4325 wxRemoveFile( storagePath );
4329 if( !wxFileExists( elem.
filename ) )
4347 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4348 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4351 bitmap->SetFlags(
IS_NEW );
4352 screen->
Append( bitmap.release() );
4358 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4410 wxCHECK( currentScreen, );
4416 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4422 wxString baseName = elem.
text;
4423 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
4425 wxString sheetName = baseName;
4426 std::set<wxString> sheetNames;
4431 sheetNames.insert( sheet->
GetName() );
4434 for(
int ii = 1; ; ++ii )
4436 if( sheetNames.find( sheetName ) == sheetNames.end() )
4439 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
4445 sheetNameField->
SetText( sheetName );
4459 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4485 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4499 bool emptyRef = elem.
text.IsEmpty();
4504 bool visible = !emptyRef;
4521 std::vector<LIB_SYMBOL*>& aSymbol,
4522 std::vector<int>& aFontSizes )
4529 bool emptyRef = elem.
text.IsEmpty();
4530 SCH_FIELD& refField = symbol->GetReferenceField();
4533 refField.
SetText( wxT(
"X" ) );
4540 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4542 int size = aFontSizes[elem.
fontId - 1];
4559 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4562 screen->
Append( busWireEntry );
4571 static const std::map<wxString, wxString> variableMap = {
4572 {
"COMMENT",
"VALUE" },
4573 {
"VALUE",
"ALTIUM_VALUE" },
4579 if( elem.
text ==
"*" )
4582 wxString paramName = elem.
name.Upper();
4584 if( paramName ==
"SHEETNUMBER" )
4588 else if( paramName ==
"TITLE" )
4592 else if( paramName ==
"REVISION" )
4596 else if( paramName ==
"DATE" )
4600 else if( paramName ==
"COMPANYNAME" )
4621 wxString upperName = elem.
name.Upper();
4623 if( upperName ==
"COMMENT" )
4629 wxString fieldName = elem.
name.Upper();
4631 if( fieldName.IsEmpty() )
4633 int disambiguate = 1;
4637 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4639 if( !symbol->
GetField( fieldName ) )
4643 else if( fieldName ==
"VALUE" )
4645 fieldName =
"ALTIUM_VALUE";
4667 std::vector<LIB_SYMBOL*>& aSymbol,
4668 std::vector<int>& aFontSizes )
4689 std::map<wxString, wxString> variableMap = {
4690 {
"COMMENT",
"VALUE" },
4696 wxString upperName = elem.
name.Upper();
4698 if( upperName ==
"COMMENT" )
4700 field = &libSymbol->GetValueField();
4704 wxString fieldNameStem = elem.
name;
4705 wxString fieldName = fieldNameStem;
4706 int disambiguate = 1;
4708 if( fieldName.IsEmpty() )
4710 fieldNameStem =
"ALTIUM_UNNAMED";
4711 fieldName =
"ALTIUM_UNNAMED_1";
4714 else if( upperName ==
"VALUE" )
4716 fieldNameStem =
"ALTIUM_VALUE";
4717 fieldName =
"ALTIUM_VALUE";
4721 while( libSymbol->GetField( fieldName ) )
4722 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4725 libSymbol->AddField( new_field );
4736 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4738 int size = aFontSizes[elem.
fontId - 1];
4752 const std::map<wxString, wxString>& aProperties )
4761 std::vector<LIB_SYMBOL*>& aSymbol )
4765 if( elem.
type != wxS(
"PCBLIB" ) )
4769 if( aSymbol.size() == 0 && !elem.
isCurrent )
4775 wxArrayString fpFilters;
4776 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4779 if( !aSymbol.empty() )
4785 symbol->SetFPFilters( fpFilters );
4796 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4802 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4806 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4807 implementationOwnerIt->second ),
4814 libSymbolIt->second->SetFPFilters( fpFilters );
4824 wxString>& aProperties )
4828 std::vector<LIB_SYMBOL*> symbols;
4837 symbol->
SetName( wxString::Format(
"%s (Altium Display %d)", elem.
libreference, i + 1 ) );
4845 symbols.push_back( symbol );
4856 std::vector<int> fontSizes;
4857 struct SYMBOL_PIN_FRAC
4866 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4868 for(
auto& [
name, entry] : syms )
4870 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4872 if( entry.m_pinsFrac )
4874 auto parse_binary_pin_frac =
4875 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4877 std::map<wxString, wxString>
result;
4883 SYMBOL_PIN_FRAC pinFrac;
4887 pinFrac.len_frac = binreader.
ReadInt32();
4888 pinFracs.insert( { pinFracData.first, pinFrac } );
4900 std::vector<LIB_SYMBOL*> symbols;
4907 std::map<wxString, wxString> properties = reader.
ReadProperties();
4912 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4917 auto handleBinaryPinLambda =
4918 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4920 std::map<wxString, wxString>
result;
4924 int32_t recordId = binreader.
ReadInt32();
4929 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4931 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4932 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4933 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4934 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4935 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4936 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4939 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4940 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4941 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4942 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4943 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4949 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4951 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4952 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4953 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4957 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4959 if( partSeqSplit.size() == 3 )
4961 result[
"PART"] = partSeqSplit[0];
4962 result[
"SEQ"] = partSeqSplit[2];
4970 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4972 if( properties.empty() )
5021 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
5035 for(
size_t ii = 0; ii < symbols.size(); ii++ )
5043 if( valField.
GetText().IsEmpty() )
5051 if( symbols.size() == 1 )
5054 cacheName = wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 );
5057 ret[cacheName] = symbol;
5067 wxFileName fn( aLibraryPath );
5069 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
5070 return fn.GetModificationTime().GetValue().GetValue();
5077 const std::map<std::string, UTF8>* aProperties )
5090 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
5092 wxFileName fileName( aLibraryPath );
5097 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
5101 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
5103 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
5107 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
5109 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
5111 for(
const auto& [schLibName, cfe] : schLibFiles )
5113 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
5115 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
5116 compoundFiles.emplace_back( std::move( decodedStream ) );
5122 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
5125 cacheMapRef.insert( parsed.begin(), parsed.end() );
5130 catch(
const CFB::CFBException& exception )
5134 catch(
const std::exception& exc )
5136 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium library: %s" ), exc.what() ) );
5142 std::vector<int>& aFontSizes )
5144 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
5146 if( file ==
nullptr )
5154 std::map<wxString, wxString> properties = reader.
ReadProperties();
5158 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
5159 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
5161 for(
auto& [key, value] : properties )
5163 wxString upperKey = key.Upper();
5166 if( upperKey.StartsWith(
"SIZE", &remaining ) )
5168 if( !remaining.empty() )
5170 int ind = wxAtoi( remaining );
5172 if(
static_cast<int>( aFontSizes.size() ) < ind )
5173 aFontSizes.resize( ind );
5176 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
5177 aFontSizes[ind - 1] = scaled;
5185 const std::map<std::string, UTF8>* aProperties,
5186 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
5190 bool powerSymbolsOnly = ( aProperties &&
5197 for(
auto& [libnameStr, libSymbol] : it->second )
5199 if( powerSymbolsOnly && !libSymbol->IsPower() )
5202 aInserter( libnameStr, libSymbol );
5209 const std::map<std::string, UTF8>* aProperties )
5214 aSymbolNameList.Add( aStr );
5220 const wxString& aLibraryPath,
5221 const std::map<std::string, UTF8>* aProperties )
5226 aSymbolList.emplace_back( aSymbol );
5232 const std::map<std::string, UTF8>* aProperties )
5240 auto it2 = it->second.find( aAliasName );
5242 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.
bool IsHorizontal() const
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,...
const EDA_ANGLE & GetTextAngle() const
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)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
GR_TEXT_V_ALIGN_T GetVertJustify() const
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.
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
virtual void Rotate90(bool aClockwise)
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 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
bool fileHasBinaryHeader(const wxString &aFilePath, const std::vector< uint8_t > &aHeader, size_t aOffset)
Check if a file starts with a defined binary 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)
void AdjustTextForSymbolOrientation(SCH_TEXT *aText, const ASCH_SYMBOL &aSymbol)
static LINE_STYLE GetPlotDashType(const ASCH_POLYLINE_LINESTYLE linestyle)
static void SetSchShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape)
void AdjustFieldForSymbolOrientation(SCH_FIELD *aField, const ASCH_SYMBOL &aSymbol)
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.