68#include <wx/mstream.h>
72using namespace PCB_KEYS_T;
76 m_filename( aFileName ),
77 m_footprint( aFootprint )
97 THROW_IO_ERROR( wxString::Format(
_(
"Cannot create footprint library '%s'." ),
103 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' is read only." ),
109 if( aFootprint && aFootprint != it->second->GetFootprint() )
114 wxString tempFileName =
116 wxFileName::CreateTempFileName( fn.
GetPath() );
137 wxMilliSleep( 250L );
142 if( !wxRenameFile( tempFileName, fn.
GetFullPath() ) )
144 wxString msg = wxString::Format(
_(
"Cannot rename temporary file '%s' to '%s'" ),
168 if( !dir.IsOpened() )
170 wxString msg = wxString::Format(
_(
"Footprint library '%s' not found." ),
182 if( dir.GetFirst( &fullName, fileSpec ) )
197 wxString fpName = fn.
GetName();
207 if( !cacheError.IsEmpty() )
208 cacheError += wxT(
"\n\n" );
210 cacheError += wxString::Format(
_(
"Unable to read file '%s'" ) +
'\n',
212 cacheError += ioe.
What();
214 }
while( dir.GetNext( &fullName ) );
218 if( !cacheError.IsEmpty() )
226 FP_CACHE_FOOTPRINT_MAP::const_iterator it =
m_footprints.find( aFootprintName );
230 wxString msg = wxString::Format(
_(
"Library '%s' has no footprint '%s'." ),
237 wxString fullPath = it->second->GetFileName().GetFullPath();
239 wxRemoveFile( fullPath );
257 footprint.second->SetFilePath( aPath );
308 _(
"Internal Group Data Error" ), wxICON_ERROR,
309 wxString::Format(
_(
"Please report this bug. Error validating group "
310 "structure: %s\n\nSave anyway?" ), sanityResult ),
311 _(
"Save Anyway" ) ) )
328 m_out->
Print( 0,
"(kicad_pcb (version %d) (generator \"pcbnew\") (generator_version \"%s\")\n",
342 std::string input =
TO_UTF8( aClipboardSourceInput );
349 return parser.
Parse();
365 switch( aItem->
Type() )
368 format(
static_cast<const BOARD*
>( aItem ), aNestLevel );
396 format(
static_cast<const PAD*
>( aItem ), aNestLevel );
430 format(
static_cast<const ZONE*
>( aItem ), aNestLevel );
434 wxFAIL_MSG( wxT(
"Cannot format item " ) + aItem->
GetClass() );
468 aIsKnockout ?
" knockout" :
"" );
473 bool aCompact,
const FOOTPRINT* aParentFP )
const
477 bool needNewline =
false;
478 int nestLevel = aNestLevel + 2;
481 for(
int ii = 0; ii < outline.
PointCount(); ++ii )
494 m_out->
Print( nestLevel,
"(arc (start %s) (mid %s) (end %s))",
510 if( !( shapesAdded % 4 ) || !aCompact )
531 m_out->
Print( aNestLevel,
"(render_cache %s %s\n",
547 callback_gal.DrawGlyphs( *cache );
566 m_out->
Print( aNestLevel+1,
"(pad_to_mask_clearance %s)\n",
571 m_out->
Print( aNestLevel+1,
"(solder_mask_min_width %s)\n",
577 m_out->
Print( aNestLevel+1,
"(pad_to_paste_clearance %s)\n",
583 m_out->
Print( aNestLevel+1,
"(pad_to_paste_clearance_ratio %s)\n",
594 m_out->
Print( aNestLevel+1,
"(aux_axis_origin %s %s)\n",
603 m_out->
Print( aNestLevel+1,
"(grid_origin %s %s)\n",
621 m_out->
Print( aNestLevel+1,
"(thickness %s)\n",
644 m_out->
Print( aNestLevel+1,
"(%d %s %s", layer,
691 m_out->
Print( aNestLevel+1,
"(%d %s user", layer,
722 for(
const std::pair<const wxString, wxString>& prop : aBoard->
GetProperties() )
724 m_out->
Print( aNestLevel,
"(property %s %s)\n",
769 int aNestLevel )
const
771 m_out->
Print( aNestLevel,
"(teardrops (best_length_ratio %s) (max_length %s) "
772 "(best_width_ratio %s) (max_width %s) (curve_points %d) "
792 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_footprints( aBoard->
Footprints().begin(),
794 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_drawings( aBoard->
Drawings().begin(),
796 std::set<PCB_TRACK*, PCB_TRACK::cmp_tracks> sorted_tracks( aBoard->
Tracks().begin(),
798 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_zones( aBoard->
Zones().begin(),
799 aBoard->
Zones().end() );
800 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_groups( aBoard->
Groups().begin(),
802 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_generators( aBoard->
Generators().begin(),
807 for(
BOARD_ITEM* footprint : sorted_footprints )
809 Format( footprint, aNestLevel );
815 Format( item, aNestLevel );
817 if( sorted_drawings.size() )
824 Format( track, aNestLevel );
826 if( sorted_tracks.size() )
830 for(
auto zone : sorted_zones )
831 Format( zone, aNestLevel );
839 Format( gen, aNestLevel );
865 wxFAIL_MSG( wxT(
"Cannot format unknown dimension type!" ) );
874 m_out->
Print( aNestLevel+1,
"(pts (xy %s %s) (xy %s %s))\n",
888 m_out->
Print( aNestLevel+1,
"(leader_length %s)\n",
894 m_out->
Print( aNestLevel+1,
"(orientation %d)\n",
895 static_cast<int>(
ortho->GetOrientation() ) );
900 format(
static_cast<const PCB_TEXT*
>( aDimension ), aNestLevel + 1 );
902 m_out->
Print( aNestLevel + 1,
"(format (prefix %s) (suffix %s) (units %d) (units_format %d) (precision %d)",
921 m_out->
Print( aNestLevel+1,
"(style (thickness %s) (arrow_length %s) (text_position_mode %d)",
950 std::string prefix = parentFP ?
"fp" :
"gr";
954 case SHAPE_T::SEGMENT:
955 m_out->
Print( aNestLevel,
"(%s_line (start %s) (end %s)\n",
961 case SHAPE_T::RECTANGLE:
962 m_out->
Print( aNestLevel,
"(%s_rect (start %s) (end %s)\n",
968 case SHAPE_T::CIRCLE:
969 m_out->
Print( aNestLevel,
"(%s_circle (center %s) (end %s)\n",
976 m_out->
Print( aNestLevel,
"(%s_arc (start %s) (mid %s) (end %s)\n",
989 m_out->
Print( aNestLevel,
"(%s_poly\n", prefix.c_str() );
994 wxFAIL_MSG( wxT(
"Cannot format invalid polygon." ) );
1000 case SHAPE_T::BEZIER:
1001 m_out->
Print( aNestLevel,
"(%s_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))\n",
1020 if( ( aShape->
GetShape() == SHAPE_T::POLY )
1021 || ( aShape->
GetShape() == SHAPE_T::RECTANGLE )
1022 || ( aShape->
GetShape() == SHAPE_T::CIRCLE ) )
1040 wxCHECK_RET( aBitmap !=
nullptr &&
m_out !=
nullptr,
"" );
1044 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1046 m_out->
Print( aNestLevel,
"(image (at %s %s)",
1064#define MIME_BASE64_LENGTH 76
1068 while( first < out.Length() )
1086 m_out->
Print( aNestLevel,
"(target %s (at %s) (size %s)",
1087 ( aTarget->
GetShape() ) ?
"x" :
"plus",
1108 if( initial_comments )
1110 for(
unsigned i = 0; i < initial_comments->GetCount(); ++i )
1129 m_out->
Print( 0,
" (version %d) (generator \"pcbnew\") (generator_version \"%s\")\n ",
1137 if(
const bool placed = aFootprint->
IsPlaced() )
1161 m_out->
Print( aNestLevel + 1,
"(descr %s)\n",
1173 m_out->
Print( aNestLevel + 1,
"(property %s %s",
1174 m_out->
Quotew( field->GetCanonicalName() ).c_str(),
1177 format( field, aNestLevel + 1 );
1184 m_out->
Print( aNestLevel + 1,
"(property ki_fp_filters %s)\n",
1196 m_out->
Print( aNestLevel + 1,
"(sheetname %s)\n",
1202 m_out->
Print( aNestLevel + 1,
"(sheetfile %s)\n",
1208 m_out->
Print( aNestLevel+1,
"(solder_mask_margin %s)\n",
1214 m_out->
Print( aNestLevel+1,
"(solder_paste_margin %s)\n",
1220 m_out->
Print( aNestLevel+1,
"(solder_paste_margin_ratio %s)\n",
1226 m_out->
Print( aNestLevel+1,
"(clearance %s)\n",
1232 m_out->
Print( aNestLevel+1,
"(zone_connect %d)\n",
1251 m_out->
Print( 0,
" exclude_from_pos_files" );
1257 m_out->
Print( 0,
" allow_missing_courtyard" );
1263 m_out->
Print( 0,
" allow_soldermask_bridges" );
1270 m_out->
Print( aNestLevel+1,
"(private_layers" );
1274 wxString canonicalName(
LSET::Name( layer ) );
1275 m_out->
Print( 0,
" \"%s\"", canonicalName.ToStdString().c_str() );
1283 m_out->
Print( aNestLevel+1,
"(net_tie_pad_groups" );
1294 std::set<PAD*, FOOTPRINT::cmp_pads> sorted_pads( aFootprint->
Pads().begin(),
1295 aFootprint->
Pads().end() );
1296 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> sorted_drawings(
1299 std::set<ZONE*, FOOTPRINT::cmp_zones> sorted_zones( aFootprint->
Zones().begin(),
1300 aFootprint->
Zones().end() );
1301 std::set<BOARD_ITEM*, PCB_GROUP::ptr_cmp> sorted_groups( aFootprint->
Groups().begin(),
1302 aFootprint->
Groups().end() );
1307 Format( gr, aNestLevel+1 );
1310 for(
PAD*
pad : sorted_pads )
1315 Format( zone, aNestLevel + 1 );
1322 auto bs3D = aFootprint->
Models().begin();
1323 auto es3D = aFootprint->
Models().end();
1325 while( bs3D != es3D )
1327 if( !bs3D->m_Filename.IsEmpty() )
1335 if( bs3D->m_Opacity != 1.0 )
1336 m_out->
Print( aNestLevel+2,
"(opacity %0.4f)", bs3D->m_Opacity );
1338 m_out->
Print( aNestLevel+2,
"(offset (xyz %s %s %s))\n",
1343 m_out->
Print( aNestLevel+2,
"(scale (xyz %s %s %s))\n",
1348 m_out->
Print( aNestLevel+2,
"(rotate (xyz %s %s %s))\n",
1367 if( aNestLevel == 0 )
1370 output +=
"(layers";
1381 LSET cu_mask = cu_all;
1385 if( ( aLayerMask & cu_mask ) == cu_mask )
1388 aLayerMask &= ~cu_all;
1390 else if( ( aLayerMask & cu_mask ) == fr_bk )
1393 aLayerMask &= ~fr_bk;
1396 if( ( aLayerMask & adhes ) == adhes )
1399 aLayerMask &= ~adhes;
1405 aLayerMask &= ~paste;
1408 if( ( aLayerMask & silks ) == silks )
1411 aLayerMask &= ~silks;
1414 if( ( aLayerMask & mask ) == mask )
1417 aLayerMask &= ~mask;
1420 if( ( aLayerMask & crt_yd ) == crt_yd )
1423 aLayerMask &= ~crt_yd;
1426 if( ( aLayerMask & fab ) == fab )
1437 if( aLayerMask[layer] )
1445 m_out->
Print( aNestLevel,
"%s)", output.c_str() );
1456 case PAD_SHAPE::CIRCLE: shape =
"circle";
break;
1457 case PAD_SHAPE::RECTANGLE: shape =
"rect";
break;
1458 case PAD_SHAPE::OVAL: shape =
"oval";
break;
1459 case PAD_SHAPE::TRAPEZOID: shape =
"trapezoid";
break;
1460 case PAD_SHAPE::CHAMFERED_RECT:
1461 case PAD_SHAPE::ROUNDRECT: shape =
"roundrect";
break;
1462 case PAD_SHAPE::CUSTOM: shape =
"custom";
break;
1472 case PAD_ATTRIB::PTH: type =
"thru_hole";
break;
1473 case PAD_ATTRIB::SMD: type =
"smd";
break;
1474 case PAD_ATTRIB::CONN: type =
"connect";
break;
1475 case PAD_ATTRIB::NPTH: type =
"np_thru_hole";
break;
1478 THROW_IO_ERROR( wxString::Format( wxT(
"unknown pad attribute: %d" ),
1482 const char*
property =
nullptr;
1486 case PAD_PROP::NONE:
break;
1487 case PAD_PROP::BGA:
property =
"pad_prop_bga";
break;
1488 case PAD_PROP::FIDUCIAL_GLBL:
property =
"pad_prop_fiducial_glob";
break;
1489 case PAD_PROP::FIDUCIAL_LOCAL:
property =
"pad_prop_fiducial_loc";
break;
1490 case PAD_PROP::TESTPOINT:
property =
"pad_prop_testpoint";
break;
1491 case PAD_PROP::HEATSINK:
property =
"pad_prop_heatsink";
break;
1492 case PAD_PROP::CASTELLATED:
property =
"pad_prop_castellated";
break;
1495 THROW_IO_ERROR( wxString::Format( wxT(
"unknown pad property: %d" ),
1519 if( (sz.
x > 0) || (sz.
y > 0) ||
1520 (shapeoffset.
x != 0) || (shapeoffset.
y != 0) )
1530 if( sz.
y > 0 && sz.
x != sz.
y )
1533 if( (shapeoffset.
x != 0) || (shapeoffset.
y != 0) )
1541 m_out->
Print( 0,
" (property %s)", property );
1555 m_out->
Print( 0,
" (zone_layer_connections" );
1569 if( aPad->
GetShape() == PAD_SHAPE::ROUNDRECT || aPad->
GetShape() == PAD_SHAPE::CHAMFERED_RECT)
1576 if( aPad->
GetShape() == PAD_SHAPE::CHAMFERED_RECT)
1580 m_out->
Print( aNestLevel+1,
"(chamfer_ratio %s)",
1615 StrPrintf( &output,
" (pinfunction %s)",
1634 StrPrintf( &output,
" (solder_mask_margin %s)",
1640 StrPrintf( &output,
" (solder_paste_margin %s)",
1646 StrPrintf( &output,
" (solder_paste_margin_ratio %s)",
1658 StrPrintf( &output,
" (zone_connect %d)",
1664 StrPrintf( &output,
" (thermal_bridge_width %s)",
1670 if( aPad->
GetShape() == PAD_SHAPE::CIRCLE ||
1673 defaultThermalSpokeAngle =
ANGLE_45;
1678 StrPrintf( &output,
" (thermal_bridge_angle %s)",
1684 StrPrintf( &output,
" (thermal_gap %s)",
1691 m_out->
Print( aNestLevel+1,
"%s", output.c_str()+1 );
1694 if( aPad->
GetShape() == PAD_SHAPE::CUSTOM )
1700 m_out->
Print( 0,
" (clearance convexhull)" );
1720 int nested_level = aNestLevel+2;
1723 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives() )
1727 switch( primitive->GetShape() )
1729 case SHAPE_T::SEGMENT:
1730 if( primitive->IsProxyItem() )
1732 m_out->
Print( nested_level,
"(gr_vector (start %s) (end %s)",
1738 m_out->
Print( nested_level,
"(gr_line (start %s) (end %s)",
1744 case SHAPE_T::RECTANGLE:
1745 if( primitive->IsProxyItem() )
1747 m_out->
Print( nested_level,
"(gr_bbox (start %s) (end %s)",
1753 m_out->
Print( nested_level,
"(gr_rect (start %s) (end %s)",
1760 m_out->
Print( nested_level,
"(gr_arc (start %s) (mid %s) (end %s)",
1766 case SHAPE_T::CIRCLE:
1767 m_out->
Print( nested_level,
"(gr_circle (center %s) (end %s)",
1772 case SHAPE_T::BEZIER:
1773 m_out->
Print( nested_level,
"(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
1781 if( primitive->IsPolyShapeValid() )
1798 if( !primitive->IsProxyItem() )
1803 if( ( primitive->GetShape() == SHAPE_T::POLY )
1804 || ( primitive->GetShape() == SHAPE_T::RECTANGLE )
1805 || ( primitive->GetShape() == SHAPE_T::CIRCLE ) )
1835 bool isField =
dynamic_cast<const PCB_FIELD*
>( aText ) !=
nullptr;
1856 m_out->
Print( aNestLevel,
"(%s_text%s %s", prefix.c_str(), type.c_str(),
1897 : parentFP ?
"fp_text_box"
1904 if( aTextBox->
GetShape() == SHAPE_T::RECTANGLE )
1906 m_out->
Print( aNestLevel + 1,
"(start %s) (end %s)",
1910 else if( aTextBox->
GetShape() == SHAPE_T::POLY )
1929 m_out->
Print( 0,
" (span %d %d)", cell->GetColSpan(), cell->GetRowSpan() );
1966 wxCHECK_RET( aTable !=
nullptr &&
m_out !=
nullptr,
"" );
1968 m_out->
Print( aNestLevel,
"(table (column_count %d)\n",
1976 m_out->
Print( aNestLevel + 1,
"(border (external %s) (header %s)",
1988 m_out->
Print( aNestLevel + 1,
"(separators (rows %s) (cols %s)",
2000 m_out->
Print( aNestLevel + 1,
"(column_widths" );
2002 for(
int col = 0; col < aTable->
GetColCount(); ++col )
2007 m_out->
Print( aNestLevel + 1,
"(row_heights" );
2009 for(
int row = 0; row < aTable->
GetRowCount(); ++row )
2037 m_out->
Print( aNestLevel + 1,
"(members\n" );
2039 wxArrayString memberIds;
2042 memberIds.Add( member->m_Uuid.AsString() );
2046 for(
const wxString& memberId : memberIds )
2060 m_out->
Print( aNestLevel + 1,
"(type %s) (name %s)\n",
2071 for(
const auto& [key, value] : aGenerator->
GetProperties() )
2073 if( value.CheckType<
double>() || value.CheckType<
int>() || value.CheckType<
long>()
2074 || value.CheckType<
long long>() )
2078 if( !value.GetAs( &val ) )
2081 std::string buf = fmt::format(
"{:.10g}", val );
2084 m_out->
Print( aNestLevel + 1,
"(%s %s)\n", key.c_str(), buf.c_str() );
2086 else if( value.CheckType<
bool>() )
2089 value.GetAs( &val );
2091 m_out->
Print( aNestLevel + 1,
"(%s %s)\n", key.c_str(), val ?
"yes" :
"no" );
2093 else if( value.CheckType<
VECTOR2I>() )
2096 value.GetAs( &val );
2098 m_out->
Print( aNestLevel + 1,
"(%s (xy %s))\n", key.c_str(),
2104 value.GetAs( &val );
2106 m_out->
Print( aNestLevel + 1,
"(%s (pts\n", key.c_str() );
2117 if( value.CheckType<wxString>() )
2119 value.GetAs( &val );
2121 else if( value.CheckType<std::string>() )
2124 value.GetAs( &str );
2126 val = wxString::FromUTF8( str );
2133 m_out->
Print( aNestLevel + 1,
"(members\n" );
2135 wxArrayString memberIds;
2138 memberIds.Add( member->m_Uuid.AsString() );
2142 for(
const wxString& memberId : memberIds )
2158 const BOARD* board =
via->GetBoard();
2160 wxCHECK_RET( board !=
nullptr, wxT(
"Via has no parent." ) );
2164 via->LayerPair( &layer1, &layer2 );
2166 switch(
via->GetViaType() )
2168 case VIATYPE::THROUGH:
2171 case VIATYPE::BLIND_BURIED:
2175 case VIATYPE::MICROVIA:
2201 if(
via->GetRemoveUnconnected() )
2204 via->GetRemoveUnconnected() );
2209 if(
via->IsLocked() )
2212 if(
via->GetIsFree() )
2215 if(
via->GetRemoveUnconnected() )
2217 m_out->
Print( 0,
" (zone_layer_connections" );
2238 m_out->
Print( aNestLevel,
"(arc (start %s) (mid %s) (end %s) (width %s)",
2251 m_out->
Print( aNestLevel,
"(segment (start %s) (end %s) (width %s)",
2278 m_out->
Print( aNestLevel,
"(zone (net %d) (net_name %s)",
2291 if( layers.count() > 1 )
2311 case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: hatch =
"none";
break;
2312 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE: hatch =
"edge";
break;
2313 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL: hatch =
"full";
break;
2316 m_out->
Print( 0,
" (hatch %s %s)\n", hatch.c_str(),
2325 const char* td_type;
2329 case TEARDROP_TYPE::TD_VIAPAD:
2334 case TEARDROP_TYPE::TD_TRACKEND:
2335 td_type =
"track_end";
2339 m_out->
Print( aNestLevel+1,
"(attr (teardrop (type %s)))\n", td_type );
2342 m_out->
Print( aNestLevel+1,
"(connect_pads" );
2347 case ZONE_CONNECTION::THERMAL:
2350 case ZONE_CONNECTION::THT_THERMAL:
2354 case ZONE_CONNECTION::FULL:
2358 case ZONE_CONNECTION::NONE:
2366 m_out->
Print( aNestLevel+1,
"(min_thickness %s)",
2370 m_out->
Print( 0,
" (filled_areas_thickness no)" );
2377 "(keepout (tracks %s) (vias %s) (pads %s) (copperpour %s) "
2378 "(footprints %s))\n",
2393 if( aZone->
GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
2396 m_out->
Print( 0,
" (thermal_gap %s) (thermal_bridge_width %s)",
2415 THROW_IO_ERROR( wxString::Format(
_(
"unknown zone corner smoothing type %d" ),
2426 m_out->
Print( 0,
" (island_removal_mode %d) (island_area_min %s)",
2431 if( aZone->
GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
2434 m_out->
Print( aNestLevel+2,
"(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
2442 m_out->
Print( aNestLevel+2,
"(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
2448 m_out->
Print( aNestLevel+2,
"(hatch_border_algorithm %s) (hatch_min_hole_area %s)",
2459 for(
auto& chain : poly )
2461 m_out->
Print( aNestLevel + 1,
"(polygon\n" );
2472 for(
int ii = 0; ii < fv->OutlineCount(); ++ii )
2474 m_out->
Print( aNestLevel + 1,
"(filled_polygon\n" );
2475 m_out->
Print( aNestLevel + 2,
"(layer %s)\n",
2479 m_out->
Print( aNestLevel + 2,
"(island)\n" );
2494 m_ctl( aControlFlags ),
2514 unsigned lineCount = 0;
2542 init( aProperties );
2549 board =
dynamic_cast<BOARD*
>( parser.
Parse() );
2568 parser.CurLine(), parser.CurLineNumber(), parser.CurOffset() );
2599 wxDir dir( aLibPath );
2602 init( aProperties );
2610 errorMsg = ioe.
What();
2617 aFootprintNames.Add( footprint.first );
2619 if( !errorMsg.IsEmpty() && !aBestEfforts )
2625 const wxString& aFootprintName,
2627 bool checkModified )
2631 init( aProperties );
2643 FP_CACHE_FOOTPRINT_MAP::const_iterator it = footprints.find( aFootprintName );
2645 if( it == footprints.end() )
2648 return it->second->GetFootprint();
2653 const wxString& aFootprintName,
2656 return getFootprint( aLibraryPath, aFootprintName, aProperties,
false );
2672 return footprintFile.Exists();
2680 wxFFile f( aFootprintPath );
2685 f.ReadAll( &fcontents );
2687 aFootprintNameOut = wxFileName( aFootprintPath ).GetName();
2694 const wxString& aFootprintName,
2709 copy->SetParent(
nullptr );
2722 init( aProperties );
2734 const wxString msg = wxString::Format(
_(
"Library '%s' does not exist.\n"
2735 "Would you like to create it?"),
2739 || wxMessageBox( msg,
_(
"Library Not Found" ), wxYES_NO | wxICON_QUESTION )
2748 wxString msg = wxString::Format(
_(
"Library '%s' is read only." ), aLibraryPath );
2767 THROW_IO_ERROR( wxString::Format(
_(
"Footprint file name '%s' is not valid." ),
2768 fn.GetFullPath() ) );
2771 if( fn.FileExists() && !fn.IsFileWritable() )
2773 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to delete '%s'." ),
2774 fn.GetFullPath() ) );
2777 wxString fullPath = fn.GetFullPath();
2778 wxString fullName = fn.GetFullName();
2779 FP_CACHE_FOOTPRINT_MAP::const_iterator it = footprints.find( footprintName );
2781 if( it != footprints.end() )
2784 footprints.erase( footprintName );
2785 wxRemoveFile( fullPath );
2808 wxLogTrace(
traceKicadPcbPlugin, wxT(
"Creating s-expr footprint file '%s'." ), fullPath );
2809 footprints.insert( footprintName,
2820 init( aProperties );
2827 aLibraryPath.GetData() ) );
2843 if( wxDir::Exists( aLibraryPath ) )
2845 THROW_IO_ERROR( wxString::Format(
_(
"Cannot overwrite library path '%s'." ),
2846 aLibraryPath.GetData() ) );
2851 init( aProperties );
2862 fn.SetPath( aLibraryPath );
2865 if( !fn.DirExists() )
2868 if( !fn.IsDirWritable() )
2870 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to delete folder '%s'." ),
2871 aLibraryPath.GetData() ) );
2874 wxDir dir( aLibraryPath );
2876 if( dir.HasSubDirs() )
2878 THROW_IO_ERROR( wxString::Format(
_(
"Library folder '%s' has unexpected sub-folders." ),
2879 aLibraryPath.GetData() ) );
2883 if( dir.HasFiles() )
2887 wxArrayString files;
2889 wxDir::GetAllFiles( aLibraryPath, &files );
2891 for( i = 0; i < files.GetCount(); i++ )
2897 THROW_IO_ERROR( wxString::Format(
_(
"Unexpected file '%s' found in library "
2900 aLibraryPath.GetData() ) );
2904 for( i = 0; i < files.GetCount(); i++ )
2905 wxRemoveFile( files[i] );
2909 aLibraryPath.GetData() );
2913 if( !wxRmdir( aLibraryPath ) )
2915 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' cannot be deleted." ),
2916 aLibraryPath.GetData() ) );
2923 wxMilliSleep( 250L );
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
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.
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
const wxMemoryBuffer & GetImageDataBuffer() const
wxString GetNetname() const
TEARDROP_PARAMETERS & GetTeardropParams()
Container for design settings for a BOARD object.
int GetBoardThickness() const
The full thickness of the board including copper and masks.
const VECTOR2I & GetGridOrigin()
const VECTOR2I & GetAuxOrigin()
bool m_AllowSoldermaskBridgesInFPs
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.
void SetParentGroup(PCB_GROUP *aGroup)
virtual bool IsKnockout() const
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
VECTOR2I GetFPRelativePosition() const
virtual bool IsLocked() const
Manage layers needed to make a physical board.
void FormatBoardStackup(OUTPUTFORMATTER *aFormatter, const BOARD *aBoard, int aNestLevel) const
Write the stackup info on board file.
Information pertinent to a Pcbnew printed circuit board.
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
const GENERATORS & Generators() const
void SetFileName(const wxString &aFileName)
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()
const std::map< wxString, wxString > & GetProperties() const
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
const PCB_PLOT_PARAMS & GetPlotOptions() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
bool LegacyTeardrops() const
wxString GroupsSanityCheck(bool repair=false)
Consistency check of internal m_groups structure.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const DRAWINGS & Drawings() const
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
virtual wxString GetClass() const =0
Return the class name.
const VECTOR2I & GetBezierC2() 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
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
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.
FP_CACHE_ITEM(FOOTPRINT *aFootprint, const WX_FILENAME &aFileName)
static long long GetTimestamp(const wxString &aLibPath)
Generate a timestamp representing all source files in the cache (including the parent directory).
FP_CACHE_FOOTPRINT_MAP & GetFootprints()
void Save(FOOTPRINT *aFootprint=nullptr)
Save the footprint cache or a single footprint from it to disk.
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.
FP_CACHE_FOOTPRINT_MAP m_footprints
FP_CACHE(PCB_IO_KICAD_SEXPR *aOwner, const wxString &aLibraryPath)
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.
wxString AsString() const
A logical library item identifier and consists of various portions much like a URI.
const UTF8 & GetLibItemName() const
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
static LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const wxChar * 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 ...
void SetBoard(const BOARD *aBoard)
Set a BOARD object that is used to prepare the net code map.
int Translate(int aNetCode) const
Translate net number according to the map prepared by Update() function.
PAD_PROP GetProperty() const
bool GetRemoveUnconnected() const
PAD_DRILL_SHAPE_T GetDrillShape() const
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
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 std::vector< std::shared_ptr< PCB_SHAPE > > & GetPrimitives() const
Accessor to the basic shape list for custom-shaped pads.
EDA_ANGLE GetThermalSpokeAngle() const
const VECTOR2I & GetOffset() const
bool GetKeepTopBottom() const
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() const
std::optional< int > GetLocalClearance() const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
const VECTOR2I & GetDelta() const
PAD_SHAPE GetShape() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
std::optional< int > GetLocalSolderPasteMargin() const
std::optional< int > GetLocalSolderMaskMargin() const
int GetThermalSpokeWidth() const
int GetChamferPositions() const
ZONE_CONNECTION GetLocalZoneConnection() const
double GetRoundRectRadiusRatio() const
int GetThermalGap() const
const VECTOR2I & GetSize() const
PAD_SHAPE GetAnchorPadShape() const
double GetChamferRectRatio() const
int GetPadToDieLength() const
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the page class to aFormatter in s-expression form.
const VECTOR2I & GetMid() 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
virtual const VECTOR2I & GetStart() const
The dimension's origin is the first feature point for the dimension.
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).
std::unordered_set< BOARD_ITEM * > & GetItems()
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.
bool CanReadBoard(const wxString &aFileName) const override
Checks if this PCB_IO can read the specified board file.
void formatRenderCache(const EDA_TEXT *aText, int aNestLevel) const
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 SaveBoard(const wxString &aFileName, BOARD *aBoard, const STRING_UTF8_MAP *aProperties=nullptr) override
Write aBoard to a storage file in a format that this PCB_IO implementation knows about or it can be u...
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
const FOOTPRINT * GetEnumeratedFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr) override
A version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.
void init(const STRING_UTF8_MAP *aProperties)
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
FOOTPRINT * FootprintLoad(const wxString &aLibraryPath, const wxString &aFootprintName, bool aKeepUUID=false, const STRING_UTF8_MAP *aProperties=nullptr) override
Load a footprint having aFootprintName from the aLibraryPath containing a library format that this PC...
const FOOTPRINT * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties, bool checkModified)
BOARD * LoadBoard(const wxString &aFileName, BOARD *aAppendToMe, const STRING_UTF8_MAP *aProperties=nullptr, PROJECT *aProject=nullptr) override
Load information from some input file format that this PCB_IO implementation knows about into either ...
void formatSetup(const BOARD *aBoard, int aNestLevel=0) const
formats the board setup information
void FootprintEnumerate(wxArrayString &aFootprintNames, const wxString &aLibraryPath, bool aBestEfforts, const STRING_UTF8_MAP *aProperties=nullptr) override
Return a list of footprint names contained within the library at aLibraryPath.
FP_CACHE * m_cache
Footprint library cache.
void formatPolyPts(const SHAPE_LINE_CHAIN &outline, int aNestLevel, bool aCompact, const FOOTPRINT *aParentFP=nullptr) const
void formatHeader(const BOARD *aBoard, int aNestLevel=0) const
writes everything that comes before the board_items, like settings and layers etc
void formatNetInformation(const BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
void formatProperties(const BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
void FootprintSave(const wxString &aLibraryPath, const FOOTPRINT *aFootprint, const STRING_UTF8_MAP *aProperties=nullptr) override
Write aFootprint to an existing library located at aLibraryPath.
void formatGeneral(const BOARD *aBoard, int aNestLevel=0) const
formats the General section of the file
FOOTPRINT * ImportFootprint(const wxString &aFootprintPath, wxString &aFootprintNameOut, const STRING_UTF8_MAP *aProperties=nullptr) override
Load a single footprint from aFootprintPath and put its name in aFootprintNameOut.
void Format(const BOARD_ITEM *aItem, int aNestLevel=0) const
Output aItem to aFormatter in s-expression format.
BOARD * DoLoad(LINE_READER &aReader, BOARD *aAppendToMe, const STRING_UTF8_MAP *aProperties, PROGRESS_REPORTER *aProgressReporter, unsigned aLineCount)
bool FootprintExists(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr) override
Check for the existence of a footprint.
void format(const BOARD *aBoard, int aNestLevel=0) const
std::function< bool(wxString aTitle, int aIcon, wxString aMsg, wxString aAction)> m_queryUserCallback
BOARD_ITEM * Parse(const wxString &aClipboardSourceInput)
void formatBoardLayers(const BOARD *aBoard, int aNestLevel=0) const
formats the board layer information
void FootprintDelete(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete aFootprintName from the library at aLibraryPath.
void formatTeardropParameters(const TEARDROP_PARAMETERS &tdParams, int aNestLevel=0) const
void formatLayer(PCB_LAYER_ID aLayer, bool aIsKnockout=false) const
void SetOutputFormatter(OUTPUTFORMATTER *aFormatter)
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()
LINE_READER * m_reader
no ownership
void CreateLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Create a new empty library at aLibraryPath empty.
bool DeleteLibrary(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete an existing library and returns true, or if library does not exist returns false,...
A base class that BOARD loading and saving plugins should derive from.
BOARD * m_board
The board BOARD being worked on, no ownership here.
const STRING_UTF8_MAP * m_props
Properties passed via Save() or Load(), no ownership, may be NULL.
virtual bool CanReadBoard(const wxString &aFileName) const
Checks if this PCB_IO can read the specified board file.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=0) const
Object to handle a bitmap image that can be inserted in a PCB.
VECTOR2I GetPosition() const override
const BITMAP_BASE * GetImage() const
STROKE_PARAMS GetStroke() const override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
bool StrokeColumns() const
bool StrokeExternal() const
bool StrokeHeader() 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
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
A progress reporter interface for use in multi-threaded environments.
virtual bool KeepRefreshing(bool aWait=false)=0
Update the UI (if any).
virtual void Report(const wxString &aMessage)=0
Display aMessage in the progress bar dialog.
Container for project specific data.
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.
const std::vector< VECTOR2I > & CPoints() const
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.
A name/value tuple with unique names and optional values.
void Format(OUTPUTFORMATTER *out, const EDA_IU_SCALE &aIuScale, int nestLevel) const
TEARDROP_PARAMETARS is a helper class to handle parameters needed to build teardrops for a board thes...
int m_CurveSegCount
number of segments to build the curved sides of a teardrop area must be > 2.
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.
virtual void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControlBits) const
Output the object to aFormatter in s-expression form.
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
bool GetDoNotAllowVias() const
const std::shared_ptr< SHAPE_POLY_SET > & GetFilledPolysList(PCB_LAYER_ID aLayer) const
bool GetDoNotAllowPads() 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 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.
bool GetDoNotAllowCopperPour() const
TEARDROP_TYPE GetTeardropAreaType() const
double GetHatchSmoothingValue() 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.
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 MIME_BASE64_LENGTH
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_45
static const std::string KiCadFootprintFileExtension
const wxChar *const traceKicadPcbPlugin
Flag to enable GEDA PCB plugin debug output.
#define THROW_IO_ERROR(msg)
#define THROW_PARSE_ERROR(aProblem, aSource, aInputLine, aLineNumber, aByteIndex)
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
#define UNIMPLEMENTED_FOR(type)
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)
Converts aAngle from board units to a string appropriate for writing to file.
@ CUST_PAD_SHAPE_IN_ZONE_CONVEXHULL
Class to handle a set of BOARD_ITEMs.
bool isDefaultTeardropParameters(const TEARDROP_PARAMETERS &tdParams)
std::string formatInternalUnits(int aValue)
#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 SEXPR_BOARD_FILE_VERSION
Current s-expression file format version. 2 was the last legacy format version.
#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)
boost::ptr_map< wxString, FP_CACHE_ITEM > FP_CACHE_FOOTPRINT_MAP
#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.
int StrPrintf(std::string *result, const char *format,...)
This is like sprintf() but the output is appended to a std::string instead of to a character array.
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...
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
static const char * ShowType(LAYER_T aType)
Convert a LAYER_T enum to a string representation of the layer type.
A filename or source description, a problem input line, a line number, a byte offset,...
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_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_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
Definition of file extensions used in Kicad.