#include "VEFViewer.h"
#include <QtDebug>
#include <cstdio>
VEFViewer::VEFViewer(QWidget* parent): QGLViewer(parent)
{
restoreStateFromFile();
}
void VEFViewer::addFile(QString s)
{
GLuint display_list;
QFileInfo fi(s);
QString ext = fi.suffix();
if (ext == "vrt")
display_list = readVertexFile(s);
else if (ext == "edg")
display_list = readEdgeFile(s);
else if (ext == "stl")
display_list = readSTLFile(s);
else
return;
modelList->addItem(new QDisplayListLWI(fi.baseName(), display_list));
}
// Draws a spiral
void VEFViewer::draw()
{
for (int i = 0; i < modelList->count(); i++)
{
QDisplayListLWI* dl = static_cast<QDisplayListLWI*>(modelList->item(i));
glColor3f(1., 1., 1.);
glCallList(dl->getDisplayList());
}
}
QString VEFViewer::helpString() const
{
QString text("<h2>VEFViewer</h2>");
text += "Displays vertices (vrt), edges (edg), and face (stl) files.";
return text;
}
void VEFViewer::keyPressEvent(QKeyEvent* e)
{
const Qt::KeyboardModifiers modifiers = e->modifiers();
bool handled = false;
if ((e->key() == Qt::Key_O) && (modifiers == Qt::NoButton))
{
QString s = QFileDialog::getOpenFileName(this, "Choose file to open", ".", "3D data (*.vrt *.edg *.stl)");
if (!s.isNull())
addFile(s);
}
setSceneBoundingBox(min, max);
if (!handled)
QGLViewer::keyPressEvent(e);
}
GLuint VEFViewer::readVertexFile(QString s)
{
FILE* file;
if ((file = fopen(s.toLocal8Bit().data(), "r")) == NULL)
{
qDebug() << "Could not open file " << s << " for reading";
return 0;
}
GLuint list = glGenLists(1);
glNewList(list, GL_COMPILE);
glBegin(GL_POINTS);
float x,y,z;
int result = fscanf(file, "%f %f %f", &x, &y, &z);
while(result != EOF)
{
glVertex3f(x,y,z);
updateMinMax(x,y,z);
result = fscanf(file, "%f %f %f", &x, &y, &z);
}
glEnd();
glEndList();
fclose(file);
return list;
}
GLuint VEFViewer::readEdgeFile(QString s)
{
}
GLuint VEFViewer::readSTLFile(QString s)
{
FILE* file;
if ((file = fopen(s.toLocal8Bit().data(), "r")) == NULL)
{
qDebug() << "Could not open file " << s << " for reading";
return 0;
}
GLuint list = glGenLists(1);
glNewList(list, GL_COMPILE);
glBegin(GL_TRIANGLES);
float nx,ny,nz;
float x0,y0,z0;
float x1,y1,z1;
float x2,y2,z2;
int result = readFacet(file, nx,ny,nz, x0,y0,z0, x1,y1,z1, x2,y2,z2);
//while(result != EOF)
//{
glNormal3f(nx,ny,nz);
glVertex3f(x0,y0,z0);
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);
std::cout << "Adding triangle" << std::endl;
std::cout << nx << " " << ny << " " << nz << std::endl;
std::cout << x0 << " " << y0 << " " << z0 << std::endl;
std::cout << x1 << " " << y1 << " " << z1 << std::endl;
std::cout << x2 << " " << y2 << " " << z2 << std::endl;
updateMinMax(x0,y0,z0);
updateMinMax(x1,y1,z1);
updateMinMax(x2,y2,z2);
// result = readFacet(file, nx,ny,nz, x0,y0,z0, x1,y1,z1, x2,y2,z2);
//}
glEnd();
glEndList();
fclose(file);
return list;
}
int VEFViewer::readFacet(FILE* file,
float& nx, float& ny, float& nz,
float& x0, float& y0, float& z0,
float& x1, float& y1, float& z1,
float& x2, float& y2, float& z2)
{
int result = fscanf(file, "facet normal %f %f %f\n", &nx, &ny, &nz);
result = fscanf(file, "outer loop\n");
result = fscanf(file, "vertex %f %f %f\n", &x0, &y0, &z0);
result = fscanf(file, "vertex %f %f %f\n", &x1, &y1, &z1);
result = fscanf(file, "vertex %f %f %f\n", &x2, &y2, &z2);
result = fscanf(file, "endloop\n");
result = fscanf(file, "endfacet\n");
return result;
}
void VEFViewer::updateMinMax(float x, float y, float z)
{
if (x < min.x) min.x = x;
if (y < min.y) min.y = y;
if (z < min.z) min.z = z;
if (x > max.x) max.x = x;
if (y > max.y) max.y = y;
if (z > max.z) max.z = z;
}