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/OperatorsGUI/OperGraphEvent3D.cpp

178 lines
6.0 KiB
C++

#include "OperGraphEvent3D.h"
// App
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
// Global data
#include "FITK_Kernel/FITKCore/FITKDataRepo.h"
// Graph
#include "FITK_Component/FITKFluidVTKGraphAdaptor/FITKFluidVTKGraphObject3D.h"
// Render VTK
#include "FITK_Component/FITKRenderWindowVTK/FITKGraph3DWindowVTK.h"
#include "FITK_Component/FITKRenderWindowVTK/FITKGraphRender.h"
#include "FITK_Component/FITKRenderWindowVTK/FITKGraphObjectVTK.h"
// Graph data manager
#include "GraphDataProvider/GraphProviderManager.h"
#include "GraphDataProvider/GraphModelProvider.h"
#include "GraphDataProvider/GraphMarkProvider.h"
// Data
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoCommand.h"
#include "FITK_Interface/FITKInterfaceMesh/FITKUnstructuredFluidMeshVTK.h"
#include "FITK_Interface/FITKInterfaceMeshGen/FITKRegionMeshSize.h"
#include "FITK_Interface/FITKInterfaceMeshGen/FITKZonePoints.h"
// GUI
#include "GUIFrame/MainWindow.h"
#include "GUIFrame/RenderWidget.h"
#include "FITK_Component/FITKWidget/FITKMdiArea.h"
namespace GUIOper
{
Comp::FITKGraph3DWindowVTK* OperGraphEvent3D::getGraphWidget()
{
// 获取主窗口。
GUI::MainWindow* mainWindow = FITKAPP->getGlobalData()->getMainWindowT<GUI::MainWindow>();
if (!mainWindow)
{
return nullptr;
}
// 获取可视化区。
GUI::RenderWidget* renderWidget = mainWindow->getRenderWidget();
if (!renderWidget)
{
return nullptr;
}
Comp::FITKMdiArea* mdiArea = renderWidget->getMdiArea();
if (!mdiArea)
{
return nullptr;
}
// 获取当前窗口,尝试转换为三维窗口。
QWidget* w = mdiArea->getCurrentWidget();
Comp::FITKGraph3DWindowVTK* graphWidget = dynamic_cast<Comp::FITKGraph3DWindowVTK*>(w);
return graphWidget;
}
void OperGraphEvent3D::addGraphObjectToWidget(Exchange::FITKFluidVTKGraphObject3D* obj, Comp::FITKGraph3DWindowVTK* graphWidget, bool fitView)
{
if (!obj || !graphWidget)
{
return;
}
// 添加可视化对象。
//@{
obj->removeFromGraphWidget();
graphWidget->addObject(obj->getRenderLayer(), obj, true);
obj->setFITKRender(graphWidget->getRenderer(obj->getRenderLayer()));
//}
// 添加附加可视化对象。
//@{
QList<Exchange::FITKFluidVTKGraphObject3D*> addinObjs = obj->getAddinGraphObjs();
for (Exchange::FITKFluidVTKGraphObject3D* addinObj : addinObjs)
{
if (!addinObj)
{
continue;
}
addinObj->removeFromGraphWidget();
graphWidget->addObject(addinObj->getRenderLayer(), addinObj, true);
addinObj->setFITKRender(graphWidget->getRenderer(addinObj->getRenderLayer()));
}
//}
// 刷新窗口。
//@{
if (fitView)
{
graphWidget->fitView();
}
else
{
graphWidget->reRender();
}
//@}
}
QList<Exchange::FITKFluidVTKGraphObject3D*> OperGraphEvent3D::getGraphObjectsByDataId(int dataObjId)
{
// 获取或创建可视化对象。
Exchange::FITKFluidVTKGraphObject3D* obj{ nullptr };
QList<Exchange::FITKFluidVTKGraphObject3D*> objs;
bool isValid = false;
// 获取可视化窗口。
Comp::FITKGraph3DWindowVTK* graphWidget = getGraphWidget();
if (!graphWidget)
{
return objs;
}
// 获取模型与符号可视化对象管理器。
GraphData::GraphModelProvider* modelProvider = GraphData::GraphProviderManager::getInstance()->getModelProvider(graphWidget);
GraphData::GraphMarkProvider* markProvider = GraphData::GraphProviderManager::getInstance()->getMarkProvider(graphWidget);
if (!modelProvider || !markProvider)
{
return objs;
}
// 检查数据ID是否为模型。
Interface::FITKAbsGeoCommand* model = Core::FITKDataRepo::getInstance()->getTDataByID<Interface::FITKAbsGeoCommand>(dataObjId);
if (model && !isValid)
{
obj = modelProvider->getModelGraphObject(dataObjId);
isValid = true;
}
// 检查数据ID是否为流体网格。
Interface::FITKUnstructuredFluidMeshVTK* fluidMesh = Core::FITKDataRepo::getInstance()->getTDataByID<Interface::FITKUnstructuredFluidMeshVTK>(dataObjId);
if (fluidMesh && !isValid)
{
objs = modelProvider->getFuildBoundMeshGraphObjects(dataObjId);
isValid = true;
}
// 检查数据ID是否为边界网格。
Interface::FITKBoundaryMeshVTK* boundMesh = Core::FITKDataRepo::getInstance()->getTDataByID<Interface::FITKBoundaryMeshVTK>(dataObjId);
if (boundMesh && !isValid)
{
obj = modelProvider->getBoundMeshGraphObject(dataObjId);
isValid = true;
}
// 检查数据ID是否为流体域形状数据。
Interface::FITKAbstractRegionMeshSize* regionMesh = Core::FITKDataRepo::getInstance()->getTDataByID<Interface::FITKAbstractRegionMeshSize>(dataObjId);
if (regionMesh && !isValid)
{
obj = modelProvider->getRegionMeshGraphObject(dataObjId);
isValid = true;
}
// 检查数据ID是否为材料点数据。
Interface::FITKZonePointManager* matPtsMgr = Core::FITKDataRepo::getInstance()->getTDataByID<Interface::FITKZonePointManager>(dataObjId);
Interface::FITKZonePoint* matPt = Core::FITKDataRepo::getInstance()->getTDataByID<Interface::FITKZonePoint>(dataObjId);
if ((matPtsMgr || matPt) && !isValid)
{
obj = markProvider->getMaterialPointsGraphObject();
isValid = true;
}
if (obj)
{
objs.push_back(obj);
}
return objs;
}
} // namespace GUIOper