61#include <wx/mstream.h>
65using namespace PCB_KEYS_T;
69 m_filename( aFileName ),
70 m_footprint( aFootprint )
90 THROW_IO_ERROR( wxString::Format(
_(
"Cannot create footprint library '%s'." ),
96 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' is read only." ),
102 if( aFootprint && aFootprint != it->second->GetFootprint() )
107 wxString tempFileName =
109 wxFileName::CreateTempFileName( fn.
GetPath() );
130 wxMilliSleep( 250L );
135 if( !wxRenameFile( tempFileName, fn.
GetFullPath() ) )
137 wxString msg = wxString::Format(
_(
"Cannot rename temporary file '%s' to '%s'" ),
161 if( !dir.IsOpened() )
163 wxString msg = wxString::Format(
_(
"Footprint library '%s' not found." ),
175 if( dir.GetFirst( &fullName, fileSpec ) )
187 PCB_PARSER parser( &reader,
nullptr,
nullptr );
190 wxString fpName = fn.
GetName();
203 if( !cacheError.IsEmpty() )
204 cacheError += wxT(
"\n\n" );
206 cacheError += ioe.
What();
208 }
while( dir.GetNext( &fullName ) );
212 if( !cacheError.IsEmpty() )
220 FP_CACHE_FOOTPRINT_MAP::const_iterator it =
m_footprints.find( aFootprintName );
224 wxString msg = wxString::Format(
_(
"Library '%s' has no footprint '%s'." ),
231 wxString fullPath = it->second->GetFileName().GetFullPath();
233 wxRemoveFile( fullPath );
251 footprint.second->SetFilePath( aPath );
303 _(
"Internal Group Data Error" ), wxICON_ERROR,
304 wxString::Format(
_(
"Please report this bug. Error validating group "
305 "structure: %s\n\nSave anyway?" ), sanityResult ),
306 _(
"Save Anyway" ) ) )
335 std::string input =
TO_UTF8( aClipboardSourceInput );
342 return parser.
Parse();
358 switch( aItem->
Type() )
361 format(
static_cast<const BOARD*
>( aItem ), aNestLevel );
389 format(
static_cast<const PAD*
>( aItem ), aNestLevel );
415 format(
static_cast<const ZONE*
>( aItem ), aNestLevel );
419 wxFAIL_MSG( wxT(
"Cannot format item " ) + aItem->
GetClass() );
453 aIsKnockout ?
" knockout" :
"" );
458 bool aCompact,
const FOOTPRINT* aParentFP )
const
462 bool needNewline =
false;
463 int nestLevel = aNestLevel + 2;
466 for(
int ii = 0; ii < outline.
PointCount(); ++ii )
479 m_out->
Print( nestLevel,
"(arc (start %s) (mid %s) (end %s))",
495 if( !( shapesAdded % 4 ) || !aCompact )
516 m_out->
Print( aNestLevel,
"(render_cache %s %s\n",
532 callback_gal.DrawGlyphs( *cache );
551 m_out->
Print( aNestLevel+1,
"(pad_to_mask_clearance %s)\n",
556 m_out->
Print( aNestLevel+1,
"(solder_mask_min_width %s)\n",
562 m_out->
Print( aNestLevel+1,
"(pad_to_paste_clearance %s)\n",
568 m_out->
Print( aNestLevel+1,
"(pad_to_paste_clearance_ratio %s)\n",
574 m_out->
Print( aNestLevel+1,
"(allow_soldermask_bridges_in_footprints yes)\n" );
581 m_out->
Print( aNestLevel+1,
"(aux_axis_origin %s %s)\n",
590 m_out->
Print( aNestLevel+1,
"(grid_origin %s %s)\n",
608 m_out->
Print( aNestLevel+1,
"(thickness %s)\n",
612 m_out->
Print( aNestLevel+1,
"(legacy_teardrops)\n" );
631 m_out->
Print( aNestLevel+1,
"(%d %s %s", layer,
678 m_out->
Print( aNestLevel+1,
"(%d %s user", layer,
709 for(
const std::pair<const wxString, wxString>& prop : aBoard->
GetProperties() )
711 m_out->
Print( aNestLevel,
"(property %s %s)\n",
756 int aNestLevel )
const
758 m_out->
Print( aNestLevel,
"(teardrops%s%s%s (best_length_ratio %s) (max_length %s) "
759 "(best_width_ratio %s) (max_width %s) (curve_points %d) "
760 "(filter_ratio %s))\n",
775 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_footprints( aBoard->
Footprints().begin(),
777 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_drawings( aBoard->
Drawings().begin(),
779 std::set<PCB_TRACK*, PCB_TRACK::cmp_tracks> sorted_tracks( aBoard->
Tracks().begin(),
781 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_zones( aBoard->
Zones().begin(),
782 aBoard->
Zones().end() );
783 std::set<BOARD_ITEM*, BOARD_ITEM::ptr_cmp> sorted_groups( aBoard->
Groups().begin(),
788 for(
BOARD_ITEM* footprint : sorted_footprints )
790 Format( footprint, aNestLevel );
796 Format( item, aNestLevel );
798 if( sorted_drawings.size() )
805 Format( track, aNestLevel );
807 if( sorted_tracks.size() )
811 for(
auto zone : sorted_zones )
812 Format( zone, aNestLevel );
845 wxFAIL_MSG( wxT(
"Cannot format unknown dimension type!" ) );
853 m_out->
Print( aNestLevel+1,
"(pts (xy %s %s) (xy %s %s))\n",
867 m_out->
Print( aNestLevel+1,
"(leader_length %s)\n",
873 m_out->
Print( aNestLevel+1,
"(orientation %d)\n",
874 static_cast<int>(
ortho->GetOrientation() ) );
879 format(
static_cast<const PCB_TEXT*
>( aDimension ), aNestLevel + 1 );
881 m_out->
Print( aNestLevel + 1,
"(format (prefix %s) (suffix %s) (units %d) (units_format %d) (precision %d)",
900 m_out->
Print( aNestLevel+1,
"(style (thickness %s) (arrow_length %s) (text_position_mode %d)",
929 std::string prefix = parentFP ?
"fp" :
"gr";
934 case SHAPE_T::SEGMENT:
935 m_out->
Print( aNestLevel,
"(%s_line%s (start %s) (end %s)\n",
942 case SHAPE_T::RECTANGLE:
943 m_out->
Print( aNestLevel,
"(%s_rect%s (start %s) (end %s)\n",
950 case SHAPE_T::CIRCLE:
951 m_out->
Print( aNestLevel,
"(%s_circle%s (center %s) (end %s)\n",
959 m_out->
Print( aNestLevel,
"(%s_arc%s (start %s) (mid %s) (end %s)\n",
980 wxFAIL_MSG( wxT(
"Cannot format invalid polygon." ) );
986 case SHAPE_T::BEZIER:
987 m_out->
Print( aNestLevel,
"(%s_curve%s (pts (xy %s) (xy %s) (xy %s) (xy %s))\n",
1004 if( ( aShape->
GetShape() == SHAPE_T::POLY )
1005 || ( aShape->
GetShape() == SHAPE_T::RECTANGLE )
1006 || ( aShape->
GetShape() == SHAPE_T::CIRCLE ) )
1024 wxCHECK_RET( aBitmap !=
nullptr &&
m_out !=
nullptr,
"" );
1028 wxCHECK_RET(
image !=
nullptr,
"wxImage* is NULL" );
1030 m_out->
Print( aNestLevel,
"(image (at %s %s)",
1047#define MIME_BASE64_LENGTH 76
1051 while( first < out.Length() )
1066 m_out->
Print( aNestLevel,
"(target %s (at %s) (size %s)",
1067 ( aTarget->
GetShape() ) ?
"x" :
"plus",
1088 if( initial_comments )
1090 for(
unsigned i = 0; i < initial_comments->GetCount(); ++i )
1136 m_out->
Print( aNestLevel + 1,
"(descr %s)\n",
1148 m_out->
Print( aNestLevel + 1,
"(property %s %s",
1149 m_out->
Quotew( field->GetCanonicalName() ).c_str(),
1152 format( field, aNestLevel + 1 );
1165 m_out->
Print( aNestLevel + 1,
"(sheetname %s)\n",
1171 m_out->
Print( aNestLevel + 1,
"(sheetfile %s)\n",
1177 m_out->
Print( aNestLevel+1,
"(solder_mask_margin %s)\n",
1183 m_out->
Print( aNestLevel+1,
"(solder_paste_margin %s)\n",
1189 m_out->
Print( aNestLevel+1,
"(solder_paste_ratio %s)\n",
1195 m_out->
Print( aNestLevel+1,
"(clearance %s)\n",
1201 m_out->
Print( aNestLevel+1,
"(zone_connect %d)\n",
1220 m_out->
Print( 0,
" exclude_from_pos_files" );
1226 m_out->
Print( 0,
" allow_missing_courtyard" );
1232 m_out->
Print( 0,
" allow_soldermask_bridges" );
1239 m_out->
Print( aNestLevel+1,
"(private_layers" );
1243 wxString canonicalName(
LSET::Name( layer ) );
1244 m_out->
Print( 0,
" \"%s\"", canonicalName.ToStdString().c_str() );
1252 m_out->
Print( aNestLevel+1,
"(net_tie_pad_groups" );
1263 std::set<PAD*, FOOTPRINT::cmp_pads> sorted_pads( aFootprint->
Pads().begin(),
1264 aFootprint->
Pads().end() );
1265 std::set<BOARD_ITEM*, FOOTPRINT::cmp_drawings> sorted_drawings(
1268 std::set<ZONE*, FOOTPRINT::cmp_zones> sorted_zones( aFootprint->
Zones().begin(),
1269 aFootprint->
Zones().end() );
1270 std::set<BOARD_ITEM*, PCB_GROUP::ptr_cmp> sorted_groups( aFootprint->
Groups().begin(),
1271 aFootprint->
Groups().end() );
1276 Format( gr, aNestLevel+1 );
1279 for(
PAD*
pad : sorted_pads )
1284 Format( zone, aNestLevel + 1 );
1291 auto bs3D = aFootprint->
Models().begin();
1292 auto es3D = aFootprint->
Models().end();
1294 while( bs3D != es3D )
1296 if( !bs3D->m_Filename.IsEmpty() )
1300 bs3D->m_Show ?
"" :
" hide" );
1302 if( bs3D->m_Opacity != 1.0 )
1303 m_out->
Print( aNestLevel+2,
"(opacity %0.4f)", bs3D->m_Opacity );
1305 m_out->
Print( aNestLevel+2,
"(offset (xyz %s %s %s))\n",
1310 m_out->
Print( aNestLevel+2,
"(scale (xyz %s %s %s))\n",
1315 m_out->
Print( aNestLevel+2,
"(rotate (xyz %s %s %s))\n",
1334 if( aNestLevel == 0 )
1337 output +=
"(layers";
1348 LSET cu_mask = cu_all;
1352 if( ( aLayerMask & cu_mask ) == cu_mask )
1355 aLayerMask &= ~cu_all;
1357 else if( ( aLayerMask & cu_mask ) == fr_bk )
1360 aLayerMask &= ~fr_bk;
1363 if( ( aLayerMask & adhes ) == adhes )
1366 aLayerMask &= ~adhes;
1372 aLayerMask &= ~paste;
1375 if( ( aLayerMask & silks ) == silks )
1378 aLayerMask &= ~silks;
1381 if( ( aLayerMask & mask ) == mask )
1384 aLayerMask &= ~mask;
1387 if( ( aLayerMask & crt_yd ) == crt_yd )
1390 aLayerMask &= ~crt_yd;
1393 if( ( aLayerMask & fab ) == fab )
1404 if( aLayerMask[layer] )
1412 m_out->
Print( aNestLevel,
"%s)", output.c_str() );
1423 case PAD_SHAPE::CIRCLE: shape =
"circle";
break;
1424 case PAD_SHAPE::RECTANGLE: shape =
"rect";
break;
1425 case PAD_SHAPE::OVAL: shape =
"oval";
break;
1426 case PAD_SHAPE::TRAPEZOID: shape =
"trapezoid";
break;
1427 case PAD_SHAPE::CHAMFERED_RECT:
1428 case PAD_SHAPE::ROUNDRECT: shape =
"roundrect";
break;
1429 case PAD_SHAPE::CUSTOM: shape =
"custom";
break;
1439 case PAD_ATTRIB::PTH: type =
"thru_hole";
break;
1440 case PAD_ATTRIB::SMD: type =
"smd";
break;
1441 case PAD_ATTRIB::CONN: type =
"connect";
break;
1442 case PAD_ATTRIB::NPTH: type =
"np_thru_hole";
break;
1445 THROW_IO_ERROR( wxString::Format( wxT(
"unknown pad attribute: %d" ),
1449 const char*
property =
nullptr;
1453 case PAD_PROP::NONE:
break;
1454 case PAD_PROP::BGA:
property =
"pad_prop_bga";
break;
1455 case PAD_PROP::FIDUCIAL_GLBL:
property =
"pad_prop_fiducial_glob";
break;
1456 case PAD_PROP::FIDUCIAL_LOCAL:
property =
"pad_prop_fiducial_loc";
break;
1457 case PAD_PROP::TESTPOINT:
property =
"pad_prop_testpoint";
break;
1458 case PAD_PROP::HEATSINK:
property =
"pad_prop_heatsink";
break;
1459 case PAD_PROP::CASTELLATED:
property =
"pad_prop_castellated";
break;
1462 THROW_IO_ERROR( wxString::Format( wxT(
"unknown pad property: %d" ),
1489 if( (sz.
x > 0) || (sz.
y > 0) ||
1490 (shapeoffset.
x != 0) || (shapeoffset.
y != 0) )
1500 if( sz.
y > 0 && sz.
x != sz.
y )
1503 if( (shapeoffset.
x != 0) || (shapeoffset.
y != 0) )
1511 m_out->
Print( 0,
" (property %s)", property );
1519 m_out->
Print( 0,
" (remove_unused_layers)" );
1526 m_out->
Print( 0,
" (zone_layer_connections" );
1540 if( aPad->
GetShape() == PAD_SHAPE::ROUNDRECT || aPad->
GetShape() == PAD_SHAPE::CHAMFERED_RECT)
1547 if( aPad->
GetShape() == PAD_SHAPE::CHAMFERED_RECT)
1551 m_out->
Print( aNestLevel+1,
"(chamfer_ratio %s)",
1586 StrPrintf( &output,
" (pinfunction %s)",
1605 StrPrintf( &output,
" (solder_mask_margin %s)",
1611 StrPrintf( &output,
" (solder_paste_margin %s)",
1617 StrPrintf( &output,
" (solder_paste_margin_ratio %s)",
1629 StrPrintf( &output,
" (zone_connect %d)",
1635 StrPrintf( &output,
" (thermal_bridge_width %s)",
1641 if( aPad->
GetShape() == PAD_SHAPE::CIRCLE ||
1644 defaultThermalSpokeAngle =
ANGLE_45;
1649 StrPrintf( &output,
" (thermal_bridge_angle %s)",
1655 StrPrintf( &output,
" (thermal_gap %s)",
1662 m_out->
Print( aNestLevel+1,
"%s", output.c_str()+1 );
1665 if( aPad->
GetShape() == PAD_SHAPE::CUSTOM )
1671 m_out->
Print( 0,
" (clearance convexhull)" );
1691 int nested_level = aNestLevel+2;
1694 for(
const std::shared_ptr<PCB_SHAPE>& primitive : aPad->
GetPrimitives() )
1698 switch( primitive->GetShape() )
1700 case SHAPE_T::SEGMENT:
1701 if( primitive->IsProxyItem() )
1703 m_out->
Print( nested_level,
"(gr_vector (start %s) (end %s)",
1709 m_out->
Print( nested_level,
"(gr_line (start %s) (end %s)",
1715 case SHAPE_T::RECTANGLE:
1716 if( primitive->IsProxyItem() )
1718 m_out->
Print( nested_level,
"(gr_bbox (start %s) (end %s)",
1724 m_out->
Print( nested_level,
"(gr_rect (start %s) (end %s)",
1731 m_out->
Print( nested_level,
"(gr_arc (start %s) (mid %s) (end %s)",
1737 case SHAPE_T::CIRCLE:
1738 m_out->
Print( nested_level,
"(gr_circle (center %s) (end %s)",
1743 case SHAPE_T::BEZIER:
1744 m_out->
Print( nested_level,
"(gr_curve (pts (xy %s) (xy %s) (xy %s) (xy %s))",
1752 if( primitive->IsPolyShapeValid() )
1769 if( !primitive->IsProxyItem() )
1774 if( ( primitive->GetShape() == SHAPE_T::POLY )
1775 || ( primitive->GetShape() == SHAPE_T::RECTANGLE )
1776 || ( primitive->GetShape() == SHAPE_T::CIRCLE ) )
1778 m_out->
Print( 0, primitive->IsFilled() ?
" (fill yes)" :
" (fill none)" );
1807 bool isField =
dynamic_cast<const PCB_FIELD*
>( aText ) !=
nullptr;
1828 m_out->
Print( aNestLevel,
"(%s_text%s%s %s", prefix.c_str(), type.c_str(),
1829 aText->
IsLocked() ?
" locked" :
"",
1868 parentFP ?
"fp_text_box" :
"gr_text_box",
1869 aTextBox->
IsLocked() ?
" locked" :
"",
1872 if( aTextBox->
GetShape() == SHAPE_T::RECTANGLE )
1874 m_out->
Print( aNestLevel + 1,
"(start %s) (end %s)",
1878 else if( aTextBox->
GetShape() == SHAPE_T::POLY )
1933 m_out->
Print( aNestLevel,
"(group %s%s (id %s)\n",
1935 aGroup->
IsLocked() ?
" locked" :
"",
1938 m_out->
Print( aNestLevel + 1,
"(members\n" );
1940 wxArrayString memberIds;
1943 memberIds.Add( member->m_Uuid.AsString() );
1947 for(
const wxString& memberId : memberIds )
1962 const BOARD* board =
via->GetBoard();
1964 wxCHECK_RET( board !=
nullptr, wxT(
"Via has no parent." ) );
1968 via->LayerPair( &layer1, &layer2 );
1970 switch(
via->GetViaType() )
1972 case VIATYPE::THROUGH:
1975 case VIATYPE::BLIND_BURIED:
1979 case VIATYPE::MICROVIA:
1987 if(
via->IsLocked() )
2008 if(
via->GetRemoveUnconnected() )
2010 m_out->
Print( 0,
" (remove_unused_layers)" );
2012 if(
via->GetKeepStartEnd() )
2016 if(
via->GetIsFree() )
2019 if(
via->GetRemoveUnconnected() )
2021 m_out->
Print( 0,
" (zone_layer_connections" );
2042 m_out->
Print( aNestLevel,
"(arc%s (start %s) (mid %s) (end %s) (width %s)",
2053 m_out->
Print( aNestLevel,
"(segment%s (start %s) (end %s) (width %s)",
2054 aTrack->
IsLocked() ?
" locked" :
"",
2078 m_out->
Print( aNestLevel,
"(zone%s (net %d) (net_name %s)",
2079 aZone->
IsLocked() ?
" locked" :
"",
2104 case ZONE_BORDER_DISPLAY_STYLE::NO_HATCH: hatch =
"none";
break;
2105 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE: hatch =
"edge";
break;
2106 case ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_FULL: hatch =
"full";
break;
2109 m_out->
Print( 0,
" (hatch %s %s)\n", hatch.c_str(),
2118 const char* td_type;
2122 case TEARDROP_TYPE::TD_VIAPAD:
2127 case TEARDROP_TYPE::TD_TRACKEND:
2128 td_type =
"track_end";
2132 m_out->
Print( aNestLevel+1,
"(attr (teardrop (type %s)))\n", td_type );
2135 m_out->
Print( aNestLevel+1,
"(connect_pads" );
2140 case ZONE_CONNECTION::THERMAL:
2143 case ZONE_CONNECTION::THT_THERMAL:
2147 case ZONE_CONNECTION::FULL:
2151 case ZONE_CONNECTION::NONE:
2161 m_out->
Print( 0,
" (filled_areas_thickness no)" );
2168 "(keepout (tracks %s) (vias %s) (pads %s) (copperpour %s) "
2169 "(footprints %s))\n",
2184 if( aZone->
GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
2187 m_out->
Print( 0,
" (thermal_gap %s) (thermal_bridge_width %s)",
2206 THROW_IO_ERROR( wxString::Format(
_(
"unknown zone corner smoothing type %d" ),
2217 m_out->
Print( 0,
" (island_removal_mode %d) (island_area_min %s)",
2222 if( aZone->
GetFillMode() == ZONE_FILL_MODE::HATCH_PATTERN )
2225 m_out->
Print( aNestLevel+2,
"(hatch_thickness %s) (hatch_gap %s) (hatch_orientation %s)",
2233 m_out->
Print( aNestLevel+2,
"(hatch_smoothing_level %d) (hatch_smoothing_value %s)",
2239 m_out->
Print( aNestLevel+2,
"(hatch_border_algorithm %s) (hatch_min_hole_area %s)",
2250 for(
auto& chain : poly )
2252 m_out->
Print( aNestLevel + 1,
"(polygon\n" );
2263 for(
int ii = 0; ii < fv->OutlineCount(); ++ii )
2265 m_out->
Print( aNestLevel + 1,
"(filled_polygon\n" );
2266 m_out->
Print( aNestLevel + 2,
"(layer %s)\n",
2270 m_out->
Print( aNestLevel + 2,
"(island)\n" );
2285 m_ctl( aControlFlags ),
2306 unsigned lineCount = 0;
2308 if( aProgressReporter )
2310 aProgressReporter->
Report( wxString::Format(
_(
"Loading %s..." ), aFileName ) );
2321 BOARD* board =
DoLoad( reader, aAppendToMe, aProperties, aProgressReporter, lineCount );
2334 init( aProperties );
2341 board =
dynamic_cast<BOARD*
>( parser.
Parse() );
2360 parser.CurLine(), parser.CurLineNumber(), parser.CurOffset() );
2391 wxDir dir( aLibPath );
2394 init( aProperties );
2402 errorMsg = ioe.
What();
2409 aFootprintNames.Add( footprint.first );
2411 if( !errorMsg.IsEmpty() && !aBestEfforts )
2417 const wxString& aFootprintName,
2419 bool checkModified )
2423 init( aProperties );
2435 FP_CACHE_FOOTPRINT_MAP::const_iterator it = footprints.find( aFootprintName );
2437 if( it == footprints.end() )
2440 return it->second->GetFootprint();
2445 const wxString& aFootprintName,
2448 return getFootprint( aLibraryPath, aFootprintName, aProperties,
false );
2464 return footprintFile.Exists();
2472 wxFFile f( aFootprintPath );
2477 f.ReadAll( &fcontents );
2479 aFootprintNameOut = wxFileName( aFootprintPath ).GetName();
2486 const wxString& aFootprintName,
2501 copy->SetParent(
nullptr );
2514 init( aProperties );
2526 const wxString msg = wxString::Format(
_(
"Library '%s' does not exist.\n"
2527 "Would you like to create it?"),
2531 || wxMessageBox( msg,
_(
"Library Not Found" ), wxYES_NO | wxICON_QUESTION )
2540 wxString msg = wxString::Format(
_(
"Library '%s' is read only." ), aLibraryPath );
2558 THROW_IO_ERROR( wxString::Format(
_(
"Footprint file name '%s' is not valid." ),
2559 fn.GetFullPath() ) );
2562 if( fn.FileExists() && !fn.IsFileWritable() )
2564 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to delete '%s'." ),
2565 fn.GetFullPath() ) );
2568 wxString fullPath = fn.GetFullPath();
2569 wxString fullName = fn.GetFullName();
2570 FP_CACHE_FOOTPRINT_MAP::const_iterator it = footprints.find( footprintName );
2572 if( it != footprints.end() )
2575 footprints.erase( footprintName );
2576 wxRemoveFile( fullPath );
2599 wxLogTrace(
traceKicadPcbPlugin, wxT(
"Creating s-expr footprint file '%s'." ), fullPath );
2600 footprints.insert( footprintName,
2611 init( aProperties );
2618 aLibraryPath.GetData() ) );
2634 if( wxDir::Exists( aLibraryPath ) )
2636 THROW_IO_ERROR( wxString::Format(
_(
"Cannot overwrite library path '%s'." ),
2637 aLibraryPath.GetData() ) );
2642 init( aProperties );
2653 fn.SetPath( aLibraryPath );
2656 if( !fn.DirExists() )
2659 if( !fn.IsDirWritable() )
2661 THROW_IO_ERROR( wxString::Format(
_(
"Insufficient permissions to delete folder '%s'." ),
2662 aLibraryPath.GetData() ) );
2665 wxDir dir( aLibraryPath );
2667 if( dir.HasSubDirs() )
2669 THROW_IO_ERROR( wxString::Format(
_(
"Library folder '%s' has unexpected sub-folders." ),
2670 aLibraryPath.GetData() ) );
2674 if( dir.HasFiles() )
2678 wxArrayString files;
2680 wxDir::GetAllFiles( aLibraryPath, &files );
2682 for( i = 0; i < files.GetCount(); i++ )
2688 THROW_IO_ERROR( wxString::Format(
_(
"Unexpected file '%s' found in library "
2691 aLibraryPath.GetData() ) );
2695 for( i = 0; i < files.GetCount(); i++ )
2696 wxRemoveFile( files[i] );
2700 aLibraryPath.GetData() );
2704 if( !wxRmdir( aLibraryPath ) )
2706 THROW_IO_ERROR( wxString::Format(
_(
"Footprint library '%s' cannot be deleted." ),
2707 aLibraryPath.GetData() ) );
2714 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.
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.
void SetFileName(const wxString &aFileName)
const PAGE_INFO & GetPageSettings() const
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Return the type of the copper layer given by aLayer.
TITLE_BLOCK & GetTitleBlock()
FOOTPRINTS & Footprints()
const std::map< wxString, wxString > & GetProperties() const
GROUPS & Groups()
The groups must maintain the following invariants.
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
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.
bool IsModified()
Return true if the cache is not up-to-date.
long long m_cache_timestamp
void SetPath(const wxString &aPath)
FP_CACHE(PCB_PLUGIN *aOwner, const wxString &aLibraryPath)
bool IsPath(const wxString &aPath) const
Check if aPath is the same as the current cache path.
FP_CACHE_FOOTPRINT_MAP m_footprints
void Remove(const wxString &aFootprintName)
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
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.
int GetLocalClearance(wxString *aSource) const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
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
const wxString & GetPinType() const
const VECTOR2I & GetDrillSize() const
PAD_ATTRIB GetAttribute() const
ZONE_CONNECTION GetZoneConnection() const
const wxString & GetPinFunction() const
const wxString & GetNumber() const
double GetLocalSolderPasteMarginRatio() const
bool IsLocked() const override
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
int GetLocalSolderMaskMargin() const
bool GetKeepTopBottom() const
CUST_PAD_SHAPE_IN_ZONE GetCustomShapeInZoneOpt() const
const VECTOR2I & GetDelta() const
PAD_SHAPE GetShape() const
EDA_ANGLE GetOrientation() const
Return the rotation angle of the pad.
int GetThermalSpokeWidth() const
int GetLocalSolderPasteMargin() const
int GetChamferPositions() 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
Object to handle a bitmap image that can be inserted in a PCB.
VECTOR2I GetPosition() const override
const BITMAP_BASE * GetImage() 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
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.
wxString GetRequiredVersion()
Return a string representing the version of KiCad required to open this file.
bool IsValidBoardHeader()
Partially parse the input and check if it matches expected header.
void Format(OUTPUTFORMATTER *aFormatter, int aNestLevel, int aControl=0) const
A PLUGIN derivation for saving and loading Pcbnew s-expression formatted files.
void formatSetup(const BOARD *aBoard, int aNestLevel=0) const
formats the board setup information
void FootprintSave(const wxString &aLibraryPath, const FOOTPRINT *aFootprint, const STRING_UTF8_MAP *aProperties=nullptr) override
Write aFootprint to an existing library located at aLibraryPath.
BOARD * m_board
which BOARD, no ownership here
LINE_READER * m_reader
no ownership
void init(const STRING_UTF8_MAP *aProperties)
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.
bool FootprintLibDelete(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete an existing footprint library and returns true, or if library does not exist returns false,...
FP_CACHE * m_cache
Footprint library cache.
std::function< bool(wxString aTitle, int aIcon, wxString aMsg, wxString aAction)> m_queryUserCallback
void formatLayer(PCB_LAYER_ID aLayer, bool aIsKnockout=false) const
void formatPolyPts(const SHAPE_LINE_CHAIN &outline, int aNestLevel, bool aCompact, const FOOTPRINT *aParentFP=nullptr) const
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 PLUGIN implementation knows about or it can be u...
BOARD_ITEM * Parse(const wxString &aClipboardSourceInput)
void formatHeader(const BOARD *aBoard, int aNestLevel=0) const
writes everything that comes before the board_items, like settings and layers etc
void formatLayers(LSET aLayerMask, int aNestLevel=0) const
void validateCache(const wxString &aLibraryPath, bool checkModified=true)
bool CanReadBoard(const wxString &aFileName) const override
Checks if this PLUGIN can read the specified board file.
bool IsFootprintLibWritable(const wxString &aLibraryPath) override
Return true if the library at aLibraryPath is writable.
BOARD * LoadBoard(const wxString &aFileName, BOARD *aAppendToMe, const STRING_UTF8_MAP *aProperties=nullptr, PROJECT *aProject=nullptr, PROGRESS_REPORTER *aProgressReporter=nullptr) override
Load information from some input file format that this PLUGIN implementation knows about into either ...
void SetOutputFormatter(OUTPUTFORMATTER *aFormatter)
void formatRenderCache(const EDA_TEXT *aText, int aNestLevel) const
OUTPUTFORMATTER * m_out
output any Format()s to this, no ownership
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.
const STRING_UTF8_MAP * m_props
passed via Save() or Load(), no ownership, may be NULL
BOARD * DoLoad(LINE_READER &aReader, BOARD *aAppendToMe, const STRING_UTF8_MAP *aProperties, PROGRESS_REPORTER *aProgressReporter, unsigned aLineCount)
NETINFO_MAPPING * m_mapping
mapping for net codes, so only not empty net codes are stored with consecutive integers as net codes
void format(const BOARD *aBoard, int aNestLevel=0) const
void formatNetInformation(const BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
PCB_PLUGIN(int aControlFlags=CTL_FOR_BOARD)
void FootprintDelete(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr) override
Delete aFootprintName from the library at aLibraryPath.
bool FootprintExists(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties=nullptr) override
Check for the existence of a footprint.
void FootprintLibCreate(const wxString &aLibraryPath, const STRING_UTF8_MAP *aProperties=nullptr) override
Create a new empty footprint library at aLibraryPath empty.
void formatProperties(const BOARD *aBoard, int aNestLevel=0) const
formats the Nets and Netclasses
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 PL...
void formatTeardropParameters(const TEARDROP_PARAMETERS &tdParams, int aNestLevel=0) const
const FOOTPRINT * getFootprint(const wxString &aLibraryPath, const wxString &aFootprintName, const STRING_UTF8_MAP *aProperties, bool checkModified)
void formatBoardLayers(const BOARD *aBoard, int aNestLevel=0) const
formats the board layer information
void formatGeneral(const BOARD *aBoard, int aNestLevel=0) const
formats the General section of the file
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
void Format(const BOARD_ITEM *aItem, int aNestLevel=0) const
Output aItem to aFormatter in s-expression format.
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.
STROKE_PARAMS GetStroke() const override
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
VECTOR2I GetPosition() const override
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual bool CanReadBoard(const wxString &aFileName) const
Checks if this PLUGIN can read the specified board file.
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.
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:
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
int GetLocalClearance(wxString *aSource) const override
Return any local clearances set in the "classic" (ie: pre-rule) system.
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_45
static constexpr EDA_ANGLE & ANGLE_90
static constexpr EDA_ANGLE & ANGLE_0
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.
Pcbnew s-expression file format parser definition.
bool isDefaultTeardropParameters(const TEARDROP_PARAMETERS &tdParams)
std::string formatInternalUnits(int aValue)
#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_TSTAMPS
Omit component time stamp (useless in library)
#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.
#define UNDEFINED_DRILL_DIAMETER
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.
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
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...
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)
@ 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_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_FIELD_T
class PCB_FIELD, text associated with a footprint property
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_BITMAP_T
class PCB_BITMAP, bitmap on a layer
@ 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_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.