You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
4.5 KiB
C++
226 lines
4.5 KiB
C++
#if defined(_MSC_VER) /* MSVC Compiler */
|
|
#pragma warning ( disable : 4786 )
|
|
#endif
|
|
|
|
#include <float.h>
|
|
#include <stdio.h>
|
|
#include <qtextstream.h>
|
|
|
|
#include "qwt3d_surfaceplot.h"
|
|
#include "qwt3d_io_reader.h"
|
|
|
|
using namespace std;
|
|
using namespace Qwt3D;
|
|
|
|
const char* NativeReader::magicstring = "jk:11051895-17021986";
|
|
|
|
namespace
|
|
{
|
|
FILE* open(QString fname)
|
|
{
|
|
FILE* file = fopen(QWT3DLOCAL8BIT(fname), "r");
|
|
if (!file)
|
|
{
|
|
fprintf(stderr, "NativeReader::read: cannot open data file \"%s\"\n", QWT3DLOCAL8BIT(fname));
|
|
}
|
|
return file;
|
|
}
|
|
|
|
int read_char (FILE * fp, bool skipcomments = true)
|
|
{
|
|
int c;
|
|
|
|
if ((c = fgetc (fp)) == EOF)
|
|
return (c);
|
|
if (skipcomments)
|
|
{
|
|
if (c == '#')
|
|
{
|
|
do
|
|
{
|
|
if ((c = fgetc (fp)) == EOF)
|
|
return (c);
|
|
}
|
|
while (c != '\n' && c != '\r');
|
|
}
|
|
}
|
|
return (c);
|
|
}
|
|
|
|
char* read_field (FILE * fp, bool skipcomments = true)
|
|
{
|
|
static char buf[71];
|
|
int c, i;
|
|
|
|
do
|
|
{
|
|
if ((c = read_char (fp,skipcomments)) == EOF)
|
|
return (NULL);
|
|
}
|
|
while (isspace (c));
|
|
for (i = 0; i < 70 && !isspace (c); ++i)
|
|
{
|
|
buf[i] = c;
|
|
if ((c = read_char (fp,skipcomments)) == EOF)
|
|
break;
|
|
}
|
|
buf[i] = '\0';
|
|
return (buf);
|
|
}
|
|
|
|
|
|
//! set to data begin
|
|
bool extract_info(FILE* fp, unsigned int& xmesh, unsigned int& ymesh, double& xmin, double& xmax, double& ymin, double& ymax)
|
|
{
|
|
char* p;
|
|
|
|
// find out the size
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
xmesh = (unsigned int)atoi(p);
|
|
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
ymesh = (unsigned int)atoi (p);
|
|
|
|
if (xmesh < 1 || ymesh < 1)
|
|
return false;
|
|
|
|
// ... and the limits
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
xmin = atof (p);
|
|
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
xmax = atof (p);
|
|
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
ymin = atof (p);
|
|
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
ymax = atof (p);
|
|
|
|
if (xmin > xmax || ymin > ymax)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
//! find out what the magic string is and compare
|
|
bool check_magic(FILE* fp, const char* val)
|
|
{
|
|
char* p;
|
|
if ((p = read_field (fp,false)) == 0)
|
|
return false;
|
|
|
|
if (strcmp (p, val ) != 0)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
//! find out what the type is
|
|
bool check_type(FILE* fp, const char* val)
|
|
{
|
|
char* p;
|
|
if ((p = read_field (fp)) == 0)
|
|
return false;
|
|
|
|
if (strcmp (p, val ) != 0)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
double** allocateData(int columns, int rows)
|
|
{
|
|
double** data = new double* [columns] ;
|
|
|
|
for ( int i = 0; i < columns; ++i)
|
|
{
|
|
data[i] = new double [rows];
|
|
}
|
|
return data;
|
|
}
|
|
|
|
void deleteData(double**data, int columns)
|
|
{
|
|
for ( int i = 0; i < columns; i++)
|
|
{
|
|
delete [] data[i];
|
|
}
|
|
delete [] data;
|
|
}
|
|
}
|
|
|
|
NativeReader::NativeReader()
|
|
: minz_(-DBL_MAX), maxz_(DBL_MAX)
|
|
{
|
|
}
|
|
|
|
bool NativeReader::collectInfo(FILE*& file, QString const& fname, unsigned& xmesh, unsigned& ymesh,
|
|
double& minx, double& maxx, double& miny, double& maxy)
|
|
{
|
|
if (fname.isEmpty())
|
|
return false;
|
|
|
|
file = open(fname);
|
|
|
|
if (!file)
|
|
return false;
|
|
|
|
|
|
if (
|
|
(!check_magic(file, magicstring))
|
|
||(!check_type(file, "MESH"))
|
|
||(!extract_info(file, xmesh, ymesh, minx, maxx, miny, maxy))
|
|
)
|
|
{
|
|
fclose(file);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool NativeReader::operator()(Plot3D* plot, QString const& fname)
|
|
{
|
|
|
|
FILE* file;
|
|
unsigned int xmesh, ymesh;
|
|
double minx, maxx, miny, maxy;
|
|
|
|
if ( !collectInfo(file, fname, xmesh, ymesh, minx, maxx, miny, maxy) )
|
|
return false;
|
|
|
|
/* allocate some space for the mesh */
|
|
double** data = allocateData(xmesh, ymesh);
|
|
|
|
for (unsigned int j = 0; j < ymesh; j++)
|
|
{
|
|
for (unsigned int i = 0; i < xmesh; i++)
|
|
{
|
|
if (fscanf(file, "%lf", &data[i][j]) != 1)
|
|
{
|
|
fprintf(stderr, "NativeReader::read: error in data file \"%s\"\n", QWT3DLOCAL8BIT(fname));
|
|
return false;
|
|
}
|
|
|
|
if (data[i][j] > maxz_)
|
|
data[i][j] = maxz_;
|
|
else if (data[i][j] < minz_)
|
|
data[i][j] = minz_;
|
|
}
|
|
}
|
|
|
|
/* close the file */
|
|
fclose(file);
|
|
|
|
((SurfacePlot*)plot)->loadFromData(data, xmesh, ymesh, minx, maxx, miny, maxy);
|
|
deleteData(data,xmesh);
|
|
|
|
return true;
|
|
}
|