55#include <compoundfilereader.h>
65#include <wx/mstream.h>
66#include <wx/zstream.h>
67#include <wx/wfstream.h>
68#include <magic_enum.hpp>
74#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
75 0.94901960784313721, \
76 0.98431372549019602, 1.0 )
78#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
79 0.61960784313725492, \
80 0.78823529411764703, 1.0 )
98 int red = color & 0x0000FF;
99 int green = ( color & 0x00FF00 ) >> 8;
100 int blue = ( color & 0xFF0000 ) >> 16;
172 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
209 else if( elem.
AreaColor == aStrokeColor )
215 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
260 for(
auto& [
name, symbol] : lib )
312 std::vector<SCH_PIN*> pins;
315 pins =
static_cast<SCH_SYMBOL*
>( aSymbol )->GetPins(
nullptr );
317 pins =
static_cast<LIB_SYMBOL*
>( aSymbol )->GetGraphicalPins( 0, 0 );
320 bool names_visible =
false;
321 bool numbers_visible =
false;
325 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
326 names_visible =
true;
328 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
329 numbers_visible =
true;
340 if( !numbers_visible )
389 std::map<wxString, SCH_SHEET*> sheets;
390 wxFileName
project( aProperties->at(
"project_file" ) );
392 for(
auto& [ key, filestring] : *aProperties )
394 if( !key.starts_with(
"sch" ) )
397 wxFileName fn( filestring );
404 m_rootSheet->SearchHierarchy( fn.GetFullPath(), &existingScreen );
409 if( !existingScreen )
415 wxFileName screenFn( screen->GetFileName() );
416 wxFileName checkFn( fn.GetFullPath() );
418 if( screenFn.GetName().IsSameAs( checkFn.GetName(),
false ) )
420 existingScreen = screen;
432 wxFileName kicad_fn( fn );
433 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
435 sheet->SetScreen( screen );
442 sheet->SetFileName( kicad_fn.GetFullName() );
445 wxCHECK2( sheet && screen,
continue );
447 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
456 if( sheet->GetName().Trim().empty() )
458 std::set<wxString> existingNames;
460 for(
auto& [
path, existing] : sheets )
461 existingNames.insert( existing->GetName() );
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;
1034 if( aText.Contains( wxT(
" " ) ) || aText.Contains( wxT(
"," ) ) )
1035 return wxT(
"{\"" ) + aText + wxT(
"\"}" );
1037 return wxT(
"{" ) + aText + wxT(
"}" );
1043 wxString baseName = wxFileName( aFilename ).GetName();
1044 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
1046 if( baseName.Trim().empty() )
1047 baseName = wxT(
"Sheet" );
1049 wxString sheetName = baseName;
1051 for(
int ii = 1; aExistingNames.count( sheetName ); ++ii )
1052 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
1063 bool hasBusLines =
false;
1081 std::vector<SCH_LABEL*> labelsToWrap;
1096 labelsToWrap.push_back( label );
1112 std::set<wxString> existingNames;
1118 if( !sheet->
GetName().Trim().empty() )
1119 existingNames.insert( sheet->
GetName() );
1122 for(
auto& [idx, sheet] :
m_sheets )
1124 if( !sheet->GetName().Trim().empty() )
1128 wxString filename = filenameField ? filenameField->
GetText() : wxString();
1131 sheet->SetName( sheetName );
1132 existingNames.insert( sheetName );
1140 wxFileName parentFileName( aFileName );
1147 wxFileName relative = parentFileName;
1150 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
1168 catch(
const CFB::CFBException& exception )
1172 catch(
const std::exception& exc )
1174 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium schematic: %s" ), exc.what() ) );
1183 wxCHECK( currentScreen, );
1191 wxCHECK2( sheet,
continue );
1195 wxFileName loadAltiumFileName( parentFileName.GetPath(), sheet->
GetFileName() );
1197 if( !loadAltiumFileName.IsFileReadable() )
1201 if( !loadAltiumFileName.HasExt() )
1203 wxFileName withExt( loadAltiumFileName );
1204 withExt.SetExt( wxT(
"SchDoc" ) );
1206 if( withExt.IsFileReadable() )
1207 loadAltiumFileName = withExt;
1211 if( !loadAltiumFileName.IsFileReadable() )
1216 bool extensionless = !sheetFn.HasExt();
1218 wxArrayString files;
1219 wxDir::GetAllFiles( parentFileName.GetPath(), &files, wxEmptyString,
1220 wxDIR_FILES | wxDIR_HIDDEN );
1222 for(
const wxString& candidate : files )
1224 wxFileName candidateFname( candidate );
1226 if( candidateFname.GetFullName().IsSameAs( sheet->
GetFileName(),
false )
1228 && !sheetFn.GetName().empty()
1229 && candidateFname.GetName().IsSameAs( sheetFn.GetName(),
false )
1230 && candidateFname.GetExt().IsSameAs( wxT(
"SchDoc" ),
false ) ) )
1232 loadAltiumFileName = candidateFname;
1238 if( loadAltiumFileName.GetFullName().IsEmpty() || !loadAltiumFileName.IsFileReadable() )
1240 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
1241 "this is probably an Altium signal harness "
1242 "that got converted to a sheet." ),
1249 m_rootSheet->SearchHierarchy( loadAltiumFileName.GetFullPath(), &loadedScreen );
1255 wxFileName projectFileName = loadAltiumFileName;
1256 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1258 sheet->
SetFileName( projectFileName.GetFullName() );
1278 if( baseRef.StartsWith( wxT(
"#" ) ) )
1285 wxString newRef = baseRef + wxT(
"_" ) + sheet->
GetName();
1297 if( sheet->
GetName().Trim().empty() )
1299 wxString baseName = loadAltiumFileName.GetName();
1300 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
1302 wxString sheetName = baseName;
1303 std::set<wxString> sheetNames;
1308 sheetNames.insert( otherSheet->
GetName() );
1311 for(
int ii = 1; ; ++ii )
1313 if( sheetNames.find( sheetName ) == sheetNames.end() )
1316 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
1322 wxCHECK2( screen,
continue );
1329 wxFileName projectFileName = loadAltiumFileName;
1330 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1332 sheet->
SetFileName( projectFileName.GetFullName() );
1333 screen->
SetFileName( projectFileName.GetFullPath() );
1343 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
1345 if( file ==
nullptr )
1350 std::map<wxString, wxString> properties = reader.
ReadProperties();
1357 for(
int i = 0; i < weight; i++ )
1367 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
1376 wxString streamName = wxS(
"Additional" );
1378 const CFB::COMPOUND_FILE_ENTRY* file =
1379 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1381 if( file ==
nullptr )
1388 THROW_IO_ERROR(
"Additional section does not contain any data" );
1392 std::map<wxString, wxString> properties = reader.
ReadProperties();
1403 std::map<wxString, wxString> properties = reader.
ReadProperties();
1430 wxString streamName = wxS(
"FileHeader" );
1432 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1434 if( file ==
nullptr )
1445 std::map<wxString, wxString> properties = reader.
ReadProperties();
1449 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1462 std::map<wxString, wxString> properties = reader.
ReadProperties();
1474 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1484 symbol.second->SetLibSymbol( libSymbolIt->second );
1527 while( storageReader.
CanRead() )
1529 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1532 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1546 std::map<wxString, wxString> properties = reader.
ReadProperties();
1550 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1565 std::map<wxString, wxString> properties = reader.
ReadProperties();
1568 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1574 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1587 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1597 symbol.second->SetLibSymbol( libSymbolIt->second );
1643 const wxString& aSectionName )
1839 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
1856 if( file.filename.IsSameAs( aFilename ) )
1859 if( file.filename.EndsWith( aFilename ) )
1860 nonExactMatch = &file;
1863 return nonExactMatch;
1870 wxCHECK( currentSheet, );
1872 wxString sheetName = currentSheet->
GetName();
1874 if( sheetName.IsEmpty() )
1875 sheetName = wxT(
"root" );
1883 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
1884 "replaced with symbol \"%s\"." ),
1911 name = wxString::Format(
"%s_%d%s_%s_%s",
1932 std::vector<wxString> bodyStyleNames;
1935 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
1948 field.SetVisible(
false );
1981 screen->
Append( symbol );
1993 wxCHECK( currentSheet, );
1995 wxString sheetName = currentSheet->
GetName();
1997 if( sheetName.IsEmpty() )
1998 sheetName = wxT(
"root" );
2003 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
2005 if( baseName.IsEmpty() )
2006 baseName = wxS(
"Template" );
2014 std::vector<LIB_SYMBOL*>& aSymbol )
2018 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2028 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
2034 schSymbol =
m_symbols.at( libSymbolIt->first );
2035 symbol = libSymbolIt->second;
2051 if( !aSymbol.empty() )
2069 pin->SetVisible(
false );
2072 pin->SetNumberTextSize( 0 );
2075 pin->SetNameTextSize( 0 );
2113 VECTOR2I dir = bodyEnd - pinLocation;
2121 pin->SetPosition( pinLocation );
2219 int vjustify, hjustify;
2222 switch( justification )
2245 switch( justification )
2268 switch( orientation )
2291 text->SetTextAngle( angle );
2361 int nRenderRotations = ( aSymbol.
orientation + 1 ) % 4;
2375 for(
int i = 0; i < nRenderRotations; i++ )
2395 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
2401 static const std::map<wxString, wxString> variableMap = {
2402 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
2403 {
"SHEETNUMBER",
"#" },
2404 {
"SHEETTOTAL",
"##" },
2405 {
"TITLE",
"TITLE" },
2406 {
"REVISION",
"REVISION" },
2407 {
"DATE",
"ISSUE_DATE" },
2408 {
"CURRENTDATE",
"CURRENT_DATE" },
2409 {
"COMPANYNAME",
"COMPANY" },
2410 {
"DOCUMENTNAME",
"FILENAME" },
2411 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
2412 {
"PROJECTNAME",
"PROJECTNAME" },
2420 size_t fontId =
static_cast<int>( elem.
fontId );
2437 screen->
Append( textItem );
2441 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2456 symbol = libSymbolIt->second;
2457 schsym =
m_symbols.at( libSymbolIt->first );
2466 if( !aSymbol.empty() )
2495 size_t fontId = elem.
fontId;
2506 else if( fontId > 0 && fontId <= aFontSizes.size() )
2508 int size = aFontSizes[fontId - 1];
2516 std::vector<LIB_SYMBOL*>& aSymbol,
2517 std::vector<int>& aFontSizes )
2544 textBox->
SetStart( sheetTopRight );
2545 textBox->
SetEnd( sheetBottomLeft );
2575 size_t fontId =
static_cast<int>( aElem->
FontID );
2593 screen->
Append( textBox );
2598 std::vector<int>& aFontSizes )
2600 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2615 symbol = libSymbolIt->second;
2616 schsym =
m_symbols.at( libSymbolIt->first );
2626 if( !aSymbol.empty() )
2679 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2681 int size = aFontSizes[aElem->
FontID - 1];
2688 std::vector<LIB_SYMBOL*>& aSymbol )
2692 if( elem.
points.size() < 2 )
2694 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2695 static_cast<int>( elem.
points.size() ) ),
2703 wxCHECK( currentScreen, );
2705 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2707 if( i + 2 == elem.
points.size() )
2718 currentScreen->
Append( line );
2723 std::vector<VECTOR2I> bezierPoints;
2724 std::vector<VECTOR2I> polyPoints;
2726 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2727 bezierPoints.push_back( elem.
points.at( j ) );
2730 converter.
GetPoly( polyPoints );
2732 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2741 currentScreen->
Append( line );
2748 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2758 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
2764 symbol = libSymbolIt->second;
2765 schsym =
m_symbols.at( libSymbolIt->first );
2772 if( !aSymbol.empty() )
2785 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2787 if( i + 2 == elem.
points.size() )
2798 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2810 else if( i + 3 == elem.
points.size() )
2824 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
2847 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2856 case 0: bezier->
SetStart( pos );
break;
2859 case 3: bezier->
SetEnd( pos );
break;
2873 std::vector<LIB_SYMBOL*>& aSymbol )
2877 if( elem.
Points.size() < 2 )
2885 for(
size_t i = 1; i < elem.
Points.size(); i++ )
2902 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2912 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
2918 symbol = libSymbolIt->second;
2919 schsym =
m_symbols.at( libSymbolIt->first );
2929 if( !aSymbol.empty() )
2960 std::vector<LIB_SYMBOL*>& aSymbol )
2983 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2993 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
2999 symbol = libSymbolIt->second;
3000 schsym =
m_symbols.at( libSymbolIt->first );
3010 if( !aSymbol.empty() )
3053 std::vector<LIB_SYMBOL*>& aSymbol )
3075 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3085 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
3091 symbol = libSymbolIt->second;
3092 schsym =
m_symbols.at( libSymbolIt->first );
3107 int radius = std::min( width / 2, height / 2 );
3141 if( !aSymbol.empty() )
3158 std::vector<LIB_SYMBOL*>& aSymbol )
3166 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3172 wxCHECK( currentScreen, );
3197 currentScreen->
Append( arc );
3202 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3217 symbol = libSymbolIt->second;
3218 schsym =
m_symbols.at( libSymbolIt->first );
3225 if( !aSymbol.empty() )
3246 circle->SetBodyStyle( bodyStyle );
3287 std::vector<LIB_SYMBOL*>& aSymbol )
3301 wxCHECK( currentScreen, );
3307 std::vector<BEZIER<int>> beziers;
3314 schbezier->
SetStart( bezier.Start );
3317 schbezier->
SetEnd( bezier.End );
3321 currentScreen->
Append( schbezier );
3326 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3336 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
3342 symbol = libSymbolIt->second;
3343 schsym =
m_symbols.at( libSymbolIt->first );
3350 if( !aSymbol.empty() )
3367 std::vector<BEZIER<int>> beziers;
3390 schbezier->
SetStart( bezier.Start );
3393 schbezier->
SetEnd( bezier.End );
3404 std::vector<LIB_SYMBOL*>& aSymbol )
3414 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3439 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3449 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
3455 symbol = libSymbolIt->second;
3456 schsym =
m_symbols.at( libSymbolIt->first );
3466 if( !aSymbol.empty() )
3498 std::vector<LIB_SYMBOL*>& aSymbol )
3523 std::vector<BEZIER<int>> beziers;
3524 std::vector<VECTOR2I> polyPoints;
3531 schbezier->
SetStart( bezier.Start );
3534 schbezier->
SetEnd( bezier.End );
3540 screen->
Append( schbezier );
3542 polyPoints.push_back( bezier.Start );
3552 for(
const VECTOR2I& point : polyPoints )
3555 schpoly->
AddPoint( polyPoints[0] );
3557 screen->
Append( schpoly );
3562 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3577 symbol = libSymbolIt->second;
3578 schsym =
m_symbols.at( libSymbolIt->first );
3585 if( !aSymbol.empty() )
3601 std::vector<BEZIER<int>> beziers;
3602 std::vector<VECTOR2I> polyPoints;
3617 libbezier->
SetStart( bezier.Start );
3620 libbezier->
SetEnd( bezier.End );
3634 polyPoints.push_back( libbezier->
GetStart() );
3648 for(
const VECTOR2I& point : polyPoints )
3651 libline->
AddPoint( polyPoints[0] );
3661 std::vector<LIB_SYMBOL*>& aSymbol )
3681 circle->SetFilled(
false );
3687 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3702 symbol = libSymbolIt->second;
3703 schsym =
m_symbols.at( libSymbolIt->first );
3714 if( !aSymbol.empty() )
3740 std::vector<LIB_SYMBOL*>& aSymbol )
3760 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3775 symbol = libSymbolIt->second;
3776 schsym =
m_symbols.at( libSymbolIt->first );
3786 if( !aSymbol.empty() )
3825 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
3838 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
3845 wxString>& aProperties )
3854 HARNESS& harness = it->second;
3882 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
3896 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
3902 HARNESS& harness = harnessIt->second;
3939 harness.
m_ports.emplace_back( port );
3951 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
3957 HARNESS& harness = harnessIt->second;
3963 std::vector<LIB_SYMBOL*>& aSymbol )
3978 rect->
SetEnd( sheetBottomLeft );
3987 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3997 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
4003 symbol = libSymbolIt->second;
4004 schsym =
m_symbols.at( libSymbolIt->first );
4014 if( !aSymbol.empty() )
4030 rect->
SetEnd( sheetBottomLeft );
4058 wxCHECK( currentScreen, );
4059 currentScreen->
Append( sheet );
4068 wxCHECK( rootScreen, );
4076 m_sheets.insert( { aIndex, sheet } );
4094 sheetIt->second->AddPin( sheetPin );
4096 wxString pinName = elem.
name;
4099 pinName += wxT(
"{" ) + elem.
harnessType + wxT(
"}" );
4106 VECTOR2I pos = sheetIt->second->GetPosition();
4107 VECTOR2I size = sheetIt->second->GetSize();
4344 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
4369 wxString symName( elem.
text );
4370 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
4372 if( !styleName.empty() )
4373 symName <<
'_' << styleName;
4382 libSymbol = powerSymbolIt->second;
4388 libSymbol->
SetName( symName );
4393 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
4403 pin->SetPosition( { 0, 0 } );
4404 pin->SetLength( 0 );
4406 pin->SetVisible(
false );
4463 screen->
Append( symbol );
4491 switch( aElem.
Style )
4521 bool connectionFound = startIsWireTerminal
4522 || startIsBusTerminal
4523 || endIsWireTerminal
4524 || endIsBusTerminal;
4526 if( !connectionFound )
4530 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
4533 BOX2I bbox( harness.m_location, harness.m_size );
4538 startIsBusTerminal =
true;
4539 connectionFound =
true;
4545 endIsBusTerminal =
true;
4546 connectionFound =
true;
4551 if( !connectionFound )
4559 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
4562 wxString labelName = aElem.
Name;
4565 labelName += wxT(
"{" ) + aElem.
HarnessType + wxT(
"}" );
4588 switch( aElem.
Style )
4595 if( ( startIsWireTerminal || startIsBusTerminal ) )
4606 if( ( startIsWireTerminal || startIsBusTerminal ) )
4620 if( ( startIsWireTerminal && endIsWireTerminal ) )
4628 else if( startIsBusTerminal && endIsBusTerminal )
4651 screen->
Append( noConnect );
4679 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4698 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4720 screen->
Append( junction );
4732 && component->second.currentpartid != elem.
ownerpartid )
4736 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
4748 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file '%s' not found in "
4755 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4758 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4759 wxZlibInputStream zlibInputStream( fileStream );
4760 wxFFileOutputStream outputStream( storagePath );
4761 outputStream.Write( zlibInputStream );
4765 const bool writeOk = outputStream.IsOk();
4766 const bool closeOk = outputStream.Close();
4768 if( storagePath.IsEmpty() || !writeOk || !closeOk )
4771 wxString::Format(
_(
"Could not write a temporary file while extracting the "
4772 "embedded image '%s'." ),
4776 if( !storagePath.IsEmpty() )
4777 wxRemoveFile( storagePath );
4793 wxString::Format(
_(
"Failed to read embedded image '%s'. "
4794 "The image data may be corrupt or in an "
4795 "unsupported format." ),
4798 wxRemoveFile( storagePath );
4803 wxRemoveFile( storagePath );
4807 if( !wxFileExists( elem.
filename ) )
4810 wxString::Format(
_(
"Could not find image file '%s'. The file "
4811 "path may be specific to a different operating "
4828 wxString::Format(
_(
"Failed to read image file '%s'. The image "
4829 "may be corrupt or in an unsupported "
4840 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
4841 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
4844 bitmap->SetFlags(
IS_NEW );
4845 screen->
Append( bitmap.release() );
4851 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
4903 wxCHECK( currentScreen, );
4909 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
4915 wxString baseName = elem.
text;
4916 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
4918 wxString sheetName = baseName;
4919 std::set<wxString> sheetNames;
4924 sheetNames.insert( sheet->
GetName() );
4927 for(
int ii = 1; ; ++ii )
4929 if( sheetNames.find( sheetName ) == sheetNames.end() )
4932 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
4938 sheetNameField->
SetText( sheetName );
4952 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
4978 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
4992 bool emptyRef = elem.
text.IsEmpty();
4997 bool visible = !emptyRef;
5014 std::vector<LIB_SYMBOL*>& aSymbol,
5015 std::vector<int>& aFontSizes )
5024 bool emptyRef = elem.
text.IsEmpty();
5025 SCH_FIELD& refField = symbol->GetReferenceField();
5028 refField.
SetText( wxT(
"X" ) );
5035 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
5037 int size = aFontSizes[elem.
fontId - 1];
5054 busWireEntry->
SetSize( { vector.
x, vector.
y } );
5057 screen->
Append( busWireEntry );
5066 static const std::map<wxString, wxString> variableMap = {
5067 {
"COMMENT",
"VALUE" },
5068 {
"VALUE",
"ALTIUM_VALUE" },
5074 if( elem.
text ==
"*" )
5077 wxString paramName = elem.
name.Upper();
5079 if( paramName ==
"SHEETNUMBER" )
5083 else if( paramName ==
"TITLE" )
5087 else if( paramName ==
"REVISION" )
5091 else if( paramName ==
"DATE" )
5095 else if( paramName ==
"COMPANYNAME" )
5116 wxString upperName = elem.
name.Upper();
5118 if( upperName ==
"COMMENT" )
5124 wxString fieldName = elem.
name.Upper();
5126 if( fieldName.IsEmpty() )
5128 int disambiguate = 1;
5132 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
5134 if( !symbol->
GetField( fieldName ) )
5138 else if( fieldName ==
"VALUE" )
5140 fieldName =
"ALTIUM_VALUE";
5162 std::vector<LIB_SYMBOL*>& aSymbol,
5163 std::vector<int>& aFontSizes )
5187 std::map<wxString, wxString> variableMap = {
5188 {
"COMMENT",
"VALUE" },
5194 wxString upperName = elem.
name.Upper();
5196 if( upperName ==
"COMMENT" )
5198 field = &libSymbol->GetValueField();
5202 wxString fieldNameStem = elem.
name;
5203 wxString fieldName = fieldNameStem;
5204 int disambiguate = 1;
5206 if( fieldName.IsEmpty() )
5208 fieldNameStem =
"ALTIUM_UNNAMED";
5209 fieldName =
"ALTIUM_UNNAMED_1";
5212 else if( upperName ==
"VALUE" )
5214 fieldNameStem =
"ALTIUM_VALUE";
5215 fieldName =
"ALTIUM_VALUE";
5219 while( libSymbol->GetField( fieldName ) )
5220 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
5223 libSymbol->AddField( new_field );
5234 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
5236 int size = aFontSizes[elem.
fontId - 1];
5250 const std::map<wxString, wxString>& aProperties )
5259 std::vector<LIB_SYMBOL*>& aSymbol )
5263 if( elem.
type != wxS(
"PCBLIB" ) )
5267 if( aSymbol.size() == 0 && !elem.
isCurrent )
5275 wxArrayString fpFilters;
5276 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
5279 if( !aSymbol.empty() )
5285 symbol->SetFPFilters( fpFilters );
5296 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
5302 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
5306 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
5307 implementationOwnerIt->second ),
5314 libSymbolIt->second->SetFPFilters( fpFilters );
5324 wxString>& aProperties )
5341 std::vector<wxString> bodyStyleNames;
5344 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
5357 std::vector<int> fontSizes;
5358 struct SYMBOL_PIN_FRAC
5367 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
5369 for(
auto& [
name, entry] : syms )
5371 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
5373 if( entry.m_pinsFrac )
5375 auto parse_binary_pin_frac =
5376 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5378 std::map<wxString, wxString>
result;
5384 SYMBOL_PIN_FRAC pinFrac;
5388 pinFrac.len_frac = binreader.
ReadInt32();
5389 pinFracs.insert( { pinFracData.first, pinFrac } );
5401 std::vector<LIB_SYMBOL*> symbols;
5408 std::map<wxString, wxString> properties = reader.
ReadProperties();
5413 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
5418 auto handleBinaryPinLambda =
5419 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5421 std::map<wxString, wxString>
result;
5425 int32_t recordId = binreader.
ReadInt32();
5430 result[
"RECORD"] = wxString::Format(
"%d", recordId );
5432 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5433 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5434 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5435 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5436 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5437 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5440 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
5441 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5442 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5443 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5444 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5450 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
5452 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
5453 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
5454 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
5458 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
5460 if( partSeqSplit.size() == 3 )
5462 result[
"PART"] = partSeqSplit[0];
5463 result[
"SEQ"] = partSeqSplit[2];
5471 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
5473 if( properties.empty() )
5522 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
5542 if( valField.
GetText().IsEmpty() )
5555 wxFileName fn( aLibraryPath );
5557 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
5558 return fn.GetModificationTime().GetValue().GetValue();
5565 const std::map<std::string, UTF8>* aProperties )
5578 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
5580 wxFileName fileName( aLibraryPath );
5585 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
5589 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
5591 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
5595 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
5597 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
5599 for(
const auto& [schLibName, cfe] : schLibFiles )
5601 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
5603 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
5604 compoundFiles.emplace_back( std::move( decodedStream ) );
5610 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
5613 cacheMapRef.insert( parsed.begin(), parsed.end() );
5618 catch(
const CFB::CFBException& exception )
5622 catch(
const std::exception& exc )
5624 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium library: %s" ), exc.what() ) );
5630 std::vector<int>& aFontSizes )
5632 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
5634 if( file ==
nullptr )
5642 std::map<wxString, wxString> properties = reader.
ReadProperties();
5646 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
5647 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
5649 for(
auto& [key, value] : properties )
5651 wxString upperKey = key.Upper();
5654 if( upperKey.StartsWith(
"SIZE", &remaining ) )
5656 if( !remaining.empty() )
5658 int ind = wxAtoi( remaining );
5660 if(
static_cast<int>( aFontSizes.size() ) < ind )
5661 aFontSizes.resize( ind );
5664 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
5665 aFontSizes[ind - 1] = scaled;
5673 const std::map<std::string, UTF8>* aProperties,
5674 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
5678 bool powerSymbolsOnly = ( aProperties &&
5685 for(
auto& [libnameStr, libSymbol] : it->second )
5687 if( powerSymbolsOnly && !libSymbol->IsPower() )
5690 aInserter( libnameStr, libSymbol );
5697 const std::map<std::string, UTF8>* aProperties )
5702 aSymbolNameList.Add( aStr );
5708 const wxString& aLibraryPath,
5709 const std::map<std::string, UTF8>* aProperties )
5714 aSymbolList.emplace_back( aSymbol );
5720 const std::map<std::string, UTF8>* aProperties )
5728 auto it2 = it->second.find( aAliasName );
5730 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.
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.
static bool IsBusLabel(const wxString &aLabel)
Test if aLabel has a bus notation.
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 EnsureSheetSymbolNames()
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 PostProcessBusLabels()
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)
const BOX2I GetBoundingBox() const override
Return the bounding box of the label including its fields.
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)
wxString AltiumDeriveSheetName(const wxString &aFilename, const std::set< wxString > &aExistingNames)
wxString AltiumWrapBusLabel(const wxString &aText)
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.