diff --git a/eeschema/sch_eagle_plugin.cpp b/eeschema/sch_eagle_plugin.cpp index 0b36e1f257..29ef48ee35 100644 --- a/eeschema/sch_eagle_plugin.cpp +++ b/eeschema/sch_eagle_plugin.cpp @@ -469,9 +469,10 @@ void SCH_EAGLE_PLUGIN::loadDrawing( wxXmlNode* aDrawingNode ) // wxXmlNode* grid = drawingChildren["grid"] - wxXmlNode* layers = drawingChildren["layers"]; + auto layers = drawingChildren["layers"]; - loadLayerDefs( layers ); + if( layers ) + loadLayerDefs( layers ); // wxXmlNode* library = drawingChildren["library"] @@ -479,7 +480,9 @@ void SCH_EAGLE_PLUGIN::loadDrawing( wxXmlNode* aDrawingNode ) // Load schematic - loadSchematic( drawingChildren["schematic"] ); + auto schematic = drawingChildren["schematic"]; + if( schematic ) + loadSchematic( schematic ); } @@ -488,7 +491,8 @@ void SCH_EAGLE_PLUGIN::countNets( wxXmlNode* aSchematicNode ) // Map all children into a readable dictionary NODE_MAP schematicChildren = MapChildren( aSchematicNode ); // Loop through all the sheets - wxXmlNode* sheetNode = schematicChildren["sheets"]->GetChildren(); + + wxXmlNode* sheetNode = getChildrenNodes( schematicChildren, "sheets" ); while( sheetNode ) { @@ -519,8 +523,12 @@ void SCH_EAGLE_PLUGIN::loadSchematic( wxXmlNode* aSchematicNode ) { // Map all children into a readable dictionary NODE_MAP schematicChildren = MapChildren( aSchematicNode ); + auto partNode = getChildrenNodes( schematicChildren, "parts" ); + auto libraryNode = getChildrenNodes( schematicChildren, "libraries" ); + auto sheetNode = getChildrenNodes( schematicChildren, "sheets" ); - wxXmlNode* partNode = schematicChildren["parts"]->GetChildren(); + if( !partNode || !libraryNode || !sheetNode ) + return; while( partNode ) { @@ -529,10 +537,7 @@ void SCH_EAGLE_PLUGIN::loadSchematic( wxXmlNode* aSchematicNode ) partNode = partNode->GetNext(); } - // Loop through all the libraries - wxXmlNode* libraryNode = schematicChildren["libraries"]->GetChildren(); - while( libraryNode ) { // Read the library name @@ -553,9 +558,7 @@ void SCH_EAGLE_PLUGIN::loadSchematic( wxXmlNode* aSchematicNode ) countNets( aSchematicNode ); // Loop through all the sheets - wxXmlNode* sheetNode = schematicChildren["sheets"]->GetChildren(); - - int sheet_count = countChildren( schematicChildren["sheets"], "sheet" ); + int sheet_count = countChildren( sheetNode->GetParent(), "sheet" ); // If eagle schematic has multiple sheets then create corresponding subsheets on the root sheet if( sheet_count > 1 ) @@ -1228,7 +1231,7 @@ EAGLE_LIBRARY* SCH_EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLibraryNode, NODE_MAP libraryChildren = MapChildren( aLibraryNode ); // Loop through the symbols and load each of them - wxXmlNode* symbolNode = libraryChildren["symbols"]->GetChildren(); + wxXmlNode* symbolNode = getChildrenNodes( libraryChildren, "symbols" ); while( symbolNode ) { @@ -1238,7 +1241,7 @@ EAGLE_LIBRARY* SCH_EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLibraryNode, } // Loop through the devicesets and load each of them - wxXmlNode* devicesetNode = libraryChildren["devicesets"]->GetChildren(); + wxXmlNode* devicesetNode = getChildrenNodes( libraryChildren, "devicesets" ); while( devicesetNode ) { diff --git a/pcbnew/eagle_plugin.cpp b/pcbnew/eagle_plugin.cpp index 67f4392fdc..e0600b5a24 100644 --- a/pcbnew/eagle_plugin.cpp +++ b/pcbnew/eagle_plugin.cpp @@ -377,14 +377,20 @@ void EAGLE_PLUGIN::loadAllSections( wxXmlNode* aDoc ) void EAGLE_PLUGIN::loadDesignRules( wxXmlNode* aDesignRules ) { - m_xpath->push( "designrules" ); - m_rules->parse( aDesignRules ); - m_xpath->pop(); // "designrules" + if( aDesignRules ) + { + m_xpath->push( "designrules" ); + m_rules->parse( aDesignRules ); + m_xpath->pop(); // "designrules" + } } void EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers ) { + if( !aLayers ) + return; + ELAYERS cu; // copper layers // Get the first layer and iterate @@ -456,6 +462,9 @@ void EAGLE_PLUGIN::loadLayerDefs( wxXmlNode* aLayers ) void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics ) { + if( !aGraphics ) + return; + m_xpath->push( "plain" ); // Get the first graphic and iterate @@ -785,11 +794,16 @@ void EAGLE_PLUGIN::loadPlain( wxXmlNode* aGraphics ) void EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLib, const wxString* aLibName ) { - m_xpath->push( "packages" ); + if( !aLib || !aLibName ) + return; // library will have node, skip that and get the single packages node wxXmlNode* packages = MapChildren( aLib )["packages"]; + if( !packages ) + return; + + m_xpath->push( "packages" ); // Create a MODULE for all the eagle packages, for use later via a copy constructor // to instantiate needed MODULES in our BOARD. Save the MODULE templates in @@ -841,6 +855,9 @@ void EAGLE_PLUGIN::loadLibrary( wxXmlNode* aLib, const wxString* aLibName ) void EAGLE_PLUGIN::loadLibraries( wxXmlNode* aLibs ) { + if( !aLibs ) + return; + m_xpath->push( "libraries.library", "name" ); // Get the first library and iterate @@ -861,6 +878,9 @@ void EAGLE_PLUGIN::loadLibraries( wxXmlNode* aLibs ) void EAGLE_PLUGIN::loadElements( wxXmlNode* aElements ) { + if( !aElements ) + return; + m_xpath->push( "elements.element", "name" ); EATTR name;