Loading pcbnew/exporters/export_idf.cpp +29 −15 Original line number Original line Diff line number Diff line Loading @@ -326,6 +326,14 @@ static void idf_export_module( BOARD* aPcb, MODULE* aModule, if( !modfile->Is3DType( S3D_MASTER::FILE3D_IDF ) ) if( !modfile->Is3DType( S3D_MASTER::FILE3D_IDF ) ) continue; continue; if( refdes.empty() ) { refdes = TO_UTF8( aModule->GetReference() ); if( refdes.empty() || !refdes.compare( "~" ) ) refdes = aIDFBoard.GetRefDes(); } double rotz = modfile->m_MatRotation.z + aModule->GetOrientation()/10.0; double rotz = modfile->m_MatRotation.z + aModule->GetOrientation()/10.0; double locx = modfile->m_MatPosition.x; double locx = modfile->m_MatPosition.x; double locy = modfile->m_MatPosition.y; double locy = modfile->m_MatPosition.y; Loading @@ -333,8 +341,6 @@ static void idf_export_module( BOARD* aPcb, MODULE* aModule, bool top = ( aModule->GetLayer() == LAYER_N_BACK ) ? false : true; bool top = ( aModule->GetLayer() == LAYER_N_BACK ) ? false : true; refdes = TO_UTF8( aModule->GetReference() ); if( top ) if( top ) { { locy = -locy; locy = -locy; Loading Loading @@ -376,6 +382,8 @@ bool Export_IDF3( BOARD* aPcb, const wxString& aFullFileName, double aUseThou ) SetLocaleTo_C_standard(); SetLocaleTo_C_standard(); try { idfBoard.Setup( aPcb->GetFileName(), aFullFileName, aUseThou, idfBoard.Setup( aPcb->GetFileName(), aFullFileName, aUseThou, aPcb->GetDesignSettings().GetBoardThickness() ); aPcb->GetDesignSettings().GetBoardThickness() ); Loading @@ -392,6 +400,12 @@ bool Export_IDF3( BOARD* aPcb, const wxString& aFullFileName, double aUseThou ) idf_export_module( aPcb, module, idfBoard ); idf_export_module( aPcb, module, idfBoard ); idfBoard.Finish(); idfBoard.Finish(); } catch( IO_ERROR ioe ) { wxLogDebug( wxT( "An error occurred attemping export to IDFv3.\n\nError: %s" ), GetChars( ioe.errorText ) ); } SetLocaleTo_Default(); SetLocaleTo_Default(); Loading pcbnew/exporters/idf.cpp +65 −5 Original line number Original line Diff line number Diff line Loading @@ -3,7 +3,7 @@ * * * This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application. * * * Copyright (C) 2013 Cirilo Bernardo * Copyright (C) 2013-2014 Cirilo Bernardo * * * This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License Loading Loading @@ -43,6 +43,7 @@ #include <wx/file.h> #include <wx/file.h> #include <wx/filename.h> #include <wx/filename.h> #include <macros.h> #include <macros.h> #include <richio.h> #include <idf.h> #include <idf.h> #include <build_version.h> #include <build_version.h> Loading Loading @@ -311,6 +312,39 @@ void IDF_SEGMENT::SwapEnds( void ) } } void IDF_OUTLINE::push( IDF_SEGMENT* item ) { if( !outline.empty() ) { if( item->IsCircle() ) { // not allowed wxString msg = wxT( "INVALID GEOMETRY: a circle is being added to a non-empty outline" ); THROW_IO_ERROR( msg ); } else { if( outline.back()->IsCircle() ) { // we can't add lines to a circle wxString msg = wxT( "INVALID GEOMETRY: a line is being added to a circular outline" ); THROW_IO_ERROR( msg ); } else if( !item->MatchesStart( outline.back()->endPoint ) ) { // startPoint[N] != endPoint[N -1] wxString msg = wxT( "INVALID GEOMETRY: disjoint segments" ); THROW_IO_ERROR( msg ); } } } outline.push_back( item ); dir += ( outline.back()->endPoint.x - outline.back()->startPoint.x ) * ( outline.back()->endPoint.y + outline.back()->startPoint.y ); } IDF_DRILL_DATA::IDF_DRILL_DATA( double aDrillDia, double aPosX, double aPosY, IDF_DRILL_DATA::IDF_DRILL_DATA( double aDrillDia, double aPosX, double aPosY, IDF3::KEY_PLATING aPlating, IDF3::KEY_PLATING aPlating, const std::string aRefDes, const std::string aRefDes, Loading Loading @@ -452,6 +486,7 @@ bool IDF_DRILL_DATA::Write( FILE* aLayoutFile ) IDF_BOARD::IDF_BOARD() IDF_BOARD::IDF_BOARD() { { refdesIndex = 0; outlineIndex = 0; outlineIndex = 0; scale = 1e-6; scale = 1e-6; boardThickness = 1.6; // default to 1.6mm thick boards boardThickness = 1.6; // default to 1.6mm thick boards Loading @@ -466,7 +501,20 @@ IDF_BOARD::IDF_BOARD() IDF_BOARD::~IDF_BOARD() IDF_BOARD::~IDF_BOARD() { { Finish(); // simply close files if they are open; do not attempt // anything else since a previous exception may have left // data in a bad state. if( layoutFile != NULL ) { fclose( layoutFile ); layoutFile = NULL; } if( libFile != NULL ) { fclose( libFile ); libFile = NULL; } } } Loading Loading @@ -525,7 +573,7 @@ bool IDF_BOARD::Setup( wxString aBoardName, TO_UTF8( brdname.GetFullName() ), useThou ? "THOU" : "MM" ); TO_UTF8( brdname.GetFullName() ), useThou ? "THOU" : "MM" ); fprintf( libFile, ".HEADER\n" fprintf( libFile, ".HEADER\n" "BOARD_FILE 3.0 \"Created by KiCad %s\" %.4d/%.2d/%.2d.%.2d:%.2d:%.2d 1\n" "LIBRARY_FILE 3.0 \"Created by KiCad %s\" %.4d/%.2d/%.2d.%.2d:%.2d:%.2d 1\n" ".END_HEADER\n\n", ".END_HEADER\n\n", TO_UTF8( GetBuildVersion() ), TO_UTF8( GetBuildVersion() ), tdate.GetYear(), tdate.GetMonth() + 1, tdate.GetDay(), tdate.GetYear(), tdate.GetMonth() + 1, tdate.GetDay(), Loading Loading @@ -775,6 +823,16 @@ bool IDF_BOARD::PlaceComponent( const wxString aComponentFile, const std::string } } std::string IDF_BOARD::GetRefDes( void ) { std::ostringstream ostr; ostr << "NOREFDES_" << refdesIndex++; return ostr.str(); } bool IDF_BOARD::WriteDrills( void ) bool IDF_BOARD::WriteDrills( void ) { { if( !layoutFile ) if( !layoutFile ) Loading Loading @@ -1500,9 +1558,11 @@ bool IDF_COMP::parseRec2( const std::string aLine, bool& isNewItem ) return false; return false; } } teststr.str( "" ); teststr.clear(); teststr << geometry << "_" << partno; teststr << geometry << "_" << partno; isNewItem = parent->RegisterOutline( teststr.str() ); if( !parent->RegisterOutline( teststr.str() ) ) isNewItem = true; return true; return true; } } Loading pcbnew/exporters/idf.h +5 −10 Original line number Original line Diff line number Diff line Loading @@ -5,7 +5,7 @@ /* /* * This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application. * * * Copyright (C) 2013 Cirilo Bernardo * Copyright (C) 2013-2014 Cirilo Bernardo * * * This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License Loading Loading @@ -292,15 +292,7 @@ public: } } // push a segment onto the internal list // push a segment onto the internal list void push( IDF_SEGMENT* item ) void push( IDF_SEGMENT* item ); { // XXX - check that startPoint[N] == endPoint[N -1], otherwise THROW // XXX - a Circle must stand alone; if we add to a circle or add a // circle to an existing list, we should throw an exception. outline.push_back( item ); dir += ( outline.back()->endPoint.x - outline.back()->startPoint.x ) * ( outline.back()->endPoint.y + outline.back()->startPoint.y ); } }; }; Loading Loading @@ -459,6 +451,7 @@ private: double scale; ///< scale from KiCad IU to IDF output units double scale; ///< scale from KiCad IU to IDF output units double boardThickness; ///< total thickness of the PCB double boardThickness; ///< total thickness of the PCB bool hasBrdOutlineHdr; ///< true when a board outline header has been written bool hasBrdOutlineHdr; ///< true when a board outline header has been written int refdesIndex; ///< index to generate REFDES for modules which have none double offsetX; ///< offset to roughly center the board on the world origin double offsetX; ///< offset to roughly center the board on the world origin double offsetY; double offsetY; Loading Loading @@ -538,6 +531,8 @@ public: bool PlaceComponent( const wxString aComponentFile, const std::string aRefDes, bool PlaceComponent( const wxString aComponentFile, const std::string aRefDes, double aXLoc, double aYLoc, double aZLoc, double aXLoc, double aYLoc, double aZLoc, double aRotation, bool isOnTop ); double aRotation, bool isOnTop ); std::string GetRefDes( void ); }; }; Loading Loading
pcbnew/exporters/export_idf.cpp +29 −15 Original line number Original line Diff line number Diff line Loading @@ -326,6 +326,14 @@ static void idf_export_module( BOARD* aPcb, MODULE* aModule, if( !modfile->Is3DType( S3D_MASTER::FILE3D_IDF ) ) if( !modfile->Is3DType( S3D_MASTER::FILE3D_IDF ) ) continue; continue; if( refdes.empty() ) { refdes = TO_UTF8( aModule->GetReference() ); if( refdes.empty() || !refdes.compare( "~" ) ) refdes = aIDFBoard.GetRefDes(); } double rotz = modfile->m_MatRotation.z + aModule->GetOrientation()/10.0; double rotz = modfile->m_MatRotation.z + aModule->GetOrientation()/10.0; double locx = modfile->m_MatPosition.x; double locx = modfile->m_MatPosition.x; double locy = modfile->m_MatPosition.y; double locy = modfile->m_MatPosition.y; Loading @@ -333,8 +341,6 @@ static void idf_export_module( BOARD* aPcb, MODULE* aModule, bool top = ( aModule->GetLayer() == LAYER_N_BACK ) ? false : true; bool top = ( aModule->GetLayer() == LAYER_N_BACK ) ? false : true; refdes = TO_UTF8( aModule->GetReference() ); if( top ) if( top ) { { locy = -locy; locy = -locy; Loading Loading @@ -376,6 +382,8 @@ bool Export_IDF3( BOARD* aPcb, const wxString& aFullFileName, double aUseThou ) SetLocaleTo_C_standard(); SetLocaleTo_C_standard(); try { idfBoard.Setup( aPcb->GetFileName(), aFullFileName, aUseThou, idfBoard.Setup( aPcb->GetFileName(), aFullFileName, aUseThou, aPcb->GetDesignSettings().GetBoardThickness() ); aPcb->GetDesignSettings().GetBoardThickness() ); Loading @@ -392,6 +400,12 @@ bool Export_IDF3( BOARD* aPcb, const wxString& aFullFileName, double aUseThou ) idf_export_module( aPcb, module, idfBoard ); idf_export_module( aPcb, module, idfBoard ); idfBoard.Finish(); idfBoard.Finish(); } catch( IO_ERROR ioe ) { wxLogDebug( wxT( "An error occurred attemping export to IDFv3.\n\nError: %s" ), GetChars( ioe.errorText ) ); } SetLocaleTo_Default(); SetLocaleTo_Default(); Loading
pcbnew/exporters/idf.cpp +65 −5 Original line number Original line Diff line number Diff line Loading @@ -3,7 +3,7 @@ * * * This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application. * * * Copyright (C) 2013 Cirilo Bernardo * Copyright (C) 2013-2014 Cirilo Bernardo * * * This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License Loading Loading @@ -43,6 +43,7 @@ #include <wx/file.h> #include <wx/file.h> #include <wx/filename.h> #include <wx/filename.h> #include <macros.h> #include <macros.h> #include <richio.h> #include <idf.h> #include <idf.h> #include <build_version.h> #include <build_version.h> Loading Loading @@ -311,6 +312,39 @@ void IDF_SEGMENT::SwapEnds( void ) } } void IDF_OUTLINE::push( IDF_SEGMENT* item ) { if( !outline.empty() ) { if( item->IsCircle() ) { // not allowed wxString msg = wxT( "INVALID GEOMETRY: a circle is being added to a non-empty outline" ); THROW_IO_ERROR( msg ); } else { if( outline.back()->IsCircle() ) { // we can't add lines to a circle wxString msg = wxT( "INVALID GEOMETRY: a line is being added to a circular outline" ); THROW_IO_ERROR( msg ); } else if( !item->MatchesStart( outline.back()->endPoint ) ) { // startPoint[N] != endPoint[N -1] wxString msg = wxT( "INVALID GEOMETRY: disjoint segments" ); THROW_IO_ERROR( msg ); } } } outline.push_back( item ); dir += ( outline.back()->endPoint.x - outline.back()->startPoint.x ) * ( outline.back()->endPoint.y + outline.back()->startPoint.y ); } IDF_DRILL_DATA::IDF_DRILL_DATA( double aDrillDia, double aPosX, double aPosY, IDF_DRILL_DATA::IDF_DRILL_DATA( double aDrillDia, double aPosX, double aPosY, IDF3::KEY_PLATING aPlating, IDF3::KEY_PLATING aPlating, const std::string aRefDes, const std::string aRefDes, Loading Loading @@ -452,6 +486,7 @@ bool IDF_DRILL_DATA::Write( FILE* aLayoutFile ) IDF_BOARD::IDF_BOARD() IDF_BOARD::IDF_BOARD() { { refdesIndex = 0; outlineIndex = 0; outlineIndex = 0; scale = 1e-6; scale = 1e-6; boardThickness = 1.6; // default to 1.6mm thick boards boardThickness = 1.6; // default to 1.6mm thick boards Loading @@ -466,7 +501,20 @@ IDF_BOARD::IDF_BOARD() IDF_BOARD::~IDF_BOARD() IDF_BOARD::~IDF_BOARD() { { Finish(); // simply close files if they are open; do not attempt // anything else since a previous exception may have left // data in a bad state. if( layoutFile != NULL ) { fclose( layoutFile ); layoutFile = NULL; } if( libFile != NULL ) { fclose( libFile ); libFile = NULL; } } } Loading Loading @@ -525,7 +573,7 @@ bool IDF_BOARD::Setup( wxString aBoardName, TO_UTF8( brdname.GetFullName() ), useThou ? "THOU" : "MM" ); TO_UTF8( brdname.GetFullName() ), useThou ? "THOU" : "MM" ); fprintf( libFile, ".HEADER\n" fprintf( libFile, ".HEADER\n" "BOARD_FILE 3.0 \"Created by KiCad %s\" %.4d/%.2d/%.2d.%.2d:%.2d:%.2d 1\n" "LIBRARY_FILE 3.0 \"Created by KiCad %s\" %.4d/%.2d/%.2d.%.2d:%.2d:%.2d 1\n" ".END_HEADER\n\n", ".END_HEADER\n\n", TO_UTF8( GetBuildVersion() ), TO_UTF8( GetBuildVersion() ), tdate.GetYear(), tdate.GetMonth() + 1, tdate.GetDay(), tdate.GetYear(), tdate.GetMonth() + 1, tdate.GetDay(), Loading Loading @@ -775,6 +823,16 @@ bool IDF_BOARD::PlaceComponent( const wxString aComponentFile, const std::string } } std::string IDF_BOARD::GetRefDes( void ) { std::ostringstream ostr; ostr << "NOREFDES_" << refdesIndex++; return ostr.str(); } bool IDF_BOARD::WriteDrills( void ) bool IDF_BOARD::WriteDrills( void ) { { if( !layoutFile ) if( !layoutFile ) Loading Loading @@ -1500,9 +1558,11 @@ bool IDF_COMP::parseRec2( const std::string aLine, bool& isNewItem ) return false; return false; } } teststr.str( "" ); teststr.clear(); teststr << geometry << "_" << partno; teststr << geometry << "_" << partno; isNewItem = parent->RegisterOutline( teststr.str() ); if( !parent->RegisterOutline( teststr.str() ) ) isNewItem = true; return true; return true; } } Loading
pcbnew/exporters/idf.h +5 −10 Original line number Original line Diff line number Diff line Loading @@ -5,7 +5,7 @@ /* /* * This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application. * * * Copyright (C) 2013 Cirilo Bernardo * Copyright (C) 2013-2014 Cirilo Bernardo * * * This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License Loading Loading @@ -292,15 +292,7 @@ public: } } // push a segment onto the internal list // push a segment onto the internal list void push( IDF_SEGMENT* item ) void push( IDF_SEGMENT* item ); { // XXX - check that startPoint[N] == endPoint[N -1], otherwise THROW // XXX - a Circle must stand alone; if we add to a circle or add a // circle to an existing list, we should throw an exception. outline.push_back( item ); dir += ( outline.back()->endPoint.x - outline.back()->startPoint.x ) * ( outline.back()->endPoint.y + outline.back()->startPoint.y ); } }; }; Loading Loading @@ -459,6 +451,7 @@ private: double scale; ///< scale from KiCad IU to IDF output units double scale; ///< scale from KiCad IU to IDF output units double boardThickness; ///< total thickness of the PCB double boardThickness; ///< total thickness of the PCB bool hasBrdOutlineHdr; ///< true when a board outline header has been written bool hasBrdOutlineHdr; ///< true when a board outline header has been written int refdesIndex; ///< index to generate REFDES for modules which have none double offsetX; ///< offset to roughly center the board on the world origin double offsetX; ///< offset to roughly center the board on the world origin double offsetY; double offsetY; Loading Loading @@ -538,6 +531,8 @@ public: bool PlaceComponent( const wxString aComponentFile, const std::string aRefDes, bool PlaceComponent( const wxString aComponentFile, const std::string aRefDes, double aXLoc, double aYLoc, double aZLoc, double aXLoc, double aYLoc, double aZLoc, double aRotation, bool isOnTop ); double aRotation, bool isOnTop ); std::string GetRefDes( void ); }; }; Loading