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 );
315 THROW_IO_ERROR( wxString::Format(
_(
"Cannot open file '%s'" ), aFileName ) );
317 size_t fileSize = stream.GetLength();
320 THROW_IO_ERROR( wxString::Format(
_(
"File '%s' is too small to be a Sprint Layout file" ), aFileName ) );
323 stream.Read(
m_buffer.data(), fileSize );
325 if( stream.LastRead() != fileSize )
326 THROW_IO_ERROR( wxString::Format(
_(
"Failed to read file '%s'" ), aFileName ) );
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 );
481 THROW_IO_ERROR( wxString::Format(
_(
"Unknown object type %d in Sprint Layout file" ), aObj.
type ) );
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++ )
642 THROW_IO_ERROR( wxString::Format(
_(
"Unknown object type %d in Sprint Layout file" ), aObj.
type ) );
669 switch( aSprintLayer )
678 default:
return F_Cu;
684 switch( aSprintLayer )
694 default:
return F_Cu;
708 nm =
static_cast<double>( aValue ) * 100.0;
710 nm =
static_cast<double>( aValue ) * 10000.0;
712 nm = std::clamp( nm,
static_cast<double>( -
pcbIUScale.mmToIU( 500 ) ),
713 static_cast<double>(
pcbIUScale.mmToIU( 500 ) ) );
728 static wxCSConv convCP1251( wxFONTENCODING_CP1251 );
729 static wxCSConv convCP1252( wxFONTENCODING_CP1252 );
732 return wxEmptyString;
734 wxString ret = wxString::FromUTF8( aStr );
736 if( ret.empty() && convCP1251.IsOk() && convCP1252.IsOk() )
739 size_t extNonGermanCount = 0;
741 for(
unsigned char c : aStr )
762 if( extNonGermanCount > 0 )
763 ret = wxString( aStr.c_str(), convCP1251 );
765 ret = wxString( aStr.c_str(), convCP1252 );
779 case F_Cu:
return aGroundPlane[0] != 0;
780 case B_Cu:
return aGroundPlane[2] != 0;
781 case In1_Cu:
return aGroundPlane[4] != 0;
782 case In2_Cu:
return aGroundPlane[5] != 0;
783 default:
return false;
790 case F_Cu:
return aGroundPlane[0] != 0;
791 case B_Cu:
return aGroundPlane[1] != 0;
792 default:
return false;
846 std::unique_ptr<BOARD> board = std::make_unique<BOARD>();
850 bool hasInnerLayers =
false;
856 hasInnerLayers =
true;
862 board->SetCopperLayerCount( 4 );
864 board->SetCopperLayerCount( 2 );
868 const wxString gndPlaneNetName(
"GND_PLANE" );
869 std::map<int, PCB_LAYER_ID> groundPlaneMap;
870 LSET groundPlaneLayerSet;
890 for(
const auto& [
index, layer] : groundPlaneMap )
893 groundPlaneLayerSet.
set( layer );
896 if( !groundPlaneLayerSet.empty() )
901 gndPlaneNet =
new NETINFO_ITEM( board.get(), gndPlaneNetName );
902 board->Add( gndPlaneNet );
904 ZONE* zone =
new ZONE( board.get() );
913 zone->
SetNet( gndPlaneNet );
923 std::map<uint16_t, FOOTPRINT*> componentMap;
924 std::vector<std::vector<VECTOR2I>> outlineSegments;
928 if( aObj.component_id == 0 )
931 auto it = componentMap.find( aObj.component_id );
933 if( it != componentMap.end() )
944 fp->
SetReference( wxString::Format( wxS(
"U%d" ), aObj.component_id ) );
947 fd->SetVisible(
false );
952 if( !aObj.component.comment.empty() )
958 else if( !aObj.identifier.empty() )
963 if( !aObj.component.package.empty() )
972 componentMap[aObj.component_id] = fp;
981 getOrCreateComponentFootprint( obj );
984 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
991 if(
FOOTPRINT* fp = getOrCreateComponentFootprint( obj ) )
1032 for(
FOOTPRINT* fp : board->Footprints() )
1034 BOX2I fpBbox = fp->GetBoundingHull().BBox();
1037 fp->SetPosition(
anchor );
1041 fp->MoveAnchorPosition( anchorShift );
1045 for(
const auto& [componentId, fp] : componentMap )
1047 wxString fpKey = wxString::Format( wxS(
"SprintLayout_%s" ), fp->GetReference() );
1050 aFootprintMap[fpKey] = std::unique_ptr<FOOTPRINT>( fpCopy );
1053 buildOutline( board.get(), outlineSegments, boardData );
1056 BOX2I bbox = board->ComputeBoundingBox(
true );
1063 for(
FOOTPRINT* fp : board->Footprints() )
1064 fp->Move( centerOffset );
1066 for(
ZONE* zone : board->Zones() )
1067 zone->Move( centerOffset );
1070 item->Move( centerOffset );
1073 return board.release();
1084 std::unique_ptr<FOOTPRINT> fp = std::make_unique<FOOTPRINT>(
nullptr );
1088 fp->SetFPID(
LIB_ID( wxEmptyString, fpName ) );
1089 fp->SetReference( wxT(
"REF**" ) );
1090 fp->SetValue( fpName );
1091 fp->Reference().SetVisible(
true );
1092 fp->Value().SetVisible(
true );
1094 std::vector<std::vector<VECTOR2I>> outlineSegments;
1095 uint8_t groundPlane[7] = {};
1096 std::map<uint32_t, std::set<BOARD_ITEM*>> gidToItems;
1107 processPad( container, obj, groundPlane,
nullptr, gidToItems );
1111 processSegment( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1115 processLine( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1119 processPoly( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1123 processCircle( container, obj, outlineSegments, groundPlane,
nullptr, gidToItems );
1139 fp->AutoPositionFields();
1142 BOX2I bbox = fp->GetBoundingHull().BBox();
1145 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( fp.get(),
SHAPE_T::RECTANGLE );
1149 shape->SetEnd( bbox.
GetEnd() );
1153 return fp.release();
1158 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1159 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1161 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1163 bool standaloneFp =
false;
1168 standaloneFp =
true;
1173 aContainer->
Add( fp );
1187 if( !aObj.
points.empty() )
1189 double cx = 0, cy = 0;
1191 for(
const auto& pt : aObj.
points )
1197 cx /=
static_cast<double>( aObj.
points.size() );
1198 cy /=
static_cast<double>( aObj.
points.size() );
1199 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1201 std::vector<VECTOR2I> pts;
1206 if( pts.size() == 2 )
1208 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1213 else if( pts.size() == 4 )
1215 ptsAngle =
EDA_ANGLE( pts[1] - pts[0] );
1217 else if( pts.size() == 8 )
1219 ptsAngle =
EDA_ANGLE( pts[2] - pts[1] );
1223 wxFAIL_MSG( wxString::Format(
"Unknown pad type %d shape %d with %zu points",
int( aObj.
type ),
1227 ptsAngle = ptsAngle.
Round( 2 );
1249 if( padLayer ==
F_Cu )
1251 else if( padLayer ==
B_Cu )
1254 pad->SetLayerSet(
LSET( { padLayer } ) );
1260 VECTOR2I padSize( outerDia, outerDia );
1261 VECTOR2I drillSize( drillDia, drillDia );
1281 pad->SetDrillSize( drillSize );
1314 pad->SetPosition( padPos );
1315 pad->Rotate( padPos, -ptsAngle );
1321 if( padLayer ==
F_Cu )
1323 else if( padLayer ==
B_Cu )
1326 pad->SetLayerSet(
LSET( { padLayer } ) );
1339 if( !aObj.
points.empty() )
1343 pad->SetPosition( padPos );
1344 pad->Rotate( padPos, -ptsAngle );
1350 pad->Padstack().FrontOuterLayers().has_solder_mask =
false;
1351 pad->Padstack().BackOuterLayers().has_solder_mask =
false;
1358 pad->SetLocalClearance( std::optional<int>(
clearance ) );
1359 pad->SetLocalThermalGapOverride( std::optional<int>(
clearance ) );
1365 int spokeWidth = aObj.
rotation * 10000 / 2;
1366 pad->SetLocalThermalSpokeWidthOverride( spokeWidth );
1370 uint32_t spokeMask =
static_cast<uint32_t
>( aObj.
start_angle );
1372 if( spokeMask != 0 )
1376 if( spokeMask & 0x55555555 )
1378 else if( spokeMask & 0xAAAAAAAA )
1400 if( aGroundPlane[0] )
1402 else if( aGroundPlane[2] )
1404 else if( aGroundPlane[4] )
1406 else if( aGroundPlane[5] )
1413 pad->SetNumber( wxString::Format( wxS(
"%d" ),
static_cast<int>( fp->
Pads().size() + 1 ) ) );
1420 fd->SetTextPos(
pad->GetPosition() );
1432 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1433 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1434 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1436 if( aObj.
points.size() < 2 )
1439 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1444 std::vector<VECTOR2I> segment;
1446 for(
const auto& pt : aObj.
points )
1449 aOutlineSegments.push_back( std::move( segment ) );
1458 for(
size_t i = 0; i + 1 < aObj.
points.size(); i++ )
1473 aContainer->
Add( shape );
1480 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1481 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1482 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1488 std::vector<VECTOR2I> seg;
1491 aOutlineSegments.push_back( std::move( seg ) );
1510 aContainer->
Add( shape );
1516 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1517 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1518 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1520 if( aObj.
points.size() < 2 )
1523 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1528 std::vector<VECTOR2I> points;
1530 for(
const auto& pt : aObj.
points )
1533 points.push_back( points[0] );
1535 aOutlineSegments.push_back( std::move( points ) );
1540 bool isCutout = ( aObj.
keepout != 0 );
1549 for(
const auto& pt : aObj.
points )
1560 ZONE* zone =
new ZONE( aContainer );
1570 aContainer->
Add( zone );
1573 else if( aObj.
points.size() >= 3 )
1587 aContainer->
Add( shape );
1594 std::vector<std::vector<VECTOR2I>>& aOutlineSegments,
1595 const uint8_t aGroundPlane[7],
NETINFO_ITEM* aGndPlaneNet,
1596 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1598 BOARD* board = aContainer ? aContainer->
GetBoard() :
nullptr;
1608 bool isFullCircle =
true;
1609 double startAngleDeg = 0, endAngleDeg = 0;
1620 if( startAngleDeg > 1000 || startAngleDeg < -1000 || endAngleDeg > 1000 || endAngleDeg < -1000 )
1622 startAngleDeg /= 1000;
1623 endAngleDeg /= 1000;
1628 isFullCircle = ( startAngleDeg == 0 && endAngleDeg == 0 )
1629 || ( endAngleDeg - startAngleDeg >= 360 )
1630 || ( startAngleDeg == endAngleDeg );
1637 std::vector<VECTOR2I> segment;
1641 for(
int i = 0; i <= 24; i++ )
1643 double angle = (
static_cast<double>( i ) / 24.0 ) * 2.0 *
M_PI;
1644 int px =
center.x +
static_cast<int>( std::cos( angle ) * kiRadius );
1645 int py =
center.y -
static_cast<int>( std::sin( angle ) * kiRadius );
1646 segment.emplace_back( px, py );
1651 int32_t sa = startAngleDeg * 1000;
1652 int32_t ea = endAngleDeg * 1000;
1657 for( int32_t a = sa; a <= ea; a += 15000 )
1659 double rad = (
static_cast<double>( a ) / 1000.0 ) *
M_PI / 180.0;
1660 int px =
center.x +
static_cast<int>( std::cos( rad ) * kiRadius );
1661 int py =
center.y -
static_cast<int>( std::sin( rad ) * kiRadius );
1662 segment.emplace_back( px, py );
1665 double endRad = (
static_cast<double>( ea ) / 1000.0 ) *
M_PI / 180.0;
1666 int epx =
center.x +
static_cast<int>( std::cos( endRad ) * kiRadius );
1667 int epy =
center.y -
static_cast<int>( std::sin( endRad ) * kiRadius );
1668 segment.emplace_back( epx, epy );
1671 aOutlineSegments.push_back( std::move( segment ) );
1691 double startRad = startAngleDeg *
M_PI / 180.0;
1692 int sx =
center.x +
static_cast<int>( std::cos( startRad ) * kiRadius );
1693 int sy =
center.y -
static_cast<int>( std::sin( startRad ) * kiRadius );
1696 double newEndAngle = endAngleDeg;
1698 if( newEndAngle < startAngleDeg )
1702 double arcAngle = startAngleDeg - newEndAngle;
1712 aContainer->
Add( shape );
1718 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1744 if( aObj.
text.empty() )
1761 double cx = 0, cy = 0;
1762 size_t ptsCount = 0;
1785 cx /=
static_cast<double>( ptsCount );
1786 cy /=
static_cast<double>( ptsCount );
1787 ptsCenter =
sprintToKicadPos(
static_cast<float>( cx ),
static_cast<float>( cy ) );
1790 text->SetLayer( layer );
1794 text->SetKeepUpright(
false );
1804 double widthScale = 0.8 + 0.2 * aObj.
line_width;
1805 text->SetTextSize(
VECTOR2I( height * widthScale, height ) );
1807 double thicknessScale = 0.06 + 0.05 * aObj.
inner;
1808 int thickness = height * thicknessScale;
1810 if( thickness <= 0 )
1811 thickness = std::max( 1, height / 8 );
1813 text->SetTextThickness( thickness );
1825 text->SetTextThickness( height / 8 );
1829 text->SetTextPos( untransformedPos );
1835 text->SetTextPos( newCenter );
1847 if( mirrorH ^ mirrorV )
1849 text->SetMirrored(
true );
1851 rotation = -rotation;
1868 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1870 for( uint32_t gid : aObj.
groups )
1871 aGidToItems[gid].insert( aItem );
1876 std::map<uint32_t, std::set<BOARD_ITEM*>>& aGidToItems )
1878 std::map<uint32_t, PCB_GROUP*> gidGroupMap;
1879 std::vector<uint32_t> gidAscBySize;
1881 for(
const auto& [gid,
_] : aGidToItems )
1885 gidGroupMap[gid] =
group;
1886 gidAscBySize.push_back( gid );
1894 std::sort( gidAscBySize.begin(), gidAscBySize.end(),
1895 [&]( uint32_t gidA, uint32_t gidB )
1897 size_t sa = aGidToItems.at( gidA ).size();
1898 size_t sb = aGidToItems.at( gidB ).size();
1906 for( uint32_t gid : gidAscBySize )
1914 if( itemGroup != grp )
1920 if( item->GetParent() == grp->
GetParent() )
1933 static const int PROXIMITY_DELTA = 100;
1942 for(
size_t iterations = 0; iterations < aOutlineSegments.size(); iterations++ )
1944 bool joined =
false;
1946 for(
auto& seg : aOutlineSegments )
1948 if( seg.size() < 2 )
1951 for(
auto& other : aOutlineSegments )
1953 if( &seg == &other || other.empty() )
1956 bool frontMatch = closeEnough( seg.back(), other.front(), PROXIMITY_DELTA );
1957 bool backMatch = !frontMatch
1958 && closeEnough( seg.back(), other.back(), PROXIMITY_DELTA );
1962 std::reverse( other.begin(), other.end() );
1969 if( seg.back() == other.front() )
1970 seg.insert( seg.end(), other.begin() + 1, other.end() );
1972 seg.insert( seg.end(), other.begin(), other.end() );
1984 bool hasOutline =
false;
1986 for(
const auto& seg : aOutlineSegments )
1988 if( seg.size() < 2 )
1993 for(
size_t i = 0; i + 1 < seg.size(); i++ )
2000 shape->
SetEnd( seg[i + 1] );
2001 aBoard->
Add( shape );
2011 if( w > 0 && h > 0 )
2020 for(
int i = 0; i < 4; i++ )
2027 shape->
SetEnd( corners[( i + 1 ) % 4] );
2028 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
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