--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/VEFViewer.cpp Mon Jun 12 09:33:54 2006 -0400
@@ -0,0 +1,170 @@
+#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;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/VEFViewer.h Mon Jun 12 09:33:54 2006 -0400
@@ -0,0 +1,51 @@
+#ifndef __VEFVIEWER_H__
+#define __VEFVIEWER_H__
+
+#include <QGLViewer/qglviewer.h>
+#include <QFileDialog>
+#include <QListWidgetItem>
+
+class VEFViewer: public QGLViewer
+{
+ public:
+ VEFViewer(QWidget* parent);
+ void addFile(QString s);
+ void setModelList(QListWidget* l) { modelList = l; }
+
+ protected:
+ virtual void draw();
+ virtual QString helpString() const;
+ virtual void keyPressEvent(QKeyEvent *e);
+
+ private:
+ GLuint readVertexFile(QString s);
+ GLuint readEdgeFile(QString s);
+ GLuint readSTLFile(QString s);
+ void updateMinMax(float x, float y, float z);
+
+ int 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);
+
+ QListWidget* modelList;
+
+ qglviewer::Vec min, max;
+};
+
+class QDisplayListLWI: public QListWidgetItem
+{
+ public:
+ QDisplayListLWI(QString name, GLuint dl):
+ QListWidgetItem(name), display_list(dl)
+ {}
+ GLuint getDisplayList() const { return display_list; }
+ ~QDisplayListLWI() { glDeleteLists(display_list, 1); }
+
+ private:
+ GLuint display_list;
+
+};
+
+#endif // __VEFVIEWER_H__