29#include <wx/mstream.h>
73using namespace PCB_KEYS_T;
98 THROW_IO_ERROR( wxString::Format(
_(
"Cannot create footprint library '%s'." ),
104 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' is read only." ),
111 std::unique_ptr<FOOTPRINT>& footprint = fpCacheEntry->
GetFootprint();
113 if( aFootprintFilter && footprint.get() != aFootprintFilter )
118 if( footprint->GetAreFontsEmbedded() )
119 footprint->EmbedFonts();
121 footprint->GetEmbeddedFiles()->ClearEmbeddedFonts();
134 m_owner->SetOutputFormatter( &formatter );
135 m_owner->Format( footprint.get() );
145 if( !aFootprintFilter )
157 if( !dir.IsOpened() )
159 wxString msg = wxString::Format(
_(
"Footprint library '%s' not found." ),
171 if( dir.GetFirst( &fullName, fileSpec ) )
186 wxString fpName = fn.
GetName();
196 if( !cacheError.IsEmpty() )
197 cacheError += wxT(
"\n\n" );
199 cacheError += wxString::Format(
_(
"Unable to read file '%s'" ) +
'\n',
201 cacheError += ioe.
What();
203 }
while( dir.GetNext( &fullName ) );
207 if( !cacheError.IsEmpty() )
219 wxString msg = wxString::Format(
_(
"Library '%s' has no footprint '%s'." ),
226 wxString fullPath = it->second->GetFileName().GetFullPath();
228 wxRemoveFile( fullPath );
245 footprint.second->SetFilePath( aPath );
286 const std::map<std::string, UTF8>* aProperties )
293 _(
"Internal Group Data Error" ), wxICON_ERROR,
294 wxString::Format(
_(
"Please report this bug. Error validating group "
295 "structure: %s\n\nSave anyway?" ), sanityResult ),
296 _(
"Save Anyway" ) ) )
308 if(
m_board->GetAreFontsEmbedded() )
311 m_board->GetEmbeddedFiles()->ClearEmbeddedFonts();
320 m_out->Print(
"(kicad_pcb (version %d) (generator \"pcbnew\") (generator_version %s)",
335 std::string input =
TO_UTF8( aClipboardSourceInput );
342 return parser.
Parse();
356 switch( aItem->
Type() )
391 format(
static_cast<const PAD*
>( aItem ) );
433 wxFAIL_MSG( wxT(
"Cannot format item " ) + aItem->
GetClass() );
465 m_out->Print(
"(layer %s %s)",
467 aIsKnockout ?
"knockout" :
"" );
474 m_out->Print(
"(pts" );
476 for(
int ii = 0; ii < outline.
PointCount(); ++ii )
482 m_out->Print(
"(xy %s)",
488 m_out->Print(
"(arc (start %s) (mid %s) (end %s))",
512 m_out->Print(
"(render_cache %s %s",
513 m_out->Quotew( resolvedText ).c_str(),
522 m_out->Print(
"(polygon" );
528 callback_gal.DrawGlyphs( *cache );
537 m_out->Print(
"(setup" );
547 m_out->Print(
"(pad_to_mask_clearance %s)",
552 m_out->Print(
"(solder_mask_min_width %s)",
558 m_out->Print(
"(pad_to_paste_clearance %s)",
564 m_out->Print(
"(pad_to_paste_clearance_ratio %s)",
571 m_out->Print( 0,
" (tenting " );
574 m_out->Print( 0,
")" );
576 m_out->Print( 0,
" (covering " );
579 m_out->Print( 0,
")" );
581 m_out->Print( 0,
" (plugging " );
584 m_out->Print( 0,
")" );
592 m_out->Print( 0,
" (zone_defaults" );
595 format( properties, 0, layer );
597 m_out->Print( 0,
")\n" );
604 m_out->Print(
"(aux_axis_origin %s %s)",
613 m_out->Print(
"(grid_origin %s %s)",
628 m_out->Print(
"(general" );
630 m_out->Print(
"(thickness %s)",
644 m_out->Print(
"(layers" );
650 m_out->Print(
"(%d %s %s %s)",
656 :
m_out->Quotew(
m_board->GetLayerName( layer ) ).c_str() );
665 bool print_type =
false;
679 m_out->Print(
"(%d %s %s %s)",
687 :
m_out->Quotew(
m_board->GetLayerName( layer ) ).c_str() );
701 m_out->Print(
"(net %d %s)",
702 m_mapping->Translate( net->GetNetCode() ),
703 m_out->Quotew( net->GetNetname() ).c_str() );
710 for(
const std::pair<const wxString, wxString>& prop : aBoard->
GetProperties() )
712 m_out->Print(
"(property %s %s)",
713 m_out->Quotew( prop.first ).c_str(),
714 m_out->Quotew( prop.second ).c_str() );
755 m_out->Print(
"(teardrops (best_length_ratio %s) (max_length %s) (best_width_ratio %s) "
764 m_out->Print(
"(filter_ratio %s)",
776 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_footprints( aBoard->
Footprints().begin(),
778 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_drawings( aBoard->
Drawings().begin(),
780 std::set<PCB_TRACK*, PCB_TRACK::cmp_tracks> sorted_tracks( aBoard->
Tracks().begin(),
782 std::set<PCB_POINT*, BOARD_ITEM::ptr_cmp> sorted_points( aBoard->
Points().begin(),
784 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_zones( aBoard->
Zones().begin(),
785 aBoard->
Zones().end() );
786 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_groups( aBoard->
Groups().begin(),
788 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_generators( aBoard->
Generators().begin(),
793 for(
BOARD_ITEM* footprint : sorted_footprints )
811 for(
auto zone : sorted_zones )
828 files_to_write.
AddFile( file.second );
835 files_to_write.
AddFile( file.second );
838 m_out->Print(
"(embedded_fonts %s)",
841 if( !files_to_write.
IsEmpty() )
857 m_out->Print(
"(dimension" );
861 m_out->Print(
"(type orthogonal)" );
863 m_out->Print(
"(type aligned)" );
865 m_out->Print(
"(type leader)" );
867 m_out->Print(
"(type center)" );
869 m_out->Print(
"(type radial)" );
871 wxFAIL_MSG( wxT(
"Cannot format unknown dimension type!" ) );
880 m_out->Print(
"(pts (xy %s %s) (xy %s %s))",
891 m_out->Print(
"(leader_length %s)",
896 m_out->Print(
"(orientation %d)",
static_cast<int>(
ortho->GetOrientation() ) );
900 m_out->Print(
"(format (prefix %s) (suffix %s) (units %d) (units_format %d) (precision %d)",
909 m_out->Print(
"(override_value %s)",
919 m_out->Print(
"(style (thickness %s) (arrow_length %s) (text_position_mode %d)",
924 if(
ortho || aligned )
929 m_out->Print(
"(arrow_direction outward)" );
932 m_out->Print(
"(arrow_direction inward)" );
940 m_out->Print(
"(extension_height %s)",
947 m_out->Print(
"(extension_offset %s)",
967 std::string prefix = parentFP ?
"fp" :
"gr";
972 m_out->Print(
"(%s_line (start %s) (end %s)",
979 m_out->Print(
"(%s_rect (start %s) (end %s)",
989 m_out->Print(
"(%s_circle (center %s) (end %s)",
996 m_out->Print(
"(%s_arc (start %s) (mid %s) (end %s)",
1009 m_out->Print(
"(%s_poly", prefix.c_str() );
1020 m_out->Print(
"(%s_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
1043 m_out->Print(
"(fill hatch)" );
1047 m_out->Print(
"(fill reverse_hatch)" );
1051 m_out->Print(
"(fill cross_hatch)" );
1076 m_out->Print(
"(solder_mask_margin %s)",
1084 m_out->Print(
")" );
1090 wxCHECK_RET( aBitmap !=
nullptr &&
m_out !=
nullptr,
"" );
1096 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1098 m_out->Print(
"(image (at %s %s)",
1110 wxMemoryOutputStream ostream;
1116 m_out->Print(
")" );
1122 m_out->Print(
"(point (at %s) (size %s)",
1130 m_out->Print(
")" );
1136 m_out->Print(
"(target %s (at %s) (size %s)",
1137 ( aTarget->
GetShape() ) ?
"x" :
"plus",
1146 m_out->Print(
")" );
1156 if( initial_comments )
1158 for(
unsigned i = 0; i < initial_comments->GetCount(); ++i )
1159 m_out->Print(
"%s\n",
TO_UTF8( (*initial_comments)[i] ) );
1165 m_out->Print(
"(footprint %s",
1170 m_out->Print(
"(footprint %s",
1176 m_out->Print(
"(version %d) (generator \"pcbnew\") (generator_version %s)",
1194 m_out->Print(
"(at %s %s)",
1209 m_out->Print(
"(property %s %s",
1210 m_out->Quotew( field->GetCanonicalName() ).c_str(),
1211 m_out->Quotew( field->GetText() ).c_str() );
1215 m_out->Print(
")" );
1220 if( !compClass->IsEmpty() )
1222 m_out->Print(
"(component_classes" );
1225 m_out->Print(
"(class %s)",
m_out->Quotew( constituent->GetName() ).c_str() );
1227 m_out->Print(
")" );
1233 m_out->Print(
"(property ki_fp_filters %s)",
1249 m_out->Print(
"(units" );
1253 m_out->Print(
"(unit (name %s)",
m_out->Quotew( u.m_unitName ).c_str() );
1254 m_out->Print(
"(pins" );
1256 for(
const wxString& n : u.m_pins )
1257 m_out->Print(
" %s",
m_out->Quotew( n ).c_str() );
1259 m_out->Print(
")" );
1260 m_out->Print(
")" );
1263 m_out->Print(
")" );
1268 m_out->Print(
"(solder_mask_margin %s)",
1274 m_out->Print(
"(solder_paste_margin %s)",
1280 m_out->Print(
"(solder_paste_margin_ratio %s)",
1286 m_out->Print(
"(clearance %s)",
1292 m_out->Print(
"(zone_connect %d)",
1301 m_out->Print(
"(attr" );
1304 m_out->Print(
" smd" );
1307 m_out->Print(
" through_hole" );
1310 m_out->Print(
" board_only" );
1313 m_out->Print(
" exclude_from_pos_files" );
1316 m_out->Print(
" exclude_from_bom" );
1319 m_out->Print(
" allow_missing_courtyard" );
1322 m_out->Print(
" dnp" );
1325 m_out->Print(
" allow_soldermask_bridges" );
1327 m_out->Print(
")" );
1333 m_out->Print(
"(stackup" );
1338 wxString canonicalName(
LSET::Name( layer ) );
1339 m_out->Print(
"(layer %s)",
m_out->Quotew( canonicalName ).c_str() );
1342 m_out->Print(
")" );
1347 m_out->Print(
"(private_layers" );
1351 wxString canonicalName(
LSET::Name( layer ) );
1352 m_out->Print(
" %s",
m_out->Quotew( canonicalName ).c_str() );
1355 m_out->Print(
")" );
1360 m_out->Print(
"(net_tie_pad_groups" );
1365 m_out->Print(
")" );
1371 const std::vector<std::set<wxString>>& jumperGroups = aFootprint->
JumperPadGroups();
1373 if( !jumperGroups.empty() )
1375 m_out->Print(
"(jumper_pad_groups" );
1377 for(
const std::set<wxString>&
group : jumperGroups )
1379 m_out->Print(
"(" );
1381 for(
const wxString& padName :
group )
1382 m_out->Print(
"%s ",
m_out->Quotew( padName ).c_str() );
1384 m_out->Print(
")" );
1387 m_out->Print(
")" );
1393 std::set<PAD*, FOOTPRINT::cmp_pads> sorted_pads( aFootprint->
Pads().begin(),
1394 aFootprint->
Pads().end() );
1395 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> sorted_drawings(
1398 std::set<PCB_POINT*, FOOTPRINT::ptr_cmp> sorted_points(
1399 aFootprint->
Points().begin(),
1400 aFootprint->
Points().end() );
1401 std::set<ZONE*, FOOTPRINT::cmp_zones> sorted_zones( aFootprint->
Zones().begin(),
1402 aFootprint->
Zones().end() );
1403 std::set<BOARD_ITEM*, PCB_GROUP::ptr_cmp> sorted_groups( aFootprint->
Groups().begin(),
1404 aFootprint->
Groups().end() );
1415 for(
PAD*
pad : sorted_pads )
1433 auto bs3D = aFootprint->
Models().begin();
1434 auto es3D = aFootprint->
Models().end();
1436 while( bs3D != es3D )
1438 if( !bs3D->m_Filename.IsEmpty() )
1440 m_out->Print(
"(model %s",
m_out->Quotew( bs3D->m_Filename ).c_str() );
1445 if( bs3D->m_Opacity != 1.0 )
1446 m_out->Print(
"%s", fmt::format(
"(opacity {:.4f})", bs3D->m_Opacity).c_str() );
1448 m_out->Print(
"(offset (xyz %s %s %s))",
1453 m_out->Print(
"(scale (xyz %s %s %s))",
1458 m_out->Print(
"(rotate (xyz %s %s %s))",
1463 m_out->Print(
")" );
1469 m_out->Print(
")" );
1488 if( !aEnumerateLayers )
1491 if( ( aLayerMask & cu_board_mask ) == cu_board_mask )
1493 output +=
' ' +
m_out->Quotew(
"*.Cu" );
1498 aLayerMask &= ~cu_all;
1500 else if( ( aLayerMask & cu_board_mask ) == fr_bk )
1503 output +=
' ' +
m_out->Quotew(
"F&B.Cu" );
1505 output +=
' ' +
m_out->Quotew(
"*.Cu" );
1507 aLayerMask &= ~fr_bk;
1510 if( ( aLayerMask & adhes ) == adhes )
1512 output +=
' ' +
m_out->Quotew(
"*.Adhes" );
1513 aLayerMask &= ~adhes;
1518 output +=
' ' +
m_out->Quotew(
"*.Paste" );
1522 if( ( aLayerMask & silks ) == silks )
1524 output +=
' ' +
m_out->Quotew(
"*.SilkS" );
1525 aLayerMask &= ~silks;
1528 if( ( aLayerMask & mask ) == mask )
1530 output +=
' ' +
m_out->Quotew(
"*.Mask" );
1531 aLayerMask &= ~mask;
1534 if( ( aLayerMask & crt_yd ) == crt_yd )
1536 output +=
' ' +
m_out->Quotew(
"*.CrtYd" );
1537 aLayerMask &= ~crt_yd;
1540 if( ( aLayerMask & fab ) == fab )
1542 output +=
' ' +
m_out->Quotew(
"*.Fab" );
1550 if( aLayerMask[layer] )
1554 m_out->Print(
"(layers %s)", output.c_str() );
1591 THROW_IO_ERROR( wxString::Format( wxT(
"unknown pad attribute: %d" ),
1595 const char*
property =
nullptr;
1610 THROW_IO_ERROR( wxString::Format( wxT(
"unknown pad property: %d" ),
1614 m_out->Print(
"(pad %s %s %s",
1619 m_out->Print(
"(at %s %s)",
1630 m_out->Print(
"(rect_delta %s)",
1637 if( (sz.
x > 0) || (sz.
y > 0) ||
1638 (shapeoffset.
x != 0) || (shapeoffset.
y != 0) )
1640 m_out->Print(
"(drill" );
1643 m_out->Print(
" oval" );
1648 if( sz.
y > 0 && sz.
x != sz.
y )
1655 if( shapeoffset.
x != 0 || shapeoffset.
y != 0 )
1657 m_out->Print(
"(offset %s)",
1661 m_out->Print(
")" );
1666 m_out->Print(
"(property %s)", property );
1680 m_out->Print(
"(zone_layer_connections" );
1688 m_out->Print(
")" );
1693 auto formatCornerProperties =
1700 m_out->Print(
"(roundrect_rratio %s)",
1707 m_out->Print(
"(chamfer_ratio %s)",
1710 m_out->Print(
"(chamfer" );
1713 m_out->Print(
" top_left" );
1716 m_out->Print(
" top_right" );
1719 m_out->Print(
" bottom_left" );
1722 m_out->Print(
" bottom_right" );
1724 m_out->Print(
")" );
1753 m_out->Print(
"(die_length %s)",
1764 m_out->Print(
"(solder_mask_margin %s)",
1770 m_out->Print(
"(solder_paste_margin %s)",
1776 m_out->Print(
"(solder_paste_margin_ratio %s)",
1782 m_out->Print(
"(clearance %s)",
1788 m_out->Print(
"(zone_connect %d)",
1794 m_out->Print(
"(thermal_bridge_width %s)",
1804 defaultThermalSpokeAngle =
ANGLE_45;
1809 m_out->Print(
"(thermal_bridge_angle %s)",
1815 m_out->Print(
"(thermal_gap %s)",
1830 auto formatPrimitives =
1833 m_out->Print(
"(primitives" );
1836 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives( aLayer ) )
1838 switch( primitive->GetShape() )
1841 if( primitive->IsProxyItem() )
1843 m_out->Print(
"(gr_vector (start %s) (end %s)",
1849 m_out->Print(
"(gr_line (start %s) (end %s)",
1856 if( primitive->IsProxyItem() )
1858 m_out->Print(
"(gr_bbox (start %s) (end %s)",
1864 m_out->Print(
"(gr_rect (start %s) (end %s)",
1868 if( primitive->GetCornerRadius() > 0 )
1874 m_out->Print(
"(gr_arc (start %s) (mid %s) (end %s)",
1881 m_out->Print(
"(gr_circle (center %s) (end %s)",
1887 m_out->Print(
"(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
1895 if( primitive->IsPolyShapeValid() )
1900 m_out->Print(
"(gr_poly" );
1909 if( !primitive->IsProxyItem() )
1921 m_out->Print(
")" );
1924 m_out->Print(
")" );
1929 m_out->Print(
"(options" );
1932 m_out->Print(
"(clearance convexhull)" );
1934 m_out->Print(
"(clearance outline)" );
1948 m_out->Print( 0,
" (tenting " );
1953 m_out->Print( 0,
")" );
1958 auto formatPadLayer =
1963 m_out->Print(
"(shape %s)", shapeName( aLayer ) );
1971 shapeoffset = aPad->
GetOffset( aLayer );
1973 if( shapeoffset.
x != 0 || shapeoffset.
y != 0 )
1976 formatCornerProperties( aLayer );
1980 m_out->Print(
"(options" );
1983 m_out->Print(
"(anchor %s)", anchorShape( aLayer ) );
1985 m_out->Print(
")" );
1988 formatPrimitives( aLayer );
2002 if( layerSpokeAngle != defaultLayerAngle )
2004 m_out->Print(
"(thermal_bridge_angle %s)",
2008 if( padstack.
ThermalGap( aLayer ).has_value() )
2010 m_out->Print(
"(thermal_gap %s)",
2016 m_out->Print(
"(thermal_bridge_width %s)",
2020 if( padstack.
Clearance( aLayer ).has_value() )
2022 m_out->Print(
"(clearance %s)",
2028 m_out->Print(
"(zone_connect %d)",
2038 m_out->Print(
"(padstack (mode front_inner_back)" );
2040 m_out->Print(
"(layer \"Inner\"" );
2042 m_out->Print(
")" );
2043 m_out->Print(
"(layer \"B.Cu\"" );
2044 formatPadLayer(
B_Cu );
2045 m_out->Print(
")" );
2049 m_out->Print(
"(padstack (mode custom)" );
2059 formatPadLayer( layer );
2060 m_out->Print(
")" );
2064 m_out->Print(
")" );
2067 m_out->Print(
")" );
2073 wxCHECK_RET( aBarcode !=
nullptr &&
m_out !=
nullptr,
"" );
2075 m_out->Print(
"(barcode" );
2080 m_out->Print(
"(at %s %s)",
2086 m_out->Print(
"(size %s %s)",
2094 const char* typeStr =
"code39";
2105 m_out->Print(
"(type %s)", typeStr );
2110 const char* eccStr =
"L";
2119 m_out->Print(
"(ecc_level %s)", eccStr );
2124 m_out->Print(
")" );
2155 m_out->Print(
"(%s_text %s %s",
2164 m_out->Print(
"(at %s %s)",
2182 aText->EDA_TEXT::Format(
m_out, ctl_flags );
2188 m_out->Print(
")" );
2196 m_out->Print(
"(%s %s",
2198 : parentFP ?
"fp_text_box"
2207 m_out->Print(
"(start %s) (end %s)",
2223 m_out->Print(
"(margins %s %s %s %s)",
2230 m_out->Print(
"(span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
2247 aTextBox->EDA_TEXT::Format(
m_out, 0 );
2260 m_out->Print(
")" );
2266 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
2277 m_out->Print(
"(border" );
2284 m_out->Print(
")" );
2286 m_out->Print(
"(separators" );
2293 m_out->Print(
")" );
2295 m_out->Print(
"(column_widths" );
2297 for(
int col = 0; col < aTable->
GetColCount(); ++col )
2300 m_out->Print(
")" );
2302 m_out->Print(
"(row_heights" );
2304 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
2307 m_out->Print(
")" );
2309 m_out->Print(
"(cells" );
2314 m_out->Print(
")" );
2315 m_out->Print(
")" );
2335 wxArrayString memberIds;
2338 memberIds.Add( member->m_Uuid.AsString() );
2342 m_out->Print(
"(members" );
2344 for(
const wxString& memberId : memberIds )
2345 m_out->Print(
" %s",
m_out->Quotew( memberId ).c_str() );
2347 m_out->Print(
")" );
2348 m_out->Print(
")" );
2356 && aGenerator->
GetItems().empty() )
2361 m_out->Print(
"(generated" );
2365 m_out->Print(
"(type %s) (name %s) (layer %s)",
2373 for(
const auto& [key, value] : aGenerator->
GetProperties() )
2375 if( value.CheckType<
double>() || value.CheckType<
int>() || value.CheckType<
long>()
2376 || value.CheckType<
long long>() )
2380 if( !value.GetAs( &val ) )
2383 std::string buf = fmt::format(
"{:.10g}", val );
2386 m_out->Print(
"(%s %s)", key.c_str(), buf.c_str() );
2388 else if( value.CheckType<
bool>() )
2391 value.GetAs( &val );
2395 else if( value.CheckType<
VECTOR2I>() )
2398 value.GetAs( &val );
2400 m_out->Print(
"(%s (xy %s))",
2407 value.GetAs( &val );
2409 m_out->Print(
"(%s ", key.c_str() );
2411 m_out->Print(
")" );
2417 if( value.CheckType<wxString>() )
2419 value.GetAs( &val );
2421 else if( value.CheckType<std::string>() )
2424 value.GetAs( &str );
2426 val = wxString::FromUTF8( str );
2429 m_out->Print(
"(%s %s)", key.c_str(),
m_out->Quotew( val ).c_str() );
2433 wxArrayString memberIds;
2436 memberIds.Add( member->m_Uuid.AsString() );
2440 m_out->Print(
"(members" );
2442 for(
const wxString& memberId : memberIds )
2443 m_out->Print(
" %s",
m_out->Quotew( memberId ).c_str() );
2445 m_out->Print(
")" );
2446 m_out->Print(
")" );
2457 const BOARD* board =
via->GetBoard();
2459 wxCHECK_RET( board !=
nullptr, wxT(
"Via has no parent." ) );
2461 m_out->Print(
"(via" );
2463 via->LayerPair( &layer1, &layer2 );
2465 switch(
via->GetViaType() )
2471 m_out->Print(
" blind " );
2475 m_out->Print(
" buried " );
2479 m_out->Print(
" micro " );
2486 m_out->Print(
"(at %s) (size %s)",
2500 m_out->Print(
"(layers %s %s)",
2504 switch(
via->Padstack().UnconnectedLayerMode() )
2524 if(
via->IsLocked() )
2527 if(
via->GetIsFree() )
2530 if(
via->GetRemoveUnconnected() )
2532 m_out->Print(
"(zone_layer_connections" );
2540 m_out->Print(
")" );
2545 m_out->Print( 0,
" (tenting " );
2548 m_out->Print( 0,
")" );
2552 m_out->Print( 0,
" (covering " );
2555 m_out->Print( 0,
")" );
2557 m_out->Print( 0,
" (plugging " );
2560 m_out->Print( 0,
")" );
2566 m_out->Print(
"(padstack" );
2570 m_out->Print(
"(mode front_inner_back)" );
2572 m_out->Print(
"(layer \"Inner\"" );
2573 m_out->Print(
"(size %s)",
2575 m_out->Print(
")" );
2576 m_out->Print(
"(layer \"B.Cu\"" );
2577 m_out->Print(
"(size %s)",
2579 m_out->Print(
")" );
2583 m_out->Print(
"(mode custom)" );
2591 m_out->Print(
"(size %s)",
2593 m_out->Print(
")" );
2597 m_out->Print(
")" );
2609 m_out->Print(
"(arc (start %s) (mid %s) (end %s) (width %s)",
2617 m_out->Print(
"(segment (start %s) (end %s) (width %s)",
2635 m_out->Print(
"(solder_mask_margin %s)",
2643 m_out->Print(
")" );
2656 m_out->Print(
"(zone (net %d) (net_name %s)",
2658 m_out->Quotew( has_no_net ? wxString( wxT(
"") ) : aZone->
GetNetname() ).c_str() );
2670 if( layers.count() > 1 )
2692 m_out->Print(
"(hatch %s %s)", hatch.c_str(),
2703 m_out->Print(
"(attr (teardrop (type %s)))",
2708 m_out->Print(
"(connect_pads" );
2717 m_out->Print(
" thru_hole_only" );
2721 m_out->Print(
" yes" );
2725 m_out->Print(
" no" );
2729 m_out->Print(
"(clearance %s)",
2732 m_out->Print(
")" );
2734 m_out->Print(
"(min_thickness %s)",
2740 m_out->Print(
"(keepout (tracks %s) (vias %s) (pads %s) (copperpour %s) (footprints %s))",
2748 m_out->Print(
"(placement" );
2767 m_out->Print(
")" );
2770 m_out->Print(
"(fill" );
2774 m_out->Print(
" yes" );
2778 m_out->Print(
"(mode hatch)" );
2782 m_out->Print(
"(thermal_gap %s) (thermal_bridge_width %s)",
2792 m_out->Print(
"(smoothing chamfer)" );
2796 m_out->Print(
"(smoothing fillet)" );
2800 THROW_IO_ERROR( wxString::Format(
_(
"unknown zone corner smoothing type %d" ),
2808 m_out->Print(
"(island_removal_mode %d)",
2813 m_out->Print(
"(island_area_min %s)",
2819 m_out->Print(
"(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
2826 m_out->Print(
"(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
2831 m_out->Print(
"(hatch_border_algorithm %s) (hatch_min_hole_area %s)",
2836 m_out->Print(
")" );
2840 format( properties, 0, layer );
2849 m_out->Print(
"(polygon" );
2851 m_out->Print(
")" );
2860 for(
int ii = 0; ii < fv->OutlineCount(); ++ii )
2862 m_out->Print(
"(filled_polygon" );
2871 m_out->Print(
")" );
2875 m_out->Print(
")" );
2886 m_out->Print( aNestLevel,
"(property\n" );
2891 m_out->Print( aNestLevel,
"(hatch_position (xy %s))",
2895 m_out->Print( aNestLevel,
")\n" );
2901 m_ctl( aControlFlags ),
2917 const std::map<std::string, UTF8>* aProperties,
2922 unsigned lineCount = 0;
2950 const std::map<std::string, UTF8>* aProperties,
2953 init( aProperties );
2956 aProgressReporter, aLineCount );
2961 board =
dynamic_cast<BOARD*
>( parser.
Parse() );
2980 parser.CurLine(), parser.CurLineNumber(), parser.CurOffset() );
3010 const wxString& aLibPath,
bool aBestEfforts,
3011 const std::map<std::string, UTF8>* aProperties )
3013 wxDir dir( aLibPath );
3016 init( aProperties );
3024 errorMsg = ioe.
What();
3030 for(
const auto& footprint :
m_cache->GetFootprints() )
3031 aFootprintNames.Add( footprint.first );
3033 if( !errorMsg.IsEmpty() && !aBestEfforts )
3039 const wxString& aFootprintName,
3040 const std::map<std::string, UTF8>* aProperties,
3041 bool checkModified )
3043 init( aProperties );
3054 auto it =
m_cache->GetFootprints().find( aFootprintName );
3056 if( it ==
m_cache->GetFootprints().end() )
3059 return it->second->GetFootprint().get();
3064 const wxString& aFootprintName,
3065 const std::map<std::string, UTF8>* aProperties )
3067 return getFootprint( aLibraryPath, aFootprintName, aProperties,
false );
3072 const wxString& aFootprintName,
3073 const std::map<std::string, UTF8>* aProperties )
3084 return footprintFile.Exists();
3089 wxString& aFootprintNameOut,
3090 const std::map<std::string, UTF8>* aProperties )
3093 wxFFile f( aFootprintPath );
3100 f.ReadAll( &fcontents );
3102 aFootprintNameOut = wxFileName( aFootprintPath ).GetName();
3109 const wxString& aFootprintName,
3111 const std::map<std::string, UTF8>* aProperties )
3126 copy->SetParent(
nullptr );
3135 const std::map<std::string, UTF8>* aProperties )
3137 init( aProperties );
3145 wxString libPath = aLibraryPath;
3146 wxString singleFileBaseName;
3147 bool saveSingleFile =
false;
3150 wxFileName asFile( aLibraryPath );
3154 saveSingleFile =
true;
3155 libPath = asFile.GetPath();
3156 singleFileBaseName = asFile.GetName();
3160 validateCache( libPath, !aProperties || !aProperties->contains(
"skip_cache_validation" ) );
3166 const wxString msg = wxString::Format(
_(
"Library '%s' does not exist.\n"
3167 "Would you like to create it?"),
3170 if( !
Pgm().IsGUI() || wxMessageBox( msg,
_(
"Library Not Found" ), wxYES_NO | wxICON_QUESTION ) != wxYES )
3178 wxString msg = wxString::Format(
_(
"Library '%s' is read only." ), libPath );
3184 wxString footprintName = saveSingleFile ? singleFileBaseName
3187 wxString fpName = saveSingleFile ? singleFileBaseName
3199 THROW_IO_ERROR( wxString::Format(
_(
"Footprint file name '%s' is not valid." ), fn.GetFullPath() ) );
3202 if( fn.FileExists() && !fn.IsFileWritable() )
3204 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to delete '%s'." ),
3205 fn.GetFullPath() ) );
3208 wxString fullPath = fn.GetFullPath();
3209 wxString fullName = fn.GetFullName();
3210 auto it =
m_cache->GetFootprints().find( footprintName );
3212 if( it !=
m_cache->GetFootprints().end() )
3215 m_cache->GetFootprints().erase( footprintName );
3216 wxRemoveFile( fullPath );
3239 wxLogTrace(
traceKicadPcbPlugin, wxT(
"Creating s-expr footprint file '%s'." ), fullPath );
3240 m_cache->GetFootprints().insert( footprintName,
3248 const wxString& aFootprintName,
3249 const std::map<std::string, UTF8>* aProperties )
3251 init( aProperties );
3258 aLibraryPath.GetData() ) );
3261 m_cache->Remove( aFootprintName );
3273 const std::map<std::string, UTF8>* aProperties )
3275 if( wxDir::Exists( aLibraryPath ) )
3277 THROW_IO_ERROR( wxString::Format(
_(
"Cannot overwrite library path '%s'." ),
3278 aLibraryPath.GetData() ) );
3281 init( aProperties );
3290 const std::map<std::string, UTF8>* aProperties )
3293 fn.SetPath( aLibraryPath );
3296 if( !fn.DirExists() )
3299 if( !fn.IsDirWritable() )
3301 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to delete folder '%s'." ),
3302 aLibraryPath.GetData() ) );
3305 wxDir dir( aLibraryPath );
3307 if( dir.HasSubDirs() )
3309 THROW_IO_ERROR( wxString::Format(
_(
"Library folder '%s' has unexpected sub-folders." ),
3310 aLibraryPath.GetData() ) );
3314 if( dir.HasFiles() )
3318 wxArrayString files;
3320 wxDir::GetAllFiles( aLibraryPath, &files );
3322 for( i = 0; i < files.GetCount(); i++ )
3328 THROW_IO_ERROR( wxString::Format(
_(
"Unexpected file '%s' found in library "
3331 aLibraryPath.GetData() ) );
3335 for( i = 0; i < files.GetCount(); i++ )
3336 wxRemoveFile( files[i] );
3340 aLibraryPath.GetData() );
3344 if( !wxRmdir( aLibraryPath ) )
3346 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' cannot be deleted." ),
3347 aLibraryPath.GetData() ) );
3354 wxMilliSleep( 250L );
constexpr EDA_IU_SCALE pcbIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
bool SaveImageData(wxOutputStream &aOutStream) const
Write the bitmap data to aOutStream.
wxString GetNetname() const
TEARDROP_PARAMETERS & GetTeardropParams()
Container for design settings for a BOARD object.
const VECTOR2I & GetGridOrigin() const
int GetBoardThickness() const
The full thickness of the board including copper and masks.
bool m_AllowSoldermaskBridgesInFPs
const VECTOR2I & GetAuxOrigin() const
int m_SolderMaskExpansion
BOARD_STACKUP & GetStackupDescriptor()
double m_SolderPasteMarginRatio
ZONE_SETTINGS & GetDefaultZoneSettings()
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual bool IsKnockout() const
bool IsLocked() const override
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
VECTOR2I GetFPRelativePosition() const
Manage layers needed to make a physical board.
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, const BOARD *aBoard) const
Write the stackup info on board file.
Information pertinent to a Pcbnew printed circuit board.
EMBEDDED_FILES * GetEmbeddedFiles() override
const GENERATORS & Generators() const
void SetFileName(const wxString &aFileName)
const PCB_POINTS & Points() const
const PAGE_INFO & GetPageSettings() const
const ZONES & Zones() const
const GROUPS & Groups() const
The groups must maintain the following invariants.
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Return the type of the copper layer given by aLayer.
TITLE_BLOCK & GetTitleBlock()
int GetCopperLayerCount() const
const std::map< wxString, wxString > & GetProperties() const
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
const PCB_PLOT_PARAMS & GetPlotOptions() const
bool LegacyTeardrops() const
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
const DRAWINGS & Drawings() const
A lightweight representation of a component class.
const std::vector< COMPONENT_CLASS * > & GetConstituentClasses() const
Fetches a vector of the constituent classes for this (effective) class.
const LIB_ID & GetDesignBlockLibId() const
std::unordered_set< EDA_ITEM * > & GetItems()
bool HasDesignBlockLink() const
A base class for most all the KiCad significant classes used in schematics and boards.
KICAD_T Type() const
Returns the type of object.
virtual void SetParentGroup(EDA_GROUP *aGroup)
virtual void SetParent(EDA_ITEM *aParent)
const VECTOR2I & GetBezierC2() const
FILL_T GetFillMode() const
SHAPE_POLY_SET & GetPolyShape()
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
wxString SHAPE_T_asString() const
const VECTOR2I & GetBezierC1() const
int GetCornerRadius() const
bool IsPolyShapeValid() const
VECTOR2I GetArcMid() const
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const VECTOR2I & GetTextPos() const
const EDA_ANGLE & GetTextAngle() const
virtual const wxString & GetText() const
Return the string associated with the text object.
bool IsKeepUpright() const
virtual bool IsVisible() const
KIFONT::FONT * GetFont() const
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
virtual EDA_ANGLE GetDrawRotation() const
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
int GetTextThickness() const
void WriteEmbeddedFiles(OUTPUTFORMATTER &aOut, bool aWriteData) const
Output formatter for the embedded files.
void ClearEmbeddedFiles(bool aDeleteFiles=true)
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
const std::map< wxString, EMBEDDED_FILE * > & EmbeddedFileMap() const
bool GetAreFontsEmbedded() const
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.
Helper class for creating a footprint library cache.
std::unique_ptr< FOOTPRINT > m_footprint
FP_CACHE_ENTRY(FOOTPRINT *aFootprint, const WX_FILENAME &aFileName)
const WX_FILENAME & GetFileName() const
std::unique_ptr< FOOTPRINT > & GetFootprint()
static long long GetTimestamp(const wxString &aLibPath)
Generate a timestamp representing all source files in the cache (including the parent directory).
boost::ptr_map< wxString, FP_CACHE_ENTRY > m_footprints
PCB_IO_KICAD_SEXPR * m_owner
bool IsModified()
Return true if the cache is not up-to-date.
long long m_cache_timestamp
void SetPath(const wxString &aPath)
bool IsPath(const wxString &aPath) const
Check if aPath is the same as the current cache path.
void Save(FOOTPRINT *aFootprintFilter=nullptr)
Save the footprint cache or a single footprint from it to disk.
FP_CACHE(PCB_IO_KICAD_SEXPR *aOwner, const wxString &aLibraryPath)
boost::ptr_map< wxString, FP_CACHE_ENTRY > & GetFootprints()
void Remove(const wxString &aFootprintName)
PROGRESS_REPORTER * m_progressReporter
Progress reporter to track the progress of the operation, may be nullptr.
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()
APP_SETTINGS_BASE * KifaceSettings() const
virtual bool IsOutline() const
virtual void SetLineWidth(float aLineWidth)
Set the line width.
virtual wxString GetClass() const =0
Return the class name.
wxString AsString() const
A logical library item identifier and consists of various portions much like a URI.
const wxString GetUniStringLibItemName() const
Get strings for display messages in dialogs.
const UTF8 & GetLibItemName() const
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
LSEQ TechAndUserUIOrder() const
Return the technical and user layers in the order shown in layer widget.
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
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 ...
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
std::optional< int > & Clearance(PCB_LAYER_ID aLayer=F_Cu)
MASK_LAYER_PROPS & FrontOuterLayers()
std::optional< int > & ThermalSpokeWidth(PCB_LAYER_ID aLayer=F_Cu)
EDA_ANGLE ThermalSpokeAngle(PCB_LAYER_ID aLayer=F_Cu) const
std::optional< int > & ThermalGap(PCB_LAYER_ID aLayer=F_Cu)
const VECTOR2I & Size(PCB_LAYER_ID aLayer) const
@ NORMAL
Shape is the same on all layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
@ REMOVE_EXCEPT_START_AND_END
MASK_LAYER_PROPS & BackOuterLayers()
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
static constexpr PCB_LAYER_ID INNER_LAYERS
! The layer identifier to use for "inner layers" on top/inner/bottom padstacks
std::optional< ZONE_CONNECTION > & ZoneConnection(PCB_LAYER_ID aLayer=F_Cu)
PAD_PROP GetProperty() const
bool GetRemoveUnconnected() const
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
const std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives(PCB_LAYER_ID aLayer) const
Accessor to the basic shape list for custom-shaped pads.
const ZONE_LAYER_OVERRIDE & GetZoneLayerOverride(PCB_LAYER_ID aLayer) const
std::optional< double > GetLocalSolderPasteMarginRatio() const
const wxString & GetPinType() const
const VECTOR2I & GetDrillSize() const
PAD_ATTRIB GetAttribute() const
const wxString & GetPinFunction() const
const wxString & GetNumber() const
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetThermalSpokeAngle() const
double GetRoundRectRadiusRatio(PCB_LAYER_ID aLayer) const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
bool GetKeepTopBottom() const
int GetPadToDieDelay() const
std::optional< int > GetLocalClearance() const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
const PADSTACK & Padstack() const
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
PADSTACK::CUSTOM_SHAPE_ZONE_MODE GetCustomShapeInZoneOpt() const
PAD_DRILL_SHAPE GetDrillShape() const
int GetChamferPositions(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalSolderPasteMargin() const
std::optional< int > GetLocalSolderMaskMargin() const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalThermalSpokeWidthOverride() const
ZONE_CONNECTION GetLocalZoneConnection() const
int GetLocalThermalGapOverride(wxString *aSource) const
PAD_SHAPE GetAnchorPadShape(PCB_LAYER_ID aLayer) const
int GetPadToDieLength() const
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
void Format(OUTPUTFORMATTER *aFormatter) const
Output the page class to aFormatter in s-expression form.
FLIP_DIRECTION m_FlipDirection
const VECTOR2I & GetMid() const
VECTOR2I GetPosition() const override
Get the position (center) of the barcode in internal units.
int GetHeight() const
Get the barcode height (in internal units).
BARCODE_ECC_T GetErrorCorrection() const
EDA_ANGLE GetAngle() const
BARCODE_T GetKind() const
Returns the type of the barcode (QR, CODE_39, etc.).
int GetWidth() const
Get the barcode width (in internal units).
wxString GetOverrideText() const
wxString GetSuffix() const
int GetLineThickness() const
DIM_TEXT_POSITION GetTextPositionMode() const
bool GetKeepTextAligned() const
DIM_PRECISION GetPrecision() const
wxString GetPrefix() const
DIM_UNITS_MODE GetUnitsMode() const
DIM_UNITS_FORMAT GetUnitsFormat() const
virtual const VECTOR2I & GetStart() const
The dimension's origin is the first feature point for the dimension.
DIM_ARROW_DIRECTION GetArrowDirection() const
bool GetSuppressZeroes() const
int GetExtensionOffset() const
int GetArrowLength() const
bool GetOverrideTextEnabled() const
virtual const VECTOR2I & GetEnd() const
For better understanding of the points that make a dimension:
int GetExtensionHeight() const
Mark the center of a circle or arc with a cross shape.
A leader is a dimension-like object pointing to a specific point.
DIM_TEXT_BORDER GetTextBorder() const
An orthogonal dimension is like an aligned dimension, but the extension lines are locked to the X or ...
A radial dimension indicates either the radius or diameter of an arc or circle.
int GetLeaderLength() const
virtual const STRING_ANY_MAP GetProperties() const
virtual wxString GetGeneratorType() const
A set of BOARD_ITEMs (i.e., without duplicates).
Read a Pcbnew s-expression formatted LINE_READER object and returns the appropriate BOARD_ITEM object...
bool IsTooRecent()
Return whether a version number, if any was parsed, was too recent.
bool IsValidBoardHeader()
Partially parse the input and check if it matches expected header.
wxString GetRequiredVersion()
Return a string representing the version of KiCad required to open this file.
A #PLUGIN derivation for saving and loading Pcbnew s-expression formatted files.
BOARD * DoLoad(LINE_READER &aReader, BOARD *aAppendToMe, const std::map< std::string, UTF8 > *aProperties, PROGRESS_REPORTER *aProgressReporter, unsigned aLineCount)
bool CanReadBoard(const wxString &aFileName) const override
Checks if this PCB_IO can read the specified board file.
void formatProperties(const BOARD *aBoard) const
formats the Nets and Netclasses
FOOTPRINT * ImportFootprint(const wxString &aFootprintPath, wxString &aFootprintNameOut, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Load a single footprint from aFootprintPath and put its name in aFootprintNameOut.
void FootprintDelete(const wxString &aLibraryPath, const wxString &aFootprintName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Delete aFootprintName from the library at aLibraryPath.
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
bool IsLibraryWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
void formatTeardropParameters(const TEARDROP_PARAMETERS &tdParams) const
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,...
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
void formatNetInformation(const BOARD *aBoard) const
formats the Nets and Netclasses
const FOOTPRINT * GetEnumeratedFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
A version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.
void CreateLibrary(const wxString &aLibraryPath, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Create a new empty library at aLibraryPath empty.
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.
void formatPolyPts(const SHAPE_LINE_CHAIN &outline, const FOOTPRINT *aParentFP=nullptr) const
FP_CACHE * m_cache
Footprint library cache.
void formatBoardLayers(const BOARD *aBoard) const
formats the board layer information
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...
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 ...
bool FootprintExists(const wxString &aLibraryPath, const wxString &aFootprintName, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Check for the existence of a footprint.
void FootprintSave(const wxString &aLibraryPath, const FOOTPRINT *aFootprint, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Write aFootprint to an existing library located at aLibraryPath.
void format(const BOARD *aBoard) const
void SaveBoard(const wxString &aFileName, BOARD *aBoard, const std::map< std::string, UTF8 > *aProperties=nullptr) override
Write aBoard to a storage file in a format that this PCB_IO implementation knows about or it can be u...
void formatLayers(LSET aLayerMask, bool aEnumerateLayers, bool aIsZone=false) const
void formatGeneral(const BOARD *aBoard) const
formats the General section of the file
void formatSetup(const BOARD *aBoard) const
formats the board setup information
std::function< bool(wxString aTitle, int aIcon, wxString aMsg, wxString aAction)> m_queryUserCallback
BOARD_ITEM * Parse(const wxString &aClipboardSourceInput)
void init(const std::map< std::string, UTF8 > *aProperties)
void Format(const BOARD_ITEM *aItem) const
Output aItem to aFormatter in s-expression format.
void formatLayer(PCB_LAYER_ID aLayer, bool aIsKnockout=false) const
void formatHeader(const BOARD *aBoard) const
writes everything that comes before the board_items, like settings and layers etc
const FOOTPRINT * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const std::map< std::string, UTF8 > *aProperties, bool checkModified)
PCB_IO_KICAD_SEXPR(int aControlFlags=CTL_FOR_BOARD)
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
virtual ~PCB_IO_KICAD_SEXPR()
void formatRenderCache(const EDA_TEXT *aText) const
LINE_READER * m_reader
no ownership
BOARD * m_board
The board BOARD being worked on, no ownership here.
virtual bool CanReadBoard(const wxString &aFileName) const
Checks if this PCB_IO can read the specified board file.
PCB_IO(const wxString &aName)
const std::map< std::string, UTF8 > * m_props
Properties passed via Save() or Load(), no ownership, may be NULL.
void Format(OUTPUTFORMATTER *aFormatter) const
A PCB_POINT is a 0-dimensional point that is used to mark a position on a PCB, or more usually a foot...
VECTOR2I GetPosition() const override
Object to handle a bitmap image that can be inserted in a PCB.
VECTOR2I GetPosition() const override
Get the position of the image (this is the center of the image).
REFERENCE_IMAGE & GetReferenceImage()
std::optional< int > GetLocalSolderMaskMargin() const
bool HasSolderMask() const
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
STROKE_PARAMS GetStroke() const override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
bool StrokeHeaderSeparator() const
bool StrokeColumns() const
bool StrokeExternal() const
std::vector< PCB_TABLECELL * > GetCells() const
const STROKE_PARAMS & GetSeparatorsStroke() const
const STROKE_PARAMS & GetBorderStroke() const
int GetColWidth(int aCol) const
int GetRowHeight(int aRow) const
VECTOR2I GetPosition() const override
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
int GetMarginBottom() const
int GetMarginLeft() const
int GetMarginRight() const
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
bool HasSolderMask() const
std::optional< int > GetLocalSolderMaskMargin() const
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual int GetWidth() const
A progress reporter interface for use in multi-threaded environments.
Container for project specific data.
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
const BITMAP_BASE & GetImage() const
Get the underlying image.
double GetImageScale() const
const VECTOR2I & GetArcMid() const
const VECTOR2I & GetP1() const
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
const SHAPE_ARC & Arc(size_t aArc) const
int PointCount() const
Return the number of points (vertices) in this line chain.
ssize_t ArcIndex(size_t aSegment) const
Return the arc index for the given segment index.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
POLYGON & Polygon(int aIndex)
Return the aIndex-th subpolygon in the set.
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
void Format(OUTPUTFORMATTER *out, const EDA_IU_SCALE &aIuScale) const
TEARDROP_PARAMETARS is a helper class to handle parameters needed to build teardrops for a board thes...
double m_BestWidthRatio
The height of a teardrop as ratio between height and size of pad/via.
int m_TdMaxLen
max allowed length for teardrops in IU. <= 0 to disable
bool m_AllowUseTwoTracks
True to create teardrops using 2 track segments if the first in too small.
int m_TdMaxWidth
max allowed height for teardrops in IU. <= 0 to disable
double m_BestLengthRatio
The length of a teardrop as ratio between length and size of pad/via.
double m_WidthtoSizeFilterRatio
The ratio (H/D) between the via/pad size and the track width max value to create a teardrop 1....
bool m_TdOnPadsInZones
A filter to exclude pads inside zone fills.
bool m_Enabled
Flag to enable teardrops.
bool m_CurvedEdges
True if the teardrop should be curved.
virtual void Format(OUTPUTFORMATTER *aFormatter) const
Output the object to aFormatter in s-expression form.
const char * c_str() const
static REPORTER & GetInstance()
A wrapper around a wxFileName which is much more performant with a subset of the API.
void SetFullName(const wxString &aFileNameAndExtension)
static void ResolvePossibleSymlinks(wxFileName &aFilename)
wxString GetFullPath() const
std::map< PCB_LAYER_ID, ZONE_LAYER_PROPERTIES > m_LayerProperties
Handle a list of polygons defining a copper zone.
int GetHatchBorderAlgorithm() const
bool GetIsRuleArea() const
Accessors to parameters used in Rule Area zones:
std::optional< int > GetLocalClearance() const override
bool GetDoNotAllowVias() const
ZONE_LAYER_PROPERTIES & LayerProperties(PCB_LAYER_ID aLayer)
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
wxString GetPlacementAreaSource() const
bool GetDoNotAllowPads() const
PLACEMENT_SOURCE_T GetPlacementAreaSourceType() const
bool GetDoNotAllowTracks() const
ISLAND_REMOVAL_MODE GetIslandRemovalMode() const
SHAPE_POLY_SET * Outline()
bool IsIsland(PCB_LAYER_ID aLayer, int aPolyIdx) const
Check if a given filled polygon is an insulated island.
long long int GetMinIslandArea() const
const wxString & GetZoneName() const
int GetMinThickness() const
ZONE_CONNECTION GetPadConnection() const
int GetHatchThickness() const
double GetHatchHoleMinArea() const
bool GetPlacementAreaEnabled() const
bool IsTeardropArea() const
int GetThermalReliefSpokeWidth() const
int GetBorderHatchPitch() const
HatchBorder related methods.
ZONE_BORDER_DISPLAY_STYLE GetHatchStyle() const
EDA_ANGLE GetHatchOrientation() const
bool GetDoNotAllowFootprints() const
ZONE_FILL_MODE GetFillMode() const
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
TEARDROP_TYPE GetTeardropAreaType() const
double GetHatchSmoothingValue() const
bool GetDoNotAllowZoneFills() const
int GetHatchSmoothingLevel() const
unsigned int GetCornerRadius() const
int GetCornerSmoothingType() const
bool IsOnCopperLayer() const override
PCB_LAYER_ID GetFirstLayer() const
int GetThermalReliefGap() const
unsigned GetAssignedPriority() const
int GetNumCorners(void) const
Access to m_Poly parameters.
static void SetReporter(REPORTER *aReporter)
Set the reporter to use for reporting font substitution warnings.
long long TimestampDir(const wxString &aDirPath, const wxString &aFilespec)
A copy of ConvertFileTimeToWx() because wxWidgets left it as a static function private to src/common/...
This file is part of the common library.
@ RECT_CHAMFER_BOTTOM_RIGHT
@ RECT_CHAMFER_BOTTOM_LEFT
#define CTL_OMIT_HYPERLINK
Omit the hyperlink attribute in .kicad_xxx files.
#define CTL_OMIT_UUIDS
Omit component unique ids (useless in library)
#define CTL_OMIT_FOOTPRINT_VERSION
Omit the version string from the (footprint) sexpr group.
#define CTL_OMIT_INITIAL_COMMENTS
Omit FOOTPRINT initial comments.
#define CTL_OMIT_LIBNAME
Omit lib alias when saving (used for board/not library).
#define CTL_OMIT_PATH
Omit component sheet time stamp (useless in library).
#define CTL_OMIT_AT
Omit position and rotation.
#define CTL_OMIT_PAD_NETS
Omit pads net names (useless in library).
#define CTL_OMIT_COLOR
Omit the color attribute in .kicad_xxx files.
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_45
#define IGNORE_PARENT_GROUP
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_SHAPE
Fill with object color.
static const std::string KiCadFootprintFileExtension
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
KICOMMON_API std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue)
Converts aValue from internal units to a string appropriate for writing to file.
KICOMMON_API std::string FormatAngle(const EDA_ANGLE &aAngle)
Convert aAngle from board units to a string appropriate for writing to file.
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ SMD
Smd pad, appears on the solder paste layer (default)
@ PTH
Plated through hole pad.
@ CONN
Like smd, does not appear on the solder paste layer (default) Note: also has a special attribute in G...
@ FIDUCIAL_LOCAL
a fiducial (usually a smd) local to the parent footprint
@ FIDUCIAL_GLBL
a fiducial (usually a smd) for the full board
@ MECHANICAL
a pad used for mechanical support
@ PRESSFIT
a PTH with a hole diameter with tight tolerances for press fit pin
@ HEATSINK
a pad used as heat sink, usually in SMD footprints
@ NONE
no special fabrication property
@ TESTPOINT
a test point pad
@ CASTELLATED
a pad with a castellated through hole
@ BGA
Smd pad, used in BGA footprints.
BARCODE class definition.
Class to handle a set of BOARD_ITEMs.
bool isDefaultTeardropParameters(const TEARDROP_PARAMETERS &tdParams)
std::string formatInternalUnits(int aValue)
#define SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
#define CTL_FOR_BOARD
The zero arg constructor when PCB_PLUGIN is used for PLUGIN::Load() and PLUGIN::Save()ing a BOARD fil...
#define CTL_FOR_LIBRARY
Format output for a footprint library instead of clipboard or BOARD.
Pcbnew s-expression file format parser definition.
#define UNDEFINED_DRILL_DIAMETER
PGM_BASE & Pgm()
The global program "get" accessor.
bool ReplaceIllegalFileNameChars(std::string *aName, int aReplaceChar)
Checks aName for illegal file name characters.
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
std::optional< bool > is_capped
True if the drill hole should be capped.
std::optional< bool > is_filled
True if the drill hole should be filled completely.
std::optional< bool > has_covering
True if the pad on this side should have covering.
std::optional< bool > has_solder_mask
True if this outer layer has mask (is not tented)
std::optional< bool > has_plugging
True if the drill hole should be plugged on this side.
A filename or source description, a problem input line, a line number, a byte offset,...
std::optional< VECTOR2I > hatching_offset
const SHAPE_LINE_CHAIN chain
wxLogTrace helper definitions.
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.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_ZONE_T
class ZONE, a copper pour area
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_POINT_T
class PCB_POINT, a 0-dimensional point
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.
@ THERMAL
Use thermal relief for pads.
@ THT_THERMAL
Thermal relief only for THT pads.
@ NONE
Pads are not covered.
@ FULL
pads are covered by copper