57#include <compoundfilereader.h>
66#include <wx/mstream.h>
67#include <wx/zstream.h>
68#include <wx/wfstream.h>
69#include <magic_enum.hpp>
83#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
84 0.94901960784313721, \
85 0.98431372549019602, 1.0 )
87#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
88 0.61960784313725492, \
89 0.78823529411764703, 1.0 )
102 int green = (
color & 0x00FF00 ) >> 8;
103 int blue = (
color & 0xFF0000 ) >> 16;
175 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
212 else if( elem.
AreaColor == aStrokeColor )
218 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
263 for(
auto& [
name, symbol] : lib )
315 std::vector<SCH_PIN*> pins = aSymbol->
GetPins();
317 bool names_visible =
false;
318 bool numbers_visible =
false;
322 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
323 names_visible =
true;
325 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
326 numbers_visible =
true;
337 if( !numbers_visible )
386 std::map<wxString, SCH_SHEET*> sheets;
387 wxFileName
project( aProperties->at(
"project_file" ) );
389 for(
auto& [ key, filestring] : *aProperties )
391 if( !key.starts_with(
"sch" ) )
397 wxFileName fn( filestring );
398 wxFileName kicad_fn( fn );
399 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
401 sheet->SetScreen( screen );
405 sheet->SetFileName( fn.GetFullPath() );
408 wxCHECK2( sheet && screen,
continue );
410 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
420 wxCHECK2( currentScreen,
continue );
424 currentScreen->
Append( sheetPtr );
425 sheets[fn.GetFullPath()] = sheetPtr;
439 for(
auto& [ filestring, sheet ] : sheets )
451 const std::map<std::string, UTF8>* aProperties )
453 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
455 wxFileName fileName( aFileName );
463 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
467 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
495 wxCHECK( rootScreen,
nullptr );
506 wxCHECK_MSG( libTable,
nullptr,
"Could not load symbol lib table." );
508 if( aFileName.empty() )
528 int minWireWidth = std::numeric_limits<int>::max();
529 int minBusWidth = std::numeric_limits<int>::max();
533 std::vector<SCH_MARKER*> markers;
540 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
543 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
549 if( minWireWidth < std::numeric_limits<int>::max() )
550 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
552 if( minBusWidth < std::numeric_limits<int>::max() )
553 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
576 std::vector<SCH_LINE*> busLines;
577 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
585 busLines.push_back( line );
587 busLineMap[ line->
GetEndPoint() ].push_back( line );
594 auto it = busLineMap.find( aStart );
596 if( it == busLineMap.end() )
602 if( aVisited.count( line ) )
605 aVisited.insert( line );
626 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>( screen );
627 alias->SetName( harness.m_name );
630 alias->Members().push_back( port.
m_name );
635 BOX2I box( harness.m_location, harness.m_size );
670 busLine =
new SCH_LINE( pos, SCH_LAYER_ID::LAYER_BUS );
673 screen->
Append( busLine );
677 busLine =
new SCH_LINE( pos, SCH_LAYER_ID::LAYER_BUS );
680 screen->
Append( busLine );
690 std::set<SCH_LINE*> visited;
691 SCH_LABEL* label = walkBusLine( pos, visited );
698 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
699 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
716 bool isVertical =
true;
718 if( harness.m_ports.size() > 1 )
720 VECTOR2I first = harness.m_ports.front().m_location;
721 VECTOR2I last = harness.m_ports.back().m_location;
723 if( first.
y == last.
y )
729 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
730 VECTOR2I top = harness.m_ports.front().m_entryLocation;
759 line =
new SCH_LINE( last_pt, SCH_LAYER_ID::LAYER_BUS );
772 line =
new SCH_LINE( last_pt, SCH_LAYER_ID::LAYER_BUS );
781 line =
new SCH_LINE( last_pt, SCH_LAYER_ID::LAYER_BUS );
795 wxFileName parentFileName( aFileName );
802 wxFileName relative = parentFileName;
823 catch(
const CFB::CFBException& exception )
827 catch(
const std::exception& exc )
829 wxLogTrace(
traceAltiumSch, wxS(
"Unhandled exception in Altium schematic parser: %s." ),
840 wxCHECK( currentScreen, );
848 wxCHECK2( sheet,
continue );
852 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
854 if( !loadAltiumFileName.IsFileReadable() )
858 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
859 wxDIR_FILES | wxDIR_HIDDEN );
861 for(
const wxString& candidate : files )
863 wxFileName candidateFname( candidate );
865 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false ) )
867 loadAltiumFileName = candidateFname;
873 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
875 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
876 "this is probably an Altium signal harness "
877 "that got converted to a sheet." ),
879 SEVERITY::RPT_SEVERITY_INFO );
896 if( sheet->
GetName().Trim().empty() )
897 sheet->
SetName( loadAltiumFileName.GetName() );
899 wxCHECK2( screen,
continue );
906 wxFileName projectFileName = loadAltiumFileName;
909 sheet->
SetFileName( projectFileName.GetFullName() );
910 screen->
SetFileName( projectFileName.GetFullPath() );
920 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
922 if( file ==
nullptr )
927 std::map<wxString, wxString> properties = reader.
ReadProperties();
934 for(
int i = 0; i < weight; i++ )
944 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
953 wxString streamName = wxS(
"Additional" );
955 const CFB::COMPOUND_FILE_ENTRY* file =
956 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
958 if( file ==
nullptr )
969 std::map<wxString, wxString> properties = reader.
ReadProperties();
974 if( record != ALTIUM_SCH_RECORD::HEADER )
980 std::map<wxString, wxString> properties = reader.
ReadProperties();
1004 wxString streamName = wxS(
"FileHeader" );
1006 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1008 if( file ==
nullptr )
1019 std::map<wxString, wxString> properties = reader.
ReadProperties();
1023 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1036 std::map<wxString, wxString> properties = reader.
ReadProperties();
1048 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1058 symbol.second->SetLibSymbol( libSymbolIt->second );
1095 while( storageReader.
CanRead() )
1097 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1100 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1114 std::map<wxString, wxString> properties = reader.
ReadProperties();
1118 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1133 std::map<wxString, wxString> properties = reader.
ReadProperties();
1136 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1142 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1155 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1165 symbol.second->SetLibSymbol( libSymbolIt->second );
1205 const wxString& aSectionName )
1215 case ALTIUM_SCH_RECORD::HEADER:
1218 case ALTIUM_SCH_RECORD::COMPONENT:
1222 case ALTIUM_SCH_RECORD::PIN:
1226 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
1230 case ALTIUM_SCH_RECORD::LABEL:
1234 case ALTIUM_SCH_RECORD::BEZIER:
1238 case ALTIUM_SCH_RECORD::POLYLINE:
1242 case ALTIUM_SCH_RECORD::POLYGON:
1246 case ALTIUM_SCH_RECORD::ELLIPSE:
1250 case ALTIUM_SCH_RECORD::PIECHART:
1254 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
1258 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
1259 case ALTIUM_SCH_RECORD::ARC:
1263 case ALTIUM_SCH_RECORD::LINE:
1267 case ALTIUM_SCH_RECORD::RECTANGLE:
1271 case ALTIUM_SCH_RECORD::SHEET_SYMBOL:
1275 case ALTIUM_SCH_RECORD::SHEET_ENTRY:
1279 case ALTIUM_SCH_RECORD::POWER_PORT:
1283 case ALTIUM_SCH_RECORD::PORT:
1289 case ALTIUM_SCH_RECORD::NO_ERC:
1293 case ALTIUM_SCH_RECORD::NET_LABEL:
1297 case ALTIUM_SCH_RECORD::BUS:
1301 case ALTIUM_SCH_RECORD::WIRE:
1305 case ALTIUM_SCH_RECORD::TEXT_FRAME:
1309 case ALTIUM_SCH_RECORD::JUNCTION:
1313 case ALTIUM_SCH_RECORD::IMAGE:
1317 case ALTIUM_SCH_RECORD::SHEET:
1321 case ALTIUM_SCH_RECORD::SHEET_NAME:
1325 case ALTIUM_SCH_RECORD::FILE_NAME:
1329 case ALTIUM_SCH_RECORD::DESIGNATOR:
1333 case ALTIUM_SCH_RECORD::BUS_ENTRY:
1337 case ALTIUM_SCH_RECORD::TEMPLATE:
1341 case ALTIUM_SCH_RECORD::PARAMETER:
1345 case ALTIUM_SCH_RECORD::PARAMETER_SET:
1349 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
1353 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
1357 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
1360 case ALTIUM_SCH_RECORD::MAP_DEFINER:
1363 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
1366 case ALTIUM_SCH_RECORD::NOTE:
1370 case ALTIUM_SCH_RECORD::COMPILE_MASK:
1374 case ALTIUM_SCH_RECORD::HYPERLINK:
1379 case ALTIUM_SCH_RECORD::HARNESS_CONNECTOR:
1383 case ALTIUM_SCH_RECORD::HARNESS_ENTRY:
1387 case ALTIUM_SCH_RECORD::HARNESS_TYPE:
1391 case ALTIUM_SCH_RECORD::SIGNAL_HARNESS:
1395 case ALTIUM_SCH_RECORD::BLANKET:
1401 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1432 if( file.filename.IsSameAs( aFilename ) )
1435 if( file.filename.EndsWith( aFilename ) )
1436 nonExactMatch = &file;
1439 return nonExactMatch;
1446 wxCHECK( currentSheet, );
1448 wxString sheetName = currentSheet->
GetName();
1450 if( sheetName.IsEmpty() )
1451 sheetName = wxT(
"root" );
1459 m_errorMessages.emplace( wxString::Format(
_(
"Symbol \"%s\" in sheet \"%s\" at index %d "
1460 "replaced with symbol \"%s\"." ),
1472 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1497 field.SetVisible(
false );
1522 screen->
Append( symbol );
1531 wxCHECK( currentSheet, );
1533 wxString sheetName = currentSheet->
GetName();
1535 if( sheetName.IsEmpty() )
1536 sheetName = wxT(
"root" );
1541 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1543 if( baseName.IsEmpty() )
1544 baseName = wxS(
"Template" );
1552 std::vector<LIB_SYMBOL*>& aSymbol )
1567 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1576 schSymbol =
m_symbols.at( libSymbolIt->first );
1577 symbol = libSymbolIt->second;
1596 pin->SetVisible(
false );
1599 pin->SetNumberTextSize( 0 );
1602 pin->SetNameTextSize( 0 );
1608 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
1609 pin->SetOrientation( PIN_ORIENTATION::PIN_LEFT );
1613 case ASCH_RECORD_ORIENTATION::UPWARDS:
1614 pin->SetOrientation( PIN_ORIENTATION::PIN_DOWN );
1618 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
1619 pin->SetOrientation( PIN_ORIENTATION::PIN_RIGHT );
1623 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
1624 pin->SetOrientation( PIN_ORIENTATION::PIN_UP );
1638 pin->SetPosition( pinLocation );
1642 case ASCH_PIN_ELECTRICAL::INPUT:
1643 pin->SetType( ELECTRICAL_PINTYPE::PT_INPUT );
1646 case ASCH_PIN_ELECTRICAL::BIDI:
1647 pin->SetType( ELECTRICAL_PINTYPE::PT_BIDI );
1650 case ASCH_PIN_ELECTRICAL::OUTPUT:
1651 pin->SetType( ELECTRICAL_PINTYPE::PT_OUTPUT );
1654 case ASCH_PIN_ELECTRICAL::OPEN_COLLECTOR:
1655 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENCOLLECTOR );
1658 case ASCH_PIN_ELECTRICAL::PASSIVE:
1659 pin->SetType( ELECTRICAL_PINTYPE::PT_PASSIVE );
1662 case ASCH_PIN_ELECTRICAL::TRISTATE:
1663 pin->SetType( ELECTRICAL_PINTYPE::PT_TRISTATE );
1666 case ASCH_PIN_ELECTRICAL::OPEN_EMITTER:
1667 pin->SetType( ELECTRICAL_PINTYPE::PT_OPENEMITTER );
1670 case ASCH_PIN_ELECTRICAL::POWER:
1671 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
1674 case ASCH_PIN_ELECTRICAL::UNKNOWN:
1676 pin->SetType( ELECTRICAL_PINTYPE::PT_UNSPECIFIED );
1692 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED_CLOCK );
1696 pin->SetShape( GRAPHIC_PINSHAPE::INVERTED );
1705 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK_LOW );
1709 pin->SetShape( GRAPHIC_PINSHAPE::INPUT_LOW );
1715 pin->SetShape( GRAPHIC_PINSHAPE::OUTPUT_LOW );
1722 pin->SetShape( GRAPHIC_PINSHAPE::CLOCK );
1726 pin->SetShape( GRAPHIC_PINSHAPE::LINE );
1736 int vjustify, hjustify;
1739 switch( justification )
1762 switch( justification )
1785 switch( orientation )
1808 text->SetTextAngle( angle );
1827 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
1833 static const std::map<wxString, wxString> variableMap = {
1834 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
1835 {
"SHEETNUMBER",
"#" },
1836 {
"SHEETTOTAL",
"##" },
1837 {
"TITLE",
"TITLE" },
1838 {
"REVISION",
"REVISION" },
1839 {
"DATE",
"ISSUE_DATE" },
1840 {
"CURRENTDATE",
"CURRENT_DATE" },
1841 {
"COMPANYNAME",
"COMPANY" },
1842 {
"DOCUMENTNAME",
"FILENAME" },
1843 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
1844 {
"PROJECTNAME",
"PROJECTNAME" },
1852 size_t fontId =
static_cast<int>( elem.
fontId );
1869 screen->
Append( textItem );
1889 symbol = libSymbolIt->second;
1890 schsym =
m_symbols.at( libSymbolIt->first );
1905 size_t fontId = elem.
fontId;
1916 else if( fontId > 0 && fontId <= aFontSizes.size() )
1918 int size = aFontSizes[fontId - 1];
1926 std::vector<LIB_SYMBOL*>& aSymbol,
1927 std::vector<int>& aFontSizes )
1954 textBox->
SetStart( sheetTopRight );
1955 textBox->
SetEnd( sheetBottomLeft );
1962 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
1974 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
1977 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
1980 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
1985 size_t fontId =
static_cast<int>( aElem->
FontID );
2003 screen->
Append( textBox );
2008 std::vector<int>& aFontSizes )
2027 symbol = libSymbolIt->second;
2028 schsym =
m_symbols.at( libSymbolIt->first );
2053 textBox->
SetFillMode( FILL_T::FILLED_WITH_COLOR );
2065 case ASCH_TEXT_FRAME_ALIGNMENT::LEFT:
2068 case ASCH_TEXT_FRAME_ALIGNMENT::CENTER:
2071 case ASCH_TEXT_FRAME_ALIGNMENT::RIGHT:
2076 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2078 int size = aFontSizes[aElem->
FontID - 1];
2085 std::vector<LIB_SYMBOL*>& aSymbol )
2089 if( elem.
points.size() < 2 )
2091 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2092 static_cast<int>( elem.
points.size() ) ),
2100 wxCHECK( currentScreen, );
2102 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2104 if( i + 2 == elem.
points.size() )
2108 SCH_LAYER_ID::LAYER_NOTES );
2115 currentScreen->
Append( line );
2120 std::vector<VECTOR2I> bezierPoints;
2121 std::vector<VECTOR2I> polyPoints;
2123 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2124 bezierPoints.push_back( elem.
points.at( j ) );
2127 converter.
GetPoly( polyPoints );
2129 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2132 SCH_LAYER_ID::LAYER_NOTES );
2138 currentScreen->
Append( line );
2156 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2162 symbol = libSymbolIt->second;
2163 schsym =
m_symbols.at( libSymbolIt->first );
2169 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2171 if( i + 2 == elem.
points.size() )
2179 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2191 else if( i + 3 == elem.
points.size() )
2202 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2222 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2231 case 0: bezier->
SetStart( pos );
break;
2234 case 3: bezier->
SetEnd( pos );
break;
2248 std::vector<LIB_SYMBOL*>& aSymbol )
2252 if( elem.
Points.size() < 2 )
2260 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2288 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2294 symbol = libSymbolIt->second;
2295 schsym =
m_symbols.at( libSymbolIt->first );
2324 std::vector<LIB_SYMBOL*>& aSymbol )
2358 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2364 symbol = libSymbolIt->second;
2365 schsym =
m_symbols.at( libSymbolIt->first );
2406 std::vector<LIB_SYMBOL*>& aSymbol )
2439 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
2445 symbol = libSymbolIt->second;
2446 schsym =
m_symbols.at( libSymbolIt->first );
2464 int radius = std::min( width / 2, height / 2 );
2500 std::vector<LIB_SYMBOL*>& aSymbol )
2516 wxCHECK( currentScreen, );
2541 currentScreen->
Append( arc );
2562 symbol = libSymbolIt->second;
2563 schsym =
m_symbols.at( libSymbolIt->first );
2606 std::vector<LIB_SYMBOL*>& aSymbol )
2620 wxCHECK( currentScreen, );
2626 std::vector<BEZIER<int>> beziers;
2633 schbezier->
SetStart( bezier.Start );
2636 schbezier->
SetEnd( bezier.End );
2640 currentScreen->
Append( schbezier );
2656 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
2662 symbol = libSymbolIt->second;
2663 schsym =
m_symbols.at( libSymbolIt->first );
2673 std::vector<BEZIER<int>> beziers;
2693 schbezier->
SetStart( bezier.Start );
2696 schbezier->
SetEnd( bezier.End );
2699 SetLibShapeLine( elem, schbezier, ALTIUM_SCH_RECORD::ELLIPTICAL_ARC );
2707 std::vector<LIB_SYMBOL*>& aSymbol )
2755 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
2761 symbol = libSymbolIt->second;
2762 schsym =
m_symbols.at( libSymbolIt->first );
2792 std::vector<LIB_SYMBOL*>& aSymbol )
2812 FILL_T fillMode = elem.
IsSolid ? FILL_T::FILLED_WITH_COLOR : FILL_T::NO_FILL;
2817 std::vector<BEZIER<int>> beziers;
2818 std::vector<VECTOR2I> polyPoints;
2825 schbezier->
SetStart( bezier.Start );
2828 schbezier->
SetEnd( bezier.End );
2834 screen->
Append( schbezier );
2836 polyPoints.push_back( bezier.Start );
2839 if( fillMode != FILL_T::NO_FILL )
2846 for(
const VECTOR2I& point : polyPoints )
2849 schpoly->
AddPoint( polyPoints[0] );
2851 screen->
Append( schpoly );
2872 symbol = libSymbolIt->second;
2873 schsym =
m_symbols.at( libSymbolIt->first );
2879 std::vector<BEZIER<int>> beziers;
2880 std::vector<VECTOR2I> polyPoints;
2892 libbezier->
SetStart( bezier.Start );
2895 libbezier->
SetEnd( bezier.End );
2909 polyPoints.push_back( libbezier->
GetStart() );
2920 for(
const VECTOR2I& point : polyPoints )
2923 libline->
AddPoint( polyPoints[0] );
2933 std::vector<LIB_SYMBOL*>& aSymbol )
2951 circle->SetFillMode( FILL_T::FILLED_WITH_COLOR );
2953 circle->SetFilled(
false );
2975 symbol = libSymbolIt->second;
2976 schsym =
m_symbols.at( libSymbolIt->first );
2998 std::vector<LIB_SYMBOL*>& aSymbol )
3034 symbol = libSymbolIt->second;
3035 schsym =
m_symbols.at( libSymbolIt->first );
3072 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3085 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3092 wxString>& aProperties )
3101 HARNESS& harness = it->second;
3112 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3115 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3118 case ASCH_SHEET_ENTRY_SIDE::TOP:
3121 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3129 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3143 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3149 HARNESS& harness = harnessIt->second;
3162 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3165 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3169 case ASCH_SHEET_ENTRY_SIDE::TOP:
3172 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3186 harness.
m_ports.emplace_back( port );
3198 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3204 HARNESS& harness = harnessIt->second;
3210 std::vector<LIB_SYMBOL*>& aSymbol )
3225 rect->
SetEnd( sheetBottomLeft );
3245 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3251 symbol = libSymbolIt->second;
3252 schsym =
m_symbols.at( libSymbolIt->first );
3266 rect->
SetEnd( sheetBottomLeft );
3294 wxCHECK( currentScreen, );
3295 currentScreen->
Append( sheet );
3304 wxCHECK( rootScreen, );
3312 m_sheets.insert( { aIndex, sheet } );
3330 sheetIt->second->AddPin( sheetPin );
3333 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3337 VECTOR2I pos = sheetIt->second->GetPosition();
3338 VECTOR2I size = sheetIt->second->GetSize();
3343 case ASCH_SHEET_ENTRY_SIDE::LEFT:
3346 sheetPin->
SetSide( SHEET_SIDE::LEFT );
3349 case ASCH_SHEET_ENTRY_SIDE::RIGHT:
3352 sheetPin->
SetSide( SHEET_SIDE::RIGHT );
3355 case ASCH_SHEET_ENTRY_SIDE::TOP:
3358 sheetPin->
SetSide( SHEET_SIDE::TOP );
3361 case ASCH_SHEET_ENTRY_SIDE::BOTTOM:
3364 sheetPin->
SetSide( SHEET_SIDE::BOTTOM );
3371 case ASCH_PORT_IOTYPE::UNSPECIFIED:
3372 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
3375 case ASCH_PORT_IOTYPE::OUTPUT:
3376 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
3379 case ASCH_PORT_IOTYPE::INPUT:
3380 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
3383 case ASCH_PORT_IOTYPE::BIDI:
3384 sheetPin->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
3575 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
3600 wxString symName( elem.
text );
3601 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
3603 if( !styleName.empty() )
3604 symName <<
'_' << styleName;
3613 libSymbol = powerSymbolIt->second;
3624 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
3634 pin->SetPosition( { 0, 0 } );
3635 pin->SetLength( 0 );
3636 pin->SetType( ELECTRICAL_PINTYPE::PT_POWER_IN );
3637 pin->SetVisible(
false );
3665 case ASCH_RECORD_ORIENTATION::RIGHTWARDS:
3671 case ASCH_RECORD_ORIENTATION::UPWARDS:
3677 case ASCH_RECORD_ORIENTATION::LEFTWARDS:
3683 case ASCH_RECORD_ORIENTATION::DOWNWARDS:
3694 screen->
Append( symbol );
3722 switch( aElem.
Style )
3725 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3726 case ASCH_PORT_STYLE::LEFT:
3727 case ASCH_PORT_STYLE::RIGHT:
3728 case ASCH_PORT_STYLE::LEFT_RIGHT:
3732 case ASCH_PORT_STYLE::NONE_VERTICAL:
3733 case ASCH_PORT_STYLE::TOP:
3734 case ASCH_PORT_STYLE::BOTTOM:
3735 case ASCH_PORT_STYLE::TOP_BOTTOM:
3752 bool connectionFound = startIsWireTerminal
3753 || startIsBusTerminal
3754 || endIsWireTerminal
3755 || endIsBusTerminal;
3757 if( !connectionFound )
3761 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
3764 BOX2I bbox( harness.m_location, harness.m_size );
3769 startIsBusTerminal =
true;
3770 connectionFound =
true;
3776 endIsBusTerminal =
true;
3777 connectionFound =
true;
3782 if( !connectionFound )
3790 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
3808 case ASCH_PORT_IOTYPE::UNSPECIFIED: label->
SetShape( LABEL_FLAG_SHAPE::L_UNSPECIFIED );
break;
3809 case ASCH_PORT_IOTYPE::OUTPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_OUTPUT );
break;
3810 case ASCH_PORT_IOTYPE::INPUT: label->
SetShape( LABEL_FLAG_SHAPE::L_INPUT );
break;
3811 case ASCH_PORT_IOTYPE::BIDI: label->
SetShape( LABEL_FLAG_SHAPE::L_BIDI );
break;
3814 switch( aElem.
Style )
3817 case ASCH_PORT_STYLE::NONE_HORIZONTAL:
3818 case ASCH_PORT_STYLE::LEFT:
3819 case ASCH_PORT_STYLE::RIGHT:
3820 case ASCH_PORT_STYLE::LEFT_RIGHT:
3821 if( ( startIsWireTerminal || startIsBusTerminal ) )
3828 case ASCH_PORT_STYLE::NONE_VERTICAL:
3829 case ASCH_PORT_STYLE::TOP:
3830 case ASCH_PORT_STYLE::BOTTOM:
3831 case ASCH_PORT_STYLE::TOP_BOTTOM:
3832 if( ( startIsWireTerminal || startIsBusTerminal ) )
3846 if( ( startIsWireTerminal && endIsWireTerminal ) )
3854 else if( startIsBusTerminal && endIsBusTerminal )
3877 screen->
Append( noConnect );
3905 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3924 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
3946 screen->
Append( junction );
3958 && component->second.currentpartid != elem.
ownerpartid )
3962 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
3974 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file %s not found in storage." ),
3980 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
3983 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
3984 wxZlibInputStream zlibInputStream( fileStream );
3985 wxFFileOutputStream outputStream( storagePath );
3986 outputStream.Write( zlibInputStream );
3987 outputStream.Close();
3991 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
3997 wxRemoveFile( storagePath );
4001 if( !wxFileExists( elem.
filename ) )
4019 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4020 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4023 bitmap->SetFlags(
IS_NEW );
4024 screen->
Append( bitmap.release() );
4030 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4037 bool isPortrait =
m_altiumSheet->sheetOrientation == ASCH_SHEET_WORKSPACEORIENTATION::PORTRAIT;
4050 case ASCH_SHEET_SIZE::A4: pageInfo.
SetType(
"A4", isPortrait );
break;
4051 case ASCH_SHEET_SIZE::A3: pageInfo.
SetType(
"A3", isPortrait );
break;
4052 case ASCH_SHEET_SIZE::A2: pageInfo.
SetType(
"A2", isPortrait );
break;
4053 case ASCH_SHEET_SIZE::A1: pageInfo.
SetType(
"A1", isPortrait );
break;
4054 case ASCH_SHEET_SIZE::A0: pageInfo.
SetType(
"A0", isPortrait );
break;
4055 case ASCH_SHEET_SIZE::A: pageInfo.
SetType(
"A", isPortrait );
break;
4056 case ASCH_SHEET_SIZE::B: pageInfo.
SetType(
"B", isPortrait );
break;
4057 case ASCH_SHEET_SIZE::C: pageInfo.
SetType(
"C", isPortrait );
break;
4058 case ASCH_SHEET_SIZE::D: pageInfo.
SetType(
"D", isPortrait );
break;
4059 case ASCH_SHEET_SIZE::E: pageInfo.
SetType(
"E", isPortrait );
break;
4060 case ASCH_SHEET_SIZE::LETTER: pageInfo.
SetType(
"USLetter", isPortrait );
break;
4061 case ASCH_SHEET_SIZE::LEGAL: pageInfo.
SetType(
"USLegal", isPortrait );
break;
4062 case ASCH_SHEET_SIZE::TABLOID: pageInfo.
SetType(
"A3", isPortrait );
break;
4063 case ASCH_SHEET_SIZE::ORCAD_A: pageInfo.
SetType(
"A", isPortrait );
break;
4064 case ASCH_SHEET_SIZE::ORCAD_B: pageInfo.
SetType(
"B", isPortrait );
break;
4065 case ASCH_SHEET_SIZE::ORCAD_C: pageInfo.
SetType(
"C", isPortrait );
break;
4066 case ASCH_SHEET_SIZE::ORCAD_D: pageInfo.
SetType(
"D", isPortrait );
break;
4067 case ASCH_SHEET_SIZE::ORCAD_E: pageInfo.
SetType(
"E", isPortrait );
break;
4082 wxCHECK( currentScreen, );
4088 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4094 wxString sheetName = elem.
text;
4095 std::set<wxString> sheetNames;
4100 sheetNames.insert( sheet->
GetName() );
4103 for(
int ii = 1; ; ++ii )
4105 if( sheetNames.find( sheetName ) == sheetNames.end() )
4108 sheetName = elem.
text + wxString::Format( wxT(
"_%d" ), ii );
4111 SCH_FIELD* sheetNameField = sheetIt->second->GetField( FIELD_T::SHEET_NAME );
4114 sheetNameField->
SetText( sheetName );
4128 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4134 SCH_FIELD* filenameField = sheetIt->second->GetField( FIELD_T::SHEET_FILENAME );
4154 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4168 bool emptyRef = elem.
text.IsEmpty();
4173 bool visible = !emptyRef;
4185 std::vector<LIB_SYMBOL*>& aSymbol,
4186 std::vector<int>& aFontSizes )
4193 bool emptyRef = elem.
text.IsEmpty();
4194 SCH_FIELD& refField = symbol->GetReferenceField();
4197 refField.
SetText( wxT(
"X" ) );
4203 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4205 int size = aFontSizes[elem.
fontId - 1];
4222 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4225 screen->
Append( busWireEntry );
4234 static const std::map<wxString, wxString> variableMap = {
4235 {
"COMMENT",
"VALUE" },
4236 {
"VALUE",
"ALTIUM_VALUE" },
4242 if( elem.
text ==
"*" )
4245 wxString paramName = elem.
name.Upper();
4247 if( paramName ==
"SHEETNUMBER" )
4251 else if( paramName ==
"TITLE" )
4255 else if( paramName ==
"REVISION" )
4259 else if( paramName ==
"DATE" )
4263 else if( paramName ==
"COMPANYNAME" )
4284 wxString upperName = elem.
name.Upper();
4286 if( upperName ==
"COMMENT" )
4288 field = symbol->
GetField( FIELD_T::VALUE );
4292 wxString fieldName = elem.
name.Upper();
4294 if( fieldName.IsEmpty() )
4296 int disambiguate = 1;
4300 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4302 if( !symbol->
GetField( fieldName ) )
4306 else if( fieldName ==
"VALUE" )
4308 fieldName =
"ALTIUM_VALUE";
4325 std::vector<LIB_SYMBOL*>& aSymbol,
4326 std::vector<int>& aFontSizes )
4347 std::map<wxString, wxString> variableMap = {
4348 {
"COMMENT",
"VALUE" },
4354 wxString upperName = elem.
name.Upper();
4356 if( upperName ==
"COMMENT" )
4358 field = &libSymbol->GetValueField();
4362 wxString fieldNameStem = elem.
name;
4363 wxString fieldName = fieldNameStem;
4364 int disambiguate = 1;
4366 if( fieldName.IsEmpty() )
4368 fieldNameStem =
"ALTIUM_UNNAMED";
4369 fieldName =
"ALTIUM_UNNAMED_1";
4372 else if( upperName ==
"VALUE" )
4374 fieldNameStem =
"ALTIUM_VALUE";
4375 fieldName =
"ALTIUM_VALUE";
4379 while( libSymbol->GetField( fieldName ) )
4380 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
4383 libSymbol->AddField( new_field );
4394 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4396 int size = aFontSizes[elem.
fontId - 1];
4410 const std::map<wxString, wxString>& aProperties )
4419 std::vector<LIB_SYMBOL*>& aSymbol )
4423 if( elem.
type != wxS(
"PCBLIB" ) )
4427 if( aSymbol.size() == 0 && !elem.
isCurrent )
4433 wxArrayString fpFilters;
4434 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
4437 if( !aSymbol.empty() )
4443 symbol->SetFPFilters( fpFilters );
4444 symbol->GetField( FIELD_T::FOOTPRINT )->SetText( fpLibId.
Format() );
4454 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
4460 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
4464 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
4465 implementationOwnerIt->second ),
4472 libSymbolIt->second->SetFPFilters( fpFilters );
4482 wxString>& aProperties )
4486 std::vector<LIB_SYMBOL*> symbols;
4495 symbol->
SetName( wxString::Format(
"%s (Altium Display %d)", elem.
libreference, i + 1 ) );
4503 symbols.push_back( symbol );
4514 std::vector<int> fontSizes;
4515 struct SYMBOL_PIN_FRAC
4524 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
4526 for(
auto& [
name, entry] : syms )
4528 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
4530 if( entry.m_pinsFrac )
4532 auto parse_binary_pin_frac =
4533 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4535 std::map<wxString, wxString> result;
4541 SYMBOL_PIN_FRAC pinFrac;
4545 pinFrac.len_frac = binreader.
ReadInt32();
4546 pinFracs.insert( { pinFracData.first, pinFrac } );
4558 std::vector<LIB_SYMBOL*> symbols;
4565 std::map<wxString, wxString> properties = reader.
ReadProperties();
4569 if( record != ALTIUM_SCH_RECORD::COMPONENT )
4570 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
4575 auto handleBinaryPinLambda =
4576 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
4578 std::map<wxString, wxString> result;
4582 int32_t recordId = binreader.
ReadInt32();
4584 if( recordId !=
static_cast<int32_t
>( ALTIUM_SCH_RECORD::PIN ) )
4587 result[
"RECORD"] = wxString::Format(
"%d", recordId );
4589 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4590 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4591 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4592 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4593 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4594 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
4597 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
4598 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
4599 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4600 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4601 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
4602 result[
"COLOR"] = wxString::Format(
"%d", binreader.
ReadInt32() );
4607 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
4609 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
4610 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
4611 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
4615 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
4617 if( partSeqSplit.size() == 3 )
4619 result[
"PART"] = partSeqSplit[0];
4620 result[
"SEQ"] = partSeqSplit[2];
4628 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
4630 if( properties.empty() )
4638 case ALTIUM_SCH_RECORD::PIN:
4643 case ALTIUM_SCH_RECORD::LABEL:
ParseLabel( properties, symbols, fontSizes );
break;
4644 case ALTIUM_SCH_RECORD::BEZIER:
ParseBezier( properties, symbols );
break;
4645 case ALTIUM_SCH_RECORD::POLYLINE:
ParsePolyline( properties, symbols );
break;
4646 case ALTIUM_SCH_RECORD::POLYGON:
ParsePolygon( properties, symbols );
break;
4647 case ALTIUM_SCH_RECORD::ELLIPSE:
ParseEllipse( properties, symbols );
break;
4648 case ALTIUM_SCH_RECORD::PIECHART:
ParsePieChart( properties, symbols );
break;
4649 case ALTIUM_SCH_RECORD::ROUND_RECTANGLE:
ParseRoundRectangle( properties, symbols );
break;
4650 case ALTIUM_SCH_RECORD::ELLIPTICAL_ARC:
ParseEllipticalArc( properties, symbols );
break;
4651 case ALTIUM_SCH_RECORD::ARC:
ParseArc( properties, symbols );
break;
4652 case ALTIUM_SCH_RECORD::LINE:
ParseLine( properties, symbols );
break;
4653 case ALTIUM_SCH_RECORD::RECTANGLE:
ParseRectangle( properties, symbols );
break;
4654 case ALTIUM_SCH_RECORD::DESIGNATOR:
ParseLibDesignator( properties, symbols, fontSizes );
break;
4655 case ALTIUM_SCH_RECORD::PARAMETER:
ParseLibParameter( properties, symbols, fontSizes );
break;
4656 case ALTIUM_SCH_RECORD::TEXT_FRAME:
ParseTextFrame( properties, symbols, fontSizes );
break;
4657 case ALTIUM_SCH_RECORD::IMPLEMENTATION:
ParseImplementation( properties, symbols );
break;
4659 case ALTIUM_SCH_RECORD::IMPL_PARAMS:
4662 case ALTIUM_SCH_RECORD::MAP_DEFINER:
4663 case ALTIUM_SCH_RECORD::MAP_DEFINER_LIST:
4666 case ALTIUM_SCH_RECORD::IEEE_SYMBOL:
4670 case ALTIUM_SCH_RECORD::IMAGE:
4674 case ALTIUM_SCH_RECORD::IMPLEMENTATION_LIST:
4679 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
4693 for(
size_t ii = 0; ii < symbols.size(); ii++ )
4701 if( valField.
GetText().IsEmpty() )
4704 if( symbols.size() == 1 )
4707 ret[wxString::Format(
"%s (Altium Display %zd)",
name, ii + 1 )] = symbol;
4717 wxFileName fn( aLibraryPath );
4719 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
4720 return fn.GetModificationTime().GetValue().GetValue();
4722 return wxDateTime( 0.0 ).GetValue().GetValue();
4727 const std::map<std::string, UTF8>* aProperties )
4740 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
4742 wxFileName fileName( aLibraryPath );
4747 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
4751 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
4753 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
4757 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
4759 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir( L
"SchLib" );
4761 for(
const auto& [schLibName, cfe] : schLibFiles )
4763 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
4765 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
4766 compoundFiles.emplace_back( std::move( decodedStream ) );
4772 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
4775 cacheMapRef.insert( parsed.begin(), parsed.end() );
4780 catch(
const CFB::CFBException& exception )
4784 catch(
const std::exception& exc )
4786 wxFAIL_MSG( wxString::Format( wxT(
"Unhandled exception in Altium schematic parsers: %s." ),
4794 std::vector<int>& aFontSizes )
4796 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
4798 if( file ==
nullptr )
4806 std::map<wxString, wxString> properties = reader.
ReadProperties();
4810 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
4811 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
4813 for(
auto& [key, value] : properties )
4815 wxString upperKey = key.Upper();
4818 if( upperKey.StartsWith(
"SIZE", &remaining ) )
4820 if( !remaining.empty() )
4822 int ind = wxAtoi( remaining );
4824 if(
static_cast<int>( aFontSizes.size() ) < ind )
4825 aFontSizes.resize( ind );
4829 aFontSizes[ind - 1] = scaled;
4837 const std::map<std::string, UTF8>* aProperties,
4838 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
4842 bool powerSymbolsOnly = ( aProperties &&
4849 for(
auto& [libnameStr, libSymbol] : it->second )
4851 if( powerSymbolsOnly && !libSymbol->IsPower() )
4854 aInserter( libnameStr, libSymbol );
4861 const std::map<std::string, UTF8>* aProperties )
4866 aSymbolNameList.Add( aStr );
4872 const wxString& aLibraryPath,
4873 const std::map<std::string, UTF8>* aProperties )
4878 aSymbolList.emplace_back( aSymbol );
4884 const std::map<std::string, UTF8>* aProperties )
4892 auto it2 = it->second.find( aAliasName );
4894 if( it2 != it->second.end() )
const int ALTIUM_COMPONENT_NONE
wxString AltiumSchSpecialStringsToKiCadVariables(const wxString &aString, const std::map< wxString, wxString > &aOverrides)
wxString AltiumPinNamesToKiCad(wxString &aString)
LIB_ID AltiumToKiCadLibID(const wxString &aLibName, const wxString &aLibReference)
constexpr EDA_IU_SCALE schIUScale
constexpr double ARC_LOW_DEF_MM
void TransformEllipseToBeziers(const ELLIPSE< T > &aEllipse, std::vector< BEZIER< T > > &aBeziers)
Transforms an ellipse or elliptical arc into a set of quadratic Bezier curves that approximate it.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
std::map< wxString, ValueType, DETAIL::CASE_INSENSITIVE_COMPARER > CASE_INSENSITIVE_MAP
std::map< wxString, wxString > ReadProperties()
size_t GetRemainingBytes() const
std::map< wxString, wxString > ReadProperties(std::function< std::map< wxString, wxString >(const std::string &)> handleBinaryData=[](const std::string &) { return std::map< wxString, wxString >();})
std::string ReadShortPascalString()
std::map< wxString, ALTIUM_SYMBOL_DATA > GetLibSymbols(const CFB::COMPOUND_FILE_ENTRY *aStart) const
const CFB::COMPOUND_FILE_ENTRY * FindStream(const std::vector< std::string > &aStreamPath) const
std::pair< int, std::string * > ReadCompressedString()
static int ReadInt(const std::map< wxString, wxString > &aProps, const wxString &aKey, int aDefault)
static wxString ReadString(const std::map< wxString, wxString > &aProps, const wxString &aKey, const wxString &aDefault)
Bezier curves to polygon converter.
void GetPoly(std::vector< VECTOR2I > &aOutput, int aMaxError=10)
Convert a Bezier curve to a polygon.
Generic cubic Bezier representation.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr const Vec GetCenter() const
constexpr bool Contains(const Vec &aPoint) const
A base class for most all the KiCad significant classes used in schematics and boards.
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)
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.
PROGRESS_REPORTER * m_progressReporter
Progress reporter to track the progress of the operation, may be nullptr.
virtual bool CanReadLibrary(const wxString &aFileName) const
Checks if this IO object can read the specified library file/directory.
A color representation with 4 components: red, green, blue, alpha.
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
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.
int SetLibNickname(const UTF8 &aLibNickname)
Override the logical library name portion of the LIB_ID to aLibNickname.
static UTF8 FixIllegalChars(const UTF8 &aLibItemName, bool aLib)
Replace illegal LIB_ID item name characters with underscores '_'.
Define a library symbol object.
void SetUnitCount(int aCount, bool aDuplicateDrawItems=true)
Set the units per symbol count.
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 & GetValueField()
Return reference to the value field.
int GetUnitCount() const override
void SetLibId(const LIB_ID &aLibId)
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
virtual void SetName(const wxString &aName)
SCH_FIELD & GetReferenceField()
Return reference to the reference designator field.
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.
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.
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 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)
Report a string with a given severity.
Holds all the data relating to one schematic.
PROJECT & Prj() const
Return a reference to the project this schematic is part of.
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.
void SetSize(const VECTOR2I &aSize)
VECTOR2I GetPosition() const override
Class for a wire to bus entry.
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
void SetText(const wxString &aText) override
void SetNameShown(bool aShown=true)
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
void ParseFileHeader(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void ParseSignalHarness(const std::map< wxString, wxString > &aProperties)
std::map< int, ASCH_TEMPLATE > m_altiumTemplates
std::map< int, ASCH_SYMBOL > m_altiumComponents
void ParsePort(const ASCH_PORT &aElem)
bool IsComponentPartVisible(const ASCH_OWNER_INTERFACE &aElem) const
void ParseNote(const std::map< wxString, wxString > &aProperties)
void ParseAltiumSch(const wxString &aFileName)
std::vector< ASCH_PORT > m_altiumPortsCurrentSheet
void ParseSheetName(const std::map< wxString, wxString > &aProperties)
void ParseBusEntry(const std::map< wxString, wxString > &aProperties)
SCH_SHEET * getCurrentSheet()
void ParseStorage(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
std::map< wxString, LIB_SYMBOL * > m_powerSymbols
void ParseBus(const std::map< wxString, wxString > &aProperties)
void ParseFileName(const std::map< wxString, wxString > &aProperties)
static bool isASCIIFile(const wxString &aFileName)
LIB_SYMBOL * LoadSymbol(const wxString &aLibraryPath, const wxString &aAliasName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a LIB_SYMBOL object having aPartName from the aLibraryPath containing a library format that this...
std::map< int, SCH_SHEET * > m_sheets
void ParseLibHeader(const ALTIUM_COMPOUND_FILE &aAltiumSchFile, std::vector< int > &aFontSizes)
void ParseHarnessPort(const ASCH_PORT &aElem)
void ParseRoundRectangle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
int GetModifyHash() const override
Return the modification hash from the library cache.
void ParseLibDesignator(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
std::map< wxString, CASE_INSENSITIVE_MAP< LIB_SYMBOL * > > m_libCache
std::map< int, int > m_altiumImplementationList
void ParseTextFrame(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
void ParsePolygon(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void fixupSymbolPinNameNumbers(SYMBOL *aSymbol)
void ParseRecord(int index, std::map< wxString, wxString > &properties, const wxString &aSectionName)
std::vector< ASCH_PORT > m_altiumHarnessPortsCurrentSheet
void ParseDesignator(const std::map< wxString, wxString > &aProperties)
int m_harnessOwnerIndexOffset
void ParsePortHelper(const ASCH_PORT &aElem)
static bool checkFileHeader(const wxString &aFileName)
long long getLibraryTimestamp(const wxString &aLibraryPath) const
void ParseSheetEntry(const std::map< wxString, wxString > &aProperties)
static bool isBinaryFile(const wxString &aFileName)
void ParseHarnessType(const std::map< wxString, wxString > &aProperties)
void ParseJunction(const std::map< wxString, wxString > &aProperties)
void ParseLibParameter(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
void ParseASCIISchematic(const wxString &aFileName)
void ParsePolyline(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::unique_ptr< ASCH_SHEET > m_altiumSheet
void ParseComponent(int aIndex, const std::map< wxString, wxString > &aProperties)
std::unique_ptr< TITLE_BLOCK > m_currentTitleBlock
SCH_SHEET * LoadSchematicProject(SCHEMATIC *aSchematic, const std::map< std::string, UTF8 > *aProperties)
void ParseImage(const std::map< wxString, wxString > &aProperties)
void ParseArc(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseNetLabel(const std::map< wxString, wxString > &aProperties)
void ParseNoERC(const std::map< wxString, wxString > &aProperties)
SCH_SHEET * LoadSchematicFile(const wxString &aFileName, SCHEMATIC *aSchematic, SCH_SHEET *aAppendToMe=nullptr, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load information from some input file format that this SCH_IO implementation knows about,...
std::unordered_map< wxString, SEVERITY > m_errorMessages
void ParseImplementationList(int aIndex, const std::map< wxString, wxString > &aProperties)
std::vector< LIB_SYMBOL * > ParseLibComponent(const std::map< wxString, wxString > &aProperties)
void ParseSheet(const std::map< wxString, wxString > &aProperties)
void ParseParameter(const std::map< wxString, wxString > &aProperties)
bool ShouldPutItemOnSheet(int aOwnerindex)
void AddLibTextBox(const ASCH_TEXT_FRAME *aElem, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
bool CanReadSchematicFile(const wxString &aFileName) const override
Checks if this SCH_IO can read the specified schematic file.
void ParsePieChart(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseEllipticalArc(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, HARNESS > m_altiumHarnesses
void ParseEllipse(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseWire(const std::map< wxString, wxString > &aProperties)
void ParseHarnessEntry(const std::map< wxString, wxString > &aProperties)
void EnumerateSymbolLib(wxArrayString &aSymbolNameList, const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Populate a list of LIB_SYMBOL alias names contained within the library aLibraryPath.
void ParseImplementation(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseTemplate(int aIndex, const std::map< wxString, wxString > &aProperties)
void ParseAdditional(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void AddTextBox(const ASCH_TEXT_FRAME *aElem)
void ParsePowerPort(const std::map< wxString, wxString > &aProperties)
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
const ASCH_STORAGE_FILE * GetFileFromStorage(const wxString &aFilename) const
void ParseRectangle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void doEnumerateSymbolLib(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties, std::function< void(const wxString &, LIB_SYMBOL *)> aInserter)
std::vector< ASCH_STORAGE_FILE > m_altiumStorage
SCH_SHEET_PATH m_sheetPath
void ParseLabel(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym, std::vector< int > &aFontSize=nullint)
CASE_INSENSITIVE_MAP< LIB_SYMBOL * > ParseLibFile(const ALTIUM_COMPOUND_FILE &aAltiumSchFile)
void ParseBezier(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseLine(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
void ParseCircle(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, SCH_SYMBOL * > m_symbols
void ParseSheetSymbol(int aIndex, const std::map< wxString, wxString > &aProperties)
std::map< wxString, long long > m_timestamps
wxFileName getLibFileName()
SCH_SCREEN * getCurrentScreen()
void ParsePin(const std::map< wxString, wxString > &aProperties, std::vector< LIB_SYMBOL * > &aSymbol=nullsym)
std::map< int, LIB_SYMBOL * > m_libSymbols
void ParseHarnessConnector(int aIndex, const std::map< wxString, wxString > &aProperties)
void ensureLoadedLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties)
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
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.
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
void SetPosition(const VECTOR2I &aPos) override
void SetFilled(bool aFilled) override
void SetStroke(const STROKE_PARAMS &aStroke) override
void AddPoint(const VECTOR2I &aPosition)
STROKE_PARAMS GetStroke() const override
VECTOR2I GetPosition() const override
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
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)
int CountSheets() const
Count the number of sheets found in "this" sheet including all of the subsheets.
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
void SetValueFieldText(const wxString &aValue)
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
void SetFootprintFieldText(const wxString &aFootprint)
VECTOR2I GetPosition() const override
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
void SetPosition(const VECTOR2I &aPosition) override
Simple container to manage line stroke parameters.
void SetLineStyle(LINE_STYLE aLineStyle)
void SetWidth(int aWidth)
void SetColor(const KIGFX::COLOR4D &aColor)
KIGFX::COLOR4D GetColor() const
static const char * PropPowerSymsOnly
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
const TRANSFORM & GetTransform() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
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
constexpr int mmToIU(double mm) const
int m_primaryConnectionPosition
ASCH_SHEET_ENTRY_SIDE m_harnessConnectorSide
std::vector< HARNESS_PORT > m_ports
A simple container for sheet instance information.
@ INTERSHEET_REFS
Global label cross-reference page numbers.
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
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.