53#include <wx/xml/xml.h>
54#include <wx/filename.h>
56#include <wx/wfstream.h>
57#include <wx/txtstrm.h>
95 ECOORD coord( aDistance, unit );
106 T ret = std::max( aMin, aValue );
107 return std::min( aMax, ret );
113static wxString
makeKey(
const wxString& aFirst,
const wxString& aSecond )
115 wxString key = aFirst +
'\x02' + aSecond;
163 wxXmlNode* child = aRules->GetChildren();
169 if( child->GetName() == wxT(
"param" ) )
171 const wxString&
name = child->GetAttribute( wxT(
"name" ) );
172 const wxString& value = child->GetAttribute( wxT(
"value" ) );
174 if(
name == wxT(
"psElongationLong" ) )
176 else if(
name == wxT(
"psElongationOffset" ) )
178 else if(
name == wxT(
"mvStopFrame" ) )
180 else if(
name == wxT(
"mvCreamFrame" ) )
182 else if(
name == wxT(
"mlMinStopFrame" ) )
184 else if(
name == wxT(
"mlMaxStopFrame" ) )
186 else if(
name == wxT(
"mlMinCreamFrame" ) )
188 else if(
name == wxT(
"mlMaxCreamFrame" ) )
190 else if(
name == wxT(
"srRoundness" ) )
192 else if(
name == wxT(
"srMinRoundness" ) )
194 else if(
name == wxT(
"srMaxRoundness" ) )
196 else if(
name == wxT(
"psTop" ) )
197 psTop = wxAtoi( value );
198 else if(
name == wxT(
"psBottom" ) )
200 else if(
name == wxT(
"psFirst" ) )
202 else if(
name == wxT(
"rvPadTop" ) )
204 else if(
name == wxT(
"rlMinPadTop" ) )
206 else if(
name == wxT(
"rlMaxPadTop" ) )
208 else if(
name == wxT(
"rlMinPadInner" ) )
210 else if(
name == wxT(
"rlMaxPadInner" ) )
212 else if(
name == wxT(
"rlMinPadBottom" ) )
214 else if(
name == wxT(
"rlMaxPadBottom" ) )
216 else if(
name == wxT(
"rvViaOuter" ) )
218 else if(
name == wxT(
"rlMinViaOuter" ) )
220 else if(
name == wxT(
"rlMaxViaOuter" ) )
222 else if(
name == wxT(
"mdWireWire" ) )
226 child = child->GetNext();
239 m_timestamp( wxDateTime::Now().GetValue().GetValue() )
241 using namespace std::placeholders;
283 wxFileInputStream input( aFileName );
294 wxTextInputStream
text( input );
296 for(
int i = 0; i < 8; i++ )
301 if(
text.ReadLine().Contains( wxS(
"<eagle" ) ) )
311 const unsigned PROGRESS_DELTA = 50;
332 return VECTOR2I( kz - aTextThickness, kz - aTextThickness );
337 const std::map<std::string, UTF8>* aProperties,
PROJECT* aProject )
350 m_board->SetFileName( aFileName );
353 unique_ptr<BOARD> deleter( aAppendToMe ?
nullptr :
m_board );
365 wxFileName fn = aFileName;
368 wxFFileInputStream stream( fn.GetFullPath() );
376 wxXmlDocument xmlDocument;
377 std::unique_ptr<wxXmlDocument> binDocument;
385 std::vector<uint8_t> bytes;
386 bytes.resize(
static_cast<size_t>( stream.GetLength() ) );
387 stream.Read( bytes.data(), bytes.size() );
389 if( stream.LastRead() != bytes.size() )
393 binDocument = binParser.
Parse( bytes );
394 doc = binDocument->GetRoot();
398 if( !xmlDocument.Load( stream ) )
401 doc = xmlDocument.GetRoot();
428 NETCLASS defaults( wxT(
"dummy" ) );
430 auto finishNetclass =
431 [&](
const std::shared_ptr<NETCLASS>& netclass )
435 if( !netclass->HasClearance() )
440 if( netclass->GetTrackWidth() == INT_MAX )
443 if( netclass->GetViaDiameter() == INT_MAX )
446 if( netclass->GetViaDrill() == INT_MAX )
450 std::shared_ptr<NET_SETTINGS>& netSettings = bds.
m_NetSettings;
452 finishNetclass( netSettings->GetDefaultNetclass() );
454 for(
const auto& [
name, netclass] : netSettings->GetNetclasses() )
455 finishNetclass( netclass );
457 m_board->m_LegacyNetclassesLoaded =
true;
458 m_board->m_LegacyDesignSettingsLoaded =
true;
464 fn.SetExt( wxT(
"kicad_dru" ) );
466 wxFile rulesFile( fn.GetFullPath(), wxFile::write );
471 wxASSERT(
m_xpath->Contents().size() == 0 );
482 LSET enabledLayers =
m_board->GetDesignSettings().GetEnabledLayers();
484 for(
const auto& [eagleLayerName, layer] :
m_layer_map )
487 enabledLayers.
set( layer );
490 m_board->GetDesignSettings().SetEnabledLayers( enabledLayers );
501 std::vector<FOOTPRINT*> retval;
504 retval.push_back(
static_cast<FOOTPRINT*
>( footprint->Clone() ) );
540 wxXmlNode* drawing =
MapChildren( aDoc )[
"drawing"];
543 wxXmlNode* board = drawingChildren[
"board"];
546 auto count_children =
547 [
this]( wxXmlNode* aNode )
551 wxXmlNode* child = aNode->GetChildren();
556 child = child->GetNext();
561 wxXmlNode* designrules = boardChildren[
"designrules"];
562 wxXmlNode* layers = drawingChildren[
"layers"];
563 wxXmlNode* plain = boardChildren[
"plain"];
564 wxXmlNode* classes = boardChildren[
"classes"];
565 wxXmlNode* signals = boardChildren[
"signals"];
566 wxXmlNode* libs = boardChildren[
"libraries"];
567 wxXmlNode* elems = boardChildren[
"elements"];
574 count_children( designrules );
575 count_children( layers );
576 count_children( plain );
577 count_children( signals );
578 count_children( elems );
583 libs = libs->GetNext();
587 libs = boardChildren[
"libraries"];
590 m_xpath->push(
"eagle.drawing" );
629 m_xpath->push(
"designrules" );
648 wxXmlNode* layerNode = aLayers->GetChildren();
655 ELAYER elayer( layerNode );
661 cu.push_back( elayer );
663 layerNode = layerNode->GetNext();
667 int ki_layer_count = 0;
669 for(
EITER it = cu.begin(); it != cu.end(); ++it, ++ki_layer_count )
671 if( ki_layer_count == 0 )
675 else if( ki_layer_count ==
int( cu.size()-1 ) )
689 m_board->SetCopperLayerCount( cu.size() );
691 for(
EITER it = cu.begin(); it != cu.end(); ++it )
698 m_board->SetLayerName( layer, it->name );
708#define DIMENSION_PRECISION DIM_PRECISION::X_XX
713 std::map<int, std::tuple<GR_TEXT_V_ALIGN_T, GR_TEXT_H_ALIGN_T>> alignmentmap{
724 return alignmentmap[aAlign];
730 std::map<std::tuple<GR_TEXT_V_ALIGN_T, GR_TEXT_H_ALIGN_T>,
int> alignmentmap{
741 return alignmentmap[aAlign];
746 double aElementDegrees = 0.0,
bool aElementMirror =
false,
747 bool aElementSpin =
false )
751 int align{ aTxtAlign };
753 bool spin = aTxtSpin != aElementSpin;
754 bool mirror = aTxtMirror != aElementMirror;
757 double degrees = ( aTxtMirror ? -1.0 : 1.0 ) * textDefDegrees + elementDegrees;
762 if( ( !aTxtMirror && degrees > 90 && degrees <= 270 ) || ( aTxtMirror && degrees >= 90 && degrees < 270 ) )
765 degrees = degrees - 180;
790 wxXmlNode* gr = aGraphics->GetChildren();
797 wxString grName = gr->GetName();
799 if( grName == wxT(
"wire" ) )
816 width =
m_board->GetDesignSettings().GetLineThickness( layer );
842 else if( grName == wxT(
"text" ) )
877 else if( grName == wxT(
"circle" ) )
896 int outlineRadius =
radius + ( width / 2 );
902 VECTOR2I rotatedPoint( outlineRadius, 0 );
910 int innerRadius =
radius - ( width / 2 );
916 VECTOR2I rotatedPoint( innerRadius, 0 );
943 else if( grName == wxT(
"rectangle" ) )
976 const int outlineIdx = -1;
995 else if( grName == wxT(
"hole" ) )
1005 footprint->
SetReference( wxString::Format( wxT(
"UNK_HOLE_%d" ), hole_count ) );
1008 LIB_ID fpid( wxEmptyString, wxString::Format( wxT(
"dummyfp%d" ), hole_count ) );
1015 else if( grName == wxT(
"frame" ) )
1019 else if( grName == wxT(
"polygon" ) )
1025 else if( grName == wxT(
"dimension" ) )
1059 dimension->
SetEnd( pt2 );
1094 int newY = ( pt1.
y + pt2.
y ) / 2;
1100 int newX = ( pt1.
x + pt2.
x ) / 2;
1111 dimension->
SetEnd( pt2 );
1121 if(
abs( pt1.
x - pt2.
x ) < 50000 )
1123 int offset = pt3.
x - pt1.
x;
1130 else if(
abs( pt1.
y - pt2.
y ) < 50000 )
1132 int offset = pt3.
y - pt1.
y;
1165 wxString urn = aLib->GetAttribute(
"urn" );
1174 if( !urn.IsEmpty() )
1175 libraryUrn.
Parse( urn );
1178 wxXmlNode* packages =
MapChildren( aLib )[
"packages"];
1197 libKey += wxS(
"_" ) + libraryUrn.
assetId;
1205 wxXmlNode*
package = packages->GetChildren();
1211 m_xpath->push(
"package",
"name" );
1213 wxString pack_ref = package->GetAttribute(
"name" );
1217 m_xpath->Value( pack_ref.ToUTF8() );
1219 wxString key = aLibName ?
makeKey( libKey, pack_ref ) : pack_ref;
1224 auto r =
m_templates.insert( { key, footprint } );
1235 package = package->GetNext();
1247 m_xpath->push(
"libraries.library",
"name" );
1250 wxXmlNode*
library = aLibs->GetChildren();
1254 const wxString& lib_name =
library->GetAttribute(
"name" );
1256 m_xpath->Value( lib_name.c_str() );
1270 m_xpath->push(
"elements.element",
"name" );
1274 bool refanceNamePresetInPackageLayout;
1275 bool valueNamePresetInPackageLayout;
1278 wxXmlNode* element = aElements->GetChildren();
1284 if( element->GetName() != wxT(
"element" ) )
1287 element = element->GetNext();
1294 EATTR* nameAttr =
nullptr;
1295 EATTR* valueAttr =
nullptr;
1325 const ENET* enet = &ni->second;
1330 refanceNamePresetInPackageLayout =
true;
1331 valueNamePresetInPackageLayout =
true;
1338 refanceNamePresetInPackageLayout =
false;
1342 if( footprint->
GetValue().size() == 0 )
1345 valueNamePresetInPackageLayout =
false;
1348 wxString reference = e.
name;
1354 if( reference.find_first_not_of(
"0123456789" ) != 0 )
1355 reference.Prepend(
"UNK" );
1359 if( reference.find_first_not_of(
"#" ) != 0 )
1360 reference.Prepend(
"UNK" );
1363 if( reference.find_last_not_of(
"0123456789" ) == (reference.Length()-1) )
1364 reference.Append(
"0" );
1372 if( valueNamePresetInPackageLayout )
1375 if( refanceNamePresetInPackageLayout )
1385 m_xpath->push(
"attribute",
"name" );
1395 wxXmlNode* attribute = element->GetChildren();
1399 if( attribute->GetName() != wxT(
"attribute" ) )
1401 attribute = attribute->GetNext();
1405 EATTR a( attribute );
1407 if( a.
name == wxT(
"NAME" ) )
1420 nameAttr->
name = reference;
1422 if( refanceNamePresetInPackageLayout )
1429 if( refanceNamePresetInPackageLayout )
1438 if( refanceNamePresetInPackageLayout )
1441 nameAttr->
name = nameAttr->
name + wxT(
" = " ) + e.
name;
1452 if( refanceNamePresetInPackageLayout )
1462 else if( a.
name == wxT(
"VALUE" ) )
1476 if( valueNamePresetInPackageLayout )
1482 if( valueNamePresetInPackageLayout )
1485 footprint->
SetValue( wxT(
"VALUE" ) );
1489 if( valueNamePresetInPackageLayout )
1503 if( valueNamePresetInPackageLayout )
1515 attribute = attribute->GetNext();
1525 element = element->GetNext();
1545 Report( wxString::Format(
_(
"Ignoring a polygon since Eagle layer '%s' (%d) was not mapped" ),
1552 std::unique_ptr<ZONE> zone = std::make_unique<ZONE>(
m_board );
1555 zone->SetLayer( layer );
1560 wxXmlNode* vertex = aPolyNode->GetChildren();
1561 std::vector<EVERTEX> vertices;
1569 if( vertex->GetName() == wxT(
"vertex" ) )
1570 vertices.emplace_back( vertex );
1572 vertex = vertex->GetNext();
1582 if( vertices.size() < 3 )
1584 Report( wxString::Format(
_(
"Skipping a polygon on layer '%s' (%d): less than 3 vertices" ),
1590 vertices.push_back( vertices[0] );
1595 for(
size_t i = 0; i < vertices.size() - 1; i++ )
1613 double delta_angle = angle / segCount;
1615 for(
double a = end_angle + angle; fabs( a - end_angle ) > fabs( delta_angle ); a -= delta_angle )
1630 Report( wxString::Format(
_(
"Skipping a polygon on layer '%s' (%d): outline count is not 1" ),
1637 zone->AddPolygon( polygon.
COutline( 0 ) );
1642 zone->SetIsRuleArea(
true );
1643 zone->SetDoNotAllowVias(
false );
1644 zone->SetDoNotAllowTracks(
false );
1645 zone->SetDoNotAllowPads(
false );
1646 zone->SetDoNotAllowFootprints(
false );
1647 zone->SetDoNotAllowZoneFills(
true );
1657 zone->SetHatchOrientation(
ANGLE_0 );
1668 zone->SetLocalClearance( 1 );
1685 zone->SetAssignedPriority( rank );
1687 ZONE* zonePtr = zone.release();
1695 const EATTR* aNameAttr,
const EATTR* aValueAttr )
1697 std::vector<std::tuple<PCB_FIELD*, double, bool, bool, const EATTR*>> textRotDefs{};
1699 std::vector<PCB_FIELD*> fields{};
1704 double defDegrees = field->GetLibTextAngle().AsDegrees();
1705 bool defMirror = field->IsMirrored();
1706 bool defSpin = !field->IsKeepUpright();
1707 const EATTR* attr =
nullptr;
1711 else if( field == &aFootprint->
Value() )
1714 textRotDefs.push_back( std::tuple<PCB_FIELD*, double, bool, bool, const EATTR*>( field, defDegrees, defMirror,
1731 for(
auto textRotDef : textRotDefs )
1734 double defDegrees{};
1737 const EATTR* attr{};
1738 std::tie( field, defDegrees, defMirror, defSpin, attr ) = textRotDef;
1739 orientFPText( aFootprint, e, field, attr, defDegrees, defMirror, defSpin );
1745 double aTextDefAngle,
bool aTextDefMirror,
bool aTextDefSpin )
1751 const EATTR& a = *aAttr;
1770 int textThickness =
KiROUND( fontz.
y * ratio / 100.0 );
1804 bool elementSpin = e.
rot ? e.
rot->
spin :
false;
1810 elementMirror, elementSpin );
1827 int adjustedPadDiameter = 0.0;
1834 if( ( padstack.
Size(
F_Cu ).
x < adjustedPadDiameter ) )
1844 adjustedPadDiameter = padstack.
Drill().
size.
x + (
m_rules->rlMinPadBottom * 2 );
1846 if( padstack.
Size(
B_Cu ).
x < adjustedPadDiameter )
1850 if(
m_rules->rlMinPadInner != 0.0 )
1856 if( !padstack.
LayerSet().test( layerId ) )
1861 if( padstack.
Size( layerId ).
x < adjustedPadDiameter )
1862 padstack.
SetSize(
VECTOR2I( adjustedPadDiameter, adjustedPadDiameter ), layerId );
1872 std::unique_ptr<FOOTPRINT> m = std::make_unique<FOOTPRINT>(
m_board );
1875 fpID.
Parse( aPkgName,
true );
1879 wxXmlNode* packageItem = aPackage->GetChildren();
1884 m.get()->Value().SetLayer( layer );
1886 while( packageItem )
1888 const wxString& itemName = packageItem->GetName();
1890 if( itemName == wxT(
"description" ) )
1893 m->SetLibDescription( descr );
1895 else if( itemName == wxT(
"wire" ) )
1897 else if( itemName == wxT(
"pad" ) )
1899 else if( itemName == wxT(
"text" ) )
1901 else if( itemName == wxT(
"rectangle" ) )
1903 else if( itemName == wxT(
"polygon" ) )
1905 else if( itemName == wxT(
"circle" ) )
1907 else if( itemName == wxT(
"hole" ) )
1909 else if( itemName == wxT(
"smd" ) )
1912 packageItem = packageItem->GetNext();
1929 Report( wxString::Format(
_(
"Ignoring a wire since Eagle layer '%s' (%d) was not mapped" ),
1988 aFootprint->
Add( dwg );
1999 std::unique_ptr<PAD>
pad = std::make_unique<PAD>( aFootprint );
2009 pad->SetDrillSize(
VECTOR2I( eagleDrillz, eagleDrillz ) );
2061 double drillz =
pad->GetDrillSize().x;
2062 double annulus = drillz *
m_rules->rvPadTop;
2064 int diameter =
KiROUND( drillz + 2 * annulus );
2072 sz.
x = ( sz.
x * ( 100 +
m_rules->psElongationLong ) ) / 100;
2077 int offset =
KiROUND( ( sz.
x - sz.
y ) / 2.0 );
2088 if(
pad->GetSizeX() > 0 &&
pad->GetSizeY() > 0 &&
pad->HasHole() )
2090 aFootprint->
Add(
pad.release() );
2097 Report( wxString::Format(
_(
"Invalid zero-sized pad ignored in\nfile: %s" ),
2100 Report( wxString::Format(
_(
"Invalid zero-sized pad ignored in\nfile: %s" ),
2113 Report( wxString::Format(
_(
"Ignoring a text since Eagle layer '%s' (%d) was not mapped" ),
2121 if( t.
text.Upper() == wxT(
">NAME" ) && aFootprint->
GetReference().IsEmpty() )
2125 textItem->
SetText( wxT(
"REF**" ) );
2127 else if( t.
text.Upper() == wxT(
">VALUE" ) && aFootprint->
GetValue().IsEmpty() )
2129 textItem = &aFootprint->
Value();
2135 textItem =
new PCB_TEXT( aFootprint );
2136 aFootprint->
Add( textItem );
2185 ZONE* zone =
new ZONE( aFootprint );
2190 const int outlineIdx = -1;
2212 Report( wxString::Format(
_(
"Ignoring a rectangle since Eagle layer '%s' (%d) was not mapped" ),
2220 aFootprint->
Add( dwg );
2226 std::vector<VECTOR2I> pts;
2231 pts.push_back( start );
2234 pts.push_back(
end );
2251 std::vector<VECTOR2I> pts;
2254 wxXmlNode* vertex = aTree->GetChildren();
2255 std::vector<EVERTEX> vertices;
2263 if( vertex->GetName() == wxT(
"vertex" ) )
2264 vertices.emplace_back( vertex );
2266 vertex = vertex->GetNext();
2272 if( vertices.size() < 3 )
2274 Report( wxString::Format(
_(
"Skipping a polygon on layer '%s' (%d): less than 3 vertices" ),
2280 vertices.push_back( vertices[0] );
2282 for(
size_t i = 0; i < vertices.size() - 1; i++ )
2305 double delta = angle / segCount;
2307 for(
double a = end_angle + angle; fabs( a - end_angle ) > fabs(
delta ); a -=
delta )
2322 ZONE* zone =
new ZONE( aFootprint );
2338 Report( wxString::Format(
_(
"Ignoring a polygon since Eagle layer '%s' (%d) was not mapped" ),
2346 aFootprint->
Add( dwg );
2372 ZONE* zone =
new ZONE( aFootprint );
2379 int outlineRadius =
radius + ( width / 2 );
2385 VECTOR2I rotatedPoint( outlineRadius, 0 );
2393 int innerRadius =
radius - ( width / 2 );
2399 VECTOR2I rotatedPoint( innerRadius, 0 );
2414 Report( wxString::Format(
_(
"Ignoring a circle since Eagle layer '%s' (%d) was not mapped" ),
2430 aFootprint->
Add( gr );
2433 switch( (
int) layer )
2475 pad->SetPosition( padpos );
2484 pad->SetDrillSize( sz );
2508 pad->SetLayer( layer );
2514 pad->SetLayerSet( front );
2515 else if( layer ==
B_Cu )
2516 pad->SetLayerSet( back );
2518 int minPadSize = std::min( padSize.
x, padSize.
y );
2522 (
int) ( minPadSize *
m_rules->srRoundness ),
2523 m_rules->srMaxRoundness * 2 );
2527 double roundRatio = (double) roundRadius / minPadSize / 2.0;
2531 roundRatio = std::fmax( *e.
roundness / 200.0, roundRatio );
2544 (
int) (
m_rules->mvCreamFrame * minPadSize ),
2551 pad->SetLayerSet(
pad->GetLayerSet().set(
F_Mask,
false ) );
2552 else if( layer ==
B_Cu )
2553 pad->SetLayerSet(
pad->GetLayerSet().set(
B_Mask,
false ) );
2560 pad->SetLayerSet(
pad->GetLayerSet().set(
F_Paste,
false ) );
2561 else if( layer ==
B_Cu )
2562 pad->SetLayerSet(
pad->GetLayerSet().set(
B_Paste,
false ) );
2577 (
int) (
m_rules->mvStopFrame * std::min( padSize.
x, padSize.
y ) ),
2585 wxCHECK( footprint, );
2595 footprint->SetParent(
nullptr );
2611 m_xpath->push(
"classes.class",
"number" );
2613 std::vector<ECLASS> eClasses;
2614 wxXmlNode* classNode = aClasses->GetChildren();
2620 ECLASS eClass( classNode );
2621 std::shared_ptr<NETCLASS> netclass;
2623 if( eClass.
name.CmpNoCase( wxT(
"default" ) ) == 0 )
2633 netclass->SetTrackWidth( INT_MAX );
2634 netclass->SetViaDiameter( INT_MAX );
2635 netclass->SetViaDrill( INT_MAX );
2637 eClasses.emplace_back( eClass );
2641 auto clearanceToDefaultIt = eClass.
clearanceMap.find( wxT(
"0" ) );
2643 if( clearanceToDefaultIt != eClass.
clearanceMap.end() )
2645 netclass->SetClearance( clearanceToDefaultIt->second.ToPcbUnits() );
2649 classNode = classNode->GetNext();
2654 for(
ECLASS& eClass : eClasses )
2656 for(
const auto& [className, pt] : eClass.clearanceMap )
2659 if( className == wxT(
"0" ) )
2665 rule.Printf( wxT(
"(rule \"class %s:%s\"\n"
2666 " (condition \"A.NetClass == '%s' && B.NetClass == '%s'\")\n"
2667 " (constraint clearance (min %smm)))\n" ),
2696 std::set<wxString> usedNetNames;
2698 for( wxXmlNode* signal = aSignals->GetChildren(); signal; signal = signal->GetNext() )
2700 wxString explicitName =
escapeName( signal->GetAttribute(
"name" ) );
2702 if( !explicitName.IsEmpty() )
2703 usedNetNames.insert( explicitName );
2706 m_xpath->push(
"signals.signal",
"name" );
2709 wxXmlNode* net = aSignals->GetChildren();
2715 wxString netName =
escapeName( net->GetAttribute(
"name" ) );
2722 if( netName.IsEmpty() )
2724 int candidate = netCode;
2728 netName = wxString::Format( wxT(
"N$%d" ), candidate++ );
2729 }
while( usedNetNames.count( netName ) );
2731 usedNetNames.insert( netName );
2735 std::shared_ptr<NETCLASS> netclass;
2737 if( net->HasAttribute(
"class" ) )
2739 auto netclassIt =
m_classMap.find( net->GetAttribute(
"class" ) );
2745 netclass = netclassIt->second;
2756 m_xpath->Value( netName.c_str() );
2759 wxXmlNode* netItem = net->GetChildren();
2764 const wxString& itemName = netItem->GetName();
2766 if( itemName == wxT(
"wire" ) )
2783 if( netclass && width < netclass->GetTrackWidth() )
2784 netclass->SetTrackWidth( width );
2794 double radiusA = ( mid -
center ).EuclideanNorm();
2795 double radiusB = ( otherMid -
center ).EuclideanNorm();
2798 std::swap( mid, otherMid );
2831 else if( itemName == wxT(
"via" ) )
2843 && layer_front_most != layer_back_most )
2857 double annulus = drillz *
m_rules->rvViaOuter;
2859 kidiam =
KiROUND( drillz + 2 * annulus );
2863 via->SetDrill( drillz );
2869 if( !v.
diam || via_width <= via->GetDrill() )
2871 double annular_width = ( via_width -
via->GetDrill() ) / 2.0;
2881 if( netclass && kidiam < netclass->GetViaDiameter() )
2882 netclass->SetViaDiameter( kidiam );
2887 if( netclass && drillz < netclass->GetViaDrill() )
2888 netclass->SetViaDrill( drillz );
2893 if( layer_front_most ==
F_Cu && layer_back_most ==
B_Cu )
2897 else if( layer_front_most ==
F_Cu || layer_back_most ==
B_Cu )
2908 via->SetLayerPair( layer_front_most, layer_back_most );
2909 via->SetPosition( pos );
2912 via->SetNetCode( netCode );
2918 else if( itemName == wxT(
"contactref" ) )
2920 m_xpath->push(
"contactref" );
2923 const wxString& reference = netItem->GetAttribute(
"element" );
2924 const wxString&
pad = netItem->GetAttribute(
"pad" );
2932 else if( itemName == wxT(
"polygon" ) )
2937 if( zone && !zone->GetIsRuleArea() )
2938 zone->SetNetCode( netCode );
2943 netItem = netItem->GetNext();
2950 net = net->GetNext();
2958 const std::vector<INPUT_LAYER_DESC>& aInputLayerDescriptionVector )
2960 std::map<wxString, PCB_LAYER_ID> layer_map;
2965 layer_map.emplace( layer.Name, layerId );
2974 std::vector<INPUT_LAYER_DESC> inputDescs;
2976 for (
const std::pair<const int, ELAYER>& layerPair :
m_eagleLayers )
2978 const ELAYER& eLayer = layerPair.second;
2989 inputDescs.push_back( layerDesc );
3020 bool aIsLibraryCache )
const
3029 if( copperLayer >= 0 )
3030 copperLayers[copperLayer] =
true;
3037 bool required =
false;
3038 LSET permittedLayers;
3040 permittedLayers.
set();
3043 switch( aEagleLayer )
3176 if( aIsLibraryCache )
3184 return {
PCB_LAYER_ID( kiLayer ), permittedLayers, required };
3190 static const wxString
unknown(
"unknown" );
3198 static const int unknown = -1;
3211 if(
auto it =
m_props->find(
"page_width" ); it !=
m_props->end() )
3212 page_width = it->second;
3214 if(
auto it =
m_props->find(
"page_height" ); it !=
m_props->end() )
3215 page_height = it->second;
3217 if( !page_width.
empty() && !page_height.
empty() )
3221 int w = atoi( page_width.
c_str() );
3222 int h = atoi( page_height.
c_str() );
3224 int desired_x = ( w - bbbox.
GetWidth() ) / 2;
3225 int desired_y = ( h - bbbox.
GetHeight() ) / 2;
3227 VECTOR2I movementVector{ desired_x - bbbox.
GetX(), desired_y - bbbox.
GetY() };
3228 m_board->Move( movementVector );
3243 if( aPath.IsEmpty() )
3244 return wxDateTime::Now().GetValue().GetValue();
3246 wxFileName fn( aPath );
3248 if( fn.IsFileReadable() && fn.GetModificationTime().IsValid() )
3249 return fn.GetModificationTime().GetValue().GetValue();
3278 string filename = (
const char*) aLibPath.char_str( wxConvFile );
3281 wxFileName fn( filename );
3282 wxFFileInputStream stream( fn.GetFullPath() );
3283 wxXmlDocument xmlDocument;
3285 if( !stream.IsOk() || !xmlDocument.Load( stream ) )
3288 doc = xmlDocument.GetRoot();
3290 wxXmlNode* drawing =
MapChildren( doc )[
"drawing"];
3296 m_xpath->push(
"eagle.drawing.layers" );
3297 wxXmlNode* layers = drawingChildren[
"layers"];
3302 m_xpath->push(
"eagle.drawing.library" );
3303 wxXmlNode*
library = drawingChildren[
"library"];
3337 bool aBestEfforts,
const std::map<std::string, UTF8>* aProperties )
3341 init( aProperties );
3349 errorMsg = ioe.
What();
3356 aFootprintNames.Add(
name );
3358 if( !errorMsg.IsEmpty() && !aBestEfforts )
3364 bool aKeepUUID,
const std::map<std::string, UTF8>* aProperties )
3366 init( aProperties );
3375 copy->SetParent(
nullptr );
3382 int minLayerCount = 2;
3384 std::map<wxString, PCB_LAYER_ID>::const_iterator it;
3395 if( ( ordinal + 2 ) > minLayerCount )
3396 minLayerCount = ordinal + 2;
3402 if( ( minLayerCount % 2 ) != 0 )
3405 return minLayerCount;
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
#define DEFAULT_SILK_LINE_WIDTH
#define DEFAULT_EDGE_WIDTH
#define DEFAULT_LINE_WIDTH
#define DEFAULT_COURTYARD_WIDTH
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
BASE_SET & set(size_t pos)
virtual bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Container for design settings for a BOARD object.
std::shared_ptr< NET_SETTINGS > m_NetSettings
void SetGridOrigin(const VECTOR2I &aOrigin)
const VECTOR2I & GetGridOrigin() const
void SetAuxOrigin(const VECTOR2I &aOrigin)
const VECTOR2I & GetAuxOrigin() const
VECTOR2I GetTextSize(PCB_LAYER_ID aLayer) const
Return the default text size from the layer class for the given layer.
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
int m_ViasMinAnnularWidth
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
FOOTPRINT * GetParentFootprint() const
Information pertinent to a Pcbnew printed circuit board.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr size_type GetHeight() const
Read-only parser for the pre-v6 binary Eagle .brd format.
std::unique_ptr< wxXmlDocument > Parse(const std::vector< uint8_t > &aBytes)
Parse a binary Eagle board into an XML DOM compatible with the XML walker.
static bool IsBinaryEagle(wxInputStream &aStream)
Probe the first two bytes for the binary magic.
void SetCenter(const VECTOR2I &aCenter)
SHAPE_POLY_SET & GetPolyShape()
virtual void SetFilled(bool aFlag)
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual void SetTextPos(const VECTOR2I &aPoint)
void SetMirrored(bool isMirrored)
void SetVertJustify(GR_TEXT_V_ALIGN_T aType)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
void SetKeepUpright(bool aKeepUpright)
GR_TEXT_V_ALIGN_T GetVertJustify() const
virtual void SetText(const wxString &aText)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
void SetHorizJustify(GR_TEXT_H_ALIGN_T aType)
RAII class to set and restore the fontconfig reporter.
virtual void Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED) const
virtual bool CanReadLibrary(const wxString &aFileName) const
Checks if this IO object can read the specified library file/directory.
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()
virtual void RegisterCallback(LAYER_MAPPING_HANDLER aLayerMappingHandler)
Register a different handler to be called when mapping of input layers to KiCad layers occurs.
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.
int Parse(const UTF8 &aId, bool aFix=false)
Parse LIB_ID with the information from aId.
const UTF8 & GetLibItemName() const
static LOAD_INFO_REPORTER & GetInstance()
LSET is a set of PCB_LAYER_IDs.
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 const LSET & InternalCuMask()
Return a complete set of internal copper layers which is all Cu layers except F_Cu and B_Cu.
A collection of nets and the parameters used to route or test these nets.
int GetViaDiameter() const
int GetTrackWidth() const
Handle the data for a net.
void SetNetClass(const std::shared_ptr< NETCLASS > &aNetClass)
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
void SetNetclassPatternAssignment(const wxString &pattern, const wxString &netclass)
Sets a netclass pattern assignment Calling this method will reset the effective netclass calculation ...
std::shared_ptr< NETCLASS > GetDefaultNetclass() const
Gets the default netclass for the project.
void SetNetclass(const wxString &netclassName, std::shared_ptr< NETCLASS > &netclass)
Sets the given netclass Calling user is responsible for resetting the effective netclass calculation ...
T & Get()
Return a reference to the value of the attribute assuming it is available.
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
const LSET & LayerSet() const
const VECTOR2I & Size(PCB_LAYER_ID aLayer) const
@ NORMAL
Shape is the same on all layers.
void SetSize(const VECTOR2I &aSize, PCB_LAYER_ID aLayer)
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
void SetNumber(const wxString &aNumber)
Set the pad number (note that it can be alphanumeric, such as the array reference "AA12").
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
void SetLocalZoneConnection(ZONE_CONNECTION aType)
VECTOR2I GetSize(PCB_LAYER_ID aLayer) const
void SetPosition(const VECTOR2I &aPos) override
void SetPosition(const VECTOR2I &aPos) override
void SetMid(const VECTOR2I &aMid)
virtual void SetEnd(const VECTOR2I &aPoint)
void SetUnits(EDA_UNITS aUnits)
virtual void SetStart(const VECTOR2I &aPoint)
void SetLineThickness(int aWidth)
void SetPrecision(DIM_PRECISION aPrecision)
void SetOverrideText(const wxString &aValue)
For better understanding of the points that make a dimension:
void SetHeight(int aHeight)
Set the distance from the feature points to the crossbar line.
A leader is a dimension-like object pointing to a specific point.
A radial dimension indicates either the radius or diameter of an arc or circle.
std::vector< ELAYER > ELAYERS
void packageSMD(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
Handles common pad properties.
void loadPlain(wxXmlNode *aPlain)
int m_min_trace
smallest trace we find on Load(), in BIU.
std::map< wxString, PCB_LAYER_ID > m_layer_map
Map of Eagle layers to KiCad layers.
VECTOR2I kicad_fontsize(const ECOORD &d, int aTextThickness) const
create a font size (fontz) from an eagle font size scalar and KiCad font thickness
std::map< wxString, PCB_LAYER_ID > DefaultLayerMappingCallback(const std::vector< INPUT_LAYER_DESC > &aInputLayerDescriptionVector)
Return the automapped layers.
bool checkHeader(const wxString &aFileName) const
void loadElements(wxXmlNode *aElements)
FOOTPRINT * makeFootprint(wxXmlNode *aPackage, const wxString &aPkgName)
Create a FOOTPRINT from an Eagle package.
int m_min_hole
smallest diameter hole we find on Load(), in BIU.
std::vector< FOOTPRINT * > GetImportedCachedLibraryFootprints() override
Return a container with the cached library footprints generated in the last call to Load.
XPATH * m_xpath
keeps track of what we are working on within XML document during a Load().
unsigned m_totalCount
for progress reporting
void cacheLib(const wxString &aLibraryPath)
This PLUGIN only caches one footprint library, this determines which one.
int m_hole_count
generates unique footprint names from eagle "hole"s.
std::map< wxString, FOOTPRINT * > m_templates
is part of a FOOTPRINT factory that operates using copy construction.
std::map< wxString, int > m_eagleLayersIds
Eagle layer ids stored by layer name.
void mapEagleLayersToKicad(bool aIsLibraryCache=false)
Generate mapping between Eagle and KiCad layers.
std::map< wxString, std::shared_ptr< NETCLASS > > m_classMap
std::tuple< PCB_LAYER_ID, LSET, bool > defaultKicadLayer(int aEagleLayer, bool aIsLibraryCache=false) const
Get the default KiCad layer corresponding to an Eagle layer of the board, a set of sensible layer map...
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 ...
void adjustFootprintForDesignRules(FOOTPRINT *aFootprint)
Reconcile all required footprint design rule adjustments.
void loadLibraries(wxXmlNode *aLibs)
void init(const std::map< std::string, UTF8 > *aProperties)
initialize PLUGIN like a constructor would, and futz with fresh BOARD if needed.
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...
int eagle_layer_id(const wxString &aLayerName) const
Get Eagle layer number by its name.
void loadAllSections(wxXmlNode *aDocument)
bool CanReadFootprint(const wxString &aFileName) const override
Checks if this PCB_IO can read a footprint from specified file or directory.
void packageWire(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
bool CanReadBoard(const wxString &aFileName) const override
Checks if this PCB_IO can read the specified board file.
const wxString & eagle_layer_name(int aLayer) const
Get Eagle layer name by its number.
ELAYERS::const_iterator EITER
void packageRectangle(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
int kicad_y(const ECOORD &y) const
Convert an Eagle distance to a KiCad distance.
void loadClasses(wxXmlNode *aClasses)
std::map< int, ELAYER > m_eagleLayers
Eagle layer data stored by layer number.
NET_MAP m_pads_to_nets
net list
void packageText(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
int getMinimumCopperLayerCount() const
Determines the minimum copper layer stackup count that includes all mapped layers.
void packageHole(FOOTPRINT *aFootprint, wxXmlNode *aTree, bool aCenter) const
void packagePolygon(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
void centerBoard()
move the BOARD into the center of the page
unsigned m_lastProgressCount
int m_cu_map[17]
map eagle to KiCad, cu layers only.
ZONE * loadPolygon(wxXmlNode *aPolyNode)
Load a copper or keepout polygon and adds it to the board.
int m_min_via
smallest via we find on Load(), in BIU.
bool CanReadLibrary(const wxString &aFileName) const override
Checks if this IO object can read the specified library file/directory.
void packageCircle(FOOTPRINT *aFootprint, wxXmlNode *aTree) const
void loadLibrary(wxXmlNode *aLib, const wxString *aLibName)
Load the Eagle "library" XML element, which can occur either under a "libraries" element (if a *....
void packagePad(FOOTPRINT *aFootprint, wxXmlNode *aTree)
void loadSignals(wxXmlNode *aSignals)
ERULES * m_rules
Eagle design rules.
PCB_LAYER_ID kicad_layer(int aLayer) const
Convert an Eagle layer to a KiCad layer.
void orientFootprintAndText(FOOTPRINT *aFootprint, const EELEMENT &e, const EATTR *aNameAttr, const EATTR *aValueAttr)
long long GetLibraryTimestamp(const wxString &aLibraryPath) const override
Generate a timestamp representing all the files in the library (including the library directory).
int m_min_annulus
smallest via annulus we find on Load(), in BIU.
void loadLayerDefs(wxXmlNode *aLayers)
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 setKeepoutSettingsToZone(ZONE *aZone, int aLayer) const
void transferPad(const EPAD_COMMON &aEaglePad, PAD *aPad) const
Deletes the footprint templates list.
int kicad_x(const ECOORD &x) const
void loadDesignRules(wxXmlNode *aDesignRules)
void orientFPText(FOOTPRINT *aFootprint, const EELEMENT &e, PCB_TEXT *aFPText, const EATTR *aAttr, double aTextDefAngle=0.0, bool aTextDefMirror=false, bool aTextDefSpin=false)
PROGRESS_REPORTER * m_progressReporter
optional; may be nullptr
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.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
void SetShape(SHAPE_T aShape) override
void SetEnd(const VECTOR2I &aEnd) override
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void Move(const VECTOR2I &aMoveVector) override
Move this object.
void SetStart(const VECTOR2I &aStart) override
void SetStroke(const STROKE_PARAMS &aStroke) override
void SetTextThickness(int aWidth) override
The TextThickness is that set by the user.
void SetLibTextAngle(const EDA_ANGLE &aAngle)
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true) override
virtual void SetPosition(const VECTOR2I &aPos) override
void SetTextAngle(const EDA_ANGLE &aAngle) override
VECTOR2I GetTextSize() const override
void SetEnd(const VECTOR2I &aEnd)
void SetPosition(const VECTOR2I &aPos) override
virtual void SetWidth(int aWidth)
Container for project specific data.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
Represent a set of closed polygons.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
void Inflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError, bool aSimplify=false)
Perform outline inflation/deflation.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int NewOutline()
Creates a new empty polygon in the set and returns its index.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
Simple container to manage line stroke parameters.
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
const char * c_str() const
double Distance(const VECTOR2< extended_type > &aVector) const
Compute the distance between two vectors.
Keep track of what we are working on within a PTREE.
Handle a list of polygons defining a copper zone.
void SetDoNotAllowPads(bool aEnable)
void SetBorderDisplayStyle(ZONE_BORDER_DISPLAY_STYLE aBorderHatchStyle, int aBorderHatchPitch, bool aRebuilBorderdHatch)
Set all hatch parameters for the zone.
virtual void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
SHAPE_POLY_SET * Outline()
void NewHole()
Create a new hole on the zone; i.e., a new contour on the zone's outline.
bool SetNetCode(int aNetCode, bool aNoAssert) override
Override that clamps the netcode to 0 when this zone is in copper-thieving fill mode.
void SetIsRuleArea(bool aEnable)
void SetDoNotAllowTracks(bool aEnable)
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
void SetLayerSet(const LSET &aLayerSet) override
void SetDoNotAllowVias(bool aEnable)
void SetDoNotAllowFootprints(bool aEnable)
bool AppendCorner(VECTOR2I aPosition, int aHoleIdx, bool aAllowDuplication=false)
Add a new corner to the zone outline (to the main outline or a hole)
void SetDoNotAllowZoneFills(bool aEnable)
static int GetDefaultHatchPitch()
@ ALLOW_ACUTE_CORNERS
just inflate the polygon. Acute angles create spikes
NODE_MAP MapChildren(wxXmlNode *aCurrentNode)
Provide an easy access to the children of an XML node via their names.
wxString escapeName(const wxString &aNetName)
Translates Eagle special characters to their counterparts in KiCad.
wxString interpretText(const wxString &aText)
Interprets special characters in Eagle text and converts them to KiCAD notation.
VECTOR2I ConvertArcCenter(const VECTOR2I &aStart, const VECTOR2I &aEnd, double aAngle)
Convert an Eagle curve end to a KiCad center for S_ARC.
wxString convertDescription(wxString aDescr)
Converts Eagle's HTML description into KiCad description format.
OPTIONAL_XML_ATTRIBUTE< wxString > opt_wxString
std::unordered_map< wxString, wxXmlNode * > NODE_MAP
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE FULL_CIRCLE
static constexpr EDA_ANGLE ANGLE_360
#define IGNORE_PARENT_GROUP
a few functions useful in geometry calculations.
int GetArcToSegmentCount(int aRadius, int aErrorMax, const EDA_ANGLE &aArcAngle)
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
#define THROW_IO_ERRORF(msg,...)
PCB_LAYER_ID BoardLayerFromLegacyId(int aLegacyId)
Retrieve a layer ID from an integer converted from a legacy (pre-V9) enum value.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
size_t CopperLayerToOrdinal(PCB_LAYER_ID aLayer)
Converts KiCad copper layer enum to an ordinal between the front and back layers.
PCB_LAYER_ID
A quick note on layer IDs:
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
KICOMMON_API wxString StringFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=false, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Return the string from aValue according to aUnits (inch, mm ...) for display.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
@ SMD
Smd pad, appears on the solder paste layer (default)
void EaglePcbTextToKiCadAlignment(EDA_TEXT *aTxt, int aTxtAlign, double aTxtDegrees, bool aTxtMirror, bool aTxtSpin, double aElementDegrees=0.0, bool aElementMirror=false, bool aElementSpin=false)
static wxString makeKey(const wxString &aFirst, const wxString &aSecond)
Assemble a two part key as a simple concatenation of aFirst and aSecond parts, using a separator.
#define DIMENSION_PRECISION
std::tuple< GR_TEXT_V_ALIGN_T, GR_TEXT_H_ALIGN_T > KiCadAlignmentFromEagle(int aAlign)
int EagleAlignmentFromKiCad(std::tuple< GR_TEXT_V_ALIGN_T, GR_TEXT_H_ALIGN_T > aAlign)
static int parseEagle(const wxString &aDistance)
Parse an eagle distance which is either mm, or mils if there is "mil" suffix.
static T eagleClamp(T aMin, T aValue, T aMax)
NET_MAP::const_iterator NET_MAP_CITER
bool ReplaceIllegalFileNameChars(std::string &aName, int aReplaceChar)
Checks aName for illegal file name characters.
wxString UnescapeHTML(const wxString &aString)
Return a new wxString unescaped from HTML format.
Parse an Eagle "attribute" XML element.
std::map< wxString, ECOORD > clearanceMap
long long int value
Value expressed in nanometers.
opt_wxString dimensionType
Structure holding common properties for through-hole and SMD pads.
Eagle polygon, without vertices which are parsed as needed.
static const int max_priority
Eagle XML rectangle in binary.
subset of eagle.drawing.board.designrules in the XML document
int psBottom
Shape of the bottom pads.
double mvStopFrame
solderpaste mask, expressed as percentage of the smaller pad/via dimension
double srRoundness
corner rounding ratio for SMD pads (percentage)
double rlMaxPadBottom
Maximum bottom layer copper annulus on through hole pads.
double rlMinViaOuter
minimum copper annulus on via
int mlMaxCreamFrame
solder paste mask, maximum size (Eagle mils, here nanometers)
int mlMinCreamFrame
solder paste mask, minimum size (Eagle mils, here nanometers)
int psTop
Shape of the top pads.
double rlMaxViaOuter
maximum copper annulus on via
void parse(wxXmlNode *aRules, std::function< void()> aCheckpoint)
percent over 100%.
double mdWireWire
wire to wire spacing I presume.
double rvPadTop
top pad size as percent of drill size
double rvViaOuter
copper annulus is this percent of via hole
double rlMinPadTop
Minimum top layer copper annulus on through hole pads.
double rlMinPadInner
Minimum inner layer copper annulus on through hole pads.
int psElongationOffset
the offset of the hole within the "long" pad.
double rlMaxPadInner
Maximum inner layer copper annulus on through hole pads.
int mlMinStopFrame
solder mask, minimum size (Eagle mils, here nanometers)
int srMinRoundness
corner rounding radius, maximum size (Eagle mils, here nanometers)
double rlMinPadBottom
Minimum bottom layer copper annulus on through hole pads.
int mlMaxStopFrame
solder mask, maximum size (Eagle mils, here nanometers)
double rlMaxPadTop
Maximum top layer copper annulus on through hole pads.
int psFirst
Shape of the first pads.
Container that parses Eagle library file "urn" definitions.
bool IsValid() const
Check if the string passed to the ctor was a valid Eagle urn.
void Parse(const wxString &aUrn)
wxString assetId
The unique asset identifier for the asset type.
int layer_back_most
< extent
opt_double curve
range is -359.9..359.9
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
Implement a simple wrapper around runtime_error to isolate the errors thrown by the Eagle XML parser.
wxString result
Test unit parsing edge cases and error handling.
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
@ GR_TEXT_H_ALIGN_INDETERMINATE
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
@ GR_TEXT_V_ALIGN_INDETERMINATE
const VECTOR2I CalcArcMid(const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aMinArcAngle=true)
Return the middle point of an arc, half-way between aStart and aEnd.
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.
double DEG2RAD(double deg)
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
VECTOR2< int32_t > VECTOR2I
ZONE_BORDER_DISPLAY_STYLE
Zone border styles.
@ THERMAL
Use thermal relief for pads.
@ FULL
pads are covered by copper
#define ZONE_THICKNESS_MIN_VALUE_MM