55#include <compoundfilereader.h>
63#include <wx/mstream.h>
64#include <wx/zstream.h>
65#include <wx/wfstream.h>
66#include <magic_enum.hpp>
80#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
81 0.94901960784313721, \
82 0.98431372549019602, 1.0 )
84#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
85 0.61960784313725492, \
86 0.78823529411764703, 1.0 )
99 int green = (
color & 0x00FF00 ) >> 8;
100 int blue = (
color & 0xFF0000 ) >> 16;
172 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
209 else if( elem.
AreaColor == aStrokeColor )
215 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
260 for(
auto& [
name, symbol] : lib )
312 std::vector<SCH_PIN*> pins;
314 if(
LIB_SYMBOL* lib_sym = dyn_cast<LIB_SYMBOL*>( aSymbol ) )
315 pins = lib_sym->GetAllLibPins();
317 if(
SCH_SYMBOL* sch_sym = dyn_cast<SCH_SYMBOL*>( aSymbol ) )
318 pins = sch_sym->GetPins();
321 bool names_visible =
false;
322 bool numbers_visible =
false;
326 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
327 names_visible =
true;
329 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
330 numbers_visible =
true;
341 if( !numbers_visible )
388 wxCHECK( !aFileName.IsEmpty() && aSchematic,
nullptr );
390 wxFileName fileName( aFileName );
398 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
402 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
429 wxCHECK_MSG( libTable,
nullptr,
"Could not load symbol lib table." );
431 m_pi.reset( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
439 wxString libTableUri =
"${KIPRJMOD}/" +
getLibFileName().GetFullName();
443 wxString(
"KiCad" ) ) );
452 libTable->
Format( &formatter, 0 );
463 wxCHECK( rootScreen,
nullptr );
483 int minWireWidth = std::numeric_limits<int>::max();
484 int minBusWidth = std::numeric_limits<int>::max();
488 std::vector<SCH_MARKER*> markers;
495 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
498 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
504 if( minWireWidth < std::numeric_limits<int>::max() )
505 netSettings->m_DefaultNetClass->SetWireWidth( minWireWidth );
507 if( minBusWidth < std::numeric_limits<int>::max() )
508 netSettings->m_DefaultNetClass->SetBusWidth( minBusWidth );
529 wxFileName parentFileName = aFileName;
543 catch(
const CFB::CFBException& exception )
547 catch(
const std::exception& exc )
549 wxLogTrace(
traceAltiumSch, wxS(
"Unhandled exception in Altium schematic "
550 "parsers: %s." ), exc.what() );
560 wxCHECK( currentScreen, );
568 wxCHECK2( sheet,
continue );
572 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
574 if( !loadAltiumFileName.IsFileReadable() )
578 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
579 wxDIR_FILES | wxDIR_HIDDEN );
581 for(
const wxString& candidate : files )
583 wxFileName candidateFname( candidate );
585 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false ) )
587 loadAltiumFileName = candidateFname;
593 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
597 msg.Printf(
_(
"The file name for sheet %s is undefined, this is probably an"
598 " Altium signal harness that got converted to a sheet." ),
617 if( sheet->
GetName().Trim().empty() )
618 sheet->
SetName( loadAltiumFileName.GetName() );
620 wxCHECK2( screen,
continue );
626 wxFileName projectFileName = loadAltiumFileName;
629 sheet->
SetFileName( projectFileName.GetFullName() );
630 screen->
SetFileName( projectFileName.GetFullPath() );
640 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
642 if( file ==
nullptr )
647 std::map<wxString, wxString> properties = reader.
ReadProperties();
654 for(
int i = 0; i < weight; i++ )
665 "(%d bytes remaining)." ),
674 wxString streamName = wxS(
"Additional" );
676 const CFB::COMPOUND_FILE_ENTRY* file =
677 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
679 if( file ==
nullptr )
690 std::map<wxString, wxString> properties = reader.
ReadProperties();
695 if( record != ALTIUM_SCH_RECORD::HEADER )
701 std::map<wxString, wxString> properties = reader.
ReadProperties();
722 wxString streamName = wxS(
"FileHeader" );
724 const CFB::COMPOUND_FILE_ENTRY* file =
725 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
727 if( file ==
nullptr )
738 std::map<wxString, wxString> properties = reader.
ReadProperties();
742 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
755 std::map<wxString, wxString> properties = reader.
ReadProperties();
767 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
780 symbol.second->SetLibSymbol( libSymbolIt->second );
817 while( storageReader.
CanRead() )
819 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
822 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
836 std::map<wxString, wxString> properties = reader.
ReadProperties();
840 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
855 std::map<wxString, wxString> properties = reader.
ReadProperties();
858 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
864 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
877 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
890 symbol.second->SetLibSymbol( libSymbolIt->second );
926 const wxString& aSectionName )
936 case ALTIUM_SCH_RECORD::HEADER:
939 case ALTIUM_SCH_RECORD::COMPONENT:
943 case ALTIUM_SCH_RECORD::PIN:
947 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
951 case ALTIUM_SCH_RECORD::LABEL:
955 case ALTIUM_SCH_RECORD::BEZIER:
959 case ALTIUM_SCH_RECORD::POLYLINE:
963 case ALTIUM_SCH_RECORD::POLYGON:
967 case ALTIUM_SCH_RECORD::ELLIPSE:
971 case ALTIUM_SCH_RECORD::PIECHART:
975 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
979 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
980 case ALTIUM_SCH_RECORD::ARC:
984 case ALTIUM_SCH_RECORD::LINE:
988 case ALTIUM_SCH_RECORD::RECTANGLE:
992 case ALTIUM_SCH_RECORD::SHEET_SYMBOL:
996 case ALTIUM_SCH_RECORD::SHEET_ENTRY:
1000 case ALTIUM_SCH_RECORD::POWER_PORT:
1004 case ALTIUM_SCH_RECORD::PORT:
1010 case ALTIUM_SCH_RECORD::NO_ERC:
1014 case ALTIUM_SCH_RECORD::NET_LABEL:
1018 case ALTIUM_SCH_RECORD::BUS:
1022 case ALTIUM_SCH_RECORD::WIRE:
1026 case ALTIUM_SCH_RECORD::TEXT_FRAME:
1030 case ALTIUM_SCH_RECORD::JUNCTION:
1034 case ALTIUM_SCH_RECORD::IMAGE:
1038 case ALTIUM_SCH_RECORD::SHEET:
1042 case ALTIUM_SCH_RECORD::SHEET_NAME:
1046 case ALTIUM_SCH_RECORD::FILE_NAME:
1050 case ALTIUM_SCH_RECORD::DESIGNATOR:
1054 case ALTIUM_SCH_RECORD::BUS_ENTRY:
1058 case ALTIUM_SCH_RECORD::TEMPLATE:
1062 case ALTIUM_SCH_RECORD::PARAMETER:
1066 case ALTIUM_SCH_RECORD::PARAMETER_SET:
1070 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
1074 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
1078 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
1081 case ALTIUM_SCH_RECORD::MAP_DEFINER:
1084 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
1087 case ALTIUM_SCH_RECORD::NOTE:
1091 case ALTIUM_SCH_RECORD::COMPILE_MASK:
1095 case ALTIUM_SCH_RECORD::HYPERLINK:
1100 case ALTIUM_SCH_RECORD::HARNESS_CONNECTOR:
1104 case ALTIUM_SCH_RECORD::HARNESS_ENTRY:
1108 case ALTIUM_SCH_RECORD::HARNESS_TYPE:
1112 case ALTIUM_SCH_RECORD::SIGNAL_HARNESS:
1116 case ALTIUM_SCH_RECORD::BLANKET:
1122 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1153 if( file.filename.IsSameAs( aFilename ) )
1156 if( file.filename.EndsWith( aFilename ) )
1157 nonExactMatch = &file;
1160 return nonExactMatch;
1167 wxCHECK( currentSheet, );
1169 wxString sheetName = currentSheet->
GetName();
1171 if( sheetName.IsEmpty() )
1172 sheetName = wxT(
"root" );
1180 m_reporter->
Report( wxString::Format(
_(
"Symbol \"%s\" in sheet \"%s\" at index %d "
1181 "replaced with symbol \"%s\"." ),
1193 wxString
name = wxString::Format(
"%s_%d%s_%s",
1216 field.SetVisible(
false );
1227 screen->
Append( symbol );
1236 wxCHECK( currentSheet, );
1238 wxString sheetName = currentSheet->
GetName();
1240 if( sheetName.IsEmpty() )
1241 sheetName = wxT(
"root" );
1246 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1248 if( baseName.IsEmpty() )
1249 baseName = wxS(
"Template" );
1257 std::vector<LIB_SYMBOL*>& aSymbol )
1273 m_reporter->
Report( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1282 schSymbol =
m_symbols.at( libSymbolIt->first );
1283 symbol = libSymbolIt->second;
1302 pin->SetVisible(
false );
1305 pin->SetNumberTextSize( 0 );
1308 pin->SetNameTextSize( 0 );
1314 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
1315 pin->SetOrientation( PIN_ORIENTATION::PIN_LEFT );
1319 case ASCH_RECORD_ORIENTATION::UPWARDS:
1320 pin->SetOrientation( PIN_ORIENTATION::PIN_DOWN );
1324 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
1325 pin->SetOrientation( PIN_ORIENTATION::PIN_RIGHT );
1329 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
1330 pin->SetOrientation( PIN_ORIENTATION::PIN_UP );
1344 pin->SetPosition( pinLocation );
1348 case ASCH_PIN_ELECTRICAL::INPUT:
1349 pin->SetType( ELECTRICAL_PINTYPE::PT_INPUT );
1352 case ASCH_PIN_ELECTRICAL::BIDI:
1353 pin->SetType( ELECTRICAL_PINTYPE::PT_BIDI );
1356 case ASCH_PIN_ELECTRICAL::OUTPUT:
1357 pin->SetType( ELECTRICAL_PINTYPE::PT_OUTPUT );
1360 case ASCH_PIN_ELECTRICAL::OPEN_COLLECTOR:
1361 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR );
1364 case ASCH_PIN_ELECTRICAL::PASSIVE:
1365 pin->SetType( ELECTRICAL_PINTYPE::PT_PASSIVE );
1368 case ASCH_PIN_ELECTRICAL::TRISTATE:
1369 pin->SetType( ELECTRICAL_PINTYPE::PT_TRISTATE );
1372 case ASCH_PIN_ELECTRICAL::OPEN_EMITTER:
1373 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENEMITTER );
1376 case ASCH_PIN_ELECTRICAL::POWER:
1377 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
1380 case ASCH_PIN_ELECTRICAL::UNKNOWN:
1382 pin->SetType( ELECTRICAL_PINTYPE::PT_UNSPECIFIED );
1398 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED_CLOCK );
1402 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED );
1411 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK_LOW );
1415 pin->SetShape( GRAPHIC_PINSHAPE::INPUT_LOW );
1421 pin->SetShape( GRAPHIC_PINSHAPE::OUTPUT_LOW );
1428 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK );
1432 pin->SetShape( GRAPHIC_PINSHAPE::LINE );
1442 int vjustify, hjustify;
1445 switch( justification )
1468 switch( justification )
1491 switch( orientation )
1514 text->SetTextAngle( angle );
1533 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
1539 static const std::map<wxString, wxString> variableMap = {
1540 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
1541 {
"SHEETNUMBER",
"#" },
1542 {
"SHEETTOTAL",
"##" },
1543 {
"TITLE",
"TITLE" },
1544 {
"REVISION",
"REVISION" },
1545 {
"DATE",
"ISSUE_DATE" },
1546 {
"CURRENTDATE",
"CURRENT_DATE" },
1547 {
"COMPANYNAME",
"COMPANY" },
1548 {
"DOCUMENTNAME",
"FILENAME" },
1549 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
1550 {
"PROJECTNAME",
"PROJECTNAME" },
1558 size_t fontId =
static_cast<int>( elem.
fontId );
1575 screen->
Append( textItem );
1591 m_reporter->
Report( wxString::Format( wxT(
"Label's owner (%d) not found." ),
1597 symbol = libSymbolIt->second;
1598 schsym =
m_symbols.at( libSymbolIt->first );
1613 size_t fontId = elem.
fontId;
1624 else if( fontId > 0 && fontId <= aFontSizes.size() )
1626 int size = aFontSizes[fontId - 1];
1634 std::vector<LIB_SYMBOL*>& aSymbol,
1635 std::vector<int>& aFontSizes )
1662 textBox->
SetStart( sheetTopRight );
1663 textBox->
SetEnd( sheetBottomLeft );
1670 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
1684 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
1687 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
1690 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
1695 size_t fontId =
static_cast<int>( aElem->
FontID );
1713 screen->
Append( textBox );
1718 std::vector<int>& aFontSizes )
1733 wxString::Format( wxT(
"Label's owner (%d) not found." ), aElem->
ownerindex ),
1738 symbol = libSymbolIt->second;
1739 schsym =
m_symbols.at( libSymbolIt->first );
1764 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
1777 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
1780 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
1783 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
1788 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
1790 int size = aFontSizes[aElem->
FontID - 1];
1797 std::vector<LIB_SYMBOL*>& aSymbol )
1801 if( elem.
points.size() < 2 )
1803 m_reporter->
Report( wxString::Format(
_(
"Bezier has %d control points. At least 2 are "
1805 static_cast<int>( elem.
points.size() ) ),
1813 wxCHECK( currentScreen, );
1815 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
1817 if( i + 2 == elem.
points.size() )
1821 SCH_LAYER_ID::LAYER_NOTES );
1828 currentScreen->
Append( line );
1833 std::vector<VECTOR2I> bezierPoints;
1834 std::vector<VECTOR2I> polyPoints;
1836 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
1837 bezierPoints.push_back( elem.
points.at( j ) );
1840 converter.
GetPoly( polyPoints );
1842 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
1845 SCH_LAYER_ID::LAYER_NOTES );
1851 currentScreen->
Append( line );
1870 m_reporter->
Report( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
1876 symbol = libSymbolIt->second;
1877 schsym =
m_symbols.at( libSymbolIt->first );
1883 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
1885 if( i + 2 == elem.
points.size() )
1893 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
1905 else if( i + 3 == elem.
points.size() )
1916 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
1936 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
1945 case 0: bezier->
SetStart( pos );
break;
1948 case 3: bezier->
SetEnd( pos );
break;
1962 std::vector<LIB_SYMBOL*>& aSymbol )
1966 if( elem.
Points.size() < 2 )
1974 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2003 m_reporter->
Report( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2009 symbol = libSymbolIt->second;
2010 schsym =
m_symbols.at( libSymbolIt->first );
2039 std::vector<LIB_SYMBOL*>& aSymbol )
2074 m_reporter->
Report( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2080 symbol = libSymbolIt->second;
2081 schsym =
m_symbols.at( libSymbolIt->first );
2122 std::vector<LIB_SYMBOL*>& aSymbol )
2156 m_reporter->
Report( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not "
2163 symbol = libSymbolIt->second;
2164 schsym =
m_symbols.at( libSymbolIt->first );
2182 int radius = std::min( width / 2, height / 2 );
2218 std::vector<LIB_SYMBOL*>& aSymbol )
2234 wxCHECK( currentScreen, );
2246 currentScreen->
Append( circle );
2259 currentScreen->
Append( arc );
2276 m_reporter->
Report( wxString::Format( wxT(
"Arc's owner (%d) not found." ),
2282 symbol = libSymbolIt->second;
2283 schsym =
m_symbols.at( libSymbolIt->first );
2315 arc->
SetStart( center + startOffset );
2316 arc->
SetEnd( center + endOffset );
2326 std::vector<LIB_SYMBOL*>& aSymbol )
2340 wxCHECK( currentScreen, );
2346 std::vector<BEZIER<int>> beziers;
2353 schbezier->
SetStart( bezier.Start );
2356 schbezier->
SetEnd( bezier.End );
2360 currentScreen->
Append( schbezier );
2377 m_reporter->
Report( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2383 symbol = libSymbolIt->second;
2384 schsym =
m_symbols.at( libSymbolIt->first );
2394 std::vector<BEZIER<int>> beziers;
2414 schbezier->
SetStart( bezier.Start );
2417 schbezier->
SetEnd( bezier.End );
2420 SetLibShapeLine( elem, schbezier, ALTIUM_SCH_RECORD::ELLIPTICAL_ARC );
2428 std::vector<LIB_SYMBOL*>& aSymbol )
2477 m_reporter->
Report( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
2483 symbol = libSymbolIt->second;
2484 schsym =
m_symbols.at( libSymbolIt->first );
2497 line->
AddPoint( center + startOffset );
2499 line->
AddPoint( center + endOffset );
2514 std::vector<LIB_SYMBOL*>& aSymbol )
2534 FILL_T fillMode = elem.
IsSolid ? FILL_T::FILLED_WITH_COLOR : FILL_T::NO_FILL;
2539 std::vector<BEZIER<int>> beziers;
2540 std::vector<VECTOR2I> polyPoints;
2547 schbezier->
SetStart( bezier.Start );
2550 schbezier->
SetEnd( bezier.End );
2556 screen->
Append( schbezier );
2558 polyPoints.push_back( bezier.Start );
2561 if( fillMode != FILL_T::NO_FILL )
2568 for(
const VECTOR2I& point : polyPoints )
2571 schpoly->
AddPoint( polyPoints[0] );
2573 screen->
Append( schpoly );
2590 m_reporter->
Report( wxString::Format( wxT(
"Ellipse's owner (%d) not found." ),
2596 symbol = libSymbolIt->second;
2597 schsym =
m_symbols.at( libSymbolIt->first );
2603 std::vector<BEZIER<int>> beziers;
2604 std::vector<VECTOR2I> polyPoints;
2616 libbezier->
SetStart( bezier.Start );
2619 libbezier->
SetEnd( bezier.End );
2633 polyPoints.push_back( libbezier->
GetStart() );
2644 for(
const VECTOR2I& point : polyPoints )
2647 libline->
AddPoint( polyPoints[0] );
2657 std::vector<LIB_SYMBOL*>& aSymbol )
2679 screen->
Append( circle );
2695 m_reporter->
Report( wxString::Format( wxT(
"Ellipse's owner (%d) not found." ),
2701 symbol = libSymbolIt->second;
2702 schsym =
m_symbols.at( libSymbolIt->first );
2724 std::vector<LIB_SYMBOL*>& aSymbol )
2757 m_reporter->
Report( wxString::Format( wxT(
"Line's owner (%d) not found." ),
2763 symbol = libSymbolIt->second;
2764 schsym =
m_symbols.at( libSymbolIt->first );
2815 m_reporter->
Report( wxT(
"Signal harness, belonging to the part is not currently "
2822 wxString>& aProperties )
2829 wxCHECK( currentScreen, );
2838 currentScreen->
Append( sheet );
2851 m_reporter->
Report( wxT(
"Harness connector, belonging to the part is not currently "
2866 m_reporter->
Report( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
2873 sheetIt->second->AddPin( sheetPin );
2876 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
2878 VECTOR2I pos = sheetIt->second->GetPosition();
2879 VECTOR2I size = sheetIt->second->GetSize();
2884 case ASCH_SHEET_ENTRY_SIDE::LEFT:
2887 sheetPin->
SetSide( SHEET_SIDE::LEFT );
2889 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
2892 sheetPin->
SetSide( SHEET_SIDE::RIGHT );
2894 case ASCH_SHEET_ENTRY_SIDE::TOP:
2897 sheetPin->
SetSide( SHEET_SIDE::TOP );
2899 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
2902 sheetPin->
SetSide( SHEET_SIDE::BOTTOM );
2916 m_reporter->
Report( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
2930 ASCH_RECORD_ORIENTATION::RIGHTWARDS );
2938 wxString fullPath = fn.GetFullPath();
2940 fullPath.Replace( wxT(
"\\" ), wxT(
"/" ) );
2942 SCH_SCREEN* screen = sheetIt->second->GetScreen();
2947 m_reporter->
Report( wxString::Format(
_(
"Altium's harness connector (%s) was imported as a "
2948 "hierarchical sheet. Please review the imported "
2956 std::vector<LIB_SYMBOL*>& aSymbol )
2971 rect->
SetEnd( sheetBottomLeft );
2992 m_reporter->
Report( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
2998 symbol = libSymbolIt->second;
2999 schsym =
m_symbols.at( libSymbolIt->first );
3013 rect->
SetEnd( sheetBottomLeft );
3041 wxCHECK( currentScreen, );
3042 currentScreen->
Append( sheet );
3051 wxCHECK( rootScreen, );
3059 m_sheets.insert( { aIndex, sheet } );
3071 m_reporter->
Report( wxString::Format( wxT(
"Sheet entry's owner (%d) not found." ),
3078 sheetIt->second->AddPin( sheetPin );
3081 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3085 VECTOR2I pos = sheetIt->second->GetPosition();
3086 VECTOR2I size = sheetIt->second->GetSize();
3091 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3094 sheetPin->
SetSide( SHEET_SIDE::LEFT );
3097 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3100 sheetPin->
SetSide( SHEET_SIDE::RIGHT );
3103 case ASCH_SHEET_ENTRY_SIDE::TOP:
3106 sheetPin->
SetSide( SHEET_SIDE::TOP );
3109 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3112 sheetPin->
SetSide( SHEET_SIDE::BOTTOM );
3119 case ASCH_PORT_IOTYPE::UNSPECIFIED:
3120 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3123 case ASCH_PORT_IOTYPE::OUTPUT:
3124 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
3127 case ASCH_PORT_IOTYPE::INPUT:
3128 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
3131 case ASCH_PORT_IOTYPE::BIDI:
3132 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
3323 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3348 wxString symName( elem.
text );
3349 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3351 if( !styleName.empty() )
3352 symName <<
'_' << styleName;
3361 libSymbol = powerSymbolIt->second;
3366 libSymbol = alreadyLoaded;
3377 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global "
3378 "label with name '%s'" ), elem.
text ) );
3387 pin->SetPosition( { 0, 0 } );
3388 pin->SetLength( 0 );
3389 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
3390 pin->SetVisible(
false );
3423 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
3429 case ASCH_RECORD_ORIENTATION::UPWARDS:
3435 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
3441 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
3452 screen->
Append( symbol );
3463 int height = aElem.
Height;
3473 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
3481 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
3485 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
3489 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
3494 size_t fontId =
static_cast<int>( aElem.
FontID );
3512 screen->
Append( textBox );
3514 m_reporter->
Report( wxString::Format(
_(
"Altium's harness port (%s) was imported as "
3515 "a text box. Please review the imported "
3534 switch( aElem.
Style )
3537 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3538 case ASCH_PORT_STYLE::LEFT:
3539 case ASCH_PORT_STYLE::RIGHT:
3540 case ASCH_PORT_STYLE::LEFT_RIGHT:
3544 case ASCH_PORT_STYLE::NONE_VERTICAL:
3545 case ASCH_PORT_STYLE::TOP:
3546 case ASCH_PORT_STYLE::BOTTOM:
3547 case ASCH_PORT_STYLE::TOP_BOTTOM:
3564 bool connectionFound = startIsWireTerminal
3565 || startIsBusTerminal
3566 || endIsWireTerminal
3567 || endIsBusTerminal;
3569 if( !connectionFound )
3576 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start : end;
3591 case ASCH_PORT_IOTYPE::UNSPECIFIED: label->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
break;
3592 case ASCH_PORT_IOTYPE::OUTPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
break;
3593 case ASCH_PORT_IOTYPE::INPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
break;
3594 case ASCH_PORT_IOTYPE::BIDI: label->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
break;
3597 switch( aElem.
Style )
3600 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3601 case ASCH_PORT_STYLE::LEFT:
3602 case ASCH_PORT_STYLE::RIGHT:
3603 case ASCH_PORT_STYLE::LEFT_RIGHT:
3604 if( ( startIsWireTerminal || startIsBusTerminal ) )
3611 case ASCH_PORT_STYLE::NONE_VERTICAL:
3612 case ASCH_PORT_STYLE::TOP:
3613 case ASCH_PORT_STYLE::BOTTOM:
3614 case ASCH_PORT_STYLE::TOP_BOTTOM:
3615 if( ( startIsWireTerminal || startIsBusTerminal ) )
3627 label->
GetFields()[0].SetVisible(
false );
3634 if( ( startIsWireTerminal && endIsWireTerminal ) )
3642 else if( startIsBusTerminal && endIsBusTerminal )
3665 screen->
Append( noConnect );
3693 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3696 SCH_LAYER_ID::LAYER_BUS );
3713 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3716 SCH_LAYER_ID::LAYER_WIRE );
3736 screen->
Append( junction );
3748 && component->second.currentpartid != elem.
ownerpartid )
3752 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>( center );
3763 wxString msg = wxString::Format(
_(
"Embedded file %s not found in storage." ),
3769 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
3772 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
3773 wxZlibInputStream zlibInputStream( fileStream );
3774 wxFFileOutputStream outputStream( storagePath );
3775 outputStream.Write( zlibInputStream );
3776 outputStream.Close();
3778 if( !bitmap->ReadImageFile( storagePath ) )
3780 m_reporter->
Report( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
3786 wxRemoveFile( storagePath );
3790 if( !wxFileExists( elem.
filename ) )
3797 if( !bitmap->ReadImageFile( elem.
filename ) )
3806 VECTOR2I currentImageSize = bitmap->GetSize();
3808 double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
3809 double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
3810 bitmap->SetImageScale( std::min( scaleX, scaleY ) );
3812 bitmap->SetFlags(
IS_NEW );
3813 screen->
Append( bitmap.release() );
3819 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
3826 bool isPortrait =
m_altiumSheet->sheetOrientation == ASCH_SHEET_WORKSPACEORIENTATION::PORTRAIT;
3839 case ASCH_SHEET_SIZE::A4: pageInfo.
SetType(
"A4", isPortrait );
break;
3840 case ASCH_SHEET_SIZE::A3: pageInfo.
SetType(
"A3", isPortrait );
break;
3841 case ASCH_SHEET_SIZE::A2: pageInfo.
SetType(
"A2", isPortrait );
break;
3842 case ASCH_SHEET_SIZE::A1: pageInfo.
SetType(
"A1", isPortrait );
break;
3843 case ASCH_SHEET_SIZE::A0: pageInfo.
SetType(
"A0", isPortrait );
break;
3844 case ASCH_SHEET_SIZE::A: pageInfo.
SetType(
"A", isPortrait );
break;
3845 case ASCH_SHEET_SIZE::B: pageInfo.
SetType(
"B", isPortrait );
break;
3846 case ASCH_SHEET_SIZE::C: pageInfo.
SetType(
"C", isPortrait );
break;
3847 case ASCH_SHEET_SIZE::D: pageInfo.
SetType(
"D", isPortrait );
break;
3848 case ASCH_SHEET_SIZE::E: pageInfo.
SetType(
"E", isPortrait );
break;
3849 case ASCH_SHEET_SIZE::LETTER: pageInfo.
SetType(
"USLetter", isPortrait );
break;
3850 case ASCH_SHEET_SIZE::LEGAL: pageInfo.
SetType(
"USLegal", isPortrait );
break;
3851 case ASCH_SHEET_SIZE::TABLOID: pageInfo.
SetType(
"A3", isPortrait );
break;
3852 case ASCH_SHEET_SIZE::ORCAD_A: pageInfo.
SetType(
"A", isPortrait );
break;
3853 case ASCH_SHEET_SIZE::ORCAD_B: pageInfo.
SetType(
"B", isPortrait );
break;
3854 case ASCH_SHEET_SIZE::ORCAD_C: pageInfo.
SetType(
"C", isPortrait );
break;
3855 case ASCH_SHEET_SIZE::ORCAD_D: pageInfo.
SetType(
"D", isPortrait );
break;
3856 case ASCH_SHEET_SIZE::ORCAD_E: pageInfo.
SetType(
"E", isPortrait );
break;
3874 m_reporter->
Report( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
3897 m_reporter->
Report( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
3923 m_reporter->
Report( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
3937 bool emptyRef = elem.
text.IsEmpty();
3942 bool visible = !emptyRef;
3954 std::vector<LIB_SYMBOL*>& aSymbol,
3955 std::vector<int>& aFontSizes )
3962 bool emptyRef = elem.
text.IsEmpty();
3963 SCH_FIELD& refField = symbol->GetReferenceField();
3966 refField.
SetText( wxT(
"X" ) );
3972 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
3974 int size = aFontSizes[elem.
fontId - 1];
3991 busWireEntry->
SetSize( { vector.
x, vector.
y } );
3994 screen->
Append( busWireEntry );
4003 static const std::map<wxString, wxString> variableMap = {
4004 {
"COMMENT",
"VALUE" },
4005 {
"VALUE",
"ALTIUM_VALUE" },
4011 if( elem.
text ==
"*" )
4014 wxString paramName = elem.
name.Upper();
4016 if( paramName ==
"SHEETNUMBER" )
4020 else if( paramName ==
"TITLE" )
4024 else if( paramName ==
"REVISION" )
4028 else if( paramName ==
"DATE" )
4032 else if( paramName ==
"COMPANYNAME" )
4053 wxString upperName = elem.
name.Upper();
4055 if( upperName ==
"COMMENT" )
4062 wxString fieldName = elem.
name.Upper();
4066 if( fieldName.IsEmpty() )
4068 int disambiguate = 1;
4072 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4079 else if( fieldName ==
"VALUE" )
4081 fieldName =
"ALTIUM_VALUE";
4097 std::vector<LIB_SYMBOL*>& aSymbol,
4098 std::vector<int>& aFontSizes )
4119 std::map<wxString, wxString> variableMap = {
4120 {
"COMMENT",
"VALUE" },
4126 wxString upperName = elem.
name.Upper();
4128 if( upperName ==
"COMMENT" )
4130 field = &libSymbol->GetValueField();
4134 int fieldIdx = libSymbol->GetFieldCount();
4135 wxString fieldNameStem = elem.
name;
4136 wxString fieldName = fieldNameStem;
4137 int disambiguate = 1;
4139 if( fieldName.IsEmpty() )
4141 fieldNameStem =
"ALTIUM_UNNAMED";
4142 fieldName =
"ALTIUM_UNNAMED_1";
4145 else if( upperName ==
"VALUE" )
4147 fieldNameStem =
"ALTIUM_VALUE";
4148 fieldName =
"ALTIUM_VALUE";
4152 while( libSymbol->FindField( fieldName ) )
4153 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4156 libSymbol->AddField( new_field );
4167 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4169 int size = aFontSizes[elem.
fontId - 1];
4183 const std::map<wxString, wxString>& aProperties )
4192 std::vector<LIB_SYMBOL*>& aSymbol )
4196 if( elem.
type != wxS(
"PCBLIB" ) )
4200 if( aSymbol.size() == 0 && !elem.
isCurrent )
4206 wxArrayString fpFilters;
4207 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4210 if( !aSymbol.empty() )
4216 symbol->SetFPFilters( fpFilters );
4217 SCH_FIELD& footprintField = symbol->GetFootprintField();
4228 m_reporter->
Report( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4234 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4238 m_reporter->
Report( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4239 implementationOwnerIt->second ),
4246 libSymbolIt->second->SetFPFilters( fpFilters );
4256 wxString>& aProperties )
4260 std::vector<LIB_SYMBOL*> symbols;
4278 symbols.push_back( symbol );
4287 std::map<wxString,LIB_SYMBOL*> ret;
4288 std::vector<int> fontSizes;
4289 struct SYMBOL_PIN_FRAC
4298 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4300 for(
auto& [
name, entry] : syms )
4303 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4305 if( entry.m_pinsFrac )
4307 auto parse_binary_pin_frac =
4308 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4310 std::map<wxString, wxString> result;
4316 SYMBOL_PIN_FRAC pinFrac;
4320 pinFrac.len_frac = binreader.
ReadInt32();
4321 pinFracs.insert( { pinFracData.first, pinFrac } );
4335 std::vector<LIB_SYMBOL*> symbols;
4344 std::map<wxString, wxString> properties = reader.
ReadProperties();
4348 if( record != ALTIUM_SCH_RECORD::COMPONENT )
4349 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4354 auto handleBinaryPinLambda =
4355 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4357 std::map<wxString, wxString> result;
4361 int32_t recordId = binreader.
ReadInt32();
4363 if( recordId !=
static_cast<int32_t
>( ALTIUM_SCH_RECORD::PIN ) )
4366 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4368 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4369 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4370 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4371 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4372 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4373 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4376 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4377 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4378 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4379 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4380 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4381 result[
"COLOR"] = wxString::Format(
"%d", binreader.
ReadInt32() );
4387 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4389 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4390 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4391 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4395 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4397 if( partSeqSplit.size() == 3 )
4399 result[
"PART"] = partSeqSplit[0];
4400 result[
"SEQ"] = partSeqSplit[2];
4408 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4410 if( properties.empty() )
4418 case ALTIUM_SCH_RECORD::PIN:
4425 case ALTIUM_SCH_RECORD::LABEL:
ParseLabel( properties, symbols, fontSizes );
break;
4427 case ALTIUM_SCH_RECORD::BEZIER:
ParseBezier( properties, symbols );
break;
4429 case ALTIUM_SCH_RECORD::POLYLINE:
ParsePolyline( properties, symbols );
break;
4431 case ALTIUM_SCH_RECORD::POLYGON:
ParsePolygon( properties, symbols );
break;
4433 case ALTIUM_SCH_RECORD::ELLIPSE:
ParseEllipse( properties, symbols );
break;
4435 case ALTIUM_SCH_RECORD::PIECHART:
ParsePieChart( properties, symbols );
break;
4437 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
ParseRoundRectangle( properties, symbols );
break;
4439 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
ParseEllipticalArc( properties, symbols );
break;
4441 case ALTIUM_SCH_RECORD::ARC:
ParseArc( properties, symbols );
break;
4443 case ALTIUM_SCH_RECORD::LINE:
ParseLine( properties, symbols );
break;
4445 case ALTIUM_SCH_RECORD::RECTANGLE:
ParseRectangle( properties, symbols );
break;
4447 case ALTIUM_SCH_RECORD::DESIGNATOR:
ParseLibDesignator( properties, symbols, fontSizes );
break;
4449 case ALTIUM_SCH_RECORD::PARAMETER:
ParseLibParameter( properties, symbols, fontSizes );
break;
4451 case ALTIUM_SCH_RECORD::TEXT_FRAME:
ParseTextFrame( properties, symbols, fontSizes );
break;
4454 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
break;
4456 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
ParseImplementation( properties, symbols );
break;
4458 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
break;
4460 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
break;
4461 case ALTIUM_SCH_RECORD::MAP_DEFINER:
break;
4464 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
break;
4467 case ALTIUM_SCH_RECORD::IMAGE:
break;
4470 m_reporter->
Report( wxString::Format(
_(
"Unknown or unexpected record id %d found "
4472 recordId, symbols[0]->
GetName() ),
4484 for(
size_t ii = 0; ii < symbols.size(); ii++ )
4492 if( valField.
GetText().IsEmpty() )
4495 if( symbols.size() == 1 )
4498 ret[wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 )] = symbol;
4508 wxFileName fn( aLibraryPath );
4510 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
4511 return fn.GetModificationTime().GetValue().GetValue();
4513 return wxDateTime( 0.0 ).GetValue().GetValue();
4531 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
4533 wxFileName fileName( aLibraryPath );
4538 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
4542 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
4544 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
4548 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom =
4549 std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
4551 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles =
4552 intCom->EnumDir( L
"SchLib" );
4554 for(
const auto& [schLibName, cfe] : schLibFiles )
4555 compoundFiles.push_back( intCom->DecodeIntLibStream( *cfe ) );
4558 std::map<wxString, LIB_SYMBOL*>& cacheMapRef =
m_libCache[aLibraryPath];
4560 for(
auto& altiumSchFilePtr : compoundFiles )
4562 std::map<wxString, LIB_SYMBOL*> parsed =
ParseLibFile( *altiumSchFilePtr );
4563 cacheMapRef.insert( parsed.begin(), parsed.end() );
4568 catch(
const CFB::CFBException& exception )
4572 catch(
const std::exception& exc )
4574 wxFAIL_MSG( wxString::Format( wxT(
"Unhandled exception in Altium schematic parsers: %s." ),
4582 std::vector<int>& aFontSizes )
4584 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
4586 if( file ==
nullptr )
4596 std::map<wxString, wxString> properties = reader.
ReadProperties();
4600 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
4601 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
4603 for(
auto& [key, value] : properties )
4605 wxString upperKey = key.Upper();
4608 if( upperKey.StartsWith(
"SIZE", &remaining ) )
4610 if( !remaining.empty() )
4612 int ind = wxAtoi( remaining );
4614 if(
static_cast<int>( aFontSizes.size() ) < ind )
4615 aFontSizes.resize( ind );
4619 aFontSizes[ind - 1] = scaled;
4629 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
4633 bool powerSymbolsOnly = ( aProperties &&
4635 != aProperties->end() );
4641 for(
auto& [libnameStr, libSymbol] : it->second )
4643 if( powerSymbolsOnly && !libSymbol->IsPower() )
4646 aInserter( libnameStr, libSymbol );
4653 const wxString& aLibraryPath,
4659 aSymbolNameList.Add( aStr );
4665 const wxString& aLibraryPath,
4671 aSymbolList.emplace_back( aSymbol );
4677 const wxString& aAliasName,
4686 auto it2 = it->second.find( aAliasName );
4688 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.
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)
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetItalic(bool aItalic)
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 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 void SetElem(ELEM_T aIndex, _ELEM *aElem)
virtual std::map< wxString, wxString > & GetTextVars() const
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)
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 EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
void fixupSymbolPinNameNumbers(SYMBOL *aSymbol)
void ParseRecord(int index, std::map< wxString, wxString > &properties, const wxString &aSectionName)
std::vector< ASCH_PORT > m_altiumHarnessPortsCurrentSheet
std::unique_ptr< STRING_UTF8_MAP > m_properties
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)
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)
LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aAliasName, const STRING_UTF8_MAP *aProperties=nullptr) override
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
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)
SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const STRING_UTF8_MAP *aProperties=nullptr) override
Load information from some input file format that this SCH_IO implementation knows about,...
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 doEnumerateSymbolLib(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties, std::function< void(const wxString &, LIB_SYMBOL *)> aInserter)
void ParseHarnessEntry(const std::map< wxString, wxString > &aProperties)
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 ensureLoadedLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties)
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)
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)
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
A name/value tuple with unique names and optional values.
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)
static const std::vector< uint8_t > COMPOUND_FILE_HEADER
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.
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".
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.