58#include <compoundfilereader.h>
68#include <wx/mstream.h>
69#include <wx/zstream.h>
70#include <wx/wfstream.h>
71#include <magic_enum.hpp>
77#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
78 0.94901960784313721, \
79 0.98431372549019602, 1.0 )
81#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
82 0.61960784313725492, \
83 0.78823529411764703, 1.0 )
95 int red = color & 0x0000FF;
96 int green = ( color & 0x00FF00 ) >> 8;
97 int blue = ( color & 0xFF0000 ) >> 16;
169 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
206 else if( elem.
AreaColor == aStrokeColor )
212 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
257 for(
auto& [
name, symbol] : lib )
309 std::vector<SCH_PIN*> pins;
312 pins =
static_cast<SCH_SYMBOL*
>( aSymbol )->GetPins(
nullptr );
314 pins =
static_cast<LIB_SYMBOL*
>( aSymbol )->GetGraphicalPins( 0, 0 );
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" ) )
394 wxFileName fn( filestring );
401 m_rootSheet->SearchHierarchy( fn.GetFullPath(), &existingScreen );
406 if( !existingScreen )
412 wxFileName screenFn( screen->GetFileName() );
413 wxFileName checkFn( fn.GetFullPath() );
415 if( screenFn.GetName().IsSameAs( checkFn.GetName(),
false ) )
417 existingScreen = screen;
429 wxFileName kicad_fn( fn );
430 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
432 sheet->SetScreen( screen );
439 sheet->SetFileName( kicad_fn.GetFullName() );
442 wxCHECK2( sheet && screen,
continue );
444 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
453 if( sheet->GetName().Trim().empty() )
455 wxString baseName = wxFileName( fn ).GetName();
456 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
458 wxString sheetName = baseName;
459 std::set<wxString> existingNames;
461 for(
auto& [
path, existing] : sheets )
462 existingNames.insert( existing->GetName() );
464 for(
int ii = 1; existingNames.count( sheetName ); ++ii )
465 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
467 sheet->SetName( sheetName );
475 wxCHECK2( currentScreen,
continue );
479 currentScreen->
Append( sheetPtr );
482 sheets[kicad_fn.GetFullPath()] = sheetPtr;
496 for(
auto& [ filestring, sheet ] : sheets )
508 const std::map<std::string, UTF8>* aProperties )
510 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
512 wxFileName fileName( aFileName );
520 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
524 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
530 m_rootSheet->SetFileName( fileName.GetFullPath() );
535 if( aFileName.empty() )
558 if( !aFileName.empty() )
565 wxCHECK( rootScreen,
nullptr );
574 if( aFileName.empty() )
579 if( aFileName.empty() )
581 std::vector<SCH_SHEET*> topLevelSheets;
589 topLevelSheets.push_back( sheet );
595 rootScreen->
Remove( sheet );
597 if( !topLevelSheets.empty() )
609 std::vector<SCH_HIERLABEL*> hierLabels;
617 hierLabel->GetText() );
618 globalLabel->
SetShape( hierLabel->GetShape() );
622 screen->
Remove( hierLabel );
623 screen->
Append( globalLabel );
644 if( aProperties && aProperties->count(
"project_file" ) )
648 if( !variants.empty() )
654 std::vector<std::pair<wxString, const ALTIUM_VARIANT_ENTRY*>>;
656 std::map<wxString, ENTRY_LIST> variantsByUid;
657 std::map<wxString, ENTRY_LIST> variantsByDesignator;
663 if( !pv.description.empty() && pv.description != pv.name )
664 m_schematic->SetVariantDescription( pv.name, pv.description );
669 variantsByUid[entry.
uniqueId].push_back( { pv.name, &entry } );
671 variantsByDesignator[entry.
designator].push_back( { pv.name, &entry } );
688 ENTRY_LIST applicable;
690 const ENTRY_LIST* uidEntries =
nullptr;
695 auto varIt = variantsByUid.find( symUidIt->second );
697 if( varIt != variantsByUid.end() )
698 uidEntries = &varIt->second;
701 if( uidEntries && uidEntries->size() == 1 )
703 applicable = *uidEntries;
705 else if( uidEntries )
711 for(
const auto& namedEntry : *uidEntries )
713 if( namedEntry.second->designator == ref )
714 applicable.push_back( namedEntry );
720 auto varIt = variantsByDesignator.find( ref );
722 if( varIt != variantsByDesignator.end() )
723 applicable = varIt->second;
726 if( applicable.empty() )
729 for(
const auto& [variantName, entry] : applicable )
734 if( entry->kind == 1 )
736 variant.
m_DNP =
true;
740 else if( entry->kind == 0 )
742 for(
const auto& [key, value] : entry->alternateFields )
744 if( key.CmpNoCase( wxS(
"LibReference" ) ) == 0 )
745 variant.
m_Fields[wxS(
"Value" )] = value;
746 else if( key.CmpNoCase( wxS(
"Description" ) ) == 0 )
747 variant.
m_Fields[wxS(
"Description" )] = value;
748 else if( key.CmpNoCase( wxS(
"Footprint" ) ) == 0 )
749 variant.
m_Fields[wxS(
"Footprint" )] = value;
763 int minWireWidth = std::numeric_limits<int>::max();
764 int minBusWidth = std::numeric_limits<int>::max();
768 std::vector<SCH_MARKER*> markers;
775 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
778 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
782 std::shared_ptr<NET_SETTINGS>& netSettings =
m_schematic->Project().GetProjectFile().NetSettings();
784 if( minWireWidth < std::numeric_limits<int>::max() )
785 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
787 if( minBusWidth < std::numeric_limits<int>::max() )
788 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
811 std::vector<SCH_LINE*> busLines;
812 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
820 busLines.push_back( line );
822 busLineMap[ line->
GetEndPoint() ].push_back( line );
829 auto it = busLineMap.find( aStart );
831 if( it == busLineMap.end() )
837 if( aVisited.count( line ) )
840 aVisited.insert( line );
861 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>();
862 alias->SetName( harness.m_name );
865 alias->AddMember( port.
m_name );
870 BOX2I box( harness.m_location, harness.m_size );
900 int delta_x =
center.x - pos.
x;
901 int delta_y =
center.y - pos.
y;
908 screen->
Append( busLine );
915 screen->
Append( busLine );
925 std::set<SCH_LINE*> visited;
926 SCH_LABEL* label = walkBusLine( pos, visited );
933 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
934 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
951 bool isVertical =
true;
953 if( harness.m_ports.size() > 1 )
955 VECTOR2I first = harness.m_ports.front().m_location;
956 VECTOR2I last = harness.m_ports.back().m_location;
958 if( first.
y == last.
y )
964 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
965 VECTOR2I top = harness.m_ports.front().m_entryLocation;
1030 wxFileName parentFileName( aFileName );
1037 wxFileName relative = parentFileName;
1040 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
1058 catch(
const CFB::CFBException& exception )
1062 catch(
const std::exception& exc )
1064 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium schematic: %s" ), exc.what() ) );
1073 wxCHECK( currentScreen, );
1081 wxCHECK2( sheet,
continue );
1085 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
1087 if( !loadAltiumFileName.IsFileReadable() )
1091 if( !loadAltiumFileName.HasExt() )
1093 wxFileName withExt( loadAltiumFileName );
1094 withExt.SetExt( wxT(
"SchDoc" ) );
1096 if( withExt.IsFileReadable() )
1097 loadAltiumFileName = withExt;
1101 if( !loadAltiumFileName.IsFileReadable() )
1106 bool extensionless = !sheetFn.HasExt();
1108 wxArrayString files;
1109 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
1110 wxDIR_FILES | wxDIR_HIDDEN );
1112 for(
const wxString& candidate : files )
1114 wxFileName candidateFname( candidate );
1116 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false )
1118 && !sheetFn.GetName().empty()
1119 && candidateFname.GetName().IsSameAs( sheetFn.GetName(),
false )
1120 && candidateFname.GetExt().IsSameAs( wxT(
"SchDoc" ),
false ) ) )
1122 loadAltiumFileName = candidateFname;
1128 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
1130 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
1131 "this is probably an Altium signal harness "
1132 "that got converted to a sheet." ),
1139 m_rootSheet->SearchHierarchy( loadAltiumFileName.GetFullPath(), &loadedScreen );
1145 wxFileName projectFileName = loadAltiumFileName;
1146 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1148 sheet->
SetFileName( projectFileName.GetFullName() );
1168 if( baseRef.StartsWith( wxT(
"#" ) ) )
1175 wxString newRef = baseRef + wxT(
"_" ) + sheet->
GetName();
1187 if( sheet->
GetName().Trim().empty() )
1189 wxString baseName = loadAltiumFileName.GetName();
1190 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
1192 wxString sheetName = baseName;
1193 std::set<wxString> sheetNames;
1198 sheetNames.insert( otherSheet->
GetName() );
1201 for(
int ii = 1; ; ++ii )
1203 if( sheetNames.find( sheetName ) == sheetNames.end() )
1206 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
1212 wxCHECK2( screen,
continue );
1219 wxFileName projectFileName = loadAltiumFileName;
1220 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1222 sheet->
SetFileName( projectFileName.GetFullName() );
1223 screen->
SetFileName( projectFileName.GetFullPath() );
1233 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
1235 if( file ==
nullptr )
1240 std::map<wxString, wxString> properties = reader.
ReadProperties();
1247 for(
int i = 0; i < weight; i++ )
1257 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
1266 wxString streamName = wxS(
"Additional" );
1268 const CFB::COMPOUND_FILE_ENTRY* file =
1269 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1271 if( file ==
nullptr )
1278 THROW_IO_ERROR(
"Additional section does not contain any data" );
1282 std::map<wxString, wxString> properties = reader.
ReadProperties();
1293 std::map<wxString, wxString> properties = reader.
ReadProperties();
1317 wxString streamName = wxS(
"FileHeader" );
1319 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1321 if( file ==
nullptr )
1332 std::map<wxString, wxString> properties = reader.
ReadProperties();
1336 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1349 std::map<wxString, wxString> properties = reader.
ReadProperties();
1361 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1371 symbol.second->SetLibSymbol( libSymbolIt->second );
1408 while( storageReader.
CanRead() )
1410 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1413 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1427 std::map<wxString, wxString> properties = reader.
ReadProperties();
1431 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1446 std::map<wxString, wxString> properties = reader.
ReadProperties();
1449 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1455 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1468 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1478 symbol.second->SetLibSymbol( libSymbolIt->second );
1518 const wxString& aSectionName )
1714 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1731 if( file.filename.IsSameAs( aFilename ) )
1734 if( file.filename.EndsWith( aFilename ) )
1735 nonExactMatch = &file;
1738 return nonExactMatch;
1745 wxCHECK( currentSheet, );
1747 wxString sheetName = currentSheet->
GetName();
1749 if( sheetName.IsEmpty() )
1750 sheetName = wxT(
"root" );
1758 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
1759 "replaced with symbol \"%s\"." ),
1771 wxString
name = wxString::Format(
"%s_%d%s_%s_%s",
1791 std::vector<wxString> bodyStyleNames;
1794 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
1807 field.SetVisible(
false );
1848 screen->
Append( symbol );
1860 wxCHECK( currentSheet, );
1862 wxString sheetName = currentSheet->
GetName();
1864 if( sheetName.IsEmpty() )
1865 sheetName = wxT(
"root" );
1870 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
1872 if( baseName.IsEmpty() )
1873 baseName = wxS(
"Template" );
1881 std::vector<LIB_SYMBOL*>& aSymbol )
1885 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
1895 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
1901 schSymbol =
m_symbols.at( libSymbolIt->first );
1902 symbol = libSymbolIt->second;
1918 if( !aSymbol.empty() )
1936 pin->SetVisible(
false );
1939 pin->SetNumberTextSize( 0 );
1942 pin->SetNameTextSize( 0 );
1980 VECTOR2I dir = bodyEnd - pinLocation;
1988 pin->SetPosition( pinLocation );
2086 int vjustify, hjustify;
2089 switch( justification )
2112 switch( justification )
2135 switch( orientation )
2158 text->SetTextAngle( angle );
2228 int nRenderRotations = ( aSymbol.
orientation + 1 ) % 4;
2242 for(
int i = 0; i < nRenderRotations; i++ )
2262 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
2268 static const std::map<wxString, wxString> variableMap = {
2269 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
2270 {
"SHEETNUMBER",
"#" },
2271 {
"SHEETTOTAL",
"##" },
2272 {
"TITLE",
"TITLE" },
2273 {
"REVISION",
"REVISION" },
2274 {
"DATE",
"ISSUE_DATE" },
2275 {
"CURRENTDATE",
"CURRENT_DATE" },
2276 {
"COMPANYNAME",
"COMPANY" },
2277 {
"DOCUMENTNAME",
"FILENAME" },
2278 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
2279 {
"PROJECTNAME",
"PROJECTNAME" },
2287 size_t fontId =
static_cast<int>( elem.
fontId );
2304 screen->
Append( textItem );
2308 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2323 symbol = libSymbolIt->second;
2324 schsym =
m_symbols.at( libSymbolIt->first );
2333 if( !aSymbol.empty() )
2362 size_t fontId = elem.
fontId;
2373 else if( fontId > 0 && fontId <= aFontSizes.size() )
2375 int size = aFontSizes[fontId - 1];
2383 std::vector<LIB_SYMBOL*>& aSymbol,
2384 std::vector<int>& aFontSizes )
2411 textBox->
SetStart( sheetTopRight );
2412 textBox->
SetEnd( sheetBottomLeft );
2442 size_t fontId =
static_cast<int>( aElem->
FontID );
2460 screen->
Append( textBox );
2465 std::vector<int>& aFontSizes )
2467 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2482 symbol = libSymbolIt->second;
2483 schsym =
m_symbols.at( libSymbolIt->first );
2493 if( !aSymbol.empty() )
2546 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2548 int size = aFontSizes[aElem->
FontID - 1];
2555 std::vector<LIB_SYMBOL*>& aSymbol )
2559 if( elem.
points.size() < 2 )
2561 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2562 static_cast<int>( elem.
points.size() ) ),
2570 wxCHECK( currentScreen, );
2572 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2574 if( i + 2 == elem.
points.size() )
2585 currentScreen->
Append( line );
2590 std::vector<VECTOR2I> bezierPoints;
2591 std::vector<VECTOR2I> polyPoints;
2593 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2594 bezierPoints.push_back( elem.
points.at( j ) );
2597 converter.
GetPoly( polyPoints );
2599 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2608 currentScreen->
Append( line );
2615 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2625 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2631 symbol = libSymbolIt->second;
2632 schsym =
m_symbols.at( libSymbolIt->first );
2639 if( !aSymbol.empty() )
2652 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2654 if( i + 2 == elem.
points.size() )
2665 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2677 else if( i + 3 == elem.
points.size() )
2691 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2714 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2723 case 0: bezier->
SetStart( pos );
break;
2726 case 3: bezier->
SetEnd( pos );
break;
2740 std::vector<LIB_SYMBOL*>& aSymbol )
2744 if( elem.
Points.size() < 2 )
2752 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2769 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2779 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2785 symbol = libSymbolIt->second;
2786 schsym =
m_symbols.at( libSymbolIt->first );
2796 if( !aSymbol.empty() )
2827 std::vector<LIB_SYMBOL*>& aSymbol )
2850 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2860 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2866 symbol = libSymbolIt->second;
2867 schsym =
m_symbols.at( libSymbolIt->first );
2877 if( !aSymbol.empty() )
2920 std::vector<LIB_SYMBOL*>& aSymbol )
2942 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2952 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
2958 symbol = libSymbolIt->second;
2959 schsym =
m_symbols.at( libSymbolIt->first );
2974 int radius = std::min( width / 2, height / 2 );
3008 if( !aSymbol.empty() )
3025 std::vector<LIB_SYMBOL*>& aSymbol )
3033 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3039 wxCHECK( currentScreen, );
3064 currentScreen->
Append( arc );
3069 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3084 symbol = libSymbolIt->second;
3085 schsym =
m_symbols.at( libSymbolIt->first );
3092 if( !aSymbol.empty() )
3113 circle->SetBodyStyle( bodyStyle );
3154 std::vector<LIB_SYMBOL*>& aSymbol )
3168 wxCHECK( currentScreen, );
3174 std::vector<BEZIER<int>> beziers;
3181 schbezier->
SetStart( bezier.Start );
3184 schbezier->
SetEnd( bezier.End );
3188 currentScreen->
Append( schbezier );
3193 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3203 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
3209 symbol = libSymbolIt->second;
3210 schsym =
m_symbols.at( libSymbolIt->first );
3217 if( !aSymbol.empty() )
3234 std::vector<BEZIER<int>> beziers;
3257 schbezier->
SetStart( bezier.Start );
3260 schbezier->
SetEnd( bezier.End );
3271 std::vector<LIB_SYMBOL*>& aSymbol )
3281 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3306 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3316 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
3322 symbol = libSymbolIt->second;
3323 schsym =
m_symbols.at( libSymbolIt->first );
3333 if( !aSymbol.empty() )
3365 std::vector<LIB_SYMBOL*>& aSymbol )
3390 std::vector<BEZIER<int>> beziers;
3391 std::vector<VECTOR2I> polyPoints;
3398 schbezier->
SetStart( bezier.Start );
3401 schbezier->
SetEnd( bezier.End );
3407 screen->
Append( schbezier );
3409 polyPoints.push_back( bezier.Start );
3419 for(
const VECTOR2I& point : polyPoints )
3422 schpoly->
AddPoint( polyPoints[0] );
3424 screen->
Append( schpoly );
3429 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3444 symbol = libSymbolIt->second;
3445 schsym =
m_symbols.at( libSymbolIt->first );
3452 if( !aSymbol.empty() )
3468 std::vector<BEZIER<int>> beziers;
3469 std::vector<VECTOR2I> polyPoints;
3484 libbezier->
SetStart( bezier.Start );
3487 libbezier->
SetEnd( bezier.End );
3501 polyPoints.push_back( libbezier->
GetStart() );
3515 for(
const VECTOR2I& point : polyPoints )
3518 libline->
AddPoint( polyPoints[0] );
3528 std::vector<LIB_SYMBOL*>& aSymbol )
3548 circle->SetFilled(
false );
3554 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3569 symbol = libSymbolIt->second;
3570 schsym =
m_symbols.at( libSymbolIt->first );
3581 if( !aSymbol.empty() )
3607 std::vector<LIB_SYMBOL*>& aSymbol )
3627 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3642 symbol = libSymbolIt->second;
3643 schsym =
m_symbols.at( libSymbolIt->first );
3653 if( !aSymbol.empty() )
3692 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3705 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3712 wxString>& aProperties )
3721 HARNESS& harness = it->second;
3749 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3763 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3769 HARNESS& harness = harnessIt->second;
3806 harness.
m_ports.emplace_back( port );
3818 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3824 HARNESS& harness = harnessIt->second;
3830 std::vector<LIB_SYMBOL*>& aSymbol )
3845 rect->
SetEnd( sheetBottomLeft );
3854 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3864 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
3870 symbol = libSymbolIt->second;
3871 schsym =
m_symbols.at( libSymbolIt->first );
3881 if( !aSymbol.empty() )
3897 rect->
SetEnd( sheetBottomLeft );
3925 wxCHECK( currentScreen, );
3926 currentScreen->
Append( sheet );
3935 wxCHECK( rootScreen, );
3943 m_sheets.insert( { aIndex, sheet } );
3961 sheetIt->second->AddPin( sheetPin );
3963 wxString pinName = elem.
name;
3966 pinName += wxT(
"{" ) + elem.
harnessType + wxT(
"}" );
3973 VECTOR2I pos = sheetIt->second->GetPosition();
3974 VECTOR2I size = sheetIt->second->GetSize();
4211 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
4236 wxString symName( elem.
text );
4237 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
4239 if( !styleName.empty() )
4240 symName <<
'_' << styleName;
4249 libSymbol = powerSymbolIt->second;
4255 libSymbol->
SetName( symName );
4260 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
4270 pin->SetPosition( { 0, 0 } );
4271 pin->SetLength( 0 );
4273 pin->SetVisible(
false );
4330 screen->
Append( symbol );
4358 switch( aElem.
Style )
4388 bool connectionFound = startIsWireTerminal
4389 || startIsBusTerminal
4390 || endIsWireTerminal
4391 || endIsBusTerminal;
4393 if( !connectionFound )
4397 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
4400 BOX2I bbox( harness.m_location, harness.m_size );
4405 startIsBusTerminal =
true;
4406 connectionFound =
true;
4412 endIsBusTerminal =
true;
4413 connectionFound =
true;
4418 if( !connectionFound )
4426 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
4429 wxString labelName = aElem.
Name;
4432 labelName += wxT(
"{" ) + aElem.
HarnessType + wxT(
"}" );
4455 switch( aElem.
Style )
4462 if( ( startIsWireTerminal || startIsBusTerminal ) )
4473 if( ( startIsWireTerminal || startIsBusTerminal ) )
4487 if( ( startIsWireTerminal && endIsWireTerminal ) )
4495 else if( startIsBusTerminal && endIsBusTerminal )
4518 screen->
Append( noConnect );
4546 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4565 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4587 screen->
Append( junction );
4599 && component->second.currentpartid != elem.
ownerpartid )
4603 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
4615 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file %s not found in storage." ),
4621 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4624 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4625 wxZlibInputStream zlibInputStream( fileStream );
4626 wxFFileOutputStream outputStream( storagePath );
4627 outputStream.Write( zlibInputStream );
4628 outputStream.Close();
4632 m_errorMessages.emplace( wxString::Format(
_(
"Error reading image %s." ), storagePath ),
4638 wxRemoveFile( storagePath );
4642 if( !wxFileExists( elem.
filename ) )
4660 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4661 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4664 bitmap->SetFlags(
IS_NEW );
4665 screen->
Append( bitmap.release() );
4671 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4723 wxCHECK( currentScreen, );
4729 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4735 wxString baseName = elem.
text;
4736 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
4738 wxString sheetName = baseName;
4739 std::set<wxString> sheetNames;
4744 sheetNames.insert( sheet->
GetName() );
4747 for(
int ii = 1; ; ++ii )
4749 if( sheetNames.find( sheetName ) == sheetNames.end() )
4752 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
4758 sheetNameField->
SetText( sheetName );
4772 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4798 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4812 bool emptyRef = elem.
text.IsEmpty();
4817 bool visible = !emptyRef;
4834 std::vector<LIB_SYMBOL*>& aSymbol,
4835 std::vector<int>& aFontSizes )
4844 bool emptyRef = elem.
text.IsEmpty();
4845 SCH_FIELD& refField = symbol->GetReferenceField();
4848 refField.
SetText( wxT(
"X" ) );
4855 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
4857 int size = aFontSizes[elem.
fontId - 1];
4874 busWireEntry->
SetSize( { vector.
x, vector.
y } );
4877 screen->
Append( busWireEntry );
4886 static const std::map<wxString, wxString> variableMap = {
4887 {
"COMMENT",
"VALUE" },
4888 {
"VALUE",
"ALTIUM_VALUE" },
4894 if( elem.
text ==
"*" )
4897 wxString paramName = elem.
name.Upper();
4899 if( paramName ==
"SHEETNUMBER" )
4903 else if( paramName ==
"TITLE" )
4907 else if( paramName ==
"REVISION" )
4911 else if( paramName ==
"DATE" )
4915 else if( paramName ==
"COMPANYNAME" )
4936 wxString upperName = elem.
name.Upper();
4938 if( upperName ==
"COMMENT" )
4944 wxString fieldName = elem.
name.Upper();
4946 if( fieldName.IsEmpty() )
4948 int disambiguate = 1;
4952 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
4954 if( !symbol->
GetField( fieldName ) )
4958 else if( fieldName ==
"VALUE" )
4960 fieldName =
"ALTIUM_VALUE";
4982 std::vector<LIB_SYMBOL*>& aSymbol,
4983 std::vector<int>& aFontSizes )
5007 std::map<wxString, wxString> variableMap = {
5008 {
"COMMENT",
"VALUE" },
5014 wxString upperName = elem.
name.Upper();
5016 if( upperName ==
"COMMENT" )
5018 field = &libSymbol->GetValueField();
5022 wxString fieldNameStem = elem.
name;
5023 wxString fieldName = fieldNameStem;
5024 int disambiguate = 1;
5026 if( fieldName.IsEmpty() )
5028 fieldNameStem =
"ALTIUM_UNNAMED";
5029 fieldName =
"ALTIUM_UNNAMED_1";
5032 else if( upperName ==
"VALUE" )
5034 fieldNameStem =
"ALTIUM_VALUE";
5035 fieldName =
"ALTIUM_VALUE";
5039 while( libSymbol->GetField( fieldName ) )
5040 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
5043 libSymbol->AddField( new_field );
5054 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
5056 int size = aFontSizes[elem.
fontId - 1];
5070 const std::map<wxString, wxString>& aProperties )
5079 std::vector<LIB_SYMBOL*>& aSymbol )
5083 if( elem.
type != wxS(
"PCBLIB" ) )
5087 if( aSymbol.size() == 0 && !elem.
isCurrent )
5093 wxArrayString fpFilters;
5094 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
5097 if( !aSymbol.empty() )
5103 symbol->SetFPFilters( fpFilters );
5114 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
5120 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
5124 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
5125 implementationOwnerIt->second ),
5132 libSymbolIt->second->SetFPFilters( fpFilters );
5142 wxString>& aProperties )
5159 std::vector<wxString> bodyStyleNames;
5162 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
5175 std::vector<int> fontSizes;
5176 struct SYMBOL_PIN_FRAC
5185 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
5187 for(
auto& [
name, entry] : syms )
5189 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
5191 if( entry.m_pinsFrac )
5193 auto parse_binary_pin_frac =
5194 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5196 std::map<wxString, wxString>
result;
5202 SYMBOL_PIN_FRAC pinFrac;
5206 pinFrac.len_frac = binreader.
ReadInt32();
5207 pinFracs.insert( { pinFracData.first, pinFrac } );
5219 std::vector<LIB_SYMBOL*> symbols;
5226 std::map<wxString, wxString> properties = reader.
ReadProperties();
5231 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
5236 auto handleBinaryPinLambda =
5237 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5239 std::map<wxString, wxString>
result;
5243 int32_t recordId = binreader.
ReadInt32();
5248 result[
"RECORD"] = wxString::Format(
"%d", recordId );
5250 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5251 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5252 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5253 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5254 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5255 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5258 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
5259 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5260 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5261 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5262 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5268 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
5270 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
5271 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
5272 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
5276 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
5278 if( partSeqSplit.size() == 3 )
5280 result[
"PART"] = partSeqSplit[0];
5281 result[
"SEQ"] = partSeqSplit[2];
5289 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
5291 if( properties.empty() )
5340 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
5360 if( valField.
GetText().IsEmpty() )
5373 wxFileName fn( aLibraryPath );
5375 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
5376 return fn.GetModificationTime().GetValue().GetValue();
5383 const std::map<std::string, UTF8>* aProperties )
5396 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
5398 wxFileName fileName( aLibraryPath );
5403 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
5407 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
5409 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
5413 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
5415 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
5417 for(
const auto& [schLibName, cfe] : schLibFiles )
5419 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
5421 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
5422 compoundFiles.emplace_back( std::move( decodedStream ) );
5428 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
5431 cacheMapRef.insert( parsed.begin(), parsed.end() );
5436 catch(
const CFB::CFBException& exception )
5440 catch(
const std::exception& exc )
5442 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium library: %s" ), exc.what() ) );
5448 std::vector<int>& aFontSizes )
5450 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
5452 if( file ==
nullptr )
5460 std::map<wxString, wxString> properties = reader.
ReadProperties();
5464 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
5465 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
5467 for(
auto& [key, value] : properties )
5469 wxString upperKey = key.Upper();
5472 if( upperKey.StartsWith(
"SIZE", &remaining ) )
5474 if( !remaining.empty() )
5476 int ind = wxAtoi( remaining );
5478 if(
static_cast<int>( aFontSizes.size() ) < ind )
5479 aFontSizes.resize( ind );
5482 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
5483 aFontSizes[ind - 1] = scaled;
5491 const std::map<std::string, UTF8>* aProperties,
5492 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
5496 bool powerSymbolsOnly = ( aProperties &&
5503 for(
auto& [libnameStr, libSymbol] : it->second )
5505 if( powerSymbolsOnly && !libSymbol->IsPower() )
5508 aInserter( libnameStr, libSymbol );
5515 const std::map<std::string, UTF8>* aProperties )
5520 aSymbolNameList.Add( aStr );
5526 const wxString& aLibraryPath,
5527 const std::map<std::string, UTF8>* aProperties )
5532 aSymbolList.emplace_back( aSymbol );
5538 const std::map<std::string, UTF8>* aProperties )
5546 auto it2 = it->second.find( aAliasName );
5548 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.
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,...
const EDA_ANGLE & GetTextAngle() const
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)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
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.