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