Calculix Data Visualiser using QT
Posted
by Ann
on Stack Overflow
See other posts from Stack Overflow
or by Ann
Published on 2010-03-13T09:46:36Z
Indexed on
2010/03/13
9:55 UTC
Read the original article
Hit count: 334
qt4
I am doing a project on CalculiX data visualizor,using Qt.I 've to draw the structure and after giving force the displacement should be shawn as variation in color.I chose HSV coloring,but while executing I got an error message:"QColor::from Hsv:HSV parameters out of range".The code is:
DataViz1::DataViz1(QWidget *parent) : QWidget(parent), ui(new Ui::DataViz1) { DArea = new QGLScreen(this); DArea->setGeometry(QRect(10,10,700,600)); //TODO This values are feeded by user dfile="/home/41407/color.txt";//input file with displacement mfile="/home/41407/mesh21.txt";//input file nodeId="*NODE"; elId="*ELEMENT"; DataId="displ";
parseMfile();
parseDfile();
DArea->Nodes=Nodes;
DArea->Elements=Elements;
DArea->Data=Data;
DArea->fillColorArray();
//printf("Colr is %d",DArea->pickColor(-11.02,0));fflush(stdout);
ui->setupUi(this);
}
DataViz1::~DataViz1() { delete ui; } void DataViz1::parseMfile() { QFile file(mfile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; int node_end=0; QTextStream in(&file); in.skipWhiteSpace(); while (!in.atEnd()) { QString line = in.readLine(); if(line.startsWith(nodeId))//Node block in Mfile { while(1) { line = in.readLine(); if(line.startsWith(elId)) { break; } Nodes<
while(1)
{
line = in.readLine();
Elements<<line;
//printf("Element is %s\n",line.toLocal8Bit().constData());fflush(stdout);
if(in.atEnd()) break;
}
}
}
}
void DataViz1::parseDfile() { QFile file(dfile); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; int node_end=0; QTextStream in(&file); in.skipWhiteSpace(); while (!in.atEnd()) { QString line = in.readLine(); if(line.startsWith(DataId)) { continue; } line = in.readLine(); Data<
}
/......................................................................../
include "qglscreen.h"
include
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
QGLScreen::QGLScreen(QWidget *parent):QGLWidget(QGLFormat(QGL::SampleBuffers), parent) { clearColor = Qt::black; xRot = 0; yRot = 0; zRot = 0;
ifdef QT_OPENGL_ES_2
program = 0;
endif
//TODO user input
ElType="HE8";
DType="SolidFrame";
axis="X";
}
QGLScreen::~QGLScreen() {
}
QSize QGLScreen::minimumSizeHint() const { return QSize(50, 50); }
QSize QGLScreen::sizeHint() const { return QSize(200, 200); }
void QGLScreen::setClearColor(const QColor &color) { clearColor = color; updateGL(); } void QGLScreen::initializeGL() {
xRot=0;
yRot=0;
zRot=0;
scaling = 1.0;
/* select clearing (background) color */
glClearColor (0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// glViewport(0,0,10,10);
glOrtho(-10.0, +10.0, -10.0, +10.0, -10.0,+10.0);
glEnable (GL_LINE_SMOOTH);
glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
} void QGLScreen::wheel1() { scaling1 += .0025; count2++; update(); } void QGLScreen::wheel2() { if(count2>-14) { scaling1 -= .0025; count2--; update(); } } void QGLScreen::drawModel(int x1,int y1,int x2,int y2) {
makeCurrent();
QStringList Cnode,Celement;
for (int i = 0; i < Elements.size(); ++i)
{
Celement=Elements.at(i).split(",");
// printf("Element is %s",Celement.at(0).toLocal8Bit().constData());fflush(stdout);
//printf("Node at el is %s\n",(findNode(Celement.at(1).toInt())).at(1).toLocal8Bit().constData());
fflush(stdout);
if(ElType=="HE8")
{
//First four nodes
float ENX1=(findNode(Celement.at(1).toInt())).at(1).toDouble();
float ENX2=(findNode(Celement.at(2).toInt())).at(1).toDouble();
float ENX3=(findNode(Celement.at(3).toInt())).at(1).toDouble();
float ENX4=(findNode(Celement.at(4).toInt())).at(1).toDouble();
float ENY1=(findNode(Celement.at(1).toInt())).at(2).toDouble();
float ENY2=(findNode(Celement.at(2).toInt())).at(2).toDouble();
float ENY3=(findNode(Celement.at(3).toInt())).at(2).toDouble();
float ENY4=(findNode(Celement.at(4).toInt())).at(2).toDouble();
float ENZ1=(findNode(Celement.at(1).toInt())).at(3).toDouble();
float ENZ2=(findNode(Celement.at(2).toInt())).at(3).toDouble();
float ENZ3=(findNode(Celement.at(3).toInt())).at(3).toDouble();
float ENZ4=(findNode(Celement.at(4).toInt())).at(3).toDouble();
//Second four Nodes
float ENX5=(findNode(Celement.at(5).toInt())).at(1).toDouble();
float ENX6=(findNode(Celement.at(6).toInt())).at(1).toDouble();
float ENX7=(findNode(Celement.at(7).toInt())).at(1).toDouble();
float ENX8=(findNode(Celement.at(8).toInt())).at(1).toDouble();
float ENY5=(findNode(Celement.at(5).toInt())).at(2).toDouble();
float ENY6=(findNode(Celement.at(6).toInt())).at(2).toDouble();
float ENY7=(findNode(Celement.at(7).toInt())).at(2).toDouble();
float ENY8=(findNode(Celement.at(8).toInt())).at(2).toDouble();
float ENZ5=(findNode(Celement.at(5).toInt())).at(3).toDouble();
float ENZ6=(findNode(Celement.at(6).toInt())).at(3).toDouble();
float ENZ7=(findNode(Celement.at(7).toInt())).at(3).toDouble();
float ENZ8=(findNode(Celement.at(8).toInt())).at(3).toDouble();
//Identify Colors
GLfloat ENC[8][3];
for(int k=1;k<8;k++)
{
int hsv=pickColor(findData(Celement.at(k).toInt()).toDouble(),0);
//printf("hsv is %d=",hsv);fflush(stdout);
getRGB(hsv);
//printf("%d*%d*%d\n",red,green,blue);
//ENC[k]={red,green,blue};
ENC[k][0]=red;
ENC[k][1]=green;
ENC[k][2]=blue;
}
//Plot the first four direct loop
if(DType=="WireFrame"){
glBegin(GL_LINE_LOOP);
glColor3f(255,0,0);
glVertex3f(ENX1,ENY1,ENZ1);
glColor3f(255,0,0);
glVertex3f(ENX2,ENY2,ENZ2);
glColor3f(255,0,0);
glVertex3f(ENX3,ENY3,ENZ3);
glColor3f(255,0,0);
glVertex3f(ENX4,ENY4,ENZ4);
glEnd();
//Plot the second four direct loop
glBegin(GL_LINE_LOOP);
glColor3f(0,0,255);
glVertex3f(ENX5,ENY5,ENZ5);
glColor3f(0,0,255);
glVertex3f(ENX6,ENY6,ENZ6);
glColor3f(0,0,255);
glVertex3f(ENX7,ENY7,ENZ7);
glColor3f(0,0,255);
glVertex3f(ENX8,ENY8,ENZ8);
glEnd();
//Plot the interconnections
glBegin(GL_LINE);
glColor3f(150,150,150);
glVertex3f(ENX1,ENY1,ENZ1);
glVertex3f(ENX5,ENY5,ENZ5);
glEnd();
glBegin(GL_LINE);
glColor3f(150,150,150);
glVertex3f(ENX2,ENY2,ENZ2);
glVertex3f(ENX6,ENY6,ENZ6);
glEnd();
glBegin(GL_LINE);
glColor3f(150,150,150);
glVertex3f(ENX3,ENY3,ENZ3);
glVertex3f(ENX7,ENY7,ENZ7);
glEnd();
glBegin(GL_LINE);
glColor3f(150,150,150);
glVertex3f(ENX4,ENY4,ENZ4);
glVertex3f(ENX8,ENY8,ENZ8);
glEnd();
}
if(DType=="SolidFrame")
{
glBegin(GL_QUADS);
glColor3fv(ENC[1]);
glVertex3f(ENX1,ENY1,ENZ1);
glColor3fv(ENC[2]);
glVertex3f(ENX2,ENY2,ENZ2);
glColor3fv(ENC[3]);
glVertex3f(ENX3,ENY3,ENZ3);
glColor3fv(ENC[4]);
glVertex3f(ENX4,ENY4,ENZ4);
glEnd();
//break; glBegin(GL_QUADS); glColor3fv(ENC[5]); glVertex3f(ENX5,ENY5,ENZ5); glColor3fv(ENC[6]); glVertex3f(ENX6,ENY6,ENZ6); glColor3fv(ENC[7]); glVertex3f(ENX7,ENY7,ENZ7); glColor3fv(ENC[8]); glVertex3f(ENX8,ENY8,ENZ8); glEnd();
glBegin(GL_QUAD_STRIP);
glColor3fv(ENC[1]);
glVertex3f(ENX1,ENY1,ENZ1);
glColor3fv(ENC[5]);
glVertex3f(ENX5,ENY5,ENZ5);
glColor3fv(ENC[2]);
glVertex3f(ENX2,ENY2,ENZ2);
glColor3fv(ENC[6]);
glVertex3f(ENX6,ENY6,ENZ6);
glEnd();
glBegin(GL_QUAD_STRIP);
glColor3fv(ENC[3]);
glVertex3f(ENX3,ENY3,ENZ3);
glColor3fv(ENC[7]);
glVertex3f(ENX7,ENY7,ENZ7);
glColor3fv(ENC[4]);
glVertex3f(ENX4,ENY4,ENZ4);
glColor3fv(ENC[8]);
glVertex3f(ENX8,ENY8,ENZ8);
glEnd();
glBegin(GL_QUAD_STRIP);
glColor3fv(ENC[2]);
glVertex3f(ENX2,ENY2,ENZ2);
glColor3fv(ENC[6]);
glVertex3f(ENX6,ENY6,ENZ6);
glColor3fv(ENC[3]);
glVertex3f(ENX3,ENY3,ENZ3);
glColor3fv(ENC[7]);
glVertex3f(ENX7,ENY7,ENZ7);
glEnd();
glBegin(GL_QUAD_STRIP);
glColor3fv(ENC[1]);
glVertex3f(ENX1,ENY1,ENZ1);
glColor3fv(ENC[5]);
glVertex3f(ENX5,ENY5,ENZ5);
glColor3fv(ENC[4]);
glVertex3f(ENX4,ENY4,ENZ4);
glColor3fv(ENC[8]);
glVertex3f(ENX8,ENY8,ENZ8);
glEnd();
}
}
}
} QStringList QGLScreen::findNode(int element)
{ QStringList Temp; for (int i = 0; i < Nodes.size(); ++i) {
Temp=Nodes.at(i).split(",");
if(Temp.at(0).toInt()==element)
{
break;
}
}
return Temp;
} QString QGLScreen::findData(int Node) { QString Temp; QRegExp sep("\s+"); for (int i = 0; i < Data.size(); ++i) { if((Data.at(i).split("\t")).at(0).section(sep,1,1).toInt()==Node) { if(axis=="X") { Temp=Data.at(i).split("\t").at(0).section(sep,2,2); } if(axis=="Y") { Temp=Data.at(i).split("\t").at(0).section(sep,3,3); } if(axis=="Z") { Temp=Data.at(i).split("\t").at(0).section(sep,4,4); } break; }
}
return Temp;
}
void QGLScreen::fillColorArray() {
QString Temp1,Temp2,Temp3;
double d1s=0,d2s=0,d3s=0,d1l=0,d2l=0,d3l=0,diff=0;
QRegExp sep("\\s+");
for (int i = 0; i < Data.size(); ++i)
{
Temp1=(Data.at(i).split("\t")).at(0).section(sep,2,2);
if(d1s>Temp1.toDouble())
{
d1s=Temp1.toDouble();
}
if(d1l<Temp1.toDouble())
{
d1l=Temp1.toDouble();
}
Temp2=(Data.at(i).split("\t")).at(0).section(sep,3,3);
if(d2s>Temp2.toDouble())
{
d2s=Temp2.toDouble();
}
if(d2l<Temp2.toDouble())
{
d2l=Temp2.toDouble();
}
Temp3=(Data.at(i).split("\t")).at(0).section(sep,4,4);
if(d3s>Temp3.toDouble())
{
d3s=Temp3.toDouble();
}
if(d3l<Temp3.toDouble())
{
d3l=Temp3.toDouble();
}
// printf("data is %s",Temp.toLocal8Bit().constData());fflush(stdout);
}
color[0][0]=d1l;
for(int i=1;i<360;i++)
{
//printf("Large is%f small is %f",d1l,d1s);
diff=d1l-d1s;
if(d1l==0&&d1s<0)
color[0][i]=color[0][i-1]-diff/360;
else if(d1l>0&&d1s==0)
color[0][i]=color[0][i-1]+diff/360;
else if(d1l>0&&d1s<0)
color[0][i]=color[0][i-1]-diff/360;
diff=d2l-d2s;
if(d2l==0&&d2s<0)
color[1][i]=color[1][i-1]-diff/360;
else if(d2l>0&&d2s==0)
color[1][i]=color[1][i-1]+diff/360;
else if(d2l>0&&d2s<0)
color[1][i]=color[1][i-1]-diff/360;
diff=d3l-d3s;
if(d3l==0&&d3s<0)
color[2][i]=color[2][i-1]-diff/360;
else if(d3l>0&&d3s==0)
color[2][i]=color[2][i-1]+diff/360;
else if(d3l>0&&d3s<0)
color[2][i]=color[2][i-1]-diff/360;
}
//for(int i=0;i<360;i++) printf("%d %f %f %f\n",i,color[0][i],color[1][i],color[2][i]);
} int QGLScreen::pickColor(double data,int Did) { int i,pos; if(axis=="X")Did=0; if(axis=="Y")Did=1; if(axis=="Z")Did=2; //printf("%f data is",data);fflush(stdout); for(int i=0;i<360;i++) {
if(color[Did][i]<data && data>color[Did][i+1])
{
//printf("Orginal dat is %f Data found is %f and pos %d\n",data,color[Did][i],i);fflush(stdout);
pos=i;
break;
}
}
return pos;
} void QGLScreen::getRGB(int hsv) {
QColor c;
c.setHsv(hsv,255,255,255); QColor r=QColor::fromHsv(hsv,255,255); red=r.red(); green=r.green(); blue=r.blue();
}
void QGLScreen::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushAttrib(GL_ALL_ATTRIB_BITS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
GLfloat x = 3.0 * GLfloat(width()) / height();
glOrtho(-x, +x, -3.0, +3.0, 4.0, 15.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0, 0.0, -10.0);
glScalef(scaling, scaling, scaling);
glRotatef(xRot, 1.0, 0.0, 0.0);
glRotatef(yRot, 0.0, 1.0, 0.0);
glRotatef(zRot, 0.0, 0.0, 1.0);
drawModel(0,0,1,1);
/* don't wait!
* start processing buffered OpenGL routines
*/
glFlush ();
} /void QGLScreen::zoom1() { scaling+=.05; update(); }/
void QGLScreen::resizeGL(int width, int height) {
int side = qMin(width, height);
glViewport((width - side) / 2, (height - side) / 2, side, side);
#if !defined(QT_OPENGL_ES_2)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
#ifndef QT_OPENGL_ES
glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
#else
glOrthof(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0);
#endif
glMatrixMode(GL_MODELVIEW);
#endif
} void QGLScreen::mousePressEvent(QMouseEvent *event) { lastPos = event->pos(); }
void QGLScreen::mouseMoveEvent(QMouseEvent *event) {
GLfloat dx = GLfloat(event->x() - lastPos.x()) / width();
GLfloat dy = GLfloat(event->y() - lastPos.y()) / height();
if (event->buttons() & Qt::LeftButton) {
xRot+= 180 * dy;
yRot += 180 * dx;
update();
} else if (event->buttons() & Qt::RightButton) {
xRot += 180 * dy;
yRot += 180 * dx;
update();
}
lastPos = event->pos();
}
void QGLScreen::mouseReleaseEvent(QMouseEvent * /* event */) { emit clicked(); }
© Stack Overflow or respective owner