Eeschema Eagle Import: Code clean-up and formatting

This commit is contained in:
Russell Oliver 2017-10-03 21:30:23 +11:00 committed by Maciej Suminski
parent 630a883f80
commit 2a0a999350
13 changed files with 182 additions and 347 deletions

View File

@ -133,65 +133,38 @@ OPTIONAL_XML_ATTRIBUTE<T> parseOptionalAttribute( wxXmlNode* aNode, string aAttr
} }
NODE_MAP MapChildren( wxXmlNode* currentNode ) NODE_MAP MapChildren( wxXmlNode* aCurrentNode )
{ {
// Map node_name -> node_pointer // Map node_name -> node_pointer
NODE_MAP nodesMap; NODE_MAP nodesMap;
// Loop through all children mapping them in nodesMap // Loop through all children mapping them in nodesMap
if( currentNode ) if( aCurrentNode )
currentNode = currentNode->GetChildren();
while( currentNode )
{
// Create a new pair in the map
// key: current node name
// value: current node pointer
nodesMap[currentNode->GetName().ToStdString()] = currentNode;
// Get next child
currentNode = currentNode->GetNext();
}
return nodesMap;
}
int CountChildren( wxXmlNode* aCurrentNode, const std::string& aName )
{
// Map node_name -> node_pointer
int count = 0;
// Loop through all children counting them if they match the given name
aCurrentNode = aCurrentNode->GetChildren(); aCurrentNode = aCurrentNode->GetChildren();
while( aCurrentNode ) while( aCurrentNode )
{ {
if( aCurrentNode->GetName().ToStdString() == aName ) // Create a new pair in the map
count++; // key: current node name
// value: current node pointer
nodesMap[aCurrentNode->GetName().ToStdString()] = aCurrentNode;
// Get next child // Get next child
aCurrentNode = aCurrentNode->GetNext(); aCurrentNode = aCurrentNode->GetNext();
} }
return count; return nodesMap;
} }
string makeKey( const string& aFirst, const string& aSecond ) unsigned long EagleTimeStamp( wxXmlNode* aTree )
{
string key = aFirst + '\x02' + aSecond;
return key;
}
unsigned long timeStamp( wxXmlNode* aTree )
{ {
// in this case from a unique tree memory location // in this case from a unique tree memory location
return (unsigned long)(void*) aTree; return (unsigned long)(void*) aTree;
} }
time_t moduleTstamp( const string& aName, const string& aValue, int aUnit ) time_t EagleModuleTstamp( const string& aName, const string& aValue, int aUnit )
{ {
std::size_t h1 = std::hash<string>{}( aName ); std::size_t h1 = std::hash<string>{}( aName );
std::size_t h2 = std::hash<string>{}( aValue ); std::size_t h2 = std::hash<string>{}( aValue );
@ -201,19 +174,7 @@ time_t moduleTstamp( const string& aName, const string& aValue, int aUnit )
} }
string modulePath( const string& aName, const string& aValue ) wxPoint ConvertArcCenter( const wxPoint& aStart, const wxPoint& aEnd, double aAngle )
{
// TODO handle subsheet
std::ostringstream s;
s << '/' << std::setfill( '0' ) << std::uppercase << std::hex << std::setw( 8 )
<< moduleTstamp( aName, aValue, 0 );
return s.str();
}
wxPoint kicad_arc_center( const wxPoint& aStart, const wxPoint& aEnd, double aAngle )
{ {
// Eagle give us start and end. // Eagle give us start and end.
// S_ARC wants start to give the center, and end to give the start. // S_ARC wants start to give the center, and end to give the start.
@ -231,27 +192,28 @@ wxPoint kicad_arc_center( const wxPoint& aStart, const wxPoint& aEnd, double aAn
return center; return center;
} }
int parseAlignment( const wxString& alignment )
static int parseAlignment( const wxString& aAlignment )
{ {
// (bottom-left | bottom-center | bottom-right | center-left | // (bottom-left | bottom-center | bottom-right | center-left |
// center | center-right | top-left | top-center | top-right) // center | center-right | top-left | top-center | top-right)
if( alignment == "center" ) if( aAlignment == "center" )
return ETEXT::CENTER; return ETEXT::CENTER;
else if( alignment == "center-right" ) else if( aAlignment == "center-right" )
return ETEXT::CENTER_RIGHT; return ETEXT::CENTER_RIGHT;
else if( alignment == "top-left" ) else if( aAlignment == "top-left" )
return ETEXT::TOP_LEFT; return ETEXT::TOP_LEFT;
else if( alignment == "top-center" ) else if( aAlignment == "top-center" )
return ETEXT::TOP_CENTER; return ETEXT::TOP_CENTER;
else if( alignment == "top-right" ) else if( aAlignment == "top-right" )
return ETEXT::TOP_RIGHT; return ETEXT::TOP_RIGHT;
else if( alignment == "bottom-left" ) else if( aAlignment == "bottom-left" )
return ETEXT::BOTTOM_LEFT; return ETEXT::BOTTOM_LEFT;
else if( alignment == "bottom-center" ) else if( aAlignment == "bottom-center" )
return ETEXT::BOTTOM_CENTER; return ETEXT::BOTTOM_CENTER;
else if( alignment == "bottom-right" ) else if( aAlignment == "bottom-right" )
return ETEXT::BOTTOM_RIGHT; return ETEXT::BOTTOM_RIGHT;
else if( alignment == "center-left" ) else if( aAlignment == "center-left" )
return ETEXT::CENTER_LEFT; return ETEXT::CENTER_LEFT;
return DEFAULT_ALIGNMENT; return DEFAULT_ALIGNMENT;

View File

@ -48,8 +48,6 @@
#include <eeschema_config.h> #include <eeschema_config.h>
#include <sch_legacy_plugin.h> #include <sch_legacy_plugin.h>
#include <sch_eagle_plugin.h> #include <sch_eagle_plugin.h>
#include <schframe.h>
#include <netlist.h>
//#define USE_SCH_LEGACY_IO_PLUGIN //#define USE_SCH_LEGACY_IO_PLUGIN
@ -634,7 +632,7 @@ bool SCH_EDIT_FRAME::ImportFile( const wxString& aFileName, int aFileType )
SCH_SHEET_LIST sheetList( g_RootSheet ); SCH_SHEET_LIST sheetList( g_RootSheet );
SCH_SCREENS schematic; SCH_SCREENS schematic;
switch( (SCH_IO_MGR::SCH_FILE_T)aFileType ) switch( (SCH_IO_MGR::SCH_FILE_T) aFileType )
{ {
case SCH_IO_MGR::SCH_EAGLE: case SCH_IO_MGR::SCH_EAGLE:
// We insist on caller sending us an absolute path, if it does not, we say it's a bug. // We insist on caller sending us an absolute path, if it does not, we say it's a bug.
@ -643,10 +641,8 @@ bool SCH_EDIT_FRAME::ImportFile( const wxString& aFileName, int aFileType )
if( !LockFile( fullFileName ) ) if( !LockFile( fullFileName ) )
{ {
wxString msg = wxString::Format( _( wxString msg = wxString::Format( _( "Schematic file '%s' is already open." ),
"Schematic file '%s' is already open." ), GetChars( fullFileName ) );
GetChars( fullFileName )
);
DisplayError( this, msg ); DisplayError( this, msg );
return false; return false;
} }

View File

@ -110,9 +110,9 @@ void SCH_EDIT_FRAME::sendNetlist()
bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName, bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
unsigned aNetlistOptions, REPORTER* aReporter, bool silent ) unsigned aNetlistOptions, REPORTER* aReporter, bool aSilent )
{ {
if( !silent ) // checks for errors and invokes annotation dialog as neccessary if( !aSilent ) // checks for errors and invokes annotation dialog as neccessary
{ {
if( !prepareForNetlist() ) if( !prepareForNetlist() )
return false; return false;
@ -135,7 +135,6 @@ bool SCH_EDIT_FRAME::CreateNetlist( int aFormat, const wxString& aFullFileName,
} }
//#define NETLIST_DEBUG //#define NETLIST_DEBUG
NETLIST_OBJECT_LIST::~NETLIST_OBJECT_LIST() NETLIST_OBJECT_LIST::~NETLIST_OBJECT_LIST()

View File

@ -61,6 +61,32 @@ using std::string;
using namespace std; using namespace std;
/**
* Provides an easy access to the children of an XML node via their names.
* @param aCurrentNode is a pointer to a wxXmlNode, whose children will be mapped.
* @param aName the name of the specific child names to be counted.
* @return number of children with the give node name.
*/
static int countChildren( wxXmlNode* aCurrentNode, const std::string& aName )
{
// Map node_name -> node_pointer
int count = 0;
// Loop through all children counting them if they match the given name
aCurrentNode = aCurrentNode->GetChildren();
while( aCurrentNode )
{
if( aCurrentNode->GetName().ToStdString() == aName )
count++;
// Get next child
aCurrentNode = aCurrentNode->GetNext();
}
return count;
}
void SCH_EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers ) void SCH_EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers )
{ {
@ -100,39 +126,31 @@ void SCH_EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers )
if( elayer.name == "Nets" ) if( elayer.name == "Nets" )
{ {
m_LayerMap[elayer.number] = LAYER_WIRE; m_layerMap[elayer.number] = LAYER_WIRE;
} }
else if( elayer.name == "Info" || elayer.name == "Guide" ) else if( elayer.name == "Info" || elayer.name == "Guide" )
{ {
m_LayerMap[elayer.number] = LAYER_NOTES; m_layerMap[elayer.number] = LAYER_NOTES;
} }
else if( elayer.name == "Busses" ) else if( elayer.name == "Busses" )
{ {
m_LayerMap[elayer.number] = LAYER_BUS; m_layerMap[elayer.number] = LAYER_BUS;
} }
} }
} }
// Return the matching layer or return LAYER_NOTES
SCH_LAYER_ID SCH_EAGLE_PLUGIN::kiCadLayer( int aEagleLayer ) SCH_LAYER_ID SCH_EAGLE_PLUGIN::kiCadLayer( int aEagleLayer )
{ {
if( m_LayerMap.find( aEagleLayer ) == m_LayerMap.end() ) auto it = m_layerMap.find( aEagleLayer );
{ return it == m_layerMap.end() ? LAYER_NOTES : it->second;
return LAYER_NOTES;
}
else
{
return m_LayerMap[aEagleLayer];
}
} }
// Return the kicad component orientation based on eagle rotation degrees. // Return the kicad component orientation based on eagle rotation degrees.
static COMPONENT_ORIENTATION_T kiCadComponentRotation( float eagleDegrees ) static COMPONENT_ORIENTATION_T kiCadComponentRotation( float eagleDegrees )
{ {
int roti = int(eagleDegrees); int roti = int( eagleDegrees );
switch( roti ) switch( roti )
{ {
@ -157,30 +175,26 @@ static COMPONENT_ORIENTATION_T kiCadComponentRotation( float eagleDegrees )
// Calculate text alignment based on the given Eagle text alignment parameters. // Calculate text alignment based on the given Eagle text alignment parameters.
void eagleToKicadAlignment( EDA_TEXT* aText, static void eagleToKicadAlignment( EDA_TEXT* aText, int aEagleAlignment,
int aEagleAlignment, int aRelDegress, bool aMirror, bool aSpin, int aAbsDegress )
int reldegrees,
bool mirror,
bool spin,
int absdegrees )
{ {
int align = aEagleAlignment; int align = aEagleAlignment;
if( reldegrees == 90 ) if( aRelDegress == 90 )
{ {
aText->SetTextAngle( 900 ); aText->SetTextAngle( 900 );
} }
else if( reldegrees == 180 ) else if( aRelDegress == 180 )
align = -align; align = -align;
else if( reldegrees == 270 ) else if( aRelDegress == 270 )
{ {
aText->SetTextAngle( 900 ); aText->SetTextAngle( 900 );
align = -align; align = -align;
} }
if( mirror == true ) if( aMirror == true )
{ {
if( absdegrees == 90 || absdegrees == 270 ) if( aAbsDegress == 90 || aAbsDegress == 270 )
{ {
if( align == ETEXT::BOTTOM_RIGHT ) if( align == ETEXT::BOTTOM_RIGHT )
align = ETEXT::TOP_RIGHT; align = ETEXT::TOP_RIGHT;
@ -191,7 +205,7 @@ void eagleToKicadAlignment( EDA_TEXT* aText,
else if( align == ETEXT::TOP_RIGHT ) else if( align == ETEXT::TOP_RIGHT )
align = ETEXT::BOTTOM_RIGHT; align = ETEXT::BOTTOM_RIGHT;
} }
else if( absdegrees == 0 || absdegrees == 180 ) else if( aAbsDegress == 0 || aAbsDegress == 180 )
{ {
if( align == ETEXT::BOTTOM_RIGHT ) if( align == ETEXT::BOTTOM_RIGHT )
align = ETEXT::BOTTOM_LEFT; align = ETEXT::BOTTOM_LEFT;
@ -208,7 +222,6 @@ void eagleToKicadAlignment( EDA_TEXT* aText,
} }
} }
switch( align ) switch( align )
{ {
case ETEXT::CENTER: case ETEXT::CENTER:
@ -292,12 +305,6 @@ int SCH_EAGLE_PLUGIN::GetModifyHash() const
} }
/*
* void SCH_EAGLE_PLUGIN::SaveLibrary( const wxString& aFileName, const PROPERTIES* aProperties )
* {
* }
*/
SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway, SCH_SHEET* SCH_EAGLE_PLUGIN::Load( const wxString& aFileName, KIWAY* aKiway,
SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties ) SCH_SHEET* aAppendToMe, const PROPERTIES* aProperties )
{ {
@ -416,16 +423,15 @@ void SCH_EAGLE_PLUGIN::countNets( wxXmlNode* aSchematicNode )
{ {
std::string netName = netNode->GetAttribute( "name" ).ToStdString(); std::string netName = netNode->GetAttribute( "name" ).ToStdString();
if( m_NetCounts.count( netName ) ) if( m_netCounts.count( netName ) )
m_NetCounts[netName] = m_NetCounts[netName] + 1; m_netCounts[netName] = m_netCounts[netName] + 1;
else else
m_NetCounts[netName] = 1; m_netCounts[netName] = 1;
// Get next net // Get next net
netNode = netNode->GetNext(); netNode = netNode->GetNext();
} }
sheetNode = sheetNode->GetNext(); sheetNode = sheetNode->GetNext();
} }
} }
@ -455,10 +461,10 @@ void SCH_EAGLE_PLUGIN::loadSchematic( wxXmlNode* aSchematicNode )
// Read the library name // Read the library name
wxString libName = libraryNode->GetAttribute( "name" ); wxString libName = libraryNode->GetAttribute( "name" );
EAGLE_LIBRARY* elib = &m_eaglelibraries[libName.ToStdString()]; EAGLE_LIBRARY* elib = &m_eagleLibs[libName.ToStdString()];
elib->name = libName.ToStdString(); elib->name = libName.ToStdString();
loadLibrary( libraryNode, &m_eaglelibraries[libName.ToStdString()] ); loadLibrary( libraryNode, &m_eagleLibs[libName.ToStdString()] );
libraryNode = libraryNode->GetNext(); libraryNode = libraryNode->GetNext();
} }
@ -470,7 +476,7 @@ void SCH_EAGLE_PLUGIN::loadSchematic( wxXmlNode* aSchematicNode )
// Loop through all the sheets // Loop through all the sheets
wxXmlNode* sheetNode = schematicChildren["sheets"]->GetChildren(); wxXmlNode* sheetNode = schematicChildren["sheets"]->GetChildren();
int sheet_count = CountChildren( schematicChildren["sheets"], "sheet" ); int sheet_count = countChildren( schematicChildren["sheets"], "sheet" );
// If eagle schematic has multiple sheets. // If eagle schematic has multiple sheets.
@ -527,7 +533,6 @@ void SCH_EAGLE_PLUGIN::loadSheet( wxXmlNode* aSheetNode, int aSheetIndex )
NODE_MAP sheetChildren = MapChildren( aSheetNode ); NODE_MAP sheetChildren = MapChildren( aSheetNode );
// Get description node // Get description node
wxXmlNode* descriptionNode = getChildrenNodes( sheetChildren, "description" ); wxXmlNode* descriptionNode = getChildrenNodes( sheetChildren, "description" );
wxString des; wxString des;
@ -689,7 +694,7 @@ void SCH_EAGLE_PLUGIN::loadSegments( wxXmlNode* aSegmentsNode, const wxString& n
wxXmlNode* currentSegment = aSegmentsNode->GetChildren(); wxXmlNode* currentSegment = aSegmentsNode->GetChildren();
SCH_SCREEN* screen = m_currentSheet->GetScreen(); SCH_SCREEN* screen = m_currentSheet->GetScreen();
int segmentCount = CountChildren( aSegmentsNode, "segment" ); int segmentCount = countChildren( aSegmentsNode, "segment" );
// wxCHECK( screen, [>void<] ); // wxCHECK( screen, [>void<] );
while( currentSegment ) while( currentSegment )
@ -759,7 +764,7 @@ void SCH_EAGLE_PLUGIN::loadSegments( wxXmlNode* aSegmentsNode, const wxString& n
wxString netname = fixNetName( netName ); wxString netname = fixNetName( netName );
// Add a global label if the net appears on more than one Eagle sheet // Add a global label if the net appears on more than one Eagle sheet
if( m_NetCounts[netName.ToStdString()]>1 ) if( m_netCounts[netName.ToStdString()]>1 )
{ {
std::unique_ptr<SCH_GLOBALLABEL> glabel( new SCH_GLOBALLABEL ); std::unique_ptr<SCH_GLOBALLABEL> glabel( new SCH_GLOBALLABEL );
glabel->SetPosition( wire->MidPoint() ); glabel->SetPosition( wire->MidPoint() );
@ -841,7 +846,7 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode,
// Determine if the Label is a local and global label based on the number of sheets the net appears on. // Determine if the Label is a local and global label based on the number of sheets the net appears on.
if( m_NetCounts[aNetName.ToStdString()]>1 ) if( m_netCounts[aNetName.ToStdString()]>1 )
{ {
std::unique_ptr<SCH_GLOBALLABEL> glabel( new SCH_GLOBALLABEL ); std::unique_ptr<SCH_GLOBALLABEL> glabel( new SCH_GLOBALLABEL );
glabel->SetPosition( elabelpos ); glabel->SetPosition( elabelpos );
@ -944,13 +949,13 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadLabel( wxXmlNode* aLabelNode,
} }
wxPoint SCH_EAGLE_PLUGIN::findNearestLinePoint( const wxPoint aPoint, const DLIST<SCH_LINE>& lines ) wxPoint SCH_EAGLE_PLUGIN::findNearestLinePoint( const wxPoint& aPoint, const DLIST<SCH_LINE>& aLines )
{ {
wxPoint nearestPoint; wxPoint nearestPoint;
float mindistance = std::numeric_limits<float>::max(); float mindistance = std::numeric_limits<float>::max();
float d; float d;
SCH_LINE* line = lines.begin(); SCH_LINE* line = aLines.begin();
// Find the nearest start, middle or end of a line from the list of lines. // Find the nearest start, middle or end of a line from the list of lines.
while( line != NULL ) while( line != NULL )
@ -1011,10 +1016,10 @@ void SCH_EAGLE_PLUGIN::loadInstance( wxXmlNode* aInstanceNode )
sntemp.Replace( "*", "" ); sntemp.Replace( "*", "" );
std::string symbolname = sntemp.ToStdString(); std::string symbolname = sntemp.ToStdString();
int unit = m_eaglelibraries[libraryname].GateUnit[gatename]; int unit = m_eagleLibs[libraryname].GateUnit[gatename];
std::string package; std::string package;
EAGLE_LIBRARY* elib = &m_eaglelibraries[libraryname]; EAGLE_LIBRARY* elib = &m_eagleLibs[libraryname];
auto p = elib->package.find( symbolname ); auto p = elib->package.find( symbolname );
@ -1035,7 +1040,7 @@ void SCH_EAGLE_PLUGIN::loadInstance( wxXmlNode* aInstanceNode )
component->SetUnit( unit ); component->SetUnit( unit );
component->SetPosition( wxPoint( einstance.x * EUNIT_TO_MIL, -einstance.y * EUNIT_TO_MIL ) ); component->SetPosition( wxPoint( einstance.x * EUNIT_TO_MIL, -einstance.y * EUNIT_TO_MIL ) );
component->GetField( FOOTPRINT )->SetText( wxString( package ) ); component->GetField( FOOTPRINT )->SetText( wxString( package ) );
component->SetTimeStamp( moduleTstamp( einstance.part, epart->value ? *epart->value : "", component->SetTimeStamp( EagleModuleTstamp( einstance.part, epart->value ? *epart->value : "",
unit ) ); unit ) );
if( einstance.rot ) if( einstance.rot )
@ -1127,18 +1132,15 @@ void SCH_EAGLE_PLUGIN::loadInstance( wxXmlNode* aInstanceNode )
field->SetPosition( wxPoint( *attr.x * EUNIT_TO_MIL, *attr.y * -EUNIT_TO_MIL ) ); field->SetPosition( wxPoint( *attr.x * EUNIT_TO_MIL, *attr.y * -EUNIT_TO_MIL ) );
int align = attr.align ? *attr.align : ETEXT::BOTTOM_LEFT; int align = attr.align ? *attr.align : ETEXT::BOTTOM_LEFT;
int absdegrees = attr.rot ? attr.rot->degrees : 0; int absdegrees = attr.rot ? attr.rot->degrees : 0;
bool mirror = attr.rot ? attr.rot->mirror : false; bool mirror = attr.rot ? attr.rot->mirror : false;
if( einstance.rot ) if( einstance.rot && einstance.rot->mirror )
if( einstance.rot->mirror )
{ {
mirror = !mirror; mirror = !mirror;
} }
bool spin = attr.rot ? attr.rot->spin : false; bool spin = attr.rot ? attr.rot->spin : false;
if( attr.display == EATTR::Off ) if( attr.display == EATTR::Off )
@ -1173,18 +1175,11 @@ void SCH_EAGLE_PLUGIN::loadInstance( wxXmlNode* aInstanceNode )
} }
/*
* void SCH_EAGLE_PLUGIN::loadModuleinst( wxXmlNode* aModuleinstNode )
* {
* }
*/
EAGLE_LIBRARY* SCH_EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLibraryNode, EAGLE_LIBRARY* SCH_EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLibraryNode,
EAGLE_LIBRARY* aEagleLibrary ) EAGLE_LIBRARY* aEagleLibrary )
{ {
NODE_MAP libraryChildren = MapChildren( aLibraryNode ); NODE_MAP libraryChildren = MapChildren( aLibraryNode );
// Loop through the symbols and load each of them // Loop through the symbols and load each of them
wxXmlNode* symbolNode = libraryChildren["symbols"]->GetChildren(); wxXmlNode* symbolNode = libraryChildren["symbols"]->GetChildren();
@ -1218,24 +1213,15 @@ EAGLE_LIBRARY* SCH_EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLibraryNode,
wxString symbolName = wxString( edeviceset.name + edevice.name ); wxString symbolName = wxString( edeviceset.name + edevice.name );
symbolName.Replace( "*", "" ); symbolName.Replace( "*", "" );
std::string symbolname = symbolName.ToStdString();
std::string package;
if( edevice.package ) if( edevice.package )
{ aEagleLibrary->package[symbolName.ToStdString()] = edevice.package.Get();
package = edevice.package.Get();
aEagleLibrary->package[symbolname] = package;
}
// Create KiCad symbol. // Create KiCad symbol.
unique_ptr<LIB_PART> kpart( new LIB_PART( symbolName ) ); unique_ptr<LIB_PART> kpart( new LIB_PART( symbolName ) );
// Process each gate in the deviceset for this device. // Process each gate in the deviceset for this device.
wxXmlNode* gateNode = getChildrenNodes( aDeviceSetChildren, "gates" ); wxXmlNode* gateNode = getChildrenNodes( aDeviceSetChildren, "gates" );
int gates_count = CountChildren( aDeviceSetChildren["gates"], "gate" ); int gates_count = countChildren( aDeviceSetChildren["gates"], "gate" );
kpart->SetUnitCount( gates_count ); kpart->SetUnitCount( gates_count );
LIB_FIELD* reference = kpart->GetField( REFERENCE ); LIB_FIELD* reference = kpart->GetField( REFERENCE );
@ -1249,18 +1235,15 @@ EAGLE_LIBRARY* SCH_EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLibraryNode,
reference->SetText( prefix ); reference->SetText( prefix );
} }
int gateindex; int gateindex = 1;
bool ispower = false; bool ispower = false;
gateindex = 1;
while( gateNode ) while( gateNode )
{ {
EGATE egate = EGATE( gateNode ); EGATE egate = EGATE( gateNode );
aEagleLibrary->GateUnit[edeviceset.name + edevice.name + egate.name] = gateindex; aEagleLibrary->GateUnit[edeviceset.name + edevice.name + egate.name] = gateindex;
ispower = loadSymbol( aEagleLibrary->SymbolNodes[egate.symbol], ispower = loadSymbol( aEagleLibrary->SymbolNodes[egate.symbol],
kpart, &edevice, gateindex, egate.name ); kpart, &edevice, gateindex, egate.name );
@ -1514,7 +1497,7 @@ LIB_ITEM* SCH_EAGLE_PLUGIN::loadSymbolWire( std::unique_ptr<LIB_PART>& aPart,
if( ewire.curve ) if( ewire.curve )
{ {
std::unique_ptr<LIB_ARC> arc( new LIB_ARC( aPart.get() ) ); std::unique_ptr<LIB_ARC> arc( new LIB_ARC( aPart.get() ) );
wxRealPoint center = kicad_arc_center( begin, end, *ewire.curve * -1 ); wxRealPoint center = ConvertArcCenter( begin, end, *ewire.curve * -1 );
arc->SetPosition( center ); arc->SetPosition( center );
@ -1632,22 +1615,15 @@ LIB_POLYLINE* SCH_EAGLE_PLUGIN::loadSymbolPolyLine( std::unique_ptr<LIB_PART>& a
LIB_PIN* SCH_EAGLE_PLUGIN::loadPin( std::unique_ptr<LIB_PART>& aPart, LIB_PIN* SCH_EAGLE_PLUGIN::loadPin( std::unique_ptr<LIB_PART>& aPart,
wxXmlNode* aPin, wxXmlNode* aPin,
EPIN* epin, EPIN* aEPin,
int aGateNumber ) int aGateNumber )
{ {
std::unique_ptr<LIB_PIN> pin( new LIB_PIN( aPart.get() ) ); std::unique_ptr<LIB_PIN> pin( new LIB_PIN( aPart.get() ) );
pin->SetPosition( wxPoint( aEPin->x * EUNIT_TO_MIL, aEPin->y * EUNIT_TO_MIL ) );
pin->SetName( aEPin->name );
pin->SetPosition( wxPoint( epin->x * EUNIT_TO_MIL, epin->y * EUNIT_TO_MIL ) );
pin->SetName( epin->name );
pin->SetUnit( aGateNumber ); pin->SetUnit( aGateNumber );
int roti = 0; int roti = aEPin->rot ? aEPin->rot->degrees : 0;
if( epin->rot )
{
roti = int(epin->rot->degrees);
}
switch( roti ) switch( roti )
{ {
@ -1672,9 +1648,9 @@ LIB_PIN* SCH_EAGLE_PLUGIN::loadPin( std::unique_ptr<LIB_PART>& aPart,
break; break;
} }
if( epin->length ) if( aEPin->length )
{ {
wxString length = epin->length.Get(); wxString length = aEPin->length.Get();
if( length =="short" ) if( length =="short" )
{ {
@ -1695,9 +1671,9 @@ LIB_PIN* SCH_EAGLE_PLUGIN::loadPin( std::unique_ptr<LIB_PART>& aPart,
} }
// emaulate the visibility of pin elements // emaulate the visibility of pin elements
if( epin->visible ) if( aEPin->visible )
{ {
wxString visible = epin->visible.Get(); wxString visible = aEPin->visible.Get();
if( visible == "off" ) if( visible == "off" )
{ {
@ -1720,9 +1696,9 @@ LIB_PIN* SCH_EAGLE_PLUGIN::loadPin( std::unique_ptr<LIB_PART>& aPart,
*/ */
} }
if( epin->function ) if( aEPin->function )
{ {
wxString function = epin->function.Get(); wxString function = aEPin->function.Get();
if( function == "dot" ) if( function == "dot" )
{ {
@ -1765,15 +1741,12 @@ LIB_TEXT* SCH_EAGLE_PLUGIN::loadSymbolText( std::unique_ptr<LIB_PART>& aPart,
} }
int align = etext.align ? *etext.align : ETEXT::BOTTOM_LEFT; int align = etext.align ? *etext.align : ETEXT::BOTTOM_LEFT;
int degrees = etext.rot ? etext.rot->degrees : 0; int degrees = etext.rot ? etext.rot->degrees : 0;
bool mirror = etext.rot ? etext.rot->mirror : false; bool mirror = etext.rot ? etext.rot->mirror : false;
bool spin = etext.rot ? etext.rot->spin : false; bool spin = etext.rot ? etext.rot->spin : false;
eagleToKicadAlignment( (EDA_TEXT*) libtext.get(), align, degrees, mirror, spin, 0 ); eagleToKicadAlignment( (EDA_TEXT*) libtext.get(), align, degrees, mirror, spin, 0 );
return libtext.release(); return libtext.release();
} }
@ -1781,10 +1754,8 @@ LIB_TEXT* SCH_EAGLE_PLUGIN::loadSymbolText( std::unique_ptr<LIB_PART>& aPart,
SCH_TEXT* SCH_EAGLE_PLUGIN::loadPlainText( wxXmlNode* aSchText ) SCH_TEXT* SCH_EAGLE_PLUGIN::loadPlainText( wxXmlNode* aSchText )
{ {
std::unique_ptr<SCH_TEXT> schtext( new SCH_TEXT() ); std::unique_ptr<SCH_TEXT> schtext( new SCH_TEXT() );
auto etext = ETEXT( aSchText ); auto etext = ETEXT( aSchText );
schtext->SetItalic( false ); schtext->SetItalic( false );
schtext->SetPosition( wxPoint( etext.x * EUNIT_TO_MIL, -etext.y * EUNIT_TO_MIL ) ); schtext->SetPosition( wxPoint( etext.x * EUNIT_TO_MIL, -etext.y * EUNIT_TO_MIL ) );
@ -1806,15 +1777,12 @@ SCH_TEXT* SCH_EAGLE_PLUGIN::loadPlainText( wxXmlNode* aSchText )
int align = etext.align ? *etext.align : ETEXT::BOTTOM_LEFT; int align = etext.align ? *etext.align : ETEXT::BOTTOM_LEFT;
int degrees = etext.rot ? etext.rot->degrees : 0; int degrees = etext.rot ? etext.rot->degrees : 0;
bool mirror = etext.rot ? etext.rot->mirror : false; bool mirror = etext.rot ? etext.rot->mirror : false;
bool spin = etext.rot ? etext.rot->spin : false; bool spin = etext.rot ? etext.rot->spin : false;
eagleToKicadAlignment( (EDA_TEXT*) schtext.get(), align, degrees, mirror, spin, 0 ); eagleToKicadAlignment( (EDA_TEXT*) schtext.get(), align, degrees, mirror, spin, 0 );
return schtext.release(); return schtext.release();
} }
@ -1837,25 +1805,22 @@ bool SCH_EAGLE_PLUGIN::CheckHeader( const wxString& aFileName )
} }
// Moves any labels on the wire to the new end point of the wire. void SCH_EAGLE_PLUGIN::moveLabels( SCH_ITEM* aWire, const wxPoint& aNewEndPoint )
void SCH_EAGLE_PLUGIN::moveLabels( SCH_ITEM* wire, wxPoint newendpoint )
{ {
for( SCH_ITEM* item = m_currentSheet->GetScreen()->GetDrawItems(); item; item = item->Next() ) for( SCH_ITEM* item = m_currentSheet->GetScreen()->GetDrawItems(); item; item = item->Next() )
{ {
if( item->Type() == SCH_LABEL_T || item->Type() == SCH_GLOBAL_LABEL_T ) if( item->Type() == SCH_LABEL_T || item->Type() == SCH_GLOBAL_LABEL_T )
{ {
if( TestSegmentHit( item->GetPosition(), ( (SCH_LINE*) wire )->GetStartPoint(), if( TestSegmentHit( item->GetPosition(), ( (SCH_LINE*) aWire )->GetStartPoint(),
( (SCH_LINE*) wire )->GetEndPoint(), 0 ) ) ( (SCH_LINE*) aWire )->GetEndPoint(), 0 ) )
{ {
item->SetPosition( newendpoint ); item->SetPosition( aNewEndPoint );
} }
} }
} }
} }
// This monster of a function finds best way to place a bus entry symbol for when an Eagle wire segment
// ends on an Eagle bus segment
void SCH_EAGLE_PLUGIN::addBusEntries() void SCH_EAGLE_PLUGIN::addBusEntries()
{ {
// Add bus entry symbols // Add bus entry symbols
@ -1863,7 +1828,6 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
// for each wire segment, compare each end with all busess. // for each wire segment, compare each end with all busess.
// If the wire end is found to end on a bus segment, place a bus entry symbol. // If the wire end is found to end on a bus segment, place a bus entry symbol.
for( SCH_ITEM* bus = m_currentSheet->GetScreen()->GetDrawItems(); bus; bus = bus->Next() ) for( SCH_ITEM* bus = m_currentSheet->GetScreen()->GetDrawItems(); bus; bus = bus->Next() )
{ {
// Check line type for line // Check line type for line
@ -2437,76 +2401,3 @@ wxString SCH_EAGLE_PLUGIN::fixNetName( const wxString& aNetName )
return ret; return ret;
} }
// The below functions are not overriden and will trigger an assert if called for this plugin.
/*
* void SCH_EAGLE_PLUGIN::Save( const wxString& aFileName, SCH_SCREEN* aSchematic, KIWAY* aKiway,
* const PROPERTIES* aProperties )
* {
* }
*
*
* size_t SCH_EAGLE_PLUGIN::GetSymbolLibCount( const wxString& aLibraryPath,
* const PROPERTIES* aProperties )
* {
* return 0;
* }
*
*
* void SCH_EAGLE_PLUGIN::EnumerateSymbolLib( wxArrayString& aAliasNameList,
* const wxString& aLibraryPath,
* const PROPERTIES* aProperties )
* {
* }
*
*
* LIB_ALIAS* SCH_EAGLE_PLUGIN::LoadSymbol( const wxString& aLibraryPath, const wxString& aSymbolName,
* const PROPERTIES* aProperties )
* {
* return nullptr;
* }
*
*
* void SCH_EAGLE_PLUGIN::SaveSymbol( const wxString& aLibraryPath, const LIB_PART* aSymbol,
* const PROPERTIES* aProperties )
* {
* }
*
*
* void SCH_EAGLE_PLUGIN::DeleteAlias( const wxString& aLibraryPath, const wxString& aAliasName,
* const PROPERTIES* aProperties )
* {
* }
*
*
* void SCH_EAGLE_PLUGIN::DeleteSymbol( const wxString& aLibraryPath, const wxString& aAliasName,
* const PROPERTIES* aProperties )
* {
* }
*
*
* void SCH_EAGLE_PLUGIN::CreateSymbolLib( const wxString& aLibraryPath,
* const PROPERTIES* aProperties )
* {
* }
*
*
* bool SCH_EAGLE_PLUGIN::DeleteSymbolLib( const wxString& aLibraryPath,
* const PROPERTIES* aProperties )
* {
* return false;
* }
*
*
* bool SCH_EAGLE_PLUGIN::IsSymbolLibWritable( const wxString& aLibraryPath )
* {
* return false;
* }
*
*
* void SCH_EAGLE_PLUGIN::SymbolLibOptions( PROPERTIES* aListToAppendTo ) const
* {
* }
*
*/

View File

@ -58,16 +58,6 @@ class LIB_PIN;
class LIB_TEXT; class LIB_TEXT;
/**
* Class SCH_EAGLE_PLUGIN
* is a #SCH_PLUGIN derivation for loading 6.x+ Eagle schematic files.
*
*
* As with all SCH_PLUGINs there is no UI dependencies i.e. windowing
* calls allowed.
*/
typedef struct EAGLE_LIBRARY typedef struct EAGLE_LIBRARY
{ {
std::string name; std::string name;
@ -75,16 +65,20 @@ typedef struct EAGLE_LIBRARY
std::unordered_map<std::string, wxXmlNode*> SymbolNodes; std::unordered_map<std::string, wxXmlNode*> SymbolNodes;
std::unordered_map<std::string, int> GateUnit; std::unordered_map<std::string, int> GateUnit;
std::unordered_map<std::string, std::string> package; std::unordered_map<std::string, std::string> package;
} EAGLE_LIBRARY; } EAGLE_LIBRARY;
typedef boost::ptr_map< std::string, EPART > EPART_LIST; typedef boost::ptr_map<std::string, EPART> EPART_LIST;
/**
* Class SCH_EAGLE_PLUGIN
* is a #SCH_PLUGIN derivation for loading 6.x+ Eagle schematic files.
*
* As with all SCH_PLUGINs there is no UI dependencies i.e. windowing calls allowed.
*/
class SCH_EAGLE_PLUGIN : public SCH_PLUGIN class SCH_EAGLE_PLUGIN : public SCH_PLUGIN
{ {
public: public:
SCH_EAGLE_PLUGIN(); SCH_EAGLE_PLUGIN();
~SCH_EAGLE_PLUGIN(); ~SCH_EAGLE_PLUGIN();
@ -100,7 +94,7 @@ public:
bool CheckHeader( const wxString& aFileName ) override; bool CheckHeader( const wxString& aFileName ) override;
// unimplemented functions. Will trigger a not_implemented IO error. // unimplemented functions. Will trigger a not_implemented IO error.
//void SaveLibrary( const wxString& aFileName, const PROPERTIES* aProperties = NULL ) override; //void SaveLibrary( const wxString& aFileName, const PROPERTIES* aProperties = NULL ) override;
//void Save( const wxString& aFileName, SCH_SCREEN* aSchematic, KIWAY* aKiway, //void Save( const wxString& aFileName, SCH_SCREEN* aSchematic, KIWAY* aKiway,
@ -134,23 +128,28 @@ public:
//void SymbolLibOptions( PROPERTIES* aListToAppendTo ) const override; //void SymbolLibOptions( PROPERTIES* aListToAppendTo ) const override;
private: private:
void loadDrawing( wxXmlNode* aDrawingNode ); void loadDrawing( wxXmlNode* aDrawingNode );
void loadLayerDefs( wxXmlNode* aLayers ); void loadLayerDefs( wxXmlNode* aLayers );
void loadSchematic( wxXmlNode* aSchematicNode ); void loadSchematic( wxXmlNode* aSchematicNode );
void loadSheet( wxXmlNode* aSheetNode, int sheetcount ); void loadSheet( wxXmlNode* aSheetNode, int sheetcount );
void loadInstance( wxXmlNode* aInstanceNode ); void loadInstance( wxXmlNode* aInstanceNode );
//void loadModuleinst( wxXmlNode* aModuleinstNode ); // Eagle 8 feature that defines a replicatable schematic circuit and pcb layout. EAGLE_LIBRARY* loadLibrary( wxXmlNode* aLibraryNode, EAGLE_LIBRARY* aEagleLib );
EAGLE_LIBRARY* loadLibrary( wxXmlNode* aLibraryNode, EAGLE_LIBRARY* elib);
void countNets( wxXmlNode* aSchematicNode ); void countNets( wxXmlNode* aSchematicNode );
void moveLabels( SCH_ITEM* wire, wxPoint newendpoint);
/// Moves any labels on the wire to the new end point of the wire.
void moveLabels( SCH_ITEM* aWire, const wxPoint& aNewEndPoint );
/// This function finds best way to place a bus entry symbol for when an Eagle wire segment
/// ends on an Eagle bus segment.
void addBusEntries(); void addBusEntries();
static wxString fixNetName( const wxString& aNetName ); static wxString fixNetName( const wxString& aNetName );
/// Return the matching layer or return LAYER_NOTES
SCH_LAYER_ID kiCadLayer( int aEagleLayer ); SCH_LAYER_ID kiCadLayer( int aEagleLayer );
wxPoint findNearestLinePoint(wxPoint aPoint, const DLIST< SCH_LINE >& lines);
wxPoint findNearestLinePoint( const wxPoint& aPoint, const DLIST<SCH_LINE>& aLines );
void loadSegments( wxXmlNode* aSegmentsNode, const wxString& aNetName, void loadSegments( wxXmlNode* aSegmentsNode, const wxString& aNetName,
const wxString& aNetClass ); const wxString& aNetClass );
@ -159,13 +158,13 @@ private:
SCH_JUNCTION* loadJunction( wxXmlNode* aJunction ); SCH_JUNCTION* loadJunction( wxXmlNode* aJunction );
SCH_TEXT* loadPlainText( wxXmlNode* aSchText ); SCH_TEXT* loadPlainText( wxXmlNode* aSchText );
bool loadSymbol(wxXmlNode *aSymbolNode, std::unique_ptr< LIB_PART >& aPart, EDEVICE* aDevice, int aGateNumber, string aGateName); bool loadSymbol( wxXmlNode* aSymbolNode, std::unique_ptr<LIB_PART>& aPart, EDEVICE* aDevice, int aGateNumber, string aGateName );
LIB_CIRCLE* loadSymbolCircle( std::unique_ptr< LIB_PART >& aPart, wxXmlNode* aCircleNode, int aGateNumber); LIB_CIRCLE* loadSymbolCircle( std::unique_ptr<LIB_PART>& aPart, wxXmlNode* aCircleNode, int aGateNumber );
LIB_RECTANGLE* loadSymbolRectangle( std::unique_ptr< LIB_PART >& aPart, wxXmlNode* aRectNode, int aGateNumber ); LIB_RECTANGLE* loadSymbolRectangle( std::unique_ptr<LIB_PART>& aPart, wxXmlNode* aRectNode, int aGateNumber );
LIB_POLYLINE* loadSymbolPolyLine( std::unique_ptr< LIB_PART >& aPart, wxXmlNode* aPolygonNode, int aGateNumber ); LIB_POLYLINE* loadSymbolPolyLine( std::unique_ptr<LIB_PART>& aPart, wxXmlNode* aPolygonNode, int aGateNumber );
LIB_ITEM* loadSymbolWire( std::unique_ptr< LIB_PART >& aPart, wxXmlNode* aWireNode, int aGateNumber); LIB_ITEM* loadSymbolWire( std::unique_ptr<LIB_PART>& aPart, wxXmlNode* aWireNode, int aGateNumber );
LIB_PIN* loadPin( std::unique_ptr< LIB_PART >& aPart, wxXmlNode*, EPIN* epin, int aGateNumber); LIB_PIN* loadPin( std::unique_ptr<LIB_PART>& aPart, wxXmlNode*, EPIN* epin, int aGateNumber );
LIB_TEXT* loadSymbolText( std::unique_ptr< LIB_PART >& aPart, wxXmlNode* aLibText, int aGateNumber); LIB_TEXT* loadSymbolText( std::unique_ptr<LIB_PART>& aPart, wxXmlNode* aLibText, int aGateNumber );
KIWAY* m_kiway; ///< For creating sub sheets. KIWAY* m_kiway; ///< For creating sub sheets.
SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded.. SCH_SHEET* m_rootSheet; ///< The root sheet of the schematic being loaded..
@ -175,12 +174,10 @@ private:
PART_LIB* m_partlib; ///< symbol library for imported file. PART_LIB* m_partlib; ///< symbol library for imported file.
EPART_MAP m_partlist; EPART_MAP m_partlist;
std::map<std::string, EAGLE_LIBRARY> m_eaglelibraries; std::map<std::string, EAGLE_LIBRARY> m_eagleLibs;
std::map<std::string, int > m_NetCounts; std::map<std::string, int> m_netCounts;
std::map<int, SCH_LAYER_ID> m_LayerMap; std::map<int, SCH_LAYER_ID> m_layerMap;
protected:
}; };
#endif // _SCH_EAGLE_PLUGIN_H_ #endif // _SCH_EAGLE_PLUGIN_H_

View File

@ -602,5 +602,5 @@ void SCH_LINE::SetPosition( const wxPoint& aPosition )
wxPoint SCH_LINE::MidPoint() wxPoint SCH_LINE::MidPoint()
{ {
return wxPoint( (m_start.x+m_end.x)/2.0, (m_start.y+m_end.y)/2.0 ); return wxPoint( ( m_start.x + m_end.x ) / 2, ( m_start.y + m_end.y ) / 2 );
} }

View File

@ -791,7 +791,7 @@ public:
* @param full filepath of file to be imported. * @param full filepath of file to be imported.
* @param aFileType SCH_FILE_T value for filetype * @param aFileType SCH_FILE_T value for filetype
*/ */
bool ImportFile( const wxString& aFileName, int aFileType ) override ; bool ImportFile( const wxString& aFileName, int aFileType ) override;
private: private:

View File

@ -50,6 +50,7 @@ using std::string;
class MODULE; class MODULE;
struct EINSTANCE; struct EINSTANCE;
struct EPART; struct EPART;
struct ETEXT;
typedef std::unordered_map<string, wxXmlNode*> NODE_MAP; typedef std::unordered_map<string, wxXmlNode*> NODE_MAP;
typedef std::map<string, MODULE*> MODULE_MAP; typedef std::map<string, MODULE*> MODULE_MAP;
@ -358,35 +359,16 @@ public:
* @return NODE_MAP - a map linking the name of each children to the children itself (via a * @return NODE_MAP - a map linking the name of each children to the children itself (via a
* wxXmlNode*) * wxXmlNode*)
*/ */
NODE_MAP MapChildren( wxXmlNode* currentNode ); NODE_MAP MapChildren( wxXmlNode* aCurrentNode );
/**
* Function CountChildren
* provides an easy access to the children of an XML node via their names.
* @param aCurrentNode is a pointer to a wxXmlNode, whose children will be mapped.
* @param aName the name of the specific child names to be counted.
* @return number of children with the give node name.
*/
int CountChildren( wxXmlNode* aCurrentNode, const std::string& aName );
/// Assemble a two part key as a simple concatenation of aFirst and aSecond parts,
/// using a separator.
string makeKey( const string& aFirst, const string& aSecond );
/// Make a unique time stamp /// Make a unique time stamp
unsigned long timeStamp( wxXmlNode* aTree ); unsigned long EagleTimeStamp( wxXmlNode* aTree );
/// Computes module timestamp basing on its name, value and unit /// Computes module timestamp basing on its name, value and unit
time_t moduleTstamp( const string& aName, const string& aValue, int aUnit ); time_t EagleModuleTstamp( const string& aName, const string& aValue, int aUnit );
/// Returns module path using the module timestamp
// TODO does not handle multisheet schematics correctly
string modulePath( const string& aName, const string& aValue );
/// Convert an Eagle curve end to a KiCad center for S_ARC /// Convert an Eagle curve end to a KiCad center for S_ARC
wxPoint kicad_arc_center( const wxPoint& aStart, const wxPoint& aEnd, double aAngle ); wxPoint ConvertArcCenter( const wxPoint& aStart, const wxPoint& aEnd, double aAngle );
// Pre-declare for typedefs // Pre-declare for typedefs
struct EROT; struct EROT;
@ -398,8 +380,6 @@ typedef OPTIONAL_XML_ATTRIBUTE<bool> opt_bool;
typedef OPTIONAL_XML_ATTRIBUTE<EROT> opt_erot; typedef OPTIONAL_XML_ATTRIBUTE<EROT> opt_erot;
// All of the 'E'STRUCTS below merely hold Eagle XML information verbatim, in binary. // All of the 'E'STRUCTS below merely hold Eagle XML information verbatim, in binary.
// For maintenance and troubleshooting purposes, it was thought that we'd need to // For maintenance and troubleshooting purposes, it was thought that we'd need to
// separate the conversion process into distinct steps. There is no intent to have KiCad // separate the conversion process into distinct steps. There is no intent to have KiCad
@ -475,6 +455,7 @@ struct EWIRE
EWIRE( wxXmlNode* aWire ); EWIRE( wxXmlNode* aWire );
}; };
/// Eagle Junction /// Eagle Junction
struct EJUNCTION struct EJUNCTION
{ {
@ -484,6 +465,7 @@ struct EJUNCTION
EJUNCTION( wxXmlNode* aJunction); EJUNCTION( wxXmlNode* aJunction);
}; };
/// Eagle label /// Eagle label
struct ELABEL struct ELABEL
{ {
@ -668,6 +650,7 @@ struct ESMD
ESMD( wxXmlNode* aSMD ); ESMD( wxXmlNode* aSMD );
}; };
/// Eagle pin element /// Eagle pin element
struct EPIN struct EPIN
{ {
@ -685,6 +668,7 @@ struct EPIN
EPIN( wxXmlNode* aPin ); EPIN( wxXmlNode* aPin );
}; };
/// Eagle vertex /// Eagle vertex
struct EVERTEX struct EVERTEX
{ {
@ -835,7 +819,6 @@ struct EAGLE_LAYER
}; };
struct EPART struct EPART
{ {
/* /*
@ -885,6 +868,7 @@ struct EINSTANCE
EINSTANCE( wxXmlNode* aInstance ); EINSTANCE( wxXmlNode* aInstance );
}; };
struct EGATE struct EGATE
{ {
/* /*
@ -941,7 +925,7 @@ struct ECONNECT
}; };
typedef struct EDEVICE struct EDEVICE
{ {
/* /*
<!ELEMENT device (connects?, technologies?)> <!ELEMENT device (connects?, technologies?)>
@ -956,7 +940,8 @@ typedef struct EDEVICE
std::vector<ECONNECT> connects; std::vector<ECONNECT> connects;
EDEVICE( wxXmlNode* aDevice ); EDEVICE( wxXmlNode* aDevice );
} EDEVICE; };
struct EDEVICE_SET struct EDEVICE_SET
{ {
@ -980,5 +965,4 @@ struct EDEVICE_SET
}; };
#endif // _EAGLE_PARSER_H_ #endif // _EAGLE_PARSER_H_

View File

@ -196,7 +196,6 @@ public:
* Function ReadPcbNetlist * Function ReadPcbNetlist
* provides access to PcbNew's function ReadPcbNetlist. * provides access to PcbNew's function ReadPcbNetlist.
*/ */
VTBL_ENTRY void ReadPcbNetlist( const wxString& aNetlistFileName, VTBL_ENTRY void ReadPcbNetlist( const wxString& aNetlistFileName,
const wxString& aCmpFileName, const wxString& aCmpFileName,
REPORTER* aReporter, REPORTER* aReporter,

View File

@ -94,6 +94,14 @@ static double parseEagle( const wxString& aDistance )
return ret; return ret;
} }
/// Assemble a two part key as a simple concatenation of aFirst and aSecond parts,
/// using a separator.
static string makeKey( const string& aFirst, const string& aSecond )
{
string key = aFirst + '\x02' + aSecond;
return key;
}
void ERULES::parse( wxXmlNode* aRules ) void ERULES::parse( wxXmlNode* aRules )
{ {
@ -457,7 +465,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
} }
else else
{ {
wxPoint center = kicad_arc_center( start, end, *w.curve); wxPoint center = ConvertArcCenter( start, end, *w.curve );
dseg->SetShape( S_ARC ); dseg->SetShape( S_ARC );
dseg->SetStart( center ); dseg->SetStart( center );
@ -465,7 +473,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
dseg->SetAngle( *w.curve * -10.0 ); // KiCad rotates the other way dseg->SetAngle( *w.curve * -10.0 ); // KiCad rotates the other way
} }
dseg->SetTimeStamp( timeStamp( gr ) ); dseg->SetTimeStamp( EagleTimeStamp( gr ) );
dseg->SetLayer( layer ); dseg->SetLayer( layer );
dseg->SetWidth( Millimeter2iu( DEFAULT_PCB_EDGE_THICKNESS ) ); dseg->SetWidth( Millimeter2iu( DEFAULT_PCB_EDGE_THICKNESS ) );
} }
@ -484,7 +492,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
m_board->Add( pcbtxt, ADD_APPEND ); m_board->Add( pcbtxt, ADD_APPEND );
pcbtxt->SetLayer( layer ); pcbtxt->SetLayer( layer );
pcbtxt->SetTimeStamp( timeStamp( gr ) ); pcbtxt->SetTimeStamp( EagleTimeStamp( gr ) );
pcbtxt->SetText( FROM_UTF8( t.text.c_str() ) ); pcbtxt->SetText( FROM_UTF8( t.text.c_str() ) );
pcbtxt->SetTextPos( wxPoint( kicad_x( t.x ), kicad_y( t.y ) ) ); pcbtxt->SetTextPos( wxPoint( kicad_x( t.x ), kicad_y( t.y ) ) );
@ -592,7 +600,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
m_board->Add( dseg, ADD_APPEND ); m_board->Add( dseg, ADD_APPEND );
dseg->SetShape( S_CIRCLE ); dseg->SetShape( S_CIRCLE );
dseg->SetTimeStamp( timeStamp( gr ) ); dseg->SetTimeStamp( EagleTimeStamp( gr ) );
dseg->SetLayer( layer ); dseg->SetLayer( layer );
dseg->SetStart( wxPoint( kicad_x( c.x ), kicad_y( c.y ) ) ); dseg->SetStart( wxPoint( kicad_x( c.x ), kicad_y( c.y ) ) );
dseg->SetEnd( wxPoint( kicad_x( c.x + c.radius ), kicad_y( c.y ) ) ); dseg->SetEnd( wxPoint( kicad_x( c.x + c.radius ), kicad_y( c.y ) ) );
@ -615,7 +623,7 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics )
ZONE_CONTAINER* zone = new ZONE_CONTAINER( m_board ); ZONE_CONTAINER* zone = new ZONE_CONTAINER( m_board );
m_board->Add( zone, ADD_APPEND ); m_board->Add( zone, ADD_APPEND );
zone->SetTimeStamp( timeStamp( gr ) ); zone->SetTimeStamp( EagleTimeStamp( gr ) );
zone->SetLayer( layer ); zone->SetLayer( layer );
zone->SetNetCode( NETINFO_LIST::UNCONNECTED ); zone->SetNetCode( NETINFO_LIST::UNCONNECTED );
@ -853,9 +861,6 @@ void EAGLE_PLUGIN::loadElements( wxXmlNode* aElements )
// copy constructor to clone the template // copy constructor to clone the template
MODULE* m = new MODULE( *mi->second ); MODULE* m = new MODULE( *mi->second );
// TODO currently not handled correctly for multisheet schematics
//m->SetTimeStamp( moduleTstamp( e.name, e.value ) );
//m->SetPath( modulePath( e.name, e.value ) );
m_board->Add( m, ADD_APPEND ); m_board->Add( m, ADD_APPEND );
// update the nets within the pads of the clone // update the nets within the pads of the clone
@ -1239,7 +1244,7 @@ void EAGLE_PLUGIN::packageWire( MODULE* aModule, wxXmlNode* aTree ) const
else else
{ {
dwg = new EDGE_MODULE( aModule, S_ARC ); dwg = new EDGE_MODULE( aModule, S_ARC );
wxPoint center = kicad_arc_center( start, end, *w.curve); wxPoint center = ConvertArcCenter( start, end, *w.curve );
dwg->SetStart0( center ); dwg->SetStart0( center );
dwg->SetEnd0( start ); dwg->SetEnd0( start );
@ -1365,7 +1370,7 @@ void EAGLE_PLUGIN::packageText( MODULE* aModule, wxXmlNode* aTree ) const
aModule->GraphicalItemsList().PushBack( txt ); aModule->GraphicalItemsList().PushBack( txt );
} }
txt->SetTimeStamp( timeStamp( aTree ) ); txt->SetTimeStamp( EagleTimeStamp( aTree ) );
txt->SetText( FROM_UTF8( t.text.c_str() ) ); txt->SetText( FROM_UTF8( t.text.c_str() ) );
wxPoint pos( kicad_x( t.x ), kicad_y( t.y ) ); wxPoint pos( kicad_x( t.x ), kicad_y( t.y ) );
@ -1461,7 +1466,7 @@ void EAGLE_PLUGIN::packageRectangle( MODULE* aModule, wxXmlNode* aTree ) const
dwg->SetLayer( layer ); dwg->SetLayer( layer );
dwg->SetWidth( 0 ); dwg->SetWidth( 0 );
dwg->SetTimeStamp( timeStamp( aTree ) ); dwg->SetTimeStamp( EagleTimeStamp( aTree ) );
std::vector<wxPoint> pts; std::vector<wxPoint> pts;
@ -1505,9 +1510,10 @@ void EAGLE_PLUGIN::packagePolygon( MODULE* aModule, wxXmlNode* aTree ) const
} }
*/ */
dwg->SetLayer( layer ); dwg->SetLayer( layer );
dwg->SetTimeStamp( timeStamp( aTree ) ); dwg->SetTimeStamp( EagleTimeStamp( aTree ) );
std::vector<wxPoint> pts; std::vector<wxPoint> pts;
// TODO: I think there's no way to know a priori the number of children in wxXmlNode :() // TODO: I think there's no way to know a priori the number of children in wxXmlNode :()
@ -1558,7 +1564,7 @@ void EAGLE_PLUGIN::packageCircle( MODULE* aModule, wxXmlNode* aTree ) const
} }
gr->SetLayer( layer ); gr->SetLayer( layer );
gr->SetTimeStamp( timeStamp( aTree ) ); gr->SetTimeStamp( EagleTimeStamp( aTree ) );
gr->SetStart0( wxPoint( kicad_x( e.x ), kicad_y( e.y ) ) ); gr->SetStart0( wxPoint( kicad_x( e.x ), kicad_y( e.y ) ) );
gr->SetEnd0( wxPoint( kicad_x( e.x + e.radius ), kicad_y( e.y ) ) ); gr->SetEnd0( wxPoint( kicad_x( e.x + e.radius ), kicad_y( e.y ) ) );
@ -1710,7 +1716,7 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
{ {
TRACK* t = new TRACK( m_board ); TRACK* t = new TRACK( m_board );
t->SetTimeStamp( timeStamp( netItem ) ); t->SetTimeStamp( EagleTimeStamp( netItem ) );
t->SetPosition( wxPoint( kicad_x( w.x1 ), kicad_y( w.y1 ) ) ); t->SetPosition( wxPoint( kicad_x( w.x1 ), kicad_y( w.y1 ) ) );
t->SetEnd( wxPoint( kicad_x( w.x2 ), kicad_y( w.y2 ) ) ); t->SetEnd( wxPoint( kicad_x( w.x2 ), kicad_y( w.y2 ) ) );
@ -1788,7 +1794,7 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
else else
via->SetViaType( VIA_BLIND_BURIED ); via->SetViaType( VIA_BLIND_BURIED );
via->SetTimeStamp( timeStamp( netItem ) ); via->SetTimeStamp( EagleTimeStamp( netItem ) );
wxPoint pos( kicad_x( v.x ), kicad_y( v.y ) ); wxPoint pos( kicad_x( v.x ), kicad_y( v.y ) );
@ -1834,7 +1840,7 @@ void EAGLE_PLUGIN::loadSignals( wxXmlNode* aSignals )
m_board->Add( zone, ADD_APPEND ); m_board->Add( zone, ADD_APPEND );
zones.push_back( zone ); zones.push_back( zone );
zone->SetTimeStamp( timeStamp( netItem ) ); zone->SetTimeStamp( EagleTimeStamp( netItem ) );
zone->SetLayer( layer ); zone->SetLayer( layer );
zone->SetNetCode( netCode ); zone->SetNetCode( netCode );

View File

@ -460,6 +460,7 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName )
if( aLibName.IsEmpty() ) if( aLibName.IsEmpty() )
{ {
DIALOG_SELECT_PRETTY_LIB dlg( this, initialPath ); DIALOG_SELECT_PRETTY_LIB dlg( this, initialPath );
if( dlg.ShowModal() != wxID_OK ) if( dlg.ShowModal() != wxID_OK )
return wxEmptyString; return wxEmptyString;