54#include <compoundfilereader.h>
64#include <wx/mstream.h>
65#include <wx/zstream.h>
66#include <wx/wfstream.h>
67#include <magic_enum.hpp>
73#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
74 0.94901960784313721, \
75 0.98431372549019602, 1.0 )
77#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
78 0.61960784313725492, \
79 0.78823529411764703, 1.0 )
91 int red = color & 0x0000FF;
92 int green = ( color & 0x00FF00 ) >> 8;
93 int blue = ( color & 0xFF0000 ) >> 16;
165 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
202 else if( elem.
AreaColor == aStrokeColor )
208 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
253 for(
auto& [
name, symbol] : lib )
305 std::vector<SCH_PIN*> pins;
308 pins =
static_cast<SCH_SYMBOL*
>( aSymbol )->GetPins(
nullptr );
310 pins =
static_cast<LIB_SYMBOL*
>( aSymbol )->GetGraphicalPins( 0, 0 );
313 bool names_visible =
false;
314 bool numbers_visible =
false;
318 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
319 names_visible =
true;
321 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
322 numbers_visible =
true;
333 if( !numbers_visible )
382 std::map<wxString, SCH_SHEET*> sheets;
383 wxFileName
project( aProperties->at(
"project_file" ) );
385 for(
auto& [ key, filestring] : *aProperties )
387 if( !key.starts_with(
"sch" ) )
390 wxFileName fn( filestring );
397 m_rootSheet->SearchHierarchy( fn.GetFullPath(), &existingScreen );
402 if( !existingScreen )
408 wxFileName screenFn( screen->GetFileName() );
409 wxFileName checkFn( fn.GetFullPath() );
411 if( screenFn.GetName().IsSameAs( checkFn.GetName(),
false ) )
413 existingScreen = screen;
425 wxFileName kicad_fn( fn );
426 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
428 sheet->SetScreen( screen );
435 sheet->SetFileName( kicad_fn.GetFullName() );
438 wxCHECK2( sheet && screen,
continue );
440 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
449 if( sheet->GetName().Trim().empty() )
451 wxString baseName = wxFileName( fn ).GetName();
452 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
454 wxString sheetName = baseName;
455 std::set<wxString> existingNames;
457 for(
auto& [
path, existing] : sheets )
458 existingNames.insert( existing->GetName() );
460 for(
int ii = 1; existingNames.count( sheetName ); ++ii )
461 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
463 sheet->SetName( sheetName );
471 wxCHECK2( currentScreen,
continue );
475 currentScreen->
Append( sheetPtr );
478 sheets[kicad_fn.GetFullPath()] = sheetPtr;
492 for(
auto& [ filestring, sheet ] : sheets )
504 const std::map<std::string, UTF8>* aProperties )
506 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
508 wxFileName fileName( aFileName );
516 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
520 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
526 m_rootSheet->SetFileName( fileName.GetFullPath() );
531 if( aFileName.empty() )
554 if( !aFileName.empty() )
561 wxCHECK( rootScreen,
nullptr );
570 if( aFileName.empty() )
575 if( aFileName.empty() )
577 std::vector<SCH_SHEET*> topLevelSheets;
585 topLevelSheets.push_back( sheet );
591 rootScreen->
Remove( sheet );
593 if( !topLevelSheets.empty() )
605 std::vector<SCH_HIERLABEL*> hierLabels;
613 hierLabel->GetText() );
614 globalLabel->
SetShape( hierLabel->GetShape() );
618 screen->
Remove( hierLabel );
619 screen->
Append( globalLabel );
640 if( aProperties && aProperties->count(
"project_file" ) )
644 if( !variants.empty() )
650 std::vector<std::pair<wxString, const ALTIUM_VARIANT_ENTRY*>>;
652 std::map<wxString, ENTRY_LIST> variantsByUid;
653 std::map<wxString, ENTRY_LIST> variantsByDesignator;
659 if( !pv.description.empty() && pv.description != pv.name )
660 m_schematic->SetVariantDescription( pv.name, pv.description );
665 variantsByUid[entry.
uniqueId].push_back( { pv.name, &entry } );
667 variantsByDesignator[entry.
designator].push_back( { pv.name, &entry } );
684 ENTRY_LIST applicable;
686 const ENTRY_LIST* uidEntries =
nullptr;
691 auto varIt = variantsByUid.find( symUidIt->second );
693 if( varIt != variantsByUid.end() )
694 uidEntries = &varIt->second;
697 if( uidEntries && uidEntries->size() == 1 )
699 applicable = *uidEntries;
701 else if( uidEntries )
707 for(
const auto& namedEntry : *uidEntries )
709 if( namedEntry.second->designator == ref )
710 applicable.push_back( namedEntry );
716 auto varIt = variantsByDesignator.find( ref );
718 if( varIt != variantsByDesignator.end() )
719 applicable = varIt->second;
722 if( applicable.empty() )
725 for(
const auto& [variantName, entry] : applicable )
730 if( entry->kind == 1 )
732 variant.
m_DNP =
true;
736 else if( entry->kind == 0 )
738 for(
const auto& [key, value] : entry->alternateFields )
740 if( key.CmpNoCase( wxS(
"LibReference" ) ) == 0 )
741 variant.
m_Fields[wxS(
"Value" )] = value;
742 else if( key.CmpNoCase( wxS(
"Description" ) ) == 0 )
743 variant.
m_Fields[wxS(
"Description" )] = value;
744 else if( key.CmpNoCase( wxS(
"Footprint" ) ) == 0 )
745 variant.
m_Fields[wxS(
"Footprint" )] = value;
759 int minWireWidth = std::numeric_limits<int>::max();
760 int minBusWidth = std::numeric_limits<int>::max();
764 std::vector<SCH_MARKER*> markers;
771 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
774 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
778 std::shared_ptr<NET_SETTINGS>& netSettings =
m_schematic->Project().GetProjectFile().NetSettings();
780 if( minWireWidth < std::numeric_limits<int>::max() )
781 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
783 if( minBusWidth < std::numeric_limits<int>::max() )
784 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
807 std::vector<SCH_LINE*> busLines;
808 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
816 busLines.push_back( line );
818 busLineMap[ line->
GetEndPoint() ].push_back( line );
825 auto it = busLineMap.find( aStart );
827 if( it == busLineMap.end() )
833 if( aVisited.count( line ) )
836 aVisited.insert( line );
857 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>();
858 alias->SetName( harness.m_name );
861 alias->AddMember( port.
m_name );
866 BOX2I box( harness.m_location, harness.m_size );
896 int delta_x =
center.x - pos.
x;
897 int delta_y =
center.y - pos.
y;
904 screen->
Append( busLine );
911 screen->
Append( busLine );
921 std::set<SCH_LINE*> visited;
922 SCH_LABEL* label = walkBusLine( pos, visited );
929 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
930 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
947 bool isVertical =
true;
949 if( harness.m_ports.size() > 1 )
951 VECTOR2I first = harness.m_ports.front().m_location;
952 VECTOR2I last = harness.m_ports.back().m_location;
954 if( first.
y == last.
y )
960 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
961 VECTOR2I top = harness.m_ports.front().m_entryLocation;
1026 wxFileName parentFileName( aFileName );
1033 wxFileName relative = parentFileName;
1036 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
1054 catch(
const CFB::CFBException& exception )
1058 catch(
const std::exception& exc )
1060 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium schematic: %s" ), exc.what() ) );
1069 wxCHECK( currentScreen, );
1077 wxCHECK2( sheet,
continue );
1081 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
1083 if( !loadAltiumFileName.IsFileReadable() )
1087 if( !loadAltiumFileName.HasExt() )
1089 wxFileName withExt( loadAltiumFileName );
1090 withExt.SetExt( wxT(
"SchDoc" ) );
1092 if( withExt.IsFileReadable() )
1093 loadAltiumFileName = withExt;
1097 if( !loadAltiumFileName.IsFileReadable() )
1102 bool extensionless = !sheetFn.HasExt();
1104 wxArrayString files;
1105 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
1106 wxDIR_FILES | wxDIR_HIDDEN );
1108 for(
const wxString& candidate : files )
1110 wxFileName candidateFname( candidate );
1112 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false )
1114 && !sheetFn.GetName().empty()
1115 && candidateFname.GetName().IsSameAs( sheetFn.GetName(),
false )
1116 && candidateFname.GetExt().IsSameAs( wxT(
"SchDoc" ),
false ) ) )
1118 loadAltiumFileName = candidateFname;
1124 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
1126 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
1127 "this is probably an Altium signal harness "
1128 "that got converted to a sheet." ),
1135 m_rootSheet->SearchHierarchy( loadAltiumFileName.GetFullPath(), &loadedScreen );
1141 wxFileName projectFileName = loadAltiumFileName;
1142 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1144 sheet->
SetFileName( projectFileName.GetFullName() );
1164 if( baseRef.StartsWith( wxT(
"#" ) ) )
1171 wxString newRef = baseRef + wxT(
"_" ) + sheet->
GetName();
1183 if( sheet->
GetName().Trim().empty() )
1185 wxString baseName = loadAltiumFileName.GetName();
1186 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
1188 wxString sheetName = baseName;
1189 std::set<wxString> sheetNames;
1194 sheetNames.insert( otherSheet->
GetName() );
1197 for(
int ii = 1; ; ++ii )
1199 if( sheetNames.find( sheetName ) == sheetNames.end() )
1202 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
1208 wxCHECK2( screen,
continue );
1215 wxFileName projectFileName = loadAltiumFileName;
1216 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1218 sheet->
SetFileName( projectFileName.GetFullName() );
1219 screen->
SetFileName( projectFileName.GetFullPath() );
1229 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
1231 if( file ==
nullptr )
1236 std::map<wxString, wxString> properties = reader.
ReadProperties();
1243 for(
int i = 0; i < weight; i++ )
1253 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
1262 wxString streamName = wxS(
"Additional" );
1264 const CFB::COMPOUND_FILE_ENTRY* file =
1265 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1267 if( file ==
nullptr )
1274 THROW_IO_ERROR(
"Additional section does not contain any data" );
1278 std::map<wxString, wxString> properties = reader.
ReadProperties();
1289 std::map<wxString, wxString> properties = reader.
ReadProperties();
1313 wxString streamName = wxS(
"FileHeader" );
1315 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1317 if( file ==
nullptr )
1328 std::map<wxString, wxString> properties = reader.
ReadProperties();
1332 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1345 std::map<wxString, wxString> properties = reader.
ReadProperties();
1357 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1367 symbol.second->SetLibSymbol( libSymbolIt->second );
1404 while( storageReader.
CanRead() )
1406 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1409 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1423 std::map<wxString, wxString> properties = reader.
ReadProperties();
1427 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1442 std::map<wxString, wxString> properties = reader.
ReadProperties();
1445 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1451 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1464 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1474 symbol.second->SetLibSymbol( libSymbolIt->second );
1514 const wxString& aSectionName )
1710 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1727 if( file.filename.IsSameAs( aFilename ) )
1730 if( file.filename.EndsWith( aFilename ) )
1731 nonExactMatch = &file;
1734 return nonExactMatch;
1741 wxCHECK( currentSheet, );
1743 wxString sheetName = currentSheet->
GetName();
1745 if( sheetName.IsEmpty() )
1746 sheetName = wxT(
"root" );
1754 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
1755 "replaced with symbol \"%s\"." ),
1767 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1787 std::vector<wxString> bodyStyleNames;
1790 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
1803 field.SetVisible(
false );
1844 screen->
Append( symbol );
1856 wxCHECK( currentSheet, );
1858 wxString sheetName = currentSheet->
GetName();
1860 if( sheetName.IsEmpty() )
1861 sheetName = wxT(
"root" );
1866 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1868 if( baseName.IsEmpty() )
1869 baseName = wxS(
"Template" );
1877 std::vector<LIB_SYMBOL*>& aSymbol )
1881 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
1891 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1897 schSymbol =
m_symbols.at( libSymbolIt->first );
1898 symbol = libSymbolIt->second;
1914 if( !aSymbol.empty() )
1932 pin->SetVisible(
false );
1935 pin->SetNumberTextSize( 0 );
1938 pin->SetNameTextSize( 0 );
1976 VECTOR2I dir = bodyEnd - pinLocation;
1984 pin->SetPosition( pinLocation );
2082 int vjustify, hjustify;
2085 switch( justification )
2108 switch( justification )
2131 switch( orientation )
2154 text->SetTextAngle( angle );
2224 int nRenderRotations = ( aSymbol.
orientation + 1 ) % 4;
2238 for(
int i = 0; i < nRenderRotations; i++ )
2258 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
2264 static const std::map<wxString, wxString> variableMap = {
2265 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
2266 {
"SHEETNUMBER",
"#" },
2267 {
"SHEETTOTAL",
"##" },
2268 {
"TITLE",
"TITLE" },
2269 {
"REVISION",
"REVISION" },
2270 {
"DATE",
"ISSUE_DATE" },
2271 {
"CURRENTDATE",
"CURRENT_DATE" },
2272 {
"COMPANYNAME",
"COMPANY" },
2273 {
"DOCUMENTNAME",
"FILENAME" },
2274 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
2275 {
"PROJECTNAME",
"PROJECTNAME" },
2283 size_t fontId =
static_cast<int>( elem.
fontId );
2300 screen->
Append( textItem );
2304 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2319 symbol = libSymbolIt->second;
2320 schsym =
m_symbols.at( libSymbolIt->first );
2329 if( !aSymbol.empty() )
2358 size_t fontId = elem.
fontId;
2369 else if( fontId > 0 && fontId <= aFontSizes.size() )
2371 int size = aFontSizes[fontId - 1];
2379 std::vector<LIB_SYMBOL*>& aSymbol,
2380 std::vector<int>& aFontSizes )
2407 textBox->
SetStart( sheetTopRight );
2408 textBox->
SetEnd( sheetBottomLeft );
2438 size_t fontId =
static_cast<int>( aElem->
FontID );
2456 screen->
Append( textBox );
2461 std::vector<int>& aFontSizes )
2463 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2478 symbol = libSymbolIt->second;
2479 schsym =
m_symbols.at( libSymbolIt->first );
2489 if( !aSymbol.empty() )
2542 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2544 int size = aFontSizes[aElem->
FontID - 1];
2551 std::vector<LIB_SYMBOL*>& aSymbol )
2555 if( elem.
points.size() < 2 )
2557 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2558 static_cast<int>( elem.
points.size() ) ),
2566 wxCHECK( currentScreen, );
2568 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2570 if( i + 2 == elem.
points.size() )
2581 currentScreen->
Append( line );
2586 std::vector<VECTOR2I> bezierPoints;
2587 std::vector<VECTOR2I> polyPoints;
2589 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2590 bezierPoints.push_back( elem.
points.at( j ) );
2593 converter.
GetPoly( polyPoints );
2595 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2604 currentScreen->
Append( line );
2611 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2621 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2627 symbol = libSymbolIt->second;
2628 schsym =
m_symbols.at( libSymbolIt->first );
2635 if( !aSymbol.empty() )
2648 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2650 if( i + 2 == elem.
points.size() )
2661 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2673 else if( i + 3 == elem.
points.size() )
2687 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2710 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2719 case 0: bezier->
SetStart( pos );
break;
2722 case 3: bezier->
SetEnd( pos );
break;
2736 std::vector<LIB_SYMBOL*>& aSymbol )
2740 if( elem.
Points.size() < 2 )
2748 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2765 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2775 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2781 symbol = libSymbolIt->second;
2782 schsym =
m_symbols.at( libSymbolIt->first );
2792 if( !aSymbol.empty() )
2823 std::vector<LIB_SYMBOL*>& aSymbol )
2846 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2856 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2862 symbol = libSymbolIt->second;
2863 schsym =
m_symbols.at( libSymbolIt->first );
2873 if( !aSymbol.empty() )
2916 std::vector<LIB_SYMBOL*>& aSymbol )
2938 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2948 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
2954 symbol = libSymbolIt->second;
2955 schsym =
m_symbols.at( libSymbolIt->first );
2970 int radius = std::min( width / 2, height / 2 );
3004 if( !aSymbol.empty() )
3021 std::vector<LIB_SYMBOL*>& aSymbol )
3029 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3035 wxCHECK( currentScreen, );
3060 currentScreen->
Append( arc );
3065 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3080 symbol = libSymbolIt->second;
3081 schsym =
m_symbols.at( libSymbolIt->first );
3088 if( !aSymbol.empty() )
3109 circle->SetBodyStyle( bodyStyle );
3150 std::vector<LIB_SYMBOL*>& aSymbol )
3164 wxCHECK( currentScreen, );
3170 std::vector<BEZIER<int>> beziers;
3177 schbezier->
SetStart( bezier.Start );
3180 schbezier->
SetEnd( bezier.End );
3184 currentScreen->
Append( schbezier );
3189 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3199 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
3205 symbol = libSymbolIt->second;
3206 schsym =
m_symbols.at( libSymbolIt->first );
3213 if( !aSymbol.empty() )
3230 std::vector<BEZIER<int>> beziers;
3253 schbezier->
SetStart( bezier.Start );
3256 schbezier->
SetEnd( bezier.End );
3267 std::vector<LIB_SYMBOL*>& aSymbol )
3277 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3302 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3312 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
3318 symbol = libSymbolIt->second;
3319 schsym =
m_symbols.at( libSymbolIt->first );
3329 if( !aSymbol.empty() )
3361 std::vector<LIB_SYMBOL*>& aSymbol )
3386 std::vector<BEZIER<int>> beziers;
3387 std::vector<VECTOR2I> polyPoints;
3394 schbezier->
SetStart( bezier.Start );
3397 schbezier->
SetEnd( bezier.End );
3403 screen->
Append( schbezier );
3405 polyPoints.push_back( bezier.Start );
3415 for(
const VECTOR2I& point : polyPoints )
3418 schpoly->
AddPoint( polyPoints[0] );
3420 screen->
Append( schpoly );
3425 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3440 symbol = libSymbolIt->second;
3441 schsym =
m_symbols.at( libSymbolIt->first );
3448 if( !aSymbol.empty() )
3464 std::vector<BEZIER<int>> beziers;
3465 std::vector<VECTOR2I> polyPoints;
3480 libbezier->
SetStart( bezier.Start );
3483 libbezier->
SetEnd( bezier.End );
3497 polyPoints.push_back( libbezier->
GetStart() );
3511 for(
const VECTOR2I& point : polyPoints )
3514 libline->
AddPoint( polyPoints[0] );
3524 std::vector<LIB_SYMBOL*>& aSymbol )
3544 circle->SetFilled(
false );
3550 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3565 symbol = libSymbolIt->second;
3566 schsym =
m_symbols.at( libSymbolIt->first );
3577 if( !aSymbol.empty() )
3603 std::vector<LIB_SYMBOL*>& aSymbol )
3623 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3638 symbol = libSymbolIt->second;
3639 schsym =
m_symbols.at( libSymbolIt->first );
3649 if( !aSymbol.empty() )
3688 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3701 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3708 wxString>& aProperties )
3717 HARNESS& harness = it->second;
3745 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3759 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3765 HARNESS& harness = harnessIt->second;
3802 harness.
m_ports.emplace_back( port );
3814 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3820 HARNESS& harness = harnessIt->second;
3826 std::vector<LIB_SYMBOL*>& aSymbol )
3841 rect->
SetEnd( sheetBottomLeft );
3850 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3860 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3866 symbol = libSymbolIt->second;
3867 schsym =
m_symbols.at( libSymbolIt->first );
3877 if( !aSymbol.empty() )
3893 rect->
SetEnd( sheetBottomLeft );
3921 wxCHECK( currentScreen, );
3922 currentScreen->
Append( sheet );
3931 wxCHECK( rootScreen, );
3939 m_sheets.insert( { aIndex, sheet } );
3957 sheetIt->second->AddPin( sheetPin );
3959 wxString pinName = elem.
name;
3962 pinName += wxT(
"{" ) + elem.
harnessType + wxT(
"}" );
3969 VECTOR2I pos = sheetIt->second->GetPosition();
3970 VECTOR2I size = sheetIt->second->GetSize();
4207 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
4232 wxString symName( elem.
text );
4233 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
4235 if( !styleName.empty() )
4236 symName <<
'_' << styleName;
4245 libSymbol = powerSymbolIt->second;
4251 libSymbol->
SetName( symName );
4256 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
4266 pin->SetPosition( { 0, 0 } );
4267 pin->SetLength( 0 );
4269 pin->SetVisible(
false );
4326 screen->
Append( symbol );
4354 switch( aElem.
Style )
4384 bool connectionFound = startIsWireTerminal
4385 || startIsBusTerminal
4386 || endIsWireTerminal
4387 || endIsBusTerminal;
4389 if( !connectionFound )
4393 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
4396 BOX2I bbox( harness.m_location, harness.m_size );
4401 startIsBusTerminal =
true;
4402 connectionFound =
true;
4408 endIsBusTerminal =
true;
4409 connectionFound =
true;
4414 if( !connectionFound )
4422 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
4425 wxString labelName = aElem.
Name;
4428 labelName += wxT(
"{" ) + aElem.
HarnessType + wxT(
"}" );
4451 switch( aElem.
Style )
4458 if( ( startIsWireTerminal || startIsBusTerminal ) )
4469 if( ( startIsWireTerminal || startIsBusTerminal ) )
4483 if( ( startIsWireTerminal && endIsWireTerminal ) )
4491 else if( startIsBusTerminal && endIsBusTerminal )
4514 screen->
Append( noConnect );
4542 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4561 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4583 screen->
Append( junction );
4595 && component->second.currentpartid != elem.
ownerpartid )
4599 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
4611 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file %s not found in storage." ),
4617 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4620 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4621 wxZlibInputStream zlibInputStream( fileStream );
4622 wxFFileOutputStream outputStream( storagePath );
4623 outputStream.Write( zlibInputStream );
4624 outputStream.Close();
4628 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
4634 wxRemoveFile( storagePath );
4638 if( !wxFileExists( elem.
filename ) )
4656 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4657 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4660 bitmap->SetFlags(
IS_NEW );
4661 screen->
Append( bitmap.release() );
4667 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4719 wxCHECK( currentScreen, );
4725 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4731 wxString baseName = elem.
text;
4732 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
4734 wxString sheetName = baseName;
4735 std::set<wxString> sheetNames;
4740 sheetNames.insert( sheet->
GetName() );
4743 for(
int ii = 1; ; ++ii )
4745 if( sheetNames.find( sheetName ) == sheetNames.end() )
4748 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
4754 sheetNameField->
SetText( sheetName );
4768 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4794 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4808 bool emptyRef = elem.
text.IsEmpty();
4813 bool visible = !emptyRef;
4830 std::vector<LIB_SYMBOL*>& aSymbol,
4831 std::vector<int>& aFontSizes )
4840 bool emptyRef = elem.
text.IsEmpty();
4841 SCH_FIELD& refField = symbol->GetReferenceField();
4844 refField.
SetText( wxT(
"X" ) );
4851 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4853 int size = aFontSizes[elem.
fontId - 1];
4870 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4873 screen->
Append( busWireEntry );
4882 static const std::map<wxString, wxString> variableMap = {
4883 {
"COMMENT",
"VALUE" },
4884 {
"VALUE",
"ALTIUM_VALUE" },
4890 if( elem.
text ==
"*" )
4893 wxString paramName = elem.
name.Upper();
4895 if( paramName ==
"SHEETNUMBER" )
4899 else if( paramName ==
"TITLE" )
4903 else if( paramName ==
"REVISION" )
4907 else if( paramName ==
"DATE" )
4911 else if( paramName ==
"COMPANYNAME" )
4932 wxString upperName = elem.
name.Upper();
4934 if( upperName ==
"COMMENT" )
4940 wxString fieldName = elem.
name.Upper();
4942 if( fieldName.IsEmpty() )
4944 int disambiguate = 1;
4948 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4950 if( !symbol->
GetField( fieldName ) )
4954 else if( fieldName ==
"VALUE" )
4956 fieldName =
"ALTIUM_VALUE";
4978 std::vector<LIB_SYMBOL*>& aSymbol,
4979 std::vector<int>& aFontSizes )
5003 std::map<wxString, wxString> variableMap = {
5004 {
"COMMENT",
"VALUE" },
5010 wxString upperName = elem.
name.Upper();
5012 if( upperName ==
"COMMENT" )
5014 field = &libSymbol->GetValueField();
5018 wxString fieldNameStem = elem.
name;
5019 wxString fieldName = fieldNameStem;
5020 int disambiguate = 1;
5022 if( fieldName.IsEmpty() )
5024 fieldNameStem =
"ALTIUM_UNNAMED";
5025 fieldName =
"ALTIUM_UNNAMED_1";
5028 else if( upperName ==
"VALUE" )
5030 fieldNameStem =
"ALTIUM_VALUE";
5031 fieldName =
"ALTIUM_VALUE";
5035 while( libSymbol->GetField( fieldName ) )
5036 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
5039 libSymbol->AddField( new_field );
5050 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
5052 int size = aFontSizes[elem.
fontId - 1];
5066 const std::map<wxString, wxString>& aProperties )
5075 std::vector<LIB_SYMBOL*>& aSymbol )
5079 if( elem.
type != wxS(
"PCBLIB" ) )
5083 if( aSymbol.size() == 0 && !elem.
isCurrent )
5089 wxArrayString fpFilters;
5090 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
5093 if( !aSymbol.empty() )
5099 symbol->SetFPFilters( fpFilters );
5110 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
5116 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
5120 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
5121 implementationOwnerIt->second ),
5128 libSymbolIt->second->SetFPFilters( fpFilters );
5138 wxString>& aProperties )
5155 std::vector<wxString> bodyStyleNames;
5158 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
5171 std::vector<int> fontSizes;
5172 struct SYMBOL_PIN_FRAC
5181 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
5183 for(
auto& [
name, entry] : syms )
5185 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
5187 if( entry.m_pinsFrac )
5189 auto parse_binary_pin_frac =
5190 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5192 std::map<wxString, wxString>
result;
5198 SYMBOL_PIN_FRAC pinFrac;
5202 pinFrac.len_frac = binreader.
ReadInt32();
5203 pinFracs.insert( { pinFracData.first, pinFrac } );
5215 std::vector<LIB_SYMBOL*> symbols;
5222 std::map<wxString, wxString> properties = reader.
ReadProperties();
5227 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
5232 auto handleBinaryPinLambda =
5233 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5235 std::map<wxString, wxString>
result;
5239 int32_t recordId = binreader.
ReadInt32();
5244 result[
"RECORD"] = wxString::Format(
"%d", recordId );
5246 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5247 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5248 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5249 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5250 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5251 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5254 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
5255 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5256 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5257 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5258 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5264 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
5266 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
5267 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
5268 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
5272 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
5274 if( partSeqSplit.size() == 3 )
5276 result[
"PART"] = partSeqSplit[0];
5277 result[
"SEQ"] = partSeqSplit[2];
5285 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
5287 if( properties.empty() )
5336 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
5356 if( valField.
GetText().IsEmpty() )
5369 wxFileName fn( aLibraryPath );
5371 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
5372 return fn.GetModificationTime().GetValue().GetValue();
5379 const std::map<std::string, UTF8>* aProperties )
5392 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
5394 wxFileName fileName( aLibraryPath );
5399 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
5403 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
5405 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
5409 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
5411 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
5413 for(
const auto& [schLibName, cfe] : schLibFiles )
5415 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
5417 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
5418 compoundFiles.emplace_back( std::move( decodedStream ) );
5424 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
5427 cacheMapRef.insert( parsed.begin(), parsed.end() );
5432 catch(
const CFB::CFBException& exception )
5436 catch(
const std::exception& exc )
5438 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium library: %s" ), exc.what() ) );
5444 std::vector<int>& aFontSizes )
5446 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
5448 if( file ==
nullptr )
5456 std::map<wxString, wxString> properties = reader.
ReadProperties();
5460 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
5461 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
5463 for(
auto& [key, value] : properties )
5465 wxString upperKey = key.Upper();
5468 if( upperKey.StartsWith(
"SIZE", &remaining ) )
5470 if( !remaining.empty() )
5472 int ind = wxAtoi( remaining );
5474 if(
static_cast<int>( aFontSizes.size() ) < ind )
5475 aFontSizes.resize( ind );
5478 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
5479 aFontSizes[ind - 1] = scaled;
5487 const std::map<std::string, UTF8>* aProperties,
5488 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
5492 bool powerSymbolsOnly = ( aProperties &&
5499 for(
auto& [libnameStr, libSymbol] : it->second )
5501 if( powerSymbolsOnly && !libSymbol->IsPower() )
5504 aInserter( libnameStr, libSymbol );
5511 const std::map<std::string, UTF8>* aProperties )
5516 aSymbolNameList.Add( aStr );
5522 const wxString& aLibraryPath,
5523 const std::map<std::string, UTF8>* aProperties )
5528 aSymbolList.emplace_back( aSymbol );
5534 const std::map<std::string, UTF8>* aProperties )
5542 auto it2 = it->second.find( aAliasName );
5544 if( it2 != it->second.end() )
const int ALTIUM_COMPONENT_NONE
wxString AltiumPinDesignatorToKiCad(const wxString &aDesignator)
Convert an Altium pin designator string to the equivalent KiCad pin number.
wxString AltiumSchSpecialStringsToKiCadVariables(const wxString &aString, const std::map< wxString, wxString > &aOverrides)
wxString AltiumPinNamesToKiCad(wxString &aString)
LIB_ID AltiumToKiCadLibID(const wxString &aLibName, const wxString &aLibReference)
std::vector< ALTIUM_PROJECT_VARIANT > ParseAltiumProjectVariants(const wxString &aPrjPcbPath)
Parse all [ProjectVariantN] sections from an Altium .PrjPcb project file.
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
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
bool IsHorizontal() const
A base class for most all the KiCad significant classes used in schematics and boards.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual void SetEnd(const VECTOR2I &aEnd)
void SetCenter(const VECTOR2I &aCenter)
FILL_T GetFillMode() const
void SetLineStyle(const LINE_STYLE aStyle)
virtual void SetBezierC2(const VECTOR2I &aPt)
virtual void SetBezierC1(const VECTOR2I &aPt)
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.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
COLOR4D GetFillColor() const
virtual void SetWidth(int aWidth)
void SetFillMode(FILL_T aFill)
virtual void SetStart(const VECTOR2I &aStart)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual void SetTextPos(const VECTOR2I &aPoint)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
virtual EDA_ANGLE GetTextAngle() const
void SetBold(bool aBold)
Set the text to be bold - this will also update the font if needed.
GR_TEXT_V_ALIGN_T GetVertJustify() const
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
Plain ellipse / elliptical-arc data.
RAII class to set and restore the fontconfig reporter.
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.
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 FixupDrawItems()
This function finds the filled draw items that are covering up smaller draw items and replaces their ...
void SetBodyStyleNames(const std::vector< wxString > &aBodyStyleNames)
wxString GetName() const override
void SetUnitCount(int aCount, bool aDuplicateDrawItems)
Set the units per symbol count.
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 GetBodyStyleCount() const override
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.
static LOAD_INFO_REPORTER & GetInstance()
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.
bool SetType(PAGE_SIZE_TYPE aPageSize, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
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 void SetCustomHeightMils(double aHeightInMils)
Set the height of Custom page in mils for any custom page constructed or made via SetType() after mak...
virtual const wxString GetProjectPath() const
Return the full path of the project.
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 & Project() const
Return a reference to the project this schematic is part of.
bool IsValid() const
A simple test if the schematic is loaded, not a complete one.
void SetTopLevelSheets(const std::vector< SCH_SHEET * > &aSheets)
void SetSize(const VECTOR2I &aSize)
VECTOR2I GetPosition() const override
Class for a wire to bus entry.
VECTOR2I GetPosition() const override
virtual const wxString & GetText() const override
Return the string associated with the text object.
void SetPosition(const VECTOR2I &aPosition) override
void SetText(const wxString &aText) override
void SetNameShown(bool aShown=true)
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this label.
void SetSpinStyle(SPIN_STYLE aSpinStyle) 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)
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.
std::map< const SCH_SYMBOL *, wxString > m_altiumSymbolToUid
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)
virtual bool CanReadSchematicFile(const wxString &aFileName) const
Checks if this SCH_IO can read the specified schematic file.
SCH_IO(const wxString &aName)
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual void SetBodyStyle(int aBodyStyle)
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.
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
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
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.
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
void push_back(SCH_SHEET *aSheet)
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.
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.
Variant information for a schematic symbol.
void InitializeAttributes(const SCH_SYMBOL &aSymbol)
void SetLibId(const LIB_ID &aName)
const std::vector< SCH_SYMBOL_INSTANCE > & GetInstances() const
void SetPosition(const VECTOR2I &aPosition) override
void SetBodyStyle(int aBodyStyle) override
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instances), if this entry does not already exist.
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
void SetValueFieldText(const wxString &aValue, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString)
void AddVariant(const SCH_SHEET_PATH &aInstance, const SCH_SYMBOL_VARIANT &aVariant)
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.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
VECTOR2I GetPosition() const override
virtual void Rotate90(bool aClockwise)
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.
std::map< wxString, wxString > m_Fields
bool m_ExcludedFromPosFiles
constexpr extended_type SquaredEuclideanNorm() const
Compute the squared euclidean norm of the vector, which is defined as (x ** 2 + y ** 2).
static REPORTER & GetInstance()
#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.
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
static const std::string KiCadSchematicFileExtension
static const std::string KiCadSymbolLibFileExtension
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
constexpr int Mils2IU(const EDA_IU_SCALE &aIuScale, int mils)
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
bool fileHasBinaryHeader(const wxString &aFilePath, const std::vector< uint8_t > &aHeader, size_t aOffset)
Check if a file starts with a defined binary 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)
@ PT_INPUT
usual pin input: must be connected
@ PT_TRISTATE
tri state bus pin
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_OPENEMITTER
pin type open emitter
@ PT_OPENCOLLECTOR
pin type open collector
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin.
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
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)
void AdjustTextForSymbolOrientation(SCH_TEXT *aText, const ASCH_SYMBOL &aSymbol)
static LINE_STYLE GetPlotDashType(const ASCH_POLYLINE_LINESTYLE linestyle)
static void SetSchShapeFillAndColor(const ASCH_FILL_INTERFACE &elem, SCH_SHAPE *shape)
void AdjustFieldForSymbolOrientation(SCH_FIELD *aField, const ASCH_SYMBOL &aSymbol)
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.
A project-level assembly variant parsed from an Altium .PrjPcb file.
A single component variation within an Altium project variant.
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
int m_primaryConnectionPosition
ASCH_SHEET_ENTRY_SIDE m_harnessConnectorSide
std::vector< HARNESS_PORT > m_ports
A simple container for sheet instance information.
@ USER
The field ID hasn't been set yet; field is invalid.
@ INTERSHEET_REFS
Global label cross-reference page numbers.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
KIBIS top(path, &reporter)
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
wxString result
Test unit parsing edge cases and error handling.
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.