43#include <wx/filename.h>
44#include <wx/wfstream.h>
46#include <wx/strconv.h>
47#include <wx/fontenc.h>
87 uint16_t v =
static_cast<uint16_t
>(
m_pos[0] )
88 | (
static_cast<uint16_t
>(
m_pos[1] ) << 8 );
123 uint32_t v =
static_cast<uint32_t
>(
m_pos[0] )
124 | (
static_cast<uint32_t
>(
m_pos[1] ) << 8 )
125 | (
static_cast<uint32_t
>(
m_pos[2] ) << 16 )
126 | (
static_cast<uint32_t
>(
m_pos[3] ) << 24 );
142 std::memcpy( &v, &bits,
sizeof( v ) );
152 uint64_t bits =
static_cast<uint64_t
>(
m_pos[0] )
153 | (
static_cast<uint64_t
>(
m_pos[1] ) << 8 )
154 | (
static_cast<uint64_t
>(
m_pos[2] ) << 16 )
155 | (
static_cast<uint64_t
>(
m_pos[3] ) << 24 )
156 | (
static_cast<uint64_t
>(
m_pos[4] ) << 32 )
157 | (
static_cast<uint64_t
>(
m_pos[5] ) << 40 )
158 | (
static_cast<uint64_t
>(
m_pos[6] ) << 48 )
159 | (
static_cast<uint64_t
>(
m_pos[7] ) << 56 );
163 std::memcpy( &v, &bits,
sizeof( v ) );
173 return static_cast<float>(
readInt32() );
175 return static_cast<float>(
readInt16() );
182 size_t len = std::min( rawLen, aMaxLen );
187 std::string s(
reinterpret_cast<const char*
>(
m_pos ), len );
203 std::string s(
reinterpret_cast<const char*
>(
m_pos ), len );
220 const uint8_t* seekTo =
m_pos + aBytes;
243 if( numBoards == 0 || numBoards > 100 )
253 for( uint32_t b = 0; b <
m_fileData.boards.size(); b++ )
263 boardData.
objects.resize( numObjects );
265 for( uint32_t i = 0; i < numObjects; i++ )
270 uint32_t numConnections = 0;
279 for( uint32_t c = 0; c < numConnections; c++ )
284 for( uint32_t i = 0; i < connCount; i++ )
300 data.
name = wxFileNameFromPath( aFileName ).BeforeLast(
'.' );
314 wxFFileInputStream stream( aFileName );
319 size_t fileSize = stream.GetLength();
322 THROW_IO_ERRORF(
_(
"File '%s' is too small to be a Sprint Layout file" ), aFileName );
325 stream.Read(
m_buffer.data(), fileSize );
327 if( stream.LastRead() != fileSize )
340 if(
m_fileData.version > 6 || magic1 != 0x33 || magic2 != 0xAA || magic3 != 0xFF )
359 for(
int i = 0; i < 7; i++ )
428 aBoard.
objects.resize( numObjects );
430 for( uint32_t i = 0; i < numObjects; i++ )
442 aObj.
groups.resize( groupCount );
444 for( uint32_t i = 0; i < groupCount; i++ )
456 for( uint32_t i = 0; i < pointCount; i++ )
462 if( pt.
x == 0.0f || std::isnormal( pt.
x ) )
464 aObj.
points.emplace_back( pt );
576 if(
m_fileData.version >= 2 && !aIsTextChild )
611 THROW_IO_ERROR(
_(
"Too many text children in Sprint Layout object" ) );
615 for( uint32_t i = 0; i < childCount; i++ )
661 switch( aSprintLayer )
670 default:
return F_Cu;
676 switch( aSprintLayer )
685 default:
return F_Cu;
699 nm =
static_cast<double>( aValue ) * 100.0;
701 nm =
static_cast<double>( aValue ) * 10000.0;
703 nm = std::clamp( nm,
static_cast<double>( -
pcbIUScale.mmToIU( 500 ) ),
704 static_cast<double>(
pcbIUScale.mmToIU( 500 ) ) );
719 static wxCSConv convCP1251( wxFONTENCODING_CP1251 );
720 static wxCSConv convCP1252( wxFONTENCODING_CP1252 );
723 return wxEmptyString;
725 wxString ret = wxString::FromUTF8( aStr );
727 if( ret.empty() && convCP1251.IsOk() && convCP1252.IsOk() )
730 size_t extNonGermanCount = 0;
732 for(
unsigned char c : aStr )
754 if( extNonGermanCount > 0 )
755 ret = wxString( aStr.c_str(), convCP1251 );
757 ret = wxString( aStr.c_str(), convCP1252 );
771 case F_Cu:
return aGroundPlane[0] != 0;
772 case B_Cu:
return aGroundPlane[2] != 0;
773 case In1_Cu:
return aGroundPlane[4] != 0;
774 case In2_Cu:
return aGroundPlane[5] != 0;
775 default:
return false;
782 case F_Cu:
return aGroundPlane[0] != 0;
783 case B_Cu:
return aGroundPlane[1] != 0;
784 default:
return false;
838 BOARD* board = &aBoard;
842 bool hasInnerLayers =
false;
848 hasInnerLayers =
true;
860 const wxString gndPlaneNetName(
"GND_PLANE" );
861 std::map<int, PCB_LAYER_ID> groundPlaneMap;
862 LSET groundPlaneLayerSet;
882 for(
const auto& [
index, layer] : groundPlaneMap )
885 groundPlaneLayerSet.
set( layer );
888 if( !groundPlaneLayerSet.empty() )
893 gndPlaneNet =
new NETINFO_ITEM( board, gndPlaneNetName );
894 board->
Add( gndPlaneNet );
905 zone->
SetNet( gndPlaneNet );
915 std::map<uint16_t, FOOTPRINT*> componentMap;
916 std::vector<std::vector<VECTOR2I>> outlineSegments;
918 auto getOrCreateComponentFootprint =
921 if( aObj.component_id == 0 )
924 auto it = componentMap.find( aObj.component_id );
926 if( it != componentMap.end() )
937 fp->
SetReference( wxString::Format( wxS(
"U%d" ), aObj.component_id ) );
940 fd->SetVisible(
false );
945 if( !aObj.component.comment.empty() )
951 else if( !aObj.identifier.empty() )
956 if( !aObj.component.package.empty() )
965 componentMap[aObj.component_id] = fp;
974 getOrCreateComponentFootprint( obj );
977 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
984 if(
FOOTPRINT* fp = getOrCreateComponentFootprint( obj ) )
1027 BOX2I fpBbox = fp->GetBoundingHull().BBox();
1030 fp->SetPosition(
anchor );
1034 fp->MoveAnchorPosition( anchorShift );
1038 for(
const auto& [componentId, fp] : componentMap )
1040 wxString fpKey = wxString::Format( wxS(
"SprintLayout_%s" ), fp->GetReference() );
1043 aFootprintMap[fpKey] = std::unique_ptr<FOOTPRINT>( fpCopy );
1057 fp->Move( centerOffset );
1060 zone->Move( centerOffset );
1063 item->Move( centerOffset );
1077 std::unique_ptr<FOOTPRINT> fp = std::make_unique<FOOTPRINT>(
nullptr );
1081 fp->SetFPID(
LIB_ID( wxEmptyString, fpName ) );
1082 fp->SetReference( wxT(
"REF**" ) );
1083 fp->SetValue( fpName );
1084 fp->Reference().SetVisible(
true );
1085 fp->Value().SetVisible(
true );
1087 std::vector<std::vector<VECTOR2I>> outlineSegments;
1088 uint8_t groundPlane[7] = {};
1089 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
1100 processPad( container, obj, groundPlane,
nullptr, gidToItems );
1104 processSegment( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1108 processLine( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1112 processPoly( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1116 processCircle( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1132 fp->AutoPositionFields();
1135 BOX2I bbox = fp->GetBoundingHull().BBox();
1138 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( fp.get(),
SHAPE_T::RECTANGLE );
1142 shape->SetEnd( bbox.
GetEnd() );
1151 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1152 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1154 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1156 bool standaloneFp =
false;
1161 standaloneFp =
true;
1166 aContainer->
Add( fp );
1180 if( !aObj.
points.empty() )
1182 double cx = 0, cy = 0;
1190 cx /=
static_cast<double>( aObj.
points.size() );
1191 cy /=
static_cast<double>( aObj.
points.size() );
1192 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1194 std::vector<VECTOR2I> pts;
1199 if( pts.size() == 2 )
1201 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1206 else if( pts.size() == 4 )
1208 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1210 else if( pts.size() == 8 )
1212 ptsAngle =
EDA_ANGLE( pts[2] - pts[1] );
1216 wxFAIL_MSG( wxString::Format(
"Unknown pad type %d shape %d with %zu points",
int( aObj.
type ),
1220 ptsAngle = ptsAngle.
Round( 2 );
1242 if( padLayer ==
F_Cu )
1244 else if( padLayer ==
B_Cu )
1247 pad->SetLayerSet(
LSET( { padLayer } ) );
1253 VECTOR2I padSize( outerDia, outerDia );
1254 VECTOR2I drillSize( drillDia, drillDia );
1275 pad->SetDrillSize( drillSize );
1307 pad->SetPosition( padPos );
1308 pad->Rotate( padPos, -ptsAngle );
1314 if( padLayer ==
F_Cu )
1316 else if( padLayer ==
B_Cu )
1319 pad->SetLayerSet(
LSET( { padLayer } ) );
1332 if( !aObj.
points.empty() )
1336 pad->SetPosition( padPos );
1337 pad->Rotate( padPos, -ptsAngle );
1343 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
1344 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
1351 pad->SetLocalClearance( std::optional<int>(
clearance ) );
1352 pad->SetLocalThermalGapOverride( std::optional<int>(
clearance ) );
1358 int spokeWidth = aObj.
rotation * 10000 / 2;
1359 pad->SetLocalThermalSpokeWidthOverride( spokeWidth );
1363 uint32_t spokeMask =
static_cast<uint32_t
>( aObj.
start_angle );
1365 if( spokeMask != 0 )
1369 if( spokeMask & 0x55555555 )
1371 else if( spokeMask & 0xAAAAAAAA )
1393 if( aGroundPlane[0] )
1395 else if( aGroundPlane[2] )
1397 else if( aGroundPlane[4] )
1399 else if( aGroundPlane[5] )
1406 pad->SetNumber( wxString::Format( wxS(
"%d" ),
static_cast<int>( fp->
Pads().size() + 1 ) ) );
1413 fd->SetTextPos(
pad->GetPosition() );
1425 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1426 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1427 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1429 if( aObj.
points.size() < 2 )
1432 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1437 std::vector<VECTOR2I> segment;
1442 aOutlineSegments.push_back( std::move( segment ) );
1451 for(
size_t i = 0; i + 1 < aObj.
points.size(); i++ )
1466 aContainer->
Add( shape );
1473 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1474 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1475 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1481 std::vector<VECTOR2I> seg;
1484 aOutlineSegments.push_back( std::move( seg ) );
1503 aContainer->
Add( shape );
1509 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1510 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1511 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1513 if( aObj.
points.size() < 2 )
1516 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1521 std::vector<VECTOR2I> points;
1526 points.push_back( points[0] );
1528 aOutlineSegments.push_back( std::move( points ) );
1533 bool isCutout = ( aObj.
keepout != 0 );
1553 ZONE* zone =
new ZONE( aContainer );
1563 aContainer->
Add( zone );
1566 else if( aObj.
points.size() >= 3 )
1580 aContainer->
Add( shape );
1587 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1588 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1589 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1591 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1601 bool isFullCircle =
true;
1602 double startAngleDeg = 0, endAngleDeg = 0;
1613 if( startAngleDeg > 1000 || startAngleDeg < -1000 || endAngleDeg > 1000 || endAngleDeg < -1000 )
1615 startAngleDeg /= 1000;
1616 endAngleDeg /= 1000;
1621 isFullCircle = ( startAngleDeg == 0 && endAngleDeg == 0 )
1622 || ( endAngleDeg - startAngleDeg >= 360 )
1623 || ( startAngleDeg == endAngleDeg );
1630 std::vector<VECTOR2I> segment;
1634 for(
int i = 0; i <= 24; i++ )
1636 double angle = (
static_cast<double>( i ) / 24.0 ) * 2.0 *
M_PI;
1637 int px =
center.x +
static_cast<int>( std::cos( angle ) * kiRadius );
1638 int py =
center.y -
static_cast<int>( std::sin( angle ) * kiRadius );
1639 segment.emplace_back( px, py );
1644 int32_t sa = startAngleDeg * 1000;
1645 int32_t ea = endAngleDeg * 1000;
1650 for( int32_t a = sa; a <= ea; a += 15000 )
1652 double rad = (
static_cast<double>( a ) / 1000.0 ) *
M_PI / 180.0;
1653 int px =
center.x +
static_cast<int>( std::cos( rad ) * kiRadius );
1654 int py =
center.y -
static_cast<int>( std::sin( rad ) * kiRadius );
1655 segment.emplace_back( px, py );
1658 double endRad = (
static_cast<double>( ea ) / 1000.0 ) *
M_PI / 180.0;
1659 int epx =
center.x +
static_cast<int>( std::cos( endRad ) * kiRadius );
1660 int epy =
center.y -
static_cast<int>( std::sin( endRad ) * kiRadius );
1661 segment.emplace_back( epx, epy );
1664 aOutlineSegments.push_back( std::move( segment ) );
1684 double startRad = startAngleDeg *
M_PI / 180.0;
1685 int sx =
center.x +
static_cast<int>( std::cos( startRad ) * kiRadius );
1686 int sy =
center.y -
static_cast<int>( std::sin( startRad ) * kiRadius );
1689 double newEndAngle = endAngleDeg;
1691 if( newEndAngle < startAngleDeg )
1695 double arcAngle = startAngleDeg - newEndAngle;
1705 aContainer->
Add( shape );
1711 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1737 if( aObj.
text.empty() )
1754 double cx = 0, cy = 0;
1755 size_t ptsCount = 0;
1781 cx /=
static_cast<double>( ptsCount );
1782 cy /=
static_cast<double>( ptsCount );
1783 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1787 text->SetLayer( layer );
1791 text->SetKeepUpright(
false );
1801 double widthScale = 0.8 + 0.2 * aObj.
line_width;
1802 text->SetTextSize(
VECTOR2I( height * widthScale, height ) );
1804 double thicknessScale = 0.06 + 0.05 * aObj.
inner;
1805 int thickness = height * thicknessScale;
1807 if( thickness <= 0 )
1808 thickness = std::max( 1, height / 8 );
1810 text->SetTextThickness( thickness );
1822 text->SetTextThickness( height / 8 );
1826 text->SetTextPos( untransformedPos );
1832 text->SetTextPos( newCenter );
1844 if( mirrorH ^ mirrorV )
1846 text->SetMirrored(
true );
1848 rotation = -rotation;
1864 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1866 for( uint32_t gid : aObj.
groups )
1867 aGidToItems[gid].insert( aItem );
1872 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1874 std::map<uint32_t, PCB_GROUP*> gidGroupMap;
1875 std::vector<uint32_t> gidAscBySize;
1877 for(
const auto& [gid,
_] : aGidToItems )
1881 gidGroupMap[gid] =
group;
1882 gidAscBySize.push_back( gid );
1890 std::sort( gidAscBySize.begin(), gidAscBySize.end(),
1891 [&]( uint32_t gidA, uint32_t gidB )
1893 size_t sa = aGidToItems.at( gidA ).size();
1894 size_t sb = aGidToItems.at( gidB ).size();
1902 for( uint32_t gid : gidAscBySize )
1910 if( itemGroup != grp )
1916 if( item->GetParent() == grp->
GetParent() )
1929 static const int PROXIMITY_DELTA = 100;
1939 for(
size_t iterations = 0; iterations < aOutlineSegments.size(); iterations++ )
1941 bool joined =
false;
1943 for( std::vector<VECTOR2I>& lineChain : aOutlineSegments )
1945 if( lineChain.size() < 2 )
1948 for( std::vector<VECTOR2I>& other : aOutlineSegments )
1950 if( &lineChain == &other || other.empty() )
1953 bool frontMatch = closeEnough( lineChain.back(), other.front(), PROXIMITY_DELTA );
1954 bool backMatch = !frontMatch && closeEnough( lineChain.back(), other.back(), PROXIMITY_DELTA );
1958 std::reverse( other.begin(), other.end() );
1965 if( lineChain.back() == other.front() )
1966 lineChain.insert( lineChain.end(), other.begin() + 1, other.end() );
1968 lineChain.insert( lineChain.end(), other.begin(), other.end() );
1980 bool hasOutline =
false;
1982 for(
const std::vector<VECTOR2I>& seg : aOutlineSegments )
1984 if( seg.size() < 2 )
1989 for(
size_t i = 0; i + 1 < seg.size(); i++ )
1996 shape->
SetEnd( seg[i + 1] );
1997 aBoard->
Add( shape );
2007 if( w > 0 && h > 0 )
2016 for(
int i = 0; i < 4; i++ )
2023 shape->
SetEnd( corners[( i + 1 ) % 4] );
2024 aBoard->
Add( shape );
static std::optional< VECTOR2D > normalized(const VECTOR2D &aVec)
constexpr EDA_IU_SCALE pcbIUScale
#define DEFAULT_COURTYARD_WIDTH
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
BASE_SET & set(size_t pos)
virtual void SetNet(NETINFO_ITEM *aNetInfo)
Set a NET_INFO object for the item.
Abstract interface for BOARD_ITEMs capable of storing other items inside.
virtual void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false)=0
Adds an item to the container.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
BOARD_ITEM_CONTAINER * GetParent() const
Information pertinent to a Pcbnew printed circuit board.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
const PAGE_INFO & GetPageSettings() const
const ZONES & Zones() const
const FOOTPRINTS & Footprints() const
void SetCopperLayerCount(int aCount)
BOX2I ComputeBoundingBox(bool aBoardEdgesOnly=false, bool aPhysicalLayersOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
const DRAWINGS & Drawings() const
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr const Vec GetEnd() const
constexpr size_type GetWidth() const
constexpr const Vec GetCenter() const
constexpr size_type GetHeight() const
constexpr const Vec & GetOrigin() const
EDA_ANGLE Round(int digits) const
void AddItem(EDA_ITEM *aItem)
Add item to group.
virtual void SetParent(EDA_ITEM *aParent)
virtual void SetFilled(bool aFlag)
virtual void SetVisible(bool aVisible)
virtual void SetText(const wxString &aText)
A logical library item identifier and consists of various portions much like a URI.
LSET is a set of PCB_LAYER_IDs.
Handle the data for a net.
static constexpr PCB_LAYER_ID TEMP_ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
static LSET PTHMask()
layer set for a through hole pad
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
A set of BOARD_ITEMs (i.e., without duplicates).
void SetCenter(const VECTOR2I &aCenter) override
void SetWidth(int aWidth) override
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
void SetShape(SHAPE_T aShape) override
void SetEnd(const VECTOR2I &aEnd) override
void SetPolyShape(const SHAPE_POLY_SET &aShape) override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetStart(const VECTOR2I &aStart) override
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
Represent a set of closed polygons.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
void processPoly(BOARD_ITEM_CONTAINER *aContainer, const SPRINT_LAYOUT::OBJECT &aObj, std::vector< std::vector< VECTOR2I > > &aOutlineSegments, const uint8_t aGroundPlane[7], NETINFO_ITEM *aGndPlaneNet, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
std::unique_ptr< FOOTPRINT > CreateFootprint()
void parsePoints(SPRINT_LAYOUT::OBJECT &aObj)
wxString convertString(const std::string &aStr) const
void processCircle(BOARD_ITEM_CONTAINER *aContainer, const SPRINT_LAYOUT::OBJECT &aObj, std::vector< std::vector< VECTOR2I > > &aOutlineSegments, const uint8_t aGroundPlane[7], NETINFO_ITEM *aGndPlaneNet, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
SPRINT_LAYOUT::FILE_DATA m_fileData
bool CreateBoard(BOARD &aBoard, std::map< wxString, std::unique_ptr< FOOTPRINT > > &aFootprintMap, size_t aBoardIndex=0)
PCB_LAYER_ID mapLayer(uint8_t aSprintLayer) const
void parseFileStart(const wxString &aFileName)
std::string readFixedString(size_t aMaxLen)
void processItemGroups(BOARD_ITEM *aItem, const SPRINT_LAYOUT::OBJECT &aObj, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
NETINFO_ITEM * resolveItemNet(BOARD *aBoard, const SPRINT_LAYOUT::OBJECT &aObj, PCB_LAYER_ID aLayer, const uint8_t aGroundPlane[7], NETINFO_ITEM *aGndPlaneNet) const
void processSegment(BOARD_ITEM_CONTAINER *aContainer, const SPRINT_LAYOUT::OBJECT &aObj, std::vector< std::vector< VECTOR2I > > &aOutlineSegments, const uint8_t aGroundPlane[7], NETINFO_ITEM *aGndPlaneNet, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
void buildOutline(BOARD *aBoard, std::vector< std::vector< VECTOR2I > > &aOutlineSegments, const SPRINT_LAYOUT::BOARD_DATA &aBoardData)
void processText(BOARD_ITEM_CONTAINER *aContainer, const SPRINT_LAYOUT::OBJECT &aObj, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
void parseGroups(SPRINT_LAYOUT::OBJECT &aObj)
void resolveGroups(BOARD_ITEM_CONTAINER *aContainer, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
void parseObject(SPRINT_LAYOUT::OBJECT &aObject, bool aIsTextChild=false)
void parseBoardHeader(SPRINT_LAYOUT::BOARD_DATA &aBoard)
void processPad(BOARD_ITEM_CONTAINER *aContainer, const SPRINT_LAYOUT::OBJECT &aObj, const uint8_t aGroundPlane[7], NETINFO_ITEM *aGndPlaneNet, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
VECTOR2I sprintToKicadPos(float aX, float aY) const
int sprintToKicadCoord(float aValue) const
void parseObjectsList(SPRINT_LAYOUT::BOARD_DATA &aBoard)
bool ParseMacroFile(const wxString &aFileName)
std::vector< uint8_t > m_buffer
bool layerHasGroundPlane(PCB_LAYER_ID aLayer, const uint8_t aGroundPlane[7]) const
std::string readVarString()
void processLine(BOARD_ITEM_CONTAINER *aContainer, const SPRINT_LAYOUT::OBJECT &aObj, std::vector< std::vector< VECTOR2I > > &aOutlineSegments, const uint8_t aGroundPlane[7], NETINFO_ITEM *aGndPlaneNet, std::map< uint32_t, std::set< BOARD_ITEM * > > &aGidToItems)
bool ParseBoard(const wxString &aFileName)
Handle a list of polygons defining a copper zone.
void SetDoNotAllowPads(bool aEnable)
void SetLocalClearance(std::optional< int > aClearance)
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuildBorderHatch)
Set all hatch parameters for the zone.
void SetThermalReliefSpokeWidth(int aThermalReliefSpokeWidth)
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetIsRuleArea(bool aEnable)
void SetDoNotAllowTracks(bool aEnable)
void SetLayerSet(const LSET &aLayerSet) override
void SetDoNotAllowVias(bool aEnable)
void SetNet(NETINFO_ITEM *aNetInfo) override
Override that drops aNetInfo when this zone is in copper-thieving fill mode.
void SetThermalReliefGap(int aThermalReliefGap)
void SetDoNotAllowFootprints(bool aEnable)
void SetDoNotAllowZoneFills(bool aEnable)
void SetAssignedPriority(unsigned aPriority)
void SetZoneName(const wxString &aName)
void SetIslandRemovalMode(ISLAND_REMOVAL_MODE aRemove)
static int GetDefaultHatchPitch()
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_45
static constexpr EDA_ANGLE ANGLE_180
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_IO_ERRORF(msg,...)
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
Class to handle a set of BOARD_ITEMs.
static constexpr uint32_t MAX_CHILDREN
static constexpr uint32_t MAX_GROUPS
static constexpr uint32_t MAX_OBJECTS
static constexpr uint32_t MAX_POINTS
std::vector< OBJECT > objects
std::vector< POINT > points
std::vector< OBJECT > text_children
std::vector< uint32_t > groups
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
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.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
@ THERMAL
Use thermal relief for pads.
@ NONE
Pads are not covered.
@ FULL
pads are covered by copper