42#include <wx/filename.h>
43#include <wx/wfstream.h>
45#include <wx/strconv.h>
46#include <wx/fontenc.h>
86 uint16_t v =
static_cast<uint16_t
>(
m_pos[0] )
87 | (
static_cast<uint16_t
>(
m_pos[1] ) << 8 );
122 uint32_t v =
static_cast<uint32_t
>(
m_pos[0] )
123 | (
static_cast<uint32_t
>(
m_pos[1] ) << 8 )
124 | (
static_cast<uint32_t
>(
m_pos[2] ) << 16 )
125 | (
static_cast<uint32_t
>(
m_pos[3] ) << 24 );
141 std::memcpy( &v, &bits,
sizeof( v ) );
151 uint64_t bits =
static_cast<uint64_t
>(
m_pos[0] )
152 | (
static_cast<uint64_t
>(
m_pos[1] ) << 8 )
153 | (
static_cast<uint64_t
>(
m_pos[2] ) << 16 )
154 | (
static_cast<uint64_t
>(
m_pos[3] ) << 24 )
155 | (
static_cast<uint64_t
>(
m_pos[4] ) << 32 )
156 | (
static_cast<uint64_t
>(
m_pos[5] ) << 40 )
157 | (
static_cast<uint64_t
>(
m_pos[6] ) << 48 )
158 | (
static_cast<uint64_t
>(
m_pos[7] ) << 56 );
162 std::memcpy( &v, &bits,
sizeof( v ) );
172 return static_cast<float>(
readInt32() );
174 return static_cast<float>(
readInt16() );
181 size_t len = std::min( rawLen, aMaxLen );
186 std::string s(
reinterpret_cast<const char*
>(
m_pos ), len );
202 std::string s(
reinterpret_cast<const char*
>(
m_pos ), len );
219 const uint8_t* seekTo =
m_pos + aBytes;
242 if( numBoards == 0 || numBoards > 100 )
252 for( uint32_t b = 0; b <
m_fileData.boards.size(); b++ )
262 boardData.
objects.resize( numObjects );
264 for( uint32_t i = 0; i < numObjects; i++ )
269 uint32_t numConnections = 0;
271 for(
auto& obj : boardData.
objects )
278 for( uint32_t c = 0; c < numConnections; c++ )
283 for( uint32_t i = 0; i < connCount; i++ )
299 data.
name = wxFileNameFromPath( aFileName ).BeforeLast(
'.' );
313 wxFFileInputStream stream( aFileName );
318 size_t fileSize = stream.GetLength();
321 THROW_IO_ERRORF(
_(
"File '%s' is too small to be a Sprint Layout file" ), aFileName );
324 stream.Read(
m_buffer.data(), fileSize );
326 if( stream.LastRead() != fileSize )
339 if(
m_fileData.version > 6 || magic1 != 0x33 || magic2 != 0xAA || magic3 != 0xFF )
358 for(
int i = 0; i < 7; i++ )
427 aBoard.
objects.resize( numObjects );
429 for( uint32_t i = 0; i < numObjects; i++ )
441 aObj.
groups.resize( groupCount );
443 for( uint32_t i = 0; i < groupCount; i++ )
455 for( uint32_t i = 0; i < pointCount; i++ )
461 if( pt.
x == 0.0f || std::isnormal( pt.
x ) )
463 aObj.
points.emplace_back( pt );
575 if(
m_fileData.version >= 2 && !aIsTextChild )
618 THROW_IO_ERROR(
_(
"Too many text children in Sprint Layout object" ) );
622 for( uint32_t i = 0; i < childCount; i++ )
668 switch( aSprintLayer )
677 default:
return F_Cu;
683 switch( aSprintLayer )
693 default:
return F_Cu;
707 nm =
static_cast<double>( aValue ) * 100.0;
709 nm =
static_cast<double>( aValue ) * 10000.0;
711 nm = std::clamp( nm,
static_cast<double>( -
pcbIUScale.mmToIU( 500 ) ),
712 static_cast<double>(
pcbIUScale.mmToIU( 500 ) ) );
727 static wxCSConv convCP1251( wxFONTENCODING_CP1251 );
728 static wxCSConv convCP1252( wxFONTENCODING_CP1252 );
731 return wxEmptyString;
733 wxString ret = wxString::FromUTF8( aStr );
735 if( ret.empty() && convCP1251.IsOk() && convCP1252.IsOk() )
738 size_t extNonGermanCount = 0;
740 for(
unsigned char c : aStr )
761 if( extNonGermanCount > 0 )
762 ret = wxString( aStr.c_str(), convCP1251 );
764 ret = wxString( aStr.c_str(), convCP1252 );
778 case F_Cu:
return aGroundPlane[0] != 0;
779 case B_Cu:
return aGroundPlane[2] != 0;
780 case In1_Cu:
return aGroundPlane[4] != 0;
781 case In2_Cu:
return aGroundPlane[5] != 0;
782 default:
return false;
789 case F_Cu:
return aGroundPlane[0] != 0;
790 case B_Cu:
return aGroundPlane[1] != 0;
791 default:
return false;
845 BOARD* board = &aBoard;
849 bool hasInnerLayers =
false;
855 hasInnerLayers =
true;
867 const wxString gndPlaneNetName(
"GND_PLANE" );
868 std::map<int, PCB_LAYER_ID> groundPlaneMap;
869 LSET groundPlaneLayerSet;
889 for(
const auto& [
index, layer] : groundPlaneMap )
892 groundPlaneLayerSet.
set( layer );
895 if( !groundPlaneLayerSet.empty() )
900 gndPlaneNet =
new NETINFO_ITEM( board, gndPlaneNetName );
901 board->
Add( gndPlaneNet );
912 zone->
SetNet( gndPlaneNet );
922 std::map<uint16_t, FOOTPRINT*> componentMap;
923 std::vector<std::vector<VECTOR2I>> outlineSegments;
927 if( aObj.component_id == 0 )
930 auto it = componentMap.find( aObj.component_id );
932 if( it != componentMap.end() )
943 fp->
SetReference( wxString::Format( wxS(
"U%d" ), aObj.component_id ) );
946 fd->SetVisible(
false );
951 if( !aObj.component.comment.empty() )
957 else if( !aObj.identifier.empty() )
962 if( !aObj.component.package.empty() )
971 componentMap[aObj.component_id] = fp;
980 getOrCreateComponentFootprint( obj );
983 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
990 if(
FOOTPRINT* fp = getOrCreateComponentFootprint( obj ) )
1033 BOX2I fpBbox = fp->GetBoundingHull().BBox();
1036 fp->SetPosition(
anchor );
1040 fp->MoveAnchorPosition( anchorShift );
1044 for(
const auto& [componentId, fp] : componentMap )
1046 wxString fpKey = wxString::Format( wxS(
"SprintLayout_%s" ), fp->GetReference() );
1049 aFootprintMap[fpKey] = std::unique_ptr<FOOTPRINT>( fpCopy );
1063 fp->Move( centerOffset );
1066 zone->Move( centerOffset );
1069 item->Move( centerOffset );
1083 std::unique_ptr<FOOTPRINT> fp = std::make_unique<FOOTPRINT>(
nullptr );
1087 fp->SetFPID(
LIB_ID( wxEmptyString, fpName ) );
1088 fp->SetReference( wxT(
"REF**" ) );
1089 fp->SetValue( fpName );
1090 fp->Reference().SetVisible(
true );
1091 fp->Value().SetVisible(
true );
1093 std::vector<std::vector<VECTOR2I>> outlineSegments;
1094 uint8_t groundPlane[7] = {};
1095 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
1106 processPad( container, obj, groundPlane,
nullptr, gidToItems );
1110 processSegment( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1114 processLine( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1118 processPoly( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1122 processCircle( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1138 fp->AutoPositionFields();
1141 BOX2I bbox = fp->GetBoundingHull().BBox();
1144 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( fp.get(),
SHAPE_T::RECTANGLE );
1148 shape->SetEnd( bbox.
GetEnd() );
1157 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1158 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1160 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1162 bool standaloneFp =
false;
1167 standaloneFp =
true;
1172 aContainer->
Add( fp );
1186 if( !aObj.
points.empty() )
1188 double cx = 0, cy = 0;
1190 for(
const auto& pt : aObj.
points )
1196 cx /=
static_cast<double>( aObj.
points.size() );
1197 cy /=
static_cast<double>( aObj.
points.size() );
1198 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1200 std::vector<VECTOR2I> pts;
1205 if( pts.size() == 2 )
1207 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1212 else if( pts.size() == 4 )
1214 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1216 else if( pts.size() == 8 )
1218 ptsAngle =
EDA_ANGLE( pts[2] - pts[1] );
1222 wxFAIL_MSG( wxString::Format(
"Unknown pad type %d shape %d with %zu points",
int( aObj.
type ),
1226 ptsAngle = ptsAngle.
Round( 2 );
1248 if( padLayer ==
F_Cu )
1250 else if( padLayer ==
B_Cu )
1253 pad->SetLayerSet(
LSET( { padLayer } ) );
1259 VECTOR2I padSize( outerDia, outerDia );
1260 VECTOR2I drillSize( drillDia, drillDia );
1280 pad->SetDrillSize( drillSize );
1313 pad->SetPosition( padPos );
1314 pad->Rotate( padPos, -ptsAngle );
1320 if( padLayer ==
F_Cu )
1322 else if( padLayer ==
B_Cu )
1325 pad->SetLayerSet(
LSET( { padLayer } ) );
1338 if( !aObj.
points.empty() )
1342 pad->SetPosition( padPos );
1343 pad->Rotate( padPos, -ptsAngle );
1349 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
1350 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
1357 pad->SetLocalClearance( std::optional<int>(
clearance ) );
1358 pad->SetLocalThermalGapOverride( std::optional<int>(
clearance ) );
1364 int spokeWidth = aObj.
rotation * 10000 / 2;
1365 pad->SetLocalThermalSpokeWidthOverride( spokeWidth );
1369 uint32_t spokeMask =
static_cast<uint32_t
>( aObj.
start_angle );
1371 if( spokeMask != 0 )
1375 if( spokeMask & 0x55555555 )
1377 else if( spokeMask & 0xAAAAAAAA )
1399 if( aGroundPlane[0] )
1401 else if( aGroundPlane[2] )
1403 else if( aGroundPlane[4] )
1405 else if( aGroundPlane[5] )
1412 pad->SetNumber( wxString::Format( wxS(
"%d" ),
static_cast<int>( fp->
Pads().size() + 1 ) ) );
1419 fd->SetTextPos(
pad->GetPosition() );
1431 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1432 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1433 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1435 if( aObj.
points.size() < 2 )
1438 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1443 std::vector<VECTOR2I> segment;
1445 for(
const auto& pt : aObj.
points )
1448 aOutlineSegments.push_back( std::move( segment ) );
1457 for(
size_t i = 0; i + 1 < aObj.
points.size(); i++ )
1472 aContainer->
Add( shape );
1479 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1480 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1481 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1487 std::vector<VECTOR2I> seg;
1490 aOutlineSegments.push_back( std::move( seg ) );
1509 aContainer->
Add( shape );
1515 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1516 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1517 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1519 if( aObj.
points.size() < 2 )
1522 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1527 std::vector<VECTOR2I> points;
1529 for(
const auto& pt : aObj.
points )
1532 points.push_back( points[0] );
1534 aOutlineSegments.push_back( std::move( points ) );
1539 bool isCutout = ( aObj.
keepout != 0 );
1548 for(
const auto& pt : aObj.
points )
1559 ZONE* zone =
new ZONE( aContainer );
1569 aContainer->
Add( zone );
1572 else if( aObj.
points.size() >= 3 )
1586 aContainer->
Add( shape );
1593 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1594 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1595 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1597 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1607 bool isFullCircle =
true;
1608 double startAngleDeg = 0, endAngleDeg = 0;
1619 if( startAngleDeg > 1000 || startAngleDeg < -1000 || endAngleDeg > 1000 || endAngleDeg < -1000 )
1621 startAngleDeg /= 1000;
1622 endAngleDeg /= 1000;
1627 isFullCircle = ( startAngleDeg == 0 && endAngleDeg == 0 )
1628 || ( endAngleDeg - startAngleDeg >= 360 )
1629 || ( startAngleDeg == endAngleDeg );
1636 std::vector<VECTOR2I> segment;
1640 for(
int i = 0; i <= 24; i++ )
1642 double angle = (
static_cast<double>( i ) / 24.0 ) * 2.0 *
M_PI;
1643 int px =
center.x +
static_cast<int>( std::cos( angle ) * kiRadius );
1644 int py =
center.y -
static_cast<int>( std::sin( angle ) * kiRadius );
1645 segment.emplace_back( px, py );
1650 int32_t sa = startAngleDeg * 1000;
1651 int32_t ea = endAngleDeg * 1000;
1656 for( int32_t a = sa; a <= ea; a += 15000 )
1658 double rad = (
static_cast<double>( a ) / 1000.0 ) *
M_PI / 180.0;
1659 int px =
center.x +
static_cast<int>( std::cos( rad ) * kiRadius );
1660 int py =
center.y -
static_cast<int>( std::sin( rad ) * kiRadius );
1661 segment.emplace_back( px, py );
1664 double endRad = (
static_cast<double>( ea ) / 1000.0 ) *
M_PI / 180.0;
1665 int epx =
center.x +
static_cast<int>( std::cos( endRad ) * kiRadius );
1666 int epy =
center.y -
static_cast<int>( std::sin( endRad ) * kiRadius );
1667 segment.emplace_back( epx, epy );
1670 aOutlineSegments.push_back( std::move( segment ) );
1690 double startRad = startAngleDeg *
M_PI / 180.0;
1691 int sx =
center.x +
static_cast<int>( std::cos( startRad ) * kiRadius );
1692 int sy =
center.y -
static_cast<int>( std::sin( startRad ) * kiRadius );
1695 double newEndAngle = endAngleDeg;
1697 if( newEndAngle < startAngleDeg )
1701 double arcAngle = startAngleDeg - newEndAngle;
1711 aContainer->
Add( shape );
1717 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1743 if( aObj.
text.empty() )
1760 double cx = 0, cy = 0;
1761 size_t ptsCount = 0;
1787 cx /=
static_cast<double>( ptsCount );
1788 cy /=
static_cast<double>( ptsCount );
1789 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1793 text->SetLayer( layer );
1797 text->SetKeepUpright(
false );
1807 double widthScale = 0.8 + 0.2 * aObj.
line_width;
1808 text->SetTextSize(
VECTOR2I( height * widthScale, height ) );
1810 double thicknessScale = 0.06 + 0.05 * aObj.
inner;
1811 int thickness = height * thicknessScale;
1813 if( thickness <= 0 )
1814 thickness = std::max( 1, height / 8 );
1816 text->SetTextThickness( thickness );
1828 text->SetTextThickness( height / 8 );
1832 text->SetTextPos( untransformedPos );
1838 text->SetTextPos( newCenter );
1850 if( mirrorH ^ mirrorV )
1852 text->SetMirrored(
true );
1854 rotation = -rotation;
1871 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1873 for( uint32_t gid : aObj.
groups )
1874 aGidToItems[gid].insert( aItem );
1879 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1881 std::map<uint32_t, PCB_GROUP*> gidGroupMap;
1882 std::vector<uint32_t> gidAscBySize;
1884 for(
const auto& [gid,
_] : aGidToItems )
1888 gidGroupMap[gid] =
group;
1889 gidAscBySize.push_back( gid );
1897 std::sort( gidAscBySize.begin(), gidAscBySize.end(),
1898 [&]( uint32_t gidA, uint32_t gidB )
1900 size_t sa = aGidToItems.at( gidA ).size();
1901 size_t sb = aGidToItems.at( gidB ).size();
1909 for( uint32_t gid : gidAscBySize )
1917 if( itemGroup != grp )
1923 if( item->GetParent() == grp->
GetParent() )
1936 static const int PROXIMITY_DELTA = 100;
1945 for(
size_t iterations = 0; iterations < aOutlineSegments.size(); iterations++ )
1947 bool joined =
false;
1949 for(
auto& seg : aOutlineSegments )
1951 if( seg.size() < 2 )
1954 for(
auto& other : aOutlineSegments )
1956 if( &seg == &other || other.empty() )
1959 bool frontMatch = closeEnough( seg.back(), other.front(), PROXIMITY_DELTA );
1960 bool backMatch = !frontMatch
1961 && closeEnough( seg.back(), other.back(), PROXIMITY_DELTA );
1965 std::reverse( other.begin(), other.end() );
1972 if( seg.back() == other.front() )
1973 seg.insert( seg.end(), other.begin() + 1, other.end() );
1975 seg.insert( seg.end(), other.begin(), other.end() );
1987 bool hasOutline =
false;
1989 for(
const auto& seg : aOutlineSegments )
1991 if( seg.size() < 2 )
1996 for(
size_t i = 0; i + 1 < seg.size(); i++ )
2003 shape->
SetEnd( seg[i + 1] );
2004 aBoard->
Add( shape );
2014 if( w > 0 && h > 0 )
2023 for(
int i = 0; i < 4; i++ )
2030 shape->
SetEnd( corners[( i + 1 ) % 4] );
2031 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 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)
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 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 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 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()
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuilBorderHatch)
Set all hatch parameters for the zone.
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