68#include <wx/filename.h>
69#include <wx/wfstream.h>
70#include <wx/txtstrm.h>
71#include <boost/ptr_container/ptr_map.hpp>
102#define FIRST_COPPER_LAYER 0
103#define LAYER_N_BACK 0
118#define LAYER_N_FRONT 15
119#define LAST_COPPER_LAYER LAYER_N_FRONT
121#define FIRST_NON_COPPER_LAYER 16
122#define ADHESIVE_N_BACK 16
123#define ADHESIVE_N_FRONT 17
124#define SOLDERPASTE_N_BACK 18
125#define SOLDERPASTE_N_FRONT 19
126#define SILKSCREEN_N_BACK 20
127#define SILKSCREEN_N_FRONT 21
128#define SOLDERMASK_N_BACK 22
129#define SOLDERMASK_N_FRONT 23
135#define LAST_NON_COPPER_LAYER 28
139#define LAYER_BACK (1 << LAYER_N_BACK)
140#define LAYER_2 (1 << LAYER_N_2)
141#define LAYER_3 (1 << LAYER_N_3)
142#define LAYER_4 (1 << LAYER_N_4)
143#define LAYER_5 (1 << LAYER_N_5)
144#define LAYER_6 (1 << LAYER_N_6)
145#define LAYER_7 (1 << LAYER_N_7)
146#define LAYER_8 (1 << LAYER_N_8)
147#define LAYER_9 (1 << LAYER_N_9)
148#define LAYER_10 (1 << LAYER_N_10)
149#define LAYER_11 (1 << LAYER_N_11)
150#define LAYER_12 (1 << LAYER_N_12)
151#define LAYER_13 (1 << LAYER_N_13)
152#define LAYER_14 (1 << LAYER_N_14)
153#define LAYER_15 (1 << LAYER_N_15)
154#define LAYER_FRONT (1 << LAYER_N_FRONT)
155#define ADHESIVE_LAYER_BACK (1 << ADHESIVE_N_BACK)
156#define ADHESIVE_LAYER_FRONT (1 << ADHESIVE_N_FRONT)
157#define SOLDERPASTE_LAYER_BACK (1 << SOLDERPASTE_N_BACK)
158#define SOLDERPASTE_LAYER_FRONT (1 << SOLDERPASTE_N_FRONT)
159#define SILKSCREEN_LAYER_BACK (1 << SILKSCREEN_N_BACK)
160#define SILKSCREEN_LAYER_FRONT (1 << SILKSCREEN_N_FRONT)
161#define SOLDERMASK_LAYER_BACK (1 << SOLDERMASK_N_BACK)
162#define SOLDERMASK_LAYER_FRONT (1 << SOLDERMASK_N_FRONT)
163#define DRAW_LAYER (1 << DRAW_N)
164#define COMMENT_LAYER (1 << COMMENT_N)
165#define ECO1_LAYER (1 << ECO1_N)
166#define ECO2_LAYER (1 << ECO2_N)
167#define EDGE_LAYER (1 << EDGE_N)
172#define ALL_NO_CU_LAYERS 0x1FFF0000
173#define ALL_CU_LAYERS 0x0000FFFF
174#define FRONT_TECH_LAYERS (SILKSCREEN_LAYER_FRONT | SOLDERMASK_LAYER_FRONT \
175 | ADHESIVE_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT)
176#define BACK_TECH_LAYERS (SILKSCREEN_LAYER_BACK | SOLDERMASK_LAYER_BACK \
177 | ADHESIVE_LAYER_BACK | SOLDERPASTE_LAYER_BACK)
178#define ALL_TECH_LAYERS (FRONT_TECH_LAYERS | BACK_TECH_LAYERS)
179#define BACK_LAYERS (LAYER_BACK | BACK_TECH_LAYERS)
180#define FRONT_LAYERS (LAYER_FRONT | FRONT_TECH_LAYERS)
182#define ALL_USER_LAYERS (DRAW_LAYER | COMMENT_LAYER | ECO1_LAYER | ECO2_LAYER )
184#define NO_LAYERS 0x00000000
186#define PCB_LEGACY_TEXT_is_REFERENCE 0
187#define PCB_LEGACY_TEXT_is_VALUE 1
188#define PCB_LEGACY_TEXT_is_DIVERS 2
191#define PCB_LEGACY_INTERNAL_UNIT 10000
194#define SZ( x ) (sizeof(x)-1)
200static bool inline isSpace(
int c ) {
return strchr(
delims, c ) !=
nullptr; }
202#define MASK(x) (1<<(x))
207 const unsigned PROGRESS_DELTA = 250;
230#define TESTLINE( x ) ( !strncasecmp( line, x, SZ( x ) ) && isSpace( line[SZ( x )] ) )
233#define TESTSUBSTR( x ) ( !strncasecmp( line, x, SZ( x ) ) )
237#define READLINE( rdr ) rdr->ReadLine()
243static inline char* ReadLine(
LINE_READER* rdr,
const char* caller )
247 const char* line = rdr->
Line();
250 if( !strcmp(
"loadSETUP", caller ) && !strcmp(
"$EndSETUP\n", line ) )
258#define READLINE( rdr ) ReadLine( rdr, __FUNCTION__ )
264 if( !strcmp(
"L", horizontal ) )
267 if( !strcmp(
"R", horizontal ) )
275 if( !strcmp(
"T", vertical ) )
278 if( !strcmp(
"B", vertical ) )
306 return aLegacyLayerNum ==
LAYER_N_FRONT || aLegacyLayerNum < aCu_Count;
313 unsigned old = aLayerNum;
332 wxASSERT( newid >= 0 );
374 aMask &= ~ALL_CU_LAYERS;
377 for(
int i=0; aMask; ++i, aMask >>= 1 )
393static inline int intParse(
const char*
next,
const char** out =
nullptr )
396 return (
int) strtol(
next, (
char**) out, 10 );
406static inline uint32_t
hexParse(
const char*
next,
const char** out =
nullptr )
408 return (uint32_t) strtoul(
next, (
char**) out, 16 );
442 char* line = reader.
Line();
451 if( !strncasecmp( line,
"$MODULE", strlen(
"$MODULE" ) ) )
468 const std::map<std::string, UTF8>* aProperties,
PROJECT* aProject )
472 std::unique_ptr<BOARD> boardDeleter;
480 boardDeleter = std::make_unique<BOARD>();
537 std::unique_ptr<FOOTPRINT> footprint = std::make_unique<FOOTPRINT>(
m_board );
540 std::string fpName =
StrPurge( line +
SZ(
"$MODULE" ) );
546 if( !fpName.empty() )
547 fpid.
Parse( fpName,
true );
549 footprint->SetFPID( fpid );
552 m_board->
Add( footprint.release(), ADD_MODE::APPEND );
554 else if(
TESTLINE(
"$DRAWSEGMENT" ) )
574 else if(
TESTLINE(
"$CZONE_OUTLINE" ) )
595 else if(
TESTLINE(
"$SHEETDESCR" ) )
632 char* line = aReader->
Line();
640 sscanf( line,
"PCBNEW-BOARD Version %d", &ver );
648 if( ver > LEGACY_BOARD_FILE_VERSION )
650 THROW_IO_ERROR( wxString::Format(
_(
"File '%s' has an unrecognized version: %d." ),
663 bool saw_LayerCount =
false;
672 data = strtok_r( line +
SZ(
"Units"),
delims, &saveptr );
674 if( !strcmp( data,
"mm" ) )
681 int tmp =
intParse( line +
SZ(
"LayerCount" ) );
689 saw_LayerCount =
true;
691 else if(
TESTLINE(
"EnabledLayers" ) )
693 if( !saw_LayerCount )
708 else if(
TESTLINE(
"VisibleLayers" ) )
714 if( !saw_LayerCount )
726 if( !saw_LayerCount )
733 saw_LayerCount =
true;
736 else if(
TESTLINE(
"BoardThickness" ) )
761 else if(
TESTLINE(
"$EndGENERAL" ) )
785 char* sname = strtok_r( line +
SZ(
"Sheet" ),
delims, &data );
793 m_error.Printf(
_(
"Unknown sheet type '%s' on line: %d." ),
799 char* width = strtok_r(
nullptr,
delims, &data );
800 char* height = strtok_r(
nullptr,
delims, &data );
801 char* orient = strtok_r(
nullptr,
delims, &data );
806 if( width && height )
818 if( orient && !strcmp( orient,
"portrait" ) )
891 else if(
TESTLINE(
"$EndSHEETDESCR" ) )
906 std::shared_ptr<NETCLASS> defaultNetclass = bds.
m_NetSettings->GetDefaultNetclass();
923 plot_opts.
Parse( &parser );
935 else if(
TESTLINE(
"AuxiliaryAxisOrg" ) )
946 int layer_num =
intParse( line +
SZ(
"Layer[" ), &data );
949 data = strtok_r( (
char*) data+1,
delims, &saveptr );
956 data = strtok_r(
nullptr,
delims, &saveptr );
968 defaultNetclass->SetTrackWidth( tmp );
970 else if(
TESTLINE(
"TrackWidthList" ) )
975 else if(
TESTLINE(
"TrackClearence" ) )
978 defaultNetclass->SetClearance( tmp );
980 else if(
TESTLINE(
"TrackMinWidth" ) )
985 else if(
TESTLINE(
"ZoneClearence" ) )
990 else if(
TESTLINE(
"Zone_45_Only" ) )
994 else if(
TESTLINE(
"DrawSegmWidth" ) )
999 else if(
TESTLINE(
"EdgeSegmWidth" ) )
1004 else if(
TESTLINE(
"ViaMinSize" ) )
1009 else if(
TESTLINE(
"MicroViaMinSize" ) )
1014 else if(
TESTLINE(
"ViaSizeList" ) )
1019 BIU diameter =
biuParse( line +
SZ(
"ViaSizeList" ), &data );
1021 data = strtok_r( (
char*) data,
delims, (
char**) &data );
1030 defaultNetclass->SetViaDiameter( tmp );
1035 defaultNetclass->SetViaDrill( tmp );
1037 else if(
TESTLINE(
"ViaMinDrill" ) )
1042 else if(
TESTLINE(
"MicroViaSize" ) )
1045 defaultNetclass->SetuViaDiameter( tmp );
1047 else if(
TESTLINE(
"MicroViaDrill" ) )
1050 defaultNetclass->SetuViaDrill( tmp );
1052 else if(
TESTLINE(
"MicroViaMinDrill" ) )
1057 else if(
TESTLINE(
"MicroViasAllowed" ) )
1061 else if(
TESTLINE(
"TextPcbWidth" ) )
1066 else if(
TESTLINE(
"TextPcbSize" ) )
1073 else if(
TESTLINE(
"EdgeModWidth" ) )
1079 else if(
TESTLINE(
"TextModWidth" ) )
1085 else if(
TESTLINE(
"TextModSize" ) )
1105 else if(
TESTLINE(
"Pad2MaskClearance" ) )
1110 else if(
TESTLINE(
"SolderMaskMinWidth" ) )
1115 else if(
TESTLINE(
"Pad2PasteClearance" ) )
1120 else if(
TESTLINE(
"Pad2PasteClearanceRatio" ) )
1122 double ratio = atof( line +
SZ(
"Pad2PasteClearanceRatio" ) );
1126 else if(
TESTLINE(
"GridOrigin" ) )
1133 else if(
TESTLINE(
"VisibleElements" ) )
1139 uint32_t visibleElements =
hexParse( line +
SZ(
"VisibleElements" ) );
1145 for(
size_t i = 0; i < visibles.size(); i++ )
1146 visibles.
set( i, visibleElements & ( 1u << i ) );
1185 for(
int ii = 1; ii < (int) designSettings.
m_TrackWidthList.size() - 1; ii++ )
1206 if(
TESTSUBSTR(
"D" ) && strchr(
"SCAP", line[1] ) )
1252 int orient =
intParse( data, &data );
1253 int layer_num =
intParse( data, &data );
1256 [[maybe_unused]] uint32_t edittime =
hexParse( data, &data );
1258 char* uuid = strtok_r( (
char*) data,
delims, (
char**) &data );
1260 data = strtok_r( (
char*) data+1,
delims, (
char**) &data );
1264 if( data && data[0] ==
'F' )
1267 if( data && data[1] ==
'P' )
1277 char* uuid = strtok_r( (
char*) line +
SZ(
"Sc" ),
delims, (
char**) &data );
1289 data = line +
SZ(
"At" );
1291 if( strstr( data,
"SMD" ) )
1293 else if( strstr( data,
"VIRTUAL" ) )
1303 data = strtok_r( line +
SZ(
"AR" ),
delims, (
char**) &data );
1321 else if(
TESTLINE(
".SolderPasteRatio" ) )
1323 double tmp = atof( line +
SZ(
".SolderPasteRatio" ) );
1337 else if(
TESTLINE(
".SolderPaste" ) )
1342 else if(
TESTLINE(
".SolderMask" ) )
1347 else if(
TESTLINE(
".LocalClearance" ) )
1352 else if(
TESTLINE(
".ZoneConnection" ) )
1354 int tmp =
intParse( line +
SZ(
".ZoneConnection" ) );
1357 else if(
TESTLINE(
".ThermalWidth" ) )
1362 else if(
TESTLINE(
".ThermalGap" ) )
1367 else if(
TESTLINE(
"$EndMODULE" ) )
1373 wxString msg = wxString::Format(
_(
"Missing '$EndMODULE' for MODULE '%s'." ),
1381 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
1397 char mypadnumber[50];
1399 data = line +
SZ(
"Sh" ) + 1;
1402 data = data +
ReadDelimitedText( mypadnumber, data,
sizeof( mypadnumber ) ) + 1;
1407 unsigned char padchar = (
unsigned char) *data++;
1418 case 'C': padshape =
static_cast<int>( PAD_SHAPE::CIRCLE );
break;
1419 case 'R': padshape =
static_cast<int>( PAD_SHAPE::RECTANGLE );
break;
1420 case 'O': padshape =
static_cast<int>( PAD_SHAPE::OVAL );
break;
1421 case 'T': padshape =
static_cast<int>( PAD_SHAPE::TRAPEZOID );
break;
1423 m_error.Printf(
_(
"Unknown padshape '%c=0x%02x' on line: %d of footprint: '%s'." ),
1438 const unsigned char* cp = (
unsigned char*) mypadnumber;
1451 pad->SetNumber( padNumber );
1455 pad->SetOrientation( orient );
1461 BIU drill_y = drill_x;
1467 data = strtok_r( (
char*) data,
delims, &saveptr );
1471 if( data[0] ==
'O' )
1473 drShape = PAD_DRILL_SHAPE::OBLONG;
1475 data = strtok_r(
nullptr,
delims, &saveptr );
1478 data = strtok_r(
nullptr,
delims, &saveptr );
1483 pad->SetDrillShape( drShape );
1485 pad->SetDrillSize(
VECTOR2I( drill_x, drill_y ) );
1494 data = strtok_r( line +
SZ(
"At" ),
delims, &saveptr );
1496 if( !strcmp( data,
"SMD" ) )
1497 attribute = PAD_ATTRIB::SMD;
1498 else if( !strcmp( data,
"CONN" ) )
1499 attribute = PAD_ATTRIB::CONN;
1500 else if( !strcmp( data,
"HOLE" ) )
1501 attribute = PAD_ATTRIB::NPTH;
1503 attribute = PAD_ATTRIB::PTH;
1505 strtok_r(
nullptr,
delims, &saveptr );
1506 data = strtok_r(
nullptr,
delims, &saveptr );
1511 pad->SetAttribute( attribute );
1518 int netcode =
intParse( line +
SZ(
"Ne" ), &data );
1540 pad->SetFPRelativePosition( pos );
1545 pad->SetPadToDieLength( tmp );
1547 else if(
TESTLINE(
".SolderMask" ) )
1550 pad->SetLocalSolderMaskMargin( tmp );
1552 else if(
TESTLINE(
".SolderPasteRatio" ) )
1554 double tmp = atof( line +
SZ(
".SolderPasteRatio" ) );
1555 pad->SetLocalSolderPasteMarginRatio( tmp );
1557 else if(
TESTLINE(
".SolderPaste" ) )
1560 pad->SetLocalSolderPasteMargin( tmp );
1562 else if(
TESTLINE(
".LocalClearance" ) )
1565 pad->SetLocalClearance( tmp );
1567 else if(
TESTLINE(
".ZoneConnection" ) )
1569 int tmp =
intParse( line +
SZ(
".ZoneConnection" ) );
1572 else if(
TESTLINE(
".ThermalWidth" ) )
1575 pad->SetLocalThermalSpokeWidthOverride( tmp );
1577 else if(
TESTLINE(
".ThermalGap" ) )
1580 pad->SetLocalThermalGapOverride( tmp );
1584 if(
pad->GetSizeX() > 0 &&
pad->GetSizeY() > 0 )
1586 aFootprint->
Add(
pad.release() );
1590 wxLogError(
_(
"Invalid zero-sized pad ignored in\nfile: %s" ),
1609 case 'S': shape = SHAPE_T::SEGMENT;
break;
1610 case 'C': shape = SHAPE_T::CIRCLE;
break;
1611 case 'A': shape = SHAPE_T::ARC;
break;
1612 case 'P': shape = SHAPE_T::POLY;
break;
1614 m_error.Printf(
_(
"Unknown PCB_SHAPE type:'%c=0x%02x' on line %d of footprint '%s'." ),
1615 (
unsigned char) line[1],
1616 (
unsigned char) line[1],
1622 std::unique_ptr<PCB_SHAPE> dwg = std::make_unique<PCB_SHAPE>( aFootprint, shape );
1643 dwg->SetCenter(
VECTOR2I( center0_x, center0_y ) );
1644 dwg->SetStart(
VECTOR2I( start0_x, start0_y ) );
1645 dwg->SetArcAngleAndEnd( angle,
true );
1649 case SHAPE_T::SEGMENT:
1650 case SHAPE_T::CIRCLE:
1661 dwg->SetStart(
VECTOR2I( start0_x, start0_y ) );
1662 dwg->SetEnd(
VECTOR2I( end0_x, end0_y ) );
1673 int ptCount =
intParse( data, &data );
1678 dwg->SetStart(
VECTOR2I( start0_x, start0_y ) );
1679 dwg->SetEnd(
VECTOR2I( end0_x, end0_y ) );
1681 std::vector<VECTOR2I> pts;
1682 pts.reserve( ptCount );
1684 for(
int ii = 0; ii < ptCount; ++ii )
1701 pts.emplace_back( x, y );
1704 dwg->SetPolyPoints( pts );
1719 dwg->SetStroke(
STROKE_PARAMS( width, LINE_STYLE::SOLID ) );
1724 aFootprint->
Add( dwg.release() );
1731 const char* txt_end;
1739 int type =
intParse( line+1, &data );
1754 m_field.Replace( wxT(
"%V" ), wxT(
"${VALUE}" ) );
1755 m_field.Replace( wxT(
"%R" ), wxT(
"${REFERENCE}" ) );
1762 char* mirror = strtok_r( (
char*) data,
delims, (
char**) &data );
1763 char* hide = strtok_r(
nullptr,
delims, (
char**) &data );
1764 char* tmp = strtok_r(
nullptr,
delims, (
char**) &data );
1768 char* italic = strtok_r(
nullptr,
delims, (
char**) &data );
1770 char* hjust = strtok_r( (
char*) txt_end,
delims, (
char**) &data );
1771 char* vjust = strtok_r(
nullptr,
delims, (
char**) &data );
1785 aText->
SetVisible( !(hide && *hide ==
'I') );
1787 aText->
SetItalic( italic && *italic ==
'I' );
1816 auto parseThreeDoubles = [](
const char* str,
double& x,
double& y,
double& z ) ->
bool
1818 wxString wxStr( str );
1819 wxStr.Trim(
false ).Trim(
true );
1821 wxStringTokenizer tokenizer( wxStr, wxT(
" \t" ), wxTOKEN_STRTOK );
1823 if( !tokenizer.HasMoreTokens() )
1826 wxString token1 = tokenizer.GetNextToken();
1828 if( !token1.ToCDouble( &x ) || !tokenizer.HasMoreTokens() )
1831 wxString token2 = tokenizer.GetNextToken();
1833 if( !token2.ToCDouble( &y ) || !tokenizer.HasMoreTokens() )
1836 wxString token3 = tokenizer.GetNextToken();
1838 if( !token3.ToCDouble( &z ) )
1875 else if(
TESTLINE(
"$EndSHAPE3D" ) )
1877 aFootprint->
Models().push_back( t3D );
1895 std::unique_ptr<PCB_SHAPE> dseg = std::make_unique<PCB_SHAPE>(
m_board );
1906 int shape =
intParse( line +
SZ(
"Po" ), &data );
1916 dseg->SetShape(
static_cast<SHAPE_T>( shape ) );
1917 dseg->SetFilled(
false );
1918 dseg->SetStroke(
STROKE_PARAMS( width, LINE_STYLE::SOLID ) );
1920 if( dseg->GetShape() == SHAPE_T::ARC )
1922 dseg->SetCenter(
VECTOR2I( start_x, start_y ) );
1923 dseg->SetStart(
VECTOR2I( end_x, end_y ) );
1927 dseg->SetStart(
VECTOR2I( start_x, start_y ) );
1928 dseg->SetEnd(
VECTOR2I( end_x, end_y ) );
1936 data = strtok_r( line +
SZ(
"De" ),
delims, &saveptr );
1938 for(
int i = 0; data; ++i, data = strtok_r(
nullptr,
delims, &saveptr ) )
1961 if( dseg->GetShape() == SHAPE_T::ARC )
1962 dseg->SetArcAngleAndEnd( angle );
1967 const_cast<KIID&
>( dseg->m_Uuid ) =
KIID( data );
1981 dseg->SetBezierC1(
VECTOR2I( x, y ) );
1988 dseg->SetBezierC2(
VECTOR2I( x, y ) );
1996 else if(
TESTLINE(
"$EndDRAWSEGMENT" ) )
1998 m_board->
Add( dseg.release(), ADD_MODE::APPEND );
2029 netCode =
intParse( line +
SZ(
"Na" ), &data );
2033 if( net ==
nullptr )
2040 THROW_IO_ERROR( wxT(
"Two net definitions in '$EQUIPOT' block" ) );
2043 else if(
TESTLINE(
"$EndEQUIPOT" ) )
2139 int layer_num =
intParse( line +
SZ(
"De" ), &data );
2140 int notMirrored =
intParse( data, &data );
2141 char* uuid = strtok_r( (
char*) data,
delims, (
char**) &data );
2142 char* style = strtok_r(
nullptr,
delims, (
char**) &data );
2143 char* hJustify = strtok_r(
nullptr,
delims, (
char**) &data );
2144 char* vJustify = strtok_r(
nullptr,
delims, (
char**) &data );
2148 pcbtxt->
SetItalic( !strcmp( style,
"Italic" ) );
2174 else if(
TESTLINE(
"$EndTEXTPCB" ) )
2198 if( line[0] ==
'$' )
2211 data = strtok_r( (
char*) data,
delims, (
char**) &data );
2241 int layer_num =
intParse( line +
SZ(
"De" ), &data );
2242 int type =
intParse( data, &data );
2243 int net_code =
intParse( data, &data );
2244 char* uuid = strtok_r( (
char*) data,
delims, (
char**) &data );
2247 intParse( data, (
const char**) &data );
2259 wxFAIL_MSG( wxT(
"Segment type unknown" ) );
2279 via->SetViaType( viatype );
2283 via->SetDrillDefault();
2285 via->SetDrill( drill );
2287 if(
via->GetViaType() == VIATYPE::THROUGH )
2299 via->SetLayerPair( front, back );
2348 std::shared_ptr<NETCLASS> nc = std::make_shared<NETCLASS>( wxEmptyString );
2359 netname, nc->GetName() );
2364 nc->SetClearance( tmp );
2366 else if(
TESTLINE(
"TrackWidth" ) )
2369 nc->SetTrackWidth( tmp );
2374 nc->SetViaDiameter( tmp );
2379 nc->SetViaDrill( tmp );
2384 nc->SetuViaDiameter( tmp );
2389 nc->SetuViaDrill( tmp );
2401 else if(
TESTLINE(
"$EndNCLASS" ) )
2410 m_error.Printf(
_(
"Duplicate NETCLASS name '%s'." ), nc->GetName() );
2428 std::unique_ptr<ZONE> zc = std::make_unique<ZONE>(
m_board );
2431 bool endContour =
false;
2455 zc->AppendCorner(
VECTOR2I( x, y ), holeIndex );
2465 char* uuid = strtok_r( (
char*) line +
SZ(
"ZInfo" ),
delims, (
char**) &data );
2466 int netcode =
intParse( data, &data );
2471 const_cast<KIID&
>( zc->m_Uuid ) =
KIID( uuid );
2476 zc->BOARD_CONNECTED_ITEM::SetNetCode(
getNetCode( netcode ) );
2480 int layer_num =
intParse( line +
SZ(
"ZLayer" ) );
2487 char* hopt = strtok_r( (
char*) data,
delims, (
char**) &data );
2491 m_error.Printf(
_(
"Bad ZAux for CZONE_CONTAINER '%s'" ),
2492 zc->GetNetname().GetData() );
2498 case 'N': outline_hatch = ZONE_BORDER_DISPLAY_STYLE::NO_HATCH;
break;
2499 case 'E': outline_hatch = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE;
break;
2500 case 'F': outline_hatch = ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL;
break;
2502 m_error.Printf(
_(
"Bad ZAux for CZONE_CONTAINER '%s'" ),
2503 zc->GetNetname().GetData() );
2509 else if(
TESTLINE(
"ZSmoothing" ) )
2512 int smoothing =
intParse( line +
SZ(
"ZSmoothing" ), &data );
2517 m_error.Printf(
_(
"Bad ZSmoothing for CZONE_CONTAINER '%s'" ),
2518 zc->GetNetname().GetData() );
2522 zc->SetCornerSmoothingType( smoothing );
2523 zc->SetCornerRadius( cornerRadius );
2528 zc->SetIsRuleArea(
true );
2529 zc->SetDoNotAllowPads(
false );
2530 zc->SetDoNotAllowFootprints(
false );
2533 token = strtok_r( line +
SZ(
"ZKeepout" ),
delims, (
char**) &data );
2537 if( !strcmp( token,
"tracks" ) )
2539 token = strtok_r(
nullptr,
delims, (
char**) &data );
2540 zc->SetDoNotAllowTracks( token && *token ==
'N' );
2542 else if( !strcmp( token,
"vias" ) )
2544 token = strtok_r(
nullptr,
delims, (
char**) &data );
2545 zc->SetDoNotAllowVias( token && *token ==
'N' );
2547 else if( !strcmp( token,
"copperpour" ) )
2549 token = strtok_r(
nullptr,
delims, (
char**) &data );
2550 zc->SetDoNotAllowZoneFills( token && *token ==
'N' );
2553 token = strtok_r(
nullptr,
delims, (
char**) &data );
2559 int fillmode =
intParse( line +
SZ(
"ZOptions" ), &data );
2561 char fillstate = data[1];
2562 BIU thermalReliefGap =
biuParse( data += 2 , &data );
2569 wxLogWarning(
_(
"The legacy segment zone fill mode is no longer supported.\n"
2570 "Zone fills will be converted on a best-effort basis." ) );
2576 zc->SetFillMode( ZONE_FILL_MODE::POLYGONS );
2577 zc->SetIsFilled( fillstate ==
'S' );
2578 zc->SetThermalReliefGap( thermalReliefGap );
2579 zc->SetThermalReliefSpokeWidth( thermalReliefCopperBridge );
2581 else if(
TESTLINE(
"ZClearance" ) )
2585 char* padoption = strtok_r( (
char*) data,
delims, (
char**) &data );
2588 switch( *padoption )
2590 case 'I': popt = ZONE_CONNECTION::FULL;
break;
2591 case 'T': popt = ZONE_CONNECTION::THERMAL;
break;
2592 case 'H': popt = ZONE_CONNECTION::THT_THERMAL;
break;
2593 case 'X': popt = ZONE_CONNECTION::NONE;
break;
2595 m_error.Printf(
_(
"Bad ZClearance padoption for CZONE_CONTAINER '%s'" ),
2596 zc->GetNetname().GetData() );
2601 zc->SetPadConnection( popt );
2603 else if(
TESTLINE(
"ZMinThickness" ) )
2606 zc->SetMinThickness( thickness );
2610 int priority =
intParse( line +
SZ(
"ZPriority" ) );
2611 zc->SetAssignedPriority( priority );
2613 else if(
TESTLINE(
"$POLYSCORNERS" ) )
2618 bool makeNewOutline =
true;
2622 if(
TESTLINE(
"$endPOLYSCORNERS" ) )
2629 if( makeNewOutline )
2632 polysList.
Append( x, y );
2635 bool end_contour =
intParse( data, &data );
2638 makeNewOutline = end_contour;
2641 zc->SetFilledPolysList( zc->GetFirstLayer(), polysList );
2643 else if(
TESTLINE(
"$FILLSEGMENTS" ) )
2647 if(
TESTLINE(
"$endFILLSEGMENTS" ) )
2657 else if(
TESTLINE(
"$endCZONE_OUTLINE" ) )
2661 if( zc->GetIsRuleArea() )
2664 if( zc->GetMinThickness() > 0 )
2671 CORNER_STRATEGY::ROUND_ALL_CORNERS,
2674 zc->SetFilledPolysList( layer, inflatedFill );
2680 if( zc->GetNumCorners() > 2 )
2682 if( !zc->IsOnCopperLayer() )
2684 zc->SetFillMode( ZONE_FILL_MODE::POLYGONS );
2705 std::unique_ptr<PCB_DIM_ALIGNED> dim = std::make_unique<PCB_DIM_ALIGNED>(
m_board,
2718 dim->UpdateHeight( crossBarF, crossBarO );
2720 m_board->
Add( dim.release(), ADD_MODE::APPEND );
2733 int shape =
intParse( line +
SZ(
"De" ), (
const char**) &data );
2734 int layer_num =
intParse( data, &data );
2735 char* uuid = strtok_r( (
char*) data,
delims, (
char**) &data );
2738 const_cast<KIID&
>( dim->m_Uuid ) =
KIID( uuid );
2748 dim->SetOverrideText(
From_UTF8( buf ) );
2749 dim->SetOverrideTextEnabled(
true );
2750 dim->SetUnitsFormat( DIM_UNITS_FORMAT::NO_SUFFIX );
2751 dim->SetAutoUnits();
2761 char* mirror = strtok_r( (
char*) data,
delims, (
char**) &data );
2763 dim->SetTextPos(
VECTOR2I( pos_x, pos_y ) );
2764 dim->SetTextSize(
VECTOR2I( width, height ) );
2765 dim->SetMirrored( mirror && *mirror ==
'0' );
2766 dim->SetTextThickness( thickn );
2767 dim->SetTextAngle( orient );
2778 dim->SetLineThickness( width );
2779 crossBarO =
VECTOR2I( crossBarOx, crossBarOy );
2780 crossBarF =
VECTOR2I( crossBarFx, crossBarFy );
2791 dim->SetStart(
VECTOR2I( featureLineDOx, featureLineDOy ) );
2802 dim->SetEnd(
VECTOR2I( featureLineGOx, featureLineGOy ) );
2856 int shape =
intParse( line +
SZ(
"Po" ), &data );
2857 int layer_num =
intParse( data, &data );
2862 char* uuid = strtok_r( (
char*) data,
delims, (
char**) &data );
2870 VECTOR2I( pos_x, pos_y ), size, width );
2887 double fval = strtod( aValue, &nptr );
2891 m_error.Printf(
_(
"Invalid floating point number in file: '%s'\nline: %d, offset: %d" ),
2899 if( aValue == nptr )
2901 m_error.Printf(
_(
"Missing floating point number in file: '%s'\nline: %d, offset: %d" ),
2926 double fval = strtod( aValue, &nptr );
2930 m_error.Printf(
_(
"Invalid floating point number in file: '%s'\nline: %d, offset: %d" ),
2938 if( aValue == nptr )
2940 m_error.Printf(
_(
"Missing floating point number in file: '%s'\nline: %d, offset: %d" ),
3018 static long long GetTimestamp(
const wxString& aLibPath );
3034 m_lib_path( aLibraryPath ),
3036 m_cache_dirty( true ),
3037 m_cache_timestamp( 0 )
3052 wxFileName fn( aLibPath );
3054 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
3055 return fn.GetModificationTime().GetValue().GetValue();
3086 if( !
TESTLINE(
"PCBNEW-LibModule-V1" ) )
3089 while( ( line = aReader->
ReadLine() ) !=
nullptr )
3093 const char* units = strtok_r( line +
SZ(
"Units" ),
delims, &data );
3095 if( !strcmp( units,
"mm" ) )
3113 char* line = aReader->
Line();
3121 while( ( line = aReader->
ReadLine() ) !=
nullptr )
3134 }
while( ( line = aReader->
ReadLine() ) !=
nullptr );
3142 char* line = aReader->
Line();
3149 std::unique_ptr<FOOTPRINT> fp_ptr = std::make_unique<FOOTPRINT>(
m_owner->
m_board );
3151 std::string footprintName =
StrPurge( line +
SZ(
"$MODULE" ) );
3158 fp_ptr->SetFPID(
LIB_ID( wxEmptyString, footprintName ) );
3180 FOOTPRINT_MAP::const_iterator it =
m_footprints.find( footprintName );
3186 wxFAIL_MSG( wxT(
"error doing cache insert using guaranteed unique name" ) );
3193 bool nameOK =
false;
3199 std::string newName = footprintName;
3202 snprintf( buf,
sizeof(buf),
"%d", version++ );
3215 wxFAIL_MSG( wxT(
"error doing cache insert using guaranteed unique "
3223 }
while( ( line = aReader->
ReadLine() ) !=
nullptr );
3246 bool aBestEfforts,
const std::map<std::string, UTF8>* aProperties )
3250 init( aProperties );
3258 errorMsg = ioe.
What();
3265 aFootprintNames.Add(
From_UTF8( footprint.first.c_str() ) );
3267 if( !errorMsg.IsEmpty() && !aBestEfforts )
3273 const wxString& aFootprintName,
bool aKeepUUID,
3274 const std::map<std::string, UTF8>* aProperties )
3276 init( aProperties );
3281 FOOTPRINT_MAP::const_iterator it = footprints.find(
TO_UTF8( aFootprintName ) );
3283 if( it == footprints.end() )
3288 copy->SetParent(
nullptr );
3294 const std::map<std::string, UTF8>* aProperties )
3296 wxFileName fn = aLibraryPath;
3298 if( !fn.FileExists() )
3303 if( wxRemove( aLibraryPath ) )
3305 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' cannot be deleted." ),
3306 aLibraryPath.GetData() ) );
3331 m_progressReporter( nullptr ),
3332 m_lastProgressLine( 0 ),
3334 m_reader( nullptr ),
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
LAYER_T
The allowed types of layers, same as Specctra DSN spec.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
BASE_SET & set(size_t pos)
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
Container for design settings for a BOARD object.
std::shared_ptr< NET_SETTINGS > m_NetSettings
void SetGridOrigin(const VECTOR2I &aOrigin)
std::unique_ptr< PAD > m_Pad_Master
void SetAuxOrigin(const VECTOR2I &aOrigin)
int m_SolderMaskExpansion
void SetDefaultZoneSettings(const ZONE_SETTINGS &aSettings)
int m_TextThickness[LAYER_CLASS_COUNT]
std::vector< int > m_TrackWidthList
int m_LineThickness[LAYER_CLASS_COUNT]
void SetBoardThickness(int aThickness)
double m_SolderPasteMarginRatio
ZONE_SETTINGS & GetDefaultZoneSettings()
VECTOR2I m_TextSize[LAYER_CLASS_COUNT]
std::vector< VIA_DIMENSION > m_ViasDimensionsList
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
void SetFPRelativePosition(const VECTOR2I &aPos)
Information pertinent to a Pcbnew printed circuit board.
void SetPlotOptions(const PCB_PLOT_PARAMS &aOptions)
bool m_LegacyDesignSettingsLoaded
True if the legacy board design settings were loaded from a file.
void SetVisibleLayers(const LSET &aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings changes the bit-mask of vis...
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
void SetFileName(const wxString &aFileName)
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
bool SetLayerName(PCB_LAYER_ID aLayer, const wxString &aLayerName)
Changes the name of the layer given by aLayer.
void SetPageSettings(const PAGE_INFO &aPageSettings)
bool m_LegacyNetclassesLoaded
True if netclasses were loaded from the file.
void SetCopperLayerCount(int aCount)
bool SetLayerType(PCB_LAYER_ID aLayer, LAYER_T aLayerType)
Change the type of the layer given by aLayer.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
void SetEnabledLayers(const LSET &aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings.
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
void SetVisibleElements(const GAL_SET &aMask)
A proxy function that calls the correspondent function in m_BoardSettings.
void SetFileFormatVersionAtLoad(int aVersion)
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual const wxString & GetText() const
Return the string associated with the text object.
void SetTextPos(const VECTOR2I &aPoint)
void SetMirrored(bool isMirrored)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetItalic(bool aItalic)
Set the text to be italic - this will also update the font if needed.
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
A LINE_READER that reads from an open file.
void Rewind()
Rewind the file and resets the line number back to zero.
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
VECTOR3D m_Offset
3D model offset (mm)
VECTOR3D m_Rotation
3D model rotation (degrees)
VECTOR3D m_Scale
3D model scaling factor (dimensionless)
wxString m_Filename
The 3D shape filename in 3D library.
Helper for storing and iterating over GAL_LAYER_IDs.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
A logical library item identifier and consists of various portions much like a URI.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
const UTF8 & GetLibItemName() const
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
virtual char * ReadLine()=0
Read a line of text into the buffer and increments the line number counter.
virtual const wxString & GetSource() const
Returns the name of the source of the lines in an abstract sense.
virtual unsigned LineNumber() const
Return the line number of the last line read from this LINE_READER.
char * Line() const
Return a pointer to the last line that was read in.
LSET is a set of PCB_LAYER_IDs.
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
Handle the data for a net.
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
Describe the page size and margins of a paper page on which to eventually print or plot.
void SetPortrait(bool aIsPortrait)
Rotate the paper page 90 degrees.
static const wxChar Custom[]
"User" defined page type
void SetHeightMils(double aHeightInMils)
void SetWidthMils(double aWidthInMils)
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
A #PLUGIN derivation which could possibly be put into a DLL/DSO.
wxString m_error
for throwing exceptions
EDA_ANGLE degParse(const char *aValue, const char **nptrptr=nullptr)
Parse an ASCII decimal floating point value which is certainly an angle in tenths of a degree.
void init(const std::map< std::string, UTF8 > *aProperties)
initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
void loadMODULE_TEXT(PCB_TEXT *aText)
bool CanReadFootprint(const wxString &aFileName) const override
Checks if this PCB_IO can read a footprint from specified file or directory.
PROGRESS_REPORTER * m_progressReporter
may be NULL, no ownership
void loadFP_SHAPE(FOOTPRINT *aFootprint)
std::vector< int > m_netCodes
net codes mapping for boards being loaded
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
void loadAllSections(bool doAppend)
bool m_showLegacySegmentZoneWarning
unsigned m_lineCount
for progress reporting
void cacheLib(const wxString &aLibraryPath)
we only cache one footprint library for now, this determines which one.
void loadPAD(FOOTPRINT *aFootprint)
double biuToDisk
convert from BIUs to disk engineering units with this scale factor
static LSET leg_mask2new(int cu_count, unsigned aMask)
void loadTrackList(int aStructType)
Read a list of segments (Tracks and Vias, or Segzones)
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Return a list of footprint names contained within the library at aLibraryPath.
unsigned m_lastProgressLine
LINE_READER * m_reader
no ownership here.
bool DeleteLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Delete an existing library and returns true, or if library does not exist returns false,...
void SetReader(LINE_READER *aReader)
double diskToBiu
convert from disk engineering units to BIUs
BOARD * LoadBoard(const wxString &aFileName, BOARD *aAppendToMe, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr) override
Load information from some input file format that this PCB_IO implementation knows about into either ...
BIU biuParse(const char *aValue, const char **nptrptr=nullptr)
Parse an ASCII decimal floating point value and scales it into a BIU according to the current value o...
void loadZONE_CONTAINER()
wxString m_field
reused to stuff FOOTPRINT fields.
void checkpoint()
Converts net code using the mapping table if available, otherwise returns unchanged net code.
void loadFOOTPRINT(FOOTPRINT *aFootprint)
static int getVersion(LINE_READER *aReader)
void load3D(FOOTPRINT *aFootprint)
bool CanReadBoard(const wxString &aFileName) const override
Checks if this PCB_IO can read the specified board file.
int getNetCode(int aNetCode)
bool IsLibraryWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
int m_loading_format_version
which BOARD_FORMAT_VERSION am I Load()ing?
static PCB_LAYER_ID leg_layer2new(int cu_count, int aLayerNum)
FOOTPRINT * FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, bool aKeepUUID=false, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a footprint having aFootprintName from the aLibraryPath containing a library format that this PC...
A base class that BOARD loading and saving plugins should derive from.
BOARD * m_board
The board BOARD being worked on, no ownership here.
virtual bool CanReadFootprint(const wxString &aFileName) const
Checks if this PCB_IO can read a footprint from specified file or directory.
virtual bool CanReadBoard(const wxString &aFileName) const
Checks if this PCB_IO can read the specified board file.
const std::map< std::string, UTF8 > * m_props
Properties passed via Save() or Load(), no ownership, may be NULL.
The parser for PCB_PLOT_PARAMS.
Parameters and options when plotting/printing a board.
std::optional< bool > GetLegacyPlotViaOnMaskLayer() const
void Parse(PCB_PLOT_PARAMS_PARSER *aParser)
void SetEnd(const VECTOR2I &aEnd)
void SetPosition(const VECTOR2I &aPos) override
virtual void SetWidth(int aWidth)
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.
virtual void SetCurrentProgress(double aProgress)=0
Set the progress value to aProgress (0..1).
Container for project specific data.
Represent a set of closed polygons.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void InflateWithLinkedHoles(int aFactor, CORNER_STRATEGY aCornerStrategy, int aMaxError)
Perform outline inflation/deflation, using round corners.
Simple container to manage line stroke parameters.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
void SetRevision(const wxString &aRevision)
void SetComment(int aIdx, const wxString &aComment)
void SetTitle(const wxString &aTitle)
void SetCompany(const wxString &aCompany)
void SetDate(const wxString &aDate)
Set the date field, and defaults to the current time and date.
Read lines of text from another LINE_READER but only returns non-comment lines and non-blank lines wi...
char * ReadLine() override
Read a line of text into the buffer and increments the line number counter.
ZONE_SETTINGS handles zones parameters.
static int GetDefaultHatchPitch()
This file is part of the common library.
static bool isSpace(char cc)
Test for whitespace.
#define IGNORE_PARENT_GROUP
void ignore_unused(const T &)
#define THROW_IO_ERROR(msg)
PCB_LAYER_ID BoardLayerFromLegacyId(int aLegacyId)
Retrieve a layer ID from an integer converted from a legacy (pre-V9) enum value.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
PAD_DRILL_SHAPE
The set of pad drill shapes, used with PAD::{Set,Get}DrillShape()
PAD_ATTRIB
The set of pad shapes, used with PAD::{Set,Get}Attribute().
PAD_SHAPE
The set of pad shapes, used with PAD::{Set,Get}Shape()
std::map< wxString, FOOTPRINT * > FOOTPRINT_MAP
static GR_TEXT_V_ALIGN_T vertJustify(const char *vertical)
static int intParse(const char *next, const char **out=nullptr)
Parse an ASCII integer string with possible leading whitespace into an integer and updates the pointe...
#define SILKSCREEN_N_BACK
#define PCB_LEGACY_TEXT_is_DIVERS
#define SZ(x)
Get the length of a string constant, at compile time.
static const char delims[]
#define TESTSUBSTR(x)
C sub-string compare test for a specific length of characters.
#define LAST_NON_COPPER_LAYER
PCB_IO_KICAD_LEGACY::BIU BIU
#define SOLDERMASK_N_FRONT
#define SOLDERMASK_N_BACK
bool is_leg_copperlayer_valid(int aCu_Count, int aLegacyLayerNum)
#define SOLDERPASTE_N_BACK
int layerMaskCountSet(LEG_MASK aMask)
Count the number of set layers in the mask.
static uint32_t hexParse(const char *next, const char **out=nullptr)
Parse an ASCII hex integer string with possible leading whitespace into a long integer and updates th...
#define SOLDERPASTE_N_FRONT
#define PCB_LEGACY_TEXT_is_REFERENCE
static GR_TEXT_H_ALIGN_T horizJustify(const char *horizontal)
#define SILKSCREEN_N_FRONT
#define TESTLINE(x)
C string compare test for a specific length of characters.
boost::ptr_map< std::string, FOOTPRINT > FOOTPRINT_MAP
#define FIRST_NON_COPPER_LAYER
#define PCB_LEGACY_TEXT_is_VALUE
static bool isSpace(int c)
#define FIRST_COPPER_LAYER
#define FOOTPRINT_LIBRARY_HEADER_CNT
#define FOOTPRINT_LIBRARY_HEADER
wxString ConvertToNewOverbarNotation(const wxString &aOldStr)
Convert the old ~...~ overbar notation to the new ~{...} one.
wxString From_UTF8(const char *cstring)
int ReadDelimitedText(wxString *aDest, const char *aSource)
Copy bytes from aSource delimited string segment to aDest wxString.
bool ReplaceIllegalFileNameChars(std::string *aName, int aReplaceChar)
Checks aName for illegal file name characters.
char * StrPurge(char *text)
Remove leading and training spaces, tabs and end of line chars in text.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
static LAYER_T ParseType(const char *aType)
Convert a string to a LAYER_T.
The footprint portion of the PLUGIN API, and only for the PCB_IO_KICAD_LEGACY, so therefore is privat...
PCB_IO_KICAD_LEGACY * m_owner
void ReadAndVerifyHeader(LINE_READER *aReader)
long long m_cache_timestamp
void LoadModules(LINE_READER *aReader)
FOOTPRINT_MAP m_footprints
static long long GetTimestamp(const wxString &aLibPath)
LP_CACHE(PCB_IO_KICAD_LEGACY *aOwner, const wxString &aLibraryPath)
void SkipIndex(LINE_READER *aReader)
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ NOT_USED
the 3d code uses this value
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
VECTOR2< int32_t > VECTOR2I
ZONE_BORDER_DISPLAY_STYLE
Zone border styles.
ZONE_CONNECTION
How pads are covered by copper in zone.