41#include <wx/filename.h>
42#include <wx/wfstream.h>
44#include <wx/strconv.h>
45#include <wx/fontenc.h>
85 uint16_t v =
static_cast<uint16_t
>(
m_pos[0] )
86 | (
static_cast<uint16_t
>(
m_pos[1] ) << 8 );
121 uint32_t v =
static_cast<uint32_t
>(
m_pos[0] )
122 | (
static_cast<uint32_t
>(
m_pos[1] ) << 8 )
123 | (
static_cast<uint32_t
>(
m_pos[2] ) << 16 )
124 | (
static_cast<uint32_t
>(
m_pos[3] ) << 24 );
140 std::memcpy( &v, &bits,
sizeof( v ) );
150 uint64_t bits =
static_cast<uint64_t
>(
m_pos[0] )
151 | (
static_cast<uint64_t
>(
m_pos[1] ) << 8 )
152 | (
static_cast<uint64_t
>(
m_pos[2] ) << 16 )
153 | (
static_cast<uint64_t
>(
m_pos[3] ) << 24 )
154 | (
static_cast<uint64_t
>(
m_pos[4] ) << 32 )
155 | (
static_cast<uint64_t
>(
m_pos[5] ) << 40 )
156 | (
static_cast<uint64_t
>(
m_pos[6] ) << 48 )
157 | (
static_cast<uint64_t
>(
m_pos[7] ) << 56 );
161 std::memcpy( &v, &bits,
sizeof( v ) );
171 return static_cast<float>(
readInt32() );
173 return static_cast<float>(
readInt16() );
180 size_t len = std::min( rawLen, aMaxLen );
185 std::string s(
reinterpret_cast<const char*
>(
m_pos ), len );
201 std::string s(
reinterpret_cast<const char*
>(
m_pos ), len );
218 const uint8_t* seekTo =
m_pos + aBytes;
241 if( numBoards == 0 || numBoards > 100 )
251 for( uint32_t b = 0; b <
m_fileData.boards.size(); b++ )
261 boardData.
objects.resize( numObjects );
263 for( uint32_t i = 0; i < numObjects; i++ )
268 uint32_t numConnections = 0;
270 for(
auto& obj : boardData.
objects )
277 for( uint32_t c = 0; c < numConnections; c++ )
282 for( uint32_t i = 0; i < connCount; i++ )
298 data.
name = wxFileNameFromPath( aFileName ).BeforeLast(
'.' );
312 wxFFileInputStream stream( aFileName );
317 size_t fileSize = stream.GetLength();
320 THROW_IO_ERRORF(
_(
"File '%s' is too small to be a Sprint Layout file" ), aFileName );
323 stream.Read(
m_buffer.data(), fileSize );
325 if( stream.LastRead() != fileSize )
338 if(
m_fileData.version > 6 || magic1 != 0x33 || magic2 != 0xAA || magic3 != 0xFF )
357 for(
int i = 0; i < 7; i++ )
426 aBoard.
objects.resize( numObjects );
428 for( uint32_t i = 0; i < numObjects; i++ )
440 aObj.
groups.resize( groupCount );
442 for( uint32_t i = 0; i < groupCount; i++ )
454 for( uint32_t i = 0; i < pointCount; i++ )
460 if( pt.
x == 0.0f || std::isnormal( pt.
x ) )
462 aObj.
points.emplace_back( pt );
574 if(
m_fileData.version >= 2 && !aIsTextChild )
617 THROW_IO_ERROR(
_(
"Too many text children in Sprint Layout object" ) );
621 for( uint32_t i = 0; i < childCount; i++ )
667 switch( aSprintLayer )
676 default:
return F_Cu;
682 switch( aSprintLayer )
692 default:
return F_Cu;
706 nm =
static_cast<double>( aValue ) * 100.0;
708 nm =
static_cast<double>( aValue ) * 10000.0;
710 nm = std::clamp( nm,
static_cast<double>( -
pcbIUScale.mmToIU( 500 ) ),
711 static_cast<double>(
pcbIUScale.mmToIU( 500 ) ) );
726 static wxCSConv convCP1251( wxFONTENCODING_CP1251 );
727 static wxCSConv convCP1252( wxFONTENCODING_CP1252 );
730 return wxEmptyString;
732 wxString ret = wxString::FromUTF8( aStr );
734 if( ret.empty() && convCP1251.IsOk() && convCP1252.IsOk() )
737 size_t extNonGermanCount = 0;
739 for(
unsigned char c : aStr )
760 if( extNonGermanCount > 0 )
761 ret = wxString( aStr.c_str(), convCP1251 );
763 ret = wxString( aStr.c_str(), convCP1252 );
777 case F_Cu:
return aGroundPlane[0] != 0;
778 case B_Cu:
return aGroundPlane[2] != 0;
779 case In1_Cu:
return aGroundPlane[4] != 0;
780 case In2_Cu:
return aGroundPlane[5] != 0;
781 default:
return false;
788 case F_Cu:
return aGroundPlane[0] != 0;
789 case B_Cu:
return aGroundPlane[1] != 0;
790 default:
return false;
844 std::unique_ptr<BOARD> board = std::make_unique<BOARD>();
848 bool hasInnerLayers =
false;
854 hasInnerLayers =
true;
860 board->SetCopperLayerCount( 4 );
862 board->SetCopperLayerCount( 2 );
866 const wxString gndPlaneNetName(
"GND_PLANE" );
867 std::map<int, PCB_LAYER_ID> groundPlaneMap;
868 LSET groundPlaneLayerSet;
888 for(
const auto& [
index, layer] : groundPlaneMap )
891 groundPlaneLayerSet.
set( layer );
894 if( !groundPlaneLayerSet.empty() )
899 gndPlaneNet =
new NETINFO_ITEM( board.get(), gndPlaneNetName );
900 board->Add( gndPlaneNet );
902 ZONE* zone =
new ZONE( board.get() );
911 zone->
SetNet( gndPlaneNet );
921 std::map<uint16_t, FOOTPRINT*> componentMap;
922 std::vector<std::vector<VECTOR2I>> outlineSegments;
926 if( aObj.component_id == 0 )
929 auto it = componentMap.find( aObj.component_id );
931 if( it != componentMap.end() )
942 fp->
SetReference( wxString::Format( wxS(
"U%d" ), aObj.component_id ) );
945 fd->SetVisible(
false );
950 if( !aObj.component.comment.empty() )
956 else if( !aObj.identifier.empty() )
961 if( !aObj.component.package.empty() )
970 componentMap[aObj.component_id] = fp;
979 getOrCreateComponentFootprint( obj );
982 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
989 if(
FOOTPRINT* fp = getOrCreateComponentFootprint( obj ) )
1030 for(
FOOTPRINT* fp : board->Footprints() )
1032 BOX2I fpBbox = fp->GetBoundingHull().BBox();
1035 fp->SetPosition(
anchor );
1039 fp->MoveAnchorPosition( anchorShift );
1043 for(
const auto& [componentId, fp] : componentMap )
1045 wxString fpKey = wxString::Format( wxS(
"SprintLayout_%s" ), fp->GetReference() );
1048 aFootprintMap[fpKey] = std::unique_ptr<FOOTPRINT>( fpCopy );
1051 buildOutline( board.get(), outlineSegments, boardData );
1054 BOX2I bbox = board->ComputeBoundingBox(
true );
1061 for(
FOOTPRINT* fp : board->Footprints() )
1062 fp->Move( centerOffset );
1064 for(
ZONE* zone : board->Zones() )
1065 zone->Move( centerOffset );
1068 item->Move( centerOffset );
1071 return board.release();
1082 std::unique_ptr<FOOTPRINT> fp = std::make_unique<FOOTPRINT>(
nullptr );
1086 fp->SetFPID(
LIB_ID( wxEmptyString, fpName ) );
1087 fp->SetReference( wxT(
"REF**" ) );
1088 fp->SetValue( fpName );
1089 fp->Reference().SetVisible(
true );
1090 fp->Value().SetVisible(
true );
1092 std::vector<std::vector<VECTOR2I>> outlineSegments;
1093 uint8_t groundPlane[7] = {};
1094 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
1105 processPad( container, obj, groundPlane,
nullptr, gidToItems );
1109 processSegment( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1113 processLine( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1117 processPoly( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1121 processCircle( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1137 fp->AutoPositionFields();
1140 BOX2I bbox = fp->GetBoundingHull().BBox();
1143 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( fp.get(),
SHAPE_T::RECTANGLE );
1147 shape->SetEnd( bbox.
GetEnd() );
1151 return fp.release();
1156 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1157 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1159 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1161 bool standaloneFp =
false;
1166 standaloneFp =
true;
1171 aContainer->
Add( fp );
1185 if( !aObj.
points.empty() )
1187 double cx = 0, cy = 0;
1189 for(
const auto& pt : aObj.
points )
1195 cx /=
static_cast<double>( aObj.
points.size() );
1196 cy /=
static_cast<double>( aObj.
points.size() );
1197 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1199 std::vector<VECTOR2I> pts;
1204 if( pts.size() == 2 )
1206 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1211 else if( pts.size() == 4 )
1213 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1215 else if( pts.size() == 8 )
1217 ptsAngle =
EDA_ANGLE( pts[2] - pts[1] );
1221 wxFAIL_MSG( wxString::Format(
"Unknown pad type %d shape %d with %zu points",
int( aObj.
type ),
1225 ptsAngle = ptsAngle.
Round( 2 );
1247 if( padLayer ==
F_Cu )
1249 else if( padLayer ==
B_Cu )
1252 pad->SetLayerSet(
LSET( { padLayer } ) );
1258 VECTOR2I padSize( outerDia, outerDia );
1259 VECTOR2I drillSize( drillDia, drillDia );
1279 pad->SetDrillSize( drillSize );
1312 pad->SetPosition( padPos );
1313 pad->Rotate( padPos, -ptsAngle );
1319 if( padLayer ==
F_Cu )
1321 else if( padLayer ==
B_Cu )
1324 pad->SetLayerSet(
LSET( { padLayer } ) );
1337 if( !aObj.
points.empty() )
1341 pad->SetPosition( padPos );
1342 pad->Rotate( padPos, -ptsAngle );
1348 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
1349 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
1356 pad->SetLocalClearance( std::optional<int>(
clearance ) );
1357 pad->SetLocalThermalGapOverride( std::optional<int>(
clearance ) );
1363 int spokeWidth = aObj.
rotation * 10000 / 2;
1364 pad->SetLocalThermalSpokeWidthOverride( spokeWidth );
1368 uint32_t spokeMask =
static_cast<uint32_t
>( aObj.
start_angle );
1370 if( spokeMask != 0 )
1374 if( spokeMask & 0x55555555 )
1376 else if( spokeMask & 0xAAAAAAAA )
1398 if( aGroundPlane[0] )
1400 else if( aGroundPlane[2] )
1402 else if( aGroundPlane[4] )
1404 else if( aGroundPlane[5] )
1411 pad->SetNumber( wxString::Format( wxS(
"%d" ),
static_cast<int>( fp->
Pads().size() + 1 ) ) );
1418 fd->SetTextPos(
pad->GetPosition() );
1430 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1431 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1432 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1434 if( aObj.
points.size() < 2 )
1437 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1442 std::vector<VECTOR2I> segment;
1444 for(
const auto& pt : aObj.
points )
1447 aOutlineSegments.push_back( std::move( segment ) );
1456 for(
size_t i = 0; i + 1 < aObj.
points.size(); i++ )
1471 aContainer->
Add( shape );
1478 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1479 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1480 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1486 std::vector<VECTOR2I> seg;
1489 aOutlineSegments.push_back( std::move( seg ) );
1508 aContainer->
Add( shape );
1514 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1515 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1516 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1518 if( aObj.
points.size() < 2 )
1521 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1526 std::vector<VECTOR2I> points;
1528 for(
const auto& pt : aObj.
points )
1531 points.push_back( points[0] );
1533 aOutlineSegments.push_back( std::move( points ) );
1538 bool isCutout = ( aObj.
keepout != 0 );
1547 for(
const auto& pt : aObj.
points )
1558 ZONE* zone =
new ZONE( aContainer );
1568 aContainer->
Add( zone );
1571 else if( aObj.
points.size() >= 3 )
1585 aContainer->
Add( shape );
1592 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1593 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1594 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1596 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1606 bool isFullCircle =
true;
1607 double startAngleDeg = 0, endAngleDeg = 0;
1618 if( startAngleDeg > 1000 || startAngleDeg < -1000 || endAngleDeg > 1000 || endAngleDeg < -1000 )
1620 startAngleDeg /= 1000;
1621 endAngleDeg /= 1000;
1626 isFullCircle = ( startAngleDeg == 0 && endAngleDeg == 0 )
1627 || ( endAngleDeg - startAngleDeg >= 360 )
1628 || ( startAngleDeg == endAngleDeg );
1635 std::vector<VECTOR2I> segment;
1639 for(
int i = 0; i <= 24; i++ )
1641 double angle = (
static_cast<double>( i ) / 24.0 ) * 2.0 *
M_PI;
1642 int px =
center.x +
static_cast<int>( std::cos( angle ) * kiRadius );
1643 int py =
center.y -
static_cast<int>( std::sin( angle ) * kiRadius );
1644 segment.emplace_back( px, py );
1649 int32_t sa = startAngleDeg * 1000;
1650 int32_t ea = endAngleDeg * 1000;
1655 for( int32_t a = sa; a <= ea; a += 15000 )
1657 double rad = (
static_cast<double>( a ) / 1000.0 ) *
M_PI / 180.0;
1658 int px =
center.x +
static_cast<int>( std::cos( rad ) * kiRadius );
1659 int py =
center.y -
static_cast<int>( std::sin( rad ) * kiRadius );
1660 segment.emplace_back( px, py );
1663 double endRad = (
static_cast<double>( ea ) / 1000.0 ) *
M_PI / 180.0;
1664 int epx =
center.x +
static_cast<int>( std::cos( endRad ) * kiRadius );
1665 int epy =
center.y -
static_cast<int>( std::sin( endRad ) * kiRadius );
1666 segment.emplace_back( epx, epy );
1669 aOutlineSegments.push_back( std::move( segment ) );
1689 double startRad = startAngleDeg *
M_PI / 180.0;
1690 int sx =
center.x +
static_cast<int>( std::cos( startRad ) * kiRadius );
1691 int sy =
center.y -
static_cast<int>( std::sin( startRad ) * kiRadius );
1694 double newEndAngle = endAngleDeg;
1696 if( newEndAngle < startAngleDeg )
1700 double arcAngle = startAngleDeg - newEndAngle;
1710 aContainer->
Add( shape );
1716 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1742 if( aObj.
text.empty() )
1759 double cx = 0, cy = 0;
1760 size_t ptsCount = 0;
1786 cx /=
static_cast<double>( ptsCount );
1787 cy /=
static_cast<double>( ptsCount );
1788 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1792 text->SetLayer( layer );
1796 text->SetKeepUpright(
false );
1806 double widthScale = 0.8 + 0.2 * aObj.
line_width;
1807 text->SetTextSize(
VECTOR2I( height * widthScale, height ) );
1809 double thicknessScale = 0.06 + 0.05 * aObj.
inner;
1810 int thickness = height * thicknessScale;
1812 if( thickness <= 0 )
1813 thickness = std::max( 1, height / 8 );
1815 text->SetTextThickness( thickness );
1827 text->SetTextThickness( height / 8 );
1831 text->SetTextPos( untransformedPos );
1837 text->SetTextPos( newCenter );
1849 if( mirrorH ^ mirrorV )
1851 text->SetMirrored(
true );
1853 rotation = -rotation;
1870 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1872 for( uint32_t gid : aObj.
groups )
1873 aGidToItems[gid].insert( aItem );
1878 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1880 std::map<uint32_t, PCB_GROUP*> gidGroupMap;
1881 std::vector<uint32_t> gidAscBySize;
1883 for(
const auto& [gid,
_] : aGidToItems )
1887 gidGroupMap[gid] =
group;
1888 gidAscBySize.push_back( gid );
1896 std::sort( gidAscBySize.begin(), gidAscBySize.end(),
1897 [&]( uint32_t gidA, uint32_t gidB )
1899 size_t sa = aGidToItems.at( gidA ).size();
1900 size_t sb = aGidToItems.at( gidB ).size();
1908 for( uint32_t gid : gidAscBySize )
1916 if( itemGroup != grp )
1922 if( item->GetParent() == grp->
GetParent() )
1935 static const int PROXIMITY_DELTA = 100;
1944 for(
size_t iterations = 0; iterations < aOutlineSegments.size(); iterations++ )
1946 bool joined =
false;
1948 for(
auto& seg : aOutlineSegments )
1950 if( seg.size() < 2 )
1953 for(
auto& other : aOutlineSegments )
1955 if( &seg == &other || other.empty() )
1958 bool frontMatch = closeEnough( seg.back(), other.front(), PROXIMITY_DELTA );
1959 bool backMatch = !frontMatch
1960 && closeEnough( seg.back(), other.back(), PROXIMITY_DELTA );
1964 std::reverse( other.begin(), other.end() );
1971 if( seg.back() == other.front() )
1972 seg.insert( seg.end(), other.begin() + 1, other.end() );
1974 seg.insert( seg.end(), other.begin(), other.end() );
1986 bool hasOutline =
false;
1988 for(
const auto& seg : aOutlineSegments )
1990 if( seg.size() < 2 )
1995 for(
size_t i = 0; i + 1 < seg.size(); i++ )
2002 shape->
SetEnd( seg[i + 1] );
2003 aBoard->
Add( shape );
2013 if( w > 0 && h > 0 )
2022 for(
int i = 0; i < 4; i++ )
2029 shape->
SetEnd( corners[( i + 1 ) % 4] );
2030 aBoard->
Add( shape );
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 FOOTPRINTS & Footprints() 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)
void SetCenter(const VECTOR2I &aCenter)
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 ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
static LSET PTHMask()
layer set for a through hole pad
A set of BOARD_ITEMs (i.e., without duplicates).
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)
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
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)
BOARD * CreateBoard(std::map< wxString, std::unique_ptr< FOOTPRINT > > &aFootprintMap, size_t aBoardIndex=0)
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
FOOTPRINT * CreateFootprint()
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 aRebuilBorderdHatch)
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