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.
nmWTAI-Platform/Src/nmNum/nmSubWxs/nmPebiGridViewDataBuilder.cpp

111 lines
3.2 KiB
C++

#include "nmPebiGridViewDataBuilder.h"
#include "nmPebiGridViewData.h"
#include "nmDataAnalyzeManager.h"
#include "nmDataNumericalAnalysisCase.h"
#include <QCoreApplication>
#include <QThread>
#include <vtkCellData.h>
#include <vtkDataArray.h>
#include <vtkMath.h>
#include <vtkUnstructuredGrid.h>
namespace {
QString builderText(const char* pText)
{
return QCoreApplication::translate("nmPebiGridViewDataBuilder", pText);
}
bool isBuilderGuiThread()
{
QCoreApplication* pApplication = QCoreApplication::instance();
return pApplication == NULL ||
pApplication->thread() == QThread::currentThread();
}
}
bool nmPebiGridViewDataBuilder::build(
nmDataAnalyzeManager* pDataManager,
nmPebiGridViewData* pViewData,
QString* pError)
{
Q_ASSERT(isBuilderGuiThread());
if(pError != NULL) {
pError->clear();
}
if(!isBuilderGuiThread()) {
if(pError != NULL) {
*pError = builderText(
"Grid preview data must be built in the GUI thread.");
}
return false;
}
if(pDataManager == NULL || pViewData == NULL) {
if(pError != NULL) {
*pError = builderText("The grid data source is unavailable.");
}
return false;
}
if(pDataManager->thread() != QThread::currentThread()) {
if(pError != NULL) {
*pError = builderText(
"Grid preview data must be built in the GUI thread.");
}
return false;
}
if(!pDataManager->isPebiGridValid()) {
if(pError != NULL) {
*pError = builderText("The PEBI grid has not been committed.");
}
return false;
}
if(pDataManager->getGridType() != NM_Grid_PEBI) {
if(pError != NULL) {
*pError = builderText("The committed grid is not a PEBI grid.");
}
return false;
}
vtkSmartPointer<vtkUnstructuredGrid> pGrid =
pDataManager->getUnstructuredGrid();
if(pGrid == NULL || pGrid->GetNumberOfPoints() <= 0 ||
pGrid->GetNumberOfCells() <= 0) {
if(pError != NULL) {
*pError = builderText("The committed PEBI grid is empty.");
}
return false;
}
const nmDataNumericalAnalysisCase* pAnalysisCase =
pDataManager->getNumericalAnalysisCase();
if(pAnalysisCase == NULL) {
if(pError != NULL) {
*pError = builderText("The grid version is unavailable.");
}
return false;
}
// 先在局部对象中收集完整数据,任何校验错误都不会覆盖调用方旧数据。
nmPebiGridViewData oCandidate;
oCandidate.m_pGrid = pGrid;
oCandidate.m_eGridType = NM_Grid_PEBI;
oCandidate.m_nGridInputRevision =
pAnalysisCase->getGridInputRevision();
oCandidate.m_nValidCellCount = pGrid->GetNumberOfCells();
// Material 只认可 CellData 中与 VTK 单元一一对应的数组。
vtkCellData* pCellData = pGrid->GetCellData();
vtkDataArray* pMaterialArray = pCellData != NULL
? pCellData->GetArray("Material") : NULL;
oCandidate.m_bHasMaterial = pMaterialArray != NULL &&
pMaterialArray->GetNumberOfTuples() == pGrid->GetNumberOfCells();
*pViewData = oCandidate;
return true;
}