Files
Clifford Yapp d824fc0c4e Keep longer directory names
We want to be consistent with the previous layout, to avoid needlessly
breaking existing codes.  The header update means client codes are not
required to include all of the stepcode library includes explicitly -
i.e., stepcode itself does not force this requirement with its own
internal includes.  However, if client codes do not want to add the
library prefixes to their own includes as we have for stepcode, they
should still be able to add the various includes and work as before.
Adjust the include directory names accordingly.
2022-10-02 17:57:57 -04:00

260 lines
8.6 KiB
C++

#ifndef _STEPFILE_H
#define _STEPFILE_H
/*
* NIST STEP Core Class Library
* cleditor/STEPfile.h
* April 1997
* Peter Carr
* K. C. Morris
* David Sauder
* Development of this software was funded by the United States Government,
* and is not subject to copyright.
*/
#include <sc_export.h>
#include <string>
#include "clstepcore/instmgr.h"
#include "clstepcore/Registry.h"
#include <fstream>
#include "clutils/dirobj.h"
#include "clutils/errordesc.h"
#include <time.h>
#include "clstepcore/read_func.h"
//error reporting level
#define READ_COMPLETE 10
#define READ_INCOMPLETE 20
enum FileTypeCode {
VERSION_OLD = -1,
VERSION_UNKNOWN = 0,
VERSION_CURRENT = 1,
WORKING_SESSION = 2
};
class SC_EDITOR_EXPORT STEPfile {
protected:
//data members
InstMgr & _instances;
Registry & _reg;
InstMgr & instances() {
return _instances;
}
Registry & reg() {
return _reg;
}
int _fileIdIncr; ///< Increment value to be added to FileId Numbers on input
//header information
InstMgr * _headerInstances;
Registry * _headerRegistry;
int _headerId; ///< STEPfile_id given to SDAI_Application_instance from header section
//file information
DirObj * _currentDir;
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable: 4251 )
#endif
std::string _fileName;
//the following are used to compute read/write progress
std::ifstream::pos_type _iFileSize; ///< input file size
std::ifstream::pos_type _iFileCurrentPosition; ///< input file position (from ifstream::tellg())
#ifdef _MSC_VER
#pragma warning( pop )
#endif
bool _iFileStage1Done; ///< set immediately before ReadData1() returns
int _oFileInstsWritten; ///< number of instances that have been written
//error information
ErrorDescriptor _error;
// new errors
int _entsNotCreated; ///< num entities not created in first pass
int _entsInvalid; ///< num entities that had invalid attr values
int _entsIncomplete; /**< num entities that had missing attr values
(includes entities that had invalid values
for required attrs)*/
int _entsWarning; /**< num entities that may have had problems
with attrs - reported as an attr user msg */
// old errors
int _errorCount;
int _warningCount;
int _maxErrorCount;
bool _strict; ///< If false, "missing and required" attributes are replaced with a generic value when file is read
bool _verbose; ///< Defaults to false; if true, info is always printed to stdout.
protected:
//file type information
FileTypeCode _fileType;
char ENTITY_NAME_DELIM;
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable: 4251 )
#endif
std::string FILE_DELIM;
std::string END_FILE_DELIM;
#ifdef _MSC_VER
#pragma warning( pop )
#endif
//public member functions
public:
//public access to member variables
//header information
InstMgr * HeaderInstances() {
return _headerInstances;
}
const Registry * HeaderRegistry() {
return _headerRegistry;
}
// to create header instances
SDAI_Application_instance * HeaderDefaultFileName();
SDAI_Application_instance * HeaderDefaultFileDescription();
SDAI_Application_instance * HeaderDefaultFileSchema();
//file information
std::string FileName() const {
return _fileName;
}
std::string SetFileName( const std::string name = "" );
std::string TruncFileName( const std::string name ) const;
float GetReadProgress() const;
float GetWriteProgress() const;
//error information
ErrorDescriptor & Error() { /* const */
return _error;
}
int ErrorCount() const {
return _errorCount;
}
int WarningCount() const {
return _warningCount;
}
Severity AppendEntityErrorMsg( ErrorDescriptor * e );
//version information
FileTypeCode FileType() const {
return _fileType;
}
void FileType( FileTypeCode ft ) {
_fileType = ft;
}
int SetFileType( FileTypeCode ft = VERSION_CURRENT );
//Reading and Writing
Severity ReadExchangeFile( const std::string filename = "", bool useTechCor = 1 );
Severity AppendExchangeFile( const std::string filename = "", bool useTechCor = 1 );
Severity ReadWorkingFile( const std::string filename = "", bool useTechCor = 1 );
Severity AppendWorkingFile( const std::string filename = "", bool useTechCor = 1 );
Severity AppendFile( istream * in, bool useTechCor = 1 ) ;
Severity WriteExchangeFile( ostream & out, int validate = 1,
int clearError = 1, int writeComments = 1 );
Severity WriteExchangeFile( const std::string filename = "", int validate = 1,
int clearError = 1, int writeComments = 1 );
Severity WriteValuePairsFile( ostream & out, int validate = 1,
int clearError = 1,
int writeComments = 1, int mixedCase = 1 );
Severity WriteWorkingFile( ostream & out, int clearError = 1,
int writeComments = 1 );
Severity WriteWorkingFile( const std::string filename = "", int clearError = 1,
int writeComments = 1 );
stateEnum EntityWfState( char c );
void Renumber();
//constructors
STEPfile( Registry & r, InstMgr & i, const std::string filename = "", bool strict = true );
virtual ~STEPfile();
protected:
//member functions
std::string schemaName(); /**< Returns and copies out schema name from header instances.
Called by ReadExchangeFile */
istream * OpenInputFile( const std::string filename = "" );
void CloseInputFile( istream * in );
Severity ReadHeader( istream & in );
Severity HeaderVerifyInstances( InstMgr * im );
void HeaderMergeInstances( InstMgr * im );
int HeaderId( int increment = 1 );
int HeaderId( const char * nm = "\0" );
int ReadData1( istream & in ); /**< First pass, to create instances */
int ReadData2( istream & in, bool useTechCor = true ); /**< Second pass, to read instances */
// obsolete
int ReadWorkingData1( istream & in );
int ReadWorkingData2( istream & in, bool useTechCor = true );
void ReadRestOfFile( istream & in );
/// create instance - used by ReadData1()
SDAI_Application_instance * CreateInstance( istream & in, ostream & out );
/// create complex instance - used by CreateInstance()
SDAI_Application_instance * CreateSubSuperInstance( istream & in, int fileid,
ErrorDescriptor & );
// read the instance - used by ReadData2()
SDAI_Application_instance * ReadInstance( istream & in, ostream & out,
std::string & cmtStr, bool useTechCor = true );
/// reading scopes are still incomplete, CreateScopeInstances and ReadScopeInstances are stubs
Severity CreateScopeInstances( istream & in, SDAI_Application_instance_ptr ** scopelist );
Severity ReadScopeInstances( istream & in );
// Severity ReadSubSuperInstance(istream& in);
int FindDataSection( istream & in );
int FindHeaderSection( istream & in );
// writing working session files
void WriteWorkingData( ostream & out, int writeComments = 1 );
//called by WriteExchangeFile
ofstream * OpenOutputFile( const std::string filename = "" );
void CloseOutputFile( ostream * out );
void WriteHeader( ostream & out );
void WriteHeaderInstance( SDAI_Application_instance * obj, ostream & out );
void WriteHeaderInstanceFileName( ostream & out );
void WriteHeaderInstanceFileDescription( ostream & out );
void WriteHeaderInstanceFileSchema( ostream & out );
void WriteData( ostream & out, int writeComments = 1 );
void WriteValuePairsData( ostream & out, int writeComments = 1,
int mixedCase = 1 );
int IncrementFileId( int fileid );
int FileIdIncr() {
return _fileIdIncr;
}
void SetFileIdIncrement();
void MakeBackupFile();
// void ReadWhiteSpace(istream& in);
};
//inline functions
#endif /* _STEPFILE_H */