Path: blob/devel/ElmerGUI/Application/vtkpost/timestep.cpp
3203 views
/*****************************************************************************1* *2* Elmer, A Finite Element Software for Multiphysical Problems *3* *4* Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland *5* *6* This program is free software; you can redistribute it and/or *7* modify it under the terms of the GNU General Public License *8* as published by the Free Software Foundation; either version 2 *9* of the License, or (at your option) any later version. *10* *11* This program is distributed in the hope that it will be useful, *12* but WITHOUT ANY WARRANTY; without even the implied warranty of *13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *14* GNU General Public License for more details. *15* *16* You should have received a copy of the GNU General Public License *17* along with this program (in file fem/GPL-2); if not, write to the *18* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *19* Boston, MA 02110-1301, USA. *20* *21*****************************************************************************/2223/*****************************************************************************24* *25* ElmerGUI timestep *26* *27*****************************************************************************28* *29* Authors: Mikko Lyly, Juha Ruokolainen and Peter R�back *30* Email: [email protected] *31* Web: http://www.csc.fi/elmer *32* Address: CSC - IT Center for Science Ltd. *33* Keilaranta 14 *34* 02101 Espoo, Finland *35* *36* Original Date: 15 Mar 2008 *37* *38*****************************************************************************/39#if WITH_QT5 || WITH_QT640#include <QtWidgets>41#endif42#include <QtGui>43#include <iostream>44#include <vtkRenderWindow.h>45#include <vtkWindowToImageFilter.h>46#include <vtkPNGWriter.h>47#include "timestep.h"4849using namespace std;5051TimeStep::TimeStep(QWidget *parent)52: QDialog(parent)53{54ui.setupUi(this);5556connect(ui.loopButton, SIGNAL(clicked()), this, SLOT(loopButtonClicked()));57connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancelButtonClicked()));58connect(ui.applyButton, SIGNAL(clicked()), this, SLOT(applyButtonClicked()));59connect(ui.okButton, SIGNAL(clicked()), this, SLOT(okButtonClicked()));60connect(ui.browseButton, SIGNAL(clicked()), this, SLOT(browseButtonClicked()));6162maxSteps = 0;63loopOn = false;64saveDir = "";6566setWindowTitle("Time step control");67setWindowIcon(QIcon(":/icons/Mesh3D.png"));6869ui.applyButton->setIcon(QIcon::fromTheme("dialog-accept"));70ui.loopButton->setIcon(QIcon::fromTheme("view-refresh"));71}7273TimeStep::~TimeStep()74{75}7677void TimeStep::browseButtonClicked()78{79QString saveDir = QFileDialog::getExistingDirectory(this,80tr("Save directory"), "", QFileDialog::ShowDirsOnly81| QFileDialog::DontResolveSymlinks);8283ui.saveDirectory->setText(saveDir);84}8586void TimeStep::cancelButtonClicked()87{88close();89}9091void TimeStep::okButtonClicked()92{93applyButtonClicked();94cancelButtonClicked();95}9697void TimeStep::applyButtonClicked()98{99int current = ui.timeStep->value();100101if(current < 1) {102current = 1;103ui.timeStep->setValue(current);104}105106if(current > maxSteps) {107current = maxSteps;108ui.timeStep->setValue(current);109}110111emit(timeStepChangedSignal());112}113114void TimeStep::canProceedWithNextSlot(vtkRenderWindow *renderWindow)115{116if(!loopOn) return;117118bool saveFrames = ui.saveFrames->isChecked();119int current = ui.timeStep->value();120int stop = ui.stop->value();121int increment = ui.increment->value();122123if(saveFrames) {124QString saveDir = ui.saveDirectory->text().trimmed();125if(saveDir.isEmpty()) saveDir = ".";126QString frameName = "frame" + QString::number(current) + ".png";127QString fileName = saveDir + "/" + frameName;128129vtkWindowToImageFilter *image = vtkWindowToImageFilter::New();130image->SetInput(renderWindow);131image->Update();132133vtkPNGWriter *writer = vtkPNGWriter::New();134writer->SetInputConnection(image->GetOutputPort());135136#if WITH_QT5 || WITH_QT6137writer->SetFileName(fileName.toLatin1().data());138#else139writer->SetFileName(fileName.toAscii().data());140#endif141142renderWindow->Render();143writer->Write();144145image->Delete();146writer->Delete();147}148149if(increment < 1) {150increment = 1;151ui.increment->setValue(increment);152}153154if(stop > maxSteps) {155stop = maxSteps;156ui.stop->setValue(stop);157}158159if(current > stop) {160loopOn = false;161ui.loopButton->setText("Loop");162ui.loopButton->setIcon(QIcon::fromTheme("dialog-accept"));163this->repaint();164165} else {166ui.loopButton->setText("Stop");167ui.loopButton->setIcon(QIcon::fromTheme("dialog-error-round"));168this->repaint();169current += increment;170171if(current > stop) {172loopOn = false;173ui.loopButton->setText("Loop");174ui.loopButton->setIcon(QIcon::fromTheme("dialog-accept"));175this->repaint();176return;177}178179ui.timeStep->setValue(current);180this->repaint();181applyButtonClicked();182}183}184185void TimeStep::loopButtonClicked()186{187if(loopOn) {188loopOn = false;189ui.loopButton->setText("Loop");190ui.loopButton->setIcon(QIcon::fromTheme("dialog-accept"));191this->repaint();192193} else {194loopOn = true;195ui.loopButton->setText("Stop");196ui.loopButton->setIcon(QIcon::fromTheme("dialog-error-round"));197this->repaint();198int start = ui.start->value();199int stop = ui.stop->value();200int increment = ui.increment->value();201202if(start < 1) {203start = 1;204ui.start->setValue(start);205}206207if(start > maxSteps) {208start = maxSteps;209ui.start->setValue(start);210}211212if(stop < 1) {213stop = 1;214ui.stop->setValue(stop);215}216217if(stop > maxSteps) {218stop = maxSteps;219ui.stop->setValue(stop);220}221222if(stop < start) {223stop = start;224ui.stop->setValue(stop);225}226227if(increment < 1) {228increment = 1;229ui.increment->setValue(increment);230}231232ui.timeStep->setValue(start);233this->repaint();234applyButtonClicked();235}236}237238void TimeStep::SetCurrent(int n)239{240ui.timeStep->setValue(n);241}242243void TimeStep::SetStart(int n)244{245ui.start->setValue(n);246}247248void TimeStep::SetStop(int n)249{250ui.stop->setValue(n);251}252253void TimeStep::SetIncrement(int n)254{255ui.increment->setValue(n);256}257258void TimeStep::SetMatcCmd(QString cmd)259{260ui.doBefore->setText(cmd);261}262263void TimeStep::RegenerateBeforeDrawing(bool b)264{265ui.regenerateBeforeDrawing->setChecked(b);266}267268void TimeStep::SaveFrames(bool b)269{270ui.saveFrames->setChecked(b);271}272273void TimeStep::SetSaveDirectory(QString dirName)274{275ui.saveDirectory->setText(dirName);276}277278void TimeStep::Loop()279{280loopButtonClicked();281}282283bool TimeStep::IsLooping()284{285return this->loopOn;286}287288void TimeStep::DrawCurrent()289{290if(loopOn) return;291this->applyButtonClicked();292}293294295