Workaround for non-ASCII filenames in Windows

This commit is contained in:
Cirilo Bernardo 2017-03-03 09:53:49 +11:00 committed by Wayne Stambaugh
parent 966052272f
commit 68bcdec87e
38 changed files with 601 additions and 371 deletions

View File

@ -1,9 +1,9 @@
include_directories( include_directories(
${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/3d-viewer ${CMAKE_SOURCE_DIR}/3d-viewer
) )
add_library( kicad_3dsg SHARED set( SG_FILES
sg_base.cpp sg_base.cpp
sg_node.cpp sg_node.cpp
sg_helpers.cpp sg_helpers.cpp
@ -29,6 +29,12 @@ add_library( kicad_3dsg SHARED
ifsg_api.cpp ifsg_api.cpp
) )
if( MINGW )
list( APPEND SG_FILES ${CMAKE_SOURCE_DIR}/common/streamwrapper.cpp )
endif( MINGW )
add_library( kicad_3dsg SHARED ${SG_FILES} )
if( APPLE ) if( APPLE )
# puts library into the main kicad.app bundle in build tree # puts library into the main kicad.app bundle in build tree
set_target_properties( kicad_3dsg PROPERTIES set_target_properties( kicad_3dsg PROPERTIES

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -28,6 +28,7 @@
#include <wx/log.h> #include <wx/log.h>
#include "plugins/3dapi/ifsg_api.h" #include "plugins/3dapi/ifsg_api.h"
#include "plugins/3dapi/sg_version.h" #include "plugins/3dapi/sg_version.h"
#include "streamwrapper.h"
#include "3d_cache/sg/sg_node.h" #include "3d_cache/sg/sg_node.h"
#include "3d_cache/sg/scenegraph.h" #include "3d_cache/sg/scenegraph.h"
#include "3d_cache/sg/sg_appearance.h" #include "3d_cache/sg/sg_appearance.h"
@ -77,24 +78,6 @@ static void formatMaterial( SMATERIAL& mat, SGAPPEARANCE const* app )
} }
class VRML_LOCALE
{
private:
std::string lname;
public:
VRML_LOCALE() : lname( setlocale( LC_NUMERIC, NULL ) )
{
setlocale( LC_NUMERIC, "C" ); // switch the numerics locale to "C"
}
~VRML_LOCALE()
{
setlocale( LC_NUMERIC, lname.c_str() ); // revert to the previous locale
}
};
bool S3D::WriteVRML( const char* filename, bool overwrite, SGNODE* aTopNode, bool S3D::WriteVRML( const char* filename, bool overwrite, SGNODE* aTopNode,
bool reuse, bool renameNodes ) bool reuse, bool renameNodes )
{ {
@ -141,12 +124,9 @@ bool S3D::WriteVRML( const char* filename, bool overwrite, SGNODE* aTopNode,
return false; return false;
} }
VRML_LOCALE vrmlLocale; OPEN_OSTREAM( op, filename );
std::ofstream op;
op.open( filename, std::ios_base::out | std::ios_base::trunc
| std::ios_base::binary );
if( !op.is_open() ) if( op.fail() )
{ {
std::ostringstream ostr; std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
@ -156,6 +136,7 @@ bool S3D::WriteVRML( const char* filename, bool overwrite, SGNODE* aTopNode,
return false; return false;
} }
op.imbue( std::locale( "C" ) );
op << "#VRML V2.0 utf8\n"; op << "#VRML V2.0 utf8\n";
if( renameNodes ) if( renameNodes )
@ -168,11 +149,11 @@ bool S3D::WriteVRML( const char* filename, bool overwrite, SGNODE* aTopNode,
if( !op.fail() ) if( !op.fail() )
{ {
op.close(); CLOSE_STREAM( op );
return true; return true;
} }
op.close(); CLOSE_STREAM( op );
do { do {
std::ostringstream ostr; std::ostringstream ostr;
@ -302,11 +283,9 @@ bool S3D::WriteCache( const char* aFileName, bool overwrite, SGNODE* aNode,
} }
} }
std::ofstream output; OPEN_OSTREAM( output, aFileName );
output.open( aFileName, std::ios_base::out | std::ios_base::trunc
| std::ios_base::binary );
if( !output.is_open() ) if( output.fail() )
{ {
std::ostringstream ostr; std::ostringstream ostr;
ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
@ -324,7 +303,7 @@ bool S3D::WriteCache( const char* aFileName, bool overwrite, SGNODE* aNode,
output << "(INTERNAL:0.0.0.0)"; output << "(INTERNAL:0.0.0.0)";
bool rval = aNode->WriteCache( output, NULL ); bool rval = aNode->WriteCache( output, NULL );
output.close(); CLOSE_STREAM( output );
if( !rval ) if( !rval )
{ {
@ -382,10 +361,9 @@ SGNODE* S3D::ReadCache( const char* aFileName, void* aPluginMgr,
return NULL; return NULL;
} }
std::ifstream file; OPEN_ISTREAM( file, aFileName );
file.open( aFileName, std::ios_base::in | std::ios_base::binary );
if( !file.is_open() ) if( file.fail() )
{ {
delete np; delete np;
std::ostringstream ostr; std::ostringstream ostr;
@ -417,7 +395,7 @@ SGNODE* S3D::ReadCache( const char* aFileName, void* aPluginMgr,
} while( 0 ); } while( 0 );
#endif #endif
file.close(); CLOSE_STREAM( file );
return NULL; return NULL;
} }
@ -431,7 +409,7 @@ SGNODE* S3D::ReadCache( const char* aFileName, void* aPluginMgr,
if( name.compare( SG_VERSION_TAG ) ) if( name.compare( SG_VERSION_TAG ) )
{ {
file.close(); CLOSE_STREAM( file );
return NULL; return NULL;
} }
@ -457,7 +435,7 @@ SGNODE* S3D::ReadCache( const char* aFileName, void* aPluginMgr,
} while( 0 ); } while( 0 );
#endif #endif
file.close(); CLOSE_STREAM( file );
return NULL; return NULL;
} }
@ -472,14 +450,14 @@ SGNODE* S3D::ReadCache( const char* aFileName, void* aPluginMgr,
// check the plugin tag // check the plugin tag
if( NULL != aTagCheck && NULL != aPluginMgr && !aTagCheck( name.c_str(), aPluginMgr ) ) if( NULL != aTagCheck && NULL != aPluginMgr && !aTagCheck( name.c_str(), aPluginMgr ) )
{ {
file.close(); CLOSE_STREAM( file );
return NULL; return NULL;
} }
} while( 0 ); } while( 0 );
bool rval = np->ReadCache( file, NULL ); bool rval = np->ReadCache( file, NULL );
file.close(); CLOSE_STREAM( file );
if( !rval ) if( !rval )
{ {

View File

@ -257,7 +257,7 @@ void SCENEGRAPH::ReNameNodes( void )
} }
bool SCENEGRAPH::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SCENEGRAPH::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( m_Transforms.empty() && m_RTransforms.empty() if( m_Transforms.empty() && m_RTransforms.empty()
&& m_Shape.empty() && m_RShape.empty() ) && m_Shape.empty() && m_RShape.empty() )
@ -364,7 +364,7 @@ bool SCENEGRAPH::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SCENEGRAPH::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SCENEGRAPH::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode && NULL != m_Parent ) if( NULL == parentNode && NULL != m_Parent )
{ {
@ -510,7 +510,7 @@ bool SCENEGRAPH::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SCENEGRAPH::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SCENEGRAPH::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( !m_Transforms.empty() || !m_RTransforms.empty() if( !m_Transforms.empty() || !m_RTransforms.empty()
|| !m_Shape.empty() || !m_RShape.empty() ) || !m_Shape.empty() || !m_RShape.empty() )

View File

@ -79,10 +79,10 @@ public:
bool AddChildNode( SGNODE* aNode ) override; bool AddChildNode( SGNODE* aNode ) override;
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
bool Prepare( const glm::dmat4* aTransform, bool Prepare( const glm::dmat4* aTransform,
S3D::MATLIST& materials, std::vector< SMESH >& meshes ); S3D::MATLIST& materials, std::vector< SMESH >& meshes );

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -289,7 +289,7 @@ void SGAPPEARANCE::ReNameNodes( void )
} }
bool SGAPPEARANCE::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGAPPEARANCE::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( aReuseFlag ) if( aReuseFlag )
{ {
@ -366,7 +366,7 @@ bool SGAPPEARANCE::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGAPPEARANCE::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGAPPEARANCE::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -436,7 +436,7 @@ bool SGAPPEARANCE::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGAPPEARANCE::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGAPPEARANCE::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
S3D::ReadColor( aFile, ambient ); S3D::ReadColor( aFile, ambient );
aFile.read( (char*)&shininess, sizeof(shininess) ); aFile.read( (char*)&shininess, sizeof(shininess) );

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -71,10 +71,10 @@ public:
bool AddChildNode( SGNODE* aNode ) override; bool AddChildNode( SGNODE* aNode ) override;
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
}; };
#endif // SG_APPEARANCE_H #endif // SG_APPEARANCE_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -207,7 +207,7 @@ void SGCOLORS::ReNameNodes( void )
} }
bool SGCOLORS::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGCOLORS::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( colors.empty() ) if( colors.empty() )
return false; return false;
@ -265,7 +265,7 @@ bool SGCOLORS::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGCOLORS::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGCOLORS::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -334,7 +334,7 @@ bool SGCOLORS::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGCOLORS::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGCOLORS::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( !colors.empty() ) if( !colors.empty() )
{ {

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -56,10 +56,10 @@ public:
void AddColor( const SGCOLOR& aColor ); void AddColor( const SGCOLOR& aColor );
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
}; };
#endif // SG_COLORS_H #endif // SG_COLORS_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -210,7 +210,7 @@ void SGCOORDS::ReNameNodes( void )
} }
bool SGCOORDS::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGCOORDS::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( coords.empty() ) if( coords.empty() )
return false; return false;
@ -272,7 +272,7 @@ bool SGCOORDS::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGCOORDS::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGCOORDS::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -341,7 +341,7 @@ bool SGCOORDS::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGCOORDS::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGCOORDS::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( !coords.empty() ) if( !coords.empty() )
{ {

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -65,10 +65,10 @@ public:
bool CalcNormals( SGFACESET* callingNode, SGNODE** aPtr = NULL ); bool CalcNormals( SGFACESET* callingNode, SGNODE** aPtr = NULL );
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
}; };
#endif // SG_COORDS_H #endif // SG_COORDS_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -482,7 +482,7 @@ void SGFACESET::ReNameNodes( void )
} }
bool SGFACESET::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGFACESET::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( ( NULL == m_Coords && NULL == m_RCoords ) if( ( NULL == m_Coords && NULL == m_RCoords )
|| ( NULL == m_CoordIndices ) ) || ( NULL == m_CoordIndices ) )
@ -538,7 +538,7 @@ bool SGFACESET::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGFACESET::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGFACESET::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -670,7 +670,7 @@ bool SGFACESET::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGFACESET::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGFACESET::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( m_Coords || m_RCoords || m_CoordIndices if( m_Coords || m_RCoords || m_CoordIndices
|| m_Colors || m_RColors || m_Colors || m_RColors

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -78,10 +78,10 @@ public:
bool CalcNormals( SGNODE** aPtr ); bool CalcNormals( SGNODE** aPtr );
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
/** /**
* Function GatherCoordIndices * Function GatherCoordIndices

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -162,7 +162,7 @@ void S3D::FormatColor( std::string& result, const SGCOLOR& aColor )
} }
bool S3D::WritePoint( std::ofstream& aFile, const SGPOINT& aPoint ) bool S3D::WritePoint( std::ostream& aFile, const SGPOINT& aPoint )
{ {
aFile.write( (char*)&aPoint.x, sizeof(aPoint.x) ); aFile.write( (char*)&aPoint.x, sizeof(aPoint.x) );
aFile.write( (char*)&aPoint.y, sizeof(aPoint.y) ); aFile.write( (char*)&aPoint.y, sizeof(aPoint.y) );
@ -175,7 +175,7 @@ bool S3D::WritePoint( std::ofstream& aFile, const SGPOINT& aPoint )
} }
bool S3D::WriteVector( std::ofstream& aFile, const SGVECTOR& aVector ) bool S3D::WriteVector( std::ostream& aFile, const SGVECTOR& aVector )
{ {
double x, y, z; double x, y, z;
aVector.GetVector( x, y, z ); aVector.GetVector( x, y, z );
@ -190,7 +190,7 @@ bool S3D::WriteVector( std::ofstream& aFile, const SGVECTOR& aVector )
} }
bool S3D::WriteColor( std::ofstream& aFile, const SGCOLOR& aColor ) bool S3D::WriteColor( std::ostream& aFile, const SGCOLOR& aColor )
{ {
float r, g, b; float r, g, b;
aColor.GetColor( r, g, b ); aColor.GetColor( r, g, b );
@ -205,7 +205,7 @@ bool S3D::WriteColor( std::ofstream& aFile, const SGCOLOR& aColor )
} }
S3D::SGTYPES S3D::ReadTag( std::ifstream& aFile, std::string& aName ) S3D::SGTYPES S3D::ReadTag( std::istream& aFile, std::string& aName )
{ {
char schar; char schar;
aFile.get( schar ); aFile.get( schar );
@ -293,7 +293,7 @@ S3D::SGTYPES S3D::ReadTag( std::ifstream& aFile, std::string& aName )
} }
bool S3D::ReadPoint( std::ifstream& aFile, SGPOINT& aPoint ) bool S3D::ReadPoint( std::istream& aFile, SGPOINT& aPoint )
{ {
aFile.read( (char*)&aPoint.x, sizeof( aPoint.x ) ); aFile.read( (char*)&aPoint.x, sizeof( aPoint.x ) );
aFile.read( (char*)&aPoint.y, sizeof( aPoint.y ) ); aFile.read( (char*)&aPoint.y, sizeof( aPoint.y ) );
@ -306,7 +306,7 @@ bool S3D::ReadPoint( std::ifstream& aFile, SGPOINT& aPoint )
} }
bool S3D::ReadVector( std::ifstream& aFile, SGVECTOR& aVector ) bool S3D::ReadVector( std::istream& aFile, SGVECTOR& aVector )
{ {
double x, y, z; double x, y, z;
aFile.read( (char*)&x, sizeof(double) ); aFile.read( (char*)&x, sizeof(double) );
@ -321,7 +321,7 @@ bool S3D::ReadVector( std::ifstream& aFile, SGVECTOR& aVector )
} }
bool S3D::ReadColor( std::ifstream& aFile, SGCOLOR& aColor ) bool S3D::ReadColor( std::istream& aFile, SGCOLOR& aColor )
{ {
float r, g, b; float r, g, b;
aFile.read( (char*)&r, sizeof(float) ); aFile.read( (char*)&r, sizeof(float) );

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -32,7 +32,7 @@
#ifndef SG_HELPERS_H #ifndef SG_HELPERS_H
#define SG_HELPERS_H #define SG_HELPERS_H
#include <fstream> #include <iostream>
#include <string> #include <string>
#include <algorithm> #include <algorithm>
#include <vector> #include <vector>
@ -210,13 +210,13 @@ namespace S3D
// //
// write out an XYZ vertex // write out an XYZ vertex
bool WritePoint( std::ofstream& aFile, const SGPOINT& aPoint ); bool WritePoint( std::ostream& aFile, const SGPOINT& aPoint );
// write out a unit vector // write out a unit vector
bool WriteVector( std::ofstream& aFile, const SGVECTOR& aVector ); bool WriteVector( std::ostream& aFile, const SGVECTOR& aVector );
// write out an RGB color // write out an RGB color
bool WriteColor( std::ofstream& aFile, const SGCOLOR& aColor ); bool WriteColor( std::ostream& aFile, const SGCOLOR& aColor );
// //
// Cache related READ functions // Cache related READ functions
@ -232,16 +232,16 @@ namespace S3D
* @return will be the NodeType which the tag represents or * @return will be the NodeType which the tag represents or
* S3D::SGTYPES::SGTYPE_END on failure * S3D::SGTYPES::SGTYPE_END on failure
*/ */
S3D::SGTYPES ReadTag( std::ifstream& aFile, std::string& aName ); S3D::SGTYPES ReadTag( std::istream& aFile, std::string& aName );
// read an XYZ vertex // read an XYZ vertex
bool ReadPoint( std::ifstream& aFile, SGPOINT& aPoint ); bool ReadPoint( std::istream& aFile, SGPOINT& aPoint );
// read a unit vector // read a unit vector
bool ReadVector( std::ifstream& aFile, SGVECTOR& aVector ); bool ReadVector( std::istream& aFile, SGVECTOR& aVector );
// read an RGB color // read an RGB color
bool ReadColor( std::ifstream& aFile, SGCOLOR& aColor ); bool ReadColor( std::istream& aFile, SGCOLOR& aColor );
}; };
#endif // SG_HELPERS_H #endif // SG_HELPERS_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -21,7 +21,6 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#include <fstream>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <wx/log.h> #include <wx/log.h>
@ -195,7 +194,7 @@ void SGINDEX::ReNameNodes( void )
} }
bool SGINDEX::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGINDEX::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( index.empty() ) if( index.empty() )
return false; return false;
@ -207,7 +206,7 @@ bool SGINDEX::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGINDEX::writeCoordIndex( std::ofstream& aFile ) bool SGINDEX::writeCoordIndex( std::ostream& aFile )
{ {
size_t n = index.size(); size_t n = index.size();
@ -259,14 +258,14 @@ bool SGINDEX::writeCoordIndex( std::ofstream& aFile )
} }
bool SGINDEX::writeColorIndex( std::ofstream& aFile ) bool SGINDEX::writeColorIndex( std::ostream& aFile )
{ {
aFile << " colorIndex [\n "; aFile << " colorIndex [\n ";
return writeIndexList( aFile ); return writeIndexList( aFile );
} }
bool SGINDEX::writeIndexList( std::ofstream& aFile ) bool SGINDEX::writeIndexList( std::ostream& aFile )
{ {
// index to control formatting // index to control formatting
int nv = 0; int nv = 0;
@ -295,7 +294,7 @@ bool SGINDEX::writeIndexList( std::ofstream& aFile )
} }
bool SGINDEX::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGINDEX::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -364,7 +363,7 @@ bool SGINDEX::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGINDEX::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGINDEX::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( !index.empty() ) if( !index.empty() )
{ {

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -35,9 +35,9 @@
class SGINDEX : public SGNODE class SGINDEX : public SGNODE
{ {
protected: protected:
bool writeCoordIndex( std::ofstream& aFile ); bool writeCoordIndex( std::ostream& aFile );
bool writeColorIndex( std::ofstream& aFile ); bool writeColorIndex( std::ostream& aFile );
bool writeIndexList( std::ofstream& aFile ); bool writeIndexList( std::ostream& aFile );
public: public:
// for internal SG consumption only // for internal SG consumption only
@ -89,10 +89,10 @@ public:
void AddIndex( int aIndex ); void AddIndex( int aIndex );
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
}; };
#endif // SG_INDEX_H #endif // SG_INDEX_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -30,7 +30,7 @@
#ifndef SG_NODE_H #ifndef SG_NODE_H
#define SG_NODE_H #define SG_NODE_H
#include <fstream> #include <iostream>
#include <string> #include <string>
#include <list> #include <list>
#include <vector> #include <vector>
@ -227,7 +227,7 @@ public:
* writes this node's data to a VRML file; this includes * writes this node's data to a VRML file; this includes
* all data of child and referenced nodes. * all data of child and referenced nodes.
*/ */
virtual bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) = 0; virtual bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) = 0;
/** /**
* Function WriteCache * Function WriteCache
@ -236,7 +236,7 @@ public:
* If this function is invoked by the user, parentNode must be * If this function is invoked by the user, parentNode must be
* set to NULL in order to ensure coherent data. * set to NULL in order to ensure coherent data.
*/ */
virtual bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) = 0; virtual bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) = 0;
/** /**
* Function ReadCache * Function ReadCache
@ -244,7 +244,7 @@ public:
* open the file for reading and invoke this function from a new * open the file for reading and invoke this function from a new
* SCENEGRAPH node. * SCENEGRAPH node.
*/ */
virtual bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) = 0; virtual bool ReadCache( std::istream& aFile, SGNODE* parentNode ) = 0;
}; };
#endif // SG_NODE_H #endif // SG_NODE_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -208,7 +208,7 @@ void SGNORMALS::ReNameNodes( void )
} }
bool SGNORMALS::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGNORMALS::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( norms.empty() ) if( norms.empty() )
return false; return false;
@ -264,7 +264,7 @@ bool SGNORMALS::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGNORMALS::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGNORMALS::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -333,7 +333,7 @@ bool SGNORMALS::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGNORMALS::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGNORMALS::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( !norms.empty() ) if( !norms.empty() )
{ {

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -56,10 +56,10 @@ public:
void AddNormal( const SGVECTOR& aNormal ); void AddNormal( const SGVECTOR& aNormal );
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
}; };
#endif // SG_NORMALS_H #endif // SG_NORMALS_H

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -22,7 +22,6 @@
*/ */
#include <fstream>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <wx/log.h> #include <wx/log.h>
@ -357,7 +356,7 @@ void SGSHAPE::ReNameNodes( void )
} }
bool SGSHAPE::WriteVRML( std::ofstream& aFile, bool aReuseFlag ) bool SGSHAPE::WriteVRML( std::ostream& aFile, bool aReuseFlag )
{ {
if( !m_Appearance && !m_RAppearance if( !m_Appearance && !m_RAppearance
&& !m_FaceSet && !m_RFaceSet ) && !m_FaceSet && !m_RFaceSet )
@ -401,7 +400,7 @@ bool SGSHAPE::WriteVRML( std::ofstream& aFile, bool aReuseFlag )
} }
bool SGSHAPE::WriteCache( std::ofstream& aFile, SGNODE* parentNode ) bool SGSHAPE::WriteCache( std::ostream& aFile, SGNODE* parentNode )
{ {
if( NULL == parentNode ) if( NULL == parentNode )
{ {
@ -509,7 +508,7 @@ bool SGSHAPE::WriteCache( std::ofstream& aFile, SGNODE* parentNode )
} }
bool SGSHAPE::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) bool SGSHAPE::ReadCache( std::istream& aFile, SGNODE* parentNode )
{ {
if( m_Appearance || m_RAppearance || m_FaceSet || m_RFaceSet ) if( m_Appearance || m_RAppearance || m_FaceSet || m_RFaceSet )
{ {

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -65,10 +65,10 @@ public:
bool AddChildNode( SGNODE* aNode ) override; bool AddChildNode( SGNODE* aNode ) override;
void ReNameNodes( void ) override; void ReNameNodes( void ) override;
bool WriteVRML( std::ofstream& aFile, bool aReuseFlag ) override; bool WriteVRML( std::ostream& aFile, bool aReuseFlag ) override;
bool WriteCache( std::ofstream& aFile, SGNODE* parentNode ) override; bool WriteCache( std::ostream& aFile, SGNODE* parentNode ) override;
bool ReadCache( std::ifstream& aFile, SGNODE* parentNode ) override; bool ReadCache( std::istream& aFile, SGNODE* parentNode ) override;
bool Prepare( const glm::dmat4* aTransform, bool Prepare( const glm::dmat4* aTransform,
S3D::MATLIST& materials, std::vector< SMESH >& meshes ); S3D::MATLIST& materials, std::vector< SMESH >& meshes );

121
common/streamwrapper.cpp Normal file
View File

@ -0,0 +1,121 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined( WIN32 ) || !defined( __GNUC__ )
#error streamwrapper.cpp should not be included in this build
#endif
#include "streamwrapper.h"
#include <wx/string.h>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
kicad::stream::stream()
{
m_buf = NULL;
m_stream = NULL;
return;
}
kicad::stream::~stream()
{
if( NULL != m_stream )
delete m_stream;
if( NULL != m_buf )
{
m_buf->close(); // ensure file is closed regardless of m_buf's destructor
delete m_buf;
}
return;
}
std::iostream* kicad::stream::Open( const char* aFileName, std::ios_base::openmode aMode )
{
if( NULL != m_stream )
{
delete m_stream;
m_stream = NULL;
}
if( NULL != m_buf )
{
m_buf->close();
delete m_buf;
}
int flags = 0;
if( aMode & std::ios_base::app )
flags |= _O_APPEND;
if( aMode & std::ios_base::out && aMode & std::ios_base::in )
flags |= _O_RDWR;
else if( aMode & std::ios_base::out )
flags |= _O_WRONLY;
else if( aMode & std::ios_base::in )
flags |= _O_RDONLY;
if( aMode & std::ios_base::binary )
flags |= _O_BINARY;
if( aMode & std::ios_base::out && aMode & std::ios_base::trunc
&& !( aMode & std::ios_base::app ) && !( aMode & std::ios_base::ate ) )
flags |= _O_TRUNC;
if( aMode & std::ios_base::out )
flags |= _O_CREAT;
//int fd = open( "testfile.txt", flags, S_IRUSR | S_IWUSR );
wxString lstr( wxString::FromUTF8Unchecked( aFileName ) );
int fd = _wopen( lstr.wc_str(), flags, _S_IREAD | _S_IWRITE );
if( fd >= 0 && aMode & std::ios_base::ate )
lseek( fd, 0, SEEK_END );
// NOTE: _O_RDONLY in Windows, O_RDONLY in Linux
m_buf = new __gnu_cxx::stdio_filebuf<char>( fd, aMode );
m_stream = new std::iostream( m_buf );
return m_stream;
}
void kicad::stream::Close( void )
{
if( m_buf )
m_buf->close();
return;
}
std::iostream* kicad::stream::GetStream( void )
{
return m_stream;
}

101
include/streamwrapper.h Normal file
View File

@ -0,0 +1,101 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef STREAMWRAPPER_H
#define STREAMWRAPPER_H
#include <iostream>
#if defined( WIN32 ) && defined( __GNUC__ )
#include <ext/stdio_filebuf.h>
#define OPEN_OSTREAM( var, name ) \
kicad::stream var ## _BUF_; \
std::ostream& var = *var ## _BUF_.Open( name, std::ios_base::out | std::ios_base::trunc | std::ios_base::binary )
#define OPEN_ISTREAM( var, name ) \
kicad::stream var ## _BUF_; \
std::istream& var = *var ## _BUF_.Open( name, std::ios_base::in | std::ios_base::binary )
#define OPEN_IOSTREAM( var, name ) \
kicad::stream var ## _BUF_; \
std::iostream& var = *var ## _BUF_.Open( name, std::ios_base::out | std::ios_base::in | std::ios_base::binary )
#define CLOSE_STREAM( var ) var ## _BUF_.Close()
namespace kicad
{
class stream
{
private:
__gnu_cxx::stdio_filebuf<char>* m_buf;
std::iostream* m_stream;
public:
stream();
virtual ~stream();
std::iostream* Open( const char* aFileName, std::ios_base::openmode aMode );
void Close( void );
std::iostream* GetStream( void );
};
}
#elif defined( _MSC_VER ) // defined( WIN32 ) && defined( __GNUC__ )
#define OPEN_OSTREAM( var, name ) \
std::ofstream var; \
var.open( wxString::FromUTF8Unchecked( name ).wc_str(), \
std::ios_base::out | std::ios_base::trunc | std::ios_base::binary )
#define OPEN_ISTREAM( var, name ) \
std::ifstream var; \
var.open( wxString::FromUTF8Unchecked( name ).wc_str(), \
std::ios_base::in | std::ios_base::binary )
#define OPEN_IOSTREAM( var, name ) \
std::fstream var; \
var.open( wxString::FromUTF8Unchecked( name ).wc_str(), \
std::ios_base::out | std::ios_base::in | std::ios_base::binary )
#define CLOSE_STREAM( var ) var.close()
#else // defined( WIN32 ) && defined( __GNUC__ )
#define OPEN_OSTREAM( var, name ) \
std::ofstream var; \
var.open( name, std::ios_base::out | std::ios_base::trunc )
#define OPEN_ISTREAM( var, name ) \
std::ifstream var; \
var.open( name, std::ios_base::in )
#define OPEN_IOSTREAM( var, name ) \
std::fstream var; \
var.open( name, std::ios_base::out | std::ios_base::in )
#define CLOSE_STREAM( var ) var.close()
#endif // defined( WIN32 ) && defined( __GNUC__ )
#endif // STREAMWRAPPER_H

View File

@ -2,7 +2,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) 2009-2013 Lorenzo Mercantonio * Copyright (C) 2009-2013 Lorenzo Mercantonio
* Copyright (C) 2014-2016 Cirilo Bernardo * Copyright (C) 2014-2017 Cirilo Bernardo
* Copyright (C) 2013 Jean-Pierre Charras jp.charras at wanadoo.fr * Copyright (C) 2013 Jean-Pierre Charras jp.charras at wanadoo.fr
* Copyright (C) 2004-2016 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2004-2016 KiCad Developers, see AUTHORS.txt for contributors.
* *
@ -44,6 +44,7 @@
#include "macros.h" #include "macros.h"
#include "pgm_base.h" #include "pgm_base.h"
#include "plugins/3dapi/ifsg_all.h" #include "plugins/3dapi/ifsg_all.h"
#include "streamwrapper.h"
#include "vrml_layer.h" #include "vrml_layer.h"
#include "wxPcbStruct.h" #include "wxPcbStruct.h"
#include "../../kicad/kicad.h" #include "../../kicad/kicad.h"
@ -62,7 +63,6 @@ static bool USE_DEFS; // true to reuse component definitions
static bool USE_RELPATH; // true to use relative paths in VRML inline{} static bool USE_RELPATH; // true to use relative paths in VRML inline{}
static double WORLD_SCALE = 1.0; // scaling from 0.1 in to desired VRML unit static double WORLD_SCALE = 1.0; // scaling from 0.1 in to desired VRML unit
static double BOARD_SCALE; // scaling from mm to desired VRML world scale static double BOARD_SCALE; // scaling from mm to desired VRML world scale
static std::ofstream output_file; // legacy VRML output stream
static const int PRECISION = 6; // legacy precision factor (now set to 6) static const int PRECISION = 6; // legacy precision factor (now set to 6)
static wxString SUBDIR_3D; // legacy 3D subdirectory static wxString SUBDIR_3D; // legacy 3D subdirectory
static wxString PROJ_DIR; // project directory static wxString PROJ_DIR; // project directory
@ -315,7 +315,7 @@ static void create_vrml_shell( IFSG_TRANSFORM& PcbOutput, VRML_COLOR_INDEX color
static void create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR_INDEX colorID, static void create_vrml_plane( IFSG_TRANSFORM& PcbOutput, VRML_COLOR_INDEX colorID,
VRML_LAYER* layer, double aHeight, bool aTopPlane ); VRML_LAYER* layer, double aHeight, bool aTopPlane );
static void write_triangle_bag( std::ofstream& aOut_file, VRML_COLOR& aColor, static void write_triangle_bag( std::ostream& aOut_file, VRML_COLOR& aColor,
VRML_LAYER* aLayer, bool aPlane, bool aTop, VRML_LAYER* aLayer, bool aPlane, bool aTop,
double aTop_z, double aBottom_z ) double aTop_z, double aBottom_z )
{ {
@ -415,7 +415,8 @@ static void write_triangle_bag( std::ofstream& aOut_file, VRML_COLOR& aColor,
} }
static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName ) static void write_layers( MODEL_VRML& aModel, BOARD* aPcb,
const char* aFileName, std::ofstream* aOutputFile )
{ {
// VRML_LAYER board; // VRML_LAYER board;
aModel.m_board.Tesselate( &aModel.m_holes ); aModel.m_board.Tesselate( &aModel.m_holes );
@ -424,7 +425,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_PCB ), write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_PCB ),
&aModel.m_board, false, false, brdz, -brdz ); &aModel.m_board, false, false, brdz, -brdz );
} }
else else
@ -445,7 +446,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TRACK ), write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TRACK ),
&aModel.m_top_copper, true, true, &aModel.m_top_copper, true, true,
aModel.GetLayerZ( F_Cu ), 0 ); aModel.GetLayerZ( F_Cu ), 0 );
} }
@ -460,7 +461,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TIN ), write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TIN ),
&aModel.m_top_tin, true, true, &aModel.m_top_tin, true, true,
aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE, aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
0 ); 0 );
@ -477,7 +478,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TRACK ), write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TRACK ),
&aModel.m_bot_copper, true, false, &aModel.m_bot_copper, true, false,
aModel.GetLayerZ( B_Cu ), 0 ); aModel.GetLayerZ( B_Cu ), 0 );
} }
@ -492,7 +493,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TIN ), write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TIN ),
&aModel.m_bot_tin, true, false, &aModel.m_bot_tin, true, false,
aModel.GetLayerZ( B_Cu ) aModel.GetLayerZ( B_Cu )
- Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE, - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
@ -510,7 +511,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_TIN ), write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_TIN ),
&aModel.m_plated_holes, false, false, &aModel.m_plated_holes, false, false,
aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE, aModel.GetLayerZ( F_Cu ) + Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE,
aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE ); aModel.GetLayerZ( B_Cu ) - Millimeter2iu( ART_OFFSET / 2.0 ) * BOARD_SCALE );
@ -527,7 +528,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_SILK ), &aModel.m_top_silk, write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_SILK ), &aModel.m_top_silk,
true, true, aModel.GetLayerZ( F_SilkS ), 0 ); true, true, aModel.GetLayerZ( F_SilkS ), 0 );
} }
else else
@ -541,7 +542,7 @@ static void write_layers( MODEL_VRML& aModel, BOARD* aPcb, const char* aFileName
if( USE_INLINES ) if( USE_INLINES )
{ {
write_triangle_bag( output_file, aModel.GetColor( VRML_COLOR_SILK ), &aModel.m_bot_silk, write_triangle_bag( *aOutputFile, aModel.GetColor( VRML_COLOR_SILK ), &aModel.m_bot_silk,
true, false, aModel.GetLayerZ( B_SilkS ), 0 ); true, false, aModel.GetLayerZ( B_SilkS ), 0 );
} }
else else
@ -1265,7 +1266,8 @@ static void compose_quat( double q1[4], double q2[4], double qr[4] )
} }
static void export_vrml_module( MODEL_VRML& aModel, BOARD* aPcb, MODULE* aModule ) static void export_vrml_module( MODEL_VRML& aModel, BOARD* aPcb,
MODULE* aModule, std::ostream* aOutputFile )
{ {
if( !aModel.m_plainPCB ) if( !aModel.m_plainPCB )
{ {
@ -1404,29 +1406,28 @@ static void export_vrml_module( MODEL_VRML& aModel, BOARD* aPcb, MODULE* aModule
if( !S3D::WriteVRML( dstFile.GetFullPath().ToUTF8(), true, mod3d, USE_DEFS, true ) ) if( !S3D::WriteVRML( dstFile.GetFullPath().ToUTF8(), true, mod3d, USE_DEFS, true ) )
continue; continue;
} }
} }
output_file << "Transform {\n"; (*aOutputFile) << "Transform {\n";
// only write a rotation if it is >= 0.1 deg // only write a rotation if it is >= 0.1 deg
if( std::abs( rot[3] ) > 0.0001745 ) if( std::abs( rot[3] ) > 0.0001745 )
{ {
output_file << " rotation " << std::setprecision( 5 ); (*aOutputFile) << " rotation " << std::setprecision( 5 );
output_file << rot[0] << " " << rot[1] << " " << rot[2] << " " << rot[3] << "\n"; (*aOutputFile) << rot[0] << " " << rot[1] << " " << rot[2] << " " << rot[3] << "\n";
} }
output_file << " translation " << std::setprecision( PRECISION ); (*aOutputFile) << " translation " << std::setprecision( PRECISION );
output_file << trans.x << " "; (*aOutputFile) << trans.x << " ";
output_file << trans.y << " "; (*aOutputFile) << trans.y << " ";
output_file << trans.z << "\n"; (*aOutputFile) << trans.z << "\n";
output_file << " scale "; (*aOutputFile) << " scale ";
output_file << sM->m_Scale.x << " "; (*aOutputFile) << sM->m_Scale.x << " ";
output_file << sM->m_Scale.y << " "; (*aOutputFile) << sM->m_Scale.y << " ";
output_file << sM->m_Scale.z << "\n"; (*aOutputFile) << sM->m_Scale.z << "\n";
output_file << " children [\n Inline {\n url \""; (*aOutputFile) << " children [\n Inline {\n url \"";
if( USE_RELPATH ) if( USE_RELPATH )
{ {
@ -1439,8 +1440,8 @@ static void export_vrml_module( MODEL_VRML& aModel, BOARD* aPcb, MODULE* aModule
wxString fn = dstFile.GetFullPath(); wxString fn = dstFile.GetFullPath();
fn.Replace( "\\", "/" ); fn.Replace( "\\", "/" );
output_file << TO_UTF8( fn ) << "\"\n } ]\n"; (*aOutputFile) << TO_UTF8( fn ) << "\"\n } ]\n";
output_file << " }\n"; (*aOutputFile) << " }\n";
} }
else else
{ {
@ -1503,9 +1504,6 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString& aFullFileName, double aMMt
// plain PCB or else PCB with copper and silkscreen // plain PCB or else PCB with copper and silkscreen
model3d.m_plainPCB = aUsePlainPCB; model3d.m_plainPCB = aUsePlainPCB;
// locale switch for C numeric output
LOCALE_IO* toggle = NULL;
try try
{ {
@ -1537,8 +1535,16 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString& aFullFileName, double aMMt
throw( std::runtime_error( "Could not create 3D model subdirectory" ) ); throw( std::runtime_error( "Could not create 3D model subdirectory" ) );
} }
toggle = new LOCALE_IO; OPEN_OSTREAM( output_file, TO_UTF8( aFullFileName ) );
output_file.open( TO_UTF8( aFullFileName ), std::ios_base::out );
if( output_file.fail() )
{
std::ostringstream ostr;
ostr << "Could not open file '" << TO_UTF8( aFullFileName ) << "'";
throw( std::runtime_error( ostr.str().c_str() ) );
}
output_file.imbue( std::locale( "C" ) );
// Begin with the usual VRML boilerplate // Begin with the usual VRML boilerplate
wxString fn = aFullFileName; wxString fn = aFullFileName;
@ -1553,19 +1559,28 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString& aFullFileName, double aMMt
output_file << WORLD_SCALE << " "; output_file << WORLD_SCALE << " ";
output_file << WORLD_SCALE << "\n"; output_file << WORLD_SCALE << "\n";
output_file << " children [\n"; output_file << " children [\n";
}
// Export footprints // Export footprints
for( MODULE* module = pcb->m_Modules; module != 0; module = module->Next() ) for( MODULE* module = pcb->m_Modules; module != 0; module = module->Next() )
export_vrml_module( model3d, pcb, module ); export_vrml_module( model3d, pcb, module, &output_file );
// write out the board and all layers // write out the board and all layers
write_layers( model3d, pcb, TO_UTF8( aFullFileName ) ); write_layers( model3d, pcb, TO_UTF8( aFullFileName ), &output_file );
// Close the outer 'transform' node // Close the outer 'transform' node
if( USE_INLINES )
output_file << "]\n}\n"; output_file << "]\n}\n";
CLOSE_STREAM( output_file );
}
else
{
// Export footprints
for( MODULE* module = pcb->m_Modules; module != 0; module = module->Next() )
export_vrml_module( model3d, pcb, module, NULL );
// write out the board and all layers
write_layers( model3d, pcb, TO_UTF8( aFullFileName ), NULL );
}
} }
catch( const std::exception& e ) catch( const std::exception& e )
{ {
@ -1576,14 +1591,6 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString& aFullFileName, double aMMt
ok = false; ok = false;
} }
if( USE_INLINES )
{
output_file.close();
if( toggle )
delete toggle;
}
return ok; return ok;
} }

