56#include <compoundfilereader.h>
65#include <wx/mstream.h>
66#include <wx/zstream.h>
67#include <wx/wfstream.h>
68#include <magic_enum.hpp>
82#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
83 0.94901960784313721, \
84 0.98431372549019602, 1.0 )
86#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
87 0.61960784313725492, \
88 0.78823529411764703, 1.0 )
101 int green = (
color & 0x00FF00 ) >> 8;
102 int blue = (
color & 0xFF0000 ) >> 16;
174 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
211 else if( elem.
AreaColor == aStrokeColor )
217 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
262 for(
auto& [
name, symbol] : lib )
314 std::vector<SCH_PIN*> pins = aSymbol->
GetPins();
316 bool names_visible =
false;
317 bool numbers_visible =
false;
321 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
322 names_visible =
true;
324 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
325 numbers_visible =
true;
336 if( !numbers_visible )
381 const std::map<std::string, UTF8>* aProperties )
383 wxCHECK( !aFileName.IsEmpty() && aSchematic,
nullptr );
385 wxFileName fileName( aFileName );
393 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
397 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
424 wxCHECK_MSG( libTable,
nullptr,
"Could not load symbol lib table." );
426 m_pi.reset( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
434 wxString libTableUri =
"${KIPRJMOD}/" +
getLibFileName().GetFullName();
438 wxString(
"KiCad" ) ) );
447 libTable->
Format( &formatter, 0 );
458 wxCHECK( rootScreen,
nullptr );
488 int minWireWidth = std::numeric_limits<int>::max();
489 int minBusWidth = std::numeric_limits<int>::max();
493 std::vector<SCH_MARKER*> markers;
500 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
503 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
509 if( minWireWidth < std::numeric_limits<int>::max() )
510 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
512 if( minBusWidth < std::numeric_limits<int>::max() )
513 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
533 std::vector<SCH_LINE*> busLines;
534 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
542 busLines.push_back( line );
544 busLineMap[ line->
GetEndPoint() ].push_back( line );
551 auto it = busLineMap.find( aStart );
553 if( it == busLineMap.end() )
559 if( aVisited.count( line ) )
562 aVisited.insert( line );
587 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>( screen);
588 alias->SetName( harness.m_name );
590 for(
auto& port : harness.m_ports )
591 alias->Members().push_back( port.m_name );
596 BOX2I box( harness.m_location, harness.m_size );
633 busLine =
new SCH_LINE( pos, SCH_LAYER_ID::LAYER_BUS );
636 screen->
Append( busLine );
640 busLine =
new SCH_LINE( pos, SCH_LAYER_ID::LAYER_BUS );
643 screen->
Append( busLine );
654 std::set<SCH_LINE*> visited;
655 SCH_LABEL* label = walkBusLine( pos, visited );
662 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
663 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
680 bool isVertical =
true;
682 if( harness.m_ports.size() > 1 )
684 VECTOR2I first = harness.m_ports.front().m_location;
685 VECTOR2I last = harness.m_ports.back().m_location;
687 if( first.
y == last.
y )
693 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
694 VECTOR2I top = harness.m_ports.front().m_entryLocation;
723 line =
new SCH_LINE( last_pt, SCH_LAYER_ID::LAYER_BUS );
727 ? -delta_space: delta_space, 0 ) );
733 line =
new SCH_LINE( last_pt, SCH_LAYER_ID::LAYER_BUS );
742 line =
new SCH_LINE( last_pt, SCH_LAYER_ID::LAYER_BUS );
757 wxFileName parentFileName = aFileName;
771 catch(
const CFB::CFBException& exception )
775 catch(
const std::exception& exc )
777 wxLogTrace(
traceAltiumSch, wxS(
"Unhandled exception in Altium schematic "
778 "parsers: %s." ), exc.what() );
788 wxCHECK( currentScreen, );
796 wxCHECK2( sheet,
continue );
800 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
802 if( !loadAltiumFileName.IsFileReadable() )
806 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
807 wxDIR_FILES | wxDIR_HIDDEN );
809 for(
const wxString& candidate : files )
811 wxFileName candidateFname( candidate );
813 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false ) )
815 loadAltiumFileName = candidateFname;
821 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
825 msg.Printf(
_(
"The file name for sheet %s is undefined, this is probably an"
826 " Altium signal harness that got converted to a sheet." ),
845 if( sheet->
GetName().Trim().empty() )
846 sheet->
SetName( loadAltiumFileName.GetName() );
848 wxCHECK2( screen,
continue );
855 wxFileName projectFileName = loadAltiumFileName;
858 sheet->
SetFileName( projectFileName.GetFullName() );
859 screen->
SetFileName( projectFileName.GetFullPath() );
869 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
871 if( file ==
nullptr )
876 std::map<wxString, wxString> properties = reader.
ReadProperties();
883 for(
int i = 0; i < weight; i++ )
893 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed "
894 "(%d bytes remaining)." ),
903 wxString streamName = wxS(
"Additional" );
905 const CFB::COMPOUND_FILE_ENTRY* file =
906 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
908 if( file ==
nullptr )
919 std::map<wxString, wxString> properties = reader.
ReadProperties();
924 if( record != ALTIUM_SCH_RECORD::HEADER )
930 std::map<wxString, wxString> properties = reader.
ReadProperties();
954 wxString streamName = wxS(
"FileHeader" );
956 const CFB::COMPOUND_FILE_ENTRY* file =
957 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
959 if( file ==
nullptr )
970 std::map<wxString, wxString> properties = reader.
ReadProperties();
974 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
987 std::map<wxString, wxString> properties = reader.
ReadProperties();
999 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1012 symbol.second->SetLibSymbol( libSymbolIt->second );
1049 while( storageReader.
CanRead() )
1051 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1054 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1068 std::map<wxString, wxString> properties = reader.
ReadProperties();
1072 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1087 std::map<wxString, wxString> properties = reader.
ReadProperties();
1090 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1096 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1109 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1122 symbol.second->SetLibSymbol( libSymbolIt->second );
1162 const wxString& aSectionName )
1172 case ALTIUM_SCH_RECORD::HEADER:
1175 case ALTIUM_SCH_RECORD::COMPONENT:
1179 case ALTIUM_SCH_RECORD::PIN:
1183 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
1187 case ALTIUM_SCH_RECORD::LABEL:
1191 case ALTIUM_SCH_RECORD::BEZIER:
1195 case ALTIUM_SCH_RECORD::POLYLINE:
1199 case ALTIUM_SCH_RECORD::POLYGON:
1203 case ALTIUM_SCH_RECORD::ELLIPSE:
1207 case ALTIUM_SCH_RECORD::PIECHART:
1211 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
1215 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
1216 case ALTIUM_SCH_RECORD::ARC:
1220 case ALTIUM_SCH_RECORD::LINE:
1224 case ALTIUM_SCH_RECORD::RECTANGLE:
1228 case ALTIUM_SCH_RECORD::SHEET_SYMBOL:
1232 case ALTIUM_SCH_RECORD::SHEET_ENTRY:
1236 case ALTIUM_SCH_RECORD::POWER_PORT:
1240 case ALTIUM_SCH_RECORD::PORT:
1246 case ALTIUM_SCH_RECORD::NO_ERC:
1250 case ALTIUM_SCH_RECORD::NET_LABEL:
1254 case ALTIUM_SCH_RECORD::BUS:
1258 case ALTIUM_SCH_RECORD::WIRE:
1262 case ALTIUM_SCH_RECORD::TEXT_FRAME:
1266 case ALTIUM_SCH_RECORD::JUNCTION:
1270 case ALTIUM_SCH_RECORD::IMAGE:
1274 case ALTIUM_SCH_RECORD::SHEET:
1278 case ALTIUM_SCH_RECORD::SHEET_NAME:
1282 case ALTIUM_SCH_RECORD::FILE_NAME:
1286 case ALTIUM_SCH_RECORD::DESIGNATOR:
1290 case ALTIUM_SCH_RECORD::BUS_ENTRY:
1294 case ALTIUM_SCH_RECORD::TEMPLATE:
1298 case ALTIUM_SCH_RECORD::PARAMETER:
1302 case ALTIUM_SCH_RECORD::PARAMETER_SET:
1306 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
1310 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
1314 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
1317 case ALTIUM_SCH_RECORD::MAP_DEFINER:
1320 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
1323 case ALTIUM_SCH_RECORD::NOTE:
1327 case ALTIUM_SCH_RECORD::COMPILE_MASK:
1331 case ALTIUM_SCH_RECORD::HYPERLINK:
1336 case ALTIUM_SCH_RECORD::HARNESS_CONNECTOR:
1340 case ALTIUM_SCH_RECORD::HARNESS_ENTRY:
1344 case ALTIUM_SCH_RECORD::HARNESS_TYPE:
1348 case ALTIUM_SCH_RECORD::SIGNAL_HARNESS:
1352 case ALTIUM_SCH_RECORD::BLANKET:
1358 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1389 if( file.filename.IsSameAs( aFilename ) )
1392 if( file.filename.EndsWith( aFilename ) )
1393 nonExactMatch = &file;
1396 return nonExactMatch;
1403 wxCHECK( currentSheet, );
1405 wxString sheetName = currentSheet->
GetName();
1407 if( sheetName.IsEmpty() )
1408 sheetName = wxT(
"root" );
1416 m_errorMessages.emplace( wxString::Format(
_(
"Symbol \"%s\" in sheet \"%s\" at index %d "
1417 "replaced with symbol \"%s\"." ),
1429 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1453 field.SetVisible(
false );
1464 screen->
Append( symbol );
1473 wxCHECK( currentSheet, );
1475 wxString sheetName = currentSheet->
GetName();
1477 if( sheetName.IsEmpty() )
1478 sheetName = wxT(
"root" );
1483 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1485 if( baseName.IsEmpty() )
1486 baseName = wxS(
"Template" );
1494 std::vector<LIB_SYMBOL*>& aSymbol )
1510 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1519 schSymbol =
m_symbols.at( libSymbolIt->first );
1520 symbol = libSymbolIt->second;
1539 pin->SetVisible(
false );
1542 pin->SetNumberTextSize( 0 );
1545 pin->SetNameTextSize( 0 );
1551 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
1552 pin->SetOrientation( PIN_ORIENTATION::PIN_LEFT );
1556 case ASCH_RECORD_ORIENTATION::UPWARDS:
1557 pin->SetOrientation( PIN_ORIENTATION::PIN_DOWN );
1561 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
1562 pin->SetOrientation( PIN_ORIENTATION::PIN_RIGHT );
1566 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
1567 pin->SetOrientation( PIN_ORIENTATION::PIN_UP );
1581 pin->SetPosition( pinLocation );
1585 case ASCH_PIN_ELECTRICAL::INPUT:
1586 pin->SetType( ELECTRICAL_PINTYPE::PT_INPUT );
1589 case ASCH_PIN_ELECTRICAL::BIDI:
1590 pin->SetType( ELECTRICAL_PINTYPE::PT_BIDI );
1593 case ASCH_PIN_ELECTRICAL::OUTPUT:
1594 pin->SetType( ELECTRICAL_PINTYPE::PT_OUTPUT );
1597 case ASCH_PIN_ELECTRICAL::OPEN_COLLECTOR:
1598 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR );
1601 case ASCH_PIN_ELECTRICAL::PASSIVE:
1602 pin->SetType( ELECTRICAL_PINTYPE::PT_PASSIVE );
1605 case ASCH_PIN_ELECTRICAL::TRISTATE:
1606 pin->SetType( ELECTRICAL_PINTYPE::PT_TRISTATE );
1609 case ASCH_PIN_ELECTRICAL::OPEN_EMITTER:
1610 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENEMITTER );
1613 case ASCH_PIN_ELECTRICAL::POWER:
1614 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
1617 case ASCH_PIN_ELECTRICAL::UNKNOWN:
1619 pin->SetType( ELECTRICAL_PINTYPE::PT_UNSPECIFIED );
1635 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED_CLOCK );
1639 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED );
1648 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK_LOW );
1652 pin->SetShape( GRAPHIC_PINSHAPE::INPUT_LOW );
1658 pin->SetShape( GRAPHIC_PINSHAPE::OUTPUT_LOW );
1665 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK );
1669 pin->SetShape( GRAPHIC_PINSHAPE::LINE );
1679 int vjustify, hjustify;
1682 switch( justification )
1705 switch( justification )
1728 switch( orientation )
1751 text->SetTextAngle( angle );
1770 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
1776 static const std::map<wxString, wxString> variableMap = {
1777 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
1778 {
"SHEETNUMBER",
"#" },
1779 {
"SHEETTOTAL",
"##" },
1780 {
"TITLE",
"TITLE" },
1781 {
"REVISION",
"REVISION" },
1782 {
"DATE",
"ISSUE_DATE" },
1783 {
"CURRENTDATE",
"CURRENT_DATE" },
1784 {
"COMPANYNAME",
"COMPANY" },
1785 {
"DOCUMENTNAME",
"FILENAME" },
1786 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
1787 {
"PROJECTNAME",
"PROJECTNAME" },
1795 size_t fontId =
static_cast<int>( elem.
fontId );
1812 screen->
Append( textItem );
1828 m_errorMessages.emplace( wxString::Format( wxT(
"Label's owner (%d) not found." ),
1834 symbol = libSymbolIt->second;
1835 schsym =
m_symbols.at( libSymbolIt->first );
1850 size_t fontId = elem.
fontId;
1861 else if( fontId > 0 && fontId <= aFontSizes.size() )
1863 int size = aFontSizes[fontId - 1];
1871 std::vector<LIB_SYMBOL*>& aSymbol,
1872 std::vector<int>& aFontSizes )
1899 textBox->
SetStart( sheetTopRight );
1900 textBox->
SetEnd( sheetBottomLeft );
1907 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
1921 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
1924 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
1927 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
1932 size_t fontId =
static_cast<int>( aElem->
FontID );
1950 screen->
Append( textBox );
1955 std::vector<int>& aFontSizes )
1970 wxString::Format( wxT(
"Label's owner (%d) not found." ), aElem->
ownerindex ),
1975 symbol = libSymbolIt->second;
1976 schsym =
m_symbols.at( libSymbolIt->first );
2001 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
2014 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
2017 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
2020 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
2025 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2027 int size = aFontSizes[aElem->
FontID - 1];
2034 std::vector<LIB_SYMBOL*>& aSymbol )
2038 if( elem.
points.size() < 2 )
2040 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are "
2042 static_cast<int>( elem.
points.size() ) ),
2050 wxCHECK( currentScreen, );
2052 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2054 if( i + 2 == elem.
points.size() )
2058 SCH_LAYER_ID::LAYER_NOTES );
2065 currentScreen->
Append( line );
2070 std::vector<VECTOR2I> bezierPoints;
2071 std::vector<VECTOR2I> polyPoints;
2073 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2074 bezierPoints.push_back( elem.
points.at( j ) );
2077 converter.
GetPoly( polyPoints );
2079 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2082 SCH_LAYER_ID::LAYER_NOTES );
2088 currentScreen->
Append( line );
2107 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2113 symbol = libSymbolIt->second;
2114 schsym =
m_symbols.at( libSymbolIt->first );
2120 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2122 if( i + 2 == elem.
points.size() )
2130 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2142 else if( i + 3 == elem.
points.size() )
2153 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2173 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2182 case 0: bezier->
SetStart( pos );
break;
2185 case 3: bezier->
SetEnd( pos );
break;
2199 std::vector<LIB_SYMBOL*>& aSymbol )
2203 if( elem.
Points.size() < 2 )
2211 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2240 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2246 symbol = libSymbolIt->second;
2247 schsym =
m_symbols.at( libSymbolIt->first );
2276 std::vector<LIB_SYMBOL*>& aSymbol )
2311 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2317 symbol = libSymbolIt->second;
2318 schsym =
m_symbols.at( libSymbolIt->first );
2359 std::vector<LIB_SYMBOL*>& aSymbol )
2393 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not "
2400 symbol = libSymbolIt->second;
2401 schsym =
m_symbols.at( libSymbolIt->first );
2419 int radius = std::min( width / 2, height / 2 );
2455 std::vector<LIB_SYMBOL*>& aSymbol )
2471 wxCHECK( currentScreen, );
2483 currentScreen->
Append( circle );
2496 currentScreen->
Append( arc );
2513 m_errorMessages.emplace( wxString::Format( wxT(
"Arc's owner (%d) not found." ),
2519 symbol = libSymbolIt->second;
2520 schsym =
m_symbols.at( libSymbolIt->first );
2563 std::vector<LIB_SYMBOL*>& aSymbol )
2577 wxCHECK( currentScreen, );
2583 std::vector<BEZIER<int>> beziers;
2590 schbezier->
SetStart( bezier.Start );
2593 schbezier->
SetEnd( bezier.End );
2597 currentScreen->
Append( schbezier );
2614 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2620 symbol = libSymbolIt->second;
2621 schsym =
m_symbols.at( libSymbolIt->first );
2631 std::vector<BEZIER<int>> beziers;
2651 schbezier->
SetStart( bezier.Start );
2654 schbezier->
SetEnd( bezier.End );
2657 SetLibShapeLine( elem, schbezier, ALTIUM_SCH_RECORD::ELLIPTICAL_ARC );
2665 std::vector<LIB_SYMBOL*>& aSymbol )
2714 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
2720 symbol = libSymbolIt->second;
2721 schsym =
m_symbols.at( libSymbolIt->first );
2751 std::vector<LIB_SYMBOL*>& aSymbol )
2771 FILL_T fillMode = elem.
IsSolid ? FILL_T::FILLED_WITH_COLOR : FILL_T::NO_FILL;
2776 std::vector<BEZIER<int>> beziers;
2777 std::vector<VECTOR2I> polyPoints;
2784 schbezier->
SetStart( bezier.Start );
2787 schbezier->
SetEnd( bezier.End );
2793 screen->
Append( schbezier );
2795 polyPoints.push_back( bezier.Start );
2798 if( fillMode != FILL_T::NO_FILL )
2805 for(
const VECTOR2I& point : polyPoints )
2808 schpoly->
AddPoint( polyPoints[0] );
2810 screen->
Append( schpoly );
2827 m_errorMessages.emplace( wxString::Format( wxT(
"Ellipse's owner (%d) not found." ),
2833 symbol = libSymbolIt->second;
2834 schsym =
m_symbols.at( libSymbolIt->first );
2840 std::vector<BEZIER<int>> beziers;
2841 std::vector<VECTOR2I> polyPoints;
2853 libbezier->
SetStart( bezier.Start );
2856 libbezier->
SetEnd( bezier.End );
2870 polyPoints.push_back( libbezier->
GetStart() );
2881 for(
const VECTOR2I& point : polyPoints )
2884 libline->
AddPoint( polyPoints[0] );
2894 std::vector<LIB_SYMBOL*>& aSymbol )
2916 screen->
Append( circle );
2932 m_errorMessages.emplace( wxString::Format( wxT(
"Ellipse's owner (%d) not found." ),
2938 symbol = libSymbolIt->second;
2939 schsym =
m_symbols.at( libSymbolIt->first );
2961 std::vector<LIB_SYMBOL*>& aSymbol )
2994 m_errorMessages.emplace( wxString::Format( wxT(
"Line's owner (%d) not found." ),
3000 symbol = libSymbolIt->second;
3001 schsym =
m_symbols.at( libSymbolIt->first );
3038 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3041 SCH_LAYER_ID::LAYER_BUS );
3053 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently "
3060 wxString>& aProperties )
3069 HARNESS& harness = it->second;
3080 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3083 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3086 case ASCH_SHEET_ENTRY_SIDE::TOP:
3089 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3097 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently "
3112 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3118 HARNESS& harness = harnessIt->second;
3130 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3133 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3137 case ASCH_SHEET_ENTRY_SIDE::TOP:
3140 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3154 harness.
m_ports.emplace_back( port );
3166 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3172 HARNESS& harness = harnessIt->second;
3179 std::vector<LIB_SYMBOL*>& aSymbol )
3194 rect->
SetEnd( sheetBottomLeft );
3215 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3221 symbol = libSymbolIt->second;
3222 schsym =
m_symbols.at( libSymbolIt->first );
3236 rect->
SetEnd( sheetBottomLeft );
3264 wxCHECK( currentScreen, );
3265 currentScreen->
Append( sheet );
3274 wxCHECK( rootScreen, );
3282 m_sheets.insert( { aIndex, sheet } );
3294 m_errorMessages.emplace( wxString::Format( wxT(
"Sheet entry's owner (%d) not found." ),
3301 sheetIt->second->AddPin( sheetPin );
3304 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3308 VECTOR2I pos = sheetIt->second->GetPosition();
3309 VECTOR2I size = sheetIt->second->GetSize();
3314 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3317 sheetPin->
SetSide( SHEET_SIDE::LEFT );
3320 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3323 sheetPin->
SetSide( SHEET_SIDE::RIGHT );
3326 case ASCH_SHEET_ENTRY_SIDE::TOP:
3329 sheetPin->
SetSide( SHEET_SIDE::TOP );
3332 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3335 sheetPin->
SetSide( SHEET_SIDE::BOTTOM );
3342 case ASCH_PORT_IOTYPE::UNSPECIFIED:
3343 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3346 case ASCH_PORT_IOTYPE::OUTPUT:
3347 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
3350 case ASCH_PORT_IOTYPE::INPUT:
3351 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
3354 case ASCH_PORT_IOTYPE::BIDI:
3355 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
3546 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3571 wxString symName( elem.
text );
3572 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3574 if( !styleName.empty() )
3575 symName <<
'_' << styleName;
3584 libSymbol = powerSymbolIt->second;
3589 libSymbol = alreadyLoaded;
3600 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global "
3601 "label with name '%s'" ), elem.
text ) );
3610 pin->SetPosition( { 0, 0 } );
3611 pin->SetLength( 0 );
3612 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
3613 pin->SetVisible(
false );
3646 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
3652 case ASCH_RECORD_ORIENTATION::UPWARDS:
3658 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
3664 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
3675 screen->
Append( symbol );
3703 switch( aElem.
Style )
3706 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3707 case ASCH_PORT_STYLE::LEFT:
3708 case ASCH_PORT_STYLE::RIGHT:
3709 case ASCH_PORT_STYLE::LEFT_RIGHT:
3713 case ASCH_PORT_STYLE::NONE_VERTICAL:
3714 case ASCH_PORT_STYLE::TOP:
3715 case ASCH_PORT_STYLE::BOTTOM:
3716 case ASCH_PORT_STYLE::TOP_BOTTOM:
3733 bool connectionFound = startIsWireTerminal
3734 || startIsBusTerminal
3735 || endIsWireTerminal
3736 || endIsBusTerminal;
3738 if( !connectionFound )
3742 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
3745 BOX2I bbox( harness.m_location, harness.m_size );
3750 startIsBusTerminal =
true;
3751 connectionFound =
true;
3757 endIsBusTerminal =
true;
3758 connectionFound =
true;
3763 if( !connectionFound )
3771 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
3786 case ASCH_PORT_IOTYPE::UNSPECIFIED: label->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
break;
3787 case ASCH_PORT_IOTYPE::OUTPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
break;
3788 case ASCH_PORT_IOTYPE::INPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
break;
3789 case ASCH_PORT_IOTYPE::BIDI: label->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
break;
3792 switch( aElem.
Style )
3795 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3796 case ASCH_PORT_STYLE::LEFT:
3797 case ASCH_PORT_STYLE::RIGHT:
3798 case ASCH_PORT_STYLE::LEFT_RIGHT:
3799 if( ( startIsWireTerminal || startIsBusTerminal ) )
3806 case ASCH_PORT_STYLE::NONE_VERTICAL:
3807 case ASCH_PORT_STYLE::TOP:
3808 case ASCH_PORT_STYLE::BOTTOM:
3809 case ASCH_PORT_STYLE::TOP_BOTTOM:
3810 if( ( startIsWireTerminal || startIsBusTerminal ) )
3822 label->
GetFields()[0].SetVisible(
false );
3829 if( ( startIsWireTerminal && endIsWireTerminal ) )
3837 else if( startIsBusTerminal && endIsBusTerminal )
3860 screen->
Append( noConnect );
3888 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3891 SCH_LAYER_ID::LAYER_BUS );
3908 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3911 SCH_LAYER_ID::LAYER_WIRE );
3931 screen->
Append( junction );
3943 && component->second.currentpartid != elem.
ownerpartid )
3947 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
3959 wxString msg = wxString::Format(
_(
"Embedded file %s not found in storage." ),
3965 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
3968 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
3969 wxZlibInputStream zlibInputStream( fileStream );
3970 wxFFileOutputStream outputStream( storagePath );
3971 outputStream.Write( zlibInputStream );
3972 outputStream.Close();
3976 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
3982 wxRemoveFile( storagePath );
3986 if( !wxFileExists( elem.
filename ) )
3996 wxString::Format(
_(
"Error reading image %s." ), elem.
filename ),
4005 const double scaleX =
4006 std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4007 const double scaleY =
4008 std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4011 bitmap->SetFlags(
IS_NEW );
4012 screen->
Append( bitmap.release() );
4018 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4025 bool isPortrait =
m_altiumSheet->sheetOrientation == ASCH_SHEET_WORKSPACEORIENTATION::PORTRAIT;
4038 case ASCH_SHEET_SIZE::A4: pageInfo.
SetType(
"A4", isPortrait );
break;
4039 case ASCH_SHEET_SIZE::A3: pageInfo.
SetType(
"A3", isPortrait );
break;
4040 case ASCH_SHEET_SIZE::A2: pageInfo.
SetType(
"A2", isPortrait );
break;
4041 case ASCH_SHEET_SIZE::A1: pageInfo.
SetType(
"A1", isPortrait );
break;
4042 case ASCH_SHEET_SIZE::A0: pageInfo.
SetType(
"A0", isPortrait );
break;
4043 case ASCH_SHEET_SIZE::A: pageInfo.
SetType(
"A", isPortrait );
break;
4044 case ASCH_SHEET_SIZE::B: pageInfo.
SetType(
"B", isPortrait );
break;
4045 case ASCH_SHEET_SIZE::C: pageInfo.
SetType(
"C", isPortrait );
break;
4046 case ASCH_SHEET_SIZE::D: pageInfo.
SetType(
"D", isPortrait );
break;
4047 case ASCH_SHEET_SIZE::E: pageInfo.
SetType(
"E", isPortrait );
break;
4048 case ASCH_SHEET_SIZE::LETTER: pageInfo.
SetType(
"USLetter", isPortrait );
break;
4049 case ASCH_SHEET_SIZE::LEGAL: pageInfo.
SetType(
"USLegal", isPortrait );
break;
4050 case ASCH_SHEET_SIZE::TABLOID: pageInfo.
SetType(
"A3", isPortrait );
break;
4051 case ASCH_SHEET_SIZE::ORCAD_A: pageInfo.
SetType(
"A", isPortrait );
break;
4052 case ASCH_SHEET_SIZE::ORCAD_B: pageInfo.
SetType(
"B", isPortrait );
break;
4053 case ASCH_SHEET_SIZE::ORCAD_C: pageInfo.
SetType(
"C", isPortrait );
break;
4054 case ASCH_SHEET_SIZE::ORCAD_D: pageInfo.
SetType(
"D", isPortrait );
break;
4055 case ASCH_SHEET_SIZE::ORCAD_E: pageInfo.
SetType(
"E", isPortrait );
break;
4073 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4096 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4122 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4136 bool emptyRef = elem.
text.IsEmpty();
4141 bool visible = !emptyRef;
4153 std::vector<LIB_SYMBOL*>& aSymbol,
4154 std::vector<int>& aFontSizes )
4161 bool emptyRef = elem.
text.IsEmpty();
4162 SCH_FIELD& refField = symbol->GetReferenceField();
4165 refField.
SetText( wxT(
"X" ) );
4171 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4173 int size = aFontSizes[elem.
fontId - 1];
4190 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4193 screen->
Append( busWireEntry );
4202 static const std::map<wxString, wxString> variableMap = {
4203 {
"COMMENT",
"VALUE" },
4204 {
"VALUE",
"ALTIUM_VALUE" },
4210 if( elem.
text ==
"*" )
4213 wxString paramName = elem.
name.Upper();
4215 if( paramName ==
"SHEETNUMBER" )
4219 else if( paramName ==
"TITLE" )
4223 else if( paramName ==
"REVISION" )
4227 else if( paramName ==
"DATE" )
4231 else if( paramName ==
"COMPANYNAME" )
4252 wxString upperName = elem.
name.Upper();
4254 if( upperName ==
"COMMENT" )
4261 wxString fieldName = elem.
name.Upper();
4263 if( fieldName.IsEmpty() )
4265 int disambiguate = 1;
4269 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4276 else if( fieldName ==
"VALUE" )
4278 fieldName =
"ALTIUM_VALUE";
4294 std::vector<LIB_SYMBOL*>& aSymbol,
4295 std::vector<int>& aFontSizes )
4316 std::map<wxString, wxString> variableMap = {
4317 {
"COMMENT",
"VALUE" },
4323 wxString upperName = elem.
name.Upper();
4325 if( upperName ==
"COMMENT" )
4327 field = &libSymbol->GetValueField();
4331 int fieldIdx = libSymbol->GetNextAvailableFieldId();
4332 wxString fieldNameStem = elem.
name;
4333 wxString fieldName = fieldNameStem;
4334 int disambiguate = 1;
4336 if( fieldName.IsEmpty() )
4338 fieldNameStem =
"ALTIUM_UNNAMED";
4339 fieldName =
"ALTIUM_UNNAMED_1";
4342 else if( upperName ==
"VALUE" )
4344 fieldNameStem =
"ALTIUM_VALUE";
4345 fieldName =
"ALTIUM_VALUE";
4349 while( libSymbol->FindField( fieldName ) )
4350 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4353 libSymbol->AddField( new_field );
4364 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4366 int size = aFontSizes[elem.
fontId - 1];
4380 const std::map<wxString, wxString>& aProperties )
4389 std::vector<LIB_SYMBOL*>& aSymbol )
4393 if( elem.
type != wxS(
"PCBLIB" ) )
4397 if( aSymbol.size() == 0 && !elem.
isCurrent )
4403 wxArrayString fpFilters;
4404 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4407 if( !aSymbol.empty() )
4413 symbol->SetFPFilters( fpFilters );
4414 SCH_FIELD& footprintField = symbol->GetFootprintField();
4425 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4431 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4435 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4436 implementationOwnerIt->second ),
4443 libSymbolIt->second->SetFPFilters( fpFilters );
4453 wxString>& aProperties )
4457 std::vector<LIB_SYMBOL*> symbols;
4475 symbols.push_back( symbol );
4484 std::map<wxString,LIB_SYMBOL*> ret;
4485 std::vector<int> fontSizes;
4486 struct SYMBOL_PIN_FRAC
4495 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4497 for(
auto& [
name, entry] : syms )
4500 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4502 if( entry.m_pinsFrac )
4504 auto parse_binary_pin_frac =
4505 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4507 std::map<wxString, wxString> result;
4513 SYMBOL_PIN_FRAC pinFrac;
4517 pinFrac.len_frac = binreader.
ReadInt32();
4518 pinFracs.insert( { pinFracData.first, pinFrac } );
4532 std::vector<LIB_SYMBOL*> symbols;
4541 std::map<wxString, wxString> properties = reader.
ReadProperties();
4545 if( record != ALTIUM_SCH_RECORD::COMPONENT )
4546 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4551 auto handleBinaryPinLambda =
4552 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4554 std::map<wxString, wxString> result;
4558 int32_t recordId = binreader.
ReadInt32();
4560 if( recordId !=
static_cast<int32_t
>( ALTIUM_SCH_RECORD::PIN ) )
4563 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4565 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4566 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4567 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4568 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4569 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4570 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4573 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4574 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4575 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4576 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4577 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4578 result[
"COLOR"] = wxString::Format(
"%d", binreader.
ReadInt32() );
4584 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4586 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4587 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4588 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4592 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4594 if( partSeqSplit.size() == 3 )
4596 result[
"PART"] = partSeqSplit[0];
4597 result[
"SEQ"] = partSeqSplit[2];
4605 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4607 if( properties.empty() )
4615 case ALTIUM_SCH_RECORD::PIN:
4622 case ALTIUM_SCH_RECORD::LABEL:
ParseLabel( properties, symbols, fontSizes );
break;
4624 case ALTIUM_SCH_RECORD::BEZIER:
ParseBezier( properties, symbols );
break;
4626 case ALTIUM_SCH_RECORD::POLYLINE:
ParsePolyline( properties, symbols );
break;
4628 case ALTIUM_SCH_RECORD::POLYGON:
ParsePolygon( properties, symbols );
break;
4630 case ALTIUM_SCH_RECORD::ELLIPSE:
ParseEllipse( properties, symbols );
break;
4632 case ALTIUM_SCH_RECORD::PIECHART:
ParsePieChart( properties, symbols );
break;
4634 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
ParseRoundRectangle( properties, symbols );
break;
4636 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
ParseEllipticalArc( properties, symbols );
break;
4638 case ALTIUM_SCH_RECORD::ARC:
ParseArc( properties, symbols );
break;
4640 case ALTIUM_SCH_RECORD::LINE:
ParseLine( properties, symbols );
break;
4642 case ALTIUM_SCH_RECORD::RECTANGLE:
ParseRectangle( properties, symbols );
break;
4644 case ALTIUM_SCH_RECORD::DESIGNATOR:
ParseLibDesignator( properties, symbols, fontSizes );
break;
4646 case ALTIUM_SCH_RECORD::PARAMETER:
ParseLibParameter( properties, symbols, fontSizes );
break;
4648 case ALTIUM_SCH_RECORD::TEXT_FRAME:
ParseTextFrame( properties, symbols, fontSizes );
break;
4651 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
break;
4653 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
ParseImplementation( properties, symbols );
break;
4655 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
break;
4657 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
break;
4658 case ALTIUM_SCH_RECORD::MAP_DEFINER:
break;
4661 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
break;
4664 case ALTIUM_SCH_RECORD::IMAGE:
break;
4667 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found "
4669 recordId, symbols[0]->
GetName() ),
4681 for(
size_t ii = 0; ii < symbols.size(); ii++ )
4689 if( valField.
GetText().IsEmpty() )
4692 if( symbols.size() == 1 )
4695 ret[wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 )] = symbol;
4705 wxFileName fn( aLibraryPath );
4707 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
4708 return fn.GetModificationTime().GetValue().GetValue();
4710 return wxDateTime( 0.0 ).GetValue().GetValue();
4715 const std::map<std::string, UTF8>* aProperties )
4728 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
4730 wxFileName fileName( aLibraryPath );
4735 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
4739 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
4741 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
4745 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom =
4746 std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
4748 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles =
4749 intCom->EnumDir( L
"SchLib" );
4751 for(
const auto& [schLibName, cfe] : schLibFiles )
4752 compoundFiles.push_back( intCom->DecodeIntLibStream( *cfe ) );
4755 std::map<wxString, LIB_SYMBOL*>& cacheMapRef =
m_libCache[aLibraryPath];
4757 for(
auto& altiumSchFilePtr : compoundFiles )
4759 std::map<wxString, LIB_SYMBOL*> parsed =
ParseLibFile( *altiumSchFilePtr );
4760 cacheMapRef.insert( parsed.begin(), parsed.end() );
4765 catch(
const CFB::CFBException& exception )
4769 catch(
const std::exception& exc )
4771 wxFAIL_MSG( wxString::Format( wxT(
"Unhandled exception in Altium schematic parsers: %s." ),
4779 std::vector<int>& aFontSizes )
4781 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
4783 if( file ==
nullptr )
4793 std::map<wxString, wxString> properties = reader.
ReadProperties();
4797 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
4798 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
4800 for(
auto& [key, value] : properties )
4802 wxString upperKey = key.Upper();
4805 if( upperKey.StartsWith(
"SIZE", &remaining ) )
4807 if( !remaining.empty() )
4809 int ind = wxAtoi( remaining );
4811 if(
static_cast<int>( aFontSizes.size() ) < ind )
4812 aFontSizes.resize( ind );
4816 aFontSizes[ind - 1] = scaled;
4825 const std::map<std::string, UTF8>* aProperties,
4826 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
4830 bool powerSymbolsOnly = ( aProperties &&
4832 != aProperties->end() );
4838 for(
auto& [libnameStr, libSymbol] : it->second )
4840 if( powerSymbolsOnly && !libSymbol->IsPower() )
4843 aInserter( libnameStr, libSymbol );
4850 const wxString& aLibraryPath,
4851 const std::map<std::string, UTF8>* aProperties )
4856 aSymbolNameList.Add( aStr );
4862 const wxString& aLibraryPath,
4863 const std::map<std::string, UTF8>* aProperties )
4868 aSymbolList.emplace_back( aSymbol );
4874 const wxString& aAliasName,
4875 const std::map<std::string, UTF8>* aProperties )
4883 auto it2 = it->second.find( aAliasName );
4885 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.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr const Vec GetCenter() const
constexpr bool Contains(const Vec &aPoint) const
void SetFlags(EDA_ITEM_FLAGS aMask)
void SetBezierC2(const VECTOR2I &aPt)
void SetCenter(const VECTOR2I &aCenter)
FILL_T GetFillMode() const
void SetLineStyle(const LINE_STYLE aStyle)
void SetFillColor(const COLOR4D &aColor)
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
COLOR4D GetFillColor() const
void SetEnd(const VECTOR2I &aEnd)
void SetBezierC1(const VECTOR2I &aPt)
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 SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
virtual void SetVisible(bool aVisible)
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
EE_TYPE Overlapping(const BOX2I &aRect) const
EE_TYPE OfType(KICAD_T aType) const
This class was created to handle importing ellipses from other file formats that support them nativel...
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)
VECTOR2I GetPosition() const override
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
void ParsePortHelper(const ASCH_PORT &aElem)
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,...
std::unordered_map< wxString, SEVERITY > m_errorMessages
void ParseImplementationList(int aIndex, const std::map< wxString, wxString > &aProperties)
std::vector< LIB_SYMBOL * > ParseLibComponent(const std::map< wxString, wxString > &aProperties)
void ParseSheet(const std::map< wxString, wxString > &aProperties)
void ParseParameter(const std::map< wxString, wxString > &aProperties)
bool ShouldPutItemOnSheet(int aOwnerindex)
void AddLibTextBox(const ASCH_TEXT_FRAME *aElem, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
bool CanReadSchematicFile(const wxString &aFileName) const override
Checks if this SCH_IO can read the specified schematic file.
void ParsePieChart(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::unique_ptr< std::map< std::string, UTF8 > > m_properties
void ParseEllipticalArc(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, HARNESS > m_altiumHarnesses
void ParseEllipse(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseWire(const std::map< wxString, wxString > &aProperties)
void ParseHarnessEntry(const std::map< wxString, wxString > &aProperties)
void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
void ParseImplementation(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseTemplate(int aIndex, const std::map< wxString, wxString > &aProperties)
void ParseAdditional(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void AddTextBox(const ASCH_TEXT_FRAME *aElem)
void ParsePowerPort(const std::map< wxString, wxString > &aProperties)
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
const ASCH_STORAGE_FILE * GetFileFromStorage(const wxString &aFilename) const
void ParseRectangle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void doEnumerateSymbolLib(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties, std::function< void(const wxString &, LIB_SYMBOL *)> aInserter)
std::vector< ASCH_STORAGE_FILE > m_altiumStorage
SCH_SHEET_PATH m_sheetPath
void ParseLabel(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
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, AUTOPLACE_ALGO aAlgo) 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 HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
bool IsWire() const
Return true if the line is a wire.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetLineColor(const COLOR4D &aColor)
void SetLineWidth(const int aSize)
VECTOR2I GetEndPoint() const
VECTOR2I GetStartPoint() const
SEG GetSeg() const
Get the geometric aspect of the wire as a SEG.
bool IsBus() const
Return true if the line is a bus.
virtual void SetStroke(const STROKE_PARAMS &aStroke) override
COLOR4D GetLineColor() const
Return #COLOR4D::UNSPECIFIED if a custom color hasn't been set for this line.
void SetEndPoint(const VECTOR2I &aPosition)
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
void UpdateSymbolLinks(REPORTER *aReporter=nullptr)
Initialize the LIB_SYMBOL reference for each SCH_SYMBOL found in the full schematic.
std::vector< SCH_SHEET_INSTANCE > m_sheetInstances
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
void AddBusAlias(std::shared_ptr< BUS_ALIAS > aAlias)
Add a bus alias definition (and transfers ownership of the pointer).
void SetPageSettings(const PAGE_INFO &aPageSettings)
EE_RTREE & Items()
Get the full RTree, usually for iterating.
const KIID & GetUuid() const
bool IsTerminalPoint(const VECTOR2I &aPosition, int aLayer) const
Test if aPosition is a connection point on aLayer.
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
void SetPosition(const VECTOR2I &aPos) override
void SetFilled(bool aFilled) override
void SetStroke(const STROKE_PARAMS &aStroke) override
void AddPoint(const VECTOR2I &aPosition)
STROKE_PARAMS GetStroke() const override
VECTOR2I GetPosition() const override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
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)
int GetNextFieldId() const
void SetPosition(const VECTOR2I &aPosition) override
void SetValueFieldText(const wxString &aValue)
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true, bool aCaseInsensitive=false)
Search for a SCH_FIELD with aFieldName.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) override
Populate a std::vector with SCH_FIELDs.
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
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
Simple container to manage line stroke parameters.
void SetLineStyle(LINE_STYLE aLineStyle)
void SetWidth(int aWidth)
void SetColor(const KIGFX::COLOR4D &aColor)
KIGFX::COLOR4D GetColor() const
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.
const TRANSFORM & GetTransform() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
virtual std::vector< SCH_PIN * > GetPins() const =0
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
@ FILLED_SHAPE
Fill with object color.
static const std::string KiCadSchematicFileExtension
static const std::string KiCadSymbolLibFileExtension
static const wxChar traceAltiumSch[]
Flag to enable Altium schematic debugging output.
#define THROW_IO_ERROR(msg)
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
bool fileStartsWithBinaryHeader(const wxString &aFilePath, const std::vector< uint8_t > &aHeader)
Check if a file starts with a defined binary header.
bool fileStartsWithPrefix(const wxString &aFilePath, const wxString &aPrefix, bool aIgnoreWhitespace)
Check if a file starts with a defined string.
const std::vector< uint8_t > COMPOUND_FILE_HEADER
const VECTOR2I & GetOtherEnd(const SEG &aSeg, const VECTOR2I &aPoint)
Get the end point of the segment that is not the given point.
bool signbit(T v)
Integral version of std::signbit that works all compilers.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
static COLOR4D GetColorFromInt(int color)
static void SetLibShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape, ALTIUM_SCH_RECORD aType, int aStrokeColor)
VECTOR2I HelperGeneratePowerPortGraphics(LIB_SYMBOL *aKsymbol, ASCH_POWER_PORT_STYLE aStyle, REPORTER *aReporter)
static void SetSchShapeLine(const ASCH_BORDER_INTERFACE &elem, SCH_SHAPE *shape)
static const VECTOR2I GetRelativePosition(const VECTOR2I &aPosition, const SCH_SYMBOL *aSymbol)
static void SetLibShapeLine(const ASCH_BORDER_INTERFACE &elem, SCH_SHAPE *shape, ALTIUM_SCH_RECORD aType)
static LINE_STYLE GetPlotDashType(const ASCH_POLYLINE_LINESTYLE linestyle)
static void SetSchShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape)
void SetTextPositioning(EDA_TEXT *text, ASCH_LABEL_JUSTIFICATION justification, ASCH_RECORD_ORIENTATION orientation)
Utility functions for working with shapes.
static std::vector< std::string > split(const std::string &aStr, const std::string &aDelim)
Split the input string into a vector of output strings.
LINE_STYLE
Dashed line types.
std::vector< VECTOR2I > points
std::vector< VECTOR2I > points
ASCH_LABEL_JUSTIFICATION justification
ASCH_RECORD_ORIENTATION orientation
ASCH_RECORD_ORIENTATION orientation
int m_primaryConnectionPosition
ASCH_SHEET_ENTRY_SIDE m_harnessConnectorSide
ASCH_SHEET_ENTRY_SIDE Side
ASCH_RECORD_ORIENTATION orientation
ASCH_LABEL_JUSTIFICATION justification
ASCH_POLYLINE_LINESTYLE LineStyle
ASCH_LABEL_JUSTIFICATION justification
ASCH_RECORD_ORIENTATION orientation
ASCH_RECORD_ORIENTATION orientation
ASCH_LABEL_JUSTIFICATION justification
ASCH_PIN_SYMBOL::PTYPE symbolOuterEdge
ASCH_PIN_ELECTRICAL electrical
ASCH_PIN_SYMBOL::PTYPE symbolInnerEdge
ASCH_RECORD_ORIENTATION orientation
std::vector< VECTOR2I > points
ASCH_POLYLINE_LINESTYLE LineStyle
std::vector< VECTOR2I > Points
ASCH_POWER_PORT_STYLE style
ASCH_RECORD_ORIENTATION orientation
ASCH_SHEET_ENTRY_SIDE side
ASCH_RECORD_ORIENTATION orientation
std::vector< VECTOR2I > points
wxString componentdescription
wxString sourcelibraryname
ASCH_TEXT_FRAME_ALIGNMENT Alignment
std::vector< VECTOR2I > points
constexpr int IUToMils(int iu) const
constexpr int MilsToIU(int mils) const
ASCH_SHEET_ENTRY_SIDE m_harnessConnectorSide
std::vector< HARNESS_PORT > m_ports
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".
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.