50#include <compoundfilereader.h>
57#include <wx/docview.h>
59#include <wx/mstream.h>
60#include <wx/wfstream.h>
61#include <wx/zstream.h>
63#include <magic_enum.hpp>
86 THROW_IO_ERROR( wxString::Format( wxT(
"Component creator tries to access component id %u "
87 "of %u existing components" ),
96 const std::vector<ALTIUM_VERTICE>& aVertices )
105 double startradiant =
DEG2RAD( vertex.startangle );
106 double endradiant =
DEG2RAD( vertex.endangle );
107 VECTOR2I arcStartOffset =
KiROUND( std::cos( startradiant ) * vertex.radius,
108 -std::sin( startradiant ) * vertex.radius );
110 VECTOR2I arcEndOffset =
KiROUND( std::cos( endradiant ) * vertex.radius,
111 -std::sin( endradiant ) * vertex.radius );
113 VECTOR2I arcStart = vertex.center + arcStartOffset;
114 VECTOR2I arcEnd = vertex.center + arcEndOffset;
119 if( arcStart.
Distance( vertex.position )
120 < arcEnd.
Distance( vertex.position ) )
147 aLine.
Append( vertex.position );
157 auto override =
m_layermap.find( aAltiumLayer );
161 return override->second;
176 switch( aAltiumLayer )
275 static std::set<ALTIUM_LAYER> altiumLayersWithWarning;
280 std::vector<PCB_LAYER_ID> layers;
281 layers.reserve( layerCount );
286 layers.emplace_back( layer );
297 wxString layerName = it !=
m_layerNames.end() ? it->second : wxString::Format( wxT(
"(%d)" ),
298 (
int) aAltiumLayer );
300 if(
m_reporter && altiumLayersWithWarning.insert( aAltiumLayer ).second )
303 _(
"Altium layer %s has no KiCad equivalent. It has been moved to KiCad "
319 const wxString& aLibrary,
const wxString& aFootprintName )
339 const unsigned PROGRESS_DELTA = 250;
357 const std::map<ALTIUM_PCB_DIR, std::string>& aFileMapping )
360 const std::vector<std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>> parserOrder = {
472 for(
const std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>& cur : parserOrder )
477 std::tie( isRequired,
directory, fp ) = cur;
482 const auto& mappedDirectory = aFileMapping.find(
directory );
484 if( mappedDirectory == aFileMapping.end() )
487 const std::vector<std::string> mappedFile{ mappedDirectory->second,
"Header" };
488 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
490 if( file ==
nullptr )
494 uint32_t numOfRecords = reader.
Read<uint32_t>();
500 m_reporter->Report( wxString::Format(
_(
"'%s' was not parsed correctly." ),
514 m_reporter->Report( wxString::Format(
_(
"'%s' was not fully parsed." ),
526 if( boardDirectory != aFileMapping.end() )
528 std::vector<std::string> mappedFile{ boardDirectory->second,
"Data" };
530 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
535 "This file does not appear to be in a valid PCB Binary Version 6.0 format. In "
537 "make sure to save as \"PCB Binary Files (*.PcbDoc)\"." ) );
542 for(
const std::tuple<bool, ALTIUM_PCB_DIR, PARSE_FUNCTION_POINTER_fp>& cur : parserOrder )
547 std::tie( isRequired,
directory, fp ) = cur;
549 const auto& mappedDirectory = aFileMapping.find(
directory );
551 if( mappedDirectory == aFileMapping.end() )
553 wxASSERT_MSG( !isRequired, wxString::Format( wxT(
"Altium Directory of kind %d was "
554 "expected, but no mapping is "
555 "present in the code" ),
560 std::vector<std::string> mappedFile{ mappedDirectory->second };
563 mappedFile.emplace_back(
"Data" );
565 const CFB::COMPOUND_FILE_ENTRY* file = altiumPcbFile.
FindStream( mappedFile );
567 if( file !=
nullptr )
569 fp( altiumPcbFile, file );
571 else if( isRequired )
575 m_reporter->Report( wxString::Format(
_(
"File not found: '%s' for directory '%s'." ),
590 if( zone->GetAssignedPriority() == 1000 )
601 zone->SetAssignedPriority( priority >= 0 ? priority : 0 );
605 for( std::pair<const ALTIUM_LAYER, ZONE*>& zone :
m_outer_plane )
606 zone.second->SetAssignedPriority( 0 );
616 if( !zone->HasFilledPolysForLayer( layer ) )
619 zone->GetFilledPolysList( layer )->Fracture();
657 if( arc->
GetCenter() == dim->GetPosition() )
666 VECTOR2I radialLine = dim->GetEnd() - dim->GetStart();
671 radialLine = radialLine.
Resize( std::max(
radius, 2 ) );
672 dim->SetEnd( dim->GetStart() + (
VECTOR2I) radialLine );
673 dim->SetLeaderLength( totalLength -
radius );
683 int desired_x = ( w - bbbox.
GetWidth() ) / 2;
684 int desired_y = ( h - bbbox.
GetHeight() ) / 2;
686 VECTOR2I movementVector( desired_x - bbbox.
GetX(), desired_y - bbbox.
GetY() );
687 m_board->Move( movementVector );
698 const wxString& aFootprintName )
700 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
705 const std::vector<std::string> libStreamName{
"Library",
"Data" };
706 const CFB::COMPOUND_FILE_ENTRY* libStream = altiumLibFile.
FindStream( libStreamName );
708 if( libStream ==
nullptr )
726 std::tuple<wxString, const CFB::COMPOUND_FILE_ENTRY*> ret =
729 wxString fpDirName = std::get<0>( ret );
730 const CFB::COMPOUND_FILE_ENTRY* footprintStream = std::get<1>( ret );
732 if( fpDirName.IsEmpty() )
735 wxString::Format(
_(
"Footprint directory not found: '%s'." ), aFootprintName ) );
738 const std::vector<std::string> streamName{ fpDirName.ToStdString(),
"Data" };
739 const CFB::COMPOUND_FILE_ENTRY* footprintData = altiumLibFile.
FindStream( footprintStream, {
"Data" } );
741 if( footprintData ==
nullptr )
754 footprint->SetFPID( fpID );
756 const std::vector<std::string> parametersStreamName{ fpDirName.ToStdString(),
758 const CFB::COMPOUND_FILE_ENTRY* parametersData =
759 altiumLibFile.
FindStream( footprintStream, {
"Parameters" } );
761 if( parametersData !=
nullptr )
764 std::map<wxString, wxString> parameterProperties = parametersReader.
ReadProperties();
766 wxT(
"DESCRIPTION" ), wxT(
"" ) );
767 footprint->SetLibDescription( description );
773 m_reporter->Report( wxString::Format(
_(
"File not found: '%s'." ),
778 footprint->SetLibDescription( wxT(
"" ) );
781 const std::vector<std::string> extendedPrimitiveInformationStreamName{
782 "ExtendedPrimitiveInformation",
"Data"
784 const CFB::COMPOUND_FILE_ENTRY* extendedPrimitiveInformationData =
785 altiumLibFile.
FindStream( footprintStream, extendedPrimitiveInformationStreamName );
787 if( extendedPrimitiveInformationData !=
nullptr )
790 footprint->SetReference( wxT(
"REF**" ) );
791 footprint->SetValue( aFootprintName );
792 footprint->Reference().SetVisible(
true );
793 footprint->Value().SetVisible(
true );
796 const int defaultTextThickness(
pcbIUScale.mmToIU( 0.15 ) );
798 for(
PCB_FIELD* field : footprint->GetFields() )
800 field->SetTextSize( defaultTextSize );
801 field->SetTextThickness( defaultTextThickness );
859 THROW_IO_ERROR( wxString::Format(
_(
"Record of unknown type: '%d'." ), recordtype ) );
865 for(
bool changes =
true; changes; )
870 [&changes](
PAD* aPad1,
PAD* aPad2 )
872 if( !( aPad1->GetNumber().IsEmpty() ^ aPad2->GetNumber().IsEmpty() ) )
875 for( PCB_LAYER_ID layer : aPad1->GetLayerSet() )
877 std::shared_ptr<SHAPE> shape1 = aPad1->GetEffectiveShape( layer );
878 std::shared_ptr<SHAPE> shape2 = aPad2->GetEffectiveShape( layer );
880 if( shape1->Collide( shape2.get() ) )
882 if( aPad1->GetNumber().IsEmpty() )
883 aPad1->SetNumber( aPad2->GetNumber() );
885 aPad2->SetNumber( aPad1->GetNumber() );
894 footprint->AutoPositionFields();
896 if( parser.HasParsingError() )
898 THROW_IO_ERROR( wxString::Format( wxT(
"%s stream was not parsed correctly" ),
902 if( parser.GetRemainingBytes() != 0 )
904 THROW_IO_ERROR( wxString::Format( wxT(
"%s stream is not fully parsed" ),
908 return footprint.release();
919 THROW_IO_ERROR( wxString::Format( wxT(
"Netcode with id %d does not exist. Only %d nets "
931 const auto rules =
m_rules.find( aKind );
936 for(
const ARULE6& rule : rules->second )
938 if( rule.
name == aName )
947 const auto rules =
m_rules.find( aKind );
952 for(
const ARULE6& rule : rules->second )
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" ) );
1140 wxString nameLower = aName.Lower();
1141 return nameLower.Contains( wxT(
"courtyard" ) ) || nameLower.Contains( wxT(
"court yard" ) )
1142 || nameLower.Contains( wxT(
"crtyd" ) );
1149 wxString nameLower = aName.Lower();
1150 return nameLower.Contains( wxT(
"assembly" ) ) || nameLower.Contains( wxT(
"assy" ) );
1159 auto check = [&isTop](
bool aTopCond,
bool aBotCond )
1161 if( aTopCond && aBotCond )
1164 if( !aTopCond && !aBotCond )
1171 wxString lower = aName.Lower();
1173 if( check( lower.StartsWith(
"top" ), lower.StartsWith(
"bot" ) ) )
1176 if( check( lower.EndsWith(
"_t" ), lower.EndsWith(
"_b" ) ) )
1179 if( check( lower.EndsWith(
".t" ), lower.EndsWith(
".b" ) ) )
1182 if( check( lower.Contains(
"top" ), lower.Contains(
"bot" ) ) )
1195 if( aStackup.size() == 0 )
1198 std::vector<INPUT_LAYER_DESC> inputLayers;
1199 std::map<wxString, ALTIUM_LAYER> altiumLayerNameMap;
1206 bool frontCourtyardMapped =
false;
1207 bool backCourtyardMapped =
false;
1210 [&](
size_t ii ) ->
size_t
1216 return curLayer.
nextId - 1;
1221 for(
size_t ii = 0; ii < aStackup.size(); ii =
next( ii ) )
1223 curLayer = aStackup[ii];
1246 if( isTopSide && !frontCourtyardMapped )
1249 frontCourtyardMapped =
true;
1251 else if( !isTopSide && !backCourtyardMapped )
1254 backCourtyardMapped =
true;
1256 else if( !frontCourtyardMapped )
1259 frontCourtyardMapped =
true;
1261 else if( !backCourtyardMapped )
1264 backCourtyardMapped =
true;
1287 inputLayers.push_back( iLdesc );
1288 altiumLayerNameMap.insert( { curLayer.
name, layer_num } );
1292 if( inputLayers.size() == 0 )
1298 for( std::pair<wxString, PCB_LAYER_ID> layerPair : reMappedLayers )
1306 m_reporter->Report( wxString::Format(
_(
"Layer '%s' could not be mapped and "
1307 "will be skipped." ),
1315 ALTIUM_LAYER altiumID = altiumLayerNameMap.at( layerPair.first );
1316 m_layermap.insert_or_assign( altiumID, layerPair.second );
1317 enabledLayers |=
LSET( { layerPair.second } );
1320 m_board->SetEnabledLayers( enabledLayers );
1321 m_board->SetVisibleLayers( enabledLayers );
1334 if( !layer.mechenabled )
1342 switch( layer.mechkind )
1400 int nextShape = lineChain.
NextShape( i );
1401 bool isLastShape = nextShape < 0;
1405 shape->SetStroke( stroke );
1417 shape->SetStroke( stroke );
1419 shape->SetStart( seg.
A );
1420 shape->SetEnd( seg.
B );
1429 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1443 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( elem.
name );
1445 for(
const wxString&
name : elem.
names )
1447 m_board->GetDesignSettings().m_NetSettings->SetNetclassPatternAssignment(
1448 name, nc->GetName() );
1451 if(
m_board->GetDesignSettings().m_NetSettings->HasNetclass( nc->GetName() ) )
1458 msg.Printf(
_(
"More than one Altium netclass with name '%s' found. "
1459 "Only the first one will be imported." ), elem.
name );
1465 m_board->GetDesignSettings().m_NetSettings->SetNetclass( nc->GetName(), nc );
1475 std::shared_ptr<NET_SETTINGS> netSettings =
m_board->GetDesignSettings().m_NetSettings;
1479 if( net->GetNetCode() > 0 )
1481 std::shared_ptr<NETCLASS> netclass = netSettings->GetEffectiveNetClass( net->GetNetname() );
1484 net->SetNetClass( netclass );
1488 m_board->m_LegacyNetclassesLoaded =
true;
1493 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1500 uint16_t componentId = 0;
1507 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
1518 wxString fpName = elem.
pattern;
1520 if( fpName.Contains( wxT(
"\\" ) ) || fpName.Contains( wxT(
"/" ) ) )
1522 wxFileName fpPath( fpName, wxPATH_WIN );
1523 fpName = fpPath.GetFullName();
1528 footprint->SetFPID( fpID );
1530 footprint->SetPosition( elem.
position );
1531 footprint->SetOrientationDegrees( elem.
rotation );
1537 if( reference.find_first_not_of(
"0123456789" ) == wxString::npos )
1538 reference.Prepend( wxT(
"UNK" ) );
1540 footprint->SetReference( reference );
1545 path.push_back( pathid );
1546 path.push_back(
id );
1548 footprint->SetPath(
path );
1552 footprint->SetLocked( elem.
locked );
1553 footprint->Reference().SetVisible( elem.
nameon );
1554 footprint->Value().SetVisible( elem.
commenton );
1564 THROW_IO_ERROR( wxT(
"Components6 stream is not fully parsed" ) );
1571 while( Angle < aMin )
1574 while( Angle >= aMax )
1597 m_reporter->Report( wxString::Format( wxT(
"Model %s not found for footprint %s" ),
1610 if( file->
name.IsEmpty() )
1614 std::vector<char> decompressedData;
1615 wxMemoryInputStream compressedStream(
model->second.data(),
model->second.size() );
1616 wxZlibInputStream zlibStream( compressedStream );
1620 decompressedData.resize(
model->second.size() * 6 );
1623 while( !zlibStream.Eof() )
1625 zlibStream.Read( decompressedData.data() + offset, decompressedData.size() - offset );
1626 size_t bytesRead = zlibStream.LastRead();
1631 offset += bytesRead;
1633 if( offset >= decompressedData.size() )
1634 decompressedData.resize( 2 * decompressedData.size() );
1637 decompressedData.resize( offset );
1658 orientation = -orientation;
1665 modelRotation.
x += 180;
1666 modelRotation.
z = -modelRotation.
z;
1680 aFootprint->
Models().push_back( modelSettings );
1685 const CFB::COMPOUND_FILE_ENTRY* aEntry )
1691 BS::multi_future<void> embeddedFutures;
1702 if( skipComponentBodies )
1710 THROW_IO_ERROR( wxString::Format( wxT(
"ComponentsBodies6 stream tries to access "
1711 "component id %d of %zu existing components" ),
1726 msg.Printf( wxT(
"ComponentsBodies6 stream tries to access model id %s which does "
1727 "not exist" ), elem.
modelId );
1740 wxMemoryInputStream compressedStream( modelData.
m_data.data(), modelData.
m_data.size() );
1741 wxZlibInputStream zlibStream( compressedStream );
1742 wxMemoryOutputStream decompressedStream;
1744 zlibStream.Read( decompressedStream );
1750 embeddedFutures.push_back(
tp.submit_task(
1753 EMBEDDED_FILES::CompressAndEncode( *file );
1772 orientation = -orientation;
1795 footprint->
Models().push_back( modelSettings );
1798 embeddedFutures.wait();
1801 THROW_IO_ERROR( wxT(
"ComponentsBodies6 stream is not fully parsed" ) );
1808 THROW_IO_ERROR( wxT(
"Incorrect number of reference points for linear dimension object" ) );
1817 _(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
1818 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer ),
1831 dimension->SetLayer( klayer );
1832 dimension->SetStart( referencePoint0 );
1834 if( referencePoint0 != aElem.
xy1 )
1846 VECTOR2I referenceDiff = referencePoint1 - referencePoint0;
1848 SEG segm1( referencePoint0, referencePoint0 + directionNormalVector );
1849 SEG segm2( referencePoint1, referencePoint1 + direction );
1853 THROW_IO_ERROR( wxT(
"Invalid dimension. This should never happen." ) );
1855 dimension->SetEnd( *intersection );
1859 if( direction.
Cross( referenceDiff ) > 0 )
1862 dimension->SetHeight( height );
1866 dimension->SetEnd( referencePoint1 );
1869 dimension->SetLineThickness( aElem.
linewidth );
1875 int dist = ( dimension->GetEnd() - dimension->GetStart() ).EuclideanNorm();
1877 if( dist < 3 * dimension->GetArrowLength() )
1881 wxRegEx units( wxS(
"(mm)|(in)|(mils)|(thou)|(')|(\")" ), wxRE_ADVANCED );
1893 dimension->Text().SetBold( aElem.
textbold );
1896 dimension->SetTextThickness( dimension->GetTextThickness() *
BOLD_FACTOR );
1915 THROW_IO_ERROR( wxT(
"Not enough reference points for radial dimension object" ) );
1924 _(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
1925 "It has been moved to KiCad layer Eco1_User." ),
1935 std::unique_ptr<PCB_DIM_RADIAL> dimension = std::make_unique<PCB_DIM_RADIAL>(
m_board );
1938 dimension->SetLayer( klayer );
1939 dimension->SetStart( referencePoint0 );
1940 dimension->SetEnd( aElem.
xy1 );
1941 dimension->SetLineThickness( aElem.
linewidth );
1942 dimension->SetKeepTextAligned(
false );
1963 m_reporter->Report( wxT(
"No text position present for leader dimension object" ),
1970 dimension->SetTextPos( aElem.
textPoint.at( 0 ) );
1976 dimension->SetBold( aElem.
textbold );
1979 dimension->SetTextThickness( dimension->GetTextThickness() *
BOLD_FACTOR );
1987 int yAdjust = dimension->GetTextBox(
nullptr ).GetCenter().y - dimension->GetTextPos().y;
1988 dimension->SetTextPos( dimension->GetTextPos() +
VECTOR2I( 0, yAdjust + aElem.
textgap ) );
2005 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2006 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2023 shape->SetLayer( klayer );
2025 shape->SetStart( last );
2037 if( dirVec.
x != 0 || dirVec.
y != 0 )
2046 shape1->SetLayer( klayer );
2048 shape1->SetStart( referencePoint0 );
2049 shape1->SetEnd( referencePoint0 + arrVec );
2059 shape2->SetLayer( klayer );
2061 shape2->SetStart( referencePoint0 );
2062 shape2->SetEnd( referencePoint0 + arrVec );
2074 m_reporter->Report( wxT(
"No text position present for leader dimension object" ),
2081 std::unique_ptr<PCB_TEXT>
text = std::make_unique<PCB_TEXT>(
m_board );
2085 text->SetLayer( klayer );
2104 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2105 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2116 shape->SetLayer( klayer );
2135 msg.Printf(
_(
"Dimension found on an Altium layer (%d) with no KiCad equivalent. "
2136 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2146 std::unique_ptr<PCB_DIM_CENTER> dimension = std::make_unique<PCB_DIM_CENTER>(
m_board );
2148 dimension->SetLayer( klayer );
2149 dimension->SetLineThickness( aElem.
linewidth );
2150 dimension->SetStart( aElem.
xy1 );
2151 dimension->SetEnd( aElem.
xy1 + vec );
2158 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2178 m_reporter->Report( wxString::Format(
_(
"Ignored Angular dimension (not yet supported)." ) ),
2191 m_reporter->Report( wxString::Format(
_(
"Ignored Datum dimension (not yet supported)." ) ),
2199 m_reporter->Report( wxString::Format(
_(
"Ignored Baseline dimension (not yet supported)." ) ),
2209 m_reporter->Report( wxString::Format(
_(
"Ignored Linear dimension (not yet supported)." ) ),
2216 m_reporter->Report( wxString::Format(
_(
"Ignored Radial dimension (not yet supported)." ) ),
2224 msg.Printf(
_(
"Ignored dimension of kind %d (not yet supported)." ), elem.
kind );
2232 THROW_IO_ERROR( wxT(
"Dimensions6 stream is not fully parsed" ) );
2237 const CFB::COMPOUND_FILE_ENTRY* aEntry,
2238 const std::vector<std::string>& aRootDir )
2249 wxString invalidChars = wxFileName::GetForbiddenChars();
2256 std::vector<std::string> stepPath = aRootDir;
2257 stepPath.emplace_back( std::to_string( idx ) );
2259 bool validName = !elem.
name.IsEmpty() && elem.
name.IsAscii()
2260 && wxString::npos == elem.
name.find_first_of( invalidChars );
2261 wxString storageName = validName ? elem.
name : wxString::Format( wxT(
"model_%d" ), idx );
2265 const CFB::COMPOUND_FILE_ENTRY* stepEntry = aAltiumPcbFile.
FindStream( stepPath );
2267 if( stepEntry ==
nullptr )
2272 msg.Printf(
_(
"File not found: '%s'. 3D-model not imported." ),
FormatPath( stepPath ) );
2279 size_t stepSize =
static_cast<size_t>( stepEntry->size );
2280 std::vector<char> stepContent( stepSize );
2288 std::move( stepContent ) ) ) );
2292 std::map<wxString, std::vector<wxString>> nameIdMap;
2295 nameIdMap[data.m_modelname].push_back(
id );
2297 for(
auto& [
name, ids] : nameIdMap )
2299 for(
size_t i = 1; i < ids.size(); i++ )
2301 const wxString&
id = ids[i];
2308 wxString modelName = modelTuple->second.m_modelname;
2310 if( modelName.Contains(
"." ) )
2313 wxString baseName = modelName.BeforeLast(
'.', &ext );
2315 modelTuple->second.m_modelname = baseName +
'_' + std::to_string( i ) +
'.' + ext;
2319 modelTuple->second.m_modelname = modelName +
'_' + std::to_string( i );
2330 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2342 ANET6 elem( reader );
2356 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2399 msg.Printf(
_(
"Polygon outline count is %d, expected 1." ), outline.
OutlineCount() );
2407 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board);
2413 zone->SetPosition( elem.
vertices.at( 0 ).position );
2414 zone->SetLocked( elem.
locked );
2416 zone->Outline()->AddOutline( outline.
Outline( 0 ) );
2423 int planeLayers = 0;
2424 int signalLayers = 0;
2438 if( planeLayers > 0 && planeClearanceRule )
2441 if( signalLayers > 0 && zoneClearanceRule )
2449 if( polygonConnectRule !=
nullptr )
2468 zone->SetThermalReliefSpokeWidth(
2479 zone->SetAssignedPriority( 1 );
2484 || zone->GetBoundingBox().Contains( outer_plane->second->GetBoundingBox() ) )
2499 const BOX2I& bbox = zone->GetBoundingBox();
2508 zone->SetHatchOrientation(
ANGLE_45 );
2523 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2541 std::sort( val.second.begin(), val.second.end(),
2544 return lhs.priority < rhs.priority;
2557 if( trackWidthRule )
2559 m_board->GetDesignSettings().m_TrackMinWidth = trackWidthRule->
minLimit;
2563 if( routingViasRule )
2565 m_board->GetDesignSettings().m_ViasMinSize = routingViasRule->
minWidth;
2574 if( holeToHoleRule )
2580 if( soldermaskRule )
2591 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2607 THROW_IO_ERROR( wxT(
"BoardRegions stream is not fully parsed" ) );
2611 const CFB::COMPOUND_FILE_ENTRY* aEntry )
2619 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
2638 THROW_IO_ERROR(
"ShapeBasedRegions6 stream is not fully parsed" );
2662 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
2664 zone->SetIsRuleArea(
true );
2672 zone->SetDoNotAllowZoneFills(
true );
2673 zone->SetDoNotAllowVias(
false );
2674 zone->SetDoNotAllowTracks(
false );
2675 zone->SetDoNotAllowPads(
false );
2676 zone->SetDoNotAllowFootprints(
false );
2679 zone->SetPosition( aElem.
outline.at( 0 ).position );
2680 zone->Outline()->AddOutline( linechain );
2700 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
2702 zone->SetPosition( aElem.
outline.at( 0 ).position );
2703 zone->Outline()->AddOutline( linechain );
2711 fill.
Append( linechain );
2715 zone->SetFilledPolysList( klayer, fill );
2717 zone->SetIsFilled(
true );
2718 zone->SetNeedRefill(
false );
2731 msg.Printf(
_(
"Dashed outline found on an Altium layer (%d) with no KiCad equivalent. "
2732 "It has been moved to KiCad layer Eco1_User." ), aElem.
layer );
2753 shape->SetPolyShape( linechain );
2754 shape->SetFilled(
false );
2755 shape->SetLayer( klayer );
2777 msg.Printf(
_(
"Ignored polygon shape of kind %d (not yet supported)." ), aElem.
kind );
2786 const int aPrimitiveIndex )
2802 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( aFootprint );
2804 zone->SetIsRuleArea(
true );
2812 zone->SetDoNotAllowZoneFills(
true );
2813 zone->SetDoNotAllowVias(
false );
2814 zone->SetDoNotAllowTracks(
false );
2815 zone->SetDoNotAllowPads(
false );
2816 zone->SetDoNotAllowFootprints(
false );
2819 zone->SetPosition( aElem.
outline.at( 0 ).position );
2820 zone->Outline()->AddOutline( linechain );
2854 msg.Printf(
_(
"Loading library '%s':\n"
2855 "Footprint %s contains a dashed outline on Altium layer (%d) with "
2856 "no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
2868 msg.Printf(
_(
"Footprint %s contains a dashed outline on Altium layer (%d) with "
2869 "no KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
2891 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::POLY );
2893 shape->SetPolyShape( linechain );
2894 shape->SetFilled(
false );
2895 shape->SetLayer( klayer );
2911 msg.Printf(
_(
"Error loading library '%s':\n"
2912 "Footprint %s contains polygon shape of kind %d (not yet supported)." ),
2924 msg.Printf(
_(
"Footprint %s contains polygon shape of kind %d (not yet supported)." ),
2952 for(
const std::vector<ALTIUM_VERTICE>& hole : aElem.
holes )
2960 polySet.
AddHole( hole_linechain );
2965 shape->SetPolyShape( polySet );
2966 shape->SetFilled(
true );
2967 shape->SetLayer( aLayer );
2982 const int aPrimitiveIndex )
2999 for(
const std::vector<ALTIUM_VERTICE>& hole : aElem.
holes )
3007 polySet.
AddHole( hole_linechain );
3010 if( aLayer ==
F_Cu || aLayer ==
B_Cu )
3013 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3016 padLayers.
set( aLayer );
3027 pad->SetPosition( anchorPos );
3030 shapePolys.
Move( -anchorPos );
3034 auto it = map.find( aPrimitiveIndex );
3036 if( it != map.end() )
3042 pad->SetLocalSolderPasteMargin(
info.pastemaskexpansionmanual );
3047 pad->SetLocalSolderMaskMargin(
info.soldermaskexpansionmanual );
3057 pad->SetLayerSet( padLayers );
3063 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::POLY );
3065 shape->SetPolyShape( polySet );
3066 shape->SetFilled(
true );
3067 shape->SetLayer( aLayer );
3076 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3092 THROW_IO_ERROR( wxString::Format(
"Region stream tries to access polygon id %d "
3093 "of %d existing polygons.",
3100 if( zone ==
nullptr )
3122 for(
const std::vector<ALTIUM_VERTICE>& hole : elem.
holes )
3129 hole_linechain.
Append( hole.at( 0 ).position );
3131 fill.
AddHole( hole_linechain );
3151 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3158 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
3161 AARC6 elem( reader );
3212 THROW_IO_ERROR( wxString::Format(
"Tracks stream tries to access polygon id %u "
3213 "of %zu existing polygons.",
3219 if( zone ==
nullptr )
3267 for(
const auto& layerExpansionMask :
3270 int width = aElem.
width + ( layerExpansionMask.second * 2 );
3274 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>(
m_board );
3278 arc->SetLayer( layerExpansionMask.first );
3287 const int aPrimitiveIndex,
const bool aIsBoardImport )
3291 wxFAIL_MSG( wxString::Format(
"Altium: Unexpected footprint Arc with polygon id %d",
3324 for(
const auto& layerExpansionMask :
3327 int width = aElem.
width + ( layerExpansionMask.second * 2 );
3331 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( aFootprint );
3335 arc->SetLayer( layerExpansionMask.first );
3367 std::unique_ptr<PCB_ARC> arc = std::make_unique<PCB_ARC>(
m_board, &shapeArc );
3369 arc->SetWidth( aElem.
width );
3370 arc->SetLayer( aLayer );
3378 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>(
m_board);
3382 arc->SetLayer( aLayer );
3392 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( aFootprint );
3396 arc->SetLayer( aLayer );
3403 const CFB::COMPOUND_FILE_ENTRY* aEntry )
3413 APAD6 elem( reader );
3442 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
3443 footprint->SetPosition( aElem.
position );
3454 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3456 pad->SetNumber(
"" );
3467 pad->SetLayerSet(
LSET().AllCuMask() );
3494 pad->Padstack().FrontOuterLayers().has_solder_mask =
true;
3498 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
3504 pad->Padstack().BackOuterLayers().has_solder_mask =
true;
3508 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
3513 pad->SetLocked(
true );
3543 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
3566 msg.Printf(
_(
"Error loading library '%s':\n"
3567 "Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
3579 msg.Printf(
_(
"Footprint %s pad %s is not marked as multilayer, but is a TH pad." ),
3599 wxFAIL_MSG( wxT(
"Round holes are handled before the switch" ) );
3608 msg.Printf(
_(
"Loading library '%s':\n"
3609 "Footprint %s pad %s has a square hole (not yet supported)." ),
3621 msg.Printf(
_(
"Footprint %s pad %s has a square hole (not yet supported)." ),
3656 msg.Printf(
_(
"Loading library '%s':\n"
3657 "Footprint %s pad %s has a hole-rotation of %d degrees. "
3658 "KiCad only supports 90 degree rotations." ),
3671 msg.Printf(
_(
"Footprint %s pad %s has a hole-rotation of %d degrees. "
3672 "KiCad only supports 90 degree rotations." ),
3691 msg.Printf(
_(
"Error loading library '%s':\n"
3692 "Footprint %s pad %s uses a hole of unknown kind %d." ),
3705 msg.Printf(
_(
"Footprint %s pad %s uses a hole of unknown kind %d." ),
3725 auto setCopperGeometry =
3770 msg.Printf(
_(
"Error loading library '%s':\n"
3771 "Footprint %s pad %s uses an unknown pad shape." ),
3783 msg.Printf(
_(
"Footprint %s pad %s uses an unknown pad shape." ),
3834 switch( aElem.
layer )
3852 pad->SetLayer( klayer );
3853 pad->SetLayerSet(
LSET( { klayer } ) );
3864 pad->SetLayerSet(
pad->GetLayerSet().reset(
F_Mask ) );
3867 pad->SetLayerSet(
pad->GetLayerSet().reset(
B_Mask ) );
3885 msg.Printf(
_(
"Non-copper pad %s found on an Altium layer (%d) with no KiCad "
3886 "equivalent. It has been moved to KiCad layer Eco1_User." ),
3894 std::unique_ptr<PCB_SHAPE>
pad = std::make_unique<PCB_SHAPE>(
m_board );
3913 msg.Printf(
_(
"Loading library '%s':\n"
3914 "Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
3915 "KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
3928 msg.Printf(
_(
"Footprint %s non-copper pad %s found on an Altium layer (%d) with no "
3929 "KiCad equivalent. It has been moved to KiCad layer Eco1_User." ),
3940 std::unique_ptr<PCB_SHAPE>
pad = std::make_unique<PCB_SHAPE>( aFootprint );
3956 msg.Printf(
_(
"Non-copper pad %s is connected to a net, which is not supported." ),
3967 msg.Printf(
_(
"Non-copper pad %s has a hole, which is not supported." ), aElem.
name );
3977 msg.Printf(
_(
"Non-copper pad %s has a complex pad stack (not yet supported)." ),
4010 int offset = ( std::min( aElem.
topsize.
x, aElem.
topsize.
y ) * cornerradius ) / 200;
4015 if( cornerradius < 100 )
4017 int offsetX = aElem.
topsize.
x / 2 - offset;
4018 int offsetY = aElem.
topsize.
y / 2 - offset;
4111 aShape->
SetPolyPoints( { p11 - chamferX, p11 - chamferY, p12 + chamferY, p12 - chamferX,
4112 p22 + chamferX, p22 + chamferY, p21 - chamferY, p21 + chamferX } );
4124 msg.Printf(
_(
"Non-copper pad %s uses an unknown pad shape." ), aElem.
name );
4134 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4144 AVIA6 elem( reader );
4146 std::unique_ptr<PCB_VIA>
via = std::make_unique<PCB_VIA>(
m_board );
4158 if( start_layer_outside && end_layer_outside )
4162 else if( ( !start_layer_outside ) && ( !end_layer_outside ) )
4185 msg.Printf(
_(
"Via from layer %d to %d uses a non-copper layer, which is not "
4196 via->SetLayerPair( start_klayer, end_klayer );
4219 wxCHECK2_MSG( altiumLayer < 32,
break,
4220 "Altium importer expects 32 or fewer copper layers" );
4245 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4252 for(
int primitiveIndex = 0; reader.
GetRemainingBytes() >= 4; primitiveIndex++ )
4283 msg.Printf( wxT(
"ATRACK6 stream tries to access polygon id %u "
4284 "of %u existing polygons; skipping it" ),
4285 static_cast<unsigned>( aElem.
polygon ),
4286 static_cast<unsigned>(
m_polygons.size() ) );
4295 if( zone ==
nullptr )
4345 int width = aElem.
width + ( layerExpansionMask.second * 2 );
4350 seg->SetStart( aElem.
start );
4351 seg->SetEnd( aElem.
end );
4353 seg->SetLayer( layerExpansionMask.first );
4362 const int aPrimitiveIndex,
4363 const bool aIsBoardImport )
4367 wxFAIL_MSG( wxString::Format(
"Altium: Unexpected footprint Track with polygon id %u",
4403 int width = aElem.
width + ( layerExpansionMask.second * 2 );
4406 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::SEGMENT );
4408 seg->SetStart( aElem.
start );
4409 seg->SetEnd( aElem.
end );
4411 seg->SetLayer( layerExpansionMask.first );
4423 std::unique_ptr<PCB_TRACK> track = std::make_unique<PCB_TRACK>(
m_board );
4425 track->SetStart( aElem.
start );
4426 track->SetEnd( aElem.
end );
4427 track->SetWidth( aElem.
width );
4428 track->SetLayer( aLayer );
4437 seg->SetStart( aElem.
start );
4438 seg->SetEnd( aElem.
end );
4440 seg->SetLayer( aLayer );
4450 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( aFootprint,
SHAPE_T::SEGMENT );
4452 seg->SetStart( aElem.
start );
4453 seg->SetEnd( aElem.
end );
4455 seg->SetLayer( aLayer );
4462 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4472 THROW_IO_ERROR( wxT(
"WideStrings6 stream is not fully parsed" ) );
4476 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4534 std::unique_ptr<PCB_TEXTBOX> pcbTextbox = std::make_unique<PCB_TEXTBOX>(
m_board );
4535 std::unique_ptr<PCB_TEXT> pcbText = std::make_unique<PCB_TEXT>(
m_board );
4539 static const std::map<wxString, wxString> variableMap = {
4540 {
"LAYER_NAME",
"LAYER" },
4541 {
"PRINT_DATE",
"CURRENT_DATE"},
4551 item = pcbTextbox.get();
4552 text = pcbTextbox.get();
4563 text->SetText( kicadText );
4577 std::unique_ptr<PCB_TEXTBOX> fpTextbox = std::make_unique<PCB_TEXTBOX>( aFootprint );
4578 std::unique_ptr<PCB_TEXT> fpText = std::make_unique<PCB_TEXT>( aFootprint );
4595 item = &aFootprint->
Value();
4597 field = &aFootprint->
Value();
4601 item = fpText.get();
4602 text = fpText.get();
4606 static const std::map<wxString, wxString> variableMap = {
4607 {
"DESIGNATOR",
"REFERENCE" },
4608 {
"COMMENT",
"VALUE" },
4609 {
"VALUE",
"ALTIUM_VALUE" },
4610 {
"LAYER_NAME",
"LAYER" },
4611 {
"PRINT_DATE",
"CURRENT_DATE"},
4616 item = fpTextbox.get();
4617 text = fpTextbox.get();
4630 text->SetText( kicadText );
4631 text->SetKeepUpright(
false );
4647 std::unique_ptr<PCB_BARCODE> pcbBarcode = std::make_unique<PCB_BARCODE>(
m_board );
4649 pcbBarcode->SetLayer( aLayer );
4650 pcbBarcode->SetPosition( aElem.
position );
4654 pcbBarcode->SetText( aElem.
text );
4664 pcbBarcode->AssembleBarcode();
4673 std::unique_ptr<PCB_BARCODE> fpBarcode = std::make_unique<PCB_BARCODE>( aFootprint );
4675 fpBarcode->SetLayer( aLayer );
4676 fpBarcode->SetPosition( aElem.
position );
4680 fpBarcode->SetText( aElem.
text );
4690 fpBarcode->AssembleBarcode();
4719 kicadMargin =
VECTOR2I( charWidth * 0.933, charHeight * 0.67 );
4721 kicadMargin =
VECTOR2I( charWidth * 0.808, charHeight * 0.844 );
4724 + kicadMargin * 2 - margin * 2 );
4726 kposition = kposition - kicadMargin + margin;
4744 switch( justification )
4768 msg.Printf(
_(
"Unknown textbox justification %d, aText %s" ), justification,
4788 int rectHeight = aElem.
height;
4791 rectWidth = -rectWidth;
4797 switch( justification )
4803 kposition.
y -= rectHeight;
4809 kposition.
y -= rectHeight / 2;
4819 kposition.
x += rectWidth / 2;
4820 kposition.
y -= rectHeight;
4826 kposition.
x += rectWidth / 2;
4827 kposition.
y -= rectHeight / 2;
4833 kposition.
x += rectWidth / 2;
4839 kposition.
x += rectWidth;
4840 kposition.
y -= rectHeight;
4846 kposition.
x += rectWidth;
4847 kposition.
y -= rectHeight / 2;
4853 kposition.
x += rectWidth;
4906 if( font->
GetName().Contains( wxS(
"Arial" ) ) )
4921 const CFB::COMPOUND_FILE_ENTRY* aEntry )
4979 const bool aIsBoardImport )
5021 fill->SetFilled(
true );
5022 fill->SetLayer( aLayer );
5025 fill->SetStart( aElem.
pos1 );
5026 fill->SetEnd( aElem.
pos2 );
5048 if( aLayer ==
F_Cu || aLayer ==
B_Cu )
5050 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
5053 padLayers.
set( aLayer );
5068 std::swap( width, height );
5071 pad->SetPosition( aElem.
pos1 / 2 + aElem.
pos2 / 2 );
5083 pad->SetPosition( anchorPos );
5094 aElem.
pos1.
y / 2 + aElem.
pos2.
y / 2 - anchorPos.
y );
5096 pad->AddPrimitivePoly(
F_Cu, shapePolys, 0,
true );
5100 pad->SetLayerSet( padLayers );
5106 std::unique_ptr<PCB_SHAPE> fill =
5109 fill->SetFilled(
true );
5110 fill->SetLayer( aLayer );
5113 fill->SetStart( aElem.
pos1 );
5114 fill->SetEnd( aElem.
pos2 );
5133 layerSet.
set( klayer );
5141 bool keepoutRestrictionVia = ( aKeepoutRestrictions & 0x01 ) != 0;
5142 bool keepoutRestrictionTrack = ( aKeepoutRestrictions & 0x02 ) != 0;
5143 bool keepoutRestrictionCopper = ( aKeepoutRestrictions & 0x04 ) != 0;
5144 bool keepoutRestrictionSMDPad = ( aKeepoutRestrictions & 0x08 ) != 0;
5145 bool keepoutRestrictionTHPad = ( aKeepoutRestrictions & 0x10 ) != 0;
5157 const uint8_t aKeepoutRestrictions )
5159 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
5161 zone->SetIsRuleArea(
true );
5178 const uint8_t aKeepoutRestrictions )
5180 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>( aFootprint );
5182 zone->SetIsRuleArea(
true );
5206 if( elems.first == elems.second )
5209 std::vector<std::pair<PCB_LAYER_ID, int>> layerExpansionPairs;
5211 for(
auto it = elems.first; it != elems.second; ++it )
5251 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 & 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