25#include <wx/mstream.h>
73using namespace PCB_KEYS_T;
105 std::unique_ptr<FOOTPRINT>& footprint = fpCacheEntry->
GetFootprint();
107 if( aFootprintFilter && footprint.get() != aFootprintFilter )
112 if( footprint->GetAreFontsEmbedded() )
113 footprint->EmbedFonts();
115 footprint->GetEmbeddedFiles()->ClearEmbeddedFonts();
128 m_owner->SetOutputFormatter( &formatter );
129 m_owner->Format( footprint.get() );
140 if( !aFootprintFilter )
152 if( !dir.IsOpened() )
162 if( dir.GetFirst( &fullName, fileSpec ) )
177 wxString fpName = fn.
GetName();
188 if( !cacheError.IsEmpty() )
189 cacheError += wxT(
"\n\n" );
191 cacheError += wxString::Format(
_(
"Warning in file '%s'" ) +
'\n',
193 cacheError += warning;
198 if( !cacheError.IsEmpty() )
199 cacheError += wxT(
"\n\n" );
201 cacheError += wxString::Format(
_(
"Unable to read file '%s'" ) +
'\n',
203 cacheError += ioe.
What();
205 }
while( dir.GetNext( &fullName ) );
209 if( !cacheError.IsEmpty() )
227 wxString fullPath = it->second->GetFileName().GetFullPath();
229 wxRemoveFile( fullPath );
246 footprint.second->SetFilePath( aPath );
287 const std::map<std::string, UTF8>* aProperties )
294 _(
"Internal Group Data Error" ), wxICON_ERROR,
295 wxString::Format(
_(
"Please report this bug. Error validating group "
296 "structure: %s\n\nSave anyway?" ), sanityResult ),
297 _(
"Save Anyway" ) ) )
310 const std::map<std::string, UTF8>* aProperties )
318 if(
m_board->GetAreFontsEmbedded() )
321 m_board->GetEmbeddedFiles()->ClearEmbeddedFonts();
325 m_out->Print(
"(kicad_pcb (version %d) (generator \"pcbnew\") (generator_version %s)",
339 std::string input =
TO_UTF8( aClipboardSourceInput );
346 return parser.
Parse();
360 switch( aItem->
Type() )
395 format(
static_cast<const PAD*
>( aItem ) );
441 wxFAIL_MSG( wxT(
"Cannot format item " ) + aItem->
GetClass() );
497 return KiROUND( aValue / avg );
503 m_out->Print(
"(layer %s %s)",
505 aIsKnockout ?
"knockout" :
"" );
512 m_out->Print(
"(pts" );
514 for(
int ii = 0; ii < outline.
PointCount(); ++ii )
520 m_out->Print(
"(xy %s)",
526 m_out->Print(
"(arc (start %s) (mid %s) (end %s))",
550 m_out->Print(
"(render_cache %s %s",
551 m_out->Quotew( resolvedText ).c_str(),
560 m_out->Print(
"(polygon" );
566 callback_gal.DrawGlyphs( *cache );
575 m_out->Print(
"(setup" );
585 m_out->Print(
"(pad_to_mask_clearance %s)",
590 m_out->Print(
"(solder_mask_min_width %s)",
596 m_out->Print(
"(pad_to_paste_clearance %s)",
602 m_out->Print(
"(pad_to_paste_clearance_ratio %s)",
609 m_out->Print( 0,
" (tenting " );
612 m_out->Print( 0,
")" );
614 m_out->Print( 0,
" (covering " );
617 m_out->Print( 0,
")" );
619 m_out->Print( 0,
" (plugging " );
622 m_out->Print( 0,
")" );
630 m_out->Print( 0,
" (zone_defaults" );
633 format( properties, 0, layer );
635 m_out->Print( 0,
")\n" );
642 m_out->Print(
"(aux_axis_origin %s %s)",
651 m_out->Print(
"(grid_origin %s %s)",
666 m_out->Print(
"(general" );
668 m_out->Print(
"(thickness %s)",
682 m_out->Print(
"(layers" );
688 m_out->Print(
"(%d %s %s %s)",
694 :
m_out->Quotew(
m_board->GetLayerName( layer ) ).c_str() );
703 bool print_type =
false;
717 m_out->Print(
"(%d %s %s %s)",
725 :
m_out->Quotew(
m_board->GetLayerName( layer ) ).c_str() );
734 for(
const std::pair<const wxString, wxString>& prop : aBoard->
GetProperties() )
736 m_out->Print(
"(property %s %s)",
737 m_out->Quotew( prop.first ).c_str(),
738 m_out->Quotew( prop.second ).c_str() );
747 if( variantNames.empty() )
750 m_out->Print(
"(variants" );
752 for(
const wxString& variantName : variantNames )
754 m_out->Print(
"(variant (name %s)",
m_out->Quotew( variantName ).c_str() );
758 if( !description.IsEmpty() )
759 m_out->Print(
"(description %s)",
m_out->Quotew( description ).c_str() );
804 m_out->Print(
"(teardrops (best_length_ratio %s) (max_length %s) (best_width_ratio %s) "
813 m_out->Print(
"(filter_ratio %s)",
825 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_footprints( aBoard->
Footprints().begin(),
827 std::set<BOARD_ITEM*, BOARD::cmp_drawings> sorted_drawings( aBoard->
Drawings().begin(),
829 std::set<PCB_TRACK*, PCB_TRACK::cmp_tracks> sorted_tracks( aBoard->
Tracks().begin(),
831 std::set<PCB_POINT*, PCB_POINT::cmp_points> sorted_points( aBoard->
Points().begin(),
833 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_zones( aBoard->
Zones().begin(),
834 aBoard->
Zones().end() );
835 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_groups( aBoard->
Groups().begin(),
837 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_generators( aBoard->
Generators().begin(),
839 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_constraints( aBoard->
Constraints().begin(),
844 for(
BOARD_ITEM* footprint : sorted_footprints )
862 for(
auto zone : sorted_zones )
874 for(
BOARD_ITEM* constraint : sorted_constraints )
880 std::vector<NETINFO_ITEM*> nets;
881 PAD* pads[2] = {
nullptr,
nullptr };
885 auto cmp = [](
const wxString& a,
const wxString& b )
890 std::map<wxString, CHAIN_INFO,
decltype( cmp )> chains( cmp );
897 if( net->GetNetChain().IsEmpty() && !net->GetTerminalPad( 0 ) && !net->GetTerminalPad( 1 ) )
900 wxString chainName = net->GetNetChain();
902 if( chainName.IsEmpty() && ( net->GetTerminalPad( 0 ) || net->GetTerminalPad( 1 ) ) )
903 chainName = net->GetNetname();
905 CHAIN_INFO&
info = chains[chainName];
906 info.nets.push_back( net );
907 for(
int i = 0; i < 2; ++i )
909 if( net->GetTerminalPad( i ) && !
info.pads[i] )
910 info.pads[i] = net->GetTerminalPad( i );
915 for(
const auto&
kv : chains )
917 const CHAIN_INFO& si =
kv.second;
918 const wxString& chainName =
kv.first;
920 if( si.nets.size() > 1 || si.pads[0] || si.pads[1] || !chainName.IsEmpty() )
926 m_out->Print(
"(net_chains" );
927 for(
const auto&
kv : chains )
929 const wxString&
name =
kv.first;
930 const CHAIN_INFO& si =
kv.second;
932 if( si.nets.size() == 1 && !si.pads[0] && !si.pads[1] &&
name.IsEmpty() )
935 m_out->Print(
" (net_chain (name %s)",
m_out->Quotew(
name ).c_str() );
936 m_out->Print(
" (members" );
943 for(
int i = 0; i < 2; ++i )
946 m_out->Print(
" (terminal_pad %s)",
947 m_out->Quotew( si.pads[i]->m_Uuid.AsString() ).c_str() );
961 files_to_write.
AddFile( file.second );
968 files_to_write.
AddFile( file.second );
971 m_out->Print(
"(embedded_fonts %s)",
974 if( !files_to_write.
IsEmpty() )
990 m_out->Print(
"(dimension" );
994 m_out->Print(
"(type orthogonal)" );
996 m_out->Print(
"(type aligned)" );
998 m_out->Print(
"(type leader)" );
1000 m_out->Print(
"(type center)" );
1002 m_out->Print(
"(type radial)" );
1004 wxFAIL_MSG( wxT(
"Cannot format unknown dimension type!" ) );
1013 m_out->Print(
"(pts (xy %s %s) (xy %s %s))",
1024 m_out->Print(
"(leader_length %s)",
1029 m_out->Print(
"(orientation %d)",
static_cast<int>(
ortho->GetOrientation() ) );
1033 m_out->Print(
"(format (prefix %s) (suffix %s) (units %d) (units_format %d) (precision %d)",
1042 m_out->Print(
"(override_value %s)",
1049 m_out->Print(
")" );
1052 m_out->Print(
"(style (thickness %s) (arrow_length %s) (text_position_mode %d)",
1057 if(
ortho || aligned )
1062 m_out->Print(
"(arrow_direction outward)" );
1065 m_out->Print(
"(arrow_direction inward)" );
1073 m_out->Print(
"(extension_height %s)",
1080 m_out->Print(
"(extension_offset %s)",
1086 m_out->Print(
")" );
1093 m_out->Print(
")" );
1100 std::string prefix = parentFP ?
"fp" :
"gr";
1105 m_out->Print(
"(%s_line (start %s) (end %s)",
1112 m_out->Print(
"(%s_rect (start %s) (end %s)", prefix.c_str(),
1121 m_out->Print(
"(%s_circle (center %s) (end %s)", prefix.c_str(),
1127 m_out->Print(
"(%s_arc (start %s) (mid %s) (end %s)", prefix.c_str(),
1139 m_out->Print(
"(%s_poly", prefix.c_str() );
1150 m_out->Print(
"(%s_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
1159 m_out->Print(
"(%s_ellipse (center %s) (major_radius %s) (minor_radius %s) "
1160 "(rotation_angle %s)",
1169 m_out->Print(
"(%s_ellipse_arc (center %s) (major_radius %s) (minor_radius %s) "
1170 "(rotation_angle %s) (start_angle %s) (end_angle %s)",
1198 m_out->Print(
"(fill hatch)" );
1202 m_out->Print(
"(fill reverse_hatch)" );
1206 m_out->Print(
"(fill cross_hatch)" );
1231 m_out->Print(
"(solder_mask_margin %s)",
1239 m_out->Print(
")" );
1245 wxCHECK_RET( aBitmap !=
nullptr &&
m_out !=
nullptr,
"" );
1251 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1253 m_out->Print(
"(image (at %s %s)",
1265 wxMemoryOutputStream ostream;
1271 m_out->Print(
")" );
1283 m_out->Print(
")" );
1289 m_out->Print(
"(target %s (at %s) (size %s)",
1290 ( aTarget->
GetShape() ) ?
"x" :
"plus",
1299 m_out->Print(
")" );
1309 if( initial_comments )
1311 for(
unsigned i = 0; i < initial_comments->GetCount(); ++i )
1312 m_out->Print(
"%s\n",
TO_UTF8( (*initial_comments)[i] ) );
1318 m_out->Print(
"(footprint %s",
1323 m_out->Print(
"(footprint %s",
1329 m_out->Print(
"(version %d) (generator \"pcbnew\") (generator_version %s)",
1347 m_out->Print(
"(transform (translate %s) (rotate %s) (scale %s %s))",
1365 m_out->Print(
"(property %s %s",
1366 m_out->Quotew( field->GetCanonicalName() ).c_str(),
1367 m_out->Quotew( field->GetText() ).c_str() );
1371 m_out->Print(
")" );
1376 if( !compClass->IsEmpty() )
1378 m_out->Print(
"(component_classes" );
1381 m_out->Print(
"(class %s)",
m_out->Quotew( constituent->GetName() ).c_str() );
1383 m_out->Print(
")" );
1389 m_out->Print(
"(property ki_fp_filters %s)",
1405 m_out->Print(
"(units" );
1409 m_out->Print(
"(unit (name %s)",
m_out->Quotew( u.m_unitName ).c_str() );
1410 m_out->Print(
"(pins" );
1412 for(
const wxString& n : u.m_pins )
1413 m_out->Print(
" %s",
m_out->Quotew( n ).c_str() );
1415 m_out->Print(
")" );
1416 m_out->Print(
")" );
1419 m_out->Print(
")" );
1424 m_out->Print(
"(solder_mask_margin %s)",
1430 m_out->Print(
"(solder_paste_margin %s)",
1436 m_out->Print(
"(solder_paste_margin_ratio %s)",
1442 m_out->Print(
"(clearance %s)",
1448 m_out->Print(
"(zone_connect %d)",
1457 m_out->Print(
"(attr" );
1460 m_out->Print(
" smd" );
1463 m_out->Print(
" through_hole" );
1466 m_out->Print(
" board_only" );
1469 m_out->Print(
" exclude_from_pos_files" );
1472 m_out->Print(
" exclude_from_bom" );
1475 m_out->Print(
" allow_missing_courtyard" );
1478 m_out->Print(
" dnp" );
1481 m_out->Print(
" allow_soldermask_bridges" );
1483 m_out->Print(
")" );
1489 m_out->Print(
"(stackup" );
1494 wxString canonicalName(
LSET::Name( layer ) );
1495 m_out->Print(
"(layer %s)",
m_out->Quotew( canonicalName ).c_str() );
1498 m_out->Print(
")" );
1503 m_out->Print(
"(private_layers" );
1507 wxString canonicalName(
LSET::Name( layer ) );
1508 m_out->Print(
" %s",
m_out->Quotew( canonicalName ).c_str() );
1511 m_out->Print(
")" );
1516 m_out->Print(
"(net_tie_pad_groups" );
1521 m_out->Print(
")" );
1527 const std::vector<std::set<wxString>>& jumperGroups = aFootprint->
JumperPadGroups();
1529 if( !jumperGroups.empty() )
1531 m_out->Print(
"(jumper_pad_groups" );
1533 for(
const std::set<wxString>&
group : jumperGroups )
1535 m_out->Print(
"(" );
1537 for(
const wxString& padName :
group )
1538 m_out->Print(
"%s ",
m_out->Quotew( padName ).c_str() );
1540 m_out->Print(
")" );
1543 m_out->Print(
")" );
1549 std::set<PAD*, FOOTPRINT::cmp_pads> sorted_pads( aFootprint->
Pads().begin(),
1550 aFootprint->
Pads().end() );
1551 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> sorted_drawings(
1554 std::set<PCB_POINT*, PCB_POINT::cmp_points> sorted_points(
1555 aFootprint->
Points().begin(),
1556 aFootprint->
Points().end() );
1557 std::set<ZONE*, FOOTPRINT::cmp_zones> sorted_zones( aFootprint->
Zones().begin(),
1558 aFootprint->
Zones().end() );
1559 std::set<BOARD_ITEM*, PCB_GROUP::ptr_cmp> sorted_groups( aFootprint->
Groups().begin(),
1560 aFootprint->
Groups().end() );
1561 std::set<BOARD_ITEM*, PCB_GROUP::ptr_cmp> sorted_constraints( aFootprint->
Constraints().begin(),
1573 for(
PAD*
pad : sorted_pads )
1585 for(
BOARD_ITEM* constraint : sorted_constraints )
1589 const bool baseDnp = aFootprint->
IsDNP();
1593 for(
const auto& [variantName, variant] : aFootprint->
GetVariants() )
1595 m_out->Print(
"(variant (name %s)",
m_out->Quotew( variantName ).c_str() );
1597 if( variant.GetDNP() != baseDnp )
1600 if( variant.GetExcludedFromBOM() != baseExcludedFromBOM )
1603 if( variant.GetExcludedFromPosFiles() != baseExcludedFromPosFiles )
1606 variant.GetExcludedFromPosFiles() );
1609 for(
const auto& [fieldName, fieldValue] : variant.GetFields() )
1612 const wxString baseValue = baseField ? baseField->
GetText() : wxString();
1614 if( fieldValue == baseValue )
1617 m_out->Print(
"(field (name %s) (value %s))",
1618 m_out->Quotew( fieldName ).c_str(),
1619 m_out->Quotew( fieldValue ).c_str() );
1622 m_out->Print(
")" );
1634 m_out->Print(
"(model" );
1635 m_out->Print(
"(type extruded)" );
1641 m_out->Print(
"(layer pad_bbox)" );
1645 m_out->Print(
"(layer auto)" );
1648 static const char* matNames[] = {
"plastic",
"matte",
"metal",
"copper" };
1649 m_out->Print(
"(material %s)", matNames[
static_cast<int>( body->m_material )] );
1660 m_out->Print(
"(color unspecified)" );
1672 m_out->Print(
")" );
1676 auto bs3D = aFootprint->
Models().begin();
1677 auto es3D = aFootprint->
Models().end();
1679 while( bs3D != es3D )
1681 if( !bs3D->m_Filename.IsEmpty() )
1683 m_out->Print(
"(model %s",
m_out->Quotew( bs3D->m_Filename ).c_str() );
1688 if( bs3D->m_Opacity != 1.0 )
1689 m_out->Print(
"%s", fmt::format(
"(opacity {:.4f})", bs3D->m_Opacity).c_str() );
1691 m_out->Print(
"(offset (xyz %s %s %s))",
1696 m_out->Print(
"(scale (xyz %s %s %s))",
1701 m_out->Print(
"(rotate (xyz %s %s %s))",
1706 m_out->Print(
")" );
1712 m_out->Print(
")" );
1731 if( !aEnumerateLayers )
1734 if( ( aLayerMask & cu_board_mask ) == cu_board_mask )
1736 output +=
' ' +
m_out->Quotew(
"*.Cu" );
1741 aLayerMask &= ~cu_all;
1743 else if( ( aLayerMask & cu_board_mask ) == fr_bk )
1746 output +=
' ' +
m_out->Quotew(
"F&B.Cu" );
1748 output +=
' ' +
m_out->Quotew(
"*.Cu" );
1750 aLayerMask &= ~fr_bk;
1753 if( ( aLayerMask & adhes ) == adhes )
1755 output +=
' ' +
m_out->Quotew(
"*.Adhes" );
1756 aLayerMask &= ~adhes;
1761 output +=
' ' +
m_out->Quotew(
"*.Paste" );
1765 if( ( aLayerMask & silks ) == silks )
1767 output +=
' ' +
m_out->Quotew(
"*.SilkS" );
1768 aLayerMask &= ~silks;
1771 if( ( aLayerMask & mask ) == mask )
1773 output +=
' ' +
m_out->Quotew(
"*.Mask" );
1774 aLayerMask &= ~mask;
1777 if( ( aLayerMask & crt_yd ) == crt_yd )
1779 output +=
' ' +
m_out->Quotew(
"*.CrtYd" );
1780 aLayerMask &= ~crt_yd;
1783 if( ( aLayerMask & fab ) == fab )
1785 output +=
' ' +
m_out->Quotew(
"*.Fab" );
1793 if( aLayerMask[layer] )
1797 m_out->Print(
"(layers %s)", output.c_str() );
1837 const char*
property =
nullptr;
1855 const char* simElectricalType =
nullptr;
1861 default: simElectricalType =
nullptr;
break;
1864 m_out->Print(
"(pad %s %s %s",
1869 m_out->Print(
"(at %s %s)",
1890 bool forceShapeOffsetOutput =
false;
1895 if( aPad->
GetOffset( layer ) != shapeoffset )
1896 forceShapeOffsetOutput =
true;
1899 if( drill.
x > 0 || drill.
y > 0 || shapeoffset.
x != 0 || shapeoffset.
y != 0 || forceShapeOffsetOutput )
1901 m_out->Print(
"(drill" );
1904 m_out->Print(
" oval" );
1909 if( drill.
y > 0 && drill.
x != drill.
y )
1916 if( shapeoffset.
x != 0 || shapeoffset.
y != 0 || forceShapeOffsetOutput )
1917 m_out->Print(
"(offset %s)",
1920 m_out->Print(
")" );
1925 m_out->Print(
"(backdrill (size %s) (layers %s %s))",
1933 m_out->Print(
"(tertiary_drill (size %s) (layers %s %s))",
1939 auto formatPostMachining =
1945 m_out->Print(
"(%s %s",
1950 if( aProps.size > 0 )
1953 if( aProps.depth > 0 )
1956 if( aProps.angle > 0 )
1959 m_out->Print(
")" );
1967 m_out->Print(
"(property %s)", property );
1969 if( simElectricalType )
1970 m_out->Print(
"(sim_electrical_type %s)", simElectricalType );
1984 m_out->Print(
"(zone_layer_connections" );
1992 m_out->Print(
")" );
1997 auto formatCornerProperties =
2004 m_out->Print(
"(roundrect_rratio %s)",
2011 m_out->Print(
"(chamfer_ratio %s)",
2014 m_out->Print(
"(chamfer" );
2017 m_out->Print(
" top_left" );
2020 m_out->Print(
" top_right" );
2023 m_out->Print(
" bottom_left" );
2026 m_out->Print(
" bottom_right" );
2028 m_out->Print(
")" );
2054 m_out->Print(
"(die_length %s)",
2060 m_out->Print(
"(die_delay %s)",
2066 m_out->Print(
"(solder_mask_margin %s)",
2072 m_out->Print(
"(solder_paste_margin %s)",
2078 m_out->Print(
"(solder_paste_margin_ratio %s)",
2084 m_out->Print(
"(clearance %s)",
2090 m_out->Print(
"(zone_connect %d)",
2096 m_out->Print(
"(thermal_bridge_width %s)",
2106 defaultThermalSpokeAngle =
ANGLE_45;
2111 m_out->Print(
"(thermal_bridge_angle %s)",
2117 m_out->Print(
"(thermal_gap %s)",
2132 auto formatPrimitives =
2135 m_out->Print(
"(primitives" );
2138 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives( aLayer ) )
2140 const SHAPE_T libShape = primitive->GetLibraryShape();
2145 if( primitive->IsProxyItem() )
2147 m_out->Print(
"(gr_vector (start %s) (end %s)",
2153 m_out->Print(
"(gr_line (start %s) (end %s)",
2160 if( primitive->IsProxyItem() )
2162 m_out->Print(
"(gr_bbox (start %s) (end %s)",
2168 m_out->Print(
"(gr_rect (start %s) (end %s)",
2172 if( primitive->GetCornerRadius() > 0 )
2174 m_out->Print(
" (radius %s)",
2181 m_out->Print(
"(gr_arc (start %s) (mid %s) (end %s)",
2188 m_out->Print(
"(gr_circle (center %s) (end %s)",
2196 m_out->Print(
"(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
2204 if( primitive->IsPolyShapeValid() )
2209 m_out->Print(
"(gr_poly" );
2218 if( !primitive->IsProxyItem() )
2228 m_out->Print(
")" );
2231 m_out->Print(
")" );
2236 m_out->Print(
"(options" );
2239 m_out->Print(
"(clearance convexhull)" );
2241 m_out->Print(
"(clearance outline)" );
2258 m_out->Print( 0,
" (tenting " );
2263 m_out->Print( 0,
")" );
2269 auto formatPadLayer =
2274 m_out->Print(
"(shape %s)", shapeName( aLayer ) );
2283 shapeoffset = aPad->
GetOffset( aLayer );
2285 if( shapeoffset.
x != 0 || shapeoffset.
y != 0 )
2288 formatCornerProperties( aLayer );
2292 m_out->Print(
"(options" );
2295 m_out->Print(
"(anchor %s)", anchorShape( aLayer ) );
2297 m_out->Print(
")" );
2300 formatPrimitives( aLayer );
2314 if( layerSpokeAngle != defaultLayerAngle )
2316 m_out->Print(
"(thermal_bridge_angle %s)",
2320 if( padstack.
ThermalGap( aLayer ).has_value() )
2322 m_out->Print(
"(thermal_gap %s)",
2328 m_out->Print(
"(thermal_bridge_width %s)",
2332 if( padstack.
Clearance( aLayer ).has_value() )
2334 m_out->Print(
"(clearance %s)",
2340 m_out->Print(
"(zone_connect %d)",
2350 m_out->Print(
"(padstack (mode front_inner_back)" );
2352 m_out->Print(
"(layer \"Inner\"" );
2354 m_out->Print(
")" );
2355 m_out->Print(
"(layer \"B.Cu\"" );
2356 formatPadLayer(
B_Cu );
2357 m_out->Print(
")" );
2361 m_out->Print(
"(padstack (mode custom)" );
2371 formatPadLayer( layer );
2372 m_out->Print(
")" );
2376 m_out->Print(
")" );
2379 m_out->Print(
")" );
2385 wxCHECK_RET( aBarcode !=
nullptr &&
m_out !=
nullptr,
"" );
2387 m_out->Print(
"(barcode" );
2392 m_out->Print(
"(at %s %s)",
2398 m_out->Print(
"(size %s %s)",
2406 const char* typeStr =
"code39";
2417 m_out->Print(
"(type %s)", typeStr );
2422 const char* eccStr =
"L";
2431 m_out->Print(
"(ecc_level %s)", eccStr );
2445 m_out->Print(
")" );
2475 m_out->Print(
"(%s_text %s %s",
2484 m_out->Print(
"(at %s %s)",
2511 if( mutateThickness )
2514 aText->EDA_TEXT::Format(
m_out, ctl_flags );
2518 if( mutateThickness )
2523 aText->EDA_TEXT::Format(
m_out, ctl_flags );
2530 m_out->Print(
")" );
2538 m_out->Print(
"(%s %s",
2540 : parentFP ?
"fp_text_box"
2571 m_out->Print(
"(margins %s %s %s %s)",
2578 m_out->Print(
"(span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
2595 aTextBox->EDA_TEXT::Format(
m_out, 0 );
2608 m_out->Print(
")" );
2614 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
2625 m_out->Print(
"(border" );
2632 m_out->Print(
")" );
2634 m_out->Print(
"(separators" );
2641 m_out->Print(
")" );
2643 m_out->Print(
"(column_widths" );
2645 for(
int col = 0; col < aTable->
GetColCount(); ++col )
2648 m_out->Print(
")" );
2650 m_out->Print(
"(row_heights" );
2652 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
2655 m_out->Print(
")" );
2657 m_out->Print(
"(cells" );
2662 m_out->Print(
")" );
2663 m_out->Print(
")" );
2669 wxArrayString memberIds;
2679 bool validateAgainstBoard =
m_board &&
m_board->IsItemIndexedById( aGroup );
2681 memberIds.Alloc( aGroup->
GetItems().size() );
2685 if( !validateAgainstBoard
2688 memberIds.Add( member->m_Uuid.AsString() );
2692 if( memberIds.empty() )
2707 m_out->Print(
"(members" );
2709 for(
const wxString& memberId : memberIds )
2710 m_out->Print(
" %s",
m_out->Quotew( memberId ).c_str() );
2712 m_out->Print(
")" );
2713 m_out->Print(
")" );
2719 const std::vector<CONSTRAINT_MEMBER>& members = aConstraint->
GetMembers();
2721 if( members.empty() )
2731 m_out->Print(
"(members" );
2738 m_out->Print(
"(member %s %s %d)",
m_out->Quotew( member.m_item.AsString() ).c_str(),
2743 m_out->Print(
"(member %s %s)",
m_out->Quotew( member.m_item.AsString() ).c_str(),
2748 m_out->Print(
")" );
2754 double value = *aConstraint->
GetValue();
2765 m_out->Print(
")" );
2773 && aGenerator->
GetItems().empty() )
2778 m_out->Print(
"(generated" );
2782 m_out->Print(
"(type %s) (name %s) (layer %s)",
2790 for(
const auto& [key, value] : aGenerator->
GetProperties() )
2792 if( value.CheckType<
double>() || value.CheckType<
int>() || value.CheckType<
long>()
2793 || value.CheckType<
long long>() )
2797 if( !value.GetAs( &val ) )
2800 std::string buf = fmt::format(
"{:.10g}", val );
2803 m_out->Print(
"(%s %s)", key.c_str(), buf.c_str() );
2805 else if( value.CheckType<
bool>() )
2808 value.GetAs( &val );
2812 else if( value.CheckType<
VECTOR2I>() )
2815 value.GetAs( &val );
2817 m_out->Print(
"(%s (xy %s))",
2824 value.GetAs( &val );
2826 m_out->Print(
"(%s ", key.c_str() );
2828 m_out->Print(
")" );
2834 if( value.CheckType<wxString>() )
2836 value.GetAs( &val );
2838 else if( value.CheckType<std::string>() )
2841 value.GetAs( &str );
2843 val = wxString::FromUTF8( str );
2846 m_out->Print(
"(%s %s)", key.c_str(),
m_out->Quotew( val ).c_str() );
2850 wxArrayString memberIds;
2853 memberIds.Add( member->m_Uuid.AsString() );
2857 m_out->Print(
"(members" );
2859 for(
const wxString& memberId : memberIds )
2860 m_out->Print(
" %s",
m_out->Quotew( memberId ).c_str() );
2862 m_out->Print(
")" );
2863 m_out->Print(
")" );
2874 const BOARD* board =
via->GetBoard();
2876 wxCHECK_RET( board !=
nullptr, wxT(
"Via has no parent." ) );
2878 m_out->Print(
"(via" );
2880 via->LayerPair( &layer1, &layer2 );
2882 switch(
via->GetViaType() )
2888 m_out->Print(
" blind " );
2892 m_out->Print(
" buried " );
2896 m_out->Print(
" micro " );
2903 m_out->Print(
"(at %s) (size %s)",
2917 if(
via->Padstack().SecondaryDrill().size.x > 0 )
2919 m_out->Print(
"(backdrill (size %s) (layers %s %s))",
2925 if(
via->Padstack().TertiaryDrill().size.x > 0 )
2927 m_out->Print(
"(tertiary_drill (size %s) (layers %s %s))",
2938 m_out->Print(
"(%s %s", aName,
2941 if( aProps.size > 0 )
2944 if( aProps.depth > 0 )
2947 if( aProps.angle > 0 )
2950 m_out->Print(
")" );
2953 formatPostMachining(
"front_post_machining",
via->Padstack().FrontPostMachining() );
2954 formatPostMachining(
"back_post_machining",
via->Padstack().BackPostMachining() );
2956 m_out->Print(
"(layers %s %s)",
2960 switch(
via->Padstack().UnconnectedLayerMode() )
2980 if(
via->IsLocked() )
2983 if(
via->GetIsFree() )
2986 if(
via->GetRemoveUnconnected() )
2988 m_out->Print(
"(zone_layer_connections" );
2996 m_out->Print(
")" );
3004 m_out->Print( 0,
" (tenting " );
3009 m_out->Print( 0,
")" );
3018 m_out->Print( 0,
" (covering " );
3023 m_out->Print( 0,
")" );
3029 m_out->Print( 0,
" (plugging " );
3034 m_out->Print( 0,
")" );
3042 m_out->Print(
"(padstack" );
3046 m_out->Print(
"(mode front_inner_back)" );
3048 m_out->Print(
"(layer \"Inner\"" );
3049 m_out->Print(
"(size %s)",
3051 m_out->Print(
")" );
3052 m_out->Print(
"(layer \"B.Cu\"" );
3053 m_out->Print(
"(size %s)",
3055 m_out->Print(
")" );
3059 m_out->Print(
"(mode custom)" );
3067 m_out->Print(
"(size %s)",
3069 m_out->Print(
")" );
3073 m_out->Print(
")" );
3085 m_out->Print(
"(arc (start %s) (mid %s) (end %s) (width %s)",
3093 m_out->Print(
"(segment (start %s) (end %s) (width %s)",
3111 m_out->Print(
"(solder_mask_margin %s)",
3120 m_out->Print(
")" );
3126 m_out->Print(
"(zone" );
3144 if( layers.count() > 1 )
3166 m_out->Print(
"(hatch %s %s)", hatch.c_str(),
3177 m_out->Print(
"(attr (teardrop (type %s)))",
3182 m_out->Print(
"(connect_pads" );
3191 m_out->Print(
" thru_hole_only" );
3195 m_out->Print(
" yes" );
3199 m_out->Print(
" no" );
3203 m_out->Print(
"(clearance %s)",
3206 m_out->Print(
")" );
3208 m_out->Print(
"(min_thickness %s)",
3214 m_out->Print(
"(keepout (tracks %s) (vias %s) (pads %s) (copperpour %s) (footprints %s))",
3222 m_out->Print(
"(placement" );
3241 m_out->Print(
")" );
3244 m_out->Print(
"(fill" );
3248 m_out->Print(
" yes" );
3252 m_out->Print(
"(mode hatch)" );
3254 m_out->Print(
"(mode thieving)" );
3258 m_out->Print(
"(thermal_gap %s) (thermal_bridge_width %s)",
3268 m_out->Print(
"(smoothing chamfer)" );
3272 m_out->Print(
"(smoothing fillet)" );
3283 m_out->Print(
"(island_removal_mode %d)",
3288 m_out->Print(
"(island_area_min %s)",
3294 m_out->Print(
"(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
3301 m_out->Print(
"(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
3306 m_out->Print(
"(hatch_border_algorithm %s) (hatch_min_hole_area %s)",
3313 const char* patternStr =
"dots";
3320 default: patternStr =
"dots";
break;
3323 m_out->Print(
"(thieving (type %s) (size %s) (gap %s) (width %s) "
3324 "(stagger %s) (orientation %s))",
3329 thieving.
stagger ?
"yes" :
"no",
3333 m_out->Print(
")" );
3337 format( properties, 0, layer );
3346 if(
chain.PointCount() == 0 )
3349 m_out->Print(
"(polygon" );
3351 m_out->Print(
")" );
3360 for(
int ii = 0; ii < fv->OutlineCount(); ++ii )
3362 m_out->Print(
"(filled_polygon" );
3371 m_out->Print(
")" );
3375 m_out->Print(
")" );
3386 m_out->Print( aNestLevel,
"(property\n" );
3391 m_out->Print( aNestLevel,
"(hatch_position (xy %s))",
3395 m_out->Print( aNestLevel,
")\n" );
3401 m_ctl( aControlFlags )
3415 const std::map<std::string, UTF8>* aProperties,
3420 unsigned lineCount = 0;
3449 const std::map<std::string, UTF8>* aProperties,
3452 init( aProperties );
3454 bool preserveDestinationStackup =
3458 preserveDestinationStackup );
3462 std::set<BOARD_ITEM*> itemsBefore;
3463 std::set<NETINFO_ITEM*> netsBefore;
3468 itemsBefore.insert( item );
3471 netsBefore.insert( net );
3474 auto revertPartialAppend = [&]()
3479 std::vector<BOARD_ITEM*> addedItems;
3483 if( !itemsBefore.contains( item ) )
3484 addedItems.push_back( item );
3490 aAppendToMe->
Remove( item );
3495 std::vector<NETINFO_ITEM*> addedNets;
3499 if( !netsBefore.contains( net ) )
3500 addedNets.push_back( net );
3505 aAppendToMe->
Remove( net );
3514 board =
dynamic_cast<BOARD*
>( parser.
Parse() );
3518 revertPartialAppend();
3525 revertPartialAppend();
3534 revertPartialAppend();
3542 parser.CurLine(), parser.CurLineNumber(), parser.CurOffset() );
3577 const wxString& aLibPath,
bool aBestEfforts,
3578 const std::map<std::string, UTF8>* aProperties )
3580 wxDir dir( aLibPath );
3583 init( aProperties );
3591 errorMsg = ioe.
What();
3597 for(
const auto& footprint :
m_cache->GetFootprints() )
3598 aFootprintNames.Add( footprint.first );
3600 if( !errorMsg.IsEmpty() && !aBestEfforts )
3606 const wxString& aFootprintName,
3607 const std::map<std::string, UTF8>* aProperties,
3608 bool checkModified )
3610 init( aProperties );
3621 auto it =
m_cache->GetFootprints().find( aFootprintName );
3623 if( it ==
m_cache->GetFootprints().end() )
3626 return it->second->GetFootprint().get();
3631 const wxString& aFootprintName,
3632 const std::map<std::string, UTF8>* aProperties )
3634 return getFootprint( aLibraryPath, aFootprintName, aProperties,
false );
3639 const wxString& aFootprintName,
3640 const std::map<std::string, UTF8>* aProperties )
3651 return footprintFile.Exists();
3656 wxString& aFootprintNameOut,
3657 const std::map<std::string, UTF8>* aProperties )
3660 wxFFile f( aFootprintPath );
3668 f.ReadAll( &fcontents );
3670 aFootprintNameOut = wxFileName( aFootprintPath ).GetName();
3677 const wxString& aFootprintName,
3679 const std::map<std::string, UTF8>* aProperties )
3695 copy->SetParent(
nullptr );
3704 const std::map<std::string, UTF8>* aProperties )
3706 init( aProperties );
3714 wxString libPath = aLibraryPath;
3715 wxString singleFileBaseName;
3716 bool saveSingleFile =
false;
3719 wxFileName asFile( aLibraryPath );
3723 saveSingleFile =
true;
3724 libPath = asFile.GetPath();
3725 singleFileBaseName = asFile.GetName();
3729 validateCache( libPath, !aProperties || !aProperties->contains(
"skip_cache_validation" ) );
3735 const wxString msg = wxString::Format(
_(
"Library '%s' does not exist.\n"
3736 "Would you like to create it?"),
3739 if( !
Pgm().IsGUI() || wxMessageBox( msg,
_(
"Library Not Found" ), wxYES_NO | wxICON_QUESTION ) != wxYES )
3752 wxString footprintName = saveSingleFile ? singleFileBaseName
3755 wxString fpName = saveSingleFile ? singleFileBaseName
3766 THROW_IO_ERRORF(
_(
"Footprint file name '%s' is not valid." ), fn.GetFullPath() );
3768 if( fn.FileExists() && !fn.IsFileWritable() )
3769 THROW_IO_ERRORF(
_(
"Insufficient permissions to delete '%s'." ), fn.GetFullPath() );
3771 wxString fullPath = fn.GetFullPath();
3772 wxString fullName = fn.GetFullName();
3773 auto it =
m_cache->GetFootprints().find( footprintName );
3775 if( it !=
m_cache->GetFootprints().end() )
3779 m_cache->GetFootprints().erase( footprintName );
3807 wxLogTrace(
traceKicadPcbPlugin, wxT(
"Creating s-expr footprint file '%s'." ), fullPath );
3808 m_cache->GetFootprints().insert( footprintName,
3816 const wxString& aFootprintName,
3817 const std::map<std::string, UTF8>* aProperties )
3819 init( aProperties );
3824 THROW_IO_ERRORF(
_(
"Library '%s' is read only." ), aLibraryPath.GetData() );
3826 m_cache->Remove( aFootprintName );
3847 const std::map<std::string, UTF8>* aProperties )
3849 if( wxDir::Exists( aLibraryPath ) )
3850 THROW_IO_ERRORF(
_(
"Cannot overwrite library path '%s'." ), aLibraryPath.GetData() );
3852 init( aProperties );
3861 const std::map<std::string, UTF8>* aProperties )
3864 fn.SetPath( aLibraryPath );
3867 if( !fn.DirExists() )
3870 if( !fn.IsDirWritable() )
3871 THROW_IO_ERRORF(
_(
"Insufficient permissions to delete folder '%s'." ), aLibraryPath.GetData() );
3873 wxDir dir( aLibraryPath );
3875 if( dir.HasSubDirs() )
3876 THROW_IO_ERRORF(
_(
"Library folder '%s' has unexpected sub-folders." ), aLibraryPath.GetData() );
3879 if( dir.HasFiles() )
3883 wxArrayString files;
3887 for( i = 0; i < files.GetCount(); i++ )
3895 aLibraryPath.GetData() );
3899 for( i = 0; i < files.GetCount(); i++ )
3900 wxRemoveFile( files[i] );
3904 aLibraryPath.GetData() );
3908 if( !wxRmdir( aLibraryPath ) )
3909 THROW_IO_ERRORF(
_(
"Footprint library '%s' cannot be deleted." ), aLibraryPath.GetData() );
3915 wxMilliSleep( 250L );
constexpr EDA_IU_SCALE pcbIUScale
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
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
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
TEARDROP_PARAMETERS & GetTeardropParams()
Container for design settings for a BOARD object.
std::map< PCB_LAYER_ID, ZONE_LAYER_PROPERTIES > m_ZoneLayerProperties
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
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.
const NETINFO_LIST & GetNetInfo() const
EMBEDDED_FILES * GetEmbeddedFiles() override
const std::vector< wxString > & GetVariantNames() const
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 BOARD_ITEM_SET GetItemSet()
Collect every owned item (tracks, zones, generators, footprints, drawings, markers,...
const TRACKS & Tracks() const
const CONSTRAINTS & Constraints() const
Geometric constraints (#2329) owned by this board.
wxString GetVariantDescription(const wxString &aVariantName) 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.
void Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
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
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual VECTOR2I GetTextSize() const
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
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
bool GetAutoThickness() const
virtual void SetTextThickness(int aWidth)
The TextThickness is that set by the user.
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
virtual 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, std::shared_ptr< EMBEDDED_FILE > > & EmbeddedFileMap() const
Provide an iterable view of the file collection.
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.
RAII class to set and restore the fontconfig reporter.
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
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
virtual void SetLineWidth(float aLineWidth)
Set the line width.
virtual wxString GetClass() const =0
Return the class name.
wxString AsString() const
LAYER_MAPPING_HANDLER m_layer_mapping_handler
Callback to get layer mapping.
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...
static LOAD_INFO_REPORTER & GetInstance()
REPORTER & Report(const wxString &aMsg, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) override
Report a string with a given severity.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
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 wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Handle the data for a net.
const wxString & GetNetname() const
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()
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
std::optional< int > & ThermalSpokeWidth(PCB_LAYER_ID aLayer=F_Cu)
VECTOR2I & Offset(PCB_LAYER_ID aLayer)
EDA_ANGLE ThermalSpokeAngle(PCB_LAYER_ID aLayer=F_Cu) const
POST_MACHINING_PROPS & FrontPostMachining()
std::optional< int > & ThermalGap(PCB_LAYER_ID aLayer=F_Cu)
DRILL_PROPS & TertiaryDrill()
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)
DRILL_PROPS & SecondaryDrill()
POST_MACHINING_PROPS & BackPostMachining()
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
PAD_ATTRIB GetAttribute() const
const wxString & GetPinFunction() const
const wxString & GetNumber() const
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
EDA_ANGLE GetThermalSpokeAngle() const
VECTOR2I GetOffset(PCB_LAYER_ID aLayer) const
VECTOR2I GetDrillSize() 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
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
PAD_DRILL_SHAPE GetDrillShape() const
int GetChamferPositions(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalSolderPasteMargin() const
PAD_SIM_ELECTRICAL_TYPE GetSimElectricalType() const
std::optional< int > GetLocalSolderMaskMargin() const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
std::optional< int > GetLocalThermalSpokeWidthOverride() const
ZONE_CONNECTION GetLocalZoneConnection() const
CUSTOM_SHAPE_ZONE_MODE GetCustomShapeInZoneOpt() const
int GetLocalThermalGapOverride(wxString *aSource) const
PAD_SHAPE GetAnchorPadShape(PCB_LAYER_ID aLayer) const
int GetPadToDieLength() const
void Format(OUTPUTFORMATTER *aFormatter) const
Output the page class to aFormatter in s-expression form.
FLIP_DIRECTION m_FlipDirection
const VECTOR2I & GetMid() const
const VECTOR2I & GetMargin() const
Get the barcode margin (in internal units).
VECTOR2I GetPosition() const override
Get the position (center) of the barcode in internal units.
bool IsKnockout() const override
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).
A geometric constraint between board items (issue #2329).
const std::vector< CONSTRAINT_MEMBER > & GetMembers() const
std::optional< double > GetValue() const
bool IsDriving() const
A driving constraint forces its value; a reference (non-driving) one only measures it.
PCB_CONSTRAINT_TYPE GetConstraintType() const
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
DIM_ARROW_DIRECTION GetArrowDirection() const
virtual VECTOR2I GetEnd() const
bool GetSuppressZeroes() const
int GetExtensionOffset() const
virtual VECTOR2I GetStart() const
The dimension's origin is the first feature point for the dimension.
int GetArrowLength() const
bool GetOverrideTextEnabled() 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...
const std::vector< wxString > & GetParseWarnings() const
Return any non-fatal parse warnings that occurred during parsing.
void SetLayerMappingHandler(LAYER_MAPPING_HANDLER aHandler)
Handler to remap an appended board's layers onto the destination board, used on mismatch.
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,...
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 formatVariants(const BOARD *aBoard) const
formats the board variant registry
void ClearCachedFootprints(const wxString &aLibraryPath) override
Clear any cached footprint data for the given library path.
void formatSetup(const BOARD *aBoard) const
formats the board setup information
void FormatBoardToFormatter(OUTPUTFORMATTER *aOut, BOARD *aBoard, const std::map< std::string, UTF8 > *aProperties=nullptr)
Serialize a BOARD to an OUTPUTFORMATTER without file I/O or Prettify.
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 GetLibraryPosition() const
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()
EDA_ANGLE GetLibraryEllipseEndAngle() const
std::optional< int > GetLocalSolderMaskMargin() const
bool HasSolderMask() const
int GetLibraryEllipseMinorRadius() const
EDA_ANGLE GetLibraryEllipseStartAngle() const
int GetLibraryEllipseMajorRadius() const
EDA_ANGLE GetLibraryEllipseRotation() const
SHAPE_T GetLibraryShape() const
VECTOR2I GetLibraryEllipseCenter() const
VECTOR2I GetLibraryEnd() const
const SHAPE_POLY_SET & GetLibPoly() const
VECTOR2I GetLibraryStart() const
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
STROKE_PARAMS GetStroke() const override
VECTOR2I GetLibraryArcMid() const
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
EDA_ANGLE GetTextAngle() const override
int GetMarginLeft() const
int GetMarginRight() const
EDA_ANGLE GetTextAngle() const override
VECTOR2I GetTextPos() const override
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.
int OutlineCount() const
Return the number of outlines in the set.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
Simple container to manage line stroke parameters.
void SetWidth(int aWidth)
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
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
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
const THIEVING_SETTINGS & GetThievingSettings() const
bool GetDoNotAllowVias() const
ZONE_LAYER_PROPERTIES & LayerProperties(PCB_LAYER_ID aLayer)
wxString GetPlacementAreaSource() const
std::shared_ptr< SHAPE_POLY_SET > GetFilledPolysList(PCB_LAYER_ID aLayer) 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.
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.
EDA_DATA_TYPE
The type of unit.
void CollectFilesLoopSafe(const wxString &aRoot, wxArrayString &aFiles, const wxString &aFileSpec, int aFlags)
Recursively collect every file under aRoot, deduplicating subdirectories by their resolved path.
static const std::string KiCadFootprintFileExtension
const wxChar *const traceKicadPcbPlugin
Flag to enable KiCad PCB plugin debug output.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_IO_ERRORF(msg,...)
#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 FormatAngle(const EDA_ANGLE &aAngle)
Convert aAngle from board units to a string appropriate for writing to file.
KICOMMON_API std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue, EDA_DATA_TYPE aDataType=EDA_DATA_TYPE::DISTANCE)
Converts aValue from internal units to a string appropriate for writing to file.
constexpr char APPEND_PRESERVE_DESTINATION_STACKUP[]
@ 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.
@ REMOVE_EXCEPT_START_AND_END
BARCODE class definition.
bool ConstraintValueIsLength(PCB_CONSTRAINT_TYPE aType)
True if this type's value is a length in IU (serialized in mm); false for an angle in degrees.
const char * ConstraintTypeToken(PCB_CONSTRAINT_TYPE aType)
Stable file-format token for a constraint type (e.g. "parallel"). Used by serialization.
const char * ConstraintAnchorToken(CONSTRAINT_ANCHOR aAnchor)
Stable file-format token for a member anchor (e.g. "start").
@ VERTEX
An indexed rectangle corner or polygon outline vertex; pairs with CONSTRAINT_MEMBER::m_index.
Class to handle a set of BOARD_ITEMs.
bool isDefaultTeardropParameters(const TEARDROP_PARAMETERS &tdParams)
static VECTOR2I unbakeSize(const VECTOR2I &aSize, const FOOTPRINT *aParentFP)
std::string formatInternalUnits(const int aValue, const EDA_DATA_TYPE aDataType=EDA_DATA_TYPE::DISTANCE)
static int unbakeLinear(int aValue, const FOOTPRINT *aParentFP)
static VECTOR2I unbakeSizeUniform(const VECTOR2I &aSize, const FOOTPRINT *aParentFP)
#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.
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...
bool ReplaceIllegalFileNameChars(std::string &aName, int aReplaceChar)
Checks aName for illegal file name characters.
int ValueStringCompare(const wxString &strFWord, const wxString &strSWord)
Compare strings like the strcmp function but handle numbers and modifiers within the string text corr...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
One participant in a constraint: a referenced board item plus the feature of that item that participa...
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
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,...
Parameters that drive copper-thieving fill generation.
std::optional< VECTOR2I > hatching_offset
const SHAPE_LINE_CHAIN chain
wxLogTrace helper definitions.
@ PCB_CONSTRAINT_T
class PCB_CONSTRAINT, a geometric constraint between board items
@ 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