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
void SetDescription(const wxString &aDescription)
Gets the Description field text value */.
void SetKeyWords(const wxString &aKeyWords)
SCH_FIELD & GetReferenceField() const
Return reference to the reference designator field.
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)
bool HasLibrary(const wxString &aNickname, bool aCheckEnabled=false) const
Test for the existence of aNickname in the library table.
bool InsertRow(LIB_TABLE_ROW *aRow, bool doReplace=false)
Adds aRow if it does not already exist or if doReplace is true.
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.
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 const wxChar Custom[]
"User" defined page type
static void SetCustomHeightMils(double aHeightInMils)
Set the height of Custom page in mils for any custom page constructed or made via SetType() after mak...
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
std::shared_ptr< NET_SETTINGS > & NetSettings()
static SYMBOL_LIB_TABLE * SchSymbolLibTable(PROJECT *aProject)
Accessor for project symbol library table.
virtual void SetElem(PROJECT::ELEM aIndex, _ELEM *aElem)
virtual const wxString GetProjectPath() const
Return the full path of the project.
virtual const wxString GetProjectName() const
Return the short name of the project.
virtual PROJECT_FILE & GetProjectFile() const
virtual std::map< wxString, wxString > & GetTextVars() const
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)=0
Report a string with a given severity.
Holds all the data relating to one schematic.
void SetRoot(SCH_SHEET *aRootSheet)
Initialize the schematic with a new root sheet.
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
PROJECT & Prj() const override
Return a reference to the project this schematic is part of.
void SetSize(const VECTOR2I &aSize)
Class for a wire to bus entry.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
void SetText(const wxString &aText) 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< 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
std::map< wxString, LIB_SYMBOL * > ParseLibFile(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
static bool checkFileHeader(const wxString &aFileName)
long long getLibraryTimestamp(const wxString &aLibraryPath) const
std::map< wxString, std::map< wxString, LIB_SYMBOL * > > m_libCache
void ParseSheetEntry(const std::map< wxString, wxString > &aProperties)
IO_RELEASER< SCH_IO > m_pi
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
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,...
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)
std::unique_ptr< std::map< std::string, UTF8 > > m_properties
void ParseEllipticalArc(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
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)
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)
Base class that schematic file and library loading and saving plugins should derive from.
virtual bool CanReadSchematicFile(const wxString &aFileName) const
Checks if this SCH_IO can read the specified schematic file.
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, bool aManual) override
std::vector< SCH_FIELD > & GetFields()
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 IsWire() const
Return true if the line is a wire.
void SetLineWidth(const int aSize)
bool IsBus() const
Return true if the line is a bus.
virtual void SetStroke(const STROKE_PARAMS &aStroke) override
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 SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Gets 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.
void SetPosition(const VECTOR2I &aPos) 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.
SCH_SCREEN * LastScreen()
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void pop_back()
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.
bool SearchHierarchy(const wxString &aFilename, SCH_SCREEN **aScreen)
Search the existing hierarchy for an instance of screen loaded from aFileName.
void SetBackgroundColor(KIGFX::COLOR4D aColor)
void SetName(const wxString &aName)
SCH_SCREEN * GetScreen() const
void SetScreen(SCH_SCREEN *aScreen)
Set the SCH_SCREEN associated with this sheet to aScreen.
void SetLibId(const LIB_ID &aName)
void SetPosition(const VECTOR2I &aPosition) override
int GetFieldCount() const
Return the number of fields in this symbol.
void SetValueFieldText(const wxString &aValue)
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true, bool aCaseInsensitive=false)
Search for a SCH_FIELD with aFieldName.
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
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
TRANSFORM & GetTransform()
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
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
Hold a record identifying a symbol library accessed by the appropriate symbol library SCH_IO object i...
static const wxString & GetSymbolLibTableFileName()
static const char * PropPowerSymsOnly
virtual void Format(OUTPUTFORMATTER *aOutput, int aIndentLevel) const override
Generate the table in s-expression format to aOutput with an indentation level of aIndentLevel.
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
static REPORTER & GetInstance()
static void SetReporter(REPORTER *aReporter)
Set the reporter to use for reporting font substitution warnings.
#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.
@ FILLED_WITH_BG_BODYCOLOR
static const std::string KiCadSchematicFileExtension
static const std::string KiCadSymbolLibFileExtension
static const wxChar traceAltiumSch[]
Flag to enable Altium schematic debugging output.
#define THROW_IO_ERROR(msg)
bool fileStartsWithBinaryHeader(const wxString &aFilePath, const std::vector< uint8_t > &aHeader)
Check if a file starts with a defined binary header.
bool fileStartsWithPrefix(const wxString &aFilePath, const wxString &aPrefix, bool aIgnoreWhitespace)
Check if a file starts with a defined string.
const std::vector< uint8_t > COMPOUND_FILE_HEADER
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
static COLOR4D GetColorFromInt(int color)
#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE
static void SetLibShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape, ALTIUM_SCH_RECORD aType, int aStrokeColor)
VECTOR2I HelperGeneratePowerPortGraphics(LIB_SYMBOL *aKsymbol, ASCH_POWER_PORT_STYLE aStyle, REPORTER *aReporter)
static void SetSchShapeLine(const ASCH_BORDER_INTERFACE &elem, SCH_SHAPE *shape)
static const VECTOR2I GetRelativePosition(const VECTOR2I &aPosition, const SCH_SYMBOL *aSymbol)
static void SetLibShapeLine(const ASCH_BORDER_INTERFACE &elem, SCH_SHAPE *shape, ALTIUM_SCH_RECORD aType)
static LINE_STYLE GetPlotDashType(const ASCH_POLYLINE_LINESTYLE linestyle)
#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND
static void SetSchShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape)
void SetTextPositioning(EDA_TEXT *text, ASCH_LABEL_JUSTIFICATION justification, ASCH_RECORD_ORIENTATION orientation)
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
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_TEXT_FRAME_ALIGNMENT Alignment
ASCH_POWER_PORT_STYLE style
ASCH_RECORD_ORIENTATION orientation
ASCH_SHEET_ENTRY_SIDE side
ASCH_RECORD_ORIENTATION orientation
std::vector< VECTOR2I > Points
wxString componentdescription
ASCH_TEXT_FRAME_ALIGNMENT Alignment
std::vector< VECTOR2I > points
constexpr int IUToMils(int iu) const
constexpr int MilsToIU(int mils) const
A simple container for sheet instance information.
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
@ DESCRIPTION_FIELD
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.