56#include <compoundfilereader.h>
64#include <wx/mstream.h>
65#include <wx/zstream.h>
66#include <wx/wfstream.h>
67#include <magic_enum.hpp>
81#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
82 0.94901960784313721, \
83 0.98431372549019602, 1.0 )
85#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
86 0.61960784313725492, \
87 0.78823529411764703, 1.0 )
100 int green = (
color & 0x00FF00 ) >> 8;
101 int blue = (
color & 0xFF0000 ) >> 16;
173 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
210 else if( elem.
AreaColor == aStrokeColor )
216 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
261 for(
auto& [
name, symbol] : lib )
313 std::vector<SCH_PIN*> pins;
315 if(
LIB_SYMBOL* lib_sym = dyn_cast<LIB_SYMBOL*>( aSymbol ) )
316 pins = lib_sym->GetAllLibPins();
318 if(
SCH_SYMBOL* sch_sym = dyn_cast<SCH_SYMBOL*>( aSymbol ) )
319 pins = sch_sym->GetPins();
322 bool names_visible =
false;
323 bool numbers_visible =
false;
327 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
328 names_visible =
true;
330 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
331 numbers_visible =
true;
342 if( !numbers_visible )
387 const std::map<std::string, UTF8>* aProperties )
389 wxCHECK( !aFileName.IsEmpty() && aSchematic,
nullptr );
391 wxFileName fileName( aFileName );
399 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
403 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
430 wxCHECK_MSG( libTable,
nullptr,
"Could not load symbol lib table." );
432 m_pi.reset( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
440 wxString libTableUri =
"${KIPRJMOD}/" +
getLibFileName().GetFullName();
444 wxString(
"KiCad" ) ) );
453 libTable->
Format( &formatter, 0 );
464 wxCHECK( rootScreen,
nullptr );
484 int minWireWidth = std::numeric_limits<int>::max();
485 int minBusWidth = std::numeric_limits<int>::max();
489 std::vector<SCH_MARKER*> markers;
496 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
499 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
505 if( minWireWidth < std::numeric_limits<int>::max() )
506 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
508 if( minBusWidth < std::numeric_limits<int>::max() )
509 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
530 wxFileName parentFileName = aFileName;
544 catch(
const CFB::CFBException& exception )
548 catch(
const std::exception& exc )
550 wxLogTrace(
traceAltiumSch, wxS(
"Unhandled exception in Altium schematic "
551 "parsers: %s." ), exc.what() );
561 wxCHECK( currentScreen, );
569 wxCHECK2( sheet,
continue );
573 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
575 if( !loadAltiumFileName.IsFileReadable() )
579 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
580 wxDIR_FILES | wxDIR_HIDDEN );
582 for(
const wxString& candidate : files )
584 wxFileName candidateFname( candidate );
586 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false ) )
588 loadAltiumFileName = candidateFname;
594 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
598 msg.Printf(
_(
"The file name for sheet %s is undefined, this is probably an"
599 " Altium signal harness that got converted to a sheet." ),
618 if( sheet->
GetName().Trim().empty() )
619 sheet->
SetName( loadAltiumFileName.GetName() );
621 wxCHECK2( screen,
continue );
627 wxFileName projectFileName = loadAltiumFileName;
630 sheet->
SetFileName( projectFileName.GetFullName() );
631 screen->
SetFileName( projectFileName.GetFullPath() );
641 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
643 if( file ==
nullptr )
648 std::map<wxString, wxString> properties = reader.
ReadProperties();
655 for(
int i = 0; i < weight; i++ )
666 "(%d bytes remaining)." ),
675 wxString streamName = wxS(
"Additional" );
677 const CFB::COMPOUND_FILE_ENTRY* file =
678 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
680 if( file ==
nullptr )
691 std::map<wxString, wxString> properties = reader.
ReadProperties();
696 if( record != ALTIUM_SCH_RECORD::HEADER )
702 std::map<wxString, wxString> properties = reader.
ReadProperties();
723 wxString streamName = wxS(
"FileHeader" );
725 const CFB::COMPOUND_FILE_ENTRY* file =
726 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
728 if( file ==
nullptr )
739 std::map<wxString, wxString> properties = reader.
ReadProperties();
743 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
756 std::map<wxString, wxString> properties = reader.
ReadProperties();
768 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
781 symbol.second->SetLibSymbol( libSymbolIt->second );
818 while( storageReader.
CanRead() )
820 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
823 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
837 std::map<wxString, wxString> properties = reader.
ReadProperties();
841 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
856 std::map<wxString, wxString> properties = reader.
ReadProperties();
859 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
865 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
878 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
891 symbol.second->SetLibSymbol( libSymbolIt->second );
927 const wxString& aSectionName )
937 case ALTIUM_SCH_RECORD::HEADER:
940 case ALTIUM_SCH_RECORD::COMPONENT:
944 case ALTIUM_SCH_RECORD::PIN:
948 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
952 case ALTIUM_SCH_RECORD::LABEL:
956 case ALTIUM_SCH_RECORD::BEZIER:
960 case ALTIUM_SCH_RECORD::POLYLINE:
964 case ALTIUM_SCH_RECORD::POLYGON:
968 case ALTIUM_SCH_RECORD::ELLIPSE:
972 case ALTIUM_SCH_RECORD::PIECHART:
976 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
980 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
981 case ALTIUM_SCH_RECORD::ARC:
985 case ALTIUM_SCH_RECORD::LINE:
989 case ALTIUM_SCH_RECORD::RECTANGLE:
993 case ALTIUM_SCH_RECORD::SHEET_SYMBOL:
997 case ALTIUM_SCH_RECORD::SHEET_ENTRY:
1001 case ALTIUM_SCH_RECORD::POWER_PORT:
1005 case ALTIUM_SCH_RECORD::PORT:
1011 case ALTIUM_SCH_RECORD::NO_ERC:
1015 case ALTIUM_SCH_RECORD::NET_LABEL:
1019 case ALTIUM_SCH_RECORD::BUS:
1023 case ALTIUM_SCH_RECORD::WIRE:
1027 case ALTIUM_SCH_RECORD::TEXT_FRAME:
1031 case ALTIUM_SCH_RECORD::JUNCTION:
1035 case ALTIUM_SCH_RECORD::IMAGE:
1039 case ALTIUM_SCH_RECORD::SHEET:
1043 case ALTIUM_SCH_RECORD::SHEET_NAME:
1047 case ALTIUM_SCH_RECORD::FILE_NAME:
1051 case ALTIUM_SCH_RECORD::DESIGNATOR:
1055 case ALTIUM_SCH_RECORD::BUS_ENTRY:
1059 case ALTIUM_SCH_RECORD::TEMPLATE:
1063 case ALTIUM_SCH_RECORD::PARAMETER:
1067 case ALTIUM_SCH_RECORD::PARAMETER_SET:
1071 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
1075 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
1079 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
1082 case ALTIUM_SCH_RECORD::MAP_DEFINER:
1085 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
1088 case ALTIUM_SCH_RECORD::NOTE:
1092 case ALTIUM_SCH_RECORD::COMPILE_MASK:
1096 case ALTIUM_SCH_RECORD::HYPERLINK:
1101 case ALTIUM_SCH_RECORD::HARNESS_CONNECTOR:
1105 case ALTIUM_SCH_RECORD::HARNESS_ENTRY:
1109 case ALTIUM_SCH_RECORD::HARNESS_TYPE:
1113 case ALTIUM_SCH_RECORD::SIGNAL_HARNESS:
1117 case ALTIUM_SCH_RECORD::BLANKET:
1123 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1154 if( file.filename.IsSameAs( aFilename ) )
1157 if( file.filename.EndsWith( aFilename ) )
1158 nonExactMatch = &file;
1161 return nonExactMatch;
1168 wxCHECK( currentSheet, );
1170 wxString sheetName = currentSheet->
GetName();
1172 if( sheetName.IsEmpty() )
1173 sheetName = wxT(
"root" );
1181 m_reporter->
Report( wxString::Format(
_(
"Symbol \"%s\" in sheet \"%s\" at index %d "
1182 "replaced with symbol \"%s\"." ),
1194 wxString
name = wxString::Format(
"%s_%d%s_%s",
1217 field.SetVisible(
false );
1228 screen->
Append( symbol );
1237 wxCHECK( currentSheet, );
1239 wxString sheetName = currentSheet->
GetName();
1241 if( sheetName.IsEmpty() )
1242 sheetName = wxT(
"root" );
1247 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1249 if( baseName.IsEmpty() )
1250 baseName = wxS(
"Template" );
1258 std::vector<LIB_SYMBOL*>& aSymbol )
1274 m_reporter->
Report( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1283 schSymbol =
m_symbols.at( libSymbolIt->first );
1284 symbol = libSymbolIt->second;
1303 pin->SetVisible(
false );
1306 pin->SetNumberTextSize( 0 );
1309 pin->SetNameTextSize( 0 );
1315 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
1316 pin->SetOrientation( PIN_ORIENTATION::PIN_LEFT );
1320 case ASCH_RECORD_ORIENTATION::UPWARDS:
1321 pin->SetOrientation( PIN_ORIENTATION::PIN_DOWN );
1325 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
1326 pin->SetOrientation( PIN_ORIENTATION::PIN_RIGHT );
1330 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
1331 pin->SetOrientation( PIN_ORIENTATION::PIN_UP );
1345 pin->SetPosition( pinLocation );
1349 case ASCH_PIN_ELECTRICAL::INPUT:
1350 pin->SetType( ELECTRICAL_PINTYPE::PT_INPUT );
1353 case ASCH_PIN_ELECTRICAL::BIDI:
1354 pin->SetType( ELECTRICAL_PINTYPE::PT_BIDI );
1357 case ASCH_PIN_ELECTRICAL::OUTPUT:
1358 pin->SetType( ELECTRICAL_PINTYPE::PT_OUTPUT );
1361 case ASCH_PIN_ELECTRICAL::OPEN_COLLECTOR:
1362 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR );
1365 case ASCH_PIN_ELECTRICAL::PASSIVE:
1366 pin->SetType( ELECTRICAL_PINTYPE::PT_PASSIVE );
1369 case ASCH_PIN_ELECTRICAL::TRISTATE:
1370 pin->SetType( ELECTRICAL_PINTYPE::PT_TRISTATE );
1373 case ASCH_PIN_ELECTRICAL::OPEN_EMITTER:
1374 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENEMITTER );
1377 case ASCH_PIN_ELECTRICAL::POWER:
1378 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
1381 case ASCH_PIN_ELECTRICAL::UNKNOWN:
1383 pin->SetType( ELECTRICAL_PINTYPE::PT_UNSPECIFIED );
1399 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED_CLOCK );
1403 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED );
1412 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK_LOW );
1416 pin->SetShape( GRAPHIC_PINSHAPE::INPUT_LOW );
1422 pin->SetShape( GRAPHIC_PINSHAPE::OUTPUT_LOW );
1429 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK );
1433 pin->SetShape( GRAPHIC_PINSHAPE::LINE );
1443 int vjustify, hjustify;
1446 switch( justification )
1469 switch( justification )
1492 switch( orientation )
1515 text->SetTextAngle( angle );
1534 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
1540 static const std::map<wxString, wxString> variableMap = {
1541 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
1542 {
"SHEETNUMBER",
"#" },
1543 {
"SHEETTOTAL",
"##" },
1544 {
"TITLE",
"TITLE" },
1545 {
"REVISION",
"REVISION" },
1546 {
"DATE",
"ISSUE_DATE" },
1547 {
"CURRENTDATE",
"CURRENT_DATE" },
1548 {
"COMPANYNAME",
"COMPANY" },
1549 {
"DOCUMENTNAME",
"FILENAME" },
1550 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
1551 {
"PROJECTNAME",
"PROJECTNAME" },
1559 size_t fontId =
static_cast<int>( elem.
fontId );
1576 screen->
Append( textItem );
1592 m_reporter->
Report( wxString::Format( wxT(
"Label's owner (%d) not found." ),
1598 symbol = libSymbolIt->second;
1599 schsym =
m_symbols.at( libSymbolIt->first );
1614 size_t fontId = elem.
fontId;
1625 else if( fontId > 0 && fontId <= aFontSizes.size() )
1627 int size = aFontSizes[fontId - 1];
1635 std::vector<LIB_SYMBOL*>& aSymbol,
1636 std::vector<int>& aFontSizes )
1663 textBox->
SetStart( sheetTopRight );
1664 textBox->
SetEnd( sheetBottomLeft );
1671 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
1685 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
1688 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
1691 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
1696 size_t fontId =
static_cast<int>( aElem->
FontID );
1714 screen->
Append( textBox );
1719 std::vector<int>& aFontSizes )
1734 wxString::Format( wxT(
"Label's owner (%d) not found." ), aElem->
ownerindex ),
1739 symbol = libSymbolIt->second;
1740 schsym =
m_symbols.at( libSymbolIt->first );
1765 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
1778 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
1781 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
1784 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
1789 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
1791 int size = aFontSizes[aElem->
FontID - 1];
1798 std::vector<LIB_SYMBOL*>& aSymbol )
1802 if( elem.
points.size() < 2 )
1804 m_reporter->
Report( wxString::Format(
_(
"Bezier has %d control points. At least 2 are "
1806 static_cast<int>( elem.
points.size() ) ),
1814 wxCHECK( currentScreen, );
1816 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
1818 if( i + 2 == elem.
points.size() )
1822 SCH_LAYER_ID::LAYER_NOTES );
1829 currentScreen->
Append( line );
1834 std::vector<VECTOR2I> bezierPoints;
1835 std::vector<VECTOR2I> polyPoints;
1837 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
1838 bezierPoints.push_back( elem.
points.at( j ) );
1841 converter.
GetPoly( polyPoints );
1843 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
1846 SCH_LAYER_ID::LAYER_NOTES );
1852 currentScreen->
Append( line );
1871 m_reporter->
Report( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
1877 symbol = libSymbolIt->second;
1878 schsym =
m_symbols.at( libSymbolIt->first );
1884 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
1886 if( i + 2 == elem.
points.size() )
1894 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
1906 else if( i + 3 == elem.
points.size() )
1917 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
1937 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
1946 case 0: bezier->
SetStart( pos );
break;
1949 case 3: bezier->
SetEnd( pos );
break;
1963 std::vector<LIB_SYMBOL*>& aSymbol )
1967 if( elem.
Points.size() < 2 )
1975 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2004 m_reporter->
Report( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2010 symbol = libSymbolIt->second;
2011 schsym =
m_symbols.at( libSymbolIt->first );
2040 std::vector<LIB_SYMBOL*>& aSymbol )
2075 m_reporter->
Report( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2081 symbol = libSymbolIt->second;
2082 schsym =
m_symbols.at( libSymbolIt->first );
2123 std::vector<LIB_SYMBOL*>& aSymbol )
2157 m_reporter->
Report( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not "
2164 symbol = libSymbolIt->second;
2165 schsym =
m_symbols.at( libSymbolIt->first );
2183 int radius = std::min( width / 2, height / 2 );
2219 std::vector<LIB_SYMBOL*>& aSymbol )
2235 wxCHECK( currentScreen, );
2247 currentScreen->
Append( circle );
2260 currentScreen->
Append( arc );
2277 m_reporter->
Report( wxString::Format( wxT(
"Arc's owner (%d) not found." ),
2283 symbol = libSymbolIt->second;
2284 schsym =
m_symbols.at( libSymbolIt->first );
2316 arc->
SetStart( center + startOffset );
2317 arc->
SetEnd( center + endOffset );
2327 std::vector<LIB_SYMBOL*>& aSymbol )
2341 wxCHECK( currentScreen, );
2347 std::vector<BEZIER<int>> beziers;
2354 schbezier->
SetStart( bezier.Start );
2357 schbezier->
SetEnd( bezier.End );
2361 currentScreen->
Append( schbezier );
2378 m_reporter->
Report( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2384 symbol = libSymbolIt->second;
2385 schsym =
m_symbols.at( libSymbolIt->first );
2395 std::vector<BEZIER<int>> beziers;
2415 schbezier->
SetStart( bezier.Start );
2418 schbezier->
SetEnd( bezier.End );
2421 SetLibShapeLine( elem, schbezier, ALTIUM_SCH_RECORD::ELLIPTICAL_ARC );
2429 std::vector<LIB_SYMBOL*>& aSymbol )
2478 m_reporter->
Report( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
2484 symbol = libSymbolIt->second;
2485 schsym =
m_symbols.at( libSymbolIt->first );
2498 line->
AddPoint( center + startOffset );
2500 line->
AddPoint( center + endOffset );
2515 std::vector<LIB_SYMBOL*>& aSymbol )
2535 FILL_T fillMode = elem.
IsSolid ? FILL_T::FILLED_WITH_COLOR : FILL_T::NO_FILL;
2540 std::vector<BEZIER<int>> beziers;
2541 std::vector<VECTOR2I> polyPoints;
2548 schbezier->
SetStart( bezier.Start );
2551 schbezier->
SetEnd( bezier.End );
2557 screen->
Append( schbezier );
2559 polyPoints.push_back( bezier.Start );
2562 if( fillMode != FILL_T::NO_FILL )
2569 for(
const VECTOR2I& point : polyPoints )
2572 schpoly->
AddPoint( polyPoints[0] );
2574 screen->
Append( schpoly );
2591 m_reporter->
Report( wxString::Format( wxT(
"Ellipse's owner (%d) not found." ),
2597 symbol = libSymbolIt->second;
2598 schsym =
m_symbols.at( libSymbolIt->first );
2604 std::vector<BEZIER<int>> beziers;
2605 std::vector<VECTOR2I> polyPoints;
2617 libbezier->
SetStart( bezier.Start );
2620 libbezier->
SetEnd( bezier.End );
2634 polyPoints.push_back( libbezier->
GetStart() );
2645 for(
const VECTOR2I& point : polyPoints )
2648 libline->
AddPoint( polyPoints[0] );
2658 std::vector<LIB_SYMBOL*>& aSymbol )
2680 screen->
Append( circle );
2696 m_reporter->
Report( wxString::Format( wxT(
"Ellipse's owner (%d) not found." ),
2702 symbol = libSymbolIt->second;
2703 schsym =
m_symbols.at( libSymbolIt->first );
2725 std::vector<LIB_SYMBOL*>& aSymbol )
2758 m_reporter->
Report( wxString::Format( wxT(
"Line's owner (%d) not found." ),
2764 symbol = libSymbolIt->second;
2765 schsym =
m_symbols.at( libSymbolIt->first );
2816 m_reporter->
Report( wxT(
"Signal harness, belonging to the part is not currently "
2823 wxString>& aProperties )
2830 wxCHECK( currentScreen, );
2839 currentScreen->
Append( sheet );
2852 m_reporter->
Report( wxT(
"Harness connector, belonging to the part is not currently "
2867 m_reporter->
Report( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
2874 sheetIt->second->AddPin( sheetPin );
2877 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
2879 VECTOR2I pos = sheetIt->second->GetPosition();
2880 VECTOR2I size = sheetIt->second->GetSize();
2885 case ASCH_SHEET_ENTRY_SIDE::LEFT:
2888 sheetPin->
SetSide( SHEET_SIDE::LEFT );
2890 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
2893 sheetPin->
SetSide( SHEET_SIDE::RIGHT );
2895 case ASCH_SHEET_ENTRY_SIDE::TOP:
2898 sheetPin->
SetSide( SHEET_SIDE::TOP );
2900 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
2903 sheetPin->
SetSide( SHEET_SIDE::BOTTOM );
2917 m_reporter->
Report( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
2931 ASCH_RECORD_ORIENTATION::RIGHTWARDS );
2939 wxString fullPath = fn.GetFullPath();
2941 fullPath.Replace( wxT(
"\\" ), wxT(
"/" ) );
2943 SCH_SCREEN* screen = sheetIt->second->GetScreen();
2948 m_reporter->
Report( wxString::Format(
_(
"Altium's harness connector (%s) was imported as a "
2949 "hierarchical sheet. Please review the imported "
2957 std::vector<LIB_SYMBOL*>& aSymbol )
2972 rect->
SetEnd( sheetBottomLeft );
2993 m_reporter->
Report( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
2999 symbol = libSymbolIt->second;
3000 schsym =
m_symbols.at( libSymbolIt->first );
3014 rect->
SetEnd( sheetBottomLeft );
3042 wxCHECK( currentScreen, );
3043 currentScreen->
Append( sheet );
3052 wxCHECK( rootScreen, );
3060 m_sheets.insert( { aIndex, sheet } );
3072 m_reporter->
Report( wxString::Format( wxT(
"Sheet entry's owner (%d) not found." ),
3079 sheetIt->second->AddPin( sheetPin );
3082 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3086 VECTOR2I pos = sheetIt->second->GetPosition();
3087 VECTOR2I size = sheetIt->second->GetSize();
3092 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3095 sheetPin->
SetSide( SHEET_SIDE::LEFT );
3098 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3101 sheetPin->
SetSide( SHEET_SIDE::RIGHT );
3104 case ASCH_SHEET_ENTRY_SIDE::TOP:
3107 sheetPin->
SetSide( SHEET_SIDE::TOP );
3110 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3113 sheetPin->
SetSide( SHEET_SIDE::BOTTOM );
3120 case ASCH_PORT_IOTYPE::UNSPECIFIED:
3121 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3124 case ASCH_PORT_IOTYPE::OUTPUT:
3125 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
3128 case ASCH_PORT_IOTYPE::INPUT:
3129 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
3132 case ASCH_PORT_IOTYPE::BIDI:
3133 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
3324 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3349 wxString symName( elem.
text );
3350 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3352 if( !styleName.empty() )
3353 symName <<
'_' << styleName;
3362 libSymbol = powerSymbolIt->second;
3367 libSymbol = alreadyLoaded;
3378 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global "
3379 "label with name '%s'" ), elem.
text ) );
3388 pin->SetPosition( { 0, 0 } );
3389 pin->SetLength( 0 );
3390 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
3391 pin->SetVisible(
false );
3424 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
3430 case ASCH_RECORD_ORIENTATION::UPWARDS:
3436 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
3442 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
3453 screen->
Append( symbol );
3464 int height = aElem.
Height;
3474 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
3482 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
3486 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
3490 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
3495 size_t fontId =
static_cast<int>( aElem.
FontID );
3513 screen->
Append( textBox );
3515 m_reporter->
Report( wxString::Format(
_(
"Altium's harness port (%s) was imported as "
3516 "a text box. Please review the imported "
3535 switch( aElem.
Style )
3538 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3539 case ASCH_PORT_STYLE::LEFT:
3540 case ASCH_PORT_STYLE::RIGHT:
3541 case ASCH_PORT_STYLE::LEFT_RIGHT:
3545 case ASCH_PORT_STYLE::NONE_VERTICAL:
3546 case ASCH_PORT_STYLE::TOP:
3547 case ASCH_PORT_STYLE::BOTTOM:
3548 case ASCH_PORT_STYLE::TOP_BOTTOM:
3565 bool connectionFound = startIsWireTerminal
3566 || startIsBusTerminal
3567 || endIsWireTerminal
3568 || endIsBusTerminal;
3570 if( !connectionFound )
3577 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start : end;
3592 case ASCH_PORT_IOTYPE::UNSPECIFIED: label->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
break;
3593 case ASCH_PORT_IOTYPE::OUTPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
break;
3594 case ASCH_PORT_IOTYPE::INPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
break;
3595 case ASCH_PORT_IOTYPE::BIDI: label->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
break;
3598 switch( aElem.
Style )
3601 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3602 case ASCH_PORT_STYLE::LEFT:
3603 case ASCH_PORT_STYLE::RIGHT:
3604 case ASCH_PORT_STYLE::LEFT_RIGHT:
3605 if( ( startIsWireTerminal || startIsBusTerminal ) )
3612 case ASCH_PORT_STYLE::NONE_VERTICAL:
3613 case ASCH_PORT_STYLE::TOP:
3614 case ASCH_PORT_STYLE::BOTTOM:
3615 case ASCH_PORT_STYLE::TOP_BOTTOM:
3616 if( ( startIsWireTerminal || startIsBusTerminal ) )
3628 label->
GetFields()[0].SetVisible(
false );
3635 if( ( startIsWireTerminal && endIsWireTerminal ) )
3643 else if( startIsBusTerminal && endIsBusTerminal )
3666 screen->
Append( noConnect );
3694 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3697 SCH_LAYER_ID::LAYER_BUS );
3714 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3717 SCH_LAYER_ID::LAYER_WIRE );
3737 screen->
Append( junction );
3749 && component->second.currentpartid != elem.
ownerpartid )
3753 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>( center );
3765 wxString msg = wxString::Format(
_(
"Embedded file %s not found in storage." ),
3771 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
3774 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
3775 wxZlibInputStream zlibInputStream( fileStream );
3776 wxFFileOutputStream outputStream( storagePath );
3777 outputStream.Write( zlibInputStream );
3778 outputStream.Close();
3782 m_reporter->
Report( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
3788 wxRemoveFile( storagePath );
3792 if( !wxFileExists( elem.
filename ) )
3810 const double scaleX =
3811 std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
3812 const double scaleY =
3813 std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
3816 bitmap->SetFlags(
IS_NEW );
3817 screen->
Append( bitmap.release() );
3823 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
3830 bool isPortrait =
m_altiumSheet->sheetOrientation == ASCH_SHEET_WORKSPACEORIENTATION::PORTRAIT;
3843 case ASCH_SHEET_SIZE::A4: pageInfo.
SetType(
"A4", isPortrait );
break;
3844 case ASCH_SHEET_SIZE::A3: pageInfo.
SetType(
"A3", isPortrait );
break;
3845 case ASCH_SHEET_SIZE::A2: pageInfo.
SetType(
"A2", isPortrait );
break;
3846 case ASCH_SHEET_SIZE::A1: pageInfo.
SetType(
"A1", isPortrait );
break;
3847 case ASCH_SHEET_SIZE::A0: pageInfo.
SetType(
"A0", isPortrait );
break;
3848 case ASCH_SHEET_SIZE::A: pageInfo.
SetType(
"A", isPortrait );
break;
3849 case ASCH_SHEET_SIZE::B: pageInfo.
SetType(
"B", isPortrait );
break;
3850 case ASCH_SHEET_SIZE::C: pageInfo.
SetType(
"C", isPortrait );
break;
3851 case ASCH_SHEET_SIZE::D: pageInfo.
SetType(
"D", isPortrait );
break;
3852 case ASCH_SHEET_SIZE::E: pageInfo.
SetType(
"E", isPortrait );
break;
3853 case ASCH_SHEET_SIZE::LETTER: pageInfo.
SetType(
"USLetter", isPortrait );
break;
3854 case ASCH_SHEET_SIZE::LEGAL: pageInfo.
SetType(
"USLegal", isPortrait );
break;
3855 case ASCH_SHEET_SIZE::TABLOID: pageInfo.
SetType(
"A3", isPortrait );
break;
3856 case ASCH_SHEET_SIZE::ORCAD_A: pageInfo.
SetType(
"A", isPortrait );
break;
3857 case ASCH_SHEET_SIZE::ORCAD_B: pageInfo.
SetType(
"B", isPortrait );
break;
3858 case ASCH_SHEET_SIZE::ORCAD_C: pageInfo.
SetType(
"C", isPortrait );
break;
3859 case ASCH_SHEET_SIZE::ORCAD_D: pageInfo.
SetType(
"D", isPortrait );
break;
3860 case ASCH_SHEET_SIZE::ORCAD_E: pageInfo.
SetType(
"E", isPortrait );
break;
3878 m_reporter->
Report( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
3901 m_reporter->
Report( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
3927 m_reporter->
Report( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
3941 bool emptyRef = elem.
text.IsEmpty();
3946 bool visible = !emptyRef;
3958 std::vector<LIB_SYMBOL*>& aSymbol,
3959 std::vector<int>& aFontSizes )
3966 bool emptyRef = elem.
text.IsEmpty();
3967 SCH_FIELD& refField = symbol->GetReferenceField();
3970 refField.
SetText( wxT(
"X" ) );
3976 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
3978 int size = aFontSizes[elem.
fontId - 1];
3995 busWireEntry->
SetSize( { vector.
x, vector.
y } );
3998 screen->
Append( busWireEntry );
4007 static const std::map<wxString, wxString> variableMap = {
4008 {
"COMMENT",
"VALUE" },
4009 {
"VALUE",
"ALTIUM_VALUE" },
4015 if( elem.
text ==
"*" )
4018 wxString paramName = elem.
name.Upper();
4020 if( paramName ==
"SHEETNUMBER" )
4024 else if( paramName ==
"TITLE" )
4028 else if( paramName ==
"REVISION" )
4032 else if( paramName ==
"DATE" )
4036 else if( paramName ==
"COMPANYNAME" )
4057 wxString upperName = elem.
name.Upper();
4059 if( upperName ==
"COMMENT" )
4066 wxString fieldName = elem.
name.Upper();
4070 if( fieldName.IsEmpty() )
4072 int disambiguate = 1;
4076 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4083 else if( fieldName ==
"VALUE" )
4085 fieldName =
"ALTIUM_VALUE";
4101 std::vector<LIB_SYMBOL*>& aSymbol,
4102 std::vector<int>& aFontSizes )
4123 std::map<wxString, wxString> variableMap = {
4124 {
"COMMENT",
"VALUE" },
4130 wxString upperName = elem.
name.Upper();
4132 if( upperName ==
"COMMENT" )
4134 field = &libSymbol->GetValueField();
4138 int fieldIdx = libSymbol->GetFieldCount();
4139 wxString fieldNameStem = elem.
name;
4140 wxString fieldName = fieldNameStem;
4141 int disambiguate = 1;
4143 if( fieldName.IsEmpty() )
4145 fieldNameStem =
"ALTIUM_UNNAMED";
4146 fieldName =
"ALTIUM_UNNAMED_1";
4149 else if( upperName ==
"VALUE" )
4151 fieldNameStem =
"ALTIUM_VALUE";
4152 fieldName =
"ALTIUM_VALUE";
4156 while( libSymbol->FindField( fieldName ) )
4157 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4160 libSymbol->AddField( new_field );
4171 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4173 int size = aFontSizes[elem.
fontId - 1];
4187 const std::map<wxString, wxString>& aProperties )
4196 std::vector<LIB_SYMBOL*>& aSymbol )
4200 if( elem.
type != wxS(
"PCBLIB" ) )
4204 if( aSymbol.size() == 0 && !elem.
isCurrent )
4210 wxArrayString fpFilters;
4211 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4214 if( !aSymbol.empty() )
4220 symbol->SetFPFilters( fpFilters );
4221 SCH_FIELD& footprintField = symbol->GetFootprintField();
4232 m_reporter->
Report( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4238 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4242 m_reporter->
Report( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4243 implementationOwnerIt->second ),
4250 libSymbolIt->second->SetFPFilters( fpFilters );
4260 wxString>& aProperties )
4264 std::vector<LIB_SYMBOL*> symbols;
4282 symbols.push_back( symbol );
4291 std::map<wxString,LIB_SYMBOL*> ret;
4292 std::vector<int> fontSizes;
4293 struct SYMBOL_PIN_FRAC
4302 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4304 for(
auto& [
name, entry] : syms )
4307 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4309 if( entry.m_pinsFrac )
4311 auto parse_binary_pin_frac =
4312 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4314 std::map<wxString, wxString> result;
4320 SYMBOL_PIN_FRAC pinFrac;
4324 pinFrac.len_frac = binreader.
ReadInt32();
4325 pinFracs.insert( { pinFracData.first, pinFrac } );
4339 std::vector<LIB_SYMBOL*> symbols;
4348 std::map<wxString, wxString> properties = reader.
ReadProperties();
4352 if( record != ALTIUM_SCH_RECORD::COMPONENT )
4353 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4358 auto handleBinaryPinLambda =
4359 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4361 std::map<wxString, wxString> result;
4365 int32_t recordId = binreader.
ReadInt32();
4367 if( recordId !=
static_cast<int32_t
>( ALTIUM_SCH_RECORD::PIN ) )
4370 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4372 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4373 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4374 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4375 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4376 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4377 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4380 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4381 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4382 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4383 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4384 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4385 result[
"COLOR"] = wxString::Format(
"%d", binreader.
ReadInt32() );
4391 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4393 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4394 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4395 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4399 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4401 if( partSeqSplit.size() == 3 )
4403 result[
"PART"] = partSeqSplit[0];
4404 result[
"SEQ"] = partSeqSplit[2];
4412 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4414 if( properties.empty() )
4422 case ALTIUM_SCH_RECORD::PIN:
4429 case ALTIUM_SCH_RECORD::LABEL:
ParseLabel( properties, symbols, fontSizes );
break;
4431 case ALTIUM_SCH_RECORD::BEZIER:
ParseBezier( properties, symbols );
break;
4433 case ALTIUM_SCH_RECORD::POLYLINE:
ParsePolyline( properties, symbols );
break;
4435 case ALTIUM_SCH_RECORD::POLYGON:
ParsePolygon( properties, symbols );
break;
4437 case ALTIUM_SCH_RECORD::ELLIPSE:
ParseEllipse( properties, symbols );
break;
4439 case ALTIUM_SCH_RECORD::PIECHART:
ParsePieChart( properties, symbols );
break;
4441 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
ParseRoundRectangle( properties, symbols );
break;
4443 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
ParseEllipticalArc( properties, symbols );
break;
4445 case ALTIUM_SCH_RECORD::ARC:
ParseArc( properties, symbols );
break;
4447 case ALTIUM_SCH_RECORD::LINE:
ParseLine( properties, symbols );
break;
4449 case ALTIUM_SCH_RECORD::RECTANGLE:
ParseRectangle( properties, symbols );
break;
4451 case ALTIUM_SCH_RECORD::DESIGNATOR:
ParseLibDesignator( properties, symbols, fontSizes );
break;
4453 case ALTIUM_SCH_RECORD::PARAMETER:
ParseLibParameter( properties, symbols, fontSizes );
break;
4455 case ALTIUM_SCH_RECORD::TEXT_FRAME:
ParseTextFrame( properties, symbols, fontSizes );
break;
4458 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
break;
4460 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
ParseImplementation( properties, symbols );
break;
4462 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
break;
4464 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
break;
4465 case ALTIUM_SCH_RECORD::MAP_DEFINER:
break;
4468 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
break;
4471 case ALTIUM_SCH_RECORD::IMAGE:
break;
4474 m_reporter->
Report( wxString::Format(
_(
"Unknown or unexpected record id %d found "
4476 recordId, symbols[0]->
GetName() ),
4488 for(
size_t ii = 0; ii < symbols.size(); ii++ )
4496 if( valField.
GetText().IsEmpty() )
4499 if( symbols.size() == 1 )
4502 ret[wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 )] = symbol;
4512 wxFileName fn( aLibraryPath );
4514 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
4515 return fn.GetModificationTime().GetValue().GetValue();
4517 return wxDateTime( 0.0 ).GetValue().GetValue();
4522 const std::map<std::string, UTF8>* aProperties )
4535 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
4537 wxFileName fileName( aLibraryPath );
4542 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
4546 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
4548 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
4552 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom =
4553 std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
4555 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles =
4556 intCom->EnumDir( L
"SchLib" );
4558 for(
const auto& [schLibName, cfe] : schLibFiles )
4559 compoundFiles.push_back( intCom->DecodeIntLibStream( *cfe ) );
4562 std::map<wxString, LIB_SYMBOL*>& cacheMapRef =
m_libCache[aLibraryPath];
4564 for(
auto& altiumSchFilePtr : compoundFiles )
4566 std::map<wxString, LIB_SYMBOL*> parsed =
ParseLibFile( *altiumSchFilePtr );
4567 cacheMapRef.insert( parsed.begin(), parsed.end() );
4572 catch(
const CFB::CFBException& exception )
4576 catch(
const std::exception& exc )
4578 wxFAIL_MSG( wxString::Format( wxT(
"Unhandled exception in Altium schematic parsers: %s." ),
4586 std::vector<int>& aFontSizes )
4588 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
4590 if( file ==
nullptr )
4600 std::map<wxString, wxString> properties = reader.
ReadProperties();
4604 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
4605 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
4607 for(
auto& [key, value] : properties )
4609 wxString upperKey = key.Upper();
4612 if( upperKey.StartsWith(
"SIZE", &remaining ) )
4614 if( !remaining.empty() )
4616 int ind = wxAtoi( remaining );
4618 if(
static_cast<int>( aFontSizes.size() ) < ind )
4619 aFontSizes.resize( ind );
4623 aFontSizes[ind - 1] = scaled;
4632 const std::map<std::string, UTF8>* aProperties,
4633 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
4637 bool powerSymbolsOnly = ( aProperties &&
4639 != aProperties->end() );
4645 for(
auto& [libnameStr, libSymbol] : it->second )
4647 if( powerSymbolsOnly && !libSymbol->IsPower() )
4650 aInserter( libnameStr, libSymbol );
4657 const wxString& aLibraryPath,
4658 const std::map<std::string, UTF8>* aProperties )
4663 aSymbolNameList.Add( aStr );
4669 const wxString& aLibraryPath,
4670 const std::map<std::string, UTF8>* aProperties )
4675 aSymbolList.emplace_back( aSymbol );
4681 const wxString& aAliasName,
4682 const std::map<std::string, UTF8>* aProperties )
4690 auto it2 = it->second.find( aAliasName );
4692 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
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, 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.
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 SetFilled(bool aFlag)
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)
virtual int GetWidth() const
void SetWidth(int aWidth)
void SetFillMode(FILL_T aFill)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
void SetTextColor(const COLOR4D &aColor)
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)
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 OfType(KICAD_T aType) const
This class was created to handle importing ellipses from other file formats that support them nativel...
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.
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.
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
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.
static UTF8 FixIllegalChars(const UTF8 &aLibItemName, bool aLib)
Replace illegal LIB_ID item name characters with underscores '_'.
Define a library symbol object.
void SetUnitCount(int aCount, bool aDuplicateDrawItems=true)
Set the units per symbol count.
SCH_FIELD & GetValueField() const
Return reference to the value field.
void FixupDrawItems()
This function finds the filled draw items that are covering up smaller draw items and replaces their ...
wxString GetName() const override