View File

@ -1,7 +1,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) 2015 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2015-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -28,8 +28,10 @@
#include <cmath> #include <cmath>
#include <string> #include <string>
#include <map> #include <map>
#include <wx/filename.h>
#include <wx/log.h> #include <wx/log.h>
#include <wx/string.h> #include <wx/string.h>
#include "plugins/3d/3d_plugin.h" #include "plugins/3d/3d_plugin.h"
#include "plugins/3dapi/ifsg_all.h" #include "plugins/3dapi/ifsg_all.h"
#include "idf_parser.h" #include "idf_parser.h"

View File

@ -1,7 +1,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) 2016 Cirilo Bernardo <cirilo.bernardo@gmail.com> * Copyright (C) 2016-2017 Cirilo Bernardo <cirilo.bernardo@gmail.com>
* *
* 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
@ -277,7 +277,7 @@ float FACET::CalcFaceNormal()
lCPts[2] = *sV; lCPts[2] = *sV;
++sV; ++sV;
WRLVEC3F wnorm = face_normal; wnorm = face_normal;
a2 = acosf( VCalcCosAngle( lCPts[1], lCPts[0], lCPts[2] ) ); a2 = acosf( VCalcCosAngle( lCPts[1], lCPts[0], lCPts[2] ) );
wnorm.x *= a1 * a2; wnorm.x *= a1 * a2;
wnorm.y *= a1 * a2; wnorm.y *= a1 * a2;

