59#include <compoundfilereader.h>
69#include <wx/mstream.h>
70#include <wx/zstream.h>
71#include <wx/wfstream.h>
72#include <magic_enum.hpp>
78#define HARNESS_PORT_COLOR_DEFAULT_BACKGROUND COLOR4D( 0.92941176470588238, \
79 0.94901960784313721, \
80 0.98431372549019602, 1.0 )
82#define HARNESS_PORT_COLOR_DEFAULT_OUTLINE COLOR4D( 0.56078431372549020, \
83 0.61960784313725492, \
84 0.78823529411764703, 1.0 )
97 wxFileName fn = aFileName;
98 fn.Normalize( wxPATH_NORM_ABSOLUTE | wxPATH_NORM_DOTS | wxPATH_NORM_TILDE | wxPATH_NORM_CASE );
99 return fn.GetFullPath();
115 for(
const wxString& key :
m_keys )
116 m_owner->m_parsingFiles[key]++;
121 for(
const wxString& key :
m_keys )
123 auto it =
m_owner->m_parsingFiles.find( key );
125 if( it !=
m_owner->m_parsingFiles.end() && --it->second <= 0 )
126 m_owner->m_parsingFiles.erase( it );
147 int red = color & 0x0000FF;
148 int green = ( color & 0x00FF00 ) >> 8;
149 int blue = ( color & 0xFF0000 ) >> 16;
221 if( stroke.
GetColor() == default_color || stroke.
GetColor() == alt_default_color )
258 else if( elem.
AreaColor == aStrokeColor )
264 else if( bgcolor.
WithAlpha( 1.0 ) == default_bgcolor )
309 for(
auto& [
name, symbol] : lib )
361 std::vector<SCH_PIN*> pins;
364 pins =
static_cast<SCH_SYMBOL*
>( aSymbol )->GetPins(
nullptr );
366 pins =
static_cast<LIB_SYMBOL*
>( aSymbol )->GetGraphicalPins( 0, 0 );
369 bool names_visible =
false;
370 bool numbers_visible =
false;
374 if(
pin->GetNameTextSize() > 0 && !
pin->GetName().empty() )
375 names_visible =
true;
377 if(
pin->GetNumberTextSize() > 0 && !
pin->GetNumber().empty() )
378 numbers_visible =
true;
389 if( !numbers_visible )
438 std::map<wxString, SCH_SHEET*> sheets;
439 wxFileName
project( aProperties->at(
"project_file" ) );
441 for(
auto& [ key, filestring] : *aProperties )
443 if( !key.starts_with(
"sch" ) )
446 wxFileName fn( filestring );
453 m_rootSheet->SearchHierarchy( fn.GetFullPath(), &existingScreen );
458 if( !existingScreen )
464 wxFileName screenFn( screen->GetFileName() );
465 wxFileName checkFn( fn.GetFullPath() );
467 if( screenFn.GetName().IsSameAs( checkFn.GetName(),
false ) )
469 existingScreen = screen;
481 wxFileName kicad_fn( fn );
482 std::unique_ptr<SCH_SHEET> sheet = std::make_unique<SCH_SHEET>(
m_rootSheet, pos );
484 sheet->SetScreen( screen );
491 sheet->SetFileName( kicad_fn.GetFullName() );
494 wxCHECK2( sheet && screen,
continue );
496 wxString pageNo = wxString::Format( wxT(
"%d" ), page++ );
505 if( sheet->GetName().Trim().empty() )
507 std::set<wxString> existingNames;
509 for(
auto& [
path, existing] : sheets )
510 existingNames.insert( existing->GetName() );
520 wxCHECK2( currentScreen,
continue );
524 currentScreen->
Append( sheetPtr );
527 sheets[kicad_fn.GetFullPath()] = sheetPtr;
541 for(
auto& [ filestring, sheet ] : sheets )
553 const std::map<std::string, UTF8>* aProperties )
555 wxCHECK( ( !aFileName.IsEmpty() || !aProperties->empty() ) && aSchematic,
nullptr );
557 wxFileName fileName( aFileName );
571 std::unique_ptr<SCH_SHEET> deleter( aAppendToMe ?
nullptr :
m_rootSheet );
575 wxCHECK_MSG( aSchematic->
IsValid(),
nullptr,
"Can't append to a schematic with no root!" );
581 m_rootSheet->SetFileName( fileName.GetFullPath() );
586 if( aFileName.empty() )
609 if( !aFileName.empty() )
616 wxCHECK( rootScreen,
nullptr );
625 if( aFileName.empty() )
630 if( aFileName.empty() )
632 std::vector<SCH_SHEET*> topLevelSheets;
640 topLevelSheets.push_back( sheet );
646 rootScreen->
Remove( sheet );
648 if( !topLevelSheets.empty() )
660 std::vector<SCH_HIERLABEL*> hierLabels;
668 hierLabel->GetText() );
669 globalLabel->
SetShape( hierLabel->GetShape() );
673 screen->
Remove( hierLabel );
674 screen->
Append( globalLabel );
698 if( aProperties && aProperties->count(
"project_file" ) )
702 if( !variants.empty() )
708 std::vector<std::pair<wxString, const ALTIUM_VARIANT_ENTRY*>>;
710 std::map<wxString, ENTRY_LIST> variantsByUid;
711 std::map<wxString, ENTRY_LIST> variantsByDesignator;
717 if( !pv.description.empty() && pv.description != pv.name )
718 m_schematic->SetVariantDescription( pv.name, pv.description );
723 variantsByUid[entry.
uniqueId].push_back( { pv.name, &entry } );
725 variantsByDesignator[entry.
designator].push_back( { pv.name, &entry } );
742 ENTRY_LIST applicable;
744 const ENTRY_LIST* uidEntries =
nullptr;
749 auto varIt = variantsByUid.find( symUidIt->second );
751 if( varIt != variantsByUid.end() )
752 uidEntries = &varIt->second;
755 if( uidEntries && uidEntries->size() == 1 )
757 applicable = *uidEntries;
759 else if( uidEntries )
765 for(
const auto& namedEntry : *uidEntries )
767 if( namedEntry.second->designator == ref )
768 applicable.push_back( namedEntry );
774 auto varIt = variantsByDesignator.find( ref );
776 if( varIt != variantsByDesignator.end() )
777 applicable = varIt->second;
780 if( applicable.empty() )
783 for(
const auto& [variantName, entry] : applicable )
788 if( entry->kind == 1 )
790 variant.
m_DNP =
true;
794 else if( entry->kind == 0 )
796 for(
const auto& [key, value] : entry->alternateFields )
798 if( key.CmpNoCase( wxS(
"LibReference" ) ) == 0 )
799 variant.
m_Fields[wxS(
"Value" )] = value;
800 else if( key.CmpNoCase( wxS(
"Description" ) ) == 0 )
801 variant.
m_Fields[wxS(
"Description" )] = value;
802 else if( key.CmpNoCase( wxS(
"Footprint" ) ) == 0 )
803 variant.
m_Fields[wxS(
"Footprint" )] = value;
817 int minWireWidth = std::numeric_limits<int>::max();
818 int minBusWidth = std::numeric_limits<int>::max();
822 std::vector<SCH_MARKER*> markers;
829 minWireWidth = std::min( minWireWidth, line->
GetLineWidth() );
832 minBusWidth = std::min( minBusWidth, line->
GetLineWidth() );
836 std::shared_ptr<NET_SETTINGS>& netSettings =
m_schematic->Project().GetProjectFile().NetSettings();
838 if( minWireWidth < std::numeric_limits<int>::max() )
839 netSettings->GetDefaultNetclass()->SetWireWidth( minWireWidth );
841 if( minBusWidth < std::numeric_limits<int>::max() )
842 netSettings->GetDefaultNetclass()->SetBusWidth( minBusWidth );
865 std::vector<SCH_LINE*> busLines;
866 std::map<VECTOR2I, std::vector<SCH_LINE*>> busLineMap;
874 busLines.push_back( line );
876 busLineMap[ line->
GetEndPoint() ].push_back( line );
883 auto it = busLineMap.find( aStart );
885 if( it == busLineMap.end() )
891 if( aVisited.count( line ) )
894 aVisited.insert( line );
915 std::shared_ptr<BUS_ALIAS> alias = std::make_shared<BUS_ALIAS>();
916 alias->SetName( harness.m_name );
919 alias->AddMember( port.
m_name );
924 BOX2I box( harness.m_location, harness.m_size );
954 int delta_x =
center.x - pos.
x;
955 int delta_y =
center.y - pos.
y;
962 screen->
Append( busLine );
969 screen->
Append( busLine );
979 std::set<SCH_LINE*> visited;
980 SCH_LABEL* label = walkBusLine( pos, visited );
987 if( label && !label->
GetText().StartsWith( wxT(
"{" ) ) )
988 label->
SetText( label->
GetText() + wxT(
"{" ) + harness.m_name + wxT(
"}" ) );
1005 bool isVertical =
true;
1007 if( harness.m_ports.size() > 1 )
1009 VECTOR2I first = harness.m_ports.front().m_location;
1010 VECTOR2I last = harness.m_ports.back().m_location;
1012 if( first.
y == last.
y )
1018 VECTOR2I bottom = harness.m_ports.front().m_entryLocation;
1019 VECTOR2I top = harness.m_ports.front().m_entryLocation;
1092 if( aText.Contains( wxT(
" " ) ) || aText.Contains( wxT(
"," ) ) )
1093 return wxT(
"{\"" ) + aText + wxT(
"\"}" );
1095 return wxT(
"{" ) + aText + wxT(
"}" );
1101 wxString baseName = wxFileName( aFilename ).GetName();
1102 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
1104 if( baseName.Trim().empty() )
1105 baseName = wxT(
"Sheet" );
1107 wxString sheetName = baseName;
1109 for(
int ii = 1; aExistingNames.count( sheetName ); ++ii )
1110 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
1121 bool hasBusLines =
false;
1139 std::vector<SCH_LABEL*> labelsToWrap;
1154 labelsToWrap.push_back( label );
1170 std::set<wxString> existingNames;
1176 if( !sheet->
GetName().Trim().empty() )
1177 existingNames.insert( sheet->
GetName() );
1180 for(
auto& [idx, sheet] :
m_sheets )
1182 if( !sheet->GetName().Trim().empty() )
1186 wxString filename = filenameField ? filenameField->
GetText() : wxString();
1189 sheet->SetName( sheetName );
1190 existingNames.insert( sheetName );
1196 const wxString& aSheetFileName )
const
1198 wxFileName loadAltiumFileName( aParentPath, aSheetFileName );
1200 if( loadAltiumFileName.IsFileReadable() )
1201 return loadAltiumFileName;
1203 if( !loadAltiumFileName.HasExt() )
1205 wxFileName withExt( loadAltiumFileName );
1206 withExt.SetExt( wxT(
"SchDoc" ) );
1208 if( withExt.IsFileReadable() )
1212 wxFileName sheetFn( aSheetFileName );
1213 bool extensionless = !sheetFn.HasExt();
1215 wxArrayString files;
1216 wxDir::GetAllFiles( aParentPath, &files, wxEmptyString, wxDIR_FILES | wxDIR_HIDDEN );
1218 for(
const wxString& candidate : files )
1220 wxFileName candidateFname( candidate );
1222 if( candidateFname.GetFullName().IsSameAs( aSheetFileName,
false )
1224 && !sheetFn.GetName().empty()
1225 && candidateFname.GetName().IsSameAs( sheetFn.GetName(),
false )
1226 && candidateFname.GetExt().IsSameAs( wxT(
"SchDoc" ),
false ) ) )
1228 return candidateFname;
1232 return loadAltiumFileName;
1243 std::map<wxString, std::vector<SCH_SHEET_PATH>> pathsByFile;
1247 if( sheetPath.size() < 2 || !sheetPath.LastScreen() )
1250 wxString sheetFileName = sheetPath.Last()->GetFileName().Lower();
1252 if( sheetFileName.IsEmpty() )
1258 pathsByFile[parentPath.
Path().
AsString() + wxT(
"|" ) + sheetFileName]
1259 .push_back( sheetPath );
1262 for(
auto& [groupKey, sheetPaths] : pathsByFile )
1264 if( sheetPaths.size() < 2 )
1267 std::sort( sheetPaths.begin(), sheetPaths.end(),
1270 const VECTOR2I& firstPos = aFirst.Last()->GetPosition();
1271 const VECTOR2I& secondPos = aSecond.Last()->GetPosition();
1273 if( firstPos.y != secondPos.y )
1274 return firstPos.y < secondPos.y;
1276 return firstPos.x < secondPos.x;
1285 if( sheetPath.GetPageNumber().ToLong( &page ) && page > 0 )
1286 basePage = basePage == 0 ? page : std::min( basePage, page );
1292 nextPage.ToLong( &basePage );
1298 for(
size_t ii = 0; ii < sheetPaths.size(); ++ii )
1302 sheetPath.
SetPageNumber( wxString::Format( wxT(
"%ld" ), basePage + (
long) ii ) );
1309 if( baseRef.StartsWith( wxT(
"#" ) ) )
1315 if( !baseRef.IsEmpty() )
1316 symbol->
SetRef( &sheetPath, baseRef + wxT(
"_" ) + sheetPath.
Last()->
GetName() );
1328 wxFileName parentFileName( aFileName );
1342 wxFileName relative = parentFileName;
1345 m_progressReporter->Report( wxString::Format(
_(
"Importing %s" ), relative.GetFullPath() ) );
1363 catch(
const CFB::CFBException& exception )
1367 catch(
const std::exception& exc )
1369 THROW_IO_ERROR( wxString::Format(
_(
"Error parsing Altium schematic: %s" ), exc.what() ) );
1378 wxCHECK( currentScreen, );
1382 std::vector<SCH_SHEET*> cyclicSheets;
1388 wxCHECK2( sheet,
continue );
1394 wxArrayString tokens = wxSplit( sheet->
GetFileName(),
';' );
1395 std::vector<wxFileName> members;
1396 std::set<wxString> memberKeySet;
1397 bool skippedForRecursion =
false;
1399 for( wxString token : tokens )
1401 token.Trim(
true ).Trim(
false );
1403 if( token.IsEmpty() )
1408 if( resolved.GetFullName().IsEmpty() || !resolved.IsFileReadable() )
1415 skippedForRecursion =
true;
1420 if( memberKeySet.insert( key ).second )
1421 members.push_back( resolved );
1424 if( members.empty() )
1428 if( skippedForRecursion )
1430 cyclicSheets.push_back( sheet );
1434 m_errorMessages.emplace( wxString::Format(
_(
"The file name for sheet %s is undefined, "
1435 "this is probably an Altium signal harness "
1436 "that got converted to a sheet." ),
1449 if( tokens.size() == 1 )
1450 m_rootSheet->SearchHierarchy( members[0].GetFullPath(), &loadedScreen );
1452 wxFileName projectFileName = members[0];
1453 projectFileName.SetPath(
m_schematic->Project().GetProjectPath() );
1459 sheet->
SetFileName( projectFileName.GetFullName() );
1468 wxCHECK2( screen,
continue );
1470 if( sheet->
GetName().Trim().empty() )
1472 std::set<wxString> sheetNames;
1483 std::vector<wxString>( memberKeySet.begin(),
1484 memberKeySet.end() ) );
1488 std::optional<int> nextPageTop;
1490 for(
const wxFileName& member : members )
1492 std::set<const SCH_ITEM*> before;
1495 before.insert( screenItem );
1499 std::vector<SCH_ITEM*> added;
1504 if( !before.count( screenItem ) )
1506 added.push_back( screenItem );
1507 addedBox.
Merge( screenItem->GetBoundingBox() );
1521 addedItem->Move( shift );
1522 screen->
Update( addedItem );
1525 addedBox.
Offset( shift );
1533 sheet->
SetFileName( projectFileName.GetFullName() );
1534 screen->
SetFileName( projectFileName.GetFullPath() );
1556 aScreen->
Append( label );
1565 return !aInstance.m_Path.empty()
1566 && aInstance.m_Path.back() == sheet->m_Uuid;
1577 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"Storage" } );
1579 if( file ==
nullptr )
1584 std::map<wxString, wxString> properties = reader.
ReadProperties();
1591 for(
int i = 0; i < weight; i++ )
1601 m_errorMessages.emplace( wxString::Format(
_(
"Storage file not fully parsed (%d bytes remaining)." ),
1610 wxString streamName = wxS(
"Additional" );
1612 const CFB::COMPOUND_FILE_ENTRY* file =
1613 aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1615 if( file ==
nullptr )
1622 THROW_IO_ERROR(
"Additional section does not contain any data" );
1626 std::map<wxString, wxString> properties = reader.
ReadProperties();
1637 std::map<wxString, wxString> properties = reader.
ReadProperties();
1664 wxString streamName = wxS(
"FileHeader" );
1666 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( { streamName.ToStdString() } );
1668 if( file ==
nullptr )
1679 std::map<wxString, wxString> properties = reader.
ReadProperties();
1683 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Binary File Version 5.0" ) )
1696 std::map<wxString, wxString> properties = reader.
ReadProperties();
1708 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1718 symbol.second->SetLibSymbol( libSymbolIt->second );
1761 while( storageReader.
CanRead() )
1763 std::map<wxString, wxString> properties = storageReader.
ReadProperties();
1766 if( properties.find( wxS(
"BINARY" ) ) != properties.end() )
1780 std::map<wxString, wxString> properties = reader.
ReadProperties();
1784 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Capture Ascii File Version 5.0" ) )
1799 std::map<wxString, wxString> properties = reader.
ReadProperties();
1802 if( properties.find( wxS(
"HEADER" ) ) != properties.end() )
1808 if( properties.find( wxS(
"RECORD" ) ) != properties.end() )
1821 for( std::pair<const int, SCH_SYMBOL*>& symbol :
m_symbols )
1831 symbol.second->SetLibSymbol( libSymbolIt->second );
1877 const wxString& aSectionName )
2073 wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ), recordId,
2090 if( file.filename.IsSameAs( aFilename ) )
2093 if( file.filename.EndsWith( aFilename ) )
2094 nonExactMatch = &file;
2097 return nonExactMatch;
2104 wxCHECK( currentSheet, );
2106 wxString sheetName = currentSheet->
GetName();
2108 if( sheetName.IsEmpty() )
2109 sheetName = wxT(
"root" );
2117 m_errorMessages.emplace( wxString::Format(
_(
"Symbol '%s' in sheet '%s' at index %d "
2118 "replaced with symbol \"%s\"." ),
2145 name = wxString::Format(
"%s_%d%s_%s_%s",
2166 std::vector<wxString> bodyStyleNames;
2169 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
2182 field.SetVisible(
false );
2218 screen->
Append( symbol );
2230 wxCHECK( currentSheet, );
2232 wxString sheetName = currentSheet->
GetName();
2234 if( sheetName.IsEmpty() )
2235 sheetName = wxT(
"root" );
2240 wxString baseName = altiumTemplate.
filename.AfterLast(
'\\' ).BeforeLast(
'.' );
2242 if( baseName.IsEmpty() )
2243 baseName = wxS(
"Template" );
2251 std::vector<LIB_SYMBOL*>& aSymbol )
2255 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2265 m_errorMessages.emplace( wxString::Format( wxT(
"Pin's owner (%d) not found." ),
2271 schSymbol =
m_symbols.at( libSymbolIt->first );
2272 symbol = libSymbolIt->second;
2288 if( !aSymbol.empty() )
2306 pin->SetVisible(
false );
2309 pin->SetNumberTextSize( 0 );
2312 pin->SetNameTextSize( 0 );
2350 VECTOR2I dir = bodyEnd - pinLocation;
2358 pin->SetPosition( pinLocation );
2456 int vjustify, hjustify;
2459 switch( justification )
2482 switch( justification )
2505 switch( orientation )
2528 text->SetTextAngle( angle );
2613 for(
int i = 0; i < nRenderRotations; i++ )
2633 std::vector<LIB_SYMBOL*>& aSymbol, std::vector<int>& aFontSizes )
2639 static const std::map<wxString, wxString> variableMap = {
2640 {
"APPLICATION_BUILDNUMBER",
"KICAD_VERSION" },
2641 {
"SHEETNUMBER",
"#" },
2642 {
"SHEETTOTAL",
"##" },
2643 {
"TITLE",
"TITLE" },
2644 {
"REVISION",
"REVISION" },
2645 {
"DATE",
"ISSUE_DATE" },
2646 {
"CURRENTDATE",
"CURRENT_DATE" },
2647 {
"COMPANYNAME",
"COMPANY" },
2648 {
"DOCUMENTNAME",
"FILENAME" },
2649 {
"DOCUMENTFULLPATHANDNAME",
"FILEPATH" },
2650 {
"PROJECTNAME",
"PROJECTNAME" },
2658 size_t fontId =
static_cast<int>( elem.
fontId );
2675 screen->
Append( textItem );
2679 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2694 symbol = libSymbolIt->second;
2695 schsym =
m_symbols.at( libSymbolIt->first );
2704 if( !aSymbol.empty() )
2733 size_t fontId = elem.
fontId;
2744 else if( fontId > 0 && fontId <= aFontSizes.size() )
2746 int size = aFontSizes[fontId - 1];
2754 std::vector<LIB_SYMBOL*>& aSymbol,
2755 std::vector<int>& aFontSizes )
2782 textBox->
SetStart( sheetTopRight );
2783 textBox->
SetEnd( sheetBottomLeft );
2813 size_t fontId =
static_cast<int>( aElem->
FontID );
2831 screen->
Append( textBox );
2836 std::vector<int>& aFontSizes )
2838 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2853 symbol = libSymbolIt->second;
2854 schsym =
m_symbols.at( libSymbolIt->first );
2864 if( !aSymbol.empty() )
2917 if( aElem->
FontID > 0 && aElem->
FontID <=
static_cast<int>( aFontSizes.size() ) )
2919 int size = aFontSizes[aElem->
FontID - 1];
2926 std::vector<LIB_SYMBOL*>& aSymbol )
2930 if( elem.
points.size() < 2 )
2932 m_errorMessages.emplace( wxString::Format(
_(
"Bezier has %d control points. At least 2 are expected." ),
2933 static_cast<int>( elem.
points.size() ) ),
2941 wxCHECK( currentScreen, );
2943 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
2945 if( i + 2 == elem.
points.size() )
2956 currentScreen->
Append( line );
2961 std::vector<VECTOR2I> bezierPoints;
2962 std::vector<VECTOR2I> polyPoints;
2964 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
2965 bezierPoints.push_back( elem.
points.at( j ) );
2968 converter.
GetPoly( polyPoints );
2970 for(
size_t k = 0; k + 1 < polyPoints.size(); k++ )
2979 currentScreen->
Append( line );
2986 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
2996 m_errorMessages.emplace( wxString::Format( wxT(
"Bezier's owner (%d) not found." ),
3002 symbol = libSymbolIt->second;
3003 schsym =
m_symbols.at( libSymbolIt->first );
3010 if( !aSymbol.empty() )
3023 for(
size_t i = 0; i + 1 < elem.
points.size(); i += 3 )
3025 if( i + 2 == elem.
points.size() )
3036 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
3048 else if( i + 3 == elem.
points.size() )
3062 for(
size_t j = i; j < elem.
points.size() && j < i + 2; j++ )
3085 for(
size_t j = i; j < elem.
points.size() && j < i + 4; j++ )
3094 case 0: bezier->
SetStart( pos );
break;
3097 case 3: bezier->
SetEnd( pos );
break;
3111 std::vector<LIB_SYMBOL*>& aSymbol )
3115 if( elem.
Points.size() < 2 )
3123 for(
size_t i = 1; i < elem.
Points.size(); i++ )
3140 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3150 m_errorMessages.emplace( wxString::Format( wxT(
"Polyline's owner (%d) not found." ),
3156 symbol = libSymbolIt->second;
3157 schsym =
m_symbols.at( libSymbolIt->first );
3167 if( !aSymbol.empty() )
3198 std::vector<LIB_SYMBOL*>& aSymbol )
3221 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3231 m_errorMessages.emplace( wxString::Format( wxT(
"Polygon's owner (%d) not found." ),
3237 symbol = libSymbolIt->second;
3238 schsym =
m_symbols.at( libSymbolIt->first );
3248 if( !aSymbol.empty() )
3291 std::vector<LIB_SYMBOL*>& aSymbol )
3313 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3323 m_errorMessages.emplace( wxString::Format( wxT(
"Rounded rectangle's owner (%d) not found." ),
3329 symbol = libSymbolIt->second;
3330 schsym =
m_symbols.at( libSymbolIt->first );
3345 int radius = std::min( width / 2, height / 2 );
3379 if( !aSymbol.empty() )
3396 std::vector<LIB_SYMBOL*>& aSymbol )
3404 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3410 wxCHECK( currentScreen, );
3435 currentScreen->
Append( arc );
3440 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3455 symbol = libSymbolIt->second;
3456 schsym =
m_symbols.at( libSymbolIt->first );
3463 if( !aSymbol.empty() )
3484 circle->SetBodyStyle( bodyStyle );
3525 std::vector<LIB_SYMBOL*>& aSymbol )
3539 wxCHECK( currentScreen, );
3545 std::vector<BEZIER<int>> beziers;
3552 schbezier->
SetStart( bezier.Start );
3555 schbezier->
SetEnd( bezier.End );
3559 currentScreen->
Append( schbezier );
3564 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3574 m_errorMessages.emplace( wxString::Format( wxT(
"Elliptical Arc's owner (%d) not found." ),
3580 symbol = libSymbolIt->second;
3581 schsym =
m_symbols.at( libSymbolIt->first );
3588 if( !aSymbol.empty() )
3605 std::vector<BEZIER<int>> beziers;
3628 schbezier->
SetStart( bezier.Start );
3631 schbezier->
SetEnd( bezier.End );
3642 std::vector<LIB_SYMBOL*>& aSymbol )
3652 VECTOR2I startOffset =
KiROUND( arc_radius * startAngle.
Cos(), -( arc_radius * startAngle.
Sin() ) );
3677 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3687 m_errorMessages.emplace( wxString::Format( wxT(
"Piechart's owner (%d) not found." ),
3693 symbol = libSymbolIt->second;
3694 schsym =
m_symbols.at( libSymbolIt->first );
3704 if( !aSymbol.empty() )
3736 std::vector<LIB_SYMBOL*>& aSymbol )
3761 std::vector<BEZIER<int>> beziers;
3762 std::vector<VECTOR2I> polyPoints;
3769 schbezier->
SetStart( bezier.Start );
3772 schbezier->
SetEnd( bezier.End );
3778 screen->
Append( schbezier );
3780 polyPoints.push_back( bezier.Start );
3790 for(
const VECTOR2I& point : polyPoints )
3793 schpoly->
AddPoint( polyPoints[0] );
3795 screen->
Append( schpoly );
3800 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3815 symbol = libSymbolIt->second;
3816 schsym =
m_symbols.at( libSymbolIt->first );
3823 if( !aSymbol.empty() )
3839 std::vector<BEZIER<int>> beziers;
3840 std::vector<VECTOR2I> polyPoints;
3855 libbezier->
SetStart( bezier.Start );
3858 libbezier->
SetEnd( bezier.End );
3872 polyPoints.push_back( libbezier->
GetStart() );
3886 for(
const VECTOR2I& point : polyPoints )
3889 libline->
AddPoint( polyPoints[0] );
3899 std::vector<LIB_SYMBOL*>& aSymbol )
3919 circle->SetFilled(
false );
3925 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
3940 symbol = libSymbolIt->second;
3941 schsym =
m_symbols.at( libSymbolIt->first );
3952 if( !aSymbol.empty() )
3978 std::vector<LIB_SYMBOL*>& aSymbol )
3998 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
4013 symbol = libSymbolIt->second;
4014 schsym =
m_symbols.at( libSymbolIt->first );
4024 if( !aSymbol.empty() )
4063 for(
size_t ii = 0; ii < elem.
points.size() - 1; ii++ )
4076 m_errorMessages.emplace( wxT(
"Signal harness, belonging to the part is not currently supported." ),
4083 wxString>& aProperties )
4092 HARNESS& harness = it->second;
4120 m_errorMessages.emplace( wxT(
"Harness connector, belonging to the part is not currently supported." ),
4134 m_errorMessages.emplace( wxString::Format( wxT(
"Harness entry's parent (%d) not found." ),
4140 HARNESS& harness = harnessIt->second;
4177 harness.
m_ports.emplace_back( port );
4189 m_errorMessages.emplace( wxString::Format( wxT(
"Harness type's parent (%d) not found." ),
4195 HARNESS& harness = harnessIt->second;
4201 std::vector<LIB_SYMBOL*>& aSymbol )
4216 rect->
SetEnd( sheetBottomLeft );
4225 LIB_SYMBOL* symbol = aSymbol.empty() ? nullptr : aSymbol[0];
4235 m_errorMessages.emplace( wxString::Format( wxT(
"Rectangle's owner (%d) not found." ),
4241 symbol = libSymbolIt->second;
4242 schsym =
m_symbols.at( libSymbolIt->first );
4252 if( !aSymbol.empty() )
4268 rect->
SetEnd( sheetBottomLeft );
4296 wxCHECK( currentScreen, );
4297 currentScreen->
Append( sheet );
4306 wxCHECK( rootScreen, );
4314 m_sheets.insert( { aIndex, sheet } );
4332 sheetIt->second->AddPin( sheetPin );
4334 wxString pinName = elem.
name;
4337 pinName += wxT(
"{" ) + elem.
harnessType + wxT(
"}" );
4344 VECTOR2I pos = sheetIt->second->GetPosition();
4345 VECTOR2I size = sheetIt->second->GetSize();
4582 aReporter->
Report(
_(
"Power Port with unknown style imported as 'Bar' type." ),
4607 wxString symName( elem.
text );
4608 std::string styleName( magic_enum::enum_name<ASCH_POWER_PORT_STYLE>( elem.
style ) );
4610 if( !styleName.empty() )
4611 symName <<
'_' << styleName;
4620 libSymbol = powerSymbolIt->second;
4626 libSymbol->
SetName( symName );
4631 libSymbol->
SetDescription( wxString::Format(
_(
"Power symbol creates a global label with name '%s'" ),
4641 pin->SetPosition( { 0, 0 } );
4642 pin->SetLength( 0 );
4644 pin->SetVisible(
false );
4701 screen->
Append( symbol );
4729 switch( aElem.
Style )
4759 bool connectionFound = startIsWireTerminal
4760 || startIsBusTerminal
4761 || endIsWireTerminal
4762 || endIsBusTerminal;
4764 if( !connectionFound )
4768 if( harness.m_name.CmpNoCase( aElem.
HarnessType ) != 0 )
4771 BOX2I bbox( harness.m_location, harness.m_size );
4776 startIsBusTerminal =
true;
4777 connectionFound =
true;
4783 endIsBusTerminal =
true;
4784 connectionFound =
true;
4789 if( !connectionFound )
4797 VECTOR2I position = ( startIsWireTerminal || startIsBusTerminal ) ? start :
end;
4800 wxString labelName = aElem.
Name;
4803 labelName += wxT(
"{" ) + aElem.
HarnessType + wxT(
"}" );
4826 switch( aElem.
Style )
4833 if( ( startIsWireTerminal || startIsBusTerminal ) )
4844 if( ( startIsWireTerminal || startIsBusTerminal ) )
4858 if( ( startIsWireTerminal && endIsWireTerminal ) )
4866 else if( startIsBusTerminal && endIsBusTerminal )
4889 screen->
Append( noConnect );
4917 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4936 for(
size_t i = 0; i + 1 < elem.
points.size(); i++ )
4958 screen->
Append( junction );
4970 && component->second.currentpartid != elem.
ownerpartid )
4974 std::unique_ptr<SCH_BITMAP> bitmap = std::make_unique<SCH_BITMAP>(
center );
4986 m_errorMessages.emplace( wxString::Format(
_(
"Embedded file '%s' not found in "
4993 wxString storagePath = wxFileName::CreateTempFileName(
"kicad_import_" );
4996 wxMemoryInputStream fileStream( storageFile->
data.data(), storageFile->
data.size() );
4997 wxZlibInputStream zlibInputStream( fileStream );
4998 wxFFileOutputStream outputStream( storagePath );
4999 outputStream.Write( zlibInputStream );
5003 const bool writeOk = outputStream.IsOk();
5004 const bool closeOk = outputStream.Close();
5006 if( storagePath.IsEmpty() || !writeOk || !closeOk )
5009 wxString::Format(
_(
"Could not write a temporary file while extracting the "
5010 "embedded image '%s'." ),
5014 if( !storagePath.IsEmpty() )
5015 wxRemoveFile( storagePath );
5031 wxString::Format(
_(
"Failed to read embedded image '%s'. "
5032 "The image data may be corrupt or in an "
5033 "unsupported format." ),
5036 wxRemoveFile( storagePath );
5041 wxRemoveFile( storagePath );
5045 if( !wxFileExists( elem.
filename ) )
5048 wxString::Format(
_(
"Could not find image file '%s'. The file "
5049 "path may be specific to a different operating "
5066 wxString::Format(
_(
"Failed to read image file '%s'. The image "
5067 "may be corrupt or in an unsupported "
5078 const double scaleX =
std::abs(
static_cast<double>( expectedImageSize.
x ) / currentImageSize.
x );
5079 const double scaleY =
std::abs(
static_cast<double>( expectedImageSize.
y ) / currentImageSize.
y );
5082 bitmap->SetFlags(
IS_NEW );
5083 screen->
Append( bitmap.release() );
5089 m_altiumSheet = std::make_unique<ASCH_SHEET>( aProperties );
5141 wxCHECK( currentScreen, );
5147 m_errorMessages.emplace( wxString::Format( wxT(
"Sheetname's owner (%d) not found." ),
5153 wxString baseName = elem.
text;
5154 baseName.Replace( wxT(
"/" ), wxT(
"_" ) );
5156 wxString sheetName = baseName;
5157 std::set<wxString> sheetNames;
5162 sheetNames.insert( sheet->
GetName() );
5165 for(
int ii = 1; ; ++ii )
5167 if( sheetNames.find( sheetName ) == sheetNames.end() )
5170 sheetName = baseName + wxString::Format( wxT(
"_%d" ), ii );
5176 sheetNameField->
SetText( sheetName );
5190 m_errorMessages.emplace( wxString::Format( wxT(
"Filename's owner (%d) not found." ),
5216 m_errorMessages.emplace( wxString::Format( wxT(
"Designator's owner (%d) not found." ),
5230 bool emptyRef = elem.
text.IsEmpty();
5235 bool visible = !emptyRef;
5252 std::vector<LIB_SYMBOL*>& aSymbol,
5253 std::vector<int>& aFontSizes )
5262 bool emptyRef = elem.
text.IsEmpty();
5263 SCH_FIELD& refField = symbol->GetReferenceField();
5266 refField.
SetText( wxT(
"X" ) );
5273 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
5275 int size = aFontSizes[elem.
fontId - 1];
5292 busWireEntry->
SetSize( { vector.
x, vector.
y } );
5295 screen->
Append( busWireEntry );
5304 static const std::map<wxString, wxString> variableMap = {
5305 {
"COMMENT",
"VALUE" },
5306 {
"VALUE",
"ALTIUM_VALUE" },
5312 if( elem.
text ==
"*" )
5315 wxString paramName = elem.
name.Upper();
5317 if( paramName ==
"SHEETNUMBER" )
5321 else if( paramName ==
"TITLE" )
5325 else if( paramName ==
"REVISION" )
5329 else if( paramName ==
"DATE" )
5333 else if( paramName ==
"COMPANYNAME" )
5354 wxString upperName = elem.
name.Upper();
5356 if( upperName ==
"COMMENT" )
5362 wxString fieldName = elem.
name.Upper();
5364 if( fieldName.IsEmpty() )
5366 int disambiguate = 1;
5370 fieldName = wxString::Format(
"ALTIUM_UNNAMED_%d", disambiguate++ );
5372 if( !symbol->
GetField( fieldName ) )
5376 else if( fieldName ==
"VALUE" )
5378 fieldName =
"ALTIUM_VALUE";
5400 std::vector<LIB_SYMBOL*>& aSymbol,
5401 std::vector<int>& aFontSizes )
5425 std::map<wxString, wxString> variableMap = {
5426 {
"COMMENT",
"VALUE" },
5432 wxString upperName = elem.
name.Upper();
5434 if( upperName ==
"COMMENT" )
5436 field = &libSymbol->GetValueField();
5440 wxString fieldNameStem = elem.
name;
5441 wxString fieldName = fieldNameStem;
5442 int disambiguate = 1;
5444 if( fieldName.IsEmpty() )
5446 fieldNameStem =
"ALTIUM_UNNAMED";
5447 fieldName =
"ALTIUM_UNNAMED_1";
5450 else if( upperName ==
"VALUE" )
5452 fieldNameStem =
"ALTIUM_VALUE";
5453 fieldName =
"ALTIUM_VALUE";
5457 while( libSymbol->GetField( fieldName ) )
5458 fieldName = wxString::Format(
"%s_%d", fieldNameStem, disambiguate++ );
5461 libSymbol->AddField( new_field );
5472 if( elem.
fontId > 0 && elem.
fontId <=
static_cast<int>( aFontSizes.size() ) )
5474 int size = aFontSizes[elem.
fontId - 1];
5488 const std::map<wxString, wxString>& aProperties )
5497 std::vector<LIB_SYMBOL*>& aSymbol )
5501 if( elem.
type != wxS(
"PCBLIB" ) )
5505 if( aSymbol.size() == 0 && !elem.
isCurrent )
5513 wxArrayString fpFilters;
5514 fpFilters.Add( wxString::Format( wxS(
"*%s*" ), elem.
name ) );
5517 if( !aSymbol.empty() )
5523 symbol->SetFPFilters( fpFilters );
5534 m_errorMessages.emplace( wxString::Format( wxT(
"Implementation's owner (%d) not found." ),
5540 const auto& libSymbolIt =
m_libSymbols.find( implementationOwnerIt->second );
5544 m_errorMessages.emplace( wxString::Format( wxT(
"Footprint's owner (%d) not found." ),
5545 implementationOwnerIt->second ),
5552 libSymbolIt->second->SetFPFilters( fpFilters );
5562 wxString>& aProperties )
5579 std::vector<wxString> bodyStyleNames;
5582 bodyStyleNames.push_back( wxString::Format(
"Display %d", i + 1 ) );
5595 std::vector<int> fontSizes;
5596 struct SYMBOL_PIN_FRAC
5605 std::map<wxString, ALTIUM_SYMBOL_DATA> syms = aAltiumLibFile.
GetLibSymbols(
nullptr );
5607 for(
auto& [
name, entry] : syms )
5609 std::map<int, SYMBOL_PIN_FRAC> pinFracs;
5611 if( entry.m_pinsFrac )
5613 auto parse_binary_pin_frac =
5614 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5616 std::map<wxString, wxString>
result;
5622 SYMBOL_PIN_FRAC pinFrac;
5626 pinFrac.len_frac = binreader.
ReadInt32();
5627 pinFracs.insert( { pinFracData.first, pinFrac } );
5639 std::vector<LIB_SYMBOL*> symbols;
5646 std::map<wxString, wxString> properties = reader.
ReadProperties();
5651 THROW_IO_ERROR(
"LibSymbol does not start with COMPONENT record" );
5656 auto handleBinaryPinLambda =
5657 [&](
const std::string& binaryData ) -> std::map<wxString, wxString>
5659 std::map<wxString, wxString>
result;
5663 int32_t recordId = binreader.
ReadInt32();
5668 result[
"RECORD"] = wxString::Format(
"%d", recordId );
5670 result[
"OWNERPARTID"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5671 result[
"OWNERPARTDISPLAYMODE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5672 result[
"SYMBOL_INNEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5673 result[
"SYMBOL_OUTEREDGE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5674 result[
"SYMBOL_INNER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5675 result[
"SYMBOL_OUTER"] = wxString::Format(
"%d", binreader.
ReadByte() );
5678 result[
"ELECTRICAL"] = wxString::Format(
"%d", binreader.
ReadByte() );
5679 result[
"PINCONGLOMERATE"] = wxString::Format(
"%d", binreader.
ReadByte() );
5680 result[
"PINLENGTH"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5681 result[
"LOCATION.X"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5682 result[
"LOCATION.Y"] = wxString::Format(
"%d", binreader.
ReadInt16() );
5688 if(
auto it = pinFracs.find( pin_index ); it != pinFracs.end() )
5690 result[
"LOCATION.X_FRAC"] = wxString::Format(
"%d", it->second.x_frac );
5691 result[
"LOCATION.Y_FRAC"] = wxString::Format(
"%d", it->second.y_frac );
5692 result[
"PINLENGTH_FRAC"] = wxString::Format(
"%d", it->second.len_frac );
5696 std::vector<std::string> partSeqSplit =
split( partSeq,
"|" );
5698 if( partSeqSplit.size() == 3 )
5700 result[
"PART"] = partSeqSplit[0];
5701 result[
"SEQ"] = partSeqSplit[2];
5709 std::map<wxString, wxString> properties = reader.
ReadProperties( handleBinaryPinLambda );
5711 if( properties.empty() )
5760 m_errorMessages.emplace( wxString::Format(
_(
"Unknown or unexpected record id %d found in %s." ),
5780 if( valField.
GetText().IsEmpty() )
5793 wxFileName fn( aLibraryPath );
5795 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
5796 return fn.GetModificationTime().GetValue().GetValue();
5803 const std::map<std::string, UTF8>* aProperties )
5816 std::vector<std::unique_ptr<ALTIUM_COMPOUND_FILE>> compoundFiles;
5818 wxFileName fileName( aLibraryPath );
5823 if( aLibraryPath.Lower().EndsWith( wxS(
".schlib" ) ) )
5827 compoundFiles.push_back( std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath ) );
5829 else if( aLibraryPath.Lower().EndsWith( wxS(
".intlib" ) ) )
5833 std::unique_ptr<ALTIUM_COMPOUND_FILE> intCom = std::make_unique<ALTIUM_COMPOUND_FILE>( aLibraryPath );
5835 std::map<wxString, const CFB::COMPOUND_FILE_ENTRY*> schLibFiles = intCom->EnumDir(
L"SchLib" );
5837 for(
const auto& [schLibName, cfe] : schLibFiles )
5839 std::unique_ptr<ALTIUM_COMPOUND_FILE> decodedStream = std::make_unique<ALTIUM_COMPOUND_FILE>();
5841 if( intCom->DecodeIntLibStream( *cfe, decodedStream.get() ) )
5842 compoundFiles.emplace_back( std::move( decodedStream ) );
5848 for(
const std::unique_ptr<ALTIUM_COMPOUND_FILE>& altiumSchFilePtr : compoundFiles )
5851 cacheMapRef.insert( parsed.begin(), parsed.end() );
5856 catch(
const CFB::CFBException& exception )
5860 catch(
const std::exception& exc )
5868 std::vector<int>& aFontSizes )
5870 const CFB::COMPOUND_FILE_ENTRY* file = aAltiumSchFile.
FindStream( {
"FileHeader" } );
5872 if( file ==
nullptr )
5880 std::map<wxString, wxString> properties = reader.
ReadProperties();
5884 if( libtype.CmpNoCase(
"Protel for Windows - Schematic Library Editor Binary File Version 5.0" ) )
5885 THROW_IO_ERROR(
_(
"Expected Altium Schematic Library file version 5.0" ) );
5887 for(
auto& [key, value] : properties )
5889 wxString upperKey = key.Upper();
5892 if( upperKey.StartsWith(
"SIZE", &remaining ) )
5894 if( !remaining.empty() )
5896 int ind = wxAtoi( remaining );
5898 if(
static_cast<int>( aFontSizes.size() ) < ind )
5899 aFontSizes.resize( ind );
5902 int scaled =
schIUScale.MilsToIU( wxAtoi( value ) * 72.0 / 10.0 );
5903 aFontSizes[ind - 1] = scaled;
5911 const std::map<std::string, UTF8>* aProperties,
5912 std::function<
void(
const wxString&,
LIB_SYMBOL*)> aInserter )
5916 bool powerSymbolsOnly = ( aProperties &&
5923 for(
auto& [libnameStr, libSymbol] : it->second )
5925 if( powerSymbolsOnly && !libSymbol->IsPower() )
5928 aInserter( libnameStr, libSymbol );
5935 const std::map<std::string, UTF8>* aProperties )
5940 aSymbolNameList.Add( aStr );
5946 const wxString& aLibraryPath,
5947 const std::map<std::string, UTF8>* aProperties )
5952 aSymbolList.emplace_back( aSymbol );
5958 const std::map<std::string, UTF8>* aProperties )
5966 auto it2 = it->second.find( aAliasName );
5968 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 BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr const Vec GetCenter() const
constexpr bool Contains(const Vec &aPoint) const
constexpr coord_type GetTop() const
constexpr void Offset(coord_type dx, coord_type dy)
constexpr coord_type GetBottom() 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.
wxString AsString() const
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)
wxFileName ResolveSheetFileName(const wxString &aParentPath, const wxString &aSheetFileName) const
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)
void pruneCyclicSheets(const std::vector< SCH_SHEET * > &aCyclicSheets, SCH_SCREEN *aScreen)
Remove sheet symbols referencing a parse-stack file (an unrepresentable cycle), converting their pins...
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
std::map< wxString, int > m_parsingFiles
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 NormalizeRepeatedSheetInstances()
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)
friend struct PARSE_FILE_GUARD
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 Update(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Update aItem's bounding box in the tree.
void DeleteItem(SCH_ITEM *aItem)
Remove aItem from the linked list and deletes the object.
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.
wxString GetNextPageNumber() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SCREEN * LastScreen()
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
void pop_back()
Forwarded method from std::vector.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
void SetPosition(const VECTOR2I &aPosition) override
void SetSide(SHEET_SIDE aEdge)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
void SetBorderColor(KIGFX::COLOR4D aColor)
void SetFileName(const wxString &aFilename)
wxString GetFileName() const
Return the filename corresponding to this sheet.
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)
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
#define THROW_IO_ERRORF(msg,...)
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)
static wxString AltiumParseKey(const wxFileName &aFileName)
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
PARSE_FILE_GUARD(SCH_IO_ALTIUM *aOwner, std::vector< wxString > aKeys)
PARSE_FILE_GUARD & operator=(const PARSE_FILE_GUARD &)=delete
std::vector< wxString > m_keys
PARSE_FILE_GUARD(SCH_IO_ALTIUM *aOwner, const wxString &aKey)
PARSE_FILE_GUARD(const PARSE_FILE_GUARD &)=delete
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.