51#include <compoundfilereader.h>
58#include <wx/docview.h>
60#include <wx/mstream.h>
61#include <wx/wfstream.h>
62#include <wx/zstream.h>
64#include <magic_enum.hpp>
87 THROW_IO_ERROR( wxString::Format( wxT(
"Component creator tries to access component id %u "
88 "of %u existing components" ),
97 const std::vector<ALTIUM_VERTICE>& aVertices )
106 double startradiant =
DEG2RAD( vertex.startangle );
107 double endradiant =
DEG2RAD( vertex.endangle );
108 VECTOR2I arcStartOffset =
KiROUND( std::cos( startradiant ) * vertex.radius,
109 -std::sin( startradiant ) * vertex.radius );
111 VECTOR2I arcEndOffset =
KiROUND( std::cos( endradiant ) * vertex.radius,
112 -std::sin( endradiant ) * vertex.radius );
114 VECTOR2I arcStart = vertex.center + arcStartOffset;
115 VECTOR2I arcEnd = vertex.center + arcEndOffset;
120 if( arcStart.
Distance( vertex.position )
121 < arcEnd.
Distance( vertex.position ) )
148 aLine.
Append( vertex.position );
158 auto override =
m_layermap.find( aAltiumLayer );
162 return override->second;
177 switch( aAltiumLayer )
279 std::vector<PCB_LAYER_ID> layers;
280 layers.reserve( layerCount );
285 layers.emplace_back( layer );
302 const wxString& aLibrary,
const wxString& aFootprintName )
322 const unsigned PROGRESS_DELTA = 250;
340 const std::map<ALTIUM_PCB_DIR, std::string>& aFileMapping )
343 const std::vector<std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>> parserOrder = {
455 for(
const std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>& cur : parserOrder )
460 std::tie( isRequired,
directory, fp ) = cur;
465 const auto& mappedDirectory = aFileMapping.find(
directory );
467 if( mappedDirectory == aFileMapping.end() )
470 const std::vector<std::string> mappedFile{ mappedDirectory->second,
"Header" };
471 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
473 if( file ==
nullptr )
477 uint32_t numOfRecords = reader.
Read<uint32_t>();
483 m_reporter->Report( wxString::Format(
_(
"'%s' was not parsed correctly." ),
497 m_reporter->Report( wxString::Format(
_(
"'%s' was not fully parsed." ),
509 if( boardDirectory != aFileMapping.end() )
511 std::vector<std::string> mappedFile{ boardDirectory->second,
"Data" };
513 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
518 "This file does not appear to be in a valid PCB Binary Version 6.0 format. In "
520 "make sure to save as \"PCB Binary Files (*.PcbDoc)\"." ) );
525 for(
const std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>& cur : parserOrder )
530 std::tie( isRequired,
directory, fp ) = cur;
532 const auto& mappedDirectory = aFileMapping.find(
directory );
534 if( mappedDirectory == aFileMapping.end() )
536 wxASSERT_MSG( !isRequired, wxString::Format( wxT(
"Altium Directory of kind %d was "
537 "expected, but no mapping is "
538 "present in the code" ),
543 std::vector<std::string> mappedFile{ mappedDirectory->second };
546 mappedFile.emplace_back(
"Data" );
548 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
550 if( file !=
nullptr )
552 fp( altiumPcbFile, file );
554 else if( isRequired )
558 m_reporter->Report( wxString::Format(
_(
"File not found: '%s' for directory '%s'." ),
573 if( zone->GetAssignedPriority() == 1000 )
584 zone->SetAssignedPriority( priority >= 0 ? priority : 0 );
588 for( std::pair<const ALTIUM_LAYER, ZONE*>& zone :
m_outer_plane )
589 zone.second->SetAssignedPriority( 0 );
599 if( !zone->HasFilledPolysForLayer( layer ) )
602 zone->GetFilledPolysList( layer )->Fracture();
640 if( arc->
GetCenter() == dim->GetPosition() )
649 VECTOR2I radialLine = dim->GetEnd() - dim->GetStart();
654 radialLine = radialLine.
Resize( std::max(
radius, 2 ) );
655 dim->SetEnd( dim->GetStart() + (
VECTOR2I) radialLine );
656 dim->SetLeaderLength( totalLength -
radius );
666 int desired_x = ( w - bbbox.
GetWidth() ) / 2;
667 int desired_y = ( h - bbbox.
GetHeight() ) / 2;
669 VECTOR2I movementVector( desired_x - bbbox.
GetX(), desired_y - bbbox.
GetY() );
670 m_board->Move( movementVector );
681 const wxString& aFootprintName )
683 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
688 const std::vector<std::string> libStreamName{
"Library",
"Data" };
689 const CFB::COMPOUND_FILE_ENTRY* libStream = altiumLibFile.
FindStream( libStreamName );
691 if( libStream ==
nullptr )
709 std::tuple<wxString, const CFB::COMPOUND_FILE_ENTRY*> ret =
712 wxString fpDirName = std::get<0>( ret );
713 const CFB::COMPOUND_FILE_ENTRY* footprintStream = std::get<1>( ret );
715 if( fpDirName.IsEmpty() )
718 wxString::Format(
_(
"Footprint directory not found: '%s'." ), aFootprintName ) );
721 const std::vector<std::string> streamName{ fpDirName.ToStdString(),
"Data" };
722 const CFB::COMPOUND_FILE_ENTRY* footprintData = altiumLibFile.
FindStream( footprintStream, {
"Data" } );
724 if( footprintData ==
nullptr )
737 footprint->SetFPID( fpID );
739 const std::vector<std::string> parametersStreamName{ fpDirName.ToStdString(),
741 const CFB::COMPOUND_FILE_ENTRY* parametersData =
742 altiumLibFile.
FindStream( footprintStream, {
"Parameters" } );
744 if( parametersData !=
nullptr )
747 std::map<wxString, wxString> parameterProperties = parametersReader.
ReadProperties();
749 wxT(
"DESCRIPTION" ), wxT(
"" ) );
750 footprint->SetLibDescription( description );
756 m_reporter->Report( wxString::Format(
_(
"File not found: '%s'." ),
761 footprint->SetLibDescription( wxT(
"" ) );
764 const std::vector<std::string> extendedPrimitiveInformationStreamName{
765 "ExtendedPrimitiveInformation",
"Data"
767 const CFB::COMPOUND_FILE_ENTRY* extendedPrimitiveInformationData =
768 altiumLibFile.
FindStream( footprintStream, extendedPrimitiveInformationStreamName );
770 if( extendedPrimitiveInformationData !=
nullptr )
773 footprint->SetReference( wxT(
"REF**" ) );
774 footprint->SetValue( aFootprintName );
775 footprint->Reference().SetVisible(
true );
776 footprint->Value().SetVisible(
true );
779 const int defaultTextThickness(
pcbIUScale.mmToIU( 0.15 ) );
781 for(
PCB_FIELD* field : footprint->GetFields() )
783 field->SetTextSize( defaultTextSize );
784 field->SetTextThickness( defaultTextThickness );
842 THROW_IO_ERROR( wxString::Format(
_(
"Record of unknown type: '%d'." ), recordtype ) );
848 for(
bool changes =
true; changes; )
853 [&changes](
PAD* aPad1,
PAD* aPad2 )
855 if( !( aPad1->GetNumber().IsEmpty() ^ aPad2->GetNumber().IsEmpty() ) )
858 for( PCB_LAYER_ID layer : aPad1->GetLayerSet() )
860 std::shared_ptr<SHAPE> shape1 = aPad1->GetEffectiveShape( layer );
861 std::shared_ptr<SHAPE> shape2 = aPad2->GetEffectiveShape( layer );
863 if( shape1->Collide( shape2.get() ) )
865 if( aPad1->GetNumber().IsEmpty() )
866 aPad1->SetNumber( aPad2->GetNumber() );
868 aPad2->SetNumber( aPad1->GetNumber() );
877 footprint->AutoPositionFields();
879 if( parser.HasParsingError() )
881 THROW_IO_ERROR( wxString::Format( wxT(
"%s stream was not parsed correctly" ),
885 if( parser.GetRemainingBytes() != 0 )
887 THROW_IO_ERROR( wxString::Format( wxT(
"%s stream is not fully parsed" ),
891 return footprint.release();
902 THROW_IO_ERROR( wxString::Format( wxT(
"Netcode with id %d does not exist. Only %d nets "
914 const auto rules =
m_rules.find( aKind );
919 for(
const ARULE6& rule : rules->second )
921 if( rule.
name == aName )
930 const auto rules =
m_rules.find( aKind );
935 for(
const ARULE6& rule : rules->second )
945 const CFB::COMPOUND_FILE_ENTRY* aEntry )
963 const CFB::COMPOUND_FILE_ENTRY* aEntry )
980 THROW_IO_ERROR( wxT(
"ExtendedPrimitiveInformation stream is not fully parsed" ) );
985 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1002 size_t layercount = 0;
1005 while( layerid < elem.
stackup.size() && layerid != 0 )
1007 layerid = elem.
stackup[ layerid - 1 ].nextId;
1011 size_t kicadLayercount = ( layercount % 2 == 0 ) ? layercount : layercount + 1;
1012 m_board->SetCopperLayerCount( kicadLayercount );
1021 auto it = stackup.
GetList().begin();
1030 altiumLayerId < elem.
stackup.size() && altiumLayerId != 0;
1031 altiumLayerId = elem.
stackup[altiumLayerId - 1].nextId )
1037 if( layer.
nextId == 0 && layercount != kicadLayercount )
1039 m_board->SetLayerName( ( *it )->GetBrdLayerId(), wxT(
"[unused]" ) );
1042 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1044 ( *it )->SetThickness( 0 );
1049 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1051 ( *it )->SetThickness( 0, 0 );
1052 ( *it )->SetThicknessLocked(
true, 0 );
1060 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1074 if( klayer ==
B_Cu )
1077 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected id while parsing last stackup layer" ) );
1087 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1123 wxString nameLower = aName.Lower();
1124 return nameLower.Contains( wxT(
"courtyard" ) ) || nameLower.Contains( wxT(
"court yard" ) )
1125 || nameLower.Contains( wxT(
"crtyd" ) );
1132 wxString nameLower = aName.Lower();
1133 return nameLower.Contains( wxT(
"assembly" ) ) || nameLower.Contains( wxT(
"assy" ) );
1142 auto check = [&isTop](
bool aTopCond,
bool aBotCond )
1144 if( aTopCond && aBotCond )
1147 if( !aTopCond && !aBotCond )
1154 wxString lower = aName.Lower();
1156 if( check( lower.StartsWith(
"top" ), lower.StartsWith(
"bot" ) ) )
1159 if( check( lower.EndsWith(
"_t" ), lower.EndsWith(
"_b" ) ) )
1162 if( check( lower.EndsWith(
".t" ), lower.EndsWith(
".b" ) ) )
1165 if( check( lower.Contains(
"top" ), lower.Contains(
"bot" ) ) )
1178 if( aStackup.size() == 0 )
1181 std::vector<INPUT_LAYER_DESC> inputLayers;
1182 std::map<wxString, ALTIUM_LAYER> altiumLayerNameMap;
1189 bool frontCourtyardMapped =
false;
1190 bool backCourtyardMapped =
false;
1192 for(
size_t ii = 0; ii < aStackup.size(); ii++ )
1194 curLayer = aStackup[ii];
1213 auto existingMapping =
m_layermap.find( layer_num );
1240 if( isTopSide && !frontCourtyardMapped )
1243 frontCourtyardMapped =
true;
1245 else if( !isTopSide && !backCourtyardMapped )
1248 backCourtyardMapped =
true;
1250 else if( !frontCourtyardMapped )
1253 frontCourtyardMapped =
true;
1255 else if( !backCourtyardMapped )
1258 backCourtyardMapped =
true;
1281 inputLayers.push_back( iLdesc );
1282 altiumLayerNameMap.insert( { curLayer.
name, layer_num } );
1286 if( inputLayers.size() == 0 )
1292 for( std::pair<wxString, PCB_LAYER_ID> layerPair : reMappedLayers )
1300 m_reporter->Report( wxString::Format(
_(
"Layer '%s' could not be mapped and "
1301 "will be skipped." ),
1309 ALTIUM_LAYER altiumID = altiumLayerNameMap.at( layerPair.first );
1310 m_layermap.insert_or_assign( altiumID, layerPair.second );
1311 enabledLayers |=
LSET( { layerPair.second } );
1316 for(
const auto& [
name, altLayer] : altiumLayerNameMap )
1318 if( reMappedLayers.find(
name ) == reMappedLayers.end()
1325 m_board->SetEnabledLayers( enabledLayers );
1326 m_board->SetVisibleLayers( enabledLayers );
1339 if( !layer.mechenabled )
1347 switch( layer.mechkind )
1408 shape->SetStroke( stroke );
1420 shape->SetStroke( stroke );
1422 shape->SetStart( seg.
A );
1423 shape->SetEnd( seg.
B );
1432 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1446 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( elem.
name );
1448 for(
const wxString&
name : elem.
names )
1450 m_board->GetDesignSettings().m_NetSettings->SetNetclassPatternAssignment(
1451 name, nc->GetName() );
1454 if(
m_board->GetDesignSettings().m_NetSettings->HasNetclass( nc->GetName() ) )
1461 msg.Printf(
_(
"More than one Altium netclass with name '%s' found. "
1462 "Only the first one will be imported." ), elem.
name );
1468 m_board->GetDesignSettings().m_NetSettings->SetNetclass( nc->GetName(), nc );
1478 std::shared_ptr<NET_SETTINGS> netSettings =
m_board->GetDesignSettings().m_NetSettings;
1482 if( net->GetNetCode() > 0 )
1484 std::shared_ptr<NETCLASS> netclass = netSettings->GetEffectiveNetClass( net->GetNetname() );
1487 net->SetNetClass( netclass );
1491 m_board->m_LegacyNetclassesLoaded =
true;
1496 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1508 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
1519 wxString fpName = elem.
pattern;
1521 if( fpName.Contains( wxT(
"\\" ) ) || fpName.Contains( wxT(
"/" ) ) )
1523 wxFileName fpPath( fpName, wxPATH_WIN );
1524 fpName = fpPath.GetFullName();
1529 footprint->SetFPID( fpID );
1531 footprint->SetPosition( elem.
position );
1532 footprint->SetOrientationDegrees( elem.
rotation );
1538 if( reference.find_first_not_of(
"0123456789" ) == wxString::npos )
1539 reference.Prepend( wxT(
"UNK" ) );
1541 footprint->SetReference( reference );
1546 path.push_back( pathid );
1547 path.push_back(
id );
1549 footprint->SetPath(
path );
1553 footprint->SetLocked( elem.
locked );
1554 footprint->Reference().SetVisible( elem.
nameon );
1555 footprint->Value().SetVisible( elem.
commenton );
1563 THROW_IO_ERROR( wxT(
"Components6 stream is not fully parsed" ) );
1570 while( Angle < aMin )
1573 while( Angle >= aMax )
1596 m_reporter->Report( wxString::Format( wxT(
"Model %s not found for footprint %s" ),
1607 if( file->
name.IsEmpty() )
1611 std::vector<char> decompressedData;
1612 wxMemoryInputStream compressedStream(
model->second.data(),
model->second.size() );
1613 wxZlibInputStream zlibStream( compressedStream );
1617 decompressedData.resize(
model->second.size() * 6 );
1620 while( !zlibStream.Eof() )
1622 zlibStream.Read( decompressedData.data() + offset, decompressedData.size() - offset );
1623 size_t bytesRead = zlibStream.LastRead();
1628 offset += bytesRead;
1630 if( offset >= decompressedData.size() )
1631 decompressedData.resize( 2 * decompressedData.size() );
1634 decompressedData.resize( offset );
1655 orientation = -orientation;
1662 modelRotation.
x += 180;
1663 modelRotation.
z = -modelRotation.
z;
1677 aFootprint->
Models().push_back( modelSettings );
1682 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1688 BS::multi_future<void> embeddedFutures;
1699 if( skipComponentBodies )
1707 THROW_IO_ERROR( wxString::Format( wxT(
"ComponentsBodies6 stream tries to access "
1708 "component id %d of %zu existing components" ),
1723 msg.Printf( wxT(
"ComponentsBodies6 stream tries to access model id %s which does "
1724 "not exist" ), elem.
modelId );
1737 wxMemoryInputStream compressedStream( modelData.
m_data.data(), modelData.
m_data.size() );
1738 wxZlibInputStream zlibStream( compressedStream );
1739 wxMemoryOutputStream decompressedStream;
1741 zlibStream.Read( decompressedStream );
1747 embeddedFutures.push_back(
tp.submit_task(
1750 EMBEDDED_FILES::CompressAndEncode( *file );
1769 orientation = -orientation;
1792 footprint->
Models().push_back( modelSettings );
1795 embeddedFutures.wait();
1798 THROW_IO_ERROR( wxT(
"ComponentsBodies6 stream is not fully parsed" ) );
1805 THROW_IO_ERROR( wxT(
"Incorrect number of reference points for linear dimension object" ) );
1814 _(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
1815 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer ),
1828 dimension->SetLayer( klayer );
1829 dimension->SetStart( referencePoint0 );
1831 if( referencePoint0 != aElem.
xy1 )
1843 VECTOR2I referenceDiff = referencePoint1 - referencePoint0;
1845 SEG segm1( referencePoint0, referencePoint0 + directionNormalVector );
1846 SEG segm2( referencePoint1, referencePoint1 + direction );
1850 THROW_IO_ERROR( wxT(
"Invalid dimension. This should never happen." ) );
1852 dimension->SetEnd( *intersection );
1856 if( direction.
Cross( referenceDiff ) > 0 )
1859 dimension->SetHeight( height );
1863 dimension->SetEnd( referencePoint1 );
1866 dimension->SetLineThickness( aElem.
linewidth );
1872 int dist = ( dimension->GetEnd() - dimension->GetStart() ).EuclideanNorm();
1874 if( dist < 3 * dimension->GetArrowLength() )
1878 wxRegEx units( wxS(
"(mm)|(in)|(mils)|(thou)|(')|(\")" ), wxRE_ADVANCED );
1890 dimension->Text().SetBold( aElem.
textbold );
1893 dimension->SetTextThickness( dimension->GetTextThickness() *
BOLD_FACTOR );
1912 THROW_IO_ERROR( wxT(
"Not enough reference points for radial dimension object" ) );
1921 _(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
1922 "It has been moved to KiCad layer Eco1_User." ),
1931 std::unique_ptr<PCB_DIM_RADIAL> dimension = std::make_unique<PCB_DIM_RADIAL>(
m_board );
1934 dimension->SetLayer( klayer );
1935 dimension->SetStart( referencePoint0 );
1936 dimension->SetEnd( aElem.
xy1 );
1937 dimension->SetLineThickness( aElem.
linewidth );
1938 dimension->SetKeepTextAligned(
false );
1959 m_reporter->Report( wxT(
"No text position present for leader dimension object" ),
1966 dimension->SetTextPos( aElem.
textPoint.at( 0 ) );
1972 dimension->SetBold( aElem.
textbold );
1975 dimension->SetTextThickness( dimension->GetTextThickness() *
BOLD_FACTOR );
1983 int yAdjust = dimension->GetTextBox(
nullptr ).GetCenter().y - dimension->GetTextPos().y;
1984 dimension->SetTextPos( dimension->GetTextPos() +
VECTOR2I( 0, yAdjust + aElem.
textgap ) );
2001 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2002 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2019 shape->SetLayer( klayer );
2021 shape->SetStart( last );
2033 if( dirVec.
x != 0 || dirVec.
y != 0 )
2042 shape1->SetLayer( klayer );
2044 shape1->SetStart( referencePoint0 );
2045 shape1->SetEnd( referencePoint0 + arrVec );
2055 shape2->SetLayer( klayer );
2057 shape2->SetStart( referencePoint0 );
2058 shape2->SetEnd( referencePoint0 + arrVec );
2070 m_reporter->Report( wxT(
"No text position present for leader dimension object" ),
2077 std::unique_ptr<PCB_TEXT>
text = std::make_unique<PCB_TEXT>(
m_board );
2081 text->SetLayer( klayer );
2100 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2101 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2112 shape->SetLayer( klayer );
2131 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2132 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2142 std::unique_ptr<PCB_DIM_CENTER> dimension = std::make_unique<PCB_DIM_CENTER>(
m_board );
2144 dimension->SetLayer( klayer );
2145 dimension->SetLineThickness( aElem.
linewidth );
2146 dimension->SetStart( aElem.
xy1 );
2147 dimension->SetEnd( aElem.
xy1 + vec );
2154 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2174 m_reporter->Report( wxString::Format(
_(
"Ignored Angular dimension (not yet supported)." ) ),
2187 m_reporter->Report( wxString::Format(
_(
"Ignored Datum dimension (not yet supported)." ) ),
2195 m_reporter->Report( wxString::Format(
_(
"Ignored Baseline dimension (not yet supported)." ) ),
2205 m_reporter->Report( wxString::Format(
_(
"Ignored Linear dimension (not yet supported)." ) ),
2212 m_reporter->Report( wxString::Format(
_(
"Ignored Radial dimension (not yet supported)." ) ),
2220 msg.Printf(
_(
"Ignored dimension of kind %d (not yet supported)." ), elem.
kind );
2228 THROW_IO_ERROR( wxT(
"Dimensions6 stream is not fully parsed" ) );
2233 const CFB::COMPOUND_FILE_ENTRY* aEntry,
2234 const std::vector<std::string>& aRootDir )
2245 wxString invalidChars = wxFileName::GetForbiddenChars();
2252 std::vector<std::string> stepPath = aRootDir;
2253 stepPath.emplace_back( std::to_string( idx ) );
2255 bool validName = !elem.
name.IsEmpty() && elem.
name.IsAscii()
2256 && wxString::npos == elem.
name.find_first_of( invalidChars );
2257 wxString storageName = validName ? elem.
name : wxString::Format( wxT(
"model_%d" ), idx );
2261 const CFB::COMPOUND_FILE_ENTRY* stepEntry = aAltiumPcbFile.
FindStream( stepPath );
2263 if( stepEntry ==
nullptr )
2268 msg.Printf(
_(
"File not found: '%s'. 3D-model not imported." ),
FormatPath( stepPath ) );
2275 size_t stepSize =
static_cast<size_t>( stepEntry->size );
2276 std::vector<char> stepContent( stepSize );
2284 std::move( stepContent ) ) ) );
2288 std::map<wxString, std::vector<wxString>> nameIdMap;
2291 nameIdMap[data.m_modelname].push_back(
id );
2293 for(
auto& [
name, ids] : nameIdMap )
2295 for(
size_t i = 1; i < ids.size(); i++ )
2297 const wxString&
id = ids[i];
2304 wxString modelName = modelTuple->second.m_modelname;
2306 if( modelName.Contains(
"." ) )
2309 wxString baseName = modelName.BeforeLast(
'.', &ext );
2311 modelTuple->second.m_modelname = baseName +
'_' + std::to_string( i ) +
'.' + ext;
2315 modelTuple->second.m_modelname = modelName +
'_' + std::to_string( i );
2326 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2338 ANET6 elem( reader );
2352 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2395 msg.Printf(
_(
"Polygon outline count is %d, expected 1." ), outline.
OutlineCount() );
2403 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board);
2409 zone->SetPosition( elem.
vertices.at( 0 ).position );
2410 zone->SetLocked( elem.
locked );
2412 zone->Outline()->AddOutline( outline.
Outline( 0 ) );
2419 int planeLayers = 0;
2420 int signalLayers = 0;
2434 if( planeLayers > 0 && planeClearanceRule )
2437 if( signalLayers > 0 && zoneClearanceRule )
2445 if( polygonConnectRule !=
nullptr )
2464 zone->SetThermalReliefSpokeWidth(
2475 zone->SetAssignedPriority( 1 );
2480 || zone->GetBoundingBox().Contains( outer_plane->second->GetBoundingBox() ) )
2495 const BOX2I& bbox = zone->GetBoundingBox();
2504 zone->SetHatchOrientation(
ANGLE_45 );
2519 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2537 std::sort( val.second.begin(), val.second.end(),
2540 return lhs.priority < rhs.priority;
2553 if( trackWidthRule )
2555 m_board->GetDesignSettings().m_TrackMinWidth = trackWidthRule->
minLimit;
2559 if( routingViasRule )
2561 m_board->GetDesignSettings().m_ViasMinSize = routingViasRule->
minWidth;
2570 if( holeToHoleRule )
2576 if( soldermaskRule )
2587 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2603 THROW_IO_ERROR( wxT(
"BoardRegions stream is not fully parsed" ) );
2607 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2615 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
2634 THROW_IO_ERROR(
"ShapeBasedRegions6 stream is not fully parsed" );
2658 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
2660 zone->SetIsRuleArea(
true );
2668 zone->SetDoNotAllowZoneFills(
true );
2669 zone->SetDoNotAllowVias(
false );
2670 zone->SetDoNotAllowTracks(
false );
2671 zone->SetDoNotAllowPads(
false );
2672 zone->SetDoNotAllowFootprints(
false );
2675 zone->SetPosition( aElem.
outline.at( 0 ).position );
2676 zone->Outline()->AddOutline( linechain );
2696 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
2698 zone->SetPosition( aElem.
outline.at( 0 ).position );
2699 zone->Outline()->AddOutline( linechain );
2707 fill.
Append( linechain );
2711 zone->SetFilledPolysList( klayer, fill );
2713 zone->SetIsFilled(
true );
2714 zone->SetNeedRefill(
false );
2727 msg.Printf(
_(
"Dashed outline found on an Altium layer (%d) with no KiCad equivalent. "
2728 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2749 shape->SetPolyShape( linechain );
2750 shape->SetFilled(
false );
2751 shape->SetLayer( klayer );
2769 msg.Printf(
_(
"Ignored polygon shape of kind %d (not yet supported)." ), aElem.
kind );
2778 const int aPrimitiveIndex )
2794 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( aFootprint );
2796 zone->SetIsRuleArea(
true );
2804 zone->SetDoNotAllowZoneFills(
true );
2805 zone->SetDoNotAllowVias(
false );
2806 zone->SetDoNotAllowTracks(
false );
2807 zone->SetDoNotAllowPads(
false );
2808 zone->SetDoNotAllowFootprints(
false );
2811 zone->SetPosition( aElem.
outline.at( 0 ).position );
2812 zone->Outline()->AddOutline( linechain );
2846 msg.Printf(
_(
"Loading library '%s':\n"
2847 "Footprint %s contains a dashed outline on Altium layer (%d) with "
2848 "no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
2860 msg.Printf(
_(
"Footprint %s contains a dashed outline on Altium layer (%d) with "
2861 "no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
2883 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::POLY );
2885 shape->SetPolyShape( linechain );
2886 shape->SetFilled(
false );
2887 shape->SetLayer( klayer );
2903 msg.Printf(
_(
"Error loading library '%s':\n"
2904 "Footprint %s contains polygon shape of kind %d (not yet supported)." ),
2916 msg.Printf(
_(
"Footprint %s contains polygon shape of kind %d (not yet supported)." ),
2944 for(
const std::vector<ALTIUM_VERTICE>& hole : aElem.
holes )
2952 polySet.
AddHole( hole_linechain );
2957 shape->SetPolyShape( polySet );
2958 shape->SetFilled(
true );
2959 shape->SetLayer( aLayer );
2974 const int aPrimitiveIndex )
2991 for(
const std::vector<ALTIUM_VERTICE>& hole : aElem.
holes )
2999 polySet.
AddHole( hole_linechain );
3002 if( aLayer ==
F_Cu || aLayer ==
B_Cu )
3005 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3008 padLayers.
set( aLayer );
3019 pad->SetPosition( anchorPos );
3022 shapePolys.
Move( -anchorPos );
3026 auto it = map.find( aPrimitiveIndex );
3028 if( it != map.end() )
3034 pad->SetLocalSolderPasteMargin(
info.pastemaskexpansionmanual );
3039 pad->SetLocalSolderMaskMargin(
info.soldermaskexpansionmanual );
3049 pad->SetLayerSet( padLayers );
3055 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::POLY );
3057 shape->SetPolyShape( polySet );
3058 shape->SetFilled(
true );
3059 shape->SetLayer( aLayer );
3068 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3084 THROW_IO_ERROR( wxString::Format(
"Region stream tries to access polygon id %d "
3085 "of %d existing polygons.",
3092 if( zone ==
nullptr )
3114 for(
const std::vector<ALTIUM_VERTICE>& hole : elem.
holes )
3121 hole_linechain.
Append( hole.at( 0 ).position );
3123 fill.
AddHole( hole_linechain );
3143 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3150 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
3153 AARC6 elem( reader );
3204 THROW_IO_ERROR( wxString::Format(
"Tracks stream tries to access polygon id %u "
3205 "of %zu existing polygons.",
3211 if( zone ==
nullptr )
3259 for(
const auto& layerExpansionMask :
3262 int width = aElem.
width + ( layerExpansionMask.second * 2 );
3266 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>(
m_board );
3270 arc->SetLayer( layerExpansionMask.first );
3279 const int aPrimitiveIndex,
const bool aIsBoardImport )
3283 wxFAIL_MSG( wxString::Format(
"Altium: Unexpected footprint Arc with polygon id %d",
3316 for(
const auto& layerExpansionMask :
3319 int width = aElem.
width + ( layerExpansionMask.second * 2 );
3323 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( aFootprint );
3327 arc->SetLayer( layerExpansionMask.first );
3359 std::unique_ptr<PCB_ARC> arc = std::make_unique<PCB_ARC>(
m_board, &shapeArc );
3361 arc->SetWidth( aElem.
width );
3362 arc->SetLayer( aLayer );
3370 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>(
m_board);
3374 arc->SetLayer( aLayer );
3384 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( aFootprint );
3388 arc->SetLayer( aLayer );
3395 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3405 APAD6 elem( reader );
3434 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
3435 footprint->SetPosition( aElem.
position );
3446 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3448 pad->SetNumber(
"" );
3459 pad->SetLayerSet(
LSET().AllCuMask() );
3481 if( altiumIdx < 32 )
3491 pad->Padstack().FrontOuterLayers().has_solder_mask =
true;
3495 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
3501 pad->Padstack().BackOuterLayers().has_solder_mask =
true;
3505 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
3510 pad->SetLocked(
true );
3540 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3563 msg.Printf(
_(
"Error loading library '%s':\n"
3564 "Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
3576 msg.Printf(
_(
"Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
3596 wxFAIL_MSG( wxT(
"Round holes are handled before the switch" ) );
3605 msg.Printf(
_(
"Loading library '%s':\n"
3606 "Footprint %s pad %s has a square hole (not yet supported)." ),
3618 msg.Printf(
_(
"Footprint %s pad %s has a square hole (not yet supported)." ),
3653 msg.Printf(
_(
"Loading library '%s':\n"
3654 "Footprint %s pad %s has a hole-rotation of %d degrees. "
3655 "KiCad only supports 90 degree rotations." ),
3668 msg.Printf(
_(
"Footprint %s pad %s has a hole-rotation of %d degrees. "
3669 "KiCad only supports 90 degree rotations." ),
3688 msg.Printf(
_(
"Error loading library '%s':\n"
3689 "Footprint %s pad %s uses a hole of unknown kind %d." ),
3702 msg.Printf(
_(
"Footprint %s pad %s uses a hole of unknown kind %d." ),
3722 auto setCopperGeometry =
3767 msg.Printf(
_(
"Error loading library '%s':\n"
3768 "Footprint %s pad %s uses an unknown pad shape." ),
3780 msg.Printf(
_(
"Footprint %s pad %s uses an unknown pad shape." ),
3831 switch( aElem.
layer )
3849 pad->SetLayer( klayer );
3850 pad->SetLayerSet(
LSET( { klayer } ) );
3861 pad->SetLayerSet(
pad->GetLayerSet().reset(
F_Mask ) );
3864 pad->SetLayerSet(
pad->GetLayerSet().reset(
B_Mask ) );
3882 msg.Printf(
_(
"Non-copper pad %s found on an Altium layer (%d) with no KiCad "
3883 "equivalent. It has been moved to KiCad layer Eco1_User." ),
3891 std::unique_ptr<PCB_SHAPE>
pad = std::make_unique<PCB_SHAPE>(
m_board );
3910 msg.Printf(
_(
"Loading library '%s':\n"
3911 "Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
3912 "KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
3925 msg.Printf(
_(
"Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
3926 "KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
3937 std::unique_ptr<PCB_SHAPE>
pad = std::make_unique<PCB_SHAPE>( aFootprint );
3953 msg.Printf(
_(
"Non-copper pad %s is connected to a net, which is not supported." ),
3964 msg.Printf(
_(
"Non-copper pad %s has a hole, which is not supported." ), aElem.
name );
3974 msg.Printf(
_(
"Non-copper pad %s has a complex pad stack (not yet supported)." ),
4007 int offset = ( std::min( aElem.
topsize.
x, aElem.
topsize.
y ) * cornerradius ) / 200;
4012 if( cornerradius < 100 )
4014 int offsetX = aElem.
topsize.
x / 2 - offset;
4015 int offsetY = aElem.
topsize.
y / 2 - offset;
4108 aShape->
SetPolyPoints( { p11 - chamferX, p11 - chamferY, p12 + chamferY, p12 - chamferX,
4109 p22 + chamferX, p22 + chamferY, p21 - chamferY, p21 + chamferX } );
4121 msg.Printf(
_(
"Non-copper pad %s uses an unknown pad shape." ), aElem.
name );
4131 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4141 AVIA6 elem( reader );
4143 std::unique_ptr<PCB_VIA>
via = std::make_unique<PCB_VIA>(
m_board );
4155 if( start_layer_outside && end_layer_outside )
4159 else if( ( !start_layer_outside ) && ( !end_layer_outside ) )
4182 msg.Printf(
_(
"Via from layer %d to %d uses a non-copper layer, which is not "
4193 via->SetLayerPair( start_klayer, end_klayer );
4218 wxCHECK2_MSG( altiumLayer < 32,
break,
4219 "Altium importer expects 32 or fewer copper layers" );
4244 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4251 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
4282 msg.Printf( wxT(
"ATRACK6 stream tries to access polygon id %u "
4283 "of %u existing polygons; skipping it" ),
4284 static_cast<unsigned>( aElem.
polygon ),
4285 static_cast<unsigned>(
m_polygons.size() ) );
4294 if( zone ==
nullptr )
4344 int width = aElem.
width + ( layerExpansionMask.second * 2 );
4349 seg->SetStart( aElem.
start );
4350 seg->SetEnd( aElem.
end );
4352 seg->SetLayer( layerExpansionMask.first );
4361 const int aPrimitiveIndex,
4362 const bool aIsBoardImport )
4366 wxFAIL_MSG( wxString::Format(
"Altium: Unexpected footprint Track with polygon id %u",
4402 int width = aElem.
width + ( layerExpansionMask.second * 2 );
4405 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::SEGMENT );
4407 seg->SetStart( aElem.
start );
4408 seg->SetEnd( aElem.
end );
4410 seg->SetLayer( layerExpansionMask.first );
4422 std::unique_ptr<PCB_TRACK> track = std::make_unique<PCB_TRACK>(
m_board );
4424 track->SetStart( aElem.
start );
4425 track->SetEnd( aElem.
end );
4426 track->SetWidth( aElem.
width );
4427 track->SetLayer( aLayer );
4436 seg->SetStart( aElem.
start );
4437 seg->SetEnd( aElem.
end );
4439 seg->SetLayer( aLayer );
4449 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::SEGMENT );
4451 seg->SetStart( aElem.
start );
4452 seg->SetEnd( aElem.
end );
4454 seg->SetLayer( aLayer );
4461 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4471 THROW_IO_ERROR( wxT(
"WideStrings6 stream is not fully parsed" ) );
4475 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4533 std::unique_ptr<PCB_TEXTBOX> pcbTextbox = std::make_unique<PCB_TEXTBOX>(
m_board );
4534 std::unique_ptr<PCB_TEXT> pcbText = std::make_unique<PCB_TEXT>(
m_board );
4538 static const std::map<wxString, wxString> variableMap = {
4539 {
"LAYER_NAME",
"LAYER" },
4540 {
"PRINT_DATE",
"CURRENT_DATE"},
4549 item = pcbTextbox.get();
4550 text = pcbTextbox.get();
4561 text->SetText( kicadText );
4575 std::unique_ptr<PCB_TEXTBOX> fpTextbox = std::make_unique<PCB_TEXTBOX>( aFootprint );
4576 std::unique_ptr<PCB_TEXT> fpText = std::make_unique<PCB_TEXT>( aFootprint );
4591 item = &aFootprint->
Value();
4596 item = fpText.get();
4597 text = fpText.get();
4601 static const std::map<wxString, wxString> variableMap = {
4602 {
"DESIGNATOR",
"REFERENCE" },
4603 {
"COMMENT",
"VALUE" },
4604 {
"VALUE",
"ALTIUM_VALUE" },
4605 {
"LAYER_NAME",
"LAYER" },
4606 {
"PRINT_DATE",
"CURRENT_DATE"},
4611 item = fpTextbox.get();
4612 text = fpTextbox.get();
4625 text->SetText( kicadText );
4626 text->SetKeepUpright(
false );
4642 std::unique_ptr<PCB_BARCODE> pcbBarcode = std::make_unique<PCB_BARCODE>(
m_board );
4644 pcbBarcode->SetLayer( aLayer );
4645 pcbBarcode->SetPosition( aElem.
position );
4649 pcbBarcode->SetText( aElem.
text );
4659 pcbBarcode->AssembleBarcode();
4668 std::unique_ptr<PCB_BARCODE> fpBarcode = std::make_unique<PCB_BARCODE>( aFootprint );
4670 fpBarcode->SetLayer( aLayer );
4671 fpBarcode->SetPosition( aElem.
position );
4675 fpBarcode->SetText( aElem.
text );
4685 fpBarcode->AssembleBarcode();
4714 kicadMargin =
VECTOR2I( charWidth * 0.933, charHeight * 0.67 );
4716 kicadMargin =
VECTOR2I( charWidth * 0.808, charHeight * 0.844 );
4719 + kicadMargin * 2 - margin * 2 );
4721 kposition = kposition - kicadMargin + margin;
4739 switch( justification )
4763 msg.Printf(
_(
"Unknown textbox justification %d, aText %s" ), justification,
4783 int rectHeight = aElem.
height;
4786 rectWidth = -rectWidth;
4792 switch( justification )
4798 kposition.
y -= rectHeight;
4804 kposition.
y -= rectHeight / 2;
4814 kposition.
x += rectWidth / 2;
4815 kposition.
y -= rectHeight;
4821 kposition.
x += rectWidth / 2;
4822 kposition.
y -= rectHeight / 2;
4828 kposition.
x += rectWidth / 2;
4834 kposition.
x += rectWidth;
4835 kposition.
y -= rectHeight;
4841 kposition.
x += rectWidth;
4842 kposition.
y -= rectHeight / 2;
4848 kposition.
x += rectWidth;
4901 if( font->
GetName().Contains( wxS(
"Arial" ) ) )
4916 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4974 const bool aIsBoardImport )
5016 fill->SetFilled(
true );
5017 fill->SetLayer( aLayer );
5020 fill->SetStart( aElem.
pos1 );
5021 fill->SetEnd( aElem.
pos2 );
5043 if( aLayer ==
F_Cu || aLayer ==
B_Cu )
5045 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
5048 padLayers.
set( aLayer );
5063 std::swap( width, height );
5066 pad->SetPosition( aElem.
pos1 / 2 + aElem.
pos2 / 2 );
5078 pad->SetPosition( anchorPos );
5089 aElem.
pos1.
y / 2 + aElem.
pos2.
y / 2 - anchorPos.
y );
5091 pad->AddPrimitivePoly(
F_Cu, shapePolys, 0,
true );
5095 pad->SetLayerSet( padLayers );
5101 std::unique_ptr<PCB_SHAPE> fill =
5104 fill->SetFilled(
true );
5105 fill->SetLayer( aLayer );
5108 fill->SetStart( aElem.
pos1 );
5109 fill->SetEnd( aElem.
pos2 );
5128 layerSet.
set( klayer );
5136 bool keepoutRestrictionVia = ( aKeepoutRestrictions & 0x01 ) != 0;
5137 bool keepoutRestrictionTrack = ( aKeepoutRestrictions & 0x02 ) != 0;
5138 bool keepoutRestrictionCopper = ( aKeepoutRestrictions & 0x04 ) != 0;
5139 bool keepoutRestrictionSMDPad = ( aKeepoutRestrictions & 0x08 ) != 0;
5140 bool keepoutRestrictionTHPad = ( aKeepoutRestrictions & 0x10 ) != 0;
5152 const uint8_t aKeepoutRestrictions )
5154 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
5156 zone->SetIsRuleArea(
true );
5173 const uint8_t aKeepoutRestrictions )
5175 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( aFootprint );
5177 zone->SetIsRuleArea(
true );
5201 if( elems.first == elems.second )
5204 std::vector<std::pair<PCB_LAYER_ID, int>> layerExpansionPairs;
5206 for(
auto it = elems.first; it != elems.second; ++it )
5246 return layerExpansionPairs;
std::string FormatPath(const std::vector< std::string > &aVectorPath)
Helper for debug logging (vector -> string)
const uint16_t ALTIUM_NET_UNCONNECTED
const uint16_t ALTIUM_POLYGON_NONE
const uint16_t ALTIUM_POLYGON_BOARD
const int ALTIUM_COMPONENT_NONE
LIB_ID AltiumToKiCadLibID(const wxString &aLibName, const wxString &aLibReference)
wxString AltiumPcbSpecialStringsToKiCadStrings(const wxString &aString, const std::map< wxString, wxString > &aOverrides)
static bool IsLayerNameAssembly(const wxString &aName)
void HelperShapeLineChainFromAltiumVertices(SHAPE_LINE_CHAIN &aLine, const std::vector< ALTIUM_VERTICE > &aVertices)
double normalizeAngleDegrees(double Angle, double aMin, double aMax)
Normalize angle to be aMin < angle <= aMax angle is in degrees.
constexpr double BOLD_FACTOR
static bool IsLayerNameCourtyard(const wxString &aName)
bool IsAltiumLayerCopper(ALTIUM_LAYER aLayer)
bool IsAltiumLayerAPlane(ALTIUM_LAYER aLayer)
static bool IsLayerNameTopSide(const wxString &aName)
@ EXTENDPRIMITIVEINFORMATION
std::function< void(const ALTIUM_PCB_COMPOUND_FILE &, const CFB::COMPOUND_FILE_ENTRY *)> PARSE_FUNCTION_POINTER_fp
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
LAYER_T
The allowed types of layers, same as Specctra DSN spec.
#define DEFAULT_BOARD_THICKNESS_MM
@ BS_ITEM_TYPE_DIELECTRIC
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
size_t GetRemainingBytes() const
std::map< uint32_t, wxString > ReadWideStringTable()
size_t ReadAndSetSubrecordLength()
std::map< wxString, wxString > ReadProperties(std::function< std::map< wxString, wxString >(const std::string &)> handleBinaryData=[](const std::string &) { return std::map< wxString, wxString >();})
const CFB::CompoundFileReader & GetCompoundFileReader() const
const CFB::COMPOUND_FILE_ENTRY * FindStream(const std::vector< std::string > &aStreamPath) const
const std::pair< AMODEL, std::vector< char > > * GetLibModel(const wxString &aModelID) const
std::tuple< wxString, const CFB::COMPOUND_FILE_ENTRY * > FindLibFootprintDirName(const wxString &aFpUnicodeName)
PROGRESS_REPORTER * m_progressReporter
optional; may be nullptr
void ParseClasses6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
std::vector< PCB_DIM_RADIAL * > m_radialDimensions
void ConvertArcs6ToFootprintItemOnLayer(FOOTPRINT *aFootprint, const AARC6 &aElem, PCB_LAYER_ID aLayer)
void ConvertTracks6ToBoardItem(const ATRACK6 &aElem, const int aPrimitiveIndex)
void ConvertTracks6ToFootprintItem(FOOTPRINT *aFootprint, const ATRACK6 &aElem, const int aPrimitiveIndex, const bool aIsBoardImport)
int m_highest_pour_index
Altium stores pour order across all layers.
void ConvertTexts6ToFootprintItemOnLayer(FOOTPRINT *aFootprint, const ATEXT6 &aElem, PCB_LAYER_ID aLayer)
std::map< ALTIUM_LAYER, PCB_LAYER_ID > m_layermap
void ConvertShapeBasedRegions6ToBoardItemOnLayer(const AREGION6 &aElem, PCB_LAYER_ID aLayer)
void ParseVias6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void HelperParseDimensions6Leader(const ADIMENSION6 &aElem)
wxString m_footprintName
for footprint library loading error reporting
std::vector< FOOTPRINT * > m_components
void HelperFillMechanicalLayerAssignments(const std::vector< ABOARD6_LAYER_STACKUP > &aStackup)
void ParseShapeBasedRegions6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
const ARULE6 * GetRuleDefault(ALTIUM_RULE_KIND aKind) const
void HelperParsePad6NonCopper(const APAD6 &aElem, PCB_LAYER_ID aLayer, PCB_SHAPE *aShape)
void ParseRegions6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
std::vector< PCB_LAYER_ID > GetKicadLayersToIterate(ALTIUM_LAYER aAltiumLayer) const
void ConvertShapeBasedRegions6ToFootprintItem(FOOTPRINT *aFootprint, const AREGION6 &aElem, const int aPrimitiveIndex)
void HelperPcpShapeAsFootprintKeepoutRegion(FOOTPRINT *aFootprint, const PCB_SHAPE &aShape, const ALTIUM_LAYER aAltiumLayer, const uint8_t aKeepoutRestrictions)
void ConvertArcs6ToBoardItem(const AARC6 &aElem, const int aPrimitiveIndex)
void ConvertShapeBasedRegions6ToFootprintItemOnLayer(FOOTPRINT *aFootprint, const AREGION6 &aElem, PCB_LAYER_ID aLayer, const int aPrimitiveIndex)
std::map< ALTIUM_LAYER, ZONE * > m_outer_plane
std::vector< int > m_altiumToKicadNetcodes
unsigned m_totalCount
for progress reporting
void ParseComponents6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void HelperPcpShapeAsBoardKeepoutRegion(const PCB_SHAPE &aShape, const ALTIUM_LAYER aAltiumLayer, const uint8_t aKeepoutRestrictions)
std::map< wxString, ALTIUM_EMBEDDED_MODEL_DATA > m_EmbeddedModels
void ConvertFills6ToBoardItemOnLayer(const AFILL6 &aElem, PCB_LAYER_ID aLayer)
std::vector< std::pair< PCB_LAYER_ID, int > > HelperGetSolderAndPasteMaskExpansions(const ALTIUM_RECORD aType, const int aPrimitiveIndex, const ALTIUM_LAYER aAltiumLayer)
void ConvertBarcodes6ToBoardItemOnLayer(const ATEXT6 &aElem, PCB_LAYER_ID aLayer)
void ConvertComponentBody6ToFootprintItem(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, FOOTPRINT *aFootprint, const ACOMPONENTBODY6 &aElem)
void HelperSetTextAlignmentAndPos(const ATEXT6 &aElem, EDA_TEXT *aEdaText)
void ParseBoard6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertFills6ToFootprintItem(FOOTPRINT *aFootprint, const AFILL6 &aElem, const bool aIsBoardImport)
void ParseExtendedPrimitiveInformationData(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ParseFileHeader(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertShapeBasedRegions6ToBoardItem(const AREGION6 &aElem)
void HelperCreateBoardOutline(const std::vector< ALTIUM_VERTICE > &aVertices)
std::map< ALTIUM_RULE_KIND, std::vector< ARULE6 > > m_rules
void ConvertVias6ToFootprintItem(FOOTPRINT *aFootprint, const AVIA6 &aElem)
void ParseRules6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void HelperSetZoneKeepoutRestrictions(ZONE &aZone, const uint8_t aKeepoutRestrictions)
void HelperParseDimensions6Linear(const ADIMENSION6 &aElem)
void ParseTracks6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
std::map< uint32_t, wxString > m_unicodeStrings
void ConvertTexts6ToBoardItem(const ATEXT6 &aElem)
void HelperParseDimensions6Center(const ADIMENSION6 &aElem)
void HelperParseDimensions6Radial(const ADIMENSION6 &aElem)
void ParseBoardRegionsData(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ParseArcs6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertTexts6ToBoardItemOnLayer(const ATEXT6 &aElem, PCB_LAYER_ID aLayer)
void ConvertPads6ToFootprintItemOnCopper(FOOTPRINT *aFootprint, const APAD6 &aElem)
FOOTPRINT * ParseFootprint(ALTIUM_PCB_COMPOUND_FILE &altiumLibFile, const wxString &aFootprintName)
REPORTER * m_reporter
optional; may be nullptr
int GetNetCode(uint16_t aId) const
void ConvertTexts6ToEdaTextSettings(const ATEXT6 &aElem, EDA_TEXT &aEdaText)
wxString m_library
for footprint library loading error reporting
void ConvertPads6ToFootprintItemOnNonCopper(FOOTPRINT *aFootprint, const APAD6 &aElem)
void ConvertTexts6ToFootprintItem(FOOTPRINT *aFootprint, const ATEXT6 &aElem)
unsigned m_lastProgressCount
void ParseFills6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertArcs6ToFootprintItem(FOOTPRINT *aFootprint, const AARC6 &aElem, const int aPrimitiveIndex, const bool aIsBoardImport)
void HelperParseDimensions6Datum(const ADIMENSION6 &aElem)
void ConvertPads6ToBoardItem(const APAD6 &aElem)
void ConvertFills6ToFootprintItemOnLayer(FOOTPRINT *aFootprint, const AFILL6 &aElem, PCB_LAYER_ID aLayer)
void ParseWideStrings6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void remapUnsureLayers(std::vector< ABOARD6_LAYER_STACKUP > &aStackup)
std::vector< ZONE * > m_polygons
void ParsePads6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertArcs6ToPcbShape(const AARC6 &aElem, PCB_SHAPE *aShape)
void ConvertTracks6ToBoardItemOnLayer(const ATRACK6 &aElem, PCB_LAYER_ID aLayer)
void ConvertFills6ToBoardItem(const AFILL6 &aElem)
FOOTPRINT * HelperGetFootprint(uint16_t aComponent) const
LAYER_MAPPING_HANDLER m_layerMappingHandler
void ParsePolygons6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
PCB_LAYER_ID GetKicadLayer(ALTIUM_LAYER aAltiumLayer) const
void ParseComponentsBodies6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertTracks6ToFootprintItemOnLayer(FOOTPRINT *aFootprint, const ATRACK6 &aElem, PCB_LAYER_ID aLayer)
void Parse(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const std::map< ALTIUM_PCB_DIR, std::string > &aFileMapping)
ALTIUM_PCB(BOARD *aBoard, PROGRESS_REPORTER *aProgressReporter, LAYER_MAPPING_HANDLER &aLayerMappingHandler, REPORTER *aReporter=nullptr, const wxString &aLibrary=wxEmptyString, const wxString &aFootprintName=wxEmptyString)
void ConvertArcs6ToBoardItemOnLayer(const AARC6 &aElem, PCB_LAYER_ID aLayer)
void ParseTexts6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
std::map< ALTIUM_RECORD, std::multimap< int, const AEXTENDED_PRIMITIVE_INFORMATION > > m_extendedPrimitiveInformationMaps
void ParseModelsData(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry, const std::vector< std::string > &aRootDir)
std::map< ALTIUM_LAYER, wxString > m_layerNames
void ConvertPads6ToBoardItemOnNonCopper(const APAD6 &aElem)
void HelperSetTextboxAlignmentAndPos(const ATEXT6 &aElem, PCB_TEXTBOX *aPcbTextbox)
void ConvertBarcodes6ToFootprintItemOnLayer(FOOTPRINT *aFootprint, const ATEXT6 &aElem, PCB_LAYER_ID aLayer)
void ParseNets6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void ConvertPads6ToFootprintItem(FOOTPRINT *aFootprint, const APAD6 &aElem)
const ARULE6 * GetRule(ALTIUM_RULE_KIND aKind, const wxString &aName) const
void ParseDimensions6Data(const ALTIUM_PCB_COMPOUND_FILE &aAltiumPcbFile, const CFB::COMPOUND_FILE_ENTRY *aEntry)
void HelperSetZoneLayers(ZONE &aZone, const ALTIUM_LAYER aAltiumLayer)
static wxString ReadString(const std::map< wxString, wxString > &aProps, const wxString &aKey, const wxString &aDefault)
BASE_SET & set(size_t pos)
Container for design settings for a BOARD object.
void SetGridOrigin(const VECTOR2I &aOrigin)
const VECTOR2I & GetGridOrigin() const
void SetAuxOrigin(const VECTOR2I &aOrigin)
const VECTOR2I & GetAuxOrigin() const
BOARD_STACKUP & GetStackupDescriptor()
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual void SetIsKnockout(bool aKnockout)
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
virtual LSET BoardLayerSet() const
Return the LSET for the board that this item resides on.
Manage layers needed to make a physical board.
void RemoveAll()
Delete all items in list and clear the list.
const std::vector< BOARD_STACKUP_ITEM * > & GetList() const
int BuildBoardThicknessFromStackup() const
void BuildDefaultStackupList(const BOARD_DESIGN_SETTINGS *aSettings, int aActiveCopperLayersCount=0)
Create a default stackup, according to the current BOARD_DESIGN_SETTINGS settings.
Information pertinent to a Pcbnew printed circuit board.
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr size_type GetHeight() const
bool IsHorizontal() const
bool IsCardinal90() const
EDA_ANGLE GetArcAngle() const
void SetCenter(const VECTOR2I &aCenter)
virtual void SetFilled(bool aFlag)
void SetStart(const VECTOR2I &aStart)
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
void SetShape(SHAPE_T aShape)
void SetEnd(const VECTOR2I &aEnd)
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
int GetTextHeight() const
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
void SetTextPos(const VECTOR2I &aPoint)
KIFONT::FONT * GetFont() const
void SetMirrored(bool isMirrored)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
void SetBoldFlag(bool aBold)
Set only the bold flag, without changing the font.
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
GR_TEXT_V_ALIGN_T GetVertJustify() const
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 SetFont(KIFONT::FONT *aFont)
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
wxString GetEmbeddedFileLink(const EMBEDDED_FILE &aFile) const
Return the link for an embedded file.
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
static RETURN_CODE CompressAndEncode(EMBEDDED_FILE &aFile)
Take data from the #decompressedData buffer and compresses it using ZSTD into the #compressedEncodedD...
VECTOR3D m_Offset
3D model offset (mm)
VECTOR3D m_Rotation
3D model rotation (degrees)
wxString m_Filename
The 3D shape filename in 3D library.
FONT is an abstract base class for both outline and stroke fonts.
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
virtual bool IsStroke() const
const wxString & GetName() const
virtual bool IsOutline() const
LAYER_RANGE_ITERATOR begin() const
A logical library item identifier and consists of various portions much like a URI.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllBoardTechMask()
Return a mask holding board technical layers (no CU layer) on both side.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static const LSET & UserMask()
static LSET UserDefinedLayersMask(int aUserDefinedLayerCount=MAX_USER_DEFINED_LAYERS)
Return a mask with the requested number of user defined layers.
static const LSET & InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
Handle the data for a net.
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
void SetRoundRectRadiusRatio(double aRatio, PCB_LAYER_ID aLayer)
void SetChamferRatio(double aRatio, PCB_LAYER_ID aLayer)
void SetShape(PAD_SHAPE aShape, PCB_LAYER_ID aLayer)
void SetChamferPositions(int aPositions, PCB_LAYER_ID aLayer)
@ NORMAL
Shape is the same on all layers.
@ CUSTOM
Shapes can be defined on arbitrary layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
void SetSize(const VECTOR2I &aSize, PCB_LAYER_ID aLayer)
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
static constexpr PCB_LAYER_ID INNER_LAYERS
! The layer identifier to use for "inner layers" on top/inner/bottom padstacks
static LSET PTHMask()
layer set for a through hole pad
static LSET UnplatedHoleMask()
layer set for a mechanical unplated through hole pad
static LSET SMDMask()
layer set for a SMD pad on Front layer
virtual VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
A radial dimension indicates either the radius or diameter of an arc or circle.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetPosition(const VECTOR2I &aPos) override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetStroke(const STROKE_PARAMS &aStroke) override
VECTOR2I GetPosition() const override
void SetBorderEnabled(bool enabled)
void SetMarginTop(int aTop)
void SetMarginLeft(int aLeft)
void SetMarginBottom(int aBottom)
void SetTextAngle(const EDA_ANGLE &aAngle) override
void SetMarginRight(int aRight)
A progress reporter interface for use in multi-threaded environments.
A pure virtual class used to derive REPORTER objects from.
OPT_VECTOR2I Intersect(const SEG &aSeg, bool aIgnoreEndpoints=false, bool aLines=false) const
Compute intersection point of segment (this) with segment aSeg.
const VECTOR2I & GetArcMid() const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const SHAPE_ARC & Arc(size_t aArc) const
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
int PointCount() const
Return the number of points (vertices) in this line chain.
ssize_t ArcIndex(size_t aSegment) const
Return the arc index for the given segment index.
SEG Segment(int aIndex) const
Return a copy of the aIndex-th segment in the line chain.
int NextShape(int aPointIndex) const
Return the vertex index of the next shape in the chain, or -1 if aPointIndex is the last shape.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
bool IsArcStart(size_t aIndex) const
Represent a set of closed polygons.
void Rotate(const EDA_ANGLE &aAngle, const VECTOR2I &aCenter={ 0, 0 }) override
Rotate all vertices by a given angle.
void BooleanAdd(const SHAPE_POLY_SET &b)
Perform boolean polyset union.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int AddHole(const SHAPE_LINE_CHAIN &aHole, int aOutline=-1)
Adds a new hole to the given outline (default: last) and returns its index.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int NewOutline()
Creates a new empty polygon in the set and returns its index.
int OutlineCount() const
Return the number of outlines in the set.
void Move(const VECTOR2I &aVector) override
void Fracture(bool aSimplify=true)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
Simple container to manage line stroke parameters.
constexpr extended_type Cross(const VECTOR2< T > &aVector) const
Compute cross product of self with aVector.
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
constexpr VECTOR2< T > Perpendicular() const
Compute the perpendicular vector.
VECTOR2< T > Resize(T aNewLength) const
Return a vector of the same direction, but length specified in aNewLength.
Handle a list of polygons defining a copper zone.
void SetNeedRefill(bool aNeedRefill)
void SetDoNotAllowPads(bool aEnable)
SHAPE_POLY_SET * GetFill(PCB_LAYER_ID aLayer)
void SetDoNotAllowTracks(bool aEnable)
void SetFilledPolysList(PCB_LAYER_ID aLayer, const SHAPE_POLY_SET &aPolysList)
Set the list of filled polygons.
void SetIsFilled(bool isFilled)
bool HasFilledPolysForLayer(PCB_LAYER_ID aLayer) const
void SetLayerSet(const LSET &aLayerSet) override
void SetDoNotAllowVias(bool aEnable)
void SetDoNotAllowFootprints(bool aEnable)
void SetDoNotAllowZoneFills(bool aEnable)
static int GetDefaultHatchPitch()
@ CHAMFER_ACUTE_CORNERS
Acute angles are chamfered.
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_45
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
bool m_ImportSkipComponentBodies
Skip importing component bodies when importing some format files, such as Altium.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define MAX_USER_DEFINED_LAYERS
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
size_t CopperLayerToOrdinal(PCB_LAYER_ID aLayer)
Converts KiCad copper layer enum to an ordinal between the front and back layers.
PCB_LAYER_ID
A quick note on layer IDs:
void for_all_pairs(_InputIterator __first, _InputIterator __last, _Function __f)
Apply a function to every possible pair of elements of a sequence.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
BARCODE class definition.
std::function< std::map< wxString, PCB_LAYER_ID >(const std::vector< INPUT_LAYER_DESC > &)> LAYER_MAPPING_HANDLER
Pointer to a function that takes a map of source and KiCad layers and returns a re-mapped version.
std::optional< VECTOR2I > OPT_VECTOR2I
wxString NotSpecifiedPrm()
uint8_t keepoutrestrictions
wxString dielectricmaterial
std::vector< ABOARD6_LAYER_STACKUP > stackup
std::vector< ALTIUM_VERTICE > board_vertices
std::vector< wxString > names
wxString sourceHierachicalPath
wxString sourcefootprintlibrary
wxString sourcedesignator
std::vector< VECTOR2I > textPoint
ALTIUM_DIMENSION_KIND kind
std::vector< VECTOR2I > referencePoint
uint8_t keepoutrestrictions
std::vector< ABOARD6_LAYER_STACKUP > stackup
std::vector< char > m_data
ALTIUM_PAD_SHAPE inner_shape[29]
ALTIUM_PAD_HOLE_SHAPE holeshape
ALTIUM_PAD_SHAPE_ALT alt_shape[32]
int32_t soldermaskexpansionmanual
std::unique_ptr< APAD6_SIZE_AND_SHAPE > sizeAndShape
ALTIUM_PAD_SHAPE topshape
ALTIUM_MODE pastemaskexpansionmode
ALTIUM_MODE soldermaskexpansionmode
ALTIUM_PAD_SHAPE botshape
ALTIUM_PAD_SHAPE midshape
int32_t pastemaskexpansionmanual
int32_t pad_to_die_length
std::vector< ALTIUM_VERTICE > vertices
ALTIUM_POLYGON_HATCHSTYLE hatchstyle
uint8_t keepoutrestrictions
std::vector< ALTIUM_VERTICE > outline
std::vector< std::vector< ALTIUM_VERTICE > > holes
ALTIUM_CONNECT_STYLE polygonconnectStyle
int planeclearanceClearance
int32_t polygonconnectReliefconductorwidth
int32_t polygonconnectAirgapwidth
uint32_t text_offset_width
uint32_t textbox_rect_height
ALTIUM_TEXT_POSITION textbox_rect_justification
uint32_t textbox_rect_width
uint32_t margin_border_width
bool isJustificationValid
ALTIUM_BARCODE_TYPE barcode_type
ALTIUM_TEXT_TYPE fonttype
uint8_t keepoutrestrictions
int32_t soldermask_expansion_front
bool soldermask_expansion_manual
int32_t soldermask_expansion_back
uint32_t diameter_by_layer[32]
std::vector< char > decompressedData
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
BS::priority_thread_pool thread_pool
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
double DEG2RAD(double deg)
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
VECTOR2< int32_t > VECTOR2I
VECTOR3< double > VECTOR3D
@ THERMAL
Use thermal relief for pads.
@ NONE
Pads are not covered.
@ FULL
pads are covered by copper