View File

@ -1,17 +1,28 @@
include_directories( include_directories(
"${CMAKE_SOURCE_DIR}/include"
"${CMAKE_SOURCE_DIR}/lib_dxf" "${CMAKE_SOURCE_DIR}/lib_dxf"
"${CMAKE_SOURCE_DIR}/utils/idftools" "${CMAKE_SOURCE_DIR}/utils/idftools"
${OPENGL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}
${Boost_INCLUDE_DIR} ${Boost_INCLUDE_DIR}
) )
link_directories( link_directories(
"${CMAKE_BINARY_DIR}/lib_dxf" "${CMAKE_BINARY_DIR}/lib_dxf"
) )
add_library( idf3 STATIC set( IDF3_FILES
idf_helpers.cpp idf_common.cpp idf_outlines.cpp idf_helpers.cpp
idf_parser.cpp vrml_layer.cpp ) idf_common.cpp
idf_outlines.cpp
idf_parser.cpp
vrml_layer.cpp
)
if( MINGW )
list( APPEND IDF3_FILES ${CMAKE_SOURCE_DIR}/common/streamwrapper.cpp )
endif( MINGW )
add_library( idf3 STATIC ${IDF3_FILES} )
add_executable( idfcyl idf_cylinder.cpp ) add_executable( idfcyl idf_cylinder.cpp )
add_executable( idfrect idf_rect.cpp ) add_executable( idfrect idf_rect.cpp )

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -47,17 +47,17 @@
#include <cerrno> #include <cerrno>
#include <list> #include <list>
#include <utility> #include <utility>
#include <clocale>
#include <vector> #include <vector>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include <algorithm> #include <algorithm>
#include <boost/ptr_container/ptr_map.hpp> #include <boost/ptr_container/ptr_map.hpp>
#include <idf_helpers.h> #include "idf_helpers.h"
#include <idf_common.h> #include "idf_common.h"
#include <idf_parser.h> #include "idf_parser.h"
#include <vrml_layer.h> #include "streamwrapper.h"
#include "vrml_layer.h"
#ifndef MIN_ANG #ifndef MIN_ANG
#define MIN_ANG 0.01 #define MIN_ANG 0.01
@ -198,14 +198,14 @@ VRML_COLOR colors[NCOLORS] =
{ { 0.102, 1, 0.984 }, { 0, 0, 0 }, { 0.102, 1, 0.984 }, 0.9, 0, 0.1 } { { 0.102, 1, 0.984 }, { 0, 0, 0 }, { 0.102, 1, 0.984 }, 0.9, 0, 0.1 }
}; };
bool WriteHeader( IDF3_BOARD& board, std::ofstream& file ); bool WriteHeader( IDF3_BOARD& board, std::ostream& file );
bool MakeBoard( IDF3_BOARD& board, std::ofstream& file ); bool MakeBoard( IDF3_BOARD& board, std::ostream& file );
bool MakeComponents( IDF3_BOARD& board, std::ofstream& file, bool compact ); bool MakeComponents( IDF3_BOARD& board, std::ostream& file, bool compact );
bool MakeOtherOutlines( IDF3_BOARD& board, std::ofstream& file ); bool MakeOtherOutlines( IDF3_BOARD& board, std::ostream& file );
bool PopulateVRML( VRML_LAYER& model, const std::list< IDF_OUTLINE* >* items, bool bottom, bool PopulateVRML( VRML_LAYER& model, const std::list< IDF_OUTLINE* >* items, bool bottom,
double scale, double dX = 0.0, double dY = 0.0, double angle = 0.0 ); double scale, double dX = 0.0, double dY = 0.0, double angle = 0.0 );
bool AddSegment( VRML_LAYER& model, IDF_SEGMENT* seg, int icont, int iseg ); bool AddSegment( VRML_LAYER& model, IDF_SEGMENT* seg, int icont, int iseg );
bool WriteTriangles( std::ofstream& file, VRML_IDS* vID, VRML_LAYER* layer, bool plane, bool WriteTriangles( std::ostream& file, VRML_IDS* vID, VRML_LAYER* layer, bool plane,
bool top, double top_z, double bottom_z, int precision, bool compact ); bool top, double top_z, double bottom_z, int precision, bool compact );
inline void TransformPoint( IDF_SEGMENT& seg, double frac, bool bottom, inline void TransformPoint( IDF_SEGMENT& seg, double frac, bool bottom,
double dX, double dY, double angle ); double dX, double dY, double angle );
@ -215,9 +215,6 @@ VRML_IDS* GetColor( boost::ptr_map<const std::string, VRML_IDS>& cmap,
int IDF2VRML::OnRun() int IDF2VRML::OnRun()
{ {
// IDF implicitly requires the C locale
setlocale( LC_ALL, "C" );
// Essential inputs: // Essential inputs:
// 1. IDF file // 1. IDF file
// 2. Output scale: internal IDF units are mm, so 1 = 1mm per VRML unit, // 2. Output scale: internal IDF units are mm, so 1 = 1mm per VRML unit,
@ -264,9 +261,14 @@ int IDF2VRML::OnRun()
fname.Normalize(); fname.Normalize();
wxLogMessage( "Writing file: '%s'", fname.GetFullName() ); wxLogMessage( "Writing file: '%s'", fname.GetFullName() );
std::ofstream ofile; OPEN_OSTREAM( ofile, fname.GetFullPath().ToUTF8() );
ofile.open( fname.GetFullPath().ToUTF8(), std::ios_base::out );
if( ofile.fail() )
{
wxLogMessage( "Could not open file: '%s'", fname.GetFullName() );
}
ofile.imbue( std::locale( "C" ) );
ofile << std::fixed; // do not use exponents in VRML output ofile << std::fixed; // do not use exponents in VRML output
WriteHeader( pcb, ofile ); WriteHeader( pcb, ofile );
@ -280,15 +282,13 @@ int IDF2VRML::OnRun()
MakeOtherOutlines( pcb, ofile ); MakeOtherOutlines( pcb, ofile );
ofile << "]\n}\n"; ofile << "]\n}\n";
ofile.close(); CLOSE_STREAM( ofile );
// restore the locale
setlocale( LC_ALL, "" );
return 0; return 0;
} }
bool WriteHeader( IDF3_BOARD& board, std::ofstream& file ) bool WriteHeader( IDF3_BOARD& board, std::ostream& file )
{ {
std::string bname = board.GetBoardName(); std::string bname = board.GetBoardName();
@ -320,7 +320,7 @@ bool WriteHeader( IDF3_BOARD& board, std::ofstream& file )
} }
bool MakeBoard( IDF3_BOARD& board, std::ofstream& file ) bool MakeBoard( IDF3_BOARD& board, std::ostream& file )
{ {
VRML_LAYER vpcb; VRML_LAYER vpcb;
@ -484,7 +484,7 @@ bool AddSegment( VRML_LAYER& model, IDF_SEGMENT* seg, int icont, int iseg )
} }
bool WriteTriangles( std::ofstream& file, VRML_IDS* vID, VRML_LAYER* layer, bool plane, bool WriteTriangles( std::ostream& file, VRML_IDS* vID, VRML_LAYER* layer, bool plane,
bool top, double top_z, double bottom_z, int precision, bool compact ) bool top, double top_z, double bottom_z, int precision, bool compact )
{ {
if( vID == NULL || layer == NULL ) if( vID == NULL || layer == NULL )
@ -699,7 +699,7 @@ inline void TransformPoint( IDF_SEGMENT& seg, double frac, bool bottom,
return; return;
} }
bool MakeComponents( IDF3_BOARD& board, std::ofstream& file, bool compact ) bool MakeComponents( IDF3_BOARD& board, std::ostream& file, bool compact )
{ {
int cidx = 2; // color index; start at 2 since 0,1 are special (board, NOGEOM_NOPART) int cidx = 2; // color index; start at 2 since 0,1 are special (board, NOGEOM_NOPART)
@ -883,7 +883,7 @@ VRML_IDS* GetColor( boost::ptr_map<const std::string, VRML_IDS>& cmap, int& inde
} }
bool MakeOtherOutlines( IDF3_BOARD& board, std::ofstream& file ) bool MakeOtherOutlines( IDF3_BOARD& board, std::ostream& file )
{ {
int cidx = 2; // color index; start at 2 since 0,1 are special (board, NOGEOM_NOPART) int cidx = 2; // color index; start at 2 since 0,1 are special (board, NOGEOM_NOPART)

View File

@ -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-2014 Cirilo Bernardo * Copyright (C) 2013-2017 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
@ -28,7 +28,6 @@
#include <list> #include <list>
#include <string> #include <string>
#include <iostream> #include <iostream>
#include <fstream>
#include <sstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <cerrno> #include <cerrno>
@ -91,7 +90,7 @@ IDF_NOTE::IDF_NOTE()
} }
bool IDF_NOTE::readNote( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState, bool IDF_NOTE::readNote( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState,
IDF3::IDF_UNIT aBoardUnit ) IDF3::IDF_UNIT aBoardUnit )
{ {
std::string iline; // the input line std::string iline; // the input line
@ -250,7 +249,7 @@ bool IDF_NOTE::readNote( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardStat
} }
bool IDF_NOTE::writeNote( std::ofstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit ) bool IDF_NOTE::writeNote( std::ostream& aBoardFile, IDF3::IDF_UNIT aBoardUnit )
{ {
if( aBoardUnit == UNIT_THOU ) if( aBoardUnit == UNIT_THOU )
{ {
@ -403,7 +402,7 @@ bool IDF_DRILL_DATA::Matches( double aDrillDia, double aPosX, double aPosY )
return false; return false;
} }
bool IDF_DRILL_DATA::read( std::ifstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit, bool IDF_DRILL_DATA::read( std::istream& aBoardFile, IDF3::IDF_UNIT aBoardUnit,
IDF3::FILE_STATE aBoardState, IDF3::IDF_VERSION aIdfVersion ) IDF3::FILE_STATE aBoardState, IDF3::IDF_VERSION aIdfVersion )
{ {
std::string iline; // the input line std::string iline; // the input line
@ -651,7 +650,7 @@ bool IDF_DRILL_DATA::read( std::ifstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit,
return true; return true;
} }
void IDF_DRILL_DATA::write( std::ofstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit ) void IDF_DRILL_DATA::write( std::ostream& aBoardFile, IDF3::IDF_UNIT aBoardUnit )
{ {
std::string holestr; std::string holestr;
std::string refstr; std::string refstr;

View File

@ -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-2014 Cirilo Bernardo * Copyright (C) 2013-2017 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
@ -280,7 +280,7 @@ private:
* @return bool: true if a note item was read, false otherwise. In case of unrecoverable errors * @return bool: true if a note item was read, false otherwise. In case of unrecoverable errors
* an exception is thrown * an exception is thrown
*/ */
bool readNote( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState, IDF3::IDF_UNIT aBoardUnit ); bool readNote( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState, IDF3::IDF_UNIT aBoardUnit );
/** /**
* Function writeNote * Function writeNote
@ -292,7 +292,7 @@ private:
* @return bool: true if the item was successfully written, false otherwise. In case of * @return bool: true if the item was successfully written, false otherwise. In case of
* unrecoverable errors an exception is thrown * unrecoverable errors an exception is thrown
*/ */
bool writeNote( std::ofstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit ); bool writeNote( std::ostream& aBoardFile, IDF3::IDF_UNIT aBoardUnit );
public: public:
IDF_NOTE(); IDF_NOTE();
@ -366,7 +366,7 @@ private:
* @return bool: true if data was successfully read, otherwise false. In case of an * @return bool: true if data was successfully read, otherwise false. In case of an
* unrecoverable error an exception is thrown * unrecoverable error an exception is thrown
*/ */
bool read( std::ifstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit, IDF3::FILE_STATE aBoardState, bool read( std::istream& aBoardFile, IDF3::IDF_UNIT aBoardUnit, IDF3::FILE_STATE aBoardState,
IDF3::IDF_VERSION aIdfVersion ); IDF3::IDF_VERSION aIdfVersion );
/** /**
@ -377,7 +377,7 @@ private:
* @param aBoardFile is an open BOARD file * @param aBoardFile is an open BOARD file
* @param aBoardUnit is the native unit of the output file * @param aBoardUnit is the native unit of the output file
*/ */
void write( std::ofstream& aBoardFile, IDF3::IDF_UNIT aBoardUnit ); void write( std::ostream& aBoardFile, IDF3::IDF_UNIT aBoardUnit );
public: public:
/** /**

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -32,7 +32,7 @@ using namespace std;
using namespace IDF3; using namespace IDF3;
// fetch a line from the given input file and trim the ends // fetch a line from the given input file and trim the ends
bool IDF3::FetchIDFLine( std::ifstream& aModel, std::string& aLine, bool& isComment, std::streampos& aFilePos ) bool IDF3::FetchIDFLine( std::istream& aModel, std::string& aLine, bool& isComment, std::streampos& aFilePos )
{ {
aLine = ""; aLine = "";
aFilePos = aModel.tellg(); aFilePos = aModel.tellg();
@ -205,7 +205,7 @@ bool IDF3::ParseIDFLayer( const std::string& aToken, IDF3::IDF_LAYER& aLayer )
} }
bool IDF3::WriteLayersText( std::ofstream& aBoardFile, IDF3::IDF_LAYER aLayer ) bool IDF3::WriteLayersText( std::ostream& aBoardFile, IDF3::IDF_LAYER aLayer )
{ {
switch( aLayer ) switch( aLayer )
{ {

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -25,7 +25,7 @@
#define IDF_HELPERS_H #define IDF_HELPERS_H
#include <wx/wx.h> #include <wx/wx.h>
#include <fstream> #include <iostream>
#include <string> #include <string>
#include <idf_common.h> #include <idf_common.h>
@ -82,7 +82,7 @@ namespace IDF3
* *
* @return bool: true if a line was read and was not empty; otherwise false * @return bool: true if a line was read and was not empty; otherwise false
*/ */
bool FetchIDFLine( std::ifstream& aModel, std::string& aLine, bool& isComment, std::streampos& aFilePos ); bool FetchIDFLine( std::istream& aModel, std::string& aLine, bool& isComment, std::streampos& aFilePos );
/** /**
@ -145,7 +145,7 @@ bool ParseIDFLayer( const std::string& aToken, IDF3::IDF_LAYER& aLayer );
* *
* @return bool: true if the data was successfully written, otherwise false * @return bool: true if the data was successfully written, otherwise false
*/ */
bool WriteLayersText( std::ofstream& aBoardFile, IDF3::IDF_LAYER aLayer ); bool WriteLayersText( std::ostream& aBoardFile, IDF3::IDF_LAYER aLayer );
/** /**

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -151,7 +151,7 @@ IDF3::OUTLINE_TYPE BOARD_OUTLINE::GetOutlineType( void )
return outlineType; return outlineType;
} }
void BOARD_OUTLINE::readOutlines( std::ifstream& aBoardFile, IDF3::IDF_VERSION aIdfVersion ) void BOARD_OUTLINE::readOutlines( std::istream& aBoardFile, IDF3::IDF_VERSION aIdfVersion )
{ {
// reads the outline data from a file // reads the outline data from a file
double x, y, ang; double x, y, ang;
@ -654,7 +654,7 @@ void BOARD_OUTLINE::readOutlines( std::ifstream& aBoardFile, IDF3::IDF_VERSION a
return; return;
} }
bool BOARD_OUTLINE::writeComments( std::ofstream& aBoardFile ) bool BOARD_OUTLINE::writeComments( std::ostream& aBoardFile )
{ {
if( comments.empty() ) if( comments.empty() )
return true; return true;
@ -671,7 +671,7 @@ bool BOARD_OUTLINE::writeComments( std::ofstream& aBoardFile )
return !aBoardFile.fail(); return !aBoardFile.fail();
} }
bool BOARD_OUTLINE::writeOwner( std::ofstream& aBoardFile ) bool BOARD_OUTLINE::writeOwner( std::ostream& aBoardFile )
{ {
switch( owner ) switch( owner )
{ {
@ -691,7 +691,7 @@ bool BOARD_OUTLINE::writeOwner( std::ofstream& aBoardFile )
return !aBoardFile.fail(); return !aBoardFile.fail();
} }
void BOARD_OUTLINE::writeOutline( std::ofstream& aBoardFile, IDF_OUTLINE* aOutline, size_t aIndex ) void BOARD_OUTLINE::writeOutline( std::ostream& aBoardFile, IDF_OUTLINE* aOutline, size_t aIndex )
{ {
std::list<IDF_SEGMENT*>::iterator bo; std::list<IDF_SEGMENT*>::iterator bo;
std::list<IDF_SEGMENT*>::iterator eo; std::list<IDF_SEGMENT*>::iterator eo;
@ -955,7 +955,7 @@ void BOARD_OUTLINE::writeOutline( std::ofstream& aBoardFile, IDF_OUTLINE* aOutli
return; return;
} }
void BOARD_OUTLINE::writeOutlines( std::ofstream& aBoardFile ) void BOARD_OUTLINE::writeOutlines( std::ostream& aBoardFile )
{ {
if( outlines.empty() ) if( outlines.empty() )
return; return;
@ -1029,7 +1029,7 @@ double BOARD_OUTLINE::GetThickness( void )
return thickness; return thickness;
} }
void BOARD_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHeader, void BOARD_OUTLINE::readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) IDF3::IDF_VERSION aIdfVersion )
{ {
// BOARD_OUTLINE (PANEL_OUTLINE) // BOARD_OUTLINE (PANEL_OUTLINE)
@ -1223,7 +1223,7 @@ void BOARD_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHea
} }
void BOARD_OUTLINE::writeData( std::ofstream& aBoardFile ) void BOARD_OUTLINE::writeData( std::ostream& aBoardFile )
{ {
writeComments( aBoardFile ); writeComments( aBoardFile );
@ -1610,7 +1610,7 @@ IDF3::IDF_LAYER OTHER_OUTLINE::GetSide( void )
return side; return side;
} }
void OTHER_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHeader, void OTHER_OUTLINE::readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) IDF3::IDF_VERSION aIdfVersion )
{ {
// OTHER_OUTLINE/VIA_KEEPOUT // OTHER_OUTLINE/VIA_KEEPOUT
@ -1869,7 +1869,7 @@ void OTHER_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHea
return; return;
} }
void OTHER_OUTLINE::writeData( std::ofstream& aBoardFile ) void OTHER_OUTLINE::writeData( std::ostream& aBoardFile )
{ {
// this section is optional; do not write if not required // this section is optional; do not write if not required
if( outlines.empty() ) if( outlines.empty() )
@ -1970,7 +1970,7 @@ IDF3::IDF_LAYER ROUTE_OUTLINE::GetLayers( void )
return layers; return layers;
} }
void ROUTE_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHeader, void ROUTE_OUTLINE::readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) IDF3::IDF_VERSION aIdfVersion )
{ {
// ROUTE_OUTLINE (or ROUTE_KEEPOUT) // ROUTE_OUTLINE (or ROUTE_KEEPOUT)
@ -2183,7 +2183,7 @@ void ROUTE_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHea
} }
void ROUTE_OUTLINE::writeData( std::ofstream& aBoardFile ) void ROUTE_OUTLINE::writeData( std::ostream& aBoardFile )
{ {
// this section is optional; do not write if not required // this section is optional; do not write if not required
if( outlines.empty() ) if( outlines.empty() )
@ -2318,7 +2318,7 @@ double PLACE_OUTLINE::GetMaxHeight( void )
return thickness; return thickness;
} }
void PLACE_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHeader, void PLACE_OUTLINE::readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) IDF3::IDF_VERSION aIdfVersion )
{ {
// PLACE_OUTLINE/KEEPOUT // PLACE_OUTLINE/KEEPOUT
@ -2558,7 +2558,7 @@ void PLACE_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHea
return; return;
} }
void PLACE_OUTLINE::writeData( std::ofstream& aBoardFile ) void PLACE_OUTLINE::writeData( std::ostream& aBoardFile )
{ {
// this section is optional; do not write if not required // this section is optional; do not write if not required
if( outlines.empty() ) if( outlines.empty() )
@ -2742,7 +2742,7 @@ const std::string& GROUP_OUTLINE::GetGroupName( void )
} }
void GROUP_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHeader, void GROUP_OUTLINE::readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) IDF3::IDF_VERSION aIdfVersion )
{ {
// Placement Group // Placement Group
@ -2901,7 +2901,7 @@ void GROUP_OUTLINE::readData( std::ifstream& aBoardFile, const std::string& aHea
} }
void GROUP_OUTLINE::writeData( std::ofstream& aBoardFile ) void GROUP_OUTLINE::writeData( std::ostream& aBoardFile )
{ {
// this section is optional; do not write if not required // this section is optional; do not write if not required
if( outlines.empty() ) if( outlines.empty() )
@ -2974,7 +2974,7 @@ IDF3_COMP_OUTLINE::IDF3_COMP_OUTLINE( IDF3_BOARD* aParent )
return; return;
} }
void IDF3_COMP_OUTLINE::readProperties( std::ifstream& aLibFile ) void IDF3_COMP_OUTLINE::readProperties( std::istream& aLibFile )
{ {
bool quoted = false; bool quoted = false;
bool comment = false; bool comment = false;
@ -3094,7 +3094,7 @@ void IDF3_COMP_OUTLINE::readProperties( std::ifstream& aLibFile )
} }
bool IDF3_COMP_OUTLINE::writeProperties( std::ofstream& aLibFile ) bool IDF3_COMP_OUTLINE::writeProperties( std::ostream& aLibFile )
{ {
if( props.empty() ) if( props.empty() )
return true; return true;
@ -3111,7 +3111,7 @@ bool IDF3_COMP_OUTLINE::writeProperties( std::ofstream& aLibFile )
return !aLibFile.fail(); return !aLibFile.fail();
} }
void IDF3_COMP_OUTLINE::readData( std::ifstream& aLibFile, const std::string& aHeader, void IDF3_COMP_OUTLINE::readData( std::istream& aLibFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) IDF3::IDF_VERSION aIdfVersion )
{ {
// .ELECTRICAL/.MECHANICAL // .ELECTRICAL/.MECHANICAL
@ -3377,7 +3377,7 @@ void IDF3_COMP_OUTLINE::readData( std::ifstream& aLibFile, const std::string& aH
} }
void IDF3_COMP_OUTLINE::writeData( std::ofstream& aLibFile ) void IDF3_COMP_OUTLINE::writeData( std::ostream& aLibFile )
{ {
if( refNum == 0 ) if( refNum == 0 )
return; // nothing to do return; // nothing to do

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -28,8 +28,6 @@
#include <string> #include <string>
#include <list> #include <list>
#include <map> #include <map>
#include <wx/string.h>
#include <wx/filename.h>
#include <idf_common.h> #include <idf_common.h>
@ -104,15 +102,15 @@ protected:
double thickness; // Board/Extrude Thickness or Height (IDF spec) double thickness; // Board/Extrude Thickness or Height (IDF spec)
// Read outline data from a BOARD or LIBRARY file's outline section // Read outline data from a BOARD or LIBRARY file's outline section
void readOutlines( std::ifstream& aBoardFile, IDF3::IDF_VERSION aIdfVersion ); void readOutlines( std::istream& aBoardFile, IDF3::IDF_VERSION aIdfVersion );
// Write comments to a BOARD or LIBRARY file (must not be within a SECTION as per IDFv3 spec) // Write comments to a BOARD or LIBRARY file (must not be within a SECTION as per IDFv3 spec)
bool writeComments( std::ofstream& aBoardFile ); bool writeComments( std::ostream& aBoardFile );
// Write the outline owner to a BOARD file // Write the outline owner to a BOARD file
bool writeOwner( std::ofstream& aBoardFile ); bool writeOwner( std::ostream& aBoardFile );
// Write the data of a single outline object // Write the data of a single outline object
void writeOutline( std::ofstream& aBoardFile, IDF_OUTLINE* aOutline, size_t aIndex ); void writeOutline( std::ostream& aBoardFile, IDF_OUTLINE* aOutline, size_t aIndex );
// Iterate through the outlines and write out all data // Iterate through the outlines and write out all data
void writeOutlines( std::ofstream& aBoardFile ); // write outline data (no headers) void writeOutlines( std::ostream& aBoardFile ); // write outline data (no headers)
// Clear internal list of outlines // Clear internal list of outlines
void clearOutlines( void ); void clearOutlines( void );
/** /**
@ -135,7 +133,7 @@ protected:
* @param aBoardFile is an IDFv3 file opened for reading * @param aBoardFile is an IDFv3 file opened for reading
* @param aHeader is the ".BOARD_OUTLINE" header line as read by FetchIDFLine * @param aHeader is the ".BOARD_OUTLINE" header line as read by FetchIDFLine
*/ */
virtual void readData( std::ifstream& aBoardFile, const std::string& aHeader, virtual void readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ); IDF3::IDF_VERSION aIdfVersion );
/** /**
@ -145,7 +143,7 @@ protected:
* *
* @param aBoardFile is an IDFv3 file opened for writing * @param aBoardFile is an IDFv3 file opened for writing
*/ */
virtual void writeData( std::ofstream& aBoardFile ); virtual void writeData( std::ostream& aBoardFile );
public: public:
BOARD_OUTLINE(); BOARD_OUTLINE();
@ -363,7 +361,7 @@ private:
* @param aBoardFile is an IDFv3 file open for reading * @param aBoardFile is an IDFv3 file open for reading
* @param aHeader is the .OTHER_OUTLINE header as read via FetchIDFLine * @param aHeader is the .OTHER_OUTLINE header as read via FetchIDFLine
*/ */
virtual void readData( std::ifstream& aBoardFile, const std::string& aHeader, virtual void readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) override; IDF3::IDF_VERSION aIdfVersion ) override;
/** /**
@ -374,7 +372,7 @@ private:
* *
* @return bool: true if the data was successfully written, otherwise false. * @return bool: true if the data was successfully written, otherwise false.
*/ */
virtual void writeData( std::ofstream& aBoardFile ) override; virtual void writeData( std::ostream& aBoardFile ) override;
public: public:
OTHER_OUTLINE( IDF3_BOARD* aParent ); OTHER_OUTLINE( IDF3_BOARD* aParent );
@ -431,14 +429,14 @@ private:
* @param aBoardFile is an open IDFv3 board file * @param aBoardFile is an open IDFv3 board file
* @param aHeader is the .ROUTE_OUTLINE header as returned by FetchIDFLine * @param aHeader is the .ROUTE_OUTLINE header as returned by FetchIDFLine
*/ */
virtual void readData( std::ifstream& aBoardFile, const std::string& aHeader, virtual void readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) override; IDF3::IDF_VERSION aIdfVersion ) override;
/** /**
* Function writeData * Function writeData
* writes the ROUTE_OUTLINE data to an open IDFv3 file * writes the ROUTE_OUTLINE data to an open IDFv3 file
*/ */
virtual void writeData( std::ofstream& aBoardFile ) override; virtual void writeData( std::ostream& aBoardFile ) override;
protected: protected:
IDF3::IDF_LAYER layers; // Routing layers (IDF spec) IDF3::IDF_LAYER layers; // Routing layers (IDF spec)
@ -483,7 +481,7 @@ private:
* @param aBoardFile is an IDFv3 file opened for reading * @param aBoardFile is an IDFv3 file opened for reading
* @param aHeader is the .PLACE_OUTLINE header as returned by FetchIDFLine * @param aHeader is the .PLACE_OUTLINE header as returned by FetchIDFLine
*/ */
virtual void readData( std::ifstream& aBoardFile, const std::string& aHeader, virtual void readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) override; IDF3::IDF_VERSION aIdfVersion ) override;
/** /**
@ -494,7 +492,7 @@ private:
* *
* @return bool: true if the data was successfully written, otherwise false * @return bool: true if the data was successfully written, otherwise false
*/ */
virtual void writeData( std::ofstream& aBoardFile ) override; virtual void writeData( std::ostream& aBoardFile ) override;
protected: protected:
IDF3::IDF_LAYER side; // Board Side [TOP/BOTTOM/BOTH ONLY] (IDF spec) IDF3::IDF_LAYER side; // Board Side [TOP/BOTTOM/BOTH ONLY] (IDF spec)
@ -592,7 +590,7 @@ private:
* @param aBoardFile is an open IDFv3 file * @param aBoardFile is an open IDFv3 file
* @param aHeader is the .PLACE_REGION header as returned by FetchIDFLine * @param aHeader is the .PLACE_REGION header as returned by FetchIDFLine
*/ */
virtual void readData( std::ifstream& aBoardFile, const std::string& aHeader, virtual void readData( std::istream& aBoardFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) override; IDF3::IDF_VERSION aIdfVersion ) override;
/** /**
@ -603,7 +601,7 @@ private:
* *
* @return bool: true if the data is successfully written, otherwise false * @return bool: true if the data is successfully written, otherwise false
*/ */
virtual void writeData( std::ofstream& aBoardFile ) override; virtual void writeData( std::ostream& aBoardFile ) override;
public: public:
GROUP_OUTLINE( IDF3_BOARD* aParent ); GROUP_OUTLINE( IDF3_BOARD* aParent );
@ -661,8 +659,8 @@ private:
std::map< std::string, std::string > props; // properties list std::map< std::string, std::string > props; // properties list
void readProperties( std::ifstream& aLibFile ); void readProperties( std::istream& aLibFile );
bool writeProperties( std::ofstream& aLibFile ); bool writeProperties( std::ostream& aLibFile );
/** /**
* Function readData * Function readData
@ -672,7 +670,7 @@ private:
* @param aLibFile is an open IDFv3 Library file * @param aLibFile is an open IDFv3 Library file
* @param aHeader is the .ELECTRICAL or .MECHANICAL header as returned by FetchIDFLine * @param aHeader is the .ELECTRICAL or .MECHANICAL header as returned by FetchIDFLine
*/ */
virtual void readData( std::ifstream& aLibFile, const std::string& aHeader, virtual void readData( std::istream& aLibFile, const std::string& aHeader,
IDF3::IDF_VERSION aIdfVersion ) override; IDF3::IDF_VERSION aIdfVersion ) override;
/** /**
@ -683,7 +681,7 @@ private:
* *
* @return bool: true if the data was successfully written, otherwise false * @return bool: true if the data was successfully written, otherwise false
*/ */
virtual void writeData( std::ofstream& aLibFile ) override; virtual void writeData( std::ostream& aLibFile ) override;
/** /**
* Function incrementRef * Function incrementRef

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -24,14 +24,16 @@
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <fstream>
#include <sstream> #include <sstream>
#include <cmath> #include <cmath>
#include <cerrno> #include <cerrno>
#include <algorithm> #include <algorithm>
#include <wx/string.h>
#include <wx/filename.h>
#include <idf_parser.h> #include "idf_parser.h"
#include <idf_helpers.h> #include "idf_helpers.h"
#include "streamwrapper.h"
using namespace std; using namespace std;
using namespace IDF3; using namespace IDF3;
@ -229,7 +231,7 @@ bool IDF3_COMP_OUTLINE_DATA::SetOutline( IDF3_COMP_OUTLINE* aOutline )
} }
bool IDF3_COMP_OUTLINE_DATA::readPlaceData( std::ifstream &aBoardFile, bool IDF3_COMP_OUTLINE_DATA::readPlaceData( std::istream &aBoardFile,
IDF3::FILE_STATE& aBoardState, IDF3::FILE_STATE& aBoardState,
IDF3_BOARD *aBoard, IDF3_BOARD *aBoard,
IDF3::IDF_VERSION aIdfVersion, IDF3::IDF_VERSION aIdfVersion,
@ -713,7 +715,7 @@ bool IDF3_COMP_OUTLINE_DATA::readPlaceData( std::ifstream &aBoardFile,
} // IDF3_COMP_OUTLINE_DATA::readPlaceData } // IDF3_COMP_OUTLINE_DATA::readPlaceData
void IDF3_COMP_OUTLINE_DATA::writePlaceData( std::ofstream& aBoardFile, void IDF3_COMP_OUTLINE_DATA::writePlaceData( std::ostream& aBoardFile,
double aXpos, double aYpos, double aAngle, double aXpos, double aYpos, double aAngle,
const std::string aRefDes, const std::string aRefDes,
IDF3::IDF_PLACEMENT aPlacement, IDF3::IDF_PLACEMENT aPlacement,
@ -1291,7 +1293,7 @@ bool IDF3_COMPONENT::SetPlacement( IDF3::IDF_PLACEMENT aPlacementValue )
return true; return true;
} }
bool IDF3_COMPONENT::writeDrillData( std::ofstream& aBoardFile ) bool IDF3_COMPONENT::writeDrillData( std::ostream& aBoardFile )
{ {
if( drills.empty() ) if( drills.empty() )
return true; return true;
@ -1309,7 +1311,7 @@ bool IDF3_COMPONENT::writeDrillData( std::ofstream& aBoardFile )
} }
bool IDF3_COMPONENT::writePlaceData( std::ofstream& aBoardFile ) bool IDF3_COMPONENT::writePlaceData( std::ostream& aBoardFile )
{ {
if( components.empty() ) if( components.empty() )
return true; return true;
@ -1330,7 +1332,6 @@ bool IDF3_COMPONENT::writePlaceData( std::ofstream& aBoardFile )
IDF3_BOARD::IDF3_BOARD( IDF3::CAD_TYPE aCadType ) IDF3_BOARD::IDF3_BOARD( IDF3::CAD_TYPE aCadType )
{ {
idfVer = IDF_V3; idfVer = IDF_V3;
state = FILE_START;
cadType = aCadType; cadType = aCadType;
userPrec = 5; userPrec = 5;
userScale = 1.0; userScale = 1.0;
@ -1608,7 +1609,7 @@ double IDF3_BOARD::GetBoardThickness( void )
// read the DRILLED HOLES section // read the DRILLED HOLES section
void IDF3_BOARD::readBrdDrills( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState ) void IDF3_BOARD::readBrdDrills( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState )
{ {
IDF_DRILL_DATA drill; IDF_DRILL_DATA drill;
@ -1631,7 +1632,7 @@ void IDF3_BOARD::readBrdDrills( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBo
// read the NOTES section // read the NOTES section
void IDF3_BOARD::readBrdNotes( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState ) void IDF3_BOARD::readBrdNotes( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState )
{ {
IDF_NOTE note; IDF_NOTE note;
@ -1647,7 +1648,7 @@ void IDF3_BOARD::readBrdNotes( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoa
// read the component placement section // read the component placement section
void IDF3_BOARD::readBrdPlacement( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState, bool aNoSubstituteOutlines ) void IDF3_BOARD::readBrdPlacement( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState, bool aNoSubstituteOutlines )
{ {
IDF3_COMP_OUTLINE_DATA oldata; IDF3_COMP_OUTLINE_DATA oldata;
@ -1658,7 +1659,7 @@ void IDF3_BOARD::readBrdPlacement( std::ifstream& aBoardFile, IDF3::FILE_STATE&
// read the board HEADER // read the board HEADER
void IDF3_BOARD::readBrdHeader( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState ) void IDF3_BOARD::readBrdHeader( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState )
{ {
std::string iline; // the input line std::string iline; // the input line
bool isComment; // true if a line just read in is a comment line bool isComment; // true if a line just read in is a comment line
@ -1874,7 +1875,7 @@ void IDF3_BOARD::readBrdHeader( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBo
// read individual board sections; pay attention to IDFv3 section specifications // read individual board sections; pay attention to IDFv3 section specifications
void IDF3_BOARD::readBrdSection( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState, void IDF3_BOARD::readBrdSection( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState,
bool aNoSubstituteOutlines ) bool aNoSubstituteOutlines )
{ {
std::list< std::string > comments; // comments associated with a section std::list< std::string > comments; // comments associated with a section
@ -2298,15 +2299,13 @@ void IDF3_BOARD::readBrdSection( std::ifstream& aBoardFile, IDF3::FILE_STATE& aB
// read the board file data // read the board file data
void IDF3_BOARD::readBoardFile( const std::string& aFileName, bool aNoSubstituteOutlines ) void IDF3_BOARD::readBoardFile( const std::string& aFileName, bool aNoSubstituteOutlines )
{ {
std::ifstream brd; OPEN_ISTREAM( brd, aFileName.c_str() );
brd.exceptions ( std::ifstream::badbit );
try try
{ {
brd.open( aFileName.c_str(), std::ios_base::in | std::ios_base::binary ); brd.exceptions ( std::ios_base::badbit );
if( !brd.is_open() ) if( brd.fail() )
{ {
ostringstream ostr; ostringstream ostr;
ostr << "\n* could not open file: '" << aFileName << "'"; ostr << "\n* could not open file: '" << aFileName << "'";
@ -2314,6 +2313,7 @@ void IDF3_BOARD::readBoardFile( const std::string& aFileName, bool aNoSubstitute
throw( IDF_ERROR( __FILE__, __FUNCTION__, __LINE__, ostr.str() ) ); throw( IDF_ERROR( __FILE__, __FUNCTION__, __LINE__, ostr.str() ) );
} }
brd.imbue( std::locale( "C" ) );
std::string iline; // the input line std::string iline; // the input line
bool isComment; // true if a line just read in is a comment line bool isComment; // true if a line just read in is a comment line
std::streampos pos; std::streampos pos;
@ -2341,12 +2341,11 @@ void IDF3_BOARD::readBoardFile( const std::string& aFileName, bool aNoSubstitute
// check if we have valid data // check if we have valid data
if( brd.eof() && state >= IDF3::FILE_OUTLINE && state < IDF3::FILE_INVALID ) if( brd.eof() && state >= IDF3::FILE_OUTLINE && state < IDF3::FILE_INVALID )
{ {
brd.close(); CLOSE_STREAM( brd );
return; return;
} }
brd.close(); CLOSE_STREAM( brd );
ostringstream ostr; ostringstream ostr;
ostr << "\n* empty IDF file: '" << aFileName << "'"; ostr << "\n* empty IDF file: '" << aFileName << "'";
@ -2384,20 +2383,17 @@ void IDF3_BOARD::readBoardFile( const std::string& aFileName, bool aNoSubstitute
catch( const std::exception& ) catch( const std::exception& )
{ {
brd.exceptions ( std::ios_base::goodbit ); brd.exceptions ( std::ios_base::goodbit );
CLOSE_STREAM( brd );
if( brd.is_open() )
brd.close();
throw; throw;
} }
brd.close(); CLOSE_STREAM( brd );
return; return;
} // readBoardFile() } // readBoardFile()
// read the library sections (outlines) // read the library sections (outlines)
void IDF3_BOARD::readLibSection( std::ifstream& aLibFile, IDF3::FILE_STATE& aLibState, IDF3_BOARD* aBoard ) void IDF3_BOARD::readLibSection( std::istream& aLibFile, IDF3::FILE_STATE& aLibState, IDF3_BOARD* aBoard )
{ {
if( aBoard == NULL ) if( aBoard == NULL )
{ {
@ -2527,7 +2523,7 @@ void IDF3_BOARD::readLibSection( std::ifstream& aLibFile, IDF3::FILE_STATE& aLib
// read the library HEADER // read the library HEADER
void IDF3_BOARD::readLibHeader( std::ifstream& aLibFile, IDF3::FILE_STATE& aLibState ) void IDF3_BOARD::readLibHeader( std::istream& aLibFile, IDF3::FILE_STATE& aLibState )
{ {
std::string iline; // the input line std::string iline; // the input line
bool isComment; // true if a line just read in is a comment line bool isComment; // true if a line just read in is a comment line
@ -2685,14 +2681,21 @@ void IDF3_BOARD::readLibHeader( std::ifstream& aLibFile, IDF3::FILE_STATE& aLibS
// read the library file data // read the library file data
void IDF3_BOARD::readLibFile( const std::string& aFileName ) void IDF3_BOARD::readLibFile( const std::string& aFileName )
{ {
std::ifstream lib; OPEN_ISTREAM( lib, aFileName.c_str() );
lib.exceptions ( std::ifstream::badbit );
try try
{ {
lib.open( aFileName.c_str(), std::ios_base::in | std::ios_base::binary ); lib.exceptions ( std::ios_base::badbit );
if( lib.fail() )
{
ostringstream ostr;
ostr << "\n* could not open file: '" << aFileName << "'";
throw( IDF_ERROR( __FILE__, __FUNCTION__, __LINE__, ostr.str() ) );
}
lib.imbue( std::locale( "C" ) );
IDF3::FILE_STATE state = IDF3::FILE_START; IDF3::FILE_STATE state = IDF3::FILE_START;
readLibHeader( lib, state ); readLibHeader( lib, state );
@ -2702,14 +2705,11 @@ void IDF3_BOARD::readLibFile( const std::string& aFileName )
catch( const std::exception& ) catch( const std::exception& )
{ {
lib.exceptions ( std::ios_base::goodbit ); lib.exceptions ( std::ios_base::goodbit );
CLOSE_STREAM( lib );
if( lib.is_open() )
lib.close();
throw; throw;
} }
lib.close(); CLOSE_STREAM( lib );
return; return;
} }
@ -2820,13 +2820,21 @@ bool IDF3_BOARD::ReadFile( const wxString& aFullFileName, bool aNoSubstituteOutl
// write the library file data // write the library file data
bool IDF3_BOARD::writeLibFile( const std::string& aFileName ) bool IDF3_BOARD::writeLibFile( const std::string& aFileName )
{ {
std::ofstream lib; OPEN_OSTREAM( lib, aFileName.c_str() );
lib.exceptions( std::ofstream::failbit );
try try
{ {
lib.open( aFileName.c_str(), std::ios_base::out ); lib.exceptions( std::ios_base::failbit );
if( lib.fail() )
{
ostringstream ostr;
ostr << "\n* could not open file: '" << aFileName << "'";
throw( IDF_ERROR( __FILE__, __FUNCTION__, __LINE__, ostr.str() ) );
}
lib.imbue( std::locale( "C" ) );
wxDateTime tdate( time( NULL ) ); wxDateTime tdate( time( NULL ) );
if( idfSource.empty() ) if( idfSource.empty() )
@ -2856,28 +2864,32 @@ bool IDF3_BOARD::writeLibFile( const std::string& aFileName )
catch( const std::exception& ) catch( const std::exception& )
{ {
lib.exceptions( std::ios_base::goodbit ); lib.exceptions( std::ios_base::goodbit );
CLOSE_STREAM( lib );
if( lib.is_open() )
lib.close();
throw; throw;
} }
lib.close(); CLOSE_STREAM( lib );
return true; return true;
} }
// write the board file data // write the board file data
void IDF3_BOARD::writeBoardFile( const std::string& aFileName ) void IDF3_BOARD::writeBoardFile( const std::string& aFileName )
{ {
std::ofstream brd; OPEN_OSTREAM( brd, aFileName.c_str() );
brd.exceptions( std::ofstream::failbit );
try try
{ {
brd.open( aFileName.c_str(), std::ios_base::out ); brd.exceptions( std::ostream::failbit );
if( brd.fail() )
{
ostringstream ostr;
ostr << "\n* could not open file: '" << aFileName << "'";
throw( IDF_ERROR( __FILE__, __FUNCTION__, __LINE__, ostr.str() ) );
}
brd.imbue( std::locale( "C" ) );
wxDateTime tdate( time( NULL ) ); wxDateTime tdate( time( NULL ) );
if( idfSource.empty() ) if( idfSource.empty() )
@ -3123,15 +3135,11 @@ void IDF3_BOARD::writeBoardFile( const std::string& aFileName )
catch( const std::exception& ) catch( const std::exception& )
{ {
brd.exceptions( std::ios_base::goodbit ); brd.exceptions( std::ios_base::goodbit );
CLOSE_STREAM( brd );
if( brd.is_open() )
brd.close();
throw; throw;
} }
brd.close(); CLOSE_STREAM( brd );
return; return;
} }
@ -3889,14 +3897,22 @@ IDF3_COMP_OUTLINE* IDF3_BOARD::GetComponentOutline( wxString aFullFileName )
return NULL; return NULL;
} }
std::ifstream model; OPEN_ISTREAM( model, fname.c_str() );
model.exceptions ( std::ifstream::badbit );
try try
{ {
model.open( fname.c_str(), std::ios_base::in | std::ios_base::binary ); model.exceptions ( std::ios_base::badbit );
if( model.fail() )
{
ostringstream ostr;
ostr << "\n* could not open file: '" << fname << "'";
throw( IDF_ERROR( __FILE__, __FUNCTION__, __LINE__, ostr.str() ) );
}
model.imbue( std::locale( "C" ) );
std::string iline; // the input line std::string iline; // the input line
bool isComment; // true if a line just read in is a comment line bool isComment; // true if a line just read in is a comment line
std::streampos pos; std::streampos pos;
@ -3939,18 +3955,13 @@ IDF3_COMP_OUTLINE* IDF3_BOARD::GetComponentOutline( wxString aFullFileName )
catch( const std::exception& e ) catch( const std::exception& e )
{ {
delete cp; delete cp;
model.exceptions ( std::ios_base::goodbit ); model.exceptions ( std::ios_base::goodbit );
CLOSE_STREAM( model );
if( model.is_open() )
model.close();
errormsg = e.what(); errormsg = e.what();
return NULL; return NULL;
} }
model.close(); CLOSE_STREAM( model );
// check the unique ID against the list from library components // check the unique ID against the list from library components
std::list< std::string >::iterator lsts = uidLibList.begin(); std::list< std::string >::iterator lsts = uidLibList.begin();
@ -4291,7 +4302,6 @@ void IDF3_BOARD::Clear( void )
boardName.clear(); boardName.clear();
olnBoard.setThickness( thickness ); olnBoard.setThickness( thickness );
state = FILE_START;
unit = UNIT_MM; unit = UNIT_MM;
userScale = 1.0; userScale = 1.0;
userXoff = 0.0; userXoff = 0.0;

View File

@ -1,7 +1,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) 2014 Cirilo Bernardo * Copyright (C) 2014-2017 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
@ -91,7 +91,7 @@ private:
* data was encountered or an error occurred. if an error occurred then * data was encountered or an error occurred. if an error occurred then
* an exception is thrown. * an exception is thrown.
*/ */
bool readPlaceData( std::ifstream &aBoardFile, IDF3::FILE_STATE& aBoardState, bool readPlaceData( std::istream &aBoardFile, IDF3::FILE_STATE& aBoardState,
IDF3_BOARD *aBoard, IDF3::IDF_VERSION aIdfVersion, IDF3_BOARD *aBoard, IDF3::IDF_VERSION aIdfVersion,
bool aNoSubstituteOutlines ); bool aNoSubstituteOutlines );
@ -109,7 +109,7 @@ private:
* *
* @return bool: true if data was successfully written, otherwise false * @return bool: true if data was successfully written, otherwise false
*/ */
void writePlaceData( std::ofstream& aBoardFile, double aXpos, double aYpos, double aAngle, void writePlaceData( std::ostream& aBoardFile, double aXpos, double aYpos, double aAngle,
const std::string aRefDes, IDF3::IDF_PLACEMENT aPlacement, const std::string aRefDes, IDF3::IDF_PLACEMENT aPlacement,
IDF3::IDF_LAYER aSide ); IDF3::IDF_LAYER aSide );
@ -233,7 +233,7 @@ private:
* *
* @return bool: true if the operation succeeded, otherwise false * @return bool: true if the operation succeeded, otherwise false
*/ */
bool writeDrillData( std::ofstream& aBoardFile ); bool writeDrillData( std::ostream& aBoardFile );
/** /**
* Function WritePlaceData * Function WritePlaceData
@ -243,7 +243,7 @@ private:
* *
* @return bool: true if the operation succeeded, otherwise false * @return bool: true if the operation succeeded, otherwise false
*/ */
bool writePlaceData( std::ofstream& aBoardFile ); bool writePlaceData( std::ostream& aBoardFile );
#ifndef DISABLE_IDF_OWNERSHIP #ifndef DISABLE_IDF_OWNERSHIP
bool checkOwnership( int aSourceLine, const char* aSourceFunc ); bool checkOwnership( int aSourceLine, const char* aSourceFunc );
@ -474,7 +474,6 @@ private:
std::map< std::string, IDF3_COMPONENT*> components; // drill and placement data for components std::map< std::string, IDF3_COMPONENT*> components; // drill and placement data for components
std::map< std::string, IDF3_COMP_OUTLINE*> compOutlines; // component outlines (data for library file) std::map< std::string, IDF3_COMP_OUTLINE*> compOutlines; // component outlines (data for library file)
std::string boardName; std::string boardName;
IDF3::FILE_STATE state;
IDF3::CAD_TYPE cadType; IDF3::CAD_TYPE cadType;
IDF3::IDF_UNIT unit; IDF3::IDF_UNIT unit;
IDF3::IDF_VERSION idfVer; // IDF version of Board or Library IDF3::IDF_VERSION idfVer; // IDF version of Board or Library
@ -526,18 +525,18 @@ private:
bool delCompDrill( double aDia, double aXpos, double aYpos, std::string aRefDes ); bool delCompDrill( double aDia, double aXpos, double aYpos, std::string aRefDes );
// read the DRILLED HOLES section // read the DRILLED HOLES section
void readBrdDrills( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState ); void readBrdDrills( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState );
// read the NOTES section // read the NOTES section
void readBrdNotes( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState ); void readBrdNotes( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState );
// read the component placement section // read the component placement section
void readBrdPlacement( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState, void readBrdPlacement( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState,
bool aNoSubstituteOutlines ); bool aNoSubstituteOutlines );
// read the board HEADER // read the board HEADER
void readBrdHeader( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState ); void readBrdHeader( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState );
// read individual board sections; pay attention to IDFv3 section specifications // read individual board sections; pay attention to IDFv3 section specifications
// exception thrown on unrecoverable errors. state flag set to FILE_PLACEMENT // exception thrown on unrecoverable errors. state flag set to FILE_PLACEMENT
// upon reading the PLACEMENT file; according to IDFv3 this is the final section // upon reading the PLACEMENT file; according to IDFv3 this is the final section
void readBrdSection( std::ifstream& aBoardFile, IDF3::FILE_STATE& aBoardState, void readBrdSection( std::istream& aBoardFile, IDF3::FILE_STATE& aBoardState,
bool aNoSubstituteOutlines ); bool aNoSubstituteOutlines );
// read the board file data // read the board file data
void readBoardFile( const std::string& aFileName, bool aNoSubstituteOutlines ); void readBoardFile( const std::string& aFileName, bool aNoSubstituteOutlines );
@ -546,9 +545,9 @@ private:
void writeBoardFile( const std::string& aFileName ); void writeBoardFile( const std::string& aFileName );
// read the library sections (outlines) // read the library sections (outlines)
void readLibSection( std::ifstream& aLibFile, IDF3::FILE_STATE& aLibState, IDF3_BOARD* aBoard ); void readLibSection( std::istream& aLibFile, IDF3::FILE_STATE& aLibState, IDF3_BOARD* aBoard );
// read the library HEADER // read the library HEADER
void readLibHeader( std::ifstream& aLibFile, IDF3::FILE_STATE& aLibState ); void readLibHeader( std::istream& aLibFile, IDF3::FILE_STATE& aLibState );
// read the library file data // read the library file data
void readLibFile( const std::string& aFileName ); void readLibFile( const std::string& aFileName );

View File

@ -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-2017 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
@ -980,7 +980,7 @@ bool VRML_LAYER::pushOutline( VRML_LAYER* holes )
// writes out the vertex list for a planar feature // writes out the vertex list for a planar feature
bool VRML_LAYER::WriteVertices( double aZcoord, std::ofstream& aOutFile, int aPrecision ) bool VRML_LAYER::WriteVertices( double aZcoord, std::ostream& aOutFile, int aPrecision )
{ {
if( ordmap.size() < 3 ) if( ordmap.size() < 3 )
{ {
@ -1026,7 +1026,7 @@ bool VRML_LAYER::WriteVertices( double aZcoord, std::ofstream& aOutFile, int aPr
// writes out the vertex list for a 3D feature; top and bottom are the // writes out the vertex list for a 3D feature; top and bottom are the
// Z values for the top and bottom; top must be > bottom // Z values for the top and bottom; top must be > bottom
bool VRML_LAYER::Write3DVertices( double aTopZ, double aBottomZ, bool VRML_LAYER::Write3DVertices( double aTopZ, double aBottomZ,
std::ofstream& aOutFile, int aPrecision ) std::ostream& aOutFile, int aPrecision )
{ {
if( ordmap.size() < 3 ) if( ordmap.size() < 3 )
{ {
@ -1113,7 +1113,7 @@ bool VRML_LAYER::Write3DVertices( double aTopZ, double aBottomZ,
// writes out the index list; // writes out the index list;
// 'top' indicates the vertex ordering and should be // 'top' indicates the vertex ordering and should be
// true for a polygon visible from above the PCB // true for a polygon visible from above the PCB
bool VRML_LAYER::WriteIndices( bool aTopFlag, std::ofstream& aOutFile ) bool VRML_LAYER::WriteIndices( bool aTopFlag, std::ostream& aOutFile )
{ {
if( triplets.empty() ) if( triplets.empty() )
{ {
@ -1161,7 +1161,7 @@ bool VRML_LAYER::WriteIndices( bool aTopFlag, std::ofstream& aOutFile )
// writes out the index list for a 3D feature // writes out the index list for a 3D feature
bool VRML_LAYER::Write3DIndices( std::ofstream& aOutFile, bool aIncludePlatedHoles ) bool VRML_LAYER::Write3DIndices( std::ostream& aOutFile, bool aIncludePlatedHoles )
{ {
if( outline.empty() ) if( outline.empty() )
{ {
@ -1703,7 +1703,7 @@ int VRML_LAYER::GetSize( void )
// renumbering of all vertices from 'start'. Returns the end number. // renumbering of all vertices from 'start'. Returns the end number.
// Take care when using this call since tesselators cannot work on // Take care when using this call since tesselators cannot work on
// the internal data concurrently // the internal data concurrently
int VRML_LAYER::Import( int start, GLUtesselator* tess ) int VRML_LAYER::Import( int start, GLUtesselator* aTesselator )
{ {
if( start < 0 ) if( start < 0 )
{ {
@ -1711,7 +1711,7 @@ int VRML_LAYER::Import( int start, GLUtesselator* tess )
return -1; return -1;
} }
if( !tess ) if( !aTesselator )
{ {
error = "Import(): NULL tesselator pointer"; error = "Import(): NULL tesselator pointer";
return -1; return -1;
@ -1741,7 +1741,7 @@ int VRML_LAYER::Import( int start, GLUtesselator* tess )
cbeg = contours[i]->begin(); cbeg = contours[i]->begin();
cend = contours[i]->end(); cend = contours[i]->end();
gluTessBeginContour( tess ); gluTessBeginContour( aTesselator );
while( cbeg != cend ) while( cbeg != cend )
{ {
@ -1749,10 +1749,10 @@ int VRML_LAYER::Import( int start, GLUtesselator* tess )
pt[0] = vp->x; pt[0] = vp->x;
pt[1] = vp->y; pt[1] = vp->y;
pt[2] = 0.0; pt[2] = 0.0;
gluTessVertex( tess, pt, vp ); gluTessVertex( aTesselator, pt, vp );
} }
gluTessEndContour( tess ); gluTessEndContour( aTesselator );
} }
return start; return start;

View File

@ -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-2017 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
@ -49,7 +49,7 @@
# include <GL/glu.h> # include <GL/glu.h>
#endif #endif
#include <fstream> #include <iostream>
#include <vector> #include <vector>
#include <list> #include <list>
#include <utility> #include <utility>
@ -336,7 +336,7 @@ public:
* *
* @return bool: true if the operation succeeded * @return bool: true if the operation succeeded
*/ */
bool WriteVertices( double aZcoord, std::ofstream& aOutFile, int aPrecision ); bool WriteVertices( double aZcoord, std::ostream& aOutFile, int aPrecision );
/** /**
* Function Write3DVertices * Function Write3DVertices
@ -349,7 +349,7 @@ public:
* *
* @return bool: true if the operation succeeded * @return bool: true if the operation succeeded
*/ */
bool Write3DVertices( double aTopZ, double aBottomZ, std::ofstream& aOutFile, int aPrecision ); bool Write3DVertices( double aTopZ, double aBottomZ, std::ostream& aOutFile, int aPrecision );
/** /**
* Function WriteIndices * Function WriteIndices
@ -362,7 +362,7 @@ public:
* *
* @return bool: true if the operation succeeded * @return bool: true if the operation succeeded
*/ */
bool WriteIndices( bool aTopFlag, std::ofstream& aOutFile ); bool WriteIndices( bool aTopFlag, std::ostream& aOutFile );
/** /**
* Function Write3DIndices * Function Write3DIndices
@ -375,7 +375,7 @@ public:
* *
* @return bool: true if the operation succeeded * @return bool: true if the operation succeeded
*/ */
bool Write3DIndices( std::ofstream& aOutFile, bool aIncludePlatedHoles = false ); bool Write3DIndices( std::ostream& aOutFile, bool aIncludePlatedHoles = false );
/** /**
* Function AddExtraVertex * Function AddExtraVertex
@ -436,7 +436,7 @@ public:
* *
* @return int: the number of vertices exported * @return int: the number of vertices exported
*/ */
int Import( int start, GLUtesselator* tess ); int Import( int start, GLUtesselator* aTesselator );
/** /**
* Function GetVertexByIndex * Function GetVertexByIndex