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.
AppFlow/OperatorsModel/OperatorsOpen.cpp

159 lines
6.5 KiB
C++

#include "OperatorsOpen.h"
#include <QFile>
#include <QFileDialog>
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Kernel/FITKAppFramework/FITKComponents.h"
#include "FITK_Kernel/FITKAppFramework/FITKMessage.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppSettings.h"
#include "FITK_Kernel/FITKAppFramework/FITKRunTimeSetting.h"
#include "FITK_Component/FITKFlowOFIOHDF5/FITKFlowOFIOHDF5Interface.h"
#include "OperatorsInterface/TreeEventOperator.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h"
#include "FITK_Interface/FITKInterfaceMesh/FITKUnstructuredFluidMeshVTK.h"
#include "OperatorsInterface/GraphEventOperator.h"
#include "GUIDialog/GUIMeshDialog/MeshGeoWidget.h"
#include "GUIFrame/PropertyWidget.h"
namespace ModelOper
{
OperatorsOpen::OperatorsOpen()
{
}
OperatorsOpen::~OperatorsOpen()
{
}
bool OperatorsOpen::execGUI()
{
//主界面
QWidget* mw = FITKAPP->getGlobalData()->getMainWindow();
//获取工作目录
QString wk;
auto settings = FITKAPP->getAppSettings();
if (settings)
wk = settings->getWorkingDir();
// QString fileName = QFileDialog::getOpenFileName(mw, QObject::tr("Open INP File"),"" , "INP(*.inp)");
QFileDialog dlg(mw, QObject::tr("Open Project File"), wk, "HDF5(*.hdf5)");
dlg.setAcceptMode(QFileDialog::AcceptOpen); //打开模式
dlg.show();
//阻塞,否则键盘事件处理会出问题
bool accept = false;
QEventLoop loop;
connect(&dlg, &QFileDialog::accepted, [&] {loop.quit(); accept = true; });
connect(&dlg, &QFileDialog::rejected, [&] {loop.quit(); accept = false; });
loop.exec();
if (!accept) return false;
QStringList files = dlg.selectedFiles(); //选择的文件名称
if (files.isEmpty()) return false;
QString fileName = files.at(0);
if (fileName.isEmpty())
return false;
//存储信息
if (_emitter == nullptr) return false;
this->setArgs("FileName", fileName);
return true;
}
bool OperatorsOpen::execProfession()
{
//文件存在
QString fileName;
bool ok = this->argValue<QString>("FileName", fileName);
if (!ok) return false;
QFileInfo finfo(fileName);
if (!finfo.exists()) return false;
//输出信息
AppFrame::FITKMessageNormal(QString(tr("Reading project file %1 ...")).arg(fileName));
////获取数据对象
//AbaqusData::FITKAbaqusData* abaData = AbaqusData::FITKAbaqusData::GetDataFromAppFrame();
//if (!abaData) return false;
//清理几何数据
Interface::FITKGeoCommandList* geoCommList = FITKAPP->getGlobalData()->getGeometryData<Interface::FITKGeoCommandList>();
if (!geoCommList)return false;
geoCommList->clear();
//清理网格
Interface::FITKUnstructuredFluidMeshVTK* meshData = FITKAPP->getGlobalData()->getMeshData<Interface::FITKUnstructuredFluidMeshVTK>();
if (!meshData)return false;
meshData->clearMesh();
EventOper::GraphEventOperator* graphOper = FITKOPERREPO->getOperatorT<EventOper::GraphEventOperator>("GraphPreprocess");
if (graphOper == nullptr)return false;
graphOper->reRender();
//获取读取组件
IO::FITKFlowOFIOHDF5Interface* fitkAbaIO = FITKAPP->getComponents()->getComponentTByName<IO::FITKFlowOFIOHDF5Interface>("FITKFlowOFHDF5IO");
if (fitkAbaIO == nullptr) return false;
//关联信号,后续处理结束的事件
connect(fitkAbaIO, SIGNAL(ioThreadFinishedSig()), this, SLOT(ioThreadFinishedSlot()));
//参数设置
fitkAbaIO->setFileName(fileName);
//执行读取1-读取 2- 写出
fitkAbaIO->exec(1);
return true;
}
void OperatorsOpen::ioThreadFinishedSlot()
{
QString fileName;
bool ok = this->argValue<QString>("FileName", fileName);
this->clearArgs();
auto fitkAbaIO = FITKAPP->getComponents()->getComponentTByName<IO::FITKFlowOFIOHDF5Interface>("FITKFlowOFHDF5IO");
if (fitkAbaIO == nullptr) return;
//执行结束打断信号,避免下次执行重复关联,以及其他读写线程触发该槽函数
disconnect(fitkAbaIO, SIGNAL(ioThreadFinishedSig()), this, SLOT(ioThreadFinishedSlot()));
//是否读取成功
const bool success = fitkAbaIO->isSuccess();
if (!success)
{
//读取失败
AppFrame::FITKMessageError(QString(tr("Failed reading inp file from %1")).arg(fileName));
return;
}
//读取成功
AppFrame::FITKMessageNormal(QString(tr("Read project file from %1")).arg(fileName));
//打开的文件
AppFrame::FITKRunTimeSetting* rs = FITKAPP->getGlobalData()->getRunTimeSetting();
if (rs)
rs->setValue("ProjectFile", fileName);
//刷新树
auto modelTreeOper = FITKOPERREPO->getOperatorT<EventOper::TreeEventOperator>("ModelTreeEvent");
if (modelTreeOper)
modelTreeOper->updateTree();
//更新几何界面显示
Interface::FITKGeoCommandList* geometryData = FITKAPP->getGlobalData()->getGeometryData<Interface::FITKGeoCommandList>();
if (geometryData == nullptr) return;
EventOper::GraphEventOperator* graphOper = FITKOPERREPO->getOperatorT<EventOper::GraphEventOperator>("GraphPreprocess");
if (graphOper == nullptr)return;
for (int i = 0; i < geometryData->getDataCount(); i++) {
auto geoData = geometryData->getDataByIndex(i);
if (geoData == nullptr)continue;
graphOper->updateGraph(geoData->getDataObjectID());
}
//更新网格
Interface::FITKUnstructuredFluidMeshVTK* meshData = FITKAPP->getGlobalData()->getMeshData<Interface::FITKUnstructuredFluidMeshVTK>();
if (!meshData)return;
graphOper->updateGraph(meshData->getDataObjectID());
//更新网格划分区域界面
GUI::MainWindow* mainWindow = dynamic_cast<GUI::MainWindow*>(FITKAPP->getGlobalData()->getMainWindow());
if (mainWindow == nullptr)return;
GUI::PropertyWidget* propertyWidget = mainWindow->getPropertyWidget();
if (propertyWidget == nullptr)return;
GUI::MeshGeoWidget* widget = dynamic_cast<GUI::MeshGeoWidget*>(propertyWidget->getCurrentWidget());
if (widget)widget->updateWidget();
}
}