You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

313 lines
12 KiB
C++

#include "ToolBarAnimation.h"
#include "GUISpinBox.h"
#include "OperatorsInterface/GraphEventOperator.h"
#include "PostGraphAdaptor/PostGraphObjectManager.h"
#include "PostGraphAdaptor/PostGraphObjectBase.h"
#include "PostGraphAdaptor/PostGraphProperty.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKAbstractCFDPostData.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPost3DManager.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostData.h"
#include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostUnSteady.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Kernel/FITKCore/FITKOperatorRepo.h"
#include "FITK_Kernel/FITKCore/FITKThreadPool.h"
#include <QAction>
#include <QLabel>
#include <QSpinBox>
#include <QThread>
namespace GUI
{
ToolBarAnimation::ToolBarAnimation(QWidget * parent) :
ToolBarBase(parent)
{
_actionFirst = createAction("actionFirst", "://icons/first.png", QString(tr("first")));
connect(_actionFirst, SIGNAL(triggered()), this, SLOT(slotFirstFrame()));
addAction(_actionFirst);
_actionPrevious = createAction("actionPrevious", "://icons/previous.png", QString(tr("previous")));
connect(_actionPrevious, SIGNAL(triggered()), this, SLOT(slotPreviousFrame()));
addAction(_actionPrevious);
_actionRun = createAction("actionRun", "://icons/run.png", QString(tr("run")));
connect(_actionRun, SIGNAL(triggered()), this, SLOT(slotRunAnimation()));
addAction(_actionRun);
_actionNext = createAction("actionNext", "://icons/next.png", QString(tr("next")));
connect(_actionNext, SIGNAL(triggered()), this, SLOT(slotNextFrame()));
addAction(_actionNext);
_actionLast = createAction("actionLast", "://icons/end.png", QString(tr("last")));
connect(_actionLast, SIGNAL(triggered()), this, SLOT(slotLastFrame()));
addAction(_actionLast);
addSeparator();
auto lab = new QLabel(this);
lab->setText("Step:");
addWidget(lab);
_stepSpinBox = new GUISpinBox(this);
_stepSpinBox->setMaximum(1);
_stepSpinBox->setSingleStep(1);
connect(_stepSpinBox, SIGNAL(editingFinished()), this, SLOT(slotStepChange()));
addWidget(_stepSpinBox);
_stepLabel = new QLabel(this);
_stepLabel->setText(QString(tr("Total: 0")));
addWidget(_stepLabel);
addSeparator();
setEnabled(false);
}
ToolBarAnimation::~ToolBarAnimation()
{
}
void ToolBarAnimation::updateCurrentGraphObj(int objID)
{
_currentDataID = findRootParentID(objID);
setEnabled(false);
_stepSpinBox->setValue(0);
_stepLabel->setText(QString(tr("Total: 0")));
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
if (currentData == nullptr)return;
Interface::PostGraphObjectBase* currentGraphObj = _postGraphManager->getGraphObjectBase(currentData);
if (currentGraphObj == nullptr)return;
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
_stepSpinBox->setMaximum(unSteadyData->getFiles().size() - 1);
_stepSpinBox->setValue(unSteadyData->getCurrentIndex());
_stepLabel->setText(QString(tr("Total: %1")).arg(unSteadyData->getFiles().size() - 1));
updateWidget();
setEnabled(true);
}
void ToolBarAnimation::updateWidget()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
int currentIndex = unSteadyData->getCurrentIndex();
if (files.isEmpty())return;
_actionFirst->setEnabled(true);
_actionPrevious->setEnabled(true);
_actionRun->setEnabled(true);
_actionNext->setEnabled(true);
_actionLast->setEnabled(true);
if (currentIndex == 0) {
_actionFirst->setEnabled(false);
_actionPrevious->setEnabled(false);
}
else if(currentIndex > 0 && currentIndex < (files.size() - 1)) {
}
else if (currentIndex == (files.size() - 1)) {
_actionRun->setEnabled(false);
_actionNext->setEnabled(false);
_actionLast->setEnabled(false);
}
}
void ToolBarAnimation::slotFirstFrame()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
if (files.size() == 0)return;
_stepSpinBox->setValue(0);
unSteadyData->setFile(files[0]);
unSteadyData->update();
updateWidget();
reRender();
}
void ToolBarAnimation::slotPreviousFrame()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
if (files.size() == 0)return;
int currentIndex = unSteadyData->getCurrentIndex();
if ((currentIndex - 1) >= files.size())return;
_stepSpinBox->setValue(currentIndex - 1);
unSteadyData->setFile(files[currentIndex - 1]);
unSteadyData->update();
updateWidget();
reRender();
}
void ToolBarAnimation::slotRunAnimation()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
if (files.size() == 0)return;
int currentIndex = unSteadyData->getCurrentIndex();
if ((currentIndex + 1) >= files.size())return;
if (_isStop) {
_actionRun->setIcon(QIcon("://icons/stop.png"));
_isStop = false;
_aniThread = new AnimationThread(files, _currentDataID);
_aniThread->setCurrentIndex(currentIndex);
_aniThread->setIsStop(_isStop);
//单个文件读取后连接(阻塞式连接)
connect(_aniThread, SIGNAL(sigReadSuccess(int)), this, SLOT(slotAniReadSuccess(int)), Qt::BlockingQueuedConnection);
connect(_aniThread, SIGNAL(sigImportFinish()), this, SLOT(slotAniReadFinish()));
Core::FITKThreadPool* pool = Core::FITKThreadPool::getInstance();
pool->execTask(_aniThread);
}
else {
_actionRun->setIcon(QIcon("://icons/run.png"));
_isStop = true;
if (_aniThread) {
_aniThread->setIsStop(_isStop);
}
}
}
void ToolBarAnimation::slotNextFrame()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
if (files.size() == 0)return;
int currentIndex = unSteadyData->getCurrentIndex();
if ((currentIndex + 1) >= files.size())return;
_stepSpinBox->setValue(currentIndex + 1);
unSteadyData->setFile(files[currentIndex + 1]);
unSteadyData->update();
updateWidget();
reRender();
}
void ToolBarAnimation::slotLastFrame()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
if (files.size() == 0)return;
_stepSpinBox->setValue(files.size() - 1);
unSteadyData->setFile(files[files.size() - 1]);
unSteadyData->update();
updateWidget();
reRender();
}
void ToolBarAnimation::slotStepChange()
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QStringList files = unSteadyData->getFiles();
if (files.size() == 0)return;
int currentIndex = unSteadyData->getCurrentIndex();
int index = _stepSpinBox->value();
if (index == currentIndex)return;
unSteadyData->setFile(files[index]);
unSteadyData->update();
updateWidget();
reRender();
}
void ToolBarAnimation::slotAniReadSuccess(int index)
{
Q_UNUSED(index);
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(_currentDataID);
Interface::FITKCFDPostUnSteady* unSteadyData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(currentData);
if (unSteadyData == nullptr)return;
QSignalBlocker blocker1(_stepSpinBox);
_stepSpinBox->setValue(unSteadyData->getCurrentIndex());
reRender();
updateWidget();
}
void ToolBarAnimation::slotAniReadFinish()
{
_actionRun->setIcon(QIcon("://icons/run.png"));
_isStop = true;
if (_aniThread) {
_aniThread->setIsStop(_isStop);
}
reRender();
updateWidget();
}
int ToolBarAnimation::findRootParentID(int id)
{
Interface::FITKAbstractCFDPostData* currentData = _postDataManager->getDataByID(id);
if (currentData == nullptr)return -1;
int parentID = currentData->getCFDPostParentID();
Interface::FITKAbstractCFDPostData* parentData = _postDataManager->getDataByID(parentID);
if (parentData == nullptr)return currentData->getDataObjectID();
return findRootParentID(parentID);
}
//----------------------------------------------------------------------------------------------
AnimationThread::AnimationThread(QStringList files, int dataID) :
_files(files), _dataID(dataID)
{
}
void AnimationThread::setCurrentIndex(int index)
{
_currentIndex = index;
}
void AnimationThread::setIsStop(bool isStop)
{
_isStop = isStop;
}
void AnimationThread::setIsPause(bool isPause)
{
_isPause = isPause;
}
void AnimationThread::run()
{
Interface::FITKCFDPost3DManager* postDataManager = FITKAPP->getGlobalData()->getPostData<Interface::FITKCFDPostData>()->getPostDataManager();
if (postDataManager == nullptr) return;
Interface::FITKAbstractCFDPostData* data = postDataManager->getDataByID(_dataID);
if (data == nullptr)return;
auto type = data->getPostDataType();
for (int i = _currentIndex + 1; i < _files.size(); i++) {
QString file = _files[i];
switch (type) {
case Interface::FITKPostDataType::Post_UnSteady: {
Interface::FITKCFDPostUnSteady* vtkData = dynamic_cast<Interface::FITKCFDPostUnSteady*>(data);
if (vtkData == nullptr)return;
vtkData->setFile(file);
break;
}
default:
break;
}
if (data) {
data->update();
//采用连接方式为阻塞连接,完成渲染后再执行下一个文件读取
emit sigReadSuccess(i);
}
if (_isStop) break;
}
emit sigImportFinish();
}
}