52#include <compoundfilereader.h>
59#include <wx/docview.h>
61#include <wx/mstream.h>
62#include <wx/wfstream.h>
63#include <wx/zstream.h>
65#include <magic_enum.hpp>
88 THROW_IO_ERROR( wxString::Format( wxT(
"Component creator tries to access component id %u "
89 "of %u existing components" ),
98 const std::vector<ALTIUM_VERTICE>& aVertices )
107 double startradiant =
DEG2RAD( vertex.startangle );
108 double endradiant =
DEG2RAD( vertex.endangle );
109 VECTOR2I arcStartOffset =
KiROUND( std::cos( startradiant ) * vertex.radius,
110 -std::sin( startradiant ) * vertex.radius );
112 VECTOR2I arcEndOffset =
KiROUND( std::cos( endradiant ) * vertex.radius,
113 -std::sin( endradiant ) * vertex.radius );
115 VECTOR2I arcStart = vertex.center + arcStartOffset;
116 VECTOR2I arcEnd = vertex.center + arcEndOffset;
121 if( arcStart.
Distance( vertex.position )
122 < arcEnd.
Distance( vertex.position ) )
149 aLine.
Append( vertex.position );
159 auto override =
m_layermap.find( aAltiumLayer );
163 return override->second;
178 switch( aAltiumLayer )
280 std::vector<PCB_LAYER_ID> layers;
281 layers.reserve( layerCount );
286 layers.emplace_back( layer );
303 const wxString& aLibrary,
const wxString& aFootprintName )
323 const unsigned PROGRESS_DELTA = 250;
341 const std::map<ALTIUM_PCB_DIR, std::string>& aFileMapping )
344 const std::vector<std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>> parserOrder = {
456 for(
const std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>& cur : parserOrder )
461 std::tie( isRequired,
directory, fp ) = cur;
466 const auto& mappedDirectory = aFileMapping.find(
directory );
468 if( mappedDirectory == aFileMapping.end() )
471 const std::vector<std::string> mappedFile{ mappedDirectory->second,
"Header" };
472 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
474 if( file ==
nullptr )
478 uint32_t numOfRecords = reader.
Read<uint32_t>();
484 m_reporter->Report( wxString::Format(
_(
"'%s' was not parsed correctly." ),
498 m_reporter->Report( wxString::Format(
_(
"'%s' was not fully parsed." ),
510 if( boardDirectory != aFileMapping.end() )
512 std::vector<std::string> mappedFile{ boardDirectory->second,
"Data" };
514 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
519 "This file does not appear to be in a valid PCB Binary Version 6.0 format. In "
521 "make sure to save as \"PCB Binary Files (*.PcbDoc)\"." ) );
526 for(
const std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>& cur : parserOrder )
531 std::tie( isRequired,
directory, fp ) = cur;
533 const auto& mappedDirectory = aFileMapping.find(
directory );
535 if( mappedDirectory == aFileMapping.end() )
537 wxASSERT_MSG( !isRequired, wxString::Format( wxT(
"Altium Directory of kind %d was "
538 "expected, but no mapping is "
539 "present in the code" ),
544 std::vector<std::string> mappedFile{ mappedDirectory->second };
547 mappedFile.emplace_back(
"Data" );
549 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
551 if( file !=
nullptr )
553 fp( altiumPcbFile, file );
555 else if( isRequired )
559 m_reporter->Report( wxString::Format(
_(
"File not found: '%s' for directory '%s'." ),
574 if( zone->GetAssignedPriority() == 1000 )
585 zone->SetAssignedPriority( priority >= 0 ? priority : 0 );
589 for( std::pair<const ALTIUM_LAYER, ZONE*>& zone :
m_outer_plane )
590 zone.second->SetAssignedPriority( 0 );
600 if( !zone->HasFilledPolysForLayer( layer ) )
603 zone->GetFilledPolysList( layer )->Fracture();
641 if( arc->
GetCenter() == dim->GetPosition() )
650 VECTOR2I radialLine = dim->GetEnd() - dim->GetStart();
655 radialLine = radialLine.
Resize( std::max(
radius, 2 ) );
656 dim->SetEnd( dim->GetStart() + (
VECTOR2I) radialLine );
657 dim->SetLeaderLength( totalLength -
radius );
667 int desired_x = ( w - bbbox.
GetWidth() ) / 2;
668 int desired_y = ( h - bbbox.
GetHeight() ) / 2;
670 VECTOR2I movementVector( desired_x - bbbox.
GetX(), desired_y - bbbox.
GetY() );
671 m_board->Move( movementVector );
682 const wxString& aFootprintName )
684 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
689 const std::vector<std::string> libStreamName{
"Library",
"Data" };
690 const CFB::COMPOUND_FILE_ENTRY* libStream = altiumLibFile.
FindStream( libStreamName );
692 if( libStream ==
nullptr )
710 std::tuple<wxString, const CFB::COMPOUND_FILE_ENTRY*> ret =
713 wxString fpDirName = std::get<0>( ret );
714 const CFB::COMPOUND_FILE_ENTRY* footprintStream = std::get<1>( ret );
716 if( fpDirName.IsEmpty() )
719 wxString::Format(
_(
"Footprint directory not found: '%s'." ), aFootprintName ) );
722 const std::vector<std::string> streamName{ fpDirName.ToStdString(),
"Data" };
723 const CFB::COMPOUND_FILE_ENTRY* footprintData = altiumLibFile.
FindStream( footprintStream, {
"Data" } );
725 if( footprintData ==
nullptr )
738 footprint->SetFPID( fpID );
740 const std::vector<std::string> parametersStreamName{ fpDirName.ToStdString(),
742 const CFB::COMPOUND_FILE_ENTRY* parametersData =
743 altiumLibFile.
FindStream( footprintStream, {
"Parameters" } );
745 if( parametersData !=
nullptr )
748 std::map<wxString, wxString> parameterProperties = parametersReader.
ReadProperties();
750 wxT(
"DESCRIPTION" ), wxT(
"" ) );
751 footprint->SetLibDescription( description );
757 m_reporter->Report( wxString::Format(
_(
"File not found: '%s'." ),
762 footprint->SetLibDescription( wxT(
"" ) );
765 const std::vector<std::string> extendedPrimitiveInformationStreamName{
766 "ExtendedPrimitiveInformation",
"Data"
768 const CFB::COMPOUND_FILE_ENTRY* extendedPrimitiveInformationData =
769 altiumLibFile.
FindStream( footprintStream, extendedPrimitiveInformationStreamName );
771 if( extendedPrimitiveInformationData !=
nullptr )
774 footprint->SetReference( wxT(
"REF**" ) );
775 footprint->SetValue( aFootprintName );
776 footprint->Reference().SetVisible(
true );
777 footprint->Value().SetVisible(
true );
780 const int defaultTextThickness(
pcbIUScale.mmToIU( 0.15 ) );
782 for(
PCB_FIELD* field : footprint->GetFields() )
784 field->SetTextSize( defaultTextSize );
785 field->SetTextThickness( defaultTextThickness );
843 THROW_IO_ERROR( wxString::Format(
_(
"Record of unknown type: '%d'." ), recordtype ) );
849 for(
bool changes =
true; changes; )
854 [&changes](
PAD* aPad1,
PAD* aPad2 )
856 if( !( aPad1->GetNumber().IsEmpty() ^ aPad2->GetNumber().IsEmpty() ) )
859 for( PCB_LAYER_ID layer : aPad1->GetLayerSet() )
861 std::shared_ptr<SHAPE> shape1 = aPad1->GetEffectiveShape( layer );
862 std::shared_ptr<SHAPE> shape2 = aPad2->GetEffectiveShape( layer );
864 if( shape1->Collide( shape2.get() ) )
866 if( aPad1->GetNumber().IsEmpty() )
867 aPad1->SetNumber( aPad2->GetNumber() );
869 aPad2->SetNumber( aPad1->GetNumber() );
878 footprint->AutoPositionFields();
880 if( parser.HasParsingError() )
882 THROW_IO_ERROR( wxString::Format( wxT(
"%s stream was not parsed correctly" ),
886 if( parser.GetRemainingBytes() != 0 )
888 THROW_IO_ERROR( wxString::Format( wxT(
"%s stream is not fully parsed" ),
892 return footprint.release();
903 THROW_IO_ERROR( wxString::Format( wxT(
"Netcode with id %d does not exist. Only %d nets "
915 const auto rules =
m_rules.find( aKind );
920 for(
const ARULE6& rule : rules->second )
922 if( rule.
name == aName )
931 const auto rules =
m_rules.find( aKind );
936 for(
const ARULE6& rule : rules->second )
948 const auto rules =
m_rules.find( aKind );
962 const CFB::COMPOUND_FILE_ENTRY* aEntry )
980 const CFB::COMPOUND_FILE_ENTRY* aEntry )
997 THROW_IO_ERROR( wxT(
"ExtendedPrimitiveInformation stream is not fully parsed" ) );
1002 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1019 size_t layercount = 0;
1022 while( layerid < elem.
stackup.size() && layerid != 0 )
1024 layerid = elem.
stackup[ layerid - 1 ].nextId;
1028 size_t kicadLayercount = ( layercount % 2 == 0 ) ? layercount : layercount + 1;
1029 m_board->SetCopperLayerCount( kicadLayercount );
1038 auto it = stackup.
GetList().begin();
1047 altiumLayerId < elem.
stackup.size() && altiumLayerId != 0;
1048 altiumLayerId = elem.
stackup[altiumLayerId - 1].nextId )
1054 if( layer.
nextId == 0 && layercount != kicadLayercount )
1056 m_board->SetLayerName( ( *it )->GetBrdLayerId(), wxT(
"[unused]" ) );
1059 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1061 ( *it )->SetThickness( 0 );
1066 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1068 ( *it )->SetThickness( 0, 0 );
1069 ( *it )->SetThicknessLocked(
true, 0 );
1077 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1091 if( klayer ==
B_Cu )
1094 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected id while parsing last stackup layer" ) );
1104 THROW_IO_ERROR( wxT(
"Board6 stream, unexpected item while parsing stackup" ) );
1143 wxString nameLower = aName.Lower();
1144 return nameLower.Contains( wxT(
"courtyard" ) ) || nameLower.Contains( wxT(
"court yard" ) )
1145 || nameLower.Contains( wxT(
"crtyd" ) );
1152 wxString nameLower = aName.Lower();
1153 return nameLower.Contains( wxT(
"assembly" ) ) || nameLower.Contains( wxT(
"assy" ) );
1162 auto check = [&isTop](
bool aTopCond,
bool aBotCond )
1164 if( aTopCond && aBotCond )
1167 if( !aTopCond && !aBotCond )
1174 wxString lower = aName.Lower();
1176 if( check( lower.StartsWith(
"top" ), lower.StartsWith(
"bot" ) ) )
1179 if( check( lower.EndsWith(
"_t" ), lower.EndsWith(
"_b" ) ) )
1182 if( check( lower.EndsWith(
".t" ), lower.EndsWith(
".b" ) ) )
1185 if( check( lower.Contains(
"top" ), lower.Contains(
"bot" ) ) )
1198 if( aStackup.size() == 0 )
1201 std::vector<INPUT_LAYER_DESC> inputLayers;
1202 std::map<wxString, ALTIUM_LAYER> altiumLayerNameMap;
1209 bool frontCourtyardMapped =
false;
1210 bool backCourtyardMapped =
false;
1212 for(
size_t ii = 0; ii < aStackup.size(); ii++ )
1214 curLayer = aStackup[ii];
1233 auto existingMapping =
m_layermap.find( layer_num );
1260 if( isTopSide && !frontCourtyardMapped )
1263 frontCourtyardMapped =
true;
1265 else if( !isTopSide && !backCourtyardMapped )
1268 backCourtyardMapped =
true;
1270 else if( !frontCourtyardMapped )
1273 frontCourtyardMapped =
true;
1275 else if( !backCourtyardMapped )
1278 backCourtyardMapped =
true;
1301 inputLayers.push_back( iLdesc );
1302 altiumLayerNameMap.insert( { curLayer.
name, layer_num } );
1306 if( inputLayers.size() == 0 )
1312 for( std::pair<wxString, PCB_LAYER_ID> layerPair : reMappedLayers )
1320 m_reporter->Report( wxString::Format(
_(
"Layer '%s' could not be mapped and "
1321 "will be skipped." ),
1329 ALTIUM_LAYER altiumID = altiumLayerNameMap.at( layerPair.first );
1330 m_layermap.insert_or_assign( altiumID, layerPair.second );
1331 enabledLayers |=
LSET( { layerPair.second } );
1336 for(
const auto& [
name, altLayer] : altiumLayerNameMap )
1338 if( reMappedLayers.find(
name ) == reMappedLayers.end()
1345 m_board->SetEnabledLayers( enabledLayers );
1346 m_board->SetVisibleLayers( enabledLayers );
1359 if( !layer.mechenabled )
1367 switch( layer.mechkind )
1428 shape->SetStroke( stroke );
1440 shape->SetStroke( stroke );
1442 shape->SetStart( seg.
A );
1443 shape->SetEnd( seg.
B );
1452 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1466 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( elem.
name );
1468 for(
const wxString&
name : elem.
names )
1470 m_board->GetDesignSettings().m_NetSettings->SetNetclassPatternAssignment(
1471 name, nc->GetName() );
1474 if(
m_board->GetDesignSettings().m_NetSettings->HasNetclass( nc->GetName() ) )
1481 msg.Printf(
_(
"More than one Altium netclass with name '%s' found. "
1482 "Only the first one will be imported." ), elem.
name );
1488 m_board->GetDesignSettings().m_NetSettings->SetNetclass( nc->GetName(), nc );
1498 std::shared_ptr<NET_SETTINGS> netSettings =
m_board->GetDesignSettings().m_NetSettings;
1502 if( net->GetNetCode() > 0 )
1504 std::shared_ptr<NETCLASS> netclass = netSettings->GetEffectiveNetClass( net->GetNetname() );
1507 net->SetNetClass( netclass );
1511 m_board->m_LegacyNetclassesLoaded =
true;
1516 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1528 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
1539 wxString fpName = elem.
pattern;
1541 if( fpName.Contains( wxT(
"\\" ) ) || fpName.Contains( wxT(
"/" ) ) )
1543 wxFileName fpPath( fpName, wxPATH_WIN );
1544 fpName = fpPath.GetFullName();
1549 footprint->SetFPID( fpID );
1551 footprint->SetPosition( elem.
position );
1552 footprint->SetOrientationDegrees( elem.
rotation );
1558 if( reference.find_first_not_of(
"0123456789" ) == wxString::npos )
1559 reference.Prepend( wxT(
"UNK" ) );
1561 footprint->SetReference( reference );
1566 path.push_back( pathid );
1567 path.push_back(
id );
1569 footprint->SetPath(
path );
1573 footprint->SetLocked( elem.
locked );
1574 footprint->Reference().SetVisible( elem.
nameon );
1575 footprint->Value().SetVisible( elem.
commenton );
1583 THROW_IO_ERROR( wxT(
"Components6 stream is not fully parsed" ) );
1590 while( Angle < aMin )
1593 while( Angle >= aMax )
1616 m_reporter->Report( wxString::Format( wxT(
"Model %s not found for footprint %s" ),
1627 if( file->
name.IsEmpty() )
1631 std::vector<char> decompressedData;
1632 wxMemoryInputStream compressedStream(
model->second.data(),
model->second.size() );
1633 wxZlibInputStream zlibStream( compressedStream );
1637 decompressedData.resize(
model->second.size() * 6 );
1640 while( !zlibStream.Eof() )
1642 zlibStream.Read( decompressedData.data() + offset, decompressedData.size() - offset );
1643 size_t bytesRead = zlibStream.LastRead();
1648 offset += bytesRead;
1650 if( offset >= decompressedData.size() )
1651 decompressedData.resize( 2 * decompressedData.size() );
1654 decompressedData.resize( offset );
1675 orientation = -orientation;
1682 modelRotation.
x += 180;
1683 modelRotation.
z = -modelRotation.
z;
1697 aFootprint->
Models().push_back( modelSettings );
1702 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1708 BS::multi_future<void> embeddedFutures;
1719 if( skipComponentBodies )
1727 THROW_IO_ERROR( wxString::Format( wxT(
"ComponentsBodies6 stream tries to access "
1728 "component id %d of %zu existing components" ),
1743 msg.Printf( wxT(
"ComponentsBodies6 stream tries to access model id %s which does "
1744 "not exist" ), elem.
modelId );
1757 wxMemoryInputStream compressedStream( modelData.
m_data.data(), modelData.
m_data.size() );
1758 wxZlibInputStream zlibStream( compressedStream );
1759 wxMemoryOutputStream decompressedStream;
1761 zlibStream.Read( decompressedStream );
1767 embeddedFutures.push_back(
tp.submit_task(
1770 EMBEDDED_FILES::CompressAndEncode( *file );
1789 orientation = -orientation;
1812 footprint->
Models().push_back( modelSettings );
1815 embeddedFutures.wait();
1818 THROW_IO_ERROR( wxT(
"ComponentsBodies6 stream is not fully parsed" ) );
1825 THROW_IO_ERROR( wxT(
"Incorrect number of reference points for linear dimension object" ) );
1834 _(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
1835 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer ),
1848 dimension->SetLayer( klayer );
1849 dimension->SetStart( referencePoint0 );
1851 if( referencePoint0 != aElem.
xy1 )
1863 VECTOR2I referenceDiff = referencePoint1 - referencePoint0;
1865 SEG segm1( referencePoint0, referencePoint0 + directionNormalVector );
1866 SEG segm2( referencePoint1, referencePoint1 + direction );
1870 THROW_IO_ERROR( wxT(
"Invalid dimension. This should never happen." ) );
1872 dimension->SetEnd( *intersection );
1876 if( direction.
Cross( referenceDiff ) > 0 )
1879 dimension->SetHeight( height );
1883 dimension->SetEnd( referencePoint1 );
1886 dimension->SetLineThickness( aElem.
linewidth );
1892 int dist = ( dimension->GetEnd() - dimension->GetStart() ).EuclideanNorm();
1894 if( dist < 3 * dimension->GetArrowLength() )
1898 wxRegEx units( wxS(
"(mm)|(in)|(mils)|(thou)|(')|(\")" ), wxRE_ADVANCED );
1910 dimension->Text().SetBold( aElem.
textbold );
1913 dimension->SetTextThickness( dimension->GetTextThickness() *
BOLD_FACTOR );
1932 THROW_IO_ERROR( wxT(
"Not enough reference points for radial dimension object" ) );
1941 _(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
1942 "It has been moved to KiCad layer Eco1_User." ),
1951 std::unique_ptr<PCB_DIM_RADIAL> dimension = std::make_unique<PCB_DIM_RADIAL>(
m_board );
1954 dimension->SetLayer( klayer );
1955 dimension->SetStart( referencePoint0 );
1956 dimension->SetEnd( aElem.
xy1 );
1957 dimension->SetLineThickness( aElem.
linewidth );
1958 dimension->SetKeepTextAligned(
false );
1979 m_reporter->Report( wxT(
"No text position present for leader dimension object" ),
1986 dimension->SetTextPos( aElem.
textPoint.at( 0 ) );
1992 dimension->SetBold( aElem.
textbold );
1995 dimension->SetTextThickness( dimension->GetTextThickness() *
BOLD_FACTOR );
2003 int yAdjust = dimension->GetTextBox(
nullptr ).GetCenter().y - dimension->GetTextPos().y;
2004 dimension->SetTextPos( dimension->GetTextPos() +
VECTOR2I( 0, yAdjust + aElem.
textgap ) );
2021 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2022 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2039 shape->SetLayer( klayer );
2041 shape->SetStart( last );
2053 if( dirVec.
x != 0 || dirVec.
y != 0 )
2062 shape1->SetLayer( klayer );
2064 shape1->SetStart( referencePoint0 );
2065 shape1->SetEnd( referencePoint0 + arrVec );
2075 shape2->SetLayer( klayer );
2077 shape2->SetStart( referencePoint0 );
2078 shape2->SetEnd( referencePoint0 + arrVec );
2090 m_reporter->Report( wxT(
"No text position present for leader dimension object" ),
2097 std::unique_ptr<PCB_TEXT>
text = std::make_unique<PCB_TEXT>(
m_board );
2101 text->SetLayer( klayer );
2120 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2121 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2132 shape->SetLayer( klayer );
2151 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2152 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2162 std::unique_ptr<PCB_DIM_CENTER> dimension = std::make_unique<PCB_DIM_CENTER>(
m_board );
2164 dimension->SetLayer( klayer );
2165 dimension->SetLineThickness( aElem.
linewidth );
2166 dimension->SetStart( aElem.
xy1 );
2167 dimension->SetEnd( aElem.
xy1 + vec );
2174 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2194 m_reporter->Report( wxString::Format(
_(
"Ignored Angular dimension (not yet supported)." ) ),
2207 m_reporter->Report( wxString::Format(
_(
"Ignored Datum dimension (not yet supported)." ) ),
2215 m_reporter->Report( wxString::Format(
_(
"Ignored Baseline dimension (not yet supported)." ) ),
2225 m_reporter->Report( wxString::Format(
_(
"Ignored Linear dimension (not yet supported)." ) ),
2232 m_reporter->Report( wxString::Format(
_(
"Ignored Radial dimension (not yet supported)." ) ),
2240 msg.Printf(
_(
"Ignored dimension of kind %d (not yet supported)." ), elem.
kind );
2248 THROW_IO_ERROR( wxT(
"Dimensions6 stream is not fully parsed" ) );
2253 const CFB::COMPOUND_FILE_ENTRY* aEntry,
2254 const std::vector<std::string>& aRootDir )
2265 wxString invalidChars = wxFileName::GetForbiddenChars();
2272 std::vector<std::string> stepPath = aRootDir;
2273 stepPath.emplace_back( std::to_string( idx ) );
2275 bool validName = !elem.
name.IsEmpty() && elem.
name.IsAscii()
2276 && wxString::npos == elem.
name.find_first_of( invalidChars );
2277 wxString storageName = validName ? elem.
name : wxString::Format( wxT(
"model_%d" ), idx );
2281 const CFB::COMPOUND_FILE_ENTRY* stepEntry = aAltiumPcbFile.
FindStream( stepPath );
2283 if( stepEntry ==
nullptr )
2288 msg.Printf(
_(
"File not found: '%s'. 3D-model not imported." ),
FormatPath( stepPath ) );
2295 size_t stepSize =
static_cast<size_t>( stepEntry->size );
2296 std::vector<char> stepContent( stepSize );
2304 std::move( stepContent ) ) ) );
2308 std::map<wxString, std::vector<wxString>> nameIdMap;
2311 nameIdMap[data.m_modelname].push_back(
id );
2313 for(
auto& [
name, ids] : nameIdMap )
2315 for(
size_t i = 1; i < ids.size(); i++ )
2317 const wxString&
id = ids[i];
2324 wxString modelName = modelTuple->second.m_modelname;
2326 if( modelName.Contains(
"." ) )
2329 wxString baseName = modelName.BeforeLast(
'.', &ext );
2331 modelTuple->second.m_modelname = baseName +
'_' + std::to_string( i ) +
'.' + ext;
2335 modelTuple->second.m_modelname = modelName +
'_' + std::to_string( i );
2346 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2358 ANET6 elem( reader );
2372 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2415 msg.Printf(
_(
"Polygon outline count is %d, expected 1." ), outline.
OutlineCount() );
2423 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board);
2429 zone->SetPosition( elem.
vertices.at( 0 ).position );
2430 zone->SetLocked( elem.
locked );
2432 zone->Outline()->AddOutline( outline.
Outline( 0 ) );
2439 int planeLayers = 0;
2440 int signalLayers = 0;
2454 if( planeLayers > 0 && planeClearanceRule )
2457 if( signalLayers > 0 && zoneClearanceRule )
2465 if( polygonConnectRule !=
nullptr )
2484 zone->SetThermalReliefSpokeWidth(
2495 zone->SetAssignedPriority( 1 );
2500 || zone->GetBoundingBox().Contains( outer_plane->second->GetBoundingBox() ) )
2515 const BOX2I& bbox = zone->GetBoundingBox();
2524 zone->SetHatchOrientation(
ANGLE_45 );
2539 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2558 std::sort( val.second.begin(), val.second.end(),
2561 return lhs.priority < rhs.priority;
2574 if( trackWidthRule )
2576 m_board->GetDesignSettings().m_TrackMinWidth = trackWidthRule->
minLimit;
2580 if( routingViasRule )
2582 m_board->GetDesignSettings().m_ViasMinSize = routingViasRule->
minWidth;
2591 if( holeToHoleRule )
2597 if( soldermaskRule )
2608 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2624 THROW_IO_ERROR( wxT(
"BoardRegions stream is not fully parsed" ) );
2628 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2636 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
2655 THROW_IO_ERROR(
"ShapeBasedRegions6 stream is not fully parsed" );
2679 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
2681 zone->SetIsRuleArea(
true );
2689 zone->SetDoNotAllowZoneFills(
true );
2690 zone->SetDoNotAllowVias(
false );
2691 zone->SetDoNotAllowTracks(
false );
2692 zone->SetDoNotAllowPads(
false );
2693 zone->SetDoNotAllowFootprints(
false );
2696 zone->SetPosition( aElem.
outline.at( 0 ).position );
2697 zone->Outline()->AddOutline( linechain );
2717 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
2719 zone->SetPosition( aElem.
outline.at( 0 ).position );
2720 zone->Outline()->AddOutline( linechain );
2728 fill.
Append( linechain );
2732 zone->SetFilledPolysList( klayer, fill );
2734 zone->SetIsFilled(
true );
2735 zone->SetNeedRefill(
false );
2748 msg.Printf(
_(
"Dashed outline found on an Altium layer (%d) with no KiCad equivalent. "
2749 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2770 shape->SetPolyShape( linechain );
2771 shape->SetFilled(
false );
2772 shape->SetLayer( klayer );
2790 msg.Printf(
_(
"Ignored polygon shape of kind %d (not yet supported)." ), aElem.
kind );
2799 const int aPrimitiveIndex )
2815 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( aFootprint );
2817 zone->SetIsRuleArea(
true );
2825 zone->SetDoNotAllowZoneFills(
true );
2826 zone->SetDoNotAllowVias(
false );
2827 zone->SetDoNotAllowTracks(
false );
2828 zone->SetDoNotAllowPads(
false );
2829 zone->SetDoNotAllowFootprints(
false );
2832 zone->SetPosition( aElem.
outline.at( 0 ).position );
2833 zone->Outline()->AddOutline( linechain );
2867 msg.Printf(
_(
"Loading library '%s':\n"
2868 "Footprint %s contains a dashed outline on Altium layer (%d) with "
2869 "no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
2881 msg.Printf(
_(
"Footprint %s contains a dashed outline on Altium layer (%d) with "
2882 "no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
2904 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::POLY );
2906 shape->SetPolyShape( linechain );
2907 shape->SetFilled(
false );
2908 shape->SetLayer( klayer );
2924 msg.Printf(
_(
"Error loading library '%s':\n"
2925 "Footprint %s contains polygon shape of kind %d (not yet supported)." ),
2937 msg.Printf(
_(
"Footprint %s contains polygon shape of kind %d (not yet supported)." ),
2965 for(
const std::vector<ALTIUM_VERTICE>& hole : aElem.
holes )
2973 polySet.
AddHole( hole_linechain );
2978 shape->SetPolyShape( polySet );
2979 shape->SetFilled(
true );
2980 shape->SetLayer( aLayer );
2995 const int aPrimitiveIndex )
3012 for(
const std::vector<ALTIUM_VERTICE>& hole : aElem.
holes )
3020 polySet.
AddHole( hole_linechain );
3023 if( aLayer ==
F_Cu || aLayer ==
B_Cu )
3026 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3029 padLayers.
set( aLayer );
3040 pad->SetPosition( anchorPos );
3043 shapePolys.
Move( -anchorPos );
3047 auto it = map.find( aPrimitiveIndex );
3049 if( it != map.end() )
3055 pad->SetLocalSolderPasteMargin(
info.pastemaskexpansionmanual );
3060 pad->SetLocalSolderMaskMargin(
info.soldermaskexpansionmanual );
3070 pad->SetLayerSet( padLayers );
3076 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::POLY );
3078 shape->SetPolyShape( polySet );
3079 shape->SetFilled(
true );
3080 shape->SetLayer( aLayer );
3089 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3105 THROW_IO_ERROR( wxString::Format(
"Region stream tries to access polygon id %d "
3106 "of %d existing polygons.",
3113 if( zone ==
nullptr )
3135 for(
const std::vector<ALTIUM_VERTICE>& hole : elem.
holes )
3142 hole_linechain.
Append( hole.at( 0 ).position );
3144 fill.
AddHole( hole_linechain );
3164 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3171 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
3174 AARC6 elem( reader );
3225 THROW_IO_ERROR( wxString::Format(
"Tracks stream tries to access polygon id %u "
3226 "of %zu existing polygons.",
3232 if( zone ==
nullptr )
3280 for(
const auto& layerExpansionMask :
3283 int width = aElem.
width + ( layerExpansionMask.second * 2 );
3287 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>(
m_board );
3291 arc->SetLayer( layerExpansionMask.first );
3300 const int aPrimitiveIndex,
const bool aIsBoardImport )
3304 wxFAIL_MSG( wxString::Format(
"Altium: Unexpected footprint Arc with polygon id %d",
3337 for(
const auto& layerExpansionMask :
3340 int width = aElem.
width + ( layerExpansionMask.second * 2 );
3344 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( aFootprint );
3348 arc->SetLayer( layerExpansionMask.first );
3380 std::unique_ptr<PCB_ARC> arc = std::make_unique<PCB_ARC>(
m_board, &shapeArc );
3382 arc->SetWidth( aElem.
width );
3383 arc->SetLayer( aLayer );
3391 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>(
m_board);
3395 arc->SetLayer( aLayer );
3405 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( aFootprint );
3409 arc->SetLayer( aLayer );
3416 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3426 APAD6 elem( reader );
3455 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
3456 footprint->SetPosition( aElem.
position );
3467 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3469 pad->SetNumber(
"" );
3480 pad->SetLayerSet(
LSET().AllCuMask() );
3499 cuLayers &=
m_board->GetEnabledLayers();
3505 if( altiumIdx < 32 )
3515 pad->Padstack().FrontOuterLayers().has_solder_mask =
true;
3519 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
3525 pad->Padstack().BackOuterLayers().has_solder_mask =
true;
3529 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
3534 pad->SetLocked(
true );
3564 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3587 msg.Printf(
_(
"Error loading library '%s':\n"
3588 "Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
3600 msg.Printf(
_(
"Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
3620 wxFAIL_MSG( wxT(
"Round holes are handled before the switch" ) );
3629 msg.Printf(
_(
"Loading library '%s':\n"
3630 "Footprint %s pad %s has a square hole (not yet supported)." ),
3642 msg.Printf(
_(
"Footprint %s pad %s has a square hole (not yet supported)." ),
3677 msg.Printf(
_(
"Loading library '%s':\n"
3678 "Footprint %s pad %s has a hole-rotation of %d degrees. "
3679 "KiCad only supports 90 degree rotations." ),
3692 msg.Printf(
_(
"Footprint %s pad %s has a hole-rotation of %d degrees. "
3693 "KiCad only supports 90 degree rotations." ),
3712 msg.Printf(
_(
"Error loading library '%s':\n"
3713 "Footprint %s pad %s uses a hole of unknown kind %d." ),
3726 msg.Printf(
_(
"Footprint %s pad %s uses a hole of unknown kind %d." ),
3746 auto setCopperGeometry =
3791 msg.Printf(
_(
"Error loading library '%s':\n"
3792 "Footprint %s pad %s uses an unknown pad shape." ),
3804 msg.Printf(
_(
"Footprint %s pad %s uses an unknown pad shape." ),
3855 switch( aElem.
layer )
3873 pad->SetLayer( klayer );
3874 pad->SetLayerSet(
LSET( { klayer } ) );
3885 pad->SetLayerSet(
pad->GetLayerSet().reset(
F_Mask ) );
3888 pad->SetLayerSet(
pad->GetLayerSet().reset(
B_Mask ) );
3906 msg.Printf(
_(
"Non-copper pad %s found on an Altium layer (%d) with no KiCad "
3907 "equivalent. It has been moved to KiCad layer Eco1_User." ),
3915 std::unique_ptr<PCB_SHAPE>
pad = std::make_unique<PCB_SHAPE>(
m_board );
3934 msg.Printf(
_(
"Loading library '%s':\n"
3935 "Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
3936 "KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
3949 msg.Printf(
_(
"Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
3950 "KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
3961 std::unique_ptr<PCB_SHAPE>
pad = std::make_unique<PCB_SHAPE>( aFootprint );
3977 msg.Printf(
_(
"Non-copper pad %s is connected to a net, which is not supported." ),
3988 msg.Printf(
_(
"Non-copper pad %s has a hole, which is not supported." ), aElem.
name );
3998 msg.Printf(
_(
"Non-copper pad %s has a complex pad stack (not yet supported)." ),
4031 int offset = ( std::min( aElem.
topsize.
x, aElem.
topsize.
y ) * cornerradius ) / 200;
4036 if( cornerradius < 100 )
4038 int offsetX = aElem.
topsize.
x / 2 - offset;
4039 int offsetY = aElem.
topsize.
y / 2 - offset;
4132 aShape->
SetPolyPoints( { p11 - chamferX, p11 - chamferY, p12 + chamferY, p12 - chamferX,
4133 p22 + chamferX, p22 + chamferY, p21 - chamferY, p21 + chamferX } );
4145 msg.Printf(
_(
"Non-copper pad %s uses an unknown pad shape." ), aElem.
name );
4155 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4165 AVIA6 elem( reader );
4167 std::unique_ptr<PCB_VIA>
via = std::make_unique<PCB_VIA>(
m_board );
4179 if( start_layer_outside && end_layer_outside )
4183 else if( ( !start_layer_outside ) && ( !end_layer_outside ) )
4206 msg.Printf(
_(
"Via from layer %d to %d uses a non-copper layer, which is not "
4217 via->SetLayerPair( start_klayer, end_klayer );
4242 wxCHECK2_MSG( altiumLayer < 32,
break,
4243 "Altium importer expects 32 or fewer copper layers" );
4277 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4284 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
4315 msg.Printf( wxT(
"ATRACK6 stream tries to access polygon id %u "
4316 "of %u existing polygons; skipping it" ),
4317 static_cast<unsigned>( aElem.
polygon ),
4318 static_cast<unsigned>(
m_polygons.size() ) );
4327 if( zone ==
nullptr )
4377 int width = aElem.
width + ( layerExpansionMask.second * 2 );
4382 seg->SetStart( aElem.
start );
4383 seg->SetEnd( aElem.
end );
4385 seg->SetLayer( layerExpansionMask.first );
4394 const int aPrimitiveIndex,
4395 const bool aIsBoardImport )
4399 wxFAIL_MSG( wxString::Format(
"Altium: Unexpected footprint Track with polygon id %u",
4435 int width = aElem.
width + ( layerExpansionMask.second * 2 );
4438 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::SEGMENT );
4440 seg->SetStart( aElem.
start );
4441 seg->SetEnd( aElem.
end );
4443 seg->SetLayer( layerExpansionMask.first );
4455 std::unique_ptr<PCB_TRACK> track = std::make_unique<PCB_TRACK>(
m_board );
4457 track->SetStart( aElem.
start );
4458 track->SetEnd( aElem.
end );
4459 track->SetWidth( aElem.
width );
4460 track->SetLayer( aLayer );
4469 seg->SetStart( aElem.
start );
4470 seg->SetEnd( aElem.
end );
4472 seg->SetLayer( aLayer );
4482 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::SEGMENT );
4484 seg->SetStart( aElem.
start );
4485 seg->SetEnd( aElem.
end );
4487 seg->SetLayer( aLayer );
4494 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4504 THROW_IO_ERROR( wxT(
"WideStrings6 stream is not fully parsed" ) );
4508 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4566 std::unique_ptr<PCB_TEXTBOX> pcbTextbox = std::make_unique<PCB_TEXTBOX>(
m_board );
4567 std::unique_ptr<PCB_TEXT> pcbText = std::make_unique<PCB_TEXT>(
m_board );
4571 static const std::map<wxString, wxString> variableMap = {
4572 {
"LAYER_NAME",
"LAYER" },
4573 {
"PRINT_DATE",
"CURRENT_DATE"},
4582 item = pcbTextbox.get();
4583 text = pcbTextbox.get();
4594 text->SetText( kicadText );
4608 std::unique_ptr<PCB_TEXTBOX> fpTextbox = std::make_unique<PCB_TEXTBOX>( aFootprint );
4609 std::unique_ptr<PCB_TEXT> fpText = std::make_unique<PCB_TEXT>( aFootprint );
4624 item = &aFootprint->
Value();
4629 item = fpText.get();
4630 text = fpText.get();
4634 static const std::map<wxString, wxString> variableMap = {
4635 {
"DESIGNATOR",
"REFERENCE" },
4636 {
"COMMENT",
"VALUE" },
4637 {
"VALUE",
"ALTIUM_VALUE" },
4638 {
"LAYER_NAME",
"LAYER" },
4639 {
"PRINT_DATE",
"CURRENT_DATE"},
4644 item = fpTextbox.get();
4645 text = fpTextbox.get();
4658 text->SetText( kicadText );
4659 text->SetKeepUpright(
false );
4675 std::unique_ptr<PCB_BARCODE> pcbBarcode = std::make_unique<PCB_BARCODE>(
m_board );
4677 pcbBarcode->SetLayer( aLayer );
4678 pcbBarcode->SetPosition( aElem.
position );
4682 pcbBarcode->SetText( aElem.
text );
4692 pcbBarcode->AssembleBarcode();
4701 std::unique_ptr<PCB_BARCODE> fpBarcode = std::make_unique<PCB_BARCODE>( aFootprint );
4703 fpBarcode->SetLayer( aLayer );
4704 fpBarcode->SetPosition( aElem.
position );
4708 fpBarcode->SetText( aElem.
text );
4718 fpBarcode->AssembleBarcode();
4747 kicadMargin =
VECTOR2I( charWidth * 0.933, charHeight * 0.67 );
4749 kicadMargin =
VECTOR2I( charWidth * 0.808, charHeight * 0.844 );
4752 + kicadMargin * 2 - margin * 2 );
4754 kposition = kposition - kicadMargin + margin;
4772 switch( justification )
4796 msg.Printf(
_(
"Unknown textbox justification %d, aText %s" ), justification,
4816 int rectHeight = aElem.
height;
4819 rectWidth = -rectWidth;
4825 switch( justification )
4831 kposition.
y -= rectHeight;
4837 kposition.
y -= rectHeight / 2;
4847 kposition.
x += rectWidth / 2;
4848 kposition.
y -= rectHeight;
4854 kposition.
x += rectWidth / 2;
4855 kposition.
y -= rectHeight / 2;
4861 kposition.
x += rectWidth / 2;
4867 kposition.
x += rectWidth;
4868 kposition.
y -= rectHeight;
4874 kposition.
x += rectWidth;
4875 kposition.
y -= rectHeight / 2;
4881 kposition.
x += rectWidth;
4934 if( font->
GetName().Contains( wxS(
"Arial" ) ) )
4949 const CFB::COMPOUND_FILE_ENTRY* aEntry )
5007 const bool aIsBoardImport )
5049 fill->SetFilled(
true );
5050 fill->SetLayer( aLayer );
5053 fill->SetStart( aElem.
pos1 );
5054 fill->SetEnd( aElem.
pos2 );
5076 if( aLayer ==
F_Cu || aLayer ==
B_Cu )
5078 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
5081 padLayers.
set( aLayer );
5096 std::swap( width, height );
5099 pad->SetPosition( aElem.
pos1 / 2 + aElem.
pos2 / 2 );
5111 pad->SetPosition( anchorPos );
5122 aElem.
pos1.
y / 2 + aElem.
pos2.
y / 2 - anchorPos.
y );
5124 pad->AddPrimitivePoly(
F_Cu, shapePolys, 0,
true );
5128 pad->SetLayerSet( padLayers );
5134 std::unique_ptr<PCB_SHAPE> fill =
5137 fill->SetFilled(
true );
5138 fill->SetLayer( aLayer );
5141 fill->SetStart( aElem.
pos1 );
5142 fill->SetEnd( aElem.
pos2 );
5161 layerSet.
set( klayer );
5169 bool keepoutRestrictionVia = ( aKeepoutRestrictions & 0x01 ) != 0;
5170 bool keepoutRestrictionTrack = ( aKeepoutRestrictions & 0x02 ) != 0;
5171 bool keepoutRestrictionCopper = ( aKeepoutRestrictions & 0x04 ) != 0;
5172 bool keepoutRestrictionSMDPad = ( aKeepoutRestrictions & 0x08 ) != 0;
5173 bool keepoutRestrictionTHPad = ( aKeepoutRestrictions & 0x10 ) != 0;
5185 const uint8_t aKeepoutRestrictions )
5187 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
5189 zone->SetIsRuleArea(
true );
5206 const uint8_t aKeepoutRestrictions )
5208 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( aFootprint );
5210 zone->SetIsRuleArea(
true );
5234 if( elems.first == elems.second )
5237 std::vector<std::pair<PCB_LAYER_ID, int>> layerExpansionPairs;
5239 for(
auto it = elems.first; it != elems.second; ++it )
5279 return layerExpansionPairs;
std::string FormatPath(const std::vector< std::string > &aVectorPath)
Helper for debug logging (vector -> string)
const ARULE6 * selectAltiumPolygonRule(const std::vector< ARULE6 > &aRulesByPriorityAsc)
Select the highest Altium-priority rule whose scope references polygons.
bool altiumViaSideIsTented(bool aTentFlag, bool aManual, bool aFromHole, uint32_t aHoleSize, int32_t aMaskExpansion, int aLandDiameter)
Decide whether one side of an Altium via should be tented when imported into KiCad.
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
KIID AltiumUniqueIdToKiid(const wxString &aUniqueId)
Derive a stable KIID from an Altium component unique id.
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
const ARULE6 * GetRuleForPolygon(ALTIUM_RULE_KIND aKind) const
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
double dielectriclosstangent
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
bool soldermask_expansion_from_hole
int32_t soldermask_expansion_front
bool soldermask_expansion_manual
int32_t soldermask_expansion_back
uint32_t diameter_by_layer[32]
std::vector< char > decompressedData
std::vector< std::string > header
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