VEFViewer.cpp
author morozov@geomdm.geomagic.com
Mon, 12 Jun 2006 09:33:54 -0400
changeset 0 1168ca87fd4e
child 1 9ac2dc8d1e24
permissions -rw-r--r--
Initial commit

#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;
}