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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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();
}
}