diff options
Diffstat (limited to 'lib/tqwtplot3d/examples/mesh2/src/mesh2mainwindow.cpp')
-rw-r--r-- | lib/tqwtplot3d/examples/mesh2/src/mesh2mainwindow.cpp | 956 |
1 files changed, 956 insertions, 0 deletions
diff --git a/lib/tqwtplot3d/examples/mesh2/src/mesh2mainwindow.cpp b/lib/tqwtplot3d/examples/mesh2/src/mesh2mainwindow.cpp new file mode 100644 index 0000000..6e23946 --- /dev/null +++ b/lib/tqwtplot3d/examples/mesh2/src/mesh2mainwindow.cpp @@ -0,0 +1,956 @@ +#include <qmetaobject.h>
+
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qaction.h>
+#include <qmenubar.h>
+
+#if QT_VERSION < 0x040000
+#include <qpopupmenu.h>
+#endif
+
+#include <qtoolbar.h>
+#include <qimage.h>
+#include <qpixmap.h>
+#include <qfiledialog.h>
+#include <qstatusbar.h>
+#include <qfileinfo.h>
+#include <qslider.h>
+#include <qtimer.h>
+#include <qcombobox.h>
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qcolordialog.h>
+#include <qfontdialog.h>
+
+#include "mesh2mainwindow.h"
+
+#include "functions.h"
+#include "colormapreader.h"
+#include "lightingdlg.h"
+#include "femreader.h"
+#include "../../../include/qwt3d_io.h"
+#include "../../../include/qwt3d_io_gl2ps.h"
+#include "../../../include/qwt3d_io_reader.h"
+
+using namespace Qwt3D;
+using namespace std;
+
+
+bool Mesh2MainWindow::connectA (const QObject* sender, const char * slot)
+{
+#if QT_VERSION < 0x040000
+ return connect( sender, SIGNAL( activated() ), this, slot );
+#else
+ return connect( sender, SIGNAL( triggered() ), this, slot );
+#endif
+}
+
+bool Mesh2MainWindow::connectAG (const QObject* sender, const char * slot)
+{
+#if QT_VERSION < 0x040000
+ return connect( sender, SIGNAL( selected( QAction* ) ), this, slot ) ;
+#else
+ return connect( sender, SIGNAL( triggered( QAction* ) ), this, slot ) ;
+#endif
+}
+
+Mesh2MainWindow::~Mesh2MainWindow()
+{
+ delete dataWidget;
+}
+
+Mesh2MainWindow::Mesh2MainWindow( QWidget* parent )
+ : DummyBase( parent )
+{
+#if QT_VERSION < 0x040000
+ setCaption("Mesh2");
+ QGridLayout *grid = new QGridLayout( frame, 0, 0 );
+#else
+ setupWorkaround(this);
+ setupUi(this);
+ QGridLayout *grid = new QGridLayout( frame );
+#endif
+
+ col_ = 0;
+ legend_ = false;
+ redrawWait = 50;
+ activeCoordSystem = None;
+
+ dataWidget = new SurfacePlot(frame);
+ grid->addWidget( dataWidget, 0, 0 );
+
+ connectAG( coord, SLOT( pickCoordSystem( QAction* ) ) );
+ connectAG( plotstyle, SLOT( pickPlotStyle( QAction* ) ) );
+ connectA( axescolor, SLOT( pickAxesColor() ) );
+ connectA( backgroundcolor, SLOT( pickBgColor() ) );
+ connectAG( floorstyle, SLOT( pickFloorStyle( QAction* ) ) );
+ connectA( meshcolor, SLOT( pickMeshColor() ) );
+ connectA( numbercolor, SLOT( pickNumberColor() ) );
+ connectA( labelcolor, SLOT( pickLabelColor() ) );
+ connectA( titlecolor, SLOT( pickTitleColor() ) );
+ connectA( datacolor, SLOT( pickDataColor() ) );
+ connect( lighting, SIGNAL( clicked() ), this, SLOT( pickLighting() ) );
+ connectA( resetcolor, SLOT( resetColors() ) );
+ connectA( numberfont, SLOT( pickNumberFont() ) );
+ connectA( labelfont, SLOT( pickLabelFont() ) );
+ connectA( titlefont, SLOT( pickTitleFont() ) );
+ connectA( resetfont, SLOT( resetFonts() ) );
+ connect( animation, SIGNAL( toggled(bool) ) , this, SLOT( toggleAnimation(bool) ) );
+ connectA( dump, SLOT( dumpImage() ) );
+ connectA( openFile, SLOT( open() ) );
+ //connect(openFile, SIGNAL(triggered()), this, SLOT(open()));
+ connectA( openMeshFile, SLOT( openMesh() ) );
+
+ // only EXCLUSIVE groups emit selected :-/
+ connect( left, SIGNAL( toggled( bool ) ), this, SLOT( setLeftGrid( bool ) ) );
+ connect( right, SIGNAL( toggled( bool ) ), this, SLOT( setRightGrid( bool ) ) );
+ connect( ceil, SIGNAL( toggled( bool ) ), this, SLOT( setCeilGrid( bool ) ) );
+ connect( floor, SIGNAL( toggled( bool ) ), this, SLOT( setFloorGrid( bool ) ) );
+ connect( back, SIGNAL( toggled( bool ) ), this, SLOT( setBackGrid( bool ) ) );
+ connect( front, SIGNAL( toggled( bool ) ), this, SLOT( setFrontGrid( bool ) ) );
+
+ timer = new QTimer( this );
+ connect( timer, SIGNAL(timeout()), this, SLOT(rotate()) );
+
+ resSlider->setRange(1,70);
+ connect( resSlider, SIGNAL(valueChanged(int)), dataWidget, SLOT(setResolution(int)) );
+ connect( dataWidget, SIGNAL(resolutionChanged(int)), resSlider, SLOT(setValue(int)) );
+ resSlider->setValue(1);
+
+ connect( offsSlider, SIGNAL(valueChanged(int)), this, SLOT(setPolygonOffset(int)) );
+
+ connect(normButton, SIGNAL(clicked()), this, SLOT(setStandardView()));
+
+ QString qwtstr(" qwtplot3d ");
+ qwtstr += QString::number(QWT3D_MAJOR_VERSION) + ".";
+ qwtstr += QString::number(QWT3D_MINOR_VERSION) + ".";
+ qwtstr += QString::number(QWT3D_PATCH_VERSION) + " ";
+
+ QLabel* info = new QLabel(qwtstr, statusBar());
+ statusBar()->addWidget(info, 0);
+ filenameWidget = new QLabel(" ", statusBar());
+ statusBar()->addWidget(filenameWidget,0);
+ dimWidget = new QLabel("", statusBar());
+ statusBar()->addWidget(dimWidget,0);
+ rotateLabel = new QLabel("", statusBar());
+ statusBar()->addWidget(rotateLabel,0);
+ shiftLabel = new QLabel("", statusBar());
+ statusBar()->addWidget(shiftLabel,0);
+ scaleLabel = new QLabel("", statusBar());
+ statusBar()->addWidget(scaleLabel,0);
+ zoomLabel = new QLabel("", statusBar());
+ statusBar()->addWidget(zoomLabel,0);
+
+ connect(dataWidget, SIGNAL(rotationChanged(double,double,double)),this,SLOT(showRotate(double,double,double)));
+ connect(dataWidget, SIGNAL(vieportShiftChanged(double,double)),this,SLOT(showShift(double,double)));
+ connect(dataWidget, SIGNAL(scaleChanged(double,double,double)),this,SLOT(showScale(double,double,double)));
+ connect(dataWidget, SIGNAL(zoomChanged(double)),this,SLOT(showZoom(double)));
+
+ connect(functionCB, SIGNAL(activated(const QString&)), this, SLOT(createFunction(const QString&)));
+ connect(psurfaceCB, SIGNAL(activated(const QString&)), this, SLOT(createPSurface(const QString&)));
+ connect(projection, SIGNAL( toggled(bool) ), this, SLOT( toggleProjectionMode(bool)));
+ connect(colorlegend, SIGNAL( toggled(bool) ), this, SLOT( toggleColorLegend(bool)));
+ connect(autoscale, SIGNAL( toggled(bool) ), this, SLOT( toggleAutoScale(bool)));
+ connect(shader, SIGNAL( toggled(bool) ), this, SLOT( toggleShader(bool)));
+ connect(mouseinput, SIGNAL( toggled(bool) ), dataWidget, SLOT( enableMouse(bool)));
+ connect(lightingswitch, SIGNAL( toggled(bool) ), this, SLOT( enableLighting(bool)));
+ connect(normals, SIGNAL( toggled(bool) ), this, SLOT( showNormals(bool)));
+ connect(normalsquality, SIGNAL(valueChanged(int)), this, SLOT(setNormalQuality(int)) );
+ connect(normalslength, SIGNAL(valueChanged(int)), this, SLOT(setNormalLength(int)) );
+
+ setStandardView();
+
+ dataWidget->coordinates()->setLineSmooth(true);
+ dataWidget->coordinates()->setGridLinesColor(RGBA(0.35,0.35,0.35,1));
+ dataWidget->enableMouse(true);
+ dataWidget->setKeySpeed(15,20,20);
+
+ lightingdlg_ = new LightingDlg( this );
+ lightingdlg_->assign( dataWidget);
+
+#if QT_VERSION < 0x040000 //todo - restore, when Qt4 re-implements preview functionality
+ datacolordlg_ = new QFileDialog( this );
+ QDir dir("./../../data/colormaps");
+ if (dir.exists("./../../data/colormaps"))
+ datacolordlg_->setDir("./../../data/colormaps");
+ datacolordlg_->setFilter("Colormap files (*.map *.MAP)");
+ colormappv_ = new ColorMapPreview;
+ datacolordlg_->setContentsPreviewEnabled( TRUE );
+ datacolordlg_->setContentsPreview( colormappv_, colormappv_ );
+ datacolordlg_->setPreviewMode( QFileDialog::Contents );
+ connect(datacolordlg_, SIGNAL(fileHighlighted(const QString&)), this, SLOT(adaptDataColors(const QString&)));
+#else
+ //connect(datacolordlg_, SIGNAL(filesSelected(const QStringList&)), this, SLOT(adaptDataColors4(const QStringList&)));
+#endif
+ connect(filetypeCB, SIGNAL(activated(const QString&)), this, SLOT(setFileType(const QString&)));
+
+ filetypeCB->clear();
+
+ QStringList list = IO::outputFormatList();
+#if QT_VERSION < 0x040000
+ filetypeCB->insertStringList(list);
+#else
+ filetypeCB->insertItems(0,list);
+#endif
+
+
+
+ filetype_ = filetypeCB->currentText();
+ dataWidget->setTitleFont( "Arial", 14, QFont::Normal );
+
+ grids->setEnabled(false);
+
+ PixmapWriter* pmhandler = (PixmapWriter*)IO::outputHandler("JPEG");
+ if (!pmhandler)
+ pmhandler = (PixmapWriter*)IO::outputHandler("jpeg"); //Qt4 naming scheme change
+ if (pmhandler)
+ pmhandler->setQuality(70);
+
+ VectorWriter* handler = (VectorWriter*)IO::outputHandler("PDF");
+ handler->setTextMode(VectorWriter::TEX);
+ handler = (VectorWriter*)IO::outputHandler("EPS");
+ handler->setTextMode(VectorWriter::TEX);
+ handler = (VectorWriter*)IO::outputHandler("EPS_GZ");
+ if (handler) // with zlib support only
+ handler->setTextMode(VectorWriter::TEX);
+}
+
+void Mesh2MainWindow::open()
+{
+#if QT_VERSION < 0x040000
+ QString s = QFileDialog::getOpenFileName( "../../data", "GridData Files (*.mes *.MES)", this );
+#else
+ QString s = QFileDialog::getOpenFileName( this, "", "../../data", "GridData Files (*.mes *.MES)");
+#endif
+
+ if ( s.isEmpty() || !dataWidget)
+ return;
+
+ QFileInfo fi( s );
+
+#if QT_VERSION < 0x040000
+ QString ext = fi.extension(); // ext = "gz"
+ QToolTip::add(filenameWidget, s);
+#else
+ filenameWidget->setToolTip(s);
+ QString ext = fi.suffix();
+#endif
+ filenameWidget->setText(fi.fileName());
+ qApp->processEvents(); // enforces repaint;
+
+ if (IO::load(dataWidget, s, ext))
+ {
+ double a = dataWidget->facets().first;
+ double b = dataWidget->facets().second;
+
+ dimWidget->setText(QString("Cells ") + QString::number(a*b)
+ + " (" + QString::number(a) + "x" + QString::number(b) +")" );
+
+ dataWidget->setResolution(3);
+ }
+
+ for (unsigned i=0; i!=dataWidget->coordinates()->axes.size(); ++i)
+ {
+ dataWidget->coordinates()->axes[i].setMajors(4);
+ dataWidget->coordinates()->axes[i].setMinors(5);
+ dataWidget->coordinates()->axes[i].setLabelString("");
+ }
+
+ updateColorLegend(4,5);
+ pickCoordSystem(activeCoordSystem);
+ dataWidget->showColorLegend(legend_);
+}
+
+void Mesh2MainWindow::createFunction(QString const& name)
+{
+ dataWidget->makeCurrent();
+
+ dataWidget->legend()->setScale(LINEARSCALE);
+ for (unsigned i=0; i!=dataWidget->coordinates()->axes.size(); ++i)
+ {
+ dataWidget->coordinates()->axes[i].setMajors(7);
+ dataWidget->coordinates()->axes[i].setMinors(5);
+ }
+
+ if (name == QString("Rosenbrock"))
+ {
+ Rosenbrock rosenbrock(*dataWidget);
+
+ rosenbrock.setMesh(50,51);
+ rosenbrock.setDomain(-1.73,1.55,-1.5,1.95);
+ rosenbrock.setMinZ(-100);
+
+ rosenbrock.create();
+
+ dataWidget->coordinates()->axes[Z1].setScale(LOG10SCALE);
+ dataWidget->coordinates()->axes[Z2].setScale(LOG10SCALE);
+ dataWidget->coordinates()->axes[Z3].setScale(LOG10SCALE);
+ dataWidget->coordinates()->axes[Z4].setScale(LOG10SCALE);
+ dataWidget->legend()->setScale(LOG10SCALE);
+ }
+ else if (name == QString("Hat"))
+ {
+ Hat hat(*dataWidget);
+
+ hat.setMesh(51,72);
+ hat.setDomain(-1.5,1.5,-1.5,1.5);
+ hat.create();
+ }
+ else if (name == QString("Ripple"))
+ {
+ Ripple ripple(*dataWidget);
+ ripple.setMesh(120,120);
+ ripple.create();
+ }
+ else if (name == QString("Saddle"))
+ {
+ Saddle saddle;
+
+ saddle.setMesh(71,71);
+ double dom = 2.5;
+ saddle.setDomain(-dom, dom, -dom, dom);
+ saddle.assign(*dataWidget);
+ saddle.create();
+ }
+ else if (name == QString("Sombrero"))
+ {
+ Mex mex;
+
+ mex.setMesh(91,91);
+ double dom = 15;
+ mex.setDomain(-dom, dom, -dom, dom);
+ mex.create(*dataWidget);
+ }
+
+ double a = dataWidget->facets().first;
+ double b = dataWidget->facets().second;
+
+ dimWidget->setText(QString("Cells ") + QString::number(a*b)
+ + " (" + QString::number(a) + "x" + QString::number(b) +")" );
+
+ updateColorLegend(7,5);
+
+ dataWidget->coordinates()->axes[X1].setLabelString(QString("X1"));
+ dataWidget->coordinates()->axes[X2].setLabelString(QString("X2"));
+ dataWidget->coordinates()->axes[X3].setLabelString(QString("X3"));
+ dataWidget->coordinates()->axes[X4].setLabelString(QString("X4"));
+
+ dataWidget->coordinates()->axes[Y1].setLabelString(QString("Y1"));
+ dataWidget->coordinates()->axes[Y2].setLabelString(QString("Y2"));
+ dataWidget->coordinates()->axes[Y3].setLabelString(QString("Y3"));
+ dataWidget->coordinates()->axes[Y4].setLabelString(QString("Y4"));
+
+ dataWidget->coordinates()->axes[Z1].setLabelString(QString("Z1"));
+ dataWidget->coordinates()->axes[Z2].setLabelString(QString("Z2"));
+ dataWidget->coordinates()->axes[Z3].setLabelString(QString("Z3"));
+ dataWidget->coordinates()->axes[Z4].setLabelString(QString("Z4"));
+
+ pickCoordSystem(activeCoordSystem);
+}
+
+void Mesh2MainWindow::createPSurface(QString const& name)
+{
+ dataWidget->makeCurrent();
+ if (name == QString("Torus"))
+ {
+ Torus sf(*dataWidget);
+ sf.create();
+ }
+ else if (name == QString("Seashell"))
+ {
+ Seashell ss(*dataWidget);
+ ss.create();
+ }
+ else if (name == QString("Boy"))
+ {
+ Boy boy(*dataWidget);
+ boy.create();
+ }
+ else if (name == QString("Dini"))
+ {
+ Dini dini(*dataWidget);
+ dini.create();
+ }
+ else if (name == QString("Cone"))
+ {
+ TripleField conepos;
+ CellField conecell;
+ createCone(conepos,conecell);
+ dataWidget->loadFromData(conepos, conecell);
+ }
+ for (unsigned i=0; i!=dataWidget->coordinates()->axes.size(); ++i)
+ {
+ dataWidget->coordinates()->axes[i].setMajors(7);
+ dataWidget->coordinates()->axes[i].setMinors(5);
+ }
+
+ double a = dataWidget->facets().first;
+ double b = dataWidget->facets().second;
+
+ dimWidget->setText(QString("Cells ") + QString::number(a*b)
+ + " (" + QString::number(a) + "x" + QString::number(b) +")" );
+
+ updateColorLegend(7,5);
+
+ dataWidget->coordinates()->axes[X1].setLabelString(QString("X1"));
+ dataWidget->coordinates()->axes[X2].setLabelString(QString("X2"));
+ dataWidget->coordinates()->axes[X3].setLabelString(QString("X3"));
+ dataWidget->coordinates()->axes[X4].setLabelString(QString("X4"));
+
+ dataWidget->coordinates()->axes[Y1].setLabelString(QString("Y1"));
+ dataWidget->coordinates()->axes[Y2].setLabelString(QString("Y2"));
+ dataWidget->coordinates()->axes[Y3].setLabelString(QString("Y3"));
+ dataWidget->coordinates()->axes[Y4].setLabelString(QString("Y4"));
+
+ dataWidget->coordinates()->axes[Z1].setLabelString(QString("Z1"));
+ dataWidget->coordinates()->axes[Z2].setLabelString(QString("Z2"));
+ dataWidget->coordinates()->axes[Z3].setLabelString(QString("Z3"));
+ dataWidget->coordinates()->axes[Z4].setLabelString(QString("Z4"));
+
+ pickCoordSystem(activeCoordSystem);
+}
+
+
+void Mesh2MainWindow::pickCoordSystem( QAction* action)
+{
+ if (!action || !dataWidget)
+ return;
+
+ activeCoordSystem = action;
+
+ dataWidget->setTitle("QwtPlot3D (Use Ctrl-Alt-Shift-LeftBtn-Wheel or keyboard)");
+
+ if (!dataWidget->hasData())
+ {
+ double l = 0.6;
+ dataWidget->createCoordinateSystem(Triple(-l,-l,-l), Triple(l,l,l));
+ for (unsigned i=0; i!=dataWidget->coordinates()->axes.size(); ++i)
+ {
+ dataWidget->coordinates()->axes[i].setMajors(4);
+ dataWidget->coordinates()->axes[i].setMinors(5);
+ }
+ }
+
+ if (action == Box || action == Frame)
+ {
+ if (action == Box)
+ dataWidget->setCoordinateStyle(BOX);
+ if (action == Frame)
+ dataWidget->setCoordinateStyle(FRAME);
+ grids->setEnabled(true);
+ }
+ else if (action == None)
+ {
+ dataWidget->setTitle("QwtPlot3D (Use Ctrl-Alt-Shift-LeftBtn-Wheel or keyboard)");
+ dataWidget->setCoordinateStyle(NOCOORD);
+ grids->setEnabled(false);
+ }
+}
+
+void Mesh2MainWindow::pickPlotStyle( QAction* action )
+{
+ if (!action || !dataWidget)
+ return;
+
+ if (action == polygon)
+ {
+ dataWidget->setPlotStyle(FILLED);
+ }
+ else if (action == filledmesh)
+ {
+ dataWidget->setPlotStyle(FILLEDMESH);
+ }
+ else if (action == wireframe)
+ {
+ dataWidget->setPlotStyle(WIREFRAME);
+ }
+ else if (action == hiddenline)
+ {
+ dataWidget->setPlotStyle(HIDDENLINE);
+ }
+ else if (action == pointstyle)
+ {
+
+ dataWidget->setPlotStyle(Qwt3D::POINTS);
+// Cone d(len,32);
+// CrossHair d(0.003,0,true,false);
+// dataWidget->setPlotStyle(d);
+ }
+ else
+ {
+ dataWidget->setPlotStyle(NOPLOT);
+ }
+ dataWidget->updateData();
+ dataWidget->updateGL();
+}
+
+void
+Mesh2MainWindow::pickFloorStyle( QAction* action )
+{
+ if (!action || !dataWidget)
+ return;
+
+ if (action == floordata)
+ {
+ dataWidget->setFloorStyle(FLOORDATA);
+ }
+ else if (action == flooriso)
+ {
+ dataWidget->setFloorStyle(FLOORISO);
+ }
+ else
+ {
+ dataWidget->setFloorStyle(NOFLOOR);
+ }
+
+ dataWidget->updateData();
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::setLeftGrid(bool b)
+{
+ setGrid(Qwt3D::LEFT,b);
+}
+void Mesh2MainWindow::setRightGrid(bool b)
+{
+ setGrid(Qwt3D::RIGHT,b);
+}
+void Mesh2MainWindow::setCeilGrid(bool b)
+{
+ setGrid(Qwt3D::CEIL,b);
+}
+void Mesh2MainWindow::setFloorGrid(bool b)
+{
+ setGrid(Qwt3D::FLOOR,b);
+}
+void Mesh2MainWindow::setFrontGrid(bool b)
+{
+ setGrid(Qwt3D::FRONT,b);
+}
+void Mesh2MainWindow::setBackGrid(bool b)
+{
+ setGrid(Qwt3D::BACK,b);
+}
+
+void Mesh2MainWindow::setGrid(Qwt3D::SIDE s, bool b)
+{
+ if (!dataWidget)
+ return;
+
+ int sum = dataWidget->coordinates()->grids();
+
+ if (b)
+ sum |= s;
+ else
+ sum &= ~s;
+
+ dataWidget->coordinates()->setGridLines(sum!=Qwt3D::NOSIDEGRID, sum!=Qwt3D::NOSIDEGRID, sum);
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::resetColors()
+{
+ if (!dataWidget)
+ return;
+
+ const RGBA axc = RGBA(0,0,0,1);
+ const RGBA bgc = RGBA(1.0,1.0,1.0,1.0);
+ const RGBA msc = RGBA(0,0,0,1);
+ const RGBA nuc = RGBA(0,0,0,1);
+ const RGBA lbc = RGBA(0,0,0,1);
+ const RGBA tc = RGBA(0,0,0,1);
+
+ dataWidget->coordinates()->setAxesColor(axc);
+ dataWidget->setBackgroundColor(bgc);
+ dataWidget->setMeshColor(msc);
+ dataWidget->updateData();
+ dataWidget->coordinates()->setNumberColor(nuc);
+ dataWidget->coordinates()->setLabelColor(lbc);
+ dataWidget->setTitleColor(tc);
+
+ col_ = new StandardColor(dataWidget);
+ dataWidget->setDataColor(col_);
+ dataWidget->updateData();
+ dataWidget->updateNormals();
+ dataWidget->updateGL();
+}
+
+
+void Mesh2MainWindow::pickAxesColor()
+{
+ QColor c = QColorDialog::getColor( Qt::white, this );
+ if ( !c.isValid() )
+ return;
+ RGBA rgb = Qt2GL(c);
+ dataWidget->coordinates()->setAxesColor(rgb);
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::pickBgColor()
+{
+
+ QColor c = QColorDialog::getColor( Qt::white, this );
+ if ( !c.isValid() )
+ return;
+ RGBA rgb = Qt2GL(c);
+ dataWidget->setBackgroundColor(rgb);
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::pickMeshColor()
+{
+
+ QColor c = QColorDialog::getColor( Qt::white, this );
+ if ( !c.isValid() )
+ return;
+ RGBA rgb = Qt2GL(c);
+ dataWidget->setMeshColor(rgb);
+ dataWidget->updateData();
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::pickNumberColor()
+{
+
+ QColor c = QColorDialog::getColor( Qt::white, this );
+ if ( !c.isValid() )
+ return;
+ RGBA rgb = Qt2GL(c);
+ dataWidget->coordinates()->setNumberColor(rgb);
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::pickLabelColor()
+{
+ QColor c = QColorDialog::getColor( Qt::white, this );
+ if ( !c.isValid() )
+ return;
+ RGBA rgb = Qt2GL(c);
+ dataWidget->coordinates()->setLabelColor(rgb);
+ dataWidget->updateGL();
+}
+void Mesh2MainWindow::pickTitleColor()
+{
+ QColor c = QColorDialog::getColor( Qt::white, this );
+ if ( !c.isValid() )
+ return;
+ RGBA rgb = Qt2GL(c);
+ dataWidget->setTitleColor(rgb);
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::pickLighting()
+{
+ lightingdlg_->show();
+}
+
+void Mesh2MainWindow::pickDataColor()
+{
+#if QT_VERSION < 0x040000
+ datacolordlg_->show();
+#else
+ QString s = QFileDialog::getOpenFileName( this, "", "./../../data/colormaps", "Colormap files (*.map *.MAP)");
+ adaptDataColors(s);
+#endif
+}
+
+void Mesh2MainWindow::adaptDataColors(const QString& fileName)
+{
+ ColorVector cv;
+
+ if (!openColorMap(cv, fileName))
+ return;
+
+ col_ = new StandardColor(dataWidget);
+ col_->setColorVector(cv);
+
+ dataWidget->setDataColor(col_);
+ dataWidget->updateData();
+ dataWidget->updateNormals();
+ dataWidget->showColorLegend(legend_);
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::pickNumberFont()
+{
+ bool ok;
+ QFont font = QFontDialog::getFont(&ok, this );
+ if ( !ok )
+ {
+ return;
+ }
+ dataWidget->coordinates()->setNumberFont(font);
+ dataWidget->updateGL();
+}
+void Mesh2MainWindow::pickLabelFont()
+{
+ bool ok;
+ QFont font = QFontDialog::getFont(&ok, this );
+ if ( !ok )
+ {
+ return;
+ }
+ dataWidget->coordinates()->setLabelFont(font);
+ dataWidget->updateGL();
+}
+void Mesh2MainWindow::pickTitleFont()
+{
+ bool ok;
+ QFont font = QFontDialog::getFont(&ok, this );
+ if ( !ok )
+ {
+ return;
+ }
+ dataWidget->setTitleFont(font.family(), font.pointSize(), font.weight(), font.italic());
+}
+
+void Mesh2MainWindow::resetFonts()
+{
+ dataWidget->coordinates()->setNumberFont(QFont("Courier", 12));
+ dataWidget->coordinates()->setLabelFont(QFont("Courier", 14, QFont::Bold));
+ dataWidget->setTitleFont( "Arial", 14, QFont::Normal );
+ dataWidget->updateGL();
+}
+
+void Mesh2MainWindow::setStandardView()
+{
+ dataWidget->setRotation(30,0,15);
+ dataWidget->setViewportShift(0.05,0);
+ dataWidget->setScale(1,1,1);
+ dataWidget->setZoom(0.95);
+}
+
+void Mesh2MainWindow::dumpImage()
+{
+ static int counter = 0;
+ if (!dataWidget)
+ return;
+ QString name;
+
+ name = QString("dump_") + QString::number(counter++) + ".";
+
+ if (filetype_ == "PS_GZ")
+ name += "ps.gz";
+ else if (filetype_ == "EPS_GZ")
+ name += "eps.gz";
+ else
+ name += filetype_;
+
+#if QT_VERSION < 0x040000
+ IO::save(dataWidget, name.lower(), filetype_);
+#else
+ VectorWriter* vw = (VectorWriter*)IO::outputHandler("PDF");
+ if (vw)
+ vw->setSortMode(VectorWriter::BSPSORT);
+ IO::save(dataWidget, name.toLower(), filetype_);
+#endif
+}
+
+/*!
+ Turns animation on or off
+*/
+void Mesh2MainWindow::toggleAnimation(bool val)
+{
+ if ( val )
+ {
+ timer->start( redrawWait ); // Wait this many msecs before redraw
+ }
+ else
+ {
+ timer->stop();
+ }
+}
+
+void Mesh2MainWindow::rotate()
+{
+ if (!dataWidget)
+ return;
+
+ dataWidget->setRotation(
+ int(dataWidget->xRotation() + 1) % 360,
+ int(dataWidget->yRotation() + 1) % 360,
+ int(dataWidget->zRotation() + 1) % 360
+ );
+}
+
+void
+Mesh2MainWindow::toggleProjectionMode(bool val)
+{
+ dataWidget->setOrtho(val);
+}
+
+void
+Mesh2MainWindow::toggleColorLegend(bool val)
+{
+ legend_ = val;
+ dataWidget->showColorLegend(val);
+}
+
+void
+Mesh2MainWindow::toggleAutoScale(bool val)
+{
+ dataWidget->coordinates()->setAutoScale(val);
+ dataWidget->updateGL();
+}
+
+void
+Mesh2MainWindow::toggleShader(bool val)
+{
+ if (val)
+ dataWidget->setShading(GOURAUD);
+ else
+ dataWidget->setShading(FLAT);
+}
+
+void
+Mesh2MainWindow::setPolygonOffset(int val)
+{
+ dataWidget->setPolygonOffset(val / 10.0);
+ dataWidget->updateData();
+ dataWidget->updateGL();
+}
+
+void
+Mesh2MainWindow::showRotate(double x, double y, double z)
+{
+ rotateLabel->setText(" Angles (" + QString::number(x,'g',3) + " ,"
+ + QString::number(y,'g',3) + " ,"
+ + QString::number(z,'g',3) + ")");
+}
+void
+Mesh2MainWindow::showShift(double x, double y)
+{
+ shiftLabel->setText(" Shifts (" + QString::number(x,'g',3) + " ,"
+ + QString::number(y,'g',3) + " )"
+ );
+}
+void
+Mesh2MainWindow::showScale(double x, double y, double z)
+{
+ scaleLabel->setText(" Scales (" + QString::number(x,'g',3) + " ,"
+ + QString::number(y,'g',3) + " ,"
+ + QString::number(z,'g',3) + ")");
+}
+void
+Mesh2MainWindow::showZoom(double z)
+{
+ zoomLabel->setText(" Zoom " + QString::number(z,'g',3));
+}
+
+void Mesh2MainWindow::openMesh()
+{
+#if QT_VERSION < 0x040000
+ QString data(QFileDialog::getOpenFileName( "../../data", "nodes (*.nod)", this ) );
+ QString edges( QFileDialog::getOpenFileName( "../../data", "connectivities (*.cel)", this ) );
+#else
+ QString data( QFileDialog::getOpenFileName( this, "", "../../data", "nodes (*.nod)") );
+ QString edges( QFileDialog::getOpenFileName( this, "", "../../data", "connectivities (*.cel)") );
+#endif
+
+ if ( data.isEmpty() || edges.isEmpty() || !dataWidget)
+ return;
+
+
+ TripleField vdata;
+ CellField vpoly;
+
+ readNodes(vdata, QWT3DLOCAL8BIT(data), NodeFilter());
+ readConnections(vpoly, QWT3DLOCAL8BIT(edges), CellFilter());
+
+ dataWidget->loadFromData(vdata, vpoly);
+ dimWidget->setText(QString("Cells ") + QString::number(dataWidget->facets().first));
+
+ for (unsigned i=0; i!=dataWidget->coordinates()->axes.size(); ++i)
+ {
+ dataWidget->coordinates()->axes[i].setMajors(4);
+ dataWidget->coordinates()->axes[i].setMinors(5);
+ dataWidget->coordinates()->axes[i].setLabelString(QString(""));
+ }
+
+ updateColorLegend(4,5);
+ pickCoordSystem(activeCoordSystem);
+}
+
+void
+Mesh2MainWindow::showNormals(bool val)
+{
+ dataWidget->showNormals(val);
+ dataWidget->updateNormals();
+ dataWidget->updateGL();
+}
+
+void
+Mesh2MainWindow::setNormalLength(int val)
+{
+ dataWidget->setNormalLength(val / 400.);
+ dataWidget->updateNormals();
+ dataWidget->updateGL();
+}
+
+void
+Mesh2MainWindow::setNormalQuality(int val)
+{
+ dataWidget->setNormalQuality(val);
+ dataWidget->updateNormals();
+ dataWidget->updateGL();
+}
+
+bool
+Mesh2MainWindow::openColorMap(ColorVector& cv, QString fname)
+{
+ if (fname.isEmpty())
+ return false;
+
+ ifstream file(QWT3DLOCAL8BIT(fname));
+
+ if (!file)
+ return false;
+
+ RGBA rgb;
+ cv.clear();
+
+ while ( file )
+ {
+ file >> rgb.r >> rgb.g >> rgb.b;
+ file.ignore(1000,'\n');
+ if (!file.good())
+ break;
+ else
+ {
+ rgb.a = 1;
+ rgb.r /= 255;
+ rgb.g /= 255;
+ rgb.b /= 255;
+ cv.push_back(rgb);
+ }
+ }
+
+ return true;
+}
+
+void
+Mesh2MainWindow::updateColorLegend(int majors, int minors)
+{
+ dataWidget->legend()->setMajors(majors);
+ dataWidget->legend()->setMinors(minors);
+ double start, stop;
+ dataWidget->coordinates()->axes[Z1].limits(start,stop);
+ dataWidget->legend()->setLimits(start, stop);
+}
+
+void Mesh2MainWindow::setFileType(QString const& name)
+{
+ filetype_ = name;
+}
+
+void Mesh2MainWindow::enableLighting(bool val)
+{
+ dataWidget->enableLighting(val);
+ dataWidget->illuminate(0);
+ dataWidget->updateGL();
+}